@ai-zen/air 0.1.4 → 0.1.6

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/dist/cli.js CHANGED
File without changes
package/dist/main.d.ts ADDED
@@ -0,0 +1,7 @@
1
+ import { readConfig, saveConfig } from "./config.js";
2
+ export declare function contextSize(messages: any[]): number;
3
+ export declare function shouldMigrate(messages: any[]): boolean;
4
+ export declare function generateMigrationDoc(messages: any[]): Promise<string>;
5
+ export declare function runConversation(initialMessage?: string): Promise<void>;
6
+ export { readConfig, saveConfig };
7
+ //# sourceMappingURL=main.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,UAAU,EAAE,UAAU,EAA2D,MAAM,aAAa,CAAC;AA0B9G,wBAAgB,WAAW,CAAC,QAAQ,EAAE,GAAG,EAAE,GAAG,MAAM,CAEnD;AAED,wBAAgB,aAAa,CAAC,QAAQ,EAAE,GAAG,EAAE,GAAG,OAAO,CAEtD;AAqCD,wBAAsB,oBAAoB,CAAC,QAAQ,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAsD3E;AAsCD,wBAAsB,eAAe,CAAC,cAAc,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAsE5E;AAID,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,CAAC"}
package/dist/main.js ADDED
@@ -0,0 +1,248 @@
1
+ import chalk from "chalk";
2
+ import { createInterface } from "node:readline";
3
+ import { Agent, Message, OpenAI, ChatGPT, CallbackTool } from "@ai-zen/agents-core";
4
+ import { readConfig, saveConfig, readMessages, saveMessages, clearMessages, saveSnapshot } from "./config.js";
5
+ import { execSync } from "node:child_process";
6
+ import { DeltaRenderer } from "./delta-renderer.js";
7
+ const SYSTEM_PROMPT = [
8
+ "你是一个AI助手,专门帮助用户回答问题和执行任务。请用中文回复。",
9
+ "",
10
+ "## 行为准则",
11
+ "1. 做任何改动之前,必须先跟用户商量,获得明确指示之后再行动。",
12
+ "2. 用户没有明确要求产出文件时,不得自行创建任何文件到项目中。讨论就停留在讨论层面。",
13
+ "3. 区分危险操作:删除文件、覆盖文件、安装卸载软件、修改系统配置、执行耗时任务等属于危险操作。执行前必须评估影响范围,并向用户说明风险,获得用户明确的书面的确认之后再执行。",
14
+ "4. 追责原则:你的每一步操作都应当基于用户的明确指令。如果出了问题,可以从用户说过的话追溯责任——是用户让你做的,用户承担责任。所以你不需要畏手畏脚,只要用户明确说了\u201c做\u201d,你就放心去做。",
15
+ "",
16
+ "## 记忆",
17
+ "你可以使用 shell 工具执行任何命令。如果你有需要长期记住的信息(用户偏好、项目约定、任务进度等),请写入以下位置:",
18
+ "- 全局记忆: ~/.ai-zen/air/temp/*.md",
19
+ "- 项目记忆: $(cwd)/.ai-zen/air/temp/*.md",
20
+ "下次启动时用 shell 读取即可。这是你唯一的记忆方式。",
21
+ ].join("\n");
22
+ const MAX_CONTEXT_CHARS = 660000;
23
+ const MODEL_NAME = "deepseek-v4-flash";
24
+ const API_ENDPOINT = "https://api.deepseek.com/v1";
25
+ // 上下文计数
26
+ export function contextSize(messages) {
27
+ return JSON.stringify(messages).length;
28
+ }
29
+ export function shouldMigrate(messages) {
30
+ return contextSize(messages) >= MAX_CONTEXT_CHARS;
31
+ }
32
+ // 唯一的工具:shell
33
+ const shellTool = new CallbackTool({
34
+ function: {
35
+ name: "shell",
36
+ description: "执行 shell 命令并返回输出",
37
+ parameters: {
38
+ type: "object",
39
+ properties: {
40
+ command: { type: "string", description: "要执行的命令" },
41
+ },
42
+ required: ["command"],
43
+ },
44
+ },
45
+ callback(args) {
46
+ try {
47
+ return execSync(args.command, { encoding: "utf-8", timeout: 30000 });
48
+ }
49
+ catch (e) {
50
+ return `错误: ${e.message}`;
51
+ }
52
+ },
53
+ });
54
+ // 构建模型
55
+ async function buildModel(apiKey) {
56
+ const endpoint = new OpenAI({ openai_endpoint: API_ENDPOINT, api_key: apiKey });
57
+ return new ChatGPT({
58
+ model_config: {},
59
+ request_config: await endpoint.chatCompletion(MODEL_NAME),
60
+ });
61
+ }
62
+ // 生成交接文档
63
+ export async function generateMigrationDoc(messages) {
64
+ const config = readConfig();
65
+ const model = await buildModel(config.apiKey);
66
+ const agent = new Agent({
67
+ model,
68
+ messages: [Message.System(`你是一个专业的任务交接分析师。你的任务是阅读一段完整的AI助手与用户的对话历史,筛选出对后续工作有用的关键信息,生成一份结构清晰的交接文档。
69
+
70
+ 这份交接文档将作为新会话的第一条用户消息,让新的AI助手了解任务背景并继续工作。
71
+
72
+ 请按以下模板生成 Markdown 格式的文档:
73
+
74
+ ## ✅ 已完成的任务
75
+ 列出已经完成的任务及其产出物(文件路径、代码片段位置等)。
76
+ 如果没有已完成的任务,保留此标题并注明"无"。
77
+ 注意:只记录任务标题和产出路径,不需要描述完成过程的细节。
78
+
79
+ ## 📋 未完成的任务
80
+ 列出所有待继续完成的任务,包含:
81
+ - 任务描述
82
+ - 当前进度
83
+ - 下一步需要做什么
84
+ - 相关的文件路径
85
+ - 优先级(如果对话中提到过)
86
+
87
+ ## 🧠 重要记忆
88
+ 记录所有对后续工作有影响的信息,包括但不限于:
89
+ - 用户的技术偏好和约定
90
+ - 踩过的坑和教训
91
+ - 项目特定的架构决策
92
+ - 任何对后续工作有指导意义的信息
93
+
94
+ ## 📁 文件索引
95
+ 按用途分类列出对话中涉及的重要文件路径,方便新 Agent 按需阅读。
96
+ **请对每个文件注明其用途或作用**,让接手者能快速判断哪些文件需要优先阅读。
97
+
98
+ ## 🔔 接手指令
99
+ 接手后请按以下步骤操作:
100
+ 1. **读文件** — 使用 shell 工具(cat、grep、find 等)读取「文件索引」中列出的关键文件,以实际代码为准,不要依赖训练数据或过往经验
101
+ 2. **对状态** — 确认代码中的关键常量、函数签名、配置等是否与文档描述一致
102
+ 3. **再行动** — 确认无误后再继续未完成任务,做任何改动前先跟用户商量
103
+
104
+ ---
105
+
106
+ 注意事项:
107
+ 1. 只包含确定的信息,不要猜测或补充对话中没有的内容
108
+ 2. 已完成的任务只需列出任务标题和产出路径,不要罗列完成过程的每一步
109
+ 3. 如果某个部分没有需要记录的内容,标注"无"即可
110
+ 4. 语言风格与原始对话一致(中文)`)],
111
+ tools: [],
112
+ });
113
+ const result = await agent.send(`请阅读以下对话历史,生成交接文档:\n\n${messages.map((m) => `[${m.role}] ${typeof m.content === "string" ? m.content : ""}`).join("\n\n")}`);
114
+ const last = result.at(-1);
115
+ if (!last || last.status === "error")
116
+ throw new Error("生成交接文档失败");
117
+ return typeof last.content === "string" ? last.content : "";
118
+ }
119
+ // 构建 Agent
120
+ async function buildAgent(savedMessages) {
121
+ const config = readConfig();
122
+ const model = await buildModel(config.apiKey);
123
+ const messages = [];
124
+ for (const m of savedMessages)
125
+ messages.push(new Message(m));
126
+ return new Agent({ model, messages, tools: [shellTool] });
127
+ }
128
+ // 流式发送
129
+ async function sendAndPrint(agent, text) {
130
+ const renderer = new DeltaRenderer({
131
+ reasoningHeader: "\n\n💭 思考中...\n",
132
+ contentHeader: "\n\n💭 回答中...\n",
133
+ });
134
+ function onChunk(chunk) {
135
+ const delta = chunk?.choices?.[0]?.delta;
136
+ const fr = chunk?.choices?.[0]?.finish_reason ?? null;
137
+ if (delta)
138
+ renderer.render(delta, fr);
139
+ }
140
+ function onRun() { renderer.reset(); }
141
+ agent.events.on("run", onRun);
142
+ agent.events.on("chunk", onChunk);
143
+ await agent.send(text);
144
+ agent.events.off("run", onRun);
145
+ agent.events.off("chunk", onChunk);
146
+ process.stdout.write("\n\n");
147
+ console.log();
148
+ }
149
+ // 对话循环
150
+ export async function runConversation(initialMessage) {
151
+ const config = readConfig();
152
+ if (!config.apiKey) {
153
+ console.error("❌ 请先设置 API Key: air key <your-key>");
154
+ console.error(" 获取 Key: https://platform.deepseek.com/api_keys");
155
+ process.exit(1);
156
+ }
157
+ let savedMessages = readMessages();
158
+ if (savedMessages.length === 0) {
159
+ savedMessages = [Message.System(SYSTEM_PROMPT)];
160
+ saveMessages(savedMessages);
161
+ }
162
+ let agent = await buildAgent(savedMessages);
163
+ if (initialMessage) {
164
+ console.log(`\n💬 你: ${initialMessage}`);
165
+ console.log(chalk.green.bold("\n🤖 AI:"));
166
+ try {
167
+ await sendAndPrint(agent, initialMessage);
168
+ saveMessages(agent.messages);
169
+ console.log("💾 已保存\n");
170
+ }
171
+ catch (err) {
172
+ console.error(`\n❌ ${err.message}`);
173
+ }
174
+ return;
175
+ }
176
+ const msgCount = savedMessages.filter((m) => m.role !== "system").length;
177
+ console.log(msgCount > 0
178
+ ? `\n💬 继续上次对话 (${msgCount} 条,/${contextSize(savedMessages)} 字符,输入 /new 重新开始)\n`
179
+ : "\n💬 air — 极简 AI 助手 (输入 /help 查看命令)\n");
180
+ const rl = createInterface({ input: process.stdin, output: process.stdout });
181
+ function ask() {
182
+ rl.question("💬 你: ", async (input) => {
183
+ const t = input.trim();
184
+ if (!t) {
185
+ ask();
186
+ return;
187
+ }
188
+ if (t.startsWith("/")) {
189
+ const c = t.toLowerCase();
190
+ if (c === "/exit" || c === "/quit") {
191
+ console.log("\n👋 再见!");
192
+ process.exit(0);
193
+ }
194
+ if (c === "/save") {
195
+ console.log(`\n✅ 快照: ${saveSnapshot(savedMessages)}\n`);
196
+ ask();
197
+ return;
198
+ }
199
+ if (c === "/new") {
200
+ clearMessages();
201
+ savedMessages = [Message.System(SYSTEM_PROMPT)];
202
+ saveMessages(savedMessages);
203
+ agent = await buildAgent(savedMessages);
204
+ console.log("\n🆕 重新开始\n");
205
+ ask();
206
+ return;
207
+ }
208
+ if (c === "/help") {
209
+ console.log("\n/exit /quit 退出\n/save 保存快照\n/new 重新开始\n/help 帮助\n");
210
+ ask();
211
+ return;
212
+ }
213
+ console.log(`\n❌ 未知命令: ${t}\n`);
214
+ ask();
215
+ return;
216
+ }
217
+ console.log(chalk.green.bold("\n🤖 AI:"));
218
+ try {
219
+ await sendAndPrint(agent, t);
220
+ saveMessages(agent.messages);
221
+ if (shouldMigrate(agent.messages)) {
222
+ console.log(`🔄 上下文 ${contextSize(agent.messages)}/${MAX_CONTEXT_CHARS},准备迁移...`);
223
+ try {
224
+ const snap = saveSnapshot(agent.messages);
225
+ console.log(` 💾 快照: ${snap}`);
226
+ const summary = await generateMigrationDoc(agent.messages);
227
+ savedMessages = [Message.System(SYSTEM_PROMPT), Message.User(summary)];
228
+ saveMessages(savedMessages);
229
+ agent = await buildAgent(savedMessages);
230
+ console.log("✅ 迁移完成\n");
231
+ }
232
+ catch (err) {
233
+ console.error(`❌ 迁移失败: ${err.message}\n`);
234
+ }
235
+ }
236
+ }
237
+ catch (err) {
238
+ console.error(`\n❌ ${err.message}`);
239
+ }
240
+ ask();
241
+ });
242
+ }
243
+ ask();
244
+ process.on("SIGINT", () => { console.log("\n\n👋 再见!"); process.exit(0); });
245
+ }
246
+ // 重新导出 config 函数供 cli.ts 使用
247
+ export { readConfig, saveConfig };
248
+ //# sourceMappingURL=main.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"migration.d.ts","sourceRoot":"","sources":["../src/migration.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,iBAAiB,SAAS,CAAC;AAExC,wBAAgB,WAAW,CAAC,QAAQ,EAAE,GAAG,EAAE,GAAG,MAAM,CAEnD;AAED,wBAAgB,aAAa,CAAC,QAAQ,EAAE,GAAG,EAAE,GAAG,OAAO,CAEtD;AAED,wBAAsB,oBAAoB,CAAC,QAAQ,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CA0D3E"}
1
+ {"version":3,"file":"migration.d.ts","sourceRoot":"","sources":["../src/migration.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,iBAAiB,SAAS,CAAC;AAExC,wBAAgB,WAAW,CAAC,QAAQ,EAAE,GAAG,EAAE,GAAG,MAAM,CAEnD;AAED,wBAAgB,aAAa,CAAC,QAAQ,EAAE,GAAG,EAAE,GAAG,OAAO,CAEtD;AAED,wBAAsB,oBAAoB,CAAC,QAAQ,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAkE3E"}
package/dist/migration.js CHANGED
@@ -61,7 +61,15 @@ export async function generateMigrationDoc(messages) {
61
61
  4. 语言风格与原始对话一致(中文)`)],
62
62
  tools: [],
63
63
  });
64
- const result = await agent.send(`请阅读以下对话历史,生成交接文档:\n\n${messages.map((m) => `[${m.role}] ${typeof m.content === "string" ? m.content : ""}`).join("\n\n")}`);
64
+ const historyJson = JSON.stringify(messages, null, 2);
65
+ const result = await agent.send(`请分析以下对话历史(JSON 格式)并生成交接文档。
66
+
67
+ 这是 AI 助手与用户的完整对话记录,每条消息包含 role(角色)和 content(内容)字段。
68
+ 你可以使用 shell 工具读取文件、查看项目结构来验证对话中提到的信息。
69
+
70
+ \`\`\`json
71
+ ${historyJson}
72
+ \`\`\``);
65
73
  const last = result.at(-1);
66
74
  if (!last || last.status === "error")
67
75
  throw new Error("生成交接文档失败");
@@ -1 +1 @@
1
- {"version":3,"file":"migration.js","sourceRoot":"","sources":["../src/migration.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AACtE,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,MAAM,CAAC,MAAM,iBAAiB,GAAG,MAAM,CAAC;AAExC,MAAM,UAAU,WAAW,CAAC,QAAe;IACzC,OAAO,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,QAAe;IAC3C,OAAO,WAAW,CAAC,QAAQ,CAAC,IAAI,iBAAiB,CAAC;AACpD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,QAAe;IACxD,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,MAAM,QAAQ,GAAG,IAAI,MAAM,CAAC,EAAE,eAAe,EAAE,6BAA6B,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IACxG,MAAM,KAAK,GAAG,IAAI,OAAO,CAAC;QACxB,YAAY,EAAE,EAAE;QAChB,cAAc,EAAE,MAAM,QAAQ,CAAC,cAAc,CAAC,mBAAmB,CAAC;KACnE,CAAC,CAAC;IACH,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC;QACtB,KAAK;QACL,QAAQ,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;mBA0CX,CAAC,CAAC;QACjB,KAAK,EAAE,EAAE;KACV,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,wBAAwB,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAC7J,MAAM,IAAI,GAAG,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3B,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,OAAO;QAAE,MAAM,IAAI,KAAK,CAAC,UAAU,CAAC,CAAC;IAClE,OAAO,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;AAC9D,CAAC"}
1
+ {"version":3,"file":"migration.js","sourceRoot":"","sources":["../src/migration.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AACtE,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,MAAM,CAAC,MAAM,iBAAiB,GAAG,MAAM,CAAC;AAExC,MAAM,UAAU,WAAW,CAAC,QAAe;IACzC,OAAO,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,QAAe;IAC3C,OAAO,WAAW,CAAC,QAAQ,CAAC,IAAI,iBAAiB,CAAC;AACpD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,QAAe;IACxD,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,MAAM,QAAQ,GAAG,IAAI,MAAM,CAAC,EAAE,eAAe,EAAE,6BAA6B,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IACxG,MAAM,KAAK,GAAG,IAAI,OAAO,CAAC;QACxB,YAAY,EAAE,EAAE;QAChB,cAAc,EAAE,MAAM,QAAQ,CAAC,cAAc,CAAC,mBAAmB,CAAC;KACnE,CAAC,CAAC;IACH,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC;QACtB,KAAK;QACL,QAAQ,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;mBA0CX,CAAC,CAAC;QACjB,KAAK,EAAE,EAAE;KACV,CAAC,CAAC;IACH,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IACtD,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC;;;;;;EAMhC,WAAW;OACN,CAAC,CAAC;IACP,MAAM,IAAI,GAAG,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3B,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,OAAO;QAAE,MAAM,IAAI,KAAK,CAAC,UAAU,CAAC,CAAC;IAClE,OAAO,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;AAC9D,CAAC"}
package/package.json CHANGED
@@ -1,14 +1,21 @@
1
1
  {
2
2
  "name": "@ai-zen/air",
3
- "version": "0.1.4",
3
+ "version": "0.1.6",
4
4
  "description": "极简 AI 命令行助手",
5
5
  "type": "module",
6
6
  "main": "./dist/agent-runtime.js",
7
7
  "bin": {
8
8
  "air": "./dist/cli.js"
9
9
  },
10
+ "scripts": {
11
+ "build": "tsc",
12
+ "prepublishOnly": "npm run build",
13
+ "start": "npm run build && node ./dist/cli.js",
14
+ "test": "vitest run",
15
+ "test:watch": "vitest"
16
+ },
10
17
  "dependencies": {
11
- "@ai-zen/agents-core": "file:../agents/packages/core",
18
+ "@ai-zen/agents-core": "^2.4.0",
12
19
  "chalk": "^5.6.2",
13
20
  "commander": "^15.0.0",
14
21
  "inquirer": "^9.3.8"
@@ -18,11 +25,5 @@
18
25
  "@types/node": "^24.12.2",
19
26
  "typescript": "^5.3.3",
20
27
  "vitest": "^4.1.9"
21
- },
22
- "scripts": {
23
- "build": "tsc",
24
- "start": "npm run build && node ./dist/cli.js",
25
- "test": "vitest run",
26
- "test:watch": "vitest"
27
28
  }
28
- }
29
+ }
package/src/migration.ts CHANGED
@@ -65,7 +65,15 @@ export async function generateMigrationDoc(messages: any[]): Promise<string> {
65
65
  4. 语言风格与原始对话一致(中文)`)],
66
66
  tools: [],
67
67
  });
68
- const result = await agent.send(`请阅读以下对话历史,生成交接文档:\n\n${messages.map((m) => `[${m.role}] ${typeof m.content === "string" ? m.content : ""}`).join("\n\n")}`);
68
+ const historyJson = JSON.stringify(messages, null, 2);
69
+ const result = await agent.send(`请分析以下对话历史(JSON 格式)并生成交接文档。
70
+
71
+ 这是 AI 助手与用户的完整对话记录,每条消息包含 role(角色)和 content(内容)字段。
72
+ 你可以使用 shell 工具读取文件、查看项目结构来验证对话中提到的信息。
73
+
74
+ \`\`\`json
75
+ ${historyJson}
76
+ \`\`\``);
69
77
  const last = result.at(-1);
70
78
  if (!last || last.status === "error") throw new Error("生成交接文档失败");
71
79
  return typeof last.content === "string" ? last.content : "";