@gird/ccli 2.15.0 → 2.17.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (75) hide show
  1. package/README.md +20 -6
  2. package/dist/agent/ai.js +11 -299
  3. package/dist/agent/ai.js.map +1 -1
  4. package/dist/agent/providers/anthropic.js +207 -0
  5. package/dist/agent/providers/anthropic.js.map +1 -0
  6. package/dist/agent/providers/gemini.js +97 -0
  7. package/dist/agent/providers/gemini.js.map +1 -0
  8. package/dist/agent/providers/openai.js +102 -0
  9. package/dist/agent/providers/openai.js.map +1 -0
  10. package/dist/cli/repl/index.js +60 -58
  11. package/dist/cli/repl/index.js.map +1 -1
  12. package/dist/cli/run/event-renderer.js +57 -0
  13. package/dist/cli/run/event-renderer.js.map +1 -0
  14. package/dist/cli/run/hooks.js +58 -19
  15. package/dist/cli/run/hooks.js.map +1 -1
  16. package/dist/cli/run/index.js +158 -9
  17. package/dist/cli/run/index.js.map +1 -1
  18. package/dist/cli/run/task.js +21 -1
  19. package/dist/cli/run/task.js.map +1 -1
  20. package/dist/cli/run/todo-panel.js +13 -0
  21. package/dist/cli/run/todo-panel.js.map +1 -1
  22. package/dist/cli/session/checkpoint.js +252 -0
  23. package/dist/cli/session/checkpoint.js.map +1 -0
  24. package/dist/cli/session/index.js +1 -1
  25. package/dist/cli/session/index.js.map +1 -1
  26. package/dist/cli/slash/index.js +12 -2
  27. package/dist/cli/slash/index.js.map +1 -1
  28. package/dist/cli/slash/session/load.js +3 -0
  29. package/dist/cli/slash/session/load.js.map +1 -1
  30. package/dist/cli/slash/session/save.js +1 -0
  31. package/dist/cli/slash/session/save.js.map +1 -1
  32. package/dist/cli/slash/system/agent.js +37 -104
  33. package/dist/cli/slash/system/agent.js.map +1 -1
  34. package/dist/cli/slash/system/compact.js +26 -5
  35. package/dist/cli/slash/system/compact.js.map +1 -1
  36. package/dist/cli/slash/system/goal.js +33 -34
  37. package/dist/cli/slash/system/goal.js.map +1 -1
  38. package/dist/cli/slash/system/help.js +2 -0
  39. package/dist/cli/slash/system/help.js.map +1 -1
  40. package/dist/cli/slash/system/plan.js +137 -0
  41. package/dist/cli/slash/system/plan.js.map +1 -0
  42. package/dist/cli/slash/system/revert.js +133 -0
  43. package/dist/cli/slash/system/revert.js.map +1 -0
  44. package/dist/config/config.js +46 -3
  45. package/dist/config/config.js.map +1 -1
  46. package/dist/config/skills.js +30 -5
  47. package/dist/config/skills.js.map +1 -1
  48. package/dist/harness/index.js +312 -0
  49. package/dist/harness/index.js.map +1 -0
  50. package/dist/index.js +33 -41
  51. package/dist/index.js.map +1 -1
  52. package/dist/tools/bash-background.js +2 -2
  53. package/dist/tools/bash-background.js.map +1 -1
  54. package/dist/tools/bash.js +3 -2
  55. package/dist/tools/bash.js.map +1 -1
  56. package/dist/tools/edit-file.js +8 -2
  57. package/dist/tools/edit-file.js.map +1 -1
  58. package/dist/tools/glob.js +4 -3
  59. package/dist/tools/glob.js.map +1 -1
  60. package/dist/tools/grep.js +4 -3
  61. package/dist/tools/grep.js.map +1 -1
  62. package/dist/tools/index.js +20 -0
  63. package/dist/tools/index.js.map +1 -1
  64. package/dist/tools/list-dir.js +3 -2
  65. package/dist/tools/list-dir.js.map +1 -1
  66. package/dist/tools/read-file.js +3 -2
  67. package/dist/tools/read-file.js.map +1 -1
  68. package/dist/tools/shared.js.map +1 -1
  69. package/dist/tools/todo.js +17 -5
  70. package/dist/tools/todo.js.map +1 -1
  71. package/dist/tools/web-fetch.js +95 -0
  72. package/dist/tools/web-fetch.js.map +1 -0
  73. package/dist/tools/write-file.js +8 -2
  74. package/dist/tools/write-file.js.map +1 -1
  75. package/package.json +1 -1
package/README.md CHANGED
@@ -46,13 +46,13 @@ ccli --role coder "review 这段代码" # 使用 coding 角色单次调用
46
46
  - 对接支持思考(reasoning)的模型(如 DeepSeek-R1、Kimi、Qwen3-thinking)时,会在正文前用灰色流式展示「思考中…」;不支持的模型(如默认的 `qwen-plus`)自动跳过,不影响使用。
47
47
  - `write` / `edit` 的内容超过 40 行会自动折叠为「…(还有 N 行,按 ctrl+o 展开)」;在空闲提示符下按 `ctrl+o` 会进入**全屏可滚动查看器**(alternate screen,类 `less`)查看完整内容,↑/↓/PgUp/PgDn/Home/End 滚动,`q` / `Enter` / `Esc` 退出后回到原提示符(未提交输入原样保留)。
