claude-code-best/src/query/transitions.ts
IronRookieCoder 4cb047ff48 fix(costrict): recover task updates from missing tool calls
## Bug 详情
CSC 在相同模型和输入下,任务流程可能先成功执行 TaskCreate,随后模型返回 stop_reason=tool_use 但没有实际 tool_use block,导致 TaskUpdate/update_todo_list 没有执行,最终任务状态更新失败。

## 根因
CoStrict/OpenAI 兼容流在工具参数不完整或模型续轮缺少工具块时,缺少稳定的结构化恢复路径;query 层原先无法基于已发生的任务工具调用链路区分普通缺失工具调用和任务状态更新流程。

## 修复方案
基于结构化 tool_use 历史识别任务流程,优先引导 CoStrict 使用 update_todo_list 恢复任务清单状态;同时为 CoStrict 工具 JSON 流增加无效参数保留和错误结果回传,避免执行 malformed tool input。

## 变更要点
- 新增 update_todo_list 兼容工具,并注册到 TaskV2 工具列表
- query 缺失 tool_use 恢复改为基于 TaskCreate/TaskUpdate/TaskList/TaskGet/update_todo_list 结构化工具历史判断
- CoStrict provider 保留 malformed tool call 的 id/name 并阻止执行无效参数
- 工具执行和 streaming executor 对 invalid tool call 返回错误 tool_result
- 补充 query 恢复、CoStrict provider、工具执行、消息规范化和 update_todo_list 单测

## 自测
- bun test src/__tests__/queryMissingToolUseRecovery.test.ts
- bun test src/costrict/provider/index.test.ts
- bun test src/utils/__tests__/messages.test.ts
- bun test src/services/tools/__tests__/StreamingToolExecutor.test.ts packages/builtin-tools/src/tools/UpdateTodoListCompatTool/__tests__/UpdateTodoListCompatTool.test.ts
- bun run typecheck 仍有当前工作区既有无关错误,未由本次修改引入
2026-05-20 13:44:12 +08:00

25 lines
821 B
TypeScript

export type Terminal =
| { reason: 'completed' }
| { reason: 'blocking_limit' }
| { reason: 'image_error' }
| { reason: 'model_error'; error?: unknown }
| { reason: 'aborted_streaming' }
| { reason: 'aborted_tools' }
| { reason: 'prompt_too_long' }
| { reason: 'stop_hook_prevented' }
| { reason: 'hook_stopped' }
| { reason: 'max_turns'; turnCount: number }
export type Continue =
| { reason: 'collapse_drain_retry'; committed: number }
| { reason: 'reactive_compact_retry' }
| { reason: 'max_output_tokens_escalate' }
| { reason: 'max_output_tokens_recovery'; attempt: number }
| { reason: 'stop_hook_blocking' }
| { reason: 'token_budget_continuation' }
| {
reason: 'missing_tool_use_recovery'
kind: 'costrict_task' | 'task' | 'generic'
}
| { reason: 'next_turn' }