File size: 5,794 Bytes
625b2a8
 
c746f34
 
625b2a8
 
 
 
 
c746f34
625b2a8
 
 
 
 
 
c746f34
625b2a8
c746f34
 
 
 
 
 
625b2a8
 
 
 
c746f34
625b2a8
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
c746f34
625b2a8
 
 
c746f34
 
625b2a8
 
 
 
 
 
 
 
 
c746f34
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
625b2a8
 
 
 
 
 
c746f34
 
 
 
 
 
 
 
 
625b2a8
 
c746f34
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
# content_state.py

from typing import List, Set, Optional, Dict, Any
from datetime import datetime

class ContentState:
    """Tracks the state and progression of content generation"""
    def __init__(self):
        """Initialize content state tracking variables"""
        # Core content tracking
        self.current_summary: str = ""
        self.section_outlines: List[str] = []
        self.generated_sections: List[str] = []
        self.narrative_threads: List[str] = []
        self.key_points_covered: Set[str] = set()
        self.transition_points: List[str] = []
        self.manual_content: Optional[str] = None
        
        # Additional prompt and context management
        self.additional_prompts: Dict[str, str] = {}  # Store additional prompts per section
        self.context_history: List[Dict[str, Any]] = []  # Track generation context
        self.custom_instructions: Dict[str, str] = {}  # Store custom instructions per section
        
        # Generation state tracking
        self.total_words_generated: int = 0
        self.generation_timestamps: List[float] = []
        self.current_section_index: int = 0
        self.content_status: str = "not_started"  # not_started, in_progress, completed
        self.manual_edits: List[str] = []
        
    def set_manual_content(self, content: str) -> None:
        """Set pre-written content for this section"""
        self.manual_content = content
        self.manual_edits.append(content)
        self.content_status = "in_progress"
        
    def get_manual_content(self) -> Optional[str]:
        """Get pre-written content if it exists"""
        return self.manual_content
    
    def add_section(self, content: str) -> None:
        """Add a new generated section and update tracking"""
        self.generated_sections.append(content)
        self.total_words_generated += len(content.split())
        self.current_section_index += 1
        self.generation_timestamps.append(datetime.now().timestamp())
        
    def add_narrative_thread(self, thread: str) -> None:
        """Add a new narrative thread to track"""
        if thread not in self.narrative_threads:
            self.narrative_threads.append(thread)
        
    def add_key_point(self, point: str) -> None:
        """Add a key point to the covered points set"""
        self.key_points_covered.add(point)
        
    def add_transition(self, transition: str) -> None:
        """Add a transition point between sections"""
        self.transition_points.append(transition)
        
    def add_custom_prompt(self, section_id: str, prompt: str) -> None:
        """Add a custom prompt for a specific section"""
        self.additional_prompts[section_id] = prompt
        self._update_generation_status()
        
    def add_custom_instructions(self, section_id: str, instructions: str) -> None:
        """Add custom instructions for a specific section"""
        self.custom_instructions[section_id] = instructions
        self._update_generation_status()
        
    def get_section_context(self, section_id: str) -> Dict[str, Any]:
        """Get complete context for a section including custom prompts and instructions"""
        context = {
            'manual_content': self.manual_content,
            'additional_prompt': self.additional_prompts.get(section_id, ''),
            'custom_instructions': self.custom_instructions.get(section_id, ''),
            'current_summary': self.current_summary,
            'narrative_threads': self.narrative_threads,
            'key_points_covered': list(self.key_points_covered),
            'generation_status': self.content_status,
            'total_words': self.total_words_generated,
            'section_count': len(self.generated_sections)
        }
        
        if self.context_history:
            context['previous_context'] = self.context_history[-1]
        
        return context
        
    def update_context_history(self, section_id: str, generation_context: Dict[str, Any]) -> None:
        """Update context history with latest generation context"""
        self.context_history.append({
            'section_id': section_id,
            'context': generation_context,
            'timestamp': datetime.now().isoformat()
        })
        self._update_generation_status()
        
    def get_generation_progress(self) -> float:
        """Calculate generation progress as a percentage"""
        if not self.section_outlines:
            return 0.0
        return (self.current_section_index / len(self.section_outlines)) * 100
    
    def _update_generation_status(self) -> None:
        """Update the content generation status"""
        if self.total_words_generated == 0 and not self.manual_content:
            self.content_status = "not_started"
        elif self.get_generation_progress() >= 100:
            self.content_status = "completed"
        else:
            self.content_status = "in_progress"
    
    def reset_state(self) -> None:
        """Reset the content state to initial values"""
        self.__init__()
        
    def get_state_summary(self) -> Dict[str, Any]:
        """Get a summary of the current content state"""
        return {
            'status': self.content_status,
            'progress': self.get_generation_progress(),
            'total_words': self.total_words_generated,
            'sections_generated': len(self.generated_sections),
            'has_manual_content': bool(self.manual_content),
            'narrative_threads_count': len(self.narrative_threads),
            'key_points_count': len(self.key_points_covered),
            'custom_prompts_count': len(self.additional_prompts),
            'last_updated': self.generation_timestamps[-1] if self.generation_timestamps else None
        }