48
48
  - `write_file` 的内容会随模型生成**逐行实时流式**显示(`⚙ write_file …(生成中…)` 后一行行长出来,像看着模型写代码),不再等参数到齐才一次性铺出;`edit_file` 等工具仍走「摘要 + 折叠」。流式超过 40 行也会**自动停打**并显示「…(后续内容已折叠,按 ctrl+o 展开)」,在空闲提示符下按 `ctrl+o` 同样进入全屏可滚动查看器查看被隐藏的剩余行(主 / 子代理共用同一套,阈值与第 57 步折叠一致)。
49
- - 多步骤任务时模型可用 `todo` 工具把任务拆成**待办清单**(`[x]` 完成 / `[>]` 进行中 / `[ ]` 待办,按状态上色),一眼看到总共几步、走到哪;无副作用、不需确认。待办面板**常驻在终端底部**(滚动区域法固定,不进全屏、保留 scrollback),todo 一更新立即重绘;非 TTY 时回退为回合末打印;子代理的待办与主会话隔离,各自展示。
49
+ - 多步骤任务时模型可用 `todo` 工具把任务拆成**待办清单**(`[x]` 完成 / `[>]` 进行中 / `[ ]` 待办,按状态上色),一眼看到总共几步、走到哪;无副作用、不需确认。待办面板**常驻在终端底部**(滚动区域法固定,不进全屏、保留 scrollback),todo 一更新立即重绘;非 TTY 时回退为回合末打印;子代理的待办与主会话隔离,各自展示;全部完成时回合结束自动清空,模型多轮不更新会收到系统提醒(引导重写或清空过时清单);不传 items 可只读查询当前清单,/compact 压缩后待办快照保留在摘要里。
50
50
  - 模型可调用 `task` 工具把**独立子任务委派给子代理**:子代理用独立上下文 + 全套工具(读/写/编辑/搜索/bash)自行完成,完成后只把结论返回主代理,避免中间过程污染主对话;子代理共享主会话的确认/「始终允许」/token 统计,且**不可再调用 task 继续委派**(防递归);子代理的 `write_file` 同样**逐行实时流式**展示,与主代理观感一致;可用 `subagent_type` 选 `explore`(只读探索,仅 `read_file`/`list_dir`/`grep`/`bash_output`,执行层硬边界保证不能改文件)或 `code`(编码,除 `task` 外全套工具),省略则为通用子代理;子代理运行时的工具调用 / 结果 / 流式写入 / 结论都会**缩进成 ` │ ` 嵌套块**(开始 / 结束横幅顶格作边界),与主代理输出区分开,折叠块按 `ctrl+o` 展开时同样带缩进。
51
51
  - `/help` 查看可用命令,`/clear` 清空历史,`/undo [n]` 撤销最近 n 轮对话。
52
52
  - `/compact` 把对话历史压缩成一段摘要,释放上下文(长对话逼近上限时用;仅在确有收益时替换)。上下文占比达到约 80% 时也会**自动压缩**。
53
53
  - `/model [id]` 查看当前模型或切换到新模型(输入空参数只查看)。
54
54
  - `/save [name]` 保存当前会话,`/load <name>` 加载会话(`Tab` 子串补全;多个候选时列出序号,输入数字即可加载),`/sessions` 列出已保存会话,`/delete <name>` 删除指定会话(需确认)。
55
- - `/agent <任务描述>` 进入自动任务执行模式:AI 先制定计划,经你确认后自动调用工具逐步完成。
55
+ - `/agent <任务描述>` 进入自动任务执行模式:AI 先制定计划,经你确认后自动调用工具逐步完成;待办清单未完成时,模型只输出过渡文字也不会提前收工,会被提醒继续执行(连续空转 3 次兜底放弃)。
56
56
  - `/goal <任务> [| <完成条件>]` 进入目标执行模式:在 `/agent` 基础上,执行结束后再按完成条件做一次达成判定;完成条件可省略,省略时由规划阶段先补一条可检查条件。
57
57
  - `/resume` 手动恢复上次退出时自动保存的会话。
58
58
  - `/reload` 重新加载 `.ccli/config.json` 并刷新 MCP server。
@@ -172,7 +172,17 @@ export ANTHROPIC_MODEL=claude-sonnet-4-5
172
172
 
173
173
  **生命周期钩子(hooks)**
174
174
 
175
- 可以在工具执行前后挂自己的 shell 命令,用于审计日志、安全拦截、自动格式化等。一期支持两个事件:`PreToolUse`(工具执行前,可拦截)和 `PostToolUse`(工具执行后,只观察):
175
+ 可以在工具执行前后、用户输入提交时、会话开始/结束、回合结束、上下文压缩前、子代理起停时挂自己的 shell 命令,用于审计日志、安全拦截、注入项目约定、自动格式化等。支持的事件:
176
+
177
+ | 事件 | 时机 | 说明 |
178
+ |---|---|---|
179
+ | `PreToolUse` | 工具执行前 | 可拦截(退出码 2),原因喂回模型 |
180
+ | `PostToolUse` / `PostToolUseFailure` | 工具成功 / 失败后 | 仅观察,额外带 `tool_response` |
181
+ | `UserPromptSubmit` | 用户输入发送给模型前 | 可拦截;放行时 stdout 作为补充上下文注入 prompt |
182
+ | `SessionStart` / `SessionEnd` | 会话开始 / 结束 | 仅观察;SessionStart 载荷带 `source`(repl / once) |
183
+ | `Stop` | 代理回合结束 | 仅观察;载荷带 `stop_reason`(final=最终回答 / round_limit=轮数触顶) |
184
+ | `PreCompact` | 上下文压缩前 | 仅观察;载荷带 `trigger`(manual=/compact / auto=自动压缩) |
185
+ | `SubagentStart` / `SubagentStop` | task 子代理开始 / 结束 | 仅观察;载荷带 `subagent_type` 与 `description` |
176
186
 
