2
2
3
3
import uuid
4
4
from dataclasses import dataclass , field
5
- from datetime import datetime
6
5
from enum import Enum
7
6
from typing import Any , Literal
8
7
8
+ from pydantic import BaseModel
9
+
9
10
10
11
class TaskStatus (str , Enum ):
11
12
"""Task status options."""
13
+
12
14
PENDING = "pending"
13
15
IN_PROGRESS = "in_progress"
14
16
COMPLETED = "completed"
15
17
16
18
17
- @dataclass
18
- class Task :
19
+ class Task (BaseModel ):
19
20
"""Simple task representation."""
21
+
20
22
id : str
21
23
description : str
22
24
status : TaskStatus = TaskStatus .PENDING
23
25
order : int = 0
24
26
summary : str | None = None
27
+ parent_id : str | None = None
25
28
26
29
27
30
@dataclass
28
31
class TodoList :
29
32
"""Simple todo list for one agent run."""
33
+
30
34
tasks : list [Task ] = field (default_factory = list )
31
35
current_index : int = 0
32
36
@@ -36,14 +40,15 @@ def get_current_task(self) -> Task | None:
36
40
return self .tasks [self .current_index ]
37
41
return None
38
42
39
- def advance_to_next (self ):
43
+ def advance_to_next (self ) -> None :
40
44
"""Move to next task."""
41
45
self .current_index += 1
42
46
43
47
44
48
# Storage - just one todo list per agent run
45
49
_current_todo : TodoList | None = None
46
50
51
+
47
52
def todo_manager (
48
53
action : Literal ["create" , "get_current" , "start_task" , "complete_task" , "get_final_summary" ],
49
54
tasks : list [str ] | None = None ,
@@ -67,18 +72,14 @@ def todo_manager(
67
72
68
73
_current_todo = TodoList ()
69
74
for i , desc in enumerate (tasks ):
70
- task = Task (
71
- id = str (uuid .uuid4 ()),
72
- description = desc .strip (),
73
- order = i
74
- )
75
+ task = Task (id = str (uuid .uuid4 ()), description = desc .strip (), order = i )
75
76
_current_todo .tasks .append (task )
76
77
77
78
return {
78
79
"action" : "create" ,
79
80
"tasks" : [{"id" : t .id , "description" : t .description , "order" : t .order } for t in _current_todo .tasks ],
80
81
"total_count" : len (_current_todo .tasks ),
81
- "message" : f"Created { len (tasks )} tasks"
82
+ "message" : f"Created { len (tasks )} tasks" ,
82
83
}
83
84
84
85
if not _current_todo :
@@ -91,14 +92,14 @@ def todo_manager(
91
92
"action" : "get_current" ,
92
93
"current_task" : None ,
93
94
"all_completed" : True ,
94
- "message" : "All tasks completed!"
95
+ "message" : "All tasks completed!" ,
95
96
}
96
97
97
98
return {
98
99
"action" : "get_current" ,
99
100
"current_task" : {"id" : current .id , "description" : current .description , "status" : current .status .value },
100
101
"progress" : f"{ _current_todo .current_index + 1 } /{ len (_current_todo .tasks )} " ,
101
- "message" : f"Current task: { current .description } "
102
+ "message" : f"Current task: { current .description } " ,
102
103
}
103
104
104
105
elif action == "start_task" :
@@ -110,7 +111,7 @@ def todo_manager(
110
111
return {
111
112
"action" : "start_task" ,
112
113
"task" : {"id" : current .id , "description" : current .description , "status" : current .status .value },
113
- "message" : f"Started task: { current .description } "
114
+ "message" : f"Started task: { current .description } " ,
114
115
}
115
116
116
117
elif action == "complete_task" :
@@ -137,18 +138,14 @@ def todo_manager(
137
138
"next_task" : {"id" : next_task .id , "description" : next_task .description } if next_task else None ,
138
139
"progress" : f"{ completed_count } /{ len (_current_todo .tasks )} " ,
139
140
"all_completed" : next_task is None ,
140
- "message" : f"Completed: { current .description } "
141
+ "message" : f"Completed: { current .description } " ,
141
142
}
142
143
143
144
elif action == "get_final_summary" :
144
145
completed_tasks = [t for t in _current_todo .tasks if t .status == TaskStatus .COMPLETED ]
145
146
146
147
if not completed_tasks :
147
- return {
148
- "action" : "get_final_summary" ,
149
- "final_summary" : "" ,
150
- "message" : "No completed tasks found."
151
- }
148
+ return {"action" : "get_final_summary" , "final_summary" : "" , "message" : "No completed tasks found." }
152
149
153
150
# Create comprehensive final summary
154
151
final_content = []
@@ -167,7 +164,7 @@ def todo_manager(
167
164
"action" : "get_final_summary" ,
168
165
"final_summary" : final_summary ,
169
166
"total_completed" : len (completed_tasks ),
170
- "message" : f"Final summary with { len (completed_tasks )} completed tasks."
167
+ "message" : f"Final summary with { len (completed_tasks )} completed tasks." ,
171
168
}
172
169
173
170
else :
0 commit comments