@wukonglabs/wukong 0.0.1

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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 cnb.cool
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Wukong CLI 语义化退出码
3
+ *
4
+ * CI/CD 脚本可根据退出码精确判断任务结果:
5
+ * - 0: 成功
6
+ * - 1: 任务完成但验证失败
7
+ * - 2: 任务未完成
8
+ * - 3: LLM 调用失败
9
+ * - 4: 配置/参数错误
10
+ */
11
+ export declare const EXIT_CODES: {
12
+ /** 任务成功完成(验证通过或无需验证) */
13
+ readonly SUCCESS: 0;
14
+ /** 任务完成但验证失败(编辑已保存,但 test/lint 未通过) */
15
+ readonly VERIFY_FAILED: 1;
16
+ /** 任务未完成(达到最大步数 / Agent 放弃 / 被中止) */
17
+ readonly TASK_INCOMPLETE: 2;
18
+ /** LLM 调用失败(API 错误,重试后仍失败) */
19
+ readonly LLM_ERROR: 3;
20
+ /** 配置或参数错误(缺少 apiKey / 参数格式不对等) */
21
+ readonly CONFIG_ERROR: 4;
22
+ };
23
+ export type ExitCode = typeof EXIT_CODES[keyof typeof EXIT_CODES];
24
+ /** 退出码的人类可读描述 */
25
+ export declare const EXIT_CODE_DESCRIPTIONS: Record<ExitCode, string>;
26
+ /**
27
+ * 从 AgentResult 推断退出码
28
+ */
29
+ export declare function resolveExitCode(result: {
30
+ aborted?: boolean;
31
+ steps: number;
32
+ maxSteps?: number;
33
+ verificationPassed?: boolean | null;
34
+ }): ExitCode;
35
+ //# sourceMappingURL=exit-codes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exit-codes.d.ts","sourceRoot":"","sources":["../../src/cli/exit-codes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,eAAO,MAAM,UAAU;IACrB,wBAAwB;;IAExB,uCAAuC;;IAEvC,qCAAqC;;IAErC,8BAA8B;;IAE9B,mCAAmC;;CAE3B,CAAC;AAEX,MAAM,MAAM,QAAQ,GAAG,OAAO,UAAU,CAAC,MAAM,OAAO,UAAU,CAAC,CAAC;AAElE,iBAAiB;AACjB,eAAO,MAAM,sBAAsB,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAM3D,CAAC;AAEF;;GAEG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE;IACtC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,kBAAkB,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;CACrC,GAAG,QAAQ,CAiBX"}
@@ -0,0 +1,53 @@
1
+ "use strict";
2
+ /**
3
+ * Wukong CLI 语义化退出码
4
+ *
5
+ * CI/CD 脚本可根据退出码精确判断任务结果:
6
+ * - 0: 成功
7
+ * - 1: 任务完成但验证失败
8
+ * - 2: 任务未完成
9
+ * - 3: LLM 调用失败
10
+ * - 4: 配置/参数错误
11
+ */
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.EXIT_CODE_DESCRIPTIONS = exports.EXIT_CODES = void 0;
14
+ exports.resolveExitCode = resolveExitCode;
15
+ exports.EXIT_CODES = {
16
+ /** 任务成功完成(验证通过或无需验证) */
17
+ SUCCESS: 0,
18
+ /** 任务完成但验证失败(编辑已保存,但 test/lint 未通过) */
19
+ VERIFY_FAILED: 1,
20
+ /** 任务未完成(达到最大步数 / Agent 放弃 / 被中止) */
21
+ TASK_INCOMPLETE: 2,
22
+ /** LLM 调用失败(API 错误,重试后仍失败) */
23
+ LLM_ERROR: 3,
24
+ /** 配置或参数错误(缺少 apiKey / 参数格式不对等) */
25
+ CONFIG_ERROR: 4,
26
+ };
27
+ /** 退出码的人类可读描述 */
28
+ exports.EXIT_CODE_DESCRIPTIONS = {
29
+ [exports.EXIT_CODES.SUCCESS]: 'Task completed successfully',
30
+ [exports.EXIT_CODES.VERIFY_FAILED]: 'Task completed but verification failed',
31
+ [exports.EXIT_CODES.TASK_INCOMPLETE]: 'Task not completed (max steps reached or aborted)',
32
+ [exports.EXIT_CODES.LLM_ERROR]: 'LLM API call failed after retries',
33
+ [exports.EXIT_CODES.CONFIG_ERROR]: 'Configuration or argument error',
34
+ };
35
+ /**
36
+ * 从 AgentResult 推断退出码
37
+ */
38
+ function resolveExitCode(result) {
39
+ // LLM 错误导致中止
40
+ if (result.aborted) {
41
+ return exports.EXIT_CODES.LLM_ERROR;
42
+ }
43
+ // 达到最大步数 → 任务未完成
44
+ if (result.maxSteps && result.steps >= result.maxSteps) {
45
+ return exports.EXIT_CODES.TASK_INCOMPLETE;
46
+ }
47
+ // 有验证结果且验证失败
48
+ if (result.verificationPassed === false) {
49
+ return exports.EXIT_CODES.VERIFY_FAILED;
50
+ }
51
+ return exports.EXIT_CODES.SUCCESS;
52
+ }
53
+ //# sourceMappingURL=exit-codes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exit-codes.js","sourceRoot":"","sources":["../../src/cli/exit-codes.ts"],"names":[],"mappings":";AAAA;;;;;;;;;GASG;;;AA6BH,0CAsBC;AAjDY,QAAA,UAAU,GAAG;IACxB,wBAAwB;IACxB,OAAO,EAAE,CAAC;IACV,uCAAuC;IACvC,aAAa,EAAE,CAAC;IAChB,qCAAqC;IACrC,eAAe,EAAE,CAAC;IAClB,8BAA8B;IAC9B,SAAS,EAAE,CAAC;IACZ,mCAAmC;IACnC,YAAY,EAAE,CAAC;CACP,CAAC;AAIX,iBAAiB;AACJ,QAAA,sBAAsB,GAA6B;IAC9D,CAAC,kBAAU,CAAC,OAAO,CAAC,EAAE,6BAA6B;IACnD,CAAC,kBAAU,CAAC,aAAa,CAAC,EAAE,wCAAwC;IACpE,CAAC,kBAAU,CAAC,eAAe,CAAC,EAAE,mDAAmD;IACjF,CAAC,kBAAU,CAAC,SAAS,CAAC,EAAE,mCAAmC;IAC3D,CAAC,kBAAU,CAAC,YAAY,CAAC,EAAE,iCAAiC;CAC7D,CAAC;AAEF;;GAEG;AACH,SAAgB,eAAe,CAAC,MAK/B;IACC,aAAa;IACb,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACnB,OAAO,kBAAU,CAAC,SAAS,CAAC;IAC9B,CAAC;IAED,iBAAiB;IACjB,IAAI,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QACvD,OAAO,kBAAU,CAAC,eAAe,CAAC;IACpC,CAAC;IAED,aAAa;IACb,IAAI,MAAM,CAAC,kBAAkB,KAAK,KAAK,EAAE,CAAC;QACxC,OAAO,kBAAU,CAAC,aAAa,CAAC;IAClC,CAAC;IAED,OAAO,kBAAU,CAAC,OAAO,CAAC;AAC5B,CAAC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Wukong CLI 帮助文本
3
+ *
4
+ * 提供 --help 和 --version 的格式化输出
5
+ */
6
+ export declare const VERSION = "1.0.0";
7
+ export declare const HELP_TEXT: string;
8
+ /**
9
+ * 格式化版本字符串
10
+ */
11
+ export declare function formatVersion(): string;
12
+ //# sourceMappingURL=help.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"help.d.ts","sourceRoot":"","sources":["../../src/cli/help.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,eAAO,MAAM,OAAO,UAAU,CAAC;AAE/B,eAAO,MAAM,SAAS,QA0Ed,CAAC;AAET;;GAEG;AACH,wBAAgB,aAAa,IAAI,MAAM,CAEtC"}
@@ -0,0 +1,93 @@
1
+ "use strict";
2
+ /**
3
+ * Wukong CLI 帮助文本
4
+ *
5
+ * 提供 --help 和 --version 的格式化输出
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.HELP_TEXT = exports.VERSION = void 0;
9
+ exports.formatVersion = formatVersion;
10
+ // 从 package.json 中读取版本号在编译时不可靠,硬编码并在发布时更新
11
+ exports.VERSION = '1.0.0';
12
+ exports.HELP_TEXT = `
13
+ Wukong (悟空) — CI-First AI Agent CLI
14
+ ================================
15
+
16
+ 用法:
17
+ wukong agent -m "你的任务描述" [选项] 一次性执行模式
18
+ wukong [选项] 交互式模式
19
+
20
+ 命令:
21
+ agent 一次性执行模式(CI/CD 推荐)
22
+ (无命令) 进入交互式对话模式
23
+
24
+ 核心选项:
25
+ -m, --message <text> 任务描述(agent 模式必填)
26
+ -sp, --system-prompt <text> 自定义 system prompt
27
+ -s, --session-id <id> 会话 ID(默认: cli:local)
28
+ --json JSON 格式输出(CI 推荐)
29
+ --trace JSON 输出中包含详细 trace(默认省略)
30
+ -y, --yes 跳过所有确认(CI 推荐)
31
+ --test 发送测试消息验证连接
32
+
33
+ 规划与验证:
34
+ --plan <mode> 规划模式: auto(默认) | always | none
35
+ --verify [command] 启用自动验证(可指定验证命令)
36
+ --no-verify 禁用自动验证
37
+
38
+ 性能调优:
39
+ --max-steps <number> 最大执行步数(默认 100)
40
+ --context-window <number> 上下文窗口大小 token 数(默认 128000)
41
+ --no-smart-context 禁用 Smart Context(不自动注入相关文件摘要)
42
+
43
+ 思考模式:
44
+ --think 启用扩展思考模式
45
+ --think-budget <tokens> 思考 token 预算(最小 1024)
46
+
47
+ 编辑确认:
48
+ --confirm <mode> 确认模式: always | smart(默认) | never
49
+ -y, --yes 等同 --confirm never
50
+
51
+ 工具权限(安全相关):
52
+ --profile <name> 工具权限 profile(覆盖 wukong.json 的 tools.profile)
53
+ 可选值: minimal | chat | coding(默认) | messaging | full
54
+ chat → 只读工具集(read/list/grep/search/git/skills)
55
+ 无 exec_command/write_file/web_fetch,适合对话模式,
56
+ 防止被社工诱导发 curl 外发敏感信息
57
+ coding → 完整开发权限(默认)
58
+ --allow-tools <a,b,c> 在 profile 基础上额外放行的工具(逗号分隔)
59
+ --deny-tools <a,b,c> 强制拒绝的工具(优先级最高,逗号分隔)
60
+
61
+ 多模态:
62
+ --images <path...> 附带图片文件路径
63
+
64
+ 其他:
65
+ --help, -h 显示此帮助信息
66
+ --version, -v 显示版本号
67
+
68
+ 退出码:
69
+ 0 任务成功完成(验证通过)
70
+ 1 任务完成但验证失败
71
+ 2 任务未完成(达到最大步数)
72
+ 3 LLM 调用失败
73
+ 4 配置/参数错误
74
+
75
+ CI/CD 推荐用法:
76
+ wukong agent -m "修复 lint 错误" --yes --json --verify
77
+ wukong agent -m "重构 UserService" --plan always --verify --json --yes
78
+ wukong agent -m "添加缓存功能" --verify "pnpm test && pnpm lint" --json --yes
79
+ wukong agent -m "大型重构" --max-steps 200 --json --yes
80
+
81
+ 配置文件:
82
+ wukong.json 项目根目录的配置文件
83
+
84
+ 文档:
85
+ https://cnb.cool/npc/wukong
86
+ `.trim();
87
+ /**
88
+ * 格式化版本字符串
89
+ */
90
+ function formatVersion() {
91
+ return `wukong v${exports.VERSION}`;
92
+ }
93
+ //# sourceMappingURL=help.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"help.js","sourceRoot":"","sources":["../../src/cli/help.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;AAoFH,sCAEC;AApFD,0CAA0C;AAC7B,QAAA,OAAO,GAAG,OAAO,CAAC;AAElB,QAAA,SAAS,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA0ExB,CAAC,IAAI,EAAE,CAAC;AAET;;GAEG;AACH,SAAgB,aAAa;IAC3B,OAAO,WAAW,eAAO,EAAE,CAAC;AAC9B,CAAC"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * 智能摘要提取
3
+ *
4
+ * 从 Agent 回复中提取一句话摘要用于 JSON 输出,
5
+ * 比硬编码的 "完成,N 步,M tokens" 更有意义。
6
+ */
7
+ /**
8
+ * 从 Agent 回复文本中提取摘要
9
+ *
10
+ * 策略:
11
+ * 1. 查找 "总结" / "完成" / "Summary" 后面的第一句话
12
+ * 2. 查找带有 ✅ / ✓ / 完成 等标记的句子
13
+ * 3. 取回复的前 120 个字符作为 fallback
14
+ */
15
+ export declare function extractSummary(agentResponse: string, fallback: string): string;
16
+ /**
17
+ * 构建标准化的 JSON 输出摘要
18
+ *
19
+ * 结合 Agent 回复摘要 + 统计信息
20
+ */
21
+ export declare function buildJsonSummary(agentResponse: string, stats: {
22
+ steps: number;
23
+ totalTokens: number;
24
+ }): string;
25
+ //# sourceMappingURL=summary.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"summary.d.ts","sourceRoot":"","sources":["../../src/cli/summary.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAC5B,aAAa,EAAE,MAAM,EACrB,QAAQ,EAAE,MAAM,GACf,MAAM,CA6CR;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAC9B,aAAa,EAAE,MAAM,EACrB,KAAK,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,GAC5C,MAAM,CAQR"}
@@ -0,0 +1,72 @@
1
+ "use strict";
2
+ /**
3
+ * 智能摘要提取
4
+ *
5
+ * 从 Agent 回复中提取一句话摘要用于 JSON 输出,
6
+ * 比硬编码的 "完成,N 步,M tokens" 更有意义。
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.extractSummary = extractSummary;
10
+ exports.buildJsonSummary = buildJsonSummary;
11
+ /**
12
+ * 从 Agent 回复文本中提取摘要
13
+ *
14
+ * 策略:
15
+ * 1. 查找 "总结" / "完成" / "Summary" 后面的第一句话
16
+ * 2. 查找带有 ✅ / ✓ / 完成 等标记的句子
17
+ * 3. 取回复的前 120 个字符作为 fallback
18
+ */
19
+ function extractSummary(agentResponse, fallback) {
20
+ if (!agentResponse || agentResponse.length === 0) {
21
+ return fallback;
22
+ }
23
+ // 清理 markdown 标记
24
+ const cleaned = agentResponse
25
+ .replace(/```[\s\S]*?```/g, '') // 移除代码块
26
+ .replace(/\|[\s\S]*?\|/g, '') // 移除表格
27
+ .replace(/#{1,6}\s*/g, '') // 移除标题标记
28
+ .replace(/[*_~`]/g, '') // 移除加粗/斜体等
29
+ .trim();
30
+ // 策略 1:查找总结性段落
31
+ const summaryPatterns = [
32
+ /(?:总结|总的来说|综上|概括|完成|Done|Summary)[::]\s*(.+?)(?:\n|$)/i,
33
+ /(?:✅|✓)\s*(.+?)(?:\n|$)/,
34
+ /(?:已完成|已成功|成功完成)[::]?\s*(.+?)(?:\n|$)/,
35
+ ];
36
+ for (const pattern of summaryPatterns) {
37
+ const match = cleaned.match(pattern);
38
+ if (match && match[1]) {
39
+ const candidate = match[1].trim();
40
+ if (candidate.length >= 5 && candidate.length <= 200) {
41
+ return candidate;
42
+ }
43
+ }
44
+ }
45
+ // 策略 2:取第一个有意义的句子
46
+ const sentences = cleaned.split(/[。\n]/).filter(s => s.trim().length > 5);
47
+ if (sentences.length > 0) {
48
+ const first = sentences[0].trim();
49
+ if (first.length <= 200) {
50
+ return first;
51
+ }
52
+ return first.slice(0, 197) + '...';
53
+ }
54
+ // 策略 3:截取开头
55
+ if (cleaned.length <= 200) {
56
+ return cleaned;
57
+ }
58
+ return cleaned.slice(0, 197) + '...';
59
+ }
60
+ /**
61
+ * 构建标准化的 JSON 输出摘要
62
+ *
63
+ * 结合 Agent 回复摘要 + 统计信息
64
+ */
65
+ function buildJsonSummary(agentResponse, stats) {
66
+ const responseSummary = extractSummary(agentResponse, '');
67
+ if (responseSummary) {
68
+ return `${responseSummary} (${stats.steps} 步, ${stats.totalTokens} tokens)`;
69
+ }
70
+ return `完成,${stats.steps} 步,${stats.totalTokens} tokens`;
71
+ }
72
+ //# sourceMappingURL=summary.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"summary.js","sourceRoot":"","sources":["../../src/cli/summary.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;AAUH,wCAgDC;AAOD,4CAWC;AA1ED;;;;;;;GAOG;AACH,SAAgB,cAAc,CAC5B,aAAqB,EACrB,QAAgB;IAEhB,IAAI,CAAC,aAAa,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACjD,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,iBAAiB;IACjB,MAAM,OAAO,GAAG,aAAa;SAC1B,OAAO,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAAE,QAAQ;SACxC,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC,CAAI,OAAO;SACvC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAO,SAAS;SACzC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAU,WAAW;SAC3C,IAAI,EAAE,CAAC;IAEV,eAAe;IACf,MAAM,eAAe,GAAG;QACtB,wDAAwD;QACxD,yBAAyB;QACzB,uCAAuC;KACxC,CAAC;IAEF,KAAK,MAAM,OAAO,IAAI,eAAe,EAAE,CAAC;QACtC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACrC,IAAI,KAAK,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;YACtB,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YAClC,IAAI,SAAS,CAAC,MAAM,IAAI,CAAC,IAAI,SAAS,CAAC,MAAM,IAAI,GAAG,EAAE,CAAC;gBACrD,OAAO,SAAS,CAAC;YACnB,CAAC;QACH,CAAC;IACH,CAAC;IAED,kBAAkB;IAClB,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC1E,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACzB,MAAM,KAAK,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAClC,IAAI,KAAK,CAAC,MAAM,IAAI,GAAG,EAAE,CAAC;YACxB,OAAO,KAAK,CAAC;QACf,CAAC;QACD,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,KAAK,CAAC;IACrC,CAAC;IAED,YAAY;IACZ,IAAI,OAAO,CAAC,MAAM,IAAI,GAAG,EAAE,CAAC;QAC1B,OAAO,OAAO,CAAC;IACjB,CAAC;IACD,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,KAAK,CAAC;AACvC,CAAC;AAED;;;;GAIG;AACH,SAAgB,gBAAgB,CAC9B,aAAqB,EACrB,KAA6C;IAE7C,MAAM,eAAe,GAAG,cAAc,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC;IAE1D,IAAI,eAAe,EAAE,CAAC;QACpB,OAAO,GAAG,eAAe,KAAK,KAAK,CAAC,KAAK,OAAO,KAAK,CAAC,WAAW,UAAU,CAAC;IAC9E,CAAC;IAED,OAAO,MAAM,KAAK,CAAC,KAAK,MAAM,KAAK,CAAC,WAAW,SAAS,CAAC;AAC3D,CAAC"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js ADDED
@@ -0,0 +1,768 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
4
+ if (k2 === undefined) k2 = k;
5
+ var desc = Object.getOwnPropertyDescriptor(m, k);
6
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
7
+ desc = { enumerable: true, get: function() { return m[k]; } };
8
+ }
9
+ Object.defineProperty(o, k2, desc);
10
+ }) : (function(o, m, k, k2) {
11
+ if (k2 === undefined) k2 = k;
12
+ o[k2] = m[k];
13
+ }));
14
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
15
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
16
+ }) : function(o, v) {
17
+ o["default"] = v;
18
+ });
19
+ var __importStar = (this && this.__importStar) || (function () {
20
+ var ownKeys = function(o) {
21
+ ownKeys = Object.getOwnPropertyNames || function (o) {
22
+ var ar = [];
23
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
24
+ return ar;
25
+ };
26
+ return ownKeys(o);
27
+ };
28
+ return function (mod) {
29
+ if (mod && mod.__esModule) return mod;
30
+ var result = {};
31
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
32
+ __setModuleDefault(result, mod);
33
+ return result;
34
+ };
35
+ })();
36
+ Object.defineProperty(exports, "__esModule", { value: true });
37
+ const readline = __importStar(require("node:readline"));
38
+ // ── 核心能力全部来自独立发布的 SDK 包 ──
39
+ // CLI 只做参数解析、会话编排与输出渲染,组装逻辑(createAgent)在 SDK 内。
40
+ const wukong_agent_sdk_1 = require("@wukonglabs/wukong-agent-sdk");
41
+ // ── CLI 本地模块(不属于 SDK 对外能力) ──
42
+ const exit_codes_js_1 = require("./cli/exit-codes.js");
43
+ const help_js_1 = require("./cli/help.js");
44
+ const summary_js_1 = require("./cli/summary.js");
45
+ /**
46
+ * 为 CI 环境自动生成唯一 session ID
47
+ *
48
+ * 消除并发 CI job 互相污染的风险。
49
+ * 按优先级从 CI 环境变量中提取 branch/commit/jobId,
50
+ * 组合为 `ci:<branch>:<commit>:<jobId>` 格式。
51
+ */
52
+ function generateCiSessionId() {
53
+ const branch = process.env.CI_COMMIT_BRANCH
54
+ || process.env.GITHUB_HEAD_REF
55
+ || process.env.GITHUB_REF_NAME
56
+ || process.env.BRANCH_NAME
57
+ || 'unknown';
58
+ const commit = (process.env.CI_COMMIT_SHA
59
+ || process.env.GITHUB_SHA
60
+ || process.env.GIT_COMMIT
61
+ || '').substring(0, 8) || 'nocommit';
62
+ const jobId = process.env.CI_JOB_ID
63
+ || process.env.GITHUB_RUN_ID
64
+ || process.env.BUILD_NUMBER
65
+ || Date.now().toString(36);
66
+ return `ci:${branch}:${commit}:${jobId}`;
67
+ }
68
+ function parseArgs(argv) {
69
+ const args = argv.slice(2);
70
+ const result = {
71
+ command: null,
72
+ message: null,
73
+ systemPrompt: null,
74
+ sessionId: "cli:local",
75
+ sessionIdExplicit: false,
76
+ json: false,
77
+ test: false,
78
+ images: [],
79
+ yes: false,
80
+ confirmMode: null,
81
+ think: false,
82
+ thinkBudget: null,
83
+ planMode: 'auto',
84
+ verify: false,
85
+ verifyCommand: null,
86
+ noVerify: false,
87
+ help: false,
88
+ version: false,
89
+ trace: false,
90
+ maxSteps: null,
91
+ contextWindow: null,
92
+ noSmartContext: false,
93
+ ephemeral: false,
94
+ verifyTimeout: null,
95
+ profile: null,
96
+ allowTools: [],
97
+ denyTools: [],
98
+ };
99
+ let i = 0;
100
+ while (i < args.length) {
101
+ const arg = args[i];
102
+ if (!arg.startsWith("-") && !result.command) {
103
+ result.command = arg;
104
+ i++;
105
+ continue;
106
+ }
107
+ switch (arg) {
108
+ case "--message":
109
+ case "-m":
110
+ result.message = args[++i] ?? null;
111
+ break;
112
+ case "--system-prompt":
113
+ case "-sp":
114
+ result.systemPrompt = args[++i] ?? null;
115
+ break;
116
+ case "--session-id":
117
+ case "-s":
118
+ result.sessionId = args[++i] ?? "cli:local";
119
+ result.sessionIdExplicit = true;
120
+ break;
121
+ case "--json":
122
+ result.json = true;
123
+ break;
124
+ case "--test":
125
+ result.test = true;
126
+ break;
127
+ case "--yes":
128
+ case "-y":
129
+ result.yes = true;
130
+ break;
131
+ case "--confirm":
132
+ {
133
+ const mode = args[++i];
134
+ if (mode === 'always' || mode === 'smart' || mode === 'never') {
135
+ result.confirmMode = mode;
136
+ }
137
+ }
138
+ break;
139
+ case "--images":
140
+ while (i + 1 < args.length && !args[i + 1].startsWith("--")) {
141
+ result.images.push(args[++i]);
142
+ }
143
+ break;
144
+ case "--think":
145
+ result.think = true;
146
+ break;
147
+ case "--think-budget":
148
+ {
149
+ const budget = parseInt(args[++i], 10);
150
+ if (!isNaN(budget) && budget >= 1024) {
151
+ result.thinkBudget = budget;
152
+ result.think = true; // --think-budget 隐含 --think
153
+ }
154
+ }
155
+ break;
156
+ case "--plan":
157
+ {
158
+ const mode = args[i + 1];
159
+ if (mode === 'auto' || mode === 'always' || mode === 'none') {
160
+ result.planMode = mode;
161
+ i++;
162
+ }
163
+ else {
164
+ result.planMode = 'always'; // --plan without value means always
165
+ }
166
+ }
167
+ break;
168
+ case "--verify":
169
+ {
170
+ const nextArg = args[i + 1];
171
+ if (nextArg && !nextArg.startsWith('--')) {
172
+ result.verify = true;
173
+ result.verifyCommand = nextArg;
174
+ i++;
175
+ }
176
+ else {
177
+ result.verify = true;
178
+ }
179
+ }
180
+ break;
181
+ case "--no-verify":
182
+ result.noVerify = true;
183
+ break;
184
+ case "--help":
185
+ case "-h":
186
+ result.help = true;
187
+ break;
188
+ case "--version":
189
+ case "-v":
190
+ result.version = true;
191
+ break;
192
+ case "--trace":
193
+ result.trace = true;
194
+ break;
195
+ case "--max-steps":
196
+ {
197
+ const val = parseInt(args[++i], 10);
198
+ if (!isNaN(val) && val >= 1) {
199
+ result.maxSteps = val;
200
+ }
201
+ }
202
+ break;
203
+ case "--context-window":
204
+ {
205
+ const val = parseInt(args[++i], 10);
206
+ if (!isNaN(val) && val >= 1024) {
207
+ result.contextWindow = val;
208
+ }
209
+ }
210
+ break;
211
+ case "--no-smart-context":
212
+ result.noSmartContext = true;
213
+ break;
214
+ case "--ephemeral":
215
+ result.ephemeral = true;
216
+ break;
217
+ case "--verify-timeout":
218
+ {
219
+ const val = parseInt(args[++i], 10);
220
+ if (!isNaN(val) && val >= 1000) {
221
+ result.verifyTimeout = val;
222
+ }
223
+ }
224
+ break;
225
+ case "--profile":
226
+ {
227
+ const val = args[++i];
228
+ if (val === 'minimal' || val === 'chat' || val === 'coding' || val === 'messaging' || val === 'full') {
229
+ result.profile = val;
230
+ }
231
+ // 非法值静默忽略(保持与其它参数一致),回退到 cfg.tools.profile
232
+ }
233
+ break;
234
+ case "--allow-tools":
235
+ {
236
+ const val = args[++i];
237
+ if (val) {
238
+ result.allowTools = val.split(',').map(s => s.trim()).filter(Boolean);
239
+ }
240
+ }
241
+ break;
242
+ case "--deny-tools":
243
+ {
244
+ const val = args[++i];
245
+ if (val) {
246
+ result.denyTools = val.split(',').map(s => s.trim()).filter(Boolean);
247
+ }
248
+ }
249
+ break;
250
+ default:
251
+ break;
252
+ }
253
+ i++;
254
+ }
255
+ return result;
256
+ }
257
+ async function initAgent(cfg, logger, confirmMode, thinking, ciMode = false, planMode = 'auto', overrides, onStream) {
258
+ // 组装逻辑已下沉到 core 的 createAgent facade(SDK 与 CLI 共享唯一事实源)。
259
+ // 此处保持原有函数签名不变,仅做参数打包转发。
260
+ return (0, wukong_agent_sdk_1.createAgent)({
261
+ config: cfg,
262
+ logger,
263
+ confirmMode,
264
+ thinking,
265
+ ciMode,
266
+ planMode,
267
+ overrides,
268
+ onStream,
269
+ });
270
+ }
271
+ async function runAgentCommand(cliArgs) {
272
+ const logger = new wukong_agent_sdk_1.Logger({ jsonMode: cliArgs.json });
273
+ (0, wukong_agent_sdk_1.setGlobalLogger)(logger);
274
+ const cfg = await (0, wukong_agent_sdk_1.loadConfig)();
275
+ applyPermissionOverrides(cfg, cliArgs, logger);
276
+ const resolvedConfirmMode = cliArgs.yes ? 'never' : (cliArgs.confirmMode ?? cfg.tools.confirmMode ?? 'smart');
277
+ const resolvedThinking = resolveThinking(cliArgs, cfg);
278
+ // CI 模式:--yes 或 --json 时自动启用
279
+ const isCiMode = cliArgs.yes || cliArgs.json;
280
+ // ── CI Session 隔离 ──
281
+ // CI 模式下,若用户未显式指定 session ID,自动生成唯一 ID 避免并发污染
282
+ const effectiveSessionId = cliArgs.sessionIdExplicit
283
+ ? cliArgs.sessionId
284
+ : (isCiMode ? generateCiSessionId() : cliArgs.sessionId);
285
+ const isEphemeral = cliArgs.ephemeral || isCiMode;
286
+ // ── 流式输出回调 ──
287
+ // JSON 模式下也使用流式请求(LLM 传输层),只是不输出到 stdout
288
+ // 这样可以兼容仅支持流式的 API 端点(如 ai-ide/v2)
289
+ let streamingContent = '';
290
+ let streamStarted = false;
291
+ const onStream = cliArgs.json
292
+ ? (_event) => { }
293
+ : (event) => {
294
+ switch (event.type) {
295
+ case 'content_delta':
296
+ if (event.content) {
297
+ if (!streamStarted) {
298
+ streamStarted = true;
299
+ process.stdout.write('\nWukong: ');
300
+ }
301
+ process.stdout.write(event.content);
302
+ streamingContent += event.content;
303
+ }
304
+ break;
305
+ case 'thinking_delta':
306
+ // 思考过程不实时展示(太冗长)
307
+ break;
308
+ case 'done':
309
+ if (streamStarted) {
310
+ process.stdout.write('\n');
311
+ }
312
+ break;
313
+ case 'error':
314
+ if (event.error) {
315
+ process.stderr.write(`\n❌ 流式错误: ${event.error}\n`);
316
+ }
317
+ break;
318
+ }
319
+ };
320
+ const { llm, contextBuilder, agent, effectiveMaxSteps, resolvedModel } = await initAgent(cfg, logger, resolvedConfirmMode, resolvedThinking, isCiMode, cliArgs.planMode, {
321
+ maxSteps: cliArgs.maxSteps,
322
+ contextWindow: cliArgs.contextWindow,
323
+ }, onStream);
324
+ const sessionManager = new wukong_agent_sdk_1.SessionManager(cfg.sessions.dir);
325
+ const session = await sessionManager.getOrCreate(effectiveSessionId);
326
+ const userMessage = cliArgs.message;
327
+ if (!userMessage) {
328
+ if (cliArgs.json) {
329
+ const errResp = {
330
+ version: 2,
331
+ runId: "",
332
+ status: "error",
333
+ exitCode: exit_codes_js_1.EXIT_CODES.CONFIG_ERROR,
334
+ summary: "缺少 --message 参数",
335
+ result: { payloads: [] },
336
+ };
337
+ process.stdout.write(JSON.stringify(errResp));
338
+ }
339
+ else {
340
+ logger.error("❌ 缺少 --message 参数。用法: wukong agent --message \"你的消息\"");
341
+ }
342
+ process.exit(exit_codes_js_1.EXIT_CODES.CONFIG_ERROR);
343
+ }
344
+ logger.info(`📡 LLM: ${resolvedModel}`);
345
+ logger.info(`📂 会话: ${effectiveSessionId} (${session.recordCount} 条记录)${isEphemeral ? ' [ephemeral]' : ''}`);
346
+ try {
347
+ let userContent;
348
+ if (cliArgs.images.length > 0) {
349
+ logger.info(`🖼️ 收到 ${cliArgs.images.length} 张图片,直接透传给主模型`);
350
+ const parts = [
351
+ { type: 'text', text: userMessage },
352
+ ...cliArgs.images.map((img) => ({
353
+ type: 'image_url',
354
+ image_url: { url: img, detail: 'auto' },
355
+ })),
356
+ ];
357
+ userContent = parts;
358
+ }
359
+ else {
360
+ userContent = userMessage;
361
+ }
362
+ // ── Smart Context 收集 ──
363
+ let smartContextText;
364
+ if (!cliArgs.noSmartContext && userMessage) {
365
+ try {
366
+ const sc = await (0, wukong_agent_sdk_1.collectSmartContext)(userMessage, process.cwd());
367
+ if (sc.contextText && sc.files.length > 0) {
368
+ smartContextText = sc.contextText;
369
+ logger.info(`📂 Smart Context: 注入 ${sc.files.length} 个相关文件摘要 (~${sc.estimatedTokens} token)`);
370
+ }
371
+ }
372
+ catch {
373
+ // Smart Context 失败不影响主流程
374
+ }
375
+ }
376
+ const messages = contextBuilder.build(session, userContent, cliArgs.systemPrompt ?? undefined, smartContextText);
377
+ const result = await agent.runWithMessages(messages);
378
+ await session.appendMessages([
379
+ { role: "user", content: userContent },
380
+ ...result.newMessages,
381
+ ]);
382
+ const allMessages = contextBuilder.build(session, "");
383
+ await (0, wukong_agent_sdk_1.compactIfNeeded)(session, allMessages, llm, cfg.sessions.compaction);
384
+ // ── 自动验证 ──
385
+ let verification;
386
+ const agentVerifyCfg = cfg.agent.verify;
387
+ const shouldVerify = !cliArgs.noVerify && (cliArgs.verify || agentVerifyCfg?.enabled);
388
+ if (shouldVerify && !result.aborted) {
389
+ const verifyConfig = {
390
+ ...wukong_agent_sdk_1.DEFAULT_VERIFY_CONFIG,
391
+ ...(agentVerifyCfg ?? {}),
392
+ enabled: true,
393
+ // CLI 参数覆盖:验证超时
394
+ ...(cliArgs.verifyTimeout ? { timeout: cliArgs.verifyTimeout } : {}),
395
+ // CI 模式下默认包含 build 命令
396
+ includeBuild: isCiMode,
397
+ };
398
+ const verifier = new wukong_agent_sdk_1.AutoVerifier(verifyConfig, logger);
399
+ verification = await verifier.verifyAndFix(process.cwd(), async (fixPrompt) => {
400
+ // 让 Agent 执行修复
401
+ const fixMessages = contextBuilder.build(session, fixPrompt);
402
+ const fixResult = await agent.runWithMessages(fixMessages);
403
+ // 保存修复的 messages
404
+ await session.appendMessages([
405
+ { role: "user", content: fixPrompt },
406
+ ...fixResult.newMessages,
407
+ ]);
408
+ }, cliArgs.verifyCommand ?? undefined);
409
+ }
410
+ // ── 计算退出码 ──
411
+ const exitCode = (0, exit_codes_js_1.resolveExitCode)({
412
+ aborted: result.aborted,
413
+ steps: result.steps,
414
+ maxSteps: effectiveMaxSteps,
415
+ verificationPassed: verification?.ran ? verification.allPassed : null,
416
+ });
417
+ if (cliArgs.json) {
418
+ const jsonTrace = result.trace
419
+ .filter(s => (s.toolResults && s.toolResults.length > 0) || s.thinkingContent)
420
+ .map(s => ({
421
+ step: s.step,
422
+ ...(s.thinkingContent ? { thinking: s.thinkingContent.slice(0, 1000) } : {}),
423
+ toolCalls: (s.toolResults ?? []).map(r => ({
424
+ name: r.toolName,
425
+ params: r.params,
426
+ success: r.success,
427
+ output: (r.result || '').slice(0, 500),
428
+ })),
429
+ }));
430
+ // 从 trace 中提取修改的文件列表
431
+ const filesModified = extractModifiedFiles(result.trace);
432
+ // 推断 status
433
+ const status = result.aborted ? 'error'
434
+ : exitCode === exit_codes_js_1.EXIT_CODES.TASK_INCOMPLETE ? 'incomplete'
435
+ : exitCode === exit_codes_js_1.EXIT_CODES.VERIFY_FAILED ? 'verify_failed'
436
+ : 'success';
437
+ const metrics = result.metrics;
438
+ const durationMs = metrics?.durationMs ?? 0;
439
+ const resp = {
440
+ version: 2,
441
+ runId: `run_${Date.now()}`,
442
+ status,
443
+ exitCode,
444
+ summary: (0, summary_js_1.buildJsonSummary)(result.response, {
445
+ steps: result.steps,
446
+ totalTokens: result.totalTokens.prompt + result.totalTokens.completion,
447
+ }),
448
+ ...(filesModified.length > 0 ? { filesModified } : {}),
449
+ result: {
450
+ payloads: [{ text: result.response }],
451
+ },
452
+ ...(verification?.ran ? {
453
+ verification: {
454
+ ran: true,
455
+ strategies: verification.results.map(r => ({
456
+ command: r.command,
457
+ passed: r.passed,
458
+ duration: `${(r.durationMs / 1000).toFixed(1)}s`,
459
+ fixAttempted: r.fixAttempted,
460
+ ...(r.fixSucceeded !== undefined ? { fixSucceeded: r.fixSucceeded } : {}),
461
+ })),
462
+ allPassed: verification.allPassed,
463
+ fixAttempts: verification.fixAttempts,
464
+ },
465
+ } : {}),
466
+ ...(result.plan ? {
467
+ plan: {
468
+ complexity: result.plan.complexity,
469
+ goal: result.plan.goal,
470
+ stepsCount: result.plan.steps.length,
471
+ },
472
+ } : {}),
473
+ ...(metrics ? {
474
+ metrics: {
475
+ steps: metrics.steps,
476
+ totalTokens: metrics.totalTokens,
477
+ toolCalls: metrics.toolCalls,
478
+ toolFailures: metrics.toolFailures,
479
+ llmRetries: metrics.llmRetries,
480
+ durationMs,
481
+ duration: `${(durationMs / 1000).toFixed(1)}s`,
482
+ },
483
+ } : {}),
484
+ ...(cliArgs.trace ? { trace: jsonTrace } : {}),
485
+ };
486
+ process.stdout.write(JSON.stringify(resp));
487
+ }
488
+ else {
489
+ // ── 非 JSON 模式输出 ──
490
+ // 如果已经流式输出了,不需要再重复打印
491
+ if (!streamStarted) {
492
+ logger.info(`\nWukong: ${result.response}`);
493
+ }
494
+ // 显示规划信息
495
+ if (result.plan) {
496
+ logger.info(`\n📋 规划: ${result.plan.complexity} 复杂度, ${result.plan.steps.length} 步骤`);
497
+ }
498
+ // 显示验证结果
499
+ if (verification?.ran) {
500
+ logger.info('');
501
+ if (verification.allPassed) {
502
+ logger.info(`✅ 验证通过 (${verification.results.length} 条命令)`);
503
+ }
504
+ else {
505
+ const failCount = verification.results.filter(r => !r.passed).length;
506
+ logger.warn(`⚠️ 验证: ${failCount}/${verification.results.length} 条失败`);
507
+ }
508
+ for (const r of verification.results) {
509
+ const icon = r.passed ? ' ✅' : ' ❌';
510
+ const fix = r.fixAttempted ? (r.fixSucceeded ? ' (自修复成功)' : ' (自修复失败)') : '';
511
+ logger.info(`${icon} ${r.command} (${(r.durationMs / 1000).toFixed(1)}s)${fix}`);
512
+ }
513
+ if (verification.fixAttempts > 0) {
514
+ logger.info(` 🔧 自动修复尝试: ${verification.fixAttempts} 次`);
515
+ }
516
+ }
517
+ const metrics = result.metrics;
518
+ if (metrics) {
519
+ const totalTok = metrics.totalTokens.prompt + metrics.totalTokens.completion;
520
+ const avgPerStep = metrics.steps > 0 ? Math.round(totalTok / metrics.steps) : 0;
521
+ logger.info(`\n [步骤: ${metrics.steps} | Token: ${totalTok} ` +
522
+ `(prompt=${metrics.totalTokens.prompt}, completion=${metrics.totalTokens.completion}, avg/step=${avgPerStep}) ` +
523
+ `| 耗时: ${(metrics.durationMs / 1000).toFixed(1)}s` +
524
+ (metrics.llmRetries > 0 ? ` | 重试: ${metrics.llmRetries}` : '') +
525
+ (metrics.toolFailures > 0 ? ` | 工具失败: ${metrics.toolFailures}` : '') +
526
+ `]`);
527
+ }
528
+ else {
529
+ const totalTok = result.totalTokens.prompt + result.totalTokens.completion;
530
+ logger.info(`\n [步骤: ${result.steps} | Token: ${totalTok} ` +
531
+ `(prompt=${result.totalTokens.prompt}, completion=${result.totalTokens.completion})]`);
532
+ }
533
+ }
534
+ // ── Ephemeral 清理:CI 模式执行完毕后清除 session 数据 ──
535
+ if (isEphemeral) {
536
+ try {
537
+ await session.clear();
538
+ logger.info(`🗑️ Ephemeral session 已清理: ${effectiveSessionId}`);
539
+ }
540
+ catch {
541
+ // 清理失败不影响退出码
542
+ }
543
+ }
544
+ process.exit(exitCode);
545
+ }
546
+ catch (error) {
547
+ if (cliArgs.json) {
548
+ const errResp = {
549
+ version: 2,
550
+ runId: `run_${Date.now()}`,
551
+ status: "error",
552
+ exitCode: exit_codes_js_1.EXIT_CODES.LLM_ERROR,
553
+ summary: error instanceof Error ? error.message : String(error),
554
+ result: { payloads: [] },
555
+ };
556
+ process.stdout.write(JSON.stringify(errResp));
557
+ }
558
+ else {
559
+ logger.error("❌ Agent 执行出错:", error);
560
+ }
561
+ process.exit(exit_codes_js_1.EXIT_CODES.LLM_ERROR);
562
+ }
563
+ }
564
+ /** 从 trace 中提取被修改的文件路径 */
565
+ function extractModifiedFiles(trace) {
566
+ const files = new Set();
567
+ for (const step of trace) {
568
+ if (!step.toolResults)
569
+ continue;
570
+ for (const r of step.toolResults) {
571
+ if (!r.success)
572
+ continue;
573
+ if (r.toolName === 'edit_file' || r.toolName === 'write_file' || r.toolName === 'multi_edit') {
574
+ const path = r.params?.filePath ?? r.params?.file_path ?? r.params?.path;
575
+ if (typeof path === 'string') {
576
+ files.add(path);
577
+ }
578
+ }
579
+ }
580
+ }
581
+ return [...files];
582
+ }
583
+ async function runInteractive(cliArgs) {
584
+ const logger = new wukong_agent_sdk_1.Logger({ jsonMode: false });
585
+ (0, wukong_agent_sdk_1.setGlobalLogger)(logger);
586
+ logger.info("🐒 Wukong (悟空) v0.1.0");
587
+ logger.info("========================");
588
+ logger.info("");
589
+ const cfg = await (0, wukong_agent_sdk_1.loadConfig)();
590
+ applyPermissionOverrides(cfg, cliArgs, logger);
591
+ const resolvedConfirmMode = cliArgs.yes ? 'never' : (cliArgs.confirmMode ?? cfg.tools.confirmMode ?? 'smart');
592
+ const resolvedThinking = resolveThinking(cliArgs, cfg);
593
+ // ── 流式输出回调(交互模式) ──
594
+ let interactiveStreamStarted = false;
595
+ const onStream = (event) => {
596
+ switch (event.type) {
597
+ case 'content_delta':
598
+ if (event.content) {
599
+ if (!interactiveStreamStarted) {
600
+ interactiveStreamStarted = true;
601
+ process.stdout.write('\nWukong: ');
602
+ }
603
+ process.stdout.write(event.content);
604
+ }
605
+ break;
606
+ case 'done':
607
+ if (interactiveStreamStarted) {
608
+ process.stdout.write('\n');
609
+ }
610
+ break;
611
+ case 'error':
612
+ if (event.error) {
613
+ process.stderr.write(`\n❌ 流式错误: ${event.error}\n`);
614
+ }
615
+ break;
616
+ }
617
+ };
618
+ const { llm, tools, contextBuilder, agent, resolvedModel } = await initAgent(cfg, logger, resolvedConfirmMode, resolvedThinking, false, cliArgs.planMode, {
619
+ maxSteps: cliArgs.maxSteps,
620
+ contextWindow: cliArgs.contextWindow,
621
+ }, onStream);
622
+ logger.info(`📡 LLM: ${resolvedModel}`);
623
+ logger.info(`🔧 已注册 ${tools.size} 个工具: ${tools.listNames().join(", ")}`);
624
+ const sessionManager = new wukong_agent_sdk_1.SessionManager(cfg.sessions.dir);
625
+ const session = await sessionManager.getOrCreate(cliArgs.sessionId);
626
+ logger.info(`📂 会话存储: ${cfg.sessions.dir}`);
627
+ logger.info(`📜 历史记录: ${session.recordCount} 条`);
628
+ logger.info("");
629
+ async function sendMessage(input) {
630
+ // ── Smart Context 收集(交互模式首条消息) ──
631
+ let smartContextText;
632
+ if (!cliArgs.noSmartContext && session.recordCount === 0) {
633
+ try {
634
+ const sc = await (0, wukong_agent_sdk_1.collectSmartContext)(input, process.cwd());
635
+ if (sc.contextText && sc.files.length > 0) {
636
+ smartContextText = sc.contextText;
637
+ logger.info(`📂 Smart Context: 注入 ${sc.files.length} 个相关文件摘要 (~${sc.estimatedTokens} token)`);
638
+ }
639
+ }
640
+ catch {
641
+ // Smart Context 失败不影响主流程
642
+ }
643
+ }
644
+ const messages = contextBuilder.build(session, input, undefined, smartContextText);
645
+ interactiveStreamStarted = false; // 重置流式状态
646
+ const result = await agent.runWithMessages(messages);
647
+ // 如果已经流式输出了,不需要再重复打印
648
+ if (!interactiveStreamStarted) {
649
+ logger.info(`\nWukong: ${result.response}`);
650
+ }
651
+ logger.info(`\n [步骤: ${result.steps} | Token: ${result.totalTokens.prompt + result.totalTokens.completion} (prompt=${result.totalTokens.prompt}, completion=${result.totalTokens.completion})]`);
652
+ await session.appendMessages([
653
+ { role: "user", content: input },
654
+ ...result.newMessages,
655
+ ]);
656
+ const allMessages = contextBuilder.build(session, "");
657
+ await (0, wukong_agent_sdk_1.compactIfNeeded)(session, allMessages, llm, cfg.sessions.compaction);
658
+ return result;
659
+ }
660
+ if (cliArgs.test) {
661
+ logger.info("🧪 测试模式:发送一条测试消息...");
662
+ logger.info("─".repeat(50));
663
+ try {
664
+ await sendMessage("请列出当前目录下有哪些文件和文件夹。");
665
+ logger.info("\n✅ 测试通过,AI 对话正常!");
666
+ }
667
+ catch (error) {
668
+ logger.error("\n❌ 测试失败:", error);
669
+ process.exit(1);
670
+ }
671
+ process.exit(0);
672
+ }
673
+ logger.info('💬 开始对话(输入 "exit" 退出,输入 "clear" 清空历史)');
674
+ logger.info("─".repeat(50));
675
+ const rl = readline.createInterface({
676
+ input: process.stdin,
677
+ output: process.stdout,
678
+ });
679
+ const ask = () => {
680
+ rl.question("\n你: ", async (input) => {
681
+ const trimmed = input.trim();
682
+ if (!trimmed) {
683
+ ask();
684
+ return;
685
+ }
686
+ if (trimmed.toLowerCase() === "exit") {
687
+ logger.info("👋 再见!");
688
+ rl.close();
689
+ return;
690
+ }
691
+ if (trimmed.toLowerCase() === "clear") {
692
+ await session.clear();
693
+ logger.info("🗑️ 对话历史已清空");
694
+ ask();
695
+ return;
696
+ }
697
+ try {
698
+ await sendMessage(trimmed);
699
+ }
700
+ catch (error) {
701
+ logger.error("\n❌ Agent 执行出错:", error);
702
+ }
703
+ ask();
704
+ });
705
+ };
706
+ ask();
707
+ }
708
+ /**
709
+ * 应用 CLI 权限参数到 cfg(覆盖 cfg.tools.profile/allow/deny)
710
+ *
711
+ * 优先级:CLI > 配置文件 > 默认(coding)
712
+ *
713
+ * 这是方案 B 的核心入口——业务侧(如 eee)在调用 wukong agent CLI 时根据
714
+ * 对话/工作模式传 `--profile chat` 或 `--profile coding`,从工具层面收敛
715
+ * 权限,防止 LLM 被社工诱导执行 exec_command 外发敏感信息。
716
+ */
717
+ function applyPermissionOverrides(cfg, cliArgs, logger) {
718
+ if (cliArgs.profile) {
719
+ cfg.tools.profile = cliArgs.profile;
720
+ logger.info(`🔒 工具权限 profile (CLI 覆盖): ${cliArgs.profile}`);
721
+ }
722
+ if (cliArgs.allowTools.length > 0) {
723
+ cfg.tools.allow = [...cfg.tools.allow, ...cliArgs.allowTools];
724
+ logger.info(`🔒 额外放行工具: ${cliArgs.allowTools.join(', ')}`);
725
+ }
726
+ if (cliArgs.denyTools.length > 0) {
727
+ cfg.tools.deny = [...cfg.tools.deny, ...cliArgs.denyTools];
728
+ logger.info(`🔒 强制拒绝工具: ${cliArgs.denyTools.join(', ')}`);
729
+ }
730
+ }
731
+ /** 从 CLI 参数和配置文件解析思考模式配置 */
732
+ function resolveThinking(cliArgs, cfg) {
733
+ // CLI 参数优先
734
+ if (cliArgs.think) {
735
+ const budget = cliArgs.thinkBudget ?? cfg.agent.thinking?.budgetTokens ?? 10000;
736
+ return { type: 'enabled', budgetTokens: Math.max(budget, 1024) };
737
+ }
738
+ // 配置文件
739
+ if (cfg.agent.thinking?.enabled) {
740
+ return { type: 'enabled', budgetTokens: Math.max(cfg.agent.thinking.budgetTokens ?? 10000, 1024) };
741
+ }
742
+ return undefined;
743
+ }
744
+ async function main() {
745
+ const cliArgs = parseArgs(process.argv);
746
+ // 优先处理 --help 和 --version
747
+ if (cliArgs.help) {
748
+ process.stdout.write(help_js_1.HELP_TEXT + '\n');
749
+ process.exit(0);
750
+ }
751
+ if (cliArgs.version) {
752
+ process.stdout.write((0, help_js_1.formatVersion)() + '\n');
753
+ process.exit(0);
754
+ }
755
+ switch (cliArgs.command) {
756
+ case "agent":
757
+ await runAgentCommand(cliArgs);
758
+ break;
759
+ default:
760
+ await runInteractive(cliArgs);
761
+ break;
762
+ }
763
+ }
764
+ main().catch((err) => {
765
+ process.stderr.write(String(err) + '\n');
766
+ process.exit(1);
767
+ });
768
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,47 @@
1
+ {
2
+ "name": "@wukonglabs/wukong",
3
+ "version": "0.0.1",
4
+ "description": "CI-First AI Agent CLI — 极简但功能完整的 AI 编程助手(ReAct 循环 + 内置工具 + 技能系统)",
5
+ "bin": {
6
+ "wukong": "dist/index.js"
7
+ },
8
+ "files": [
9
+ "dist",
10
+ "wukong.json"
11
+ ],
12
+ "engines": {
13
+ "node": ">=22"
14
+ },
15
+ "publishConfig": {
16
+ "access": "public",
17
+ "registry": "https://registry.npmjs.org/"
18
+ },
19
+ "repository": {
20
+ "type": "git",
21
+ "url": "git+https://cnb.cool/O.o/wukong.git",
22
+ "directory": "packages/cli"
23
+ },
24
+ "keywords": [
25
+ "ai",
26
+ "agent",
27
+ "cli",
28
+ "llm",
29
+ "react",
30
+ "coding-agent"
31
+ ],
32
+ "license": "MIT",
33
+ "dependencies": {
34
+ "@wukonglabs/wukong-agent-sdk": "0.0.1"
35
+ },
36
+ "devDependencies": {
37
+ "@types/node": "^25.3.2",
38
+ "typescript": "^5.9.3",
39
+ "vitest": "^4.0.18"
40
+ },
41
+ "scripts": {
42
+ "build": "tsc",
43
+ "typecheck": "tsc --noEmit",
44
+ "dev": "tsx src/index.ts",
45
+ "start": "node dist/index.js"
46
+ }
47
+ }
package/wukong.json ADDED
@@ -0,0 +1,30 @@
1
+ {
2
+ "agent": {
3
+ "defaultModel": "auto",
4
+ "maxSteps": 200,
5
+ "temperature": 0.3,
6
+ "instructions": [],
7
+ "providers": {
8
+ "openai": {
9
+ "apiKey": "${CNB_TOKEN}",
10
+ "baseUrl": "${CNB_API_ENDPOINT}/${CNB_REPO_SLUG}/-/ai/"
11
+ }
12
+ }
13
+ },
14
+ "gateway": {
15
+ "port": 18789,
16
+ "bind": "loopback"
17
+ },
18
+ "sessions": {
19
+ "dir": "/app/.wukong/sessions",
20
+ "compaction": {
21
+ "enabled": true,
22
+ "contextWindow": 128000,
23
+ "threshold": 0.75,
24
+ "keepRecent": 10
25
+ }
26
+ },
27
+ "tools": {
28
+ "profile": "coding"
29
+ }
30
+ }