177
187
  ```json
178
188
  {
@@ -187,14 +197,18 @@ export ANTHROPIC_MODEL=claude-sonnet-4-5
187
197
  "event": "PreToolUse",
188
198
  "matcher": "write_file|edit_file",
189
199
  "command": "case \"$(jq -r .tool_input.path)\" in /etc/*) echo '禁止修改系统目录' >&2; exit 2;; esac"
200
+ },
201
+ {
202
+ "event": "UserPromptSubmit",
203
+ "command": "echo '[约定] 提交信息用中文,缩进 4 空格'"
190
204
  }
191
205
  ]
192
206
  }
193
207
  ```
194
208
 
195
- - `matcher`:省略或 `*` 匹配全部工具;`a|b` 匹配多个;`mcp__*` 匹配所有 MCP 工具。
196
- - hook 进程的 stdin 会收到事件 JSON(`hook_event_name` / `cwd` / `tool_name` / `tool_input`,PostToolUse 额外带 `tool_response`)。
197
- - 退出码语义:`0` 放行(stdout 打印给用户);`2` 拦截(stderr 作为原因喂回模型,工具不执行);其它非零或超时(默认 10 秒)视为 hook 自身出错——打印警告但放行。
209
+ - `matcher`:省略或 `*` 匹配全部工具;`a|b` 匹配多个;`mcp__*` 匹配所有 MCP 工具。**只对工具事件生效**,其余事件(UserPromptSubmit / SessionStart / SessionEnd / Stop / PreCompact / SubagentStart / SubagentStop)忽略 matcher。
210
+ - hook 进程的 stdin 会收到事件 JSON:固定带 `hook_event_name` / `cwd`;工具事件带 `tool_name` / `tool_input`(PostToolUse* 额外带 `tool_response`);UserPromptSubmit 带 `prompt`;SessionStart 带 `source`;Stop 带 `stop_reason`;PreCompact 带 `trigger`;SubagentStart / SubagentStop 带 `subagent_type` 与 `description`。
211
+ - 退出码语义:`0` 放行(stdout 打印给用户;UserPromptSubmit 的 stdout 改为注入 prompt);`2` 拦截(仅 PreToolUse / UserPromptSubmit 生效;stderr 作为原因喂回模型或拒绝本次输入);其它非零或超时(默认 10 秒)视为 hook 自身出错——打印警告但放行。
198
212
  - 全局与项目配置的 hooks 按数组拼接(全局在前),同一事件多个 hook 按声明顺序执行,拦截后短路。
199
213
  - 每次 hook 执行都会打印一行 `[hook] 事件 ← 命令`,行为对用户透明。临时禁用全部钩子:`ccli --no-hooks`。
200
214
 
package/dist/agent/ai.js CHANGED
@@ -1,288 +1,15 @@
1
- /**
2
- * AI 客户端 —— 把配置变成「能对话的对象」。
3
- *
4
- * 支持流式输出与工具调用(function calling / tool use)。
5
- * 目前对接两种后端:
6
- * - OpenAI 兼容后端(通义千问 / DeepSeek / GLM…)
7
- * - Anthropic Claude
8
- *
9
- * 对外统一为 AIClient 接口;内部由 createAIClient 根据 provider 选择实现。
10
- *
11
- * 流式(stream)的意义:模型边生成边返回,我们边收边打印,
12
- * 用户不用干等一整段生成完,交互感更接近「打字机」。
13
- */
14
- import OpenAI from 'openai';
15
- import Anthropic from '@anthropic-ai/sdk';
16
- import { toolDefs } from '../tools/index.js';
1
+ import { OpenAIClient } from './providers/openai.js';
2
+ import { AnthropicClient } from './providers/anthropic.js';
3
+ import { GeminiClient } from './providers/gemini.js';
17
4
  /** 根据配置创建对应后端的客户端。 */
