@gird/ccli 2.15.0 → 2.18.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.
- package/README.md +22 -6
- package/dist/agent/ai.js +10 -345
- package/dist/agent/ai.js.map +1 -1
- package/dist/agent/providers/anthropic.js +258 -0
- package/dist/agent/providers/anthropic.js.map +1 -0
- package/dist/agent/providers/gemini.js +14 -0
- package/dist/agent/providers/gemini.js.map +1 -0
- package/dist/agent/providers/openai.js +110 -0
- package/dist/agent/providers/openai.js.map +1 -0
- package/dist/agent/tool-projection.js +57 -0
- package/dist/agent/tool-projection.js.map +1 -0
- package/dist/cli/args/index.js +4 -0
- package/dist/cli/args/index.js.map +1 -1
- package/dist/cli/clipboard-image.js +51 -0
- package/dist/cli/clipboard-image.js.map +1 -0
- package/dist/cli/image-compress.js +62 -0
- package/dist/cli/image-compress.js.map +1 -0
- package/dist/cli/image-reference.js +190 -0
- package/dist/cli/image-reference.js.map +1 -0
- package/dist/cli/repl/index.js +110 -60
- package/dist/cli/repl/index.js.map +1 -1
- package/dist/cli/run/event-renderer.js +57 -0
- package/dist/cli/run/event-renderer.js.map +1 -0
- package/dist/cli/run/hooks.js +58 -19
- package/dist/cli/run/hooks.js.map +1 -1
- package/dist/cli/run/index.js +218 -9
- package/dist/cli/run/index.js.map +1 -1
- package/dist/cli/run/task.js +58 -1
- package/dist/cli/run/task.js.map +1 -1
- package/dist/cli/run/todo-panel.js +13 -0
- package/dist/cli/run/todo-panel.js.map +1 -1
- package/dist/cli/session/checkpoint.js +252 -0
- package/dist/cli/session/checkpoint.js.map +1 -0
- package/dist/cli/session/index.js +1 -1
- package/dist/cli/session/index.js.map +1 -1
- package/dist/cli/slash/index.js +26 -2
- package/dist/cli/slash/index.js.map +1 -1
- package/dist/cli/slash/session/load.js +3 -0
- package/dist/cli/slash/session/load.js.map +1 -1
- package/dist/cli/slash/session/replay.js +118 -0
- package/dist/cli/slash/session/replay.js.map +1 -0
- package/dist/cli/slash/session/save.js +1 -0
- package/dist/cli/slash/session/save.js.map +1 -1
- package/dist/cli/slash/system/agent.js +38 -104
- package/dist/cli/slash/system/agent.js.map +1 -1
- package/dist/cli/slash/system/compact.js +26 -5
- package/dist/cli/slash/system/compact.js.map +1 -1
- package/dist/cli/slash/system/goal.js +34 -34
- package/dist/cli/slash/system/goal.js.map +1 -1
- package/dist/cli/slash/system/help.js +3 -0
- package/dist/cli/slash/system/help.js.map +1 -1
- package/dist/cli/slash/system/plan.js +140 -0
- package/dist/cli/slash/system/plan.js.map +1 -0
- package/dist/cli/slash/system/revert.js +133 -0
- package/dist/cli/slash/system/revert.js.map +1 -0
- package/dist/config/config.js +57 -4
- package/dist/config/config.js.map +1 -1
- package/dist/config/plugins.js +378 -0
- package/dist/config/plugins.js.map +1 -0
- package/dist/config/skills.js +68 -6
- package/dist/config/skills.js.map +1 -1
- package/dist/harness/index.js +334 -0
- package/dist/harness/index.js.map +1 -0
- package/dist/harness/records.js +98 -0
- package/dist/harness/records.js.map +1 -0
- package/dist/index.js +87 -42
- package/dist/index.js.map +1 -1
- package/dist/tools/bash-background.js +2 -2
- package/dist/tools/bash-background.js.map +1 -1
- package/dist/tools/bash.js +3 -2
- package/dist/tools/bash.js.map +1 -1
- package/dist/tools/edit-file.js +8 -2
- package/dist/tools/edit-file.js.map +1 -1
- package/dist/tools/glob.js +4 -3
- package/dist/tools/glob.js.map +1 -1
- package/dist/tools/grep.js +4 -3
- package/dist/tools/grep.js.map +1 -1
- package/dist/tools/index.js +20 -0
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/list-dir.js +3 -2
- package/dist/tools/list-dir.js.map +1 -1
- package/dist/tools/read-file.js +3 -2
- package/dist/tools/read-file.js.map +1 -1
- package/dist/tools/shared.js.map +1 -1
- package/dist/tools/todo.js +17 -5
- package/dist/tools/todo.js.map +1 -1
- package/dist/tools/web-fetch.js +95 -0
- package/dist/tools/web-fetch.js.map +1 -0
- package/dist/tools/write-file.js +8 -2
- package/dist/tools/write-file.js.map +1 -1
- package/package.json +1 -1
|
@@ -12,6 +12,7 @@ export async function handleLoad(arg, ctx) {
|
|
|
12
12
|
if (result.ok) {
|
|
13
13
|
ctx.history.length = 0;
|
|
14
14
|
ctx.history.push(...result.history);
|
|
15
|
+
ctx.sessionId = result.name;
|
|
15
16
|
console.log(`已加载会话:${result.name}(${result.history.length} 条消息)`);
|
|
16
17
|
}
|
|
17
18
|
else {
|
|
@@ -32,6 +33,7 @@ export async function handleLoad(arg, ctx) {
|
|
|
32
33
|
if (result.ok) {
|
|
33
34
|
ctx.history.length = 0;
|
|
34
35
|
ctx.history.push(...result.history);
|
|
36
|
+
ctx.sessionId = result.name;
|
|
35
37
|
console.log(`已加载会话:${result.name}(${result.history.length} 条消息)`);
|
|
36
38
|
}
|
|
37
39
|
else {
|
|
@@ -60,6 +62,7 @@ export async function handleLoad(arg, ctx) {
|
|
|
60
62
|
if (result.ok) {
|
|
61
63
|
ctx.history.length = 0;
|
|
62
64
|
ctx.history.push(...result.history);
|
|
65
|
+
ctx.sessionId = result.name;
|
|
63
66
|
console.log(`已加载会话:${result.name}(${result.history.length} 条消息)`);
|
|
64
67
|
}
|
|
65
68
|
else {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"load.js","sourceRoot":"","sources":["../../../../src/cli/slash/session/load.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"load.js","sourceRoot":"","sources":["../../../../src/cli/slash/session/load.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,YAAY,EACZ,WAAW,EACX,cAAc,GACjB,MAAM,wBAAwB,CAAC;AAGhC,0CAA0C;AAC1C,MAAM,CAAC,KAAK,UAAU,UAAU,CAC5B,GAAW,EACX,GAAiB;IAEjB,IAAI,CAAC,GAAG,EAAE,CAAC;QACP,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;QAC9B,OAAO;IACX,CAAC;IAED,cAAc;IACd,MAAM,KAAK,GAAG,YAAY,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,GAAG,CAAC,CAAC;IACzD,IAAI,KAAK,EAAE,CAAC;QACR,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;QAChC,IAAI,MAAM,CAAC,EAAE,EAAE,CAAC;YACZ,GAAG,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;YACvB,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;YACpC,GAAG,CAAC,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC;YAC5B,OAAO,CAAC,GAAG,CACP,SAAS,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,OAAO,CACvD,CAAC;QACN,CAAC;aAAM,CAAC;YACJ,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAChC,CAAC;QACD,OAAO;IACX,CAAC;IAED,WAAW;IACX,MAAM,OAAO,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC;IACpC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,CAAC,GAAG,CAAC,UAAU,GAAG,QAAQ,CAAC,CAAC;QACnC,OAAO;IACX,CAAC;IAED,sBAAsB;IACtB,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAC7B,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;QACjC,IAAI,MAAM,CAAC,EAAE,EAAE,CAAC;YACZ,GAAG,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;YACvB,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;YACpC,GAAG,CAAC,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC;YAC5B,OAAO,CAAC,GAAG,CACP,SAAS,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,OAAO,CACvD,CAAC;QACN,CAAC;aAAM,CAAC;YACJ,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAChC,CAAC;QACD,OAAO;IACX,CAAC;IAED,gBAAgB;IAChB,OAAO,CAAC,GAAG,CAAC,UAAU,GAAG,QAAQ,OAAO,CAAC,MAAM,OAAO,CAAC,CAAC;IACxD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QACrB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IACzC,CAAC;IAED,MAAM,MAAM,GAAG,CAAC,MAAM,GAAG,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACzD,IAAI,MAAM,KAAK,EAAE,EAAE,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACpB,OAAO;IACX,CAAC;IAED,MAAM,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACxC,IAAI,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,GAAG,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;QACxD,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACrB,OAAO;IACX,CAAC;IAED,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;IACnC,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;IACjC,IAAI,MAAM,CAAC,EAAE,EAAE,CAAC;QACZ,GAAG,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;QACvB,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;QACpC,GAAG,CAAC,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC;QAC5B,OAAO,CAAC,GAAG,CACP,SAAS,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,OAAO,CACvD,CAAC;IACN,CAAC;SAAM,CAAC;QACJ,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAChC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* /replay:回放会话事件记录(records)。
|
|
3
|
+
*
|
|
4
|
+
* 把 ~/.ccli/records/<sessionId>.jsonl 渲染成带时间线的紧凑复盘:
|
|
5
|
+
* 用户说了什么、模型每轮回答/调用了什么、工具返回了什么、回合怎么结束。
|
|
6
|
+
* 只读,不修改任何状态。
|
|
7
|
+
*/
|
|
8
|
+
import { existsSync, readFileSync, readdirSync, statSync } from 'node:fs';
|
|
9
|
+
import { join } from 'node:path';
|
|
10
|
+
import { defaultRecordsDir } from '../../../harness/records.js';
|
|
11
|
+
import { style } from '../../style.js';
|
|
12
|
+
/** 读取某个会话的 records;文件不存在返回空数组;坏行跳过。 */
|
|
13
|
+
export function readRecords(recordsDir, sessionId) {
|
|
14
|
+
const safe = sessionId.replace(/[^a-zA-Z0-9._-]/g, '_') || 'session';
|
|
15
|
+
const path = join(recordsDir, `${safe}.jsonl`);
|
|
16
|
+
if (!existsSync(path))
|
|
17
|
+
return [];
|
|
18
|
+
const events = [];
|
|
19
|
+
for (const line of readFileSync(path, 'utf8').split('\n')) {
|
|
20
|
+
if (!line.trim())
|
|
21
|
+
continue;
|
|
22
|
+
try {
|
|
23
|
+
const e = JSON.parse(line);
|
|
24
|
+
if (e && typeof e.type === 'string')
|
|
25
|
+
events.push(e);
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
// 坏行跳过(可能来自写了一半的崩溃)
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
return events;
|
|
32
|
+
}
|
|
33
|
+
/** 列出有 records 的会话 ID,按文件修改时间倒序(供补全)。 */
|
|
34
|
+
export function listRecordSessions(recordsDir) {
|
|
35
|
+
if (!existsSync(recordsDir))
|
|
36
|
+
return [];
|
|
37
|
+
return readdirSync(recordsDir)
|
|
38
|
+
.filter((f) => f.endsWith('.jsonl'))
|
|
39
|
+
.map((f) => ({
|
|
40
|
+
id: f.replace(/\.jsonl$/, ''),
|
|
41
|
+
mtime: statSync(join(recordsDir, f)).mtime.getTime(),
|
|
42
|
+
}))
|
|
43
|
+
.sort((a, b) => b.mtime - a.mtime)
|
|
44
|
+
.map((x) => x.id);
|
|
45
|
+
}
|
|
46
|
+
/** 截断成单行,保持终端紧凑。 */
|
|
47
|
+
function oneLine(s, max = 160) {
|
|
48
|
+
const flat = s.replace(/\s+/g, ' ').trim();
|
|
49
|
+
return flat.length > max ? flat.slice(0, max) + '…' : flat;
|
|
50
|
+
}
|
|
51
|
+
/** ISO 时间 → 本地 HH:MM:SS。 */
|
|
52
|
+
function hhmmss(iso) {
|
|
53
|
+
const d = new Date(iso);
|
|
54
|
+
if (Number.isNaN(d.getTime()))
|
|
55
|
+
return '--:--:--';
|
|
56
|
+
const p = (n) => String(n).padStart(2, '0');
|
|
57
|
+
return `${p(d.getHours())}:${p(d.getMinutes())}:${p(d.getSeconds())}`;
|
|
58
|
+
}
|
|
59
|
+
/** 把事件列表渲染成复盘文本(纯函数,便于测试)。 */
|
|
60
|
+
export function renderReplay(sessionId, events, filePath) {
|
|
61
|
+
const lines = [
|
|
62
|
+
style.label(`会话回放:${sessionId}(${events.length} 个事件)`),
|
|
63
|
+
style.muted(`文件:${filePath}`),
|
|
64
|
+
'',
|
|
65
|
+
];
|
|
66
|
+
for (const e of events) {
|
|
67
|
+
const t = style.muted(hhmmss(e.ts));
|
|
68
|
+
// 子代理事件:└─ 前缀 + 标签后 @子任务名,内容多缩进两格,形成嵌套层次
|
|
69
|
+
const sub = e.subagent;
|
|
70
|
+
const prefix = sub ? `${style.muted('└─')} ` : '';
|
|
71
|
+
const tag = sub ? style.muted(`@${sub}`) : '';
|
|
72
|
+
const indent = sub ? ' ' : ' ';
|
|
73
|
+
switch (e.type) {
|
|
74
|
+
case 'user':
|
|
75
|
+
lines.push(`${t} ${prefix}${style.label('用户')}${tag}`);
|
|
76
|
+
lines.push(`${indent}${oneLine(e.content)}`);
|
|
77
|
+
break;
|
|
78
|
+
case 'assistant': {
|
|
79
|
+
const tools = e.tool_calls?.map((tc) => tc.name).join(', ');
|
|
80
|
+
lines.push(`${t} ${prefix}${style.label('助手')}${tag}${tools ? style.tool(`(调用 ${tools})`) : ''}`);
|
|
81
|
+
if (e.content)
|
|
82
|
+
lines.push(`${indent}${oneLine(e.content)}`);
|
|
83
|
+
else if (e.tool_calls?.[0])
|
|
84
|
+
lines.push(`${indent}${style.muted(oneLine(e.tool_calls[0].arguments, 120))}`);
|
|
85
|
+
break;
|
|
86
|
+
}
|
|
87
|
+
case 'tool_result': {
|
|
88
|
+
const mark = e.is_error
|
|
89
|
+
? style.error('✗')
|
|
90
|
+
: style.success('✓');
|
|
91
|
+
lines.push(`${t} ${prefix}${style.tool(`工具 ${e.tool}`)}${tag} ${mark}`);
|
|
92
|
+
lines.push(`${indent}${style.muted(oneLine(e.output, 120))}`);
|
|
93
|
+
break;
|
|
94
|
+
}
|
|
95
|
+
case 'turn_end': {
|
|
96
|
+
const detail = ` ${e.stop_reason} · 累计 tokens ${e.usage.totalTokens.toLocaleString()}`;
|
|
97
|
+
lines.push(sub
|
|
98
|
+
? `${t} ${prefix}${style.muted('回合结束')}${tag}${style.muted(detail)}`
|
|
99
|
+
: `${t} ${style.muted(`回合结束${detail}`)}`);
|
|
100
|
+
break;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
return lines.join('\n');
|
|
105
|
+
}
|
|
106
|
+
/** /replay [sessionId]:回放当前或指定会话的 records。 */
|
|
107
|
+
export function handleReplay(arg, ctx) {
|
|
108
|
+
const recordsDir = ctx.recordsDir ?? defaultRecordsDir();
|
|
109
|
+
const sessionId = arg.trim() || ctx.sessionId;
|
|
110
|
+
const events = readRecords(recordsDir, sessionId);
|
|
111
|
+
if (events.length === 0) {
|
|
112
|
+
console.log(style.muted(`会话 ${sessionId} 没有事件记录(可能是 records 功能(v2.17.0 后)之前的会话,或该会话还没有跑过回合)。`));
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
const safe = sessionId.replace(/[^a-zA-Z0-9._-]/g, '_') || 'session';
|
|
116
|
+
console.log(renderReplay(sessionId, events, join(recordsDir, `${safe}.jsonl`)));
|
|
117
|
+
}
|
|
118
|
+
//# sourceMappingURL=replay.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"replay.js","sourceRoot":"","sources":["../../../../src/cli/slash/session/replay.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"save.js","sourceRoot":"","sources":["../../../../src/cli/slash/session/save.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAGrD,qBAAqB;AACrB,MAAM,UAAU,UAAU,CAAC,GAAW,EAAE,GAAiB;IACrD,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;IAC7C,IAAI,MAAM,CAAC,EAAE,EAAE,CAAC;QACZ,OAAO,CAAC,GAAG,CAAC,SAAS,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;IACxC,CAAC;SAAM,CAAC;QACJ,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAChC,CAAC;AACL,CAAC"}
|
|
1
|
+
{"version":3,"file":"save.js","sourceRoot":"","sources":["../../../../src/cli/slash/session/save.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAGrD,qBAAqB;AACrB,MAAM,UAAU,UAAU,CAAC,GAAW,EAAE,GAAiB;IACrD,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;IAC7C,IAAI,MAAM,CAAC,EAAE,EAAE,CAAC;QACZ,GAAG,CAAC,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC;QAC5B,OAAO,CAAC,GAAG,CAAC,SAAS,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;IACxC,CAAC;SAAM,CAAC;QACJ,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAChC,CAAC;AACL,CAAC"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { runAgentTurn } from '../../run/index.js';
|
|
2
2
|
import { style } from '../../style.js';
|
|
3
3
|
import { getTool } from '../../../tools/index.js';
|
|
4
|
+
import { resetTodos } from '../../../tools/todo.js';
|
|
4
5
|
/** 规划阶段的系统提示:只输出计划,不调用工具。 */
|
|
5
6
|
const PLANNING_SYSTEM_PROMPT = `你是 CCLI 的 Agent 规划助手。
|
|
6
7
|
|
|
@@ -23,74 +24,15 @@ const PLANNING_SYSTEM_PROMPT = `你是 CCLI 的 Agent 规划助手。
|
|
|
23
24
|
export const EXECUTION_SYSTEM_PROMPT = `你是 CCLI 的 Agent 执行助手。
|
|
24
25
|
|
|
25
26
|
你的工作方式是:
|
|
26
|
-
1.
|
|
27
|
-
2.
|
|
28
|
-
3.
|
|
27
|
+
1. 先用 todo 工具把已批准的计划拆成待办清单(每项一句话)。
|
|
28
|
+
2. 调用可用工具逐项执行;完成一项就把它标 done,并把下一项标 in_progress,同时只保留一项 in_progress。
|
|
29
|
+
3. 根据工具返回结果继续下一步。
|
|
30
|
+
4. 全部完成后,给出清晰简洁的最终总结。
|
|
29
31
|
|
|
30
32
|
注意:
|
|
31
33
|
- 对于写文件、编辑文件、执行 shell 等破坏性操作,系统会先向用户确认。
|
|
32
34
|
- 保持回复简洁,重点放在行动和结果上。
|
|
33
35
|
- 如果某一步失败,尝试用其他方式完成,或说明无法完成的原因。`;
|
|
34
|
-
/** 从计划文本中解析编号步骤。 */
|
|
35
|
-
export function parsePlanSteps(plan) {
|
|
36
|
-
return plan
|
|
37
|
-
.split('\n')
|
|
38
|
-
.map((line) => line.trim())
|
|
39
|
-
.filter((line) => /^\d+[.、.\)\]]\s*/.test(line))
|
|
40
|
-
.map((line) => line.replace(/^\d+[.、.\)\]]\s*/, '').trim());
|
|
41
|
-
}
|
|
42
|
-
/** 计划进度跟踪器:负责打印带状态标记的计划。 */
|
|
43
|
-
export class PlanTracker {
|
|
44
|
-
steps;
|
|
45
|
-
completed = 0;
|
|
46
|
-
constructor(plan) {
|
|
47
|
-
this.steps = parsePlanSteps(plan);
|
|
48
|
-
}
|
|
49
|
-
hasSteps() {
|
|
50
|
-
return this.steps.length > 0;
|
|
51
|
-
}
|
|
52
|
-
total() {
|
|
53
|
-
return this.steps.length;
|
|
54
|
-
}
|
|
55
|
-
/** 打印当前步骤(执行中)。 */
|
|
56
|
-
printCurrent() {
|
|
57
|
-
const idx = Math.min(this.completed, this.steps.length - 1);
|
|
58
|
-
const text = this.steps[idx] ?? '继续执行';
|
|
59
|
-
console.log(style.step(`\n[→] 步骤 ${idx + 1}/${this.steps.length}:${text}`));
|
|
60
|
-
}
|
|
61
|
-
/** 打印刚完成的步骤。 */
|
|
62
|
-
printDone() {
|
|
63
|
-
const idx = this.completed;
|
|
64
|
-
if (idx >= 0 && idx < this.steps.length) {
|
|
65
|
-
console.log(style.done(`[✓] 步骤 ${idx + 1}/${this.steps.length} 完成`));
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
/** 打印完整计划状态。 */
|
|
69
|
-
printState() {
|
|
70
|
-
if (this.steps.length === 0)
|
|
71
|
-
return;
|
|
72
|
-
console.log(style.label('[Agent] 当前计划状态:'));
|
|
73
|
-
for (let i = 0; i < this.steps.length; i++) {
|
|
74
|
-
let marker;
|
|
75
|
-
if (i < this.completed) {
|
|
76
|
-
marker = style.done('[✓]');
|
|
77
|
-
}
|
|
78
|
-
else if (i === this.completed) {
|
|
79
|
-
marker = style.step('[→]');
|
|
80
|
-
}
|
|
81
|
-
else {
|
|
82
|
-
marker = style.muted('[ ]');
|
|
83
|
-
}
|
|
84
|
-
console.log(`${marker} ${i + 1}. ${this.steps[i]}`);
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
/** 标记当前步骤已完成。 */
|
|
88
|
-
advance() {
|
|
89
|
-
if (this.completed < this.steps.length) {
|
|
90
|
-
this.completed++;
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
36
|
/** 截断过长的工具结果,便于在终端阅读。 */
|
|
95
37
|
function truncateResult(result, max = 300) {
|
|
96
38
|
if (result.length <= max)
|
|
@@ -124,14 +66,6 @@ export async function buildPlan(task, ctx, systemPrompt = PLANNING_SYSTEM_PROMPT
|
|
|
124
66
|
plan = turn.content || plan;
|
|
125
67
|
return plan.trim();
|
|
126
68
|
}
|
|
127
|
-
/** 使用 ask 包装确认函数。 */
|
|
128
|
-
export function makeConfirm(ctx) {
|
|
129
|
-
return async (preview) => {
|
|
130
|
-
console.log('\n' + preview);
|
|
131
|
-
const answer = (await ctx.ask('确认执行?(y/N) ')).trim().toLowerCase();
|
|
132
|
-
return answer === 'y' || answer === 'yes' ? 'yes' : 'no';
|
|
133
|
-
};
|
|
134
|
-
}
|
|
135
69
|
/** /agent:先制定计划,确认后自动执行。 */
|
|
136
70
|
export async function handleAgent(arg, ctx) {
|
|
137
71
|
const task = arg.trim();
|
|
@@ -147,45 +81,45 @@ export async function handleAgent(arg, ctx) {
|
|
|
147
81
|
}
|
|
148
82
|
console.log(style.label('\n\n[Agent] 计划如下:'));
|
|
149
83
|
console.log(plan);
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
if (answer !== 'y' && answer !== 'yes') {
|
|
84
|
+
// 方向键选择确认,与 /plan、工具确认保持一致
|
|
85
|
+
const approve = await ctx.confirm('是否按此计划执行?', '批准并执行', '取消');
|
|
86
|
+
if (!approve) {
|
|
154
87
|
console.log(style.warn('[Agent] 已取消执行。'));
|
|
155
88
|
return;
|
|
156
89
|
}
|
|
157
90
|
console.log(style.label('\n[Agent] 开始执行计划...'));
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
//
|
|
91
|
+
// 新任务 = 新待办清单:清掉上一任务可能残留的未完成项,
|
|
92
|
+
// 否则待办续跑提醒会拿旧任务的清单催模型
|
|
93
|
+
resetTodos();
|
|
94
|
+
// 切换为执行系统提示,并注入已批准的计划;执行结束(含异常)后还原,
|
|
95
|
+
// 否则本会话后续普通对话会一直顶着执行提示 + 过期计划
|
|
96
|
+
const originalSystem = ctx.history[0].content;
|
|
163
97
|
ctx.history[0].content = `${EXECUTION_SYSTEM_PROMPT}\n\n已批准的计划:\n${plan}`;
|
|
164
98
|
ctx.history.push({ role: 'user', content: task });
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
}
|
|
99
|
+
try {
|
|
100
|
+
await runAgentTurn({
|
|
101
|
+
ai: ctx.ai,
|
|
102
|
+
history: ctx.history,
|
|
103
|
+
confirm: ctx.confirmChoice,
|
|
104
|
+
stats: ctx.stats,
|
|
105
|
+
maxRounds: 30,
|
|
106
|
+
requireToolsFirstRound: true,
|
|
107
|
+
continueOnPendingTodos: true,
|
|
108
|
+
hooks: ctx.hooks,
|
|
109
|
+
record: ctx.record,
|
|
110
|
+
onToolCall: (tc) => {
|
|
111
|
+
console.log(style.tool(`\n[Agent] 调用 ${tc.name}`));
|
|
112
|
+
console.log(formatToolCall(tc));
|
|
113
|
+
},
|
|
114
|
+
onToolResult: (tc, result) => {
|
|
115
|
+
console.log(style.muted(`\n[Agent] ${tc.name} 结果:`));
|
|
116
|
+
console.log(truncateResult(result.output));
|
|
117
|
+
},
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
finally {
|
|
121
|
+
ctx.history[0].content = originalSystem;
|
|
122
|
+
}
|
|
189
123
|
console.log(style.success('\n[Agent] 任务执行结束'));
|
|
190
124
|
}
|
|
191
125
|
//# sourceMappingURL=agent.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent.js","sourceRoot":"","sources":["../../../../src/cli/slash/system/agent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAEvC,OAAO,EAAE,OAAO,EAAmB,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"agent.js","sourceRoot":"","sources":["../../../../src/cli/slash/system/agent.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { estimatePromptTokens, resetStats, getContextLimit, } from '../../stats/index.js';
|
|
2
2
|
import { style } from '../../style.js';
|
|
3
|
+
import { formatTodos, getTodos } from '../../../tools/todo.js';
|
|
4
|
+
import { runHooks } from '../../run/hooks.js';
|
|
3
5
|
/** 上下文占比低于此值时,压缩通常没必要,先向用户确认。 */
|
|
4
6
|
const COMPACT_MIN_RATIO = 0.5;
|
|
5
7
|
/** 上下文占比达到此值时,下一轮对话前自动压缩。 */
|
|
@@ -41,8 +43,9 @@ export function serializeHistory(history) {
|
|
|
41
43
|
* 压缩核心:把历史压成摘要并原地替换(仅在有收益时)。
|
|
42
44
|
* 不含占比阈值确认、不打印结果——那些由调用方(手动/自动)决定。
|
|
43
45
|
* 被 handleCompact(/compact)与 autoCompactIfNeeded(自动)共用。
|
|
46
|
+
* 调用摘要模型前触发 PreCompact hook(仅观察,stdout 打印给用户)。
|
|
44
47
|
*/
|
|
45
|
-
async function compactHistory(ai, history, stats) {
|
|
48
|
+
async function compactHistory(ai, history, stats, options = { trigger: 'manual' }) {
|
|
46
49
|
if (history.length <= 1)
|
|
47
50
|
return { status: 'empty' };
|
|
48
51
|
const before = estimatePromptTokens(history);
|
|
@@ -51,6 +54,10 @@ async function compactHistory(ai, history, stats) {
|
|
|
51
54
|
{ role: 'system', content: SUMMARY_SYSTEM },
|
|
52
55
|
{ role: 'user', content: `请压缩以下对话历史:\n\n${convo}` },
|
|
53
56
|
];
|
|
57
|
+
// PreCompact hook:压缩前可落盘/审计,仅观察(不拦截压缩)
|
|
58
|
+
const pre = await runHooks(options.hooks, 'PreCompact', { cwd: options.cwd ?? process.cwd(), trigger: options.trigger });
|
|
59
|
+
if (pre.output)
|
|
60
|
+
console.log(pre.output);
|
|
54
61
|
console.log(style.info('正在压缩上下文…\n'));
|
|
55
62
|
let summary;
|
|
56
63
|
try {
|
|
@@ -65,9 +72,15 @@ async function compactHistory(ai, history, stats) {
|
|
|
65
72
|
return { status: 'failed', message: '模型未返回摘要' };
|
|
66
73
|
}
|
|
67
74
|
const system = history[0];
|
|
75
|
+
// 待办清单不随历史一起压掉:当前快照附在摘要后(对齐 Kimi Code 的
|
|
76
|
+
// compaction 行为),压缩后模型仍能据此继续,无需从旧调用里翻
|
|
77
|
+
const todos = getTodos();
|
|
78
|
+
const todoSection = todos.length > 0
|
|
79
|
+
? `\n\n## 当前待办\n${formatTodos(todos, false)}`
|
|
80
|
+
: '';
|
|
68
81
|
const summaryMessage = {
|
|
69
82
|
role: 'user',
|
|
70
|
-
content: `[以下是此前对话的摘要,请据此继续]\n${summary}`,
|
|
83
|
+
content: `[以下是此前对话的摘要,请据此继续]\n${summary}${todoSection}`,
|
|
71
84
|
};
|
|
72
85
|
const after = estimatePromptTokens([system, summaryMessage]);
|
|
73
86
|
// 压缩后没有更小(历史本就很短)→ 不替换,避免反而增大上下文
|
|
@@ -120,13 +133,17 @@ export async function handleCompact(ctx) {
|
|
|
120
133
|
return;
|
|
121
134
|
}
|
|
122
135
|
}
|
|
123
|
-
printCompactResult(await compactHistory(ctx.ai, ctx.history, ctx.stats
|
|
136
|
+
printCompactResult(await compactHistory(ctx.ai, ctx.history, ctx.stats, {
|
|
137
|
+
hooks: ctx.hooks,
|
|
138
|
+
cwd: ctx.cwd,
|
|
139
|
+
trigger: 'manual',
|
|
140
|
+
}));
|
|
124
141
|
}
|
|
125
142
|
/**
|
|
126
143
|
* 自动压缩:每轮对话后调用。上下文占比达到 AUTO_COMPACT_RATIO 就自动压缩,
|
|
127
144
|
* 只提示、不弹确认(保护性操作;要手动控制用 /compact)。
|
|
128
145
|
*/
|
|
129
|
-
export async function autoCompactIfNeeded(ai, history, stats) {
|
|
146
|
+
export async function autoCompactIfNeeded(ai, history, stats, options = {}) {
|
|
130
147
|
if (history.length <= 1)
|
|
131
148
|
return;
|
|
132
149
|
const tokens = estimatePromptTokens(history);
|
|
@@ -135,6 +152,10 @@ export async function autoCompactIfNeeded(ai, history, stats) {
|
|
|
135
152
|
if (ratio < AUTO_COMPACT_RATIO)
|
|
136
153
|
return;
|
|
137
154
|
console.log(style.warn(`\n⚠ 上下文已达 ${(ratio * 100).toFixed(0)}%(约 ${tokens.toLocaleString()} / ${limit.toLocaleString()} tokens),正在自动压缩…`));
|
|
138
|
-
printCompactResult(await compactHistory(ai, history, stats
|
|
155
|
+
printCompactResult(await compactHistory(ai, history, stats, {
|
|
156
|
+
hooks: options.hooks,
|
|
157
|
+
cwd: options.cwd,
|
|
158
|
+
trigger: 'auto',
|
|
159
|
+
}));
|
|
139
160
|
}
|
|
140
161
|
//# sourceMappingURL=compact.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compact.js","sourceRoot":"","sources":["../../../../src/cli/slash/system/compact.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"compact.js","sourceRoot":"","sources":["../../../../src/cli/slash/system/compact.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { runAgentTurn } from '../../run/index.js';
|
|
2
2
|
import { style } from '../../style.js';
|
|
3
3
|
import { getTool } from '../../../tools/index.js';
|
|
4
|
-
import {
|
|
4
|
+
import { resetTodos } from '../../../tools/todo.js';
|
|
5
|
+
import { buildPlan, EXECUTION_SYSTEM_PROMPT } from './agent.js';
|
|
5
6
|
/** 目标未给完成条件时,让规划阶段先补一条可检查条件。 */
|
|
6
7
|
const GOAL_PLANNING_SYSTEM_PROMPT = `你是 CCLI 的 Goal 规划助手。
|
|
7
8
|
|
|
@@ -117,45 +118,44 @@ export async function handleGoal(arg, ctx) {
|
|
|
117
118
|
console.log(done);
|
|
118
119
|
console.log(style.label('\n[Goal] 计划如下:'));
|
|
119
120
|
console.log(plan);
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
if (answer !== 'y' && answer !== 'yes') {
|
|
121
|
+
// 方向键选择确认,与 /plan、工具确认保持一致
|
|
122
|
+
const approve = await ctx.confirm('是否按此计划执行?', '批准并执行', '取消');
|
|
123
|
+
if (!approve) {
|
|
124
124
|
console.log(style.warn('[Goal] 已取消执行。'));
|
|
125
125
|
return;
|
|
126
126
|
}
|
|
127
127
|
console.log(style.label('\n[Goal] 开始执行计划...'));
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
128
|
+
// 新任务 = 新待办清单:清掉上一任务可能残留的未完成项
|
|
129
|
+
resetTodos();
|
|
130
|
+
// 执行期切换系统提示;判定也完成后(含异常)还原,避免污染后续普通对话
|
|
131
|
+
const originalSystem = ctx.history[0].content;
|
|
132
132
|
ctx.history[0].content = `${EXECUTION_SYSTEM_PROMPT}\n\n目标完成条件:${done}\n\n已批准的计划:\n${plan}`;
|
|
133
133
|
ctx.history.push({ role: 'user', content: goalContent });
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
134
|
+
try {
|
|
135
|
+
await runAgentTurn({
|
|
136
|
+
ai: ctx.ai,
|
|
137
|
+
history: ctx.history,
|
|
138
|
+
confirm: ctx.confirmChoice,
|
|
139
|
+
stats: ctx.stats,
|
|
140
|
+
maxRounds: 30,
|
|
141
|
+
requireToolsFirstRound: true,
|
|
142
|
+
continueOnPendingTodos: true,
|
|
143
|
+
hooks: ctx.hooks,
|
|
144
|
+
record: ctx.record,
|
|
145
|
+
onToolCall: (tc) => {
|
|
146
|
+
console.log(style.tool(`\n[Goal] 调用 ${tc.name}`));
|
|
147
|
+
console.log(formatToolCall(tc));
|
|
148
|
+
},
|
|
149
|
+
onToolResult: (tc, result) => {
|
|
150
|
+
console.log(style.muted(`\n[Goal] ${tc.name} 结果:`));
|
|
151
|
+
console.log(truncateResult(result.output));
|
|
152
|
+
},
|
|
153
|
+
});
|
|
154
|
+
await evaluateGoal(task, done, ctx);
|
|
155
|
+
}
|
|
156
|
+
finally {
|
|
157
|
+
ctx.history[0].content = originalSystem;
|
|
158
|
+
}
|
|
159
159
|
console.log(style.success('\n[Goal] 目标执行结束'));
|
|
160
160
|
}
|
|
161
161
|
//# sourceMappingURL=goal.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"goal.js","sourceRoot":"","sources":["../../../../src/cli/slash/system/goal.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAEvC,OAAO,EAAE,OAAO,EAAmB,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"goal.js","sourceRoot":"","sources":["../../../../src/cli/slash/system/goal.ts"],"names":[],"mappings":"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"}
|