import type { CliId } from '../adapters/cli/types.js'; export type TodoStatus = 'pending' | 'in_progress' | 'completed'; /** 单条 TODO:状态 + 文字。文字来源随方言不同:Claude TodoWrite 的 content、 * Task* 的 subject、Codex update_plan 的 step。供 UI 悬浮展示具体清单。 */ export interface TodoItem { status: TodoStatus; text: string; } export interface OpenTodos { /** 待办总数(当前快照里的全部条目)。 */ total: number; /** 已完成条目数。 */ done: number; /** 未完成条目数(pending + in_progress)。 */ remaining: number; /** 是否有一项正在进行(in_progress)—— 供 UI 高亮「正在做这一步」。 */ hasInProgress: boolean; /** 每条 TODO 的状态与文字(按原始顺序),供 UI 悬浮展开清单。 */ items: TodoItem[]; } /** 从单条已解析的 transcript 记录里取 todo 快照;不是 todo 记录返回 null。 * Claude:assistant 消息里 name==='TodoWrite' 的 tool_use,input.todos[]。 * Codex:response_item 里 payload.type==='function_call' 且 name==='update_plan', * arguments.plan[](arguments 可能是 JSON 字符串)。 */ export declare function todoSnapshotFromEntry(entry: any, kind: 'claude' | 'codex'): OpenTodos | null; /** 增量折叠状态:把「整份 transcript → 当前任务态」拆成「逐行 fold + 末态 finalize」, * 这样全量解析(parseOpenTodos)与增量游标读(readSessionOpenTodos)共用同一套语义, * 且可跨多次读盘只 fold 新追加的行。 * - codex:latestSnapshot 存最后一次 update_plan 快照(last-write-wins)。 * - claude:latestSnapshot 存最后一次 TodoWrite 快照;同时 claudeTasks 增量重放 * Task* 事件。finalize 时 TodoWrite 优先,缺失才回退 Task* 重放。 */ interface ClaudeTaskState { /** taskId → {status,text},Map 保序(= 创建顺序),供 UI 顺序展示。 */ tasks: Map; /** TaskCreate 的 tool_use.id → subject,等 tool_result 回填分配的 taskId。 */ pendingCreate: Map; sawAnyTask: boolean; } export interface TodoFoldState { kind: 'claude' | 'codex'; latestSnapshot: OpenTodos | null; claudeTasks?: ClaudeTaskState; } export declare function newTodoFoldState(kind: 'claude' | 'codex'): TodoFoldState; /** 把单条已解析记录折叠进状态(就地修改)。 */ export declare function foldTodoEntry(state: TodoFoldState, entry: any): void; /** 折叠出末态:TodoWrite/update_plan 快照优先,claude 缺失时回退 Task* 重放。 */ export declare function finalizeTodoFold(state: TodoFoldState): OpenTodos | null; /** 从整份 transcript(已按行解析的记录数组)取当前任务态。 * - codex:update_plan 是整表快照,取最后一次即可。 * - claude:两种方言二选一—— * · 开源版 Claude Code 用 TodoWrite(整表快照,取最后一次); * · 本 botmux 环境用 Task* 工具(TaskCreate/TaskUpdate 增量),需按记录重放 * 累积成末态。TodoWrite 优先(真快照);没有 TodoWrite 时回退到 Task* 重放。 */ export declare function parseOpenTodos(entries: any[], kind: 'claude' | 'codex'): OpenTodos | null; export declare function __resetTodoStateCacheForTest(): void; /** 读某会话当前 openTodos。定位 transcript → 增量游标读 → 折叠出最后一次 todo 快照。 * 任何一步失败(不支持的 CLI、无 transcript、冷读越界、解析失败)都返回 null。 * fresh=true 绕过 resolver 对「尚未落盘的懒创建 transcript」的 30s miss 负缓存—— * spawn 时 rollout 常还没落盘,首个状态边沿读若不置 fresh 会在 30s 内持续吃 miss, * 徽标要等 30s 后某次边沿才出现(镜像 cost-calculator 的 fresh 语义)。 */ export declare function readSessionOpenTodos(q: { cliId: CliId | 'unknown' | undefined; sessionId: string; cliSessionId?: string; cwd?: string; larkAppId?: string; fresh?: boolean; }): OpenTodos | null; export {}; //# sourceMappingURL=todo-state.d.ts.map