18
5
  export function createAIClient(config) {
19
6
  if (config.provider === 'anthropic') {
20
7
  return new AnthropicClient(config);
21
8
  }
22
- return new OpenAIClient(config);
23
- }
24
- class OpenAIClient {
25
- client;
26
- model;
27
- constructor(config) {
28
- this.client = new OpenAI({
29
- apiKey: config.apiKey,
30
- baseURL: config.baseURL,
31
- });
32
- this.model = config.model;
33
- }
34
- getModel() {
35
- return this.model;
36
- }
37
- setModel(model) {
38
- this.model = model;
39
- }
40
- /** 拉取后端可用模型列表(结果缓存,避免重复请求)。 */
41
- modelCache;
42
- async listModels() {
43
- if (!this.modelCache) {
44
- const list = await this.client.models.list();
45
- this.modelCache = list.data.map((m) => m.id).sort();
46
- }
47
- return this.modelCache;
48
- }
49
- /**
50
- * 发送整段对话历史,流式接收助手回复。
51
- * @param messages 完整历史(含本轮 user 消息、以及可能的工具结果)
52
- * @param onDelta 每收到一小段文本就回调(用于实时打印)
53
- * @returns 助手本回合的文本 + 它想调用的工具
54
- */
55
- async chat(messages, onDelta, options, onReasoning, onToolArgumentDelta) {
56
- const body = {
57
- model: this.model,
58
- messages: projectToolPairedMessages(messages),
59
- stream: true,
60
- stream_options: { include_usage: true },
61
- };
62
- if (!options?.disableTools) {
63
- body.tools = toolDefs(options?.allowedTools);
64
- if (options?.requireTools) {
65
- body.tool_choice = 'required';
66
- }
67
- }
68
- const stream = (await this.client.chat.completions.create(body));
69
- let content = '';
70
- // 工具调用在流里是分片到达的,按 index 累加拼回完整的 id/name/arguments
71
- const acc = {};
72
- let usage;
73
- for await (const chunk of stream) {
74
- const delta = chunk.choices[0]?.delta;
75
- if (!delta) {
76
- // OpenAI 流式 usage 通常在 choices 为空的最终 chunk 里
77
- const u = chunk.usage;
78
- if (u) {
79
- usage = {
80
- promptTokens: u.prompt_tokens ?? 0,
81
- completionTokens: u.completion_tokens ?? 0,
82
- totalTokens: u.total_tokens ?? 0,
83
- };
84
- }
85
- continue;
86
- }
87
- const reasoning = delta.reasoning_content;
88
- if (reasoning)
89
- onReasoning?.(reasoning);
90
- if (delta.content) {
91
- content += delta.content;
92
- onDelta(delta.content);
93
- }
94
- for (const tc of delta.tool_calls ?? []) {
95
- const cur = (acc[tc.index] ??= {
96
- id: '',
97
- name: '',
98
- arguments: '',
99
- });
100
- if (tc.id)
101
- cur.id = tc.id;
102
- if (tc.function?.name)
103
- cur.name = tc.function.name;
104
- if (tc.function?.arguments) {
105
- cur.arguments += tc.function.arguments;
106
- if (cur.name) {
107
- onToolArgumentDelta?.(tc.index, cur.name, cur.arguments);
108
- }
109
- }
110
- }
111
- }
112
- const toolCalls = Object.keys(acc)
113
- .map(Number)
114
- .sort((a, b) => a - b)
115
- .map((i) => acc[i]);
116
- return { content, toolCalls, usage };
117
- }
118
- }
119
- class AnthropicClient {
120
- client;
121
- model;
122
- constructor(config) {
123
- this.client = new Anthropic({
124
- apiKey: config.apiKey,
125
- baseURL: config.baseURL,
126
- });
127
- this.model = config.model;
128
- }
129
- getModel() {
130
- return this.model;
131
- }
132
- setModel(model) {
133
- this.model = model;
134
- }
135
- /**
136
- * Anthropic SDK 没有稳定的模型列表接口,返回常用模型。
137
- * 用户仍可用 /model <完整名> 切换到列表外的模型。
138
- */
139
- async listModels() {
140
- return [
141
- 'claude-opus-4-5-20251101',
142
- 'claude-sonnet-4-5-20251101',
143
- 'claude-sonnet-4-5-20241022',
144
- 'claude-3-5-sonnet-20241022',
145
- 'claude-3-opus-20240229',
146
- 'claude-3-sonnet-20240229',
147
- 'claude-3-haiku-20240307',
148
- ].sort();
149
- }
150
- async chat(messages, onDelta, options, onReasoning, onToolArgumentDelta) {
151
- const { system, messages: anthropicMessages } = toAnthropicMessages(messages);
152
- const tools = toAnthropicTools(options?.allowedTools);
153
- const stream = await this.client.messages.create({
154
- model: this.model,
155
- max_tokens: 4096,
156
- system,
157
- messages: anthropicMessages,
158
- stream: true,
159
- ...(options?.disableTools
160
- ? {}
161
- : {
162
- tools,
163
- ...(options?.requireTools
164
- ? { tool_choice: { type: 'any' } }
165
- : {}),
166
- }),
167
- });
168
- let content = '';
169
- const acc = {};
170
- let usage;
171
- for await (const event of stream) {
172
- if (event.type === 'content_block_delta') {
173
- if (event.delta.type === 'text_delta') {
174
- content += event.delta.text;
175
- onDelta(event.delta.text);
176
- }
177
- else if (event.delta.type === 'thinking_delta') {
178
- onReasoning?.(event.delta.thinking);
179
- }
180
- else if (event.delta.type === 'input_json_delta') {
181
- const tc = acc[event.index];
182
- if (tc) {
183
- tc.arguments += event.delta.partial_json;
184
- if (tc.name) {
185
- onToolArgumentDelta?.(event.index, tc.name, tc.arguments);
186
- }
187
- }
188
- }
189
- }
190
- else if (event.type === 'content_block_start') {
191
- if (event.content_block.type === 'tool_use') {
192
- acc[event.index] = {
193
- id: event.content_block.id,
194
- name: event.content_block.name,
195
- arguments: '',
196
- };
197
- }
198
- }
199
- else if (event.type === 'message_delta') {
200
- const u = event.usage;
201
- if (u) {
202
- usage = {
203
- promptTokens: u.input_tokens ?? 0,
204
- completionTokens: u.output_tokens ?? 0,
205
- totalTokens: (u.input_tokens ?? 0) + (u.output_tokens ?? 0),
206
- };
207
- }
208
- }
209
- }
210
- const toolCalls = Object.keys(acc)
211
- .map(Number)
212
- .sort((a, b) => a - b)
213
- .map((i) => acc[i]);
214
- return { content, toolCalls, usage };
215
- }
216
- }
217
- /** 把 OpenAI 风格的消息列表转成 Anthropic 的 system + messages。 */
218
- export function toAnthropicMessages(messages) {
219
- const projectedMessages = projectToolPairedMessages(messages);
220
- const systemParts = [];
221
- const anthropicMessages = [];
222
- const pendingToolUseIds = [];
223
- for (const m of projectedMessages) {
224
- if (m.role === 'system') {
225
- if (typeof m.content === 'string') {
226
- systemParts.push(m.content);
227
- }
228
- continue;
229
- }
230
- if (m.role === 'tool') {
231
- // Anthropic 的 tool_result 必须放在 user 消息里
232
- const toolCallId = m.tool_call_id ?? '';
233
- if (!pendingToolUseIds.includes(toolCallId)) {
234
- continue;
235
- }
236
- const resultText = typeof m.content === 'string' ? m.content : JSON.stringify(m.content);
237
- anthropicMessages.push({
238
- role: 'user',
239
- content: [
240
- {
241
- type: 'tool_result',
242
- tool_use_id: toolCallId,
243
- content: resultText,
244
- },
245
- ],
246
- });
247
- pendingToolUseIds.splice(pendingToolUseIds.indexOf(toolCallId), 1);
248
- continue;
249
- }
250
- if (m.role === 'assistant') {
251
- const content = [];
252
- if (typeof m.content === 'string' && m.content) {
253
- content.push({ type: 'text', text: m.content });
254
- }
255
- const toolCalls = m.tool_calls;
256
- if (Array.isArray(toolCalls)) {
257
- for (const tc of toolCalls) {
258
- if (!tc?.id || !tc?.function?.name) {
259
- continue;
260
- }
261
- content.push({
262
- type: 'tool_use',
263
- id: tc.id,
264
- name: tc.function?.name ?? '',
265
- input: safeParse(tc.function?.arguments ?? '{}'),
266
- });
267
- pendingToolUseIds.push(tc.id);
268
- }
269
- }
270
- anthropicMessages.push({ role: 'assistant', content });
271
- continue;
272
- }
273
- if (m.role === 'user') {
274
- if (typeof m.content === 'string') {
275
- anthropicMessages.push({ role: 'user', content: m.content });
276
- }
277
- else {
278
- anthropicMessages.push({
279
- role: 'user',
280
- content: JSON.stringify(m.content),
281
- });
282
- }
283
- }
9
+ if (config.provider === 'gemini') {
10
+ return new GeminiClient(config);
284
11
  }
285
- return { system: systemParts.join('\n\n'), messages: anthropicMessages };
12
+ return new OpenAIClient(config);
286
13
  }
287
14
  /**
288
15
  * 严格投影工具消息:只保留「assistant.tool_calls 后紧跟对应 tool 结果」
@@ -323,6 +50,11 @@ export function projectToolPairedMessages(messages) {
323
50
  }
324
51
  return projected;
325
52
  }
53
+ /**
54
+ * 从某条 assistant.tool_calls 后面连续的 tool 消息里收集结果 id。
55
+ *
56
+ * 一旦遇到非 tool 消息就停止,因为 provider 语义要求 tool_result 紧跟对应 tool_use。
57
+ */
326
58
  function collectFollowingToolResultIds(messages, assistantIndex) {
327
59
  const ids = new Set();
328
60
  for (let i = assistantIndex + 1; i < messages.length; i++) {
@@ -335,24 +67,4 @@ function collectFollowingToolResultIds(messages, assistantIndex) {
335
67
  }
336
68
  return ids;
337
69
  }
338
- /** 把内部工具定义转成 Anthropic 的 tool 格式。
339
- * 传 allowedNames 时只转换这些工具(与 OpenAI 路径一致)。 */
340
- export function toAnthropicTools(allowedNames) {
341
- return toolDefs(allowedNames).map((t) => ({
342
- name: t.function.name,
343
- description: t.function.description,
344
- input_schema: {
345
- type: 'object',
346
- ...t.function.parameters,
347
- },
348
- }));
349
- }
350
- function safeParse(json) {
351
- try {
352
- return JSON.parse(json);
353
- }
354
- catch {
355
- return {};
356
- }
357
- }
358
70
  //# sourceMappingURL=ai.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ai.js","sourceRoot":"","sources":["../../src/agent/ai.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ai.js","sourceRoot":"","sources":["../../src/agent/ai.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,207 @@
1
+ import Anthropic from '@anthropic-ai/sdk';
2
+ import { toolDefs } from '../../tools/index.js';
3
+ import { projectToolPairedMessages } from '../ai.js';
4
+ export class AnthropicClient {
5
+ client;
6
+ model;
7
+ /** 保存 Anthropic SDK 实例;baseURL 仅在用户配置代理或兼容网关时生效。 */
8
+ constructor(config) {
9
+ this.client = new Anthropic({
10
+ apiKey: config.apiKey,
11
+ baseURL: config.baseURL,
12
+ });
13
+ this.model = config.model;
14
+ }
15
+ /** 返回当前 Claude 模型名,保持与 OpenAIClient 的统一接口。 */
16
+ getModel() {
17
+ return this.model;
18
+ }
19
+ /** 只更新后续请求使用的模型名,不影响已存在的历史消息。 */
20
+ setModel(model) {
21
+ this.model = model;
22
+ }
23
+ /**
24
+ * Anthropic SDK 没有稳定的模型列表接口,返回常用模型。
25
+ * 用户仍可用 /model <完整名> 切换到列表外的模型。
26
+ */
27
+ async listModels() {
28
+ return [
29
+ 'claude-opus-4-5-20251101',
30
+ 'claude-sonnet-4-5-20251101',
31
+ 'claude-sonnet-4-5-20241022',
32
+ 'claude-3-5-sonnet-20241022',
33
+ 'claude-3-opus-20240229',
34
+ 'claude-3-sonnet-20240229',
35
+ 'claude-3-haiku-20240307',
36
+ ].sort();
37
+ }
38
+ /**
39
+ * 发送 Anthropic Messages 流式请求。
40
+ *
41
+ * 这里会先把 OpenAI 风格历史转换成 Anthropic 的 system/messages/tool_use 结构,
42
+ * 再把流式事件重新聚合成 CCLI 内部统一的 AssistantTurn。
43
+ */
44
+ async chat(messages, onDelta, options, onReasoning, onToolArgumentDelta) {
45
+ const { system, messages: anthropicMessages } = toAnthropicMessages(messages);
46
+ const tools = toAnthropicTools(options?.allowedTools);
47
+ const stream = await this.client.messages.create({
48
+ model: this.model,
49
+ max_tokens: 4096,
50
+ system,
51
+ messages: anthropicMessages,
52
+ stream: true,
53
+ ...(options?.disableTools
54
+ ? {}
55
+ : {
56
+ tools,
57
+ ...(options?.requireTools
58
+ ? { tool_choice: { type: 'any' } }
59
+ : {}),
60
+ }),
61
+ });
62
+ let content = '';
63
+ const acc = {};
64
+ let usage;
65
+ for await (const event of stream) {
66
+ if (event.type === 'content_block_delta') {
67
+ if (event.delta.type === 'text_delta') {
68
+ content += event.delta.text;
69
+ onDelta(event.delta.text);
70
+ }
71
+ else if (event.delta.type === 'thinking_delta') {
72
+ onReasoning?.(event.delta.thinking);
73
+ }
74
+ else if (event.delta.type === 'input_json_delta') {
75
+ const tc = acc[event.index];
76
+ if (tc) {
77
+ tc.arguments += event.delta.partial_json;
78
+ if (tc.name) {
79
+ onToolArgumentDelta?.(event.index, tc.name, tc.arguments);
80
+ }
81
+ }
82
+ }
83
+ }
84
+ else if (event.type === 'content_block_start') {
85
+ if (event.content_block.type === 'tool_use') {
86
+ acc[event.index] = {
87
+ id: event.content_block.id,
88
+ name: event.content_block.name,
89
+ arguments: '',
90
+ };
91
+ }
92
+ }
93
+ else if (event.type === 'message_delta') {
94
+ const u = event.usage;
95
+ if (u) {
96
+ usage = {
97
+ promptTokens: u.input_tokens ?? 0,
98
+ completionTokens: u.output_tokens ?? 0,
99
+ totalTokens: (u.input_tokens ?? 0) + (u.output_tokens ?? 0),
100
+ };
101
+ }
102
+ }
103
+ }
104
+ const toolCalls = Object.keys(acc)
105
+ .map(Number)
106
+ .sort((a, b) => a - b)
107
+ .map((i) => acc[i]);
108
+ return { content, toolCalls, usage };
109
+ }
110
+ }
111
+ /**
112
+ * 把 OpenAI 风格的消息列表转成 Anthropic 的 system + messages。
113
+ *
114
+ * Anthropic 不接受 `role:"system"` 混在 messages 里,也要求 tool_result 作为 user
115
+ * 内容块出现,所以这里集中做一次协议投影,避免业务层到处写 provider 分支。
116
+ */
117
+ export function toAnthropicMessages(messages) {
118
+ const projectedMessages = projectToolPairedMessages(messages);
119
+ const systemParts = [];
120
+ const anthropicMessages = [];
121
+ const pendingToolUseIds = [];
122
+ for (const m of projectedMessages) {
123
+ if (m.role === 'system') {
124
+ if (typeof m.content === 'string') {
125
+ systemParts.push(m.content);
126
+ }
127
+ continue;
128
+ }
129
+ if (m.role === 'tool') {
130
+ // Anthropic 的 tool_result 必须放在 user 消息里
131
+ const toolCallId = m.tool_call_id ?? '';
132
+ if (!pendingToolUseIds.includes(toolCallId)) {
133
+ continue;
134
+ }
135
+ const resultText = typeof m.content === 'string' ? m.content : JSON.stringify(m.content);
136
+ anthropicMessages.push({
137
+ role: 'user',
138
+ content: [
139
+ {
140
+ type: 'tool_result',
141
+ tool_use_id: toolCallId,
142
+ content: resultText,
143
+ },
144
+ ],
145
+ });
146
+ pendingToolUseIds.splice(pendingToolUseIds.indexOf(toolCallId), 1);
147
+ continue;
148
+ }
149
+ if (m.role === 'assistant') {
150
+ const content = [];
151
+ if (typeof m.content === 'string' && m.content) {
152
+ content.push({ type: 'text', text: m.content });
153
+ }
154
+ const toolCalls = m.tool_calls;
155
+ if (Array.isArray(toolCalls)) {
156
+ for (const tc of toolCalls) {
157
+ if (!tc?.id || !tc?.function?.name) {
158
+ continue;
159
+ }
160
+ content.push({
161
+ type: 'tool_use',
162
+ id: tc.id,
163
+ name: tc.function?.name ?? '',
164
+ input: safeParse(tc.function?.arguments ?? '{}'),
165
+ });
166
+ pendingToolUseIds.push(tc.id);
167
+ }
168
+ }
169
+ anthropicMessages.push({ role: 'assistant', content });
170
+ continue;
171
+ }
172
+ if (m.role === 'user') {
173
+ if (typeof m.content === 'string') {
174
+ anthropicMessages.push({ role: 'user', content: m.content });
175
+ }
176
+ else {
177
+ anthropicMessages.push({
178
+ role: 'user',
179
+ content: JSON.stringify(m.content),
180
+ });
181
+ }
182
+ }
183
+ }
184
+ return { system: systemParts.join('\n\n'), messages: anthropicMessages };
185
+ }
186
+ /** 把内部工具定义转成 Anthropic 的 tool 格式。
187
+ * 传 allowedNames 时只转换这些工具(与 OpenAI 路径一致)。 */
188
+ export function toAnthropicTools(allowedNames) {
189
+ return toolDefs(allowedNames).map((t) => ({
190
+ name: t.function.name,
191
+ description: t.function.description,
192
+ input_schema: {
193
+ type: 'object',
194
+ ...t.function.parameters,
195
+ },
196
+ }));
197
+ }
198
+ /** 解析模型给出的工具参数;失败时回落为空对象,避免坏 JSON 破坏整段 Anthropic 请求。 */
199
+ function safeParse(json) {
200
+ try {
201
+ return JSON.parse(json);
202
+ }
203
+ catch {
204
+ return {};
205
+ }
206
+ }
207
+ //# sourceMappingURL=anthropic.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anthropic.js","sourceRoot":"","sources":["../../../src/agent/providers/anthropic.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,mBAAmB,CAAC;AAE1C,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAShD,OAAO,EAAE,yBAAyB,EAAE,MAAM,UAAU,CAAC;AAErD,MAAM,OAAO,eAAe;IAChB,MAAM,CAAY;IAClB,KAAK,CAAS;IAEtB,oDAAoD;IACpD,YAAY,MAAc;QACtB,IAAI,CAAC,MAAM,GAAG,IAAI,SAAS,CAAC;YACxB,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,OAAO,EAAE,MAAM,CAAC,OAAO;SAC1B,CAAC,CAAC;QACH,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;IAC9B,CAAC;IAED,8CAA8C;IAC9C,QAAQ;QACJ,OAAO,IAAI,CAAC,KAAK,CAAC;IACtB,CAAC;IAED,iCAAiC;IACjC,QAAQ,CAAC,KAAa;QAClB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACvB,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,UAAU;QACZ,OAAO;YACH,0BAA0B;YAC1B,4BAA4B;YAC5B,4BAA4B;YAC5B,4BAA4B;YAC5B,wBAAwB;YACxB,0BAA0B;YAC1B,yBAAyB;SAC5B,CAAC,IAAI,EAAE,CAAC;IACb,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,IAAI,CACN,QAAuB,EACvB,OAA+B,EAC/B,OAAqB,EACrB,WAAoC,EACpC,mBAIS;QAET,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,iBAAiB,EAAE,GAAG,mBAAmB,CAAC,QAAQ,CAAC,CAAC;QAC9E,MAAM,KAAK,GAAG,gBAAgB,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;QAEtD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;YAC7C,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,UAAU,EAAE,IAAI;YAChB,MAAM;YACN,QAAQ,EAAE,iBAAiB;YAC3B,MAAM,EAAE,IAAI;YACZ,GAAG,CAAC,OAAO,EAAE,YAAY;gBACrB,CAAC,CAAC,EAAE;gBACJ,CAAC,CAAC;oBACI,KAAK;oBACL,GAAG,CAAC,OAAO,EAAE,YAAY;wBACrB,CAAC,CAAC,EAAE,WAAW,EAAE,EAAE,IAAI,EAAE,KAAK,EAAW,EAAE;wBAC3C,CAAC,CAAC,EAAE,CAAC;iBACZ,CAAC;SACX,CAAC,CAAC;QAEH,IAAI,OAAO,GAAG,EAAE,CAAC;QACjB,MAAM,GAAG,GAA6B,EAAE,CAAC;QACzC,IAAI,KAAwB,CAAC;QAE7B,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC/B,IAAI,KAAK,CAAC,IAAI,KAAK,qBAAqB,EAAE,CAAC;gBACvC,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;oBACpC,OAAO,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC;oBAC5B,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBAC9B,CAAC;qBAAM,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,gBAAgB,EAAE,CAAC;oBAC/C,WAAW,EAAE,CAAE,KAAK,CAAC,KAAa,CAAC,QAAQ,CAAC,CAAC;gBACjD,CAAC;qBAAM,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,kBAAkB,EAAE,CAAC;oBACjD,MAAM,EAAE,GAAG,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;oBAC5B,IAAI,EAAE,EAAE,CAAC;wBACL,EAAE,CAAC,SAAS,IAAI,KAAK,CAAC,KAAK,CAAC,YAAY,CAAC;wBACzC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC;4BACV,mBAAmB,EAAE,CACjB,KAAK,CAAC,KAAK,EACX,EAAE,CAAC,IAAI,EACP,EAAE,CAAC,SAAS,CACf,CAAC;wBACN,CAAC;oBACL,CAAC;gBACL,CAAC;YACL,CAAC;iBAAM,IAAI,KAAK,CAAC,IAAI,KAAK,qBAAqB,EAAE,CAAC;gBAC9C,IAAI,KAAK,CAAC,aAAa,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;oBAC1C,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG;wBACf,EAAE,EAAE,KAAK,CAAC,aAAa,CAAC,EAAE;wBAC1B,IAAI,EAAE,KAAK,CAAC,aAAa,CAAC,IAAI;wBAC9B,SAAS,EAAE,EAAE;qBAChB,CAAC;gBACN,CAAC;YACL,CAAC;iBAAM,IAAI,KAAK,CAAC,IAAI,KAAK,eAAe,EAAE,CAAC;gBACxC,MAAM,CAAC,GAAI,KAAa,CAAC,KAAK,CAAC;gBAC/B,IAAI,CAAC,EAAE,CAAC;oBACJ,KAAK,GAAG;wBACJ,YAAY,EAAE,CAAC,CAAC,YAAY,IAAI,CAAC;wBACjC,gBAAgB,EAAE,CAAC,CAAC,aAAa,IAAI,CAAC;wBACtC,WAAW,EACP,CAAC,CAAC,CAAC,YAAY,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,aAAa,IAAI,CAAC,CAAC;qBACrD,CAAC;gBACN,CAAC;YACL,CAAC;QACL,CAAC;QAED,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;aAC7B,GAAG,CAAC,MAAM,CAAC;aACX,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;aACrB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACxB,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;IACzC,CAAC;CACJ;AAED;;;;;GAKG;AACH,MAAM,UAAU,mBAAmB,CAAC,QAAuB;IAIvD,MAAM,iBAAiB,GAAG,yBAAyB,CAAC,QAAQ,CAAC,CAAC;IAC9D,MAAM,WAAW,GAAa,EAAE,CAAC;IACjC,MAAM,iBAAiB,GAAsC,EAAE,CAAC;IAChE,MAAM,iBAAiB,GAAa,EAAE,CAAC;IAEvC,KAAK,MAAM,CAAC,IAAI,iBAAiB,EAAE,CAAC;QAChC,IAAI,CAAC,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACtB,IAAI,OAAO,CAAC,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;gBAChC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;YAChC,CAAC;YACD,SAAS;QACb,CAAC;QAED,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YACpB,wCAAwC;YACxC,MAAM,UAAU,GAAI,CAAS,CAAC,YAAY,IAAI,EAAE,CAAC;YACjD,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;gBAC1C,SAAS;YACb,CAAC;YACD,MAAM,UAAU,GACZ,OAAO,CAAC,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;YAC1E,iBAAiB,CAAC,IAAI,CAAC;gBACnB,IAAI,EAAE,MAAM;gBACZ,OAAO,EAAE;oBACL;wBACI,IAAI,EAAE,aAAa;wBACnB,WAAW,EAAE,UAAU;wBACvB,OAAO,EAAE,UAAU;qBACqB;iBAC/C;aACJ,CAAC,CAAC;YACH,iBAAiB,CAAC,MAAM,CAAC,iBAAiB,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC;YACnE,SAAS;QACb,CAAC;QAED,IAAI,CAAC,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;YACzB,MAAM,OAAO,GAA2C,EAAE,CAAC;YAC3D,IAAI,OAAO,CAAC,CAAC,OAAO,KAAK,QAAQ,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;gBAC7C,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;YACpD,CAAC;YAED,MAAM,SAAS,GAAI,CAAS,CAAC,UAAU,CAAC;YACxC,IAAI,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC3B,KAAK,MAAM,EAAE,IAAI,SAAS,EAAE,CAAC;oBACzB,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;wBACjC,SAAS;oBACb,CAAC;oBACD,OAAO,CAAC,IAAI,CAAC;wBACT,IAAI,EAAE,UAAU;wBAChB,EAAE,EAAE,EAAE,CAAC,EAAE;wBACT,IAAI,EAAE,EAAE,CAAC,QAAQ,EAAE,IAAI,IAAI,EAAE;wBAC7B,KAAK,EAAE,SAAS,CAAC,EAAE,CAAC,QAAQ,EAAE,SAAS,IAAI,IAAI,CAAC;qBACX,CAAC,CAAC;oBAC3C,iBAAiB,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;gBAClC,CAAC;YACL,CAAC;YAED,iBAAiB,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC,CAAC;YACvD,SAAS;QACb,CAAC;QAED,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YACpB,IAAI,OAAO,CAAC,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;gBAChC,iBAAiB,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;YACjE,CAAC;iBAAM,CAAC;gBACJ,iBAAiB,CAAC,IAAI,CAAC;oBACnB,IAAI,EAAE,MAAM;oBACZ,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC;iBACrC,CAAC,CAAC;YACP,CAAC;QACL,CAAC;IACL,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,iBAAiB,EAAE,CAAC;AAC7E,CAAC;AAED;8CAC8C;AAC9C,MAAM,UAAU,gBAAgB,CAC5B,YAAuB;IAEvB,OAAO,QAAQ,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACtC,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,IAAI;QACrB,WAAW,EAAE,CAAC,CAAC,QAAQ,CAAC,WAAW;QACnC,YAAY,EAAE;YACV,IAAI,EAAE,QAAiB;YACvB,GAAG,CAAC,CAAC,QAAQ,CAAC,UAAU;SAC3B;KACJ,CAAC,CAAC,CAAC;AACR,CAAC;AAED,wDAAwD;AACxD,SAAS,SAAS,CAAC,IAAY;IAC3B,IAAI,CAAC;QACD,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,EAAE,CAAC;IACd,CAAC;AACL,CAAC"}