+ {/* 标题栏 */}
+
+
+
+ 待办事项
+ 共 {totalCount} 项
+
+
+
+
+ {/* 列表区 */}
+
+ {GROUP_ORDER.map(status => {
+ const items = grouped.get(status)
+ if (!items || items.length === 0) return null
+
+ const style = statusStyle(status)
+ const isCollapsed = collapsedGroups.has(status)
+ const isTerminal = status === 'completed' || status === 'cancelled'
+
+ return (
+
+ {/* 分组标题 */}
+
+
+ {/* 卡片列表 */}
+ {!isCollapsed && (
+
+ {items.map(item => (
+
+
+
+
+
+
+
+ {item.content}
+
+
+
+ {item.priority}
+
+
+ {style.icon} {style.label}
+
+
+
+
+
+ ))}
+
+ )}
+
+ )
+ })}
+
+
+ {/* 底部刷新 */}
+
+
+
+
+ )
+}
diff --git a/web/src/hooks/useChat.ts b/web/src/hooks/useChat.ts
index 9fc3033..6c51562 100644
--- a/web/src/hooks/useChat.ts
+++ b/web/src/hooks/useChat.ts
@@ -20,6 +20,8 @@ import type {
MemoryList,
SkillSummary,
SkillList,
+ TodoItemSummary,
+ TodoList,
SchedulerJobList,
SchedulerJobSummary,
SchedulerJobSessionLookup,
@@ -92,6 +94,10 @@ interface UseChatReturn {
skills: SkillSummary[]
requestSkillList: () => Command
+ // Todo 状态
+ todos: TodoItemSummary[]
+ requestTodoList: () => Command
+
// 定时任务状态
schedulerJobs: SchedulerJobSummary[]
sidebarTab: 'topics' | 'scheduler'
@@ -140,6 +146,7 @@ export function useChat(): UseChatReturn {
const [subAgentView, setSubAgentView] = useState