@ai-zen/air 0.1.3

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 (43) hide show
  1. package/README.md +85 -0
  2. package/TODO.md +8 -0
  3. package/dist/agent-factory.d.ts +3 -0
  4. package/dist/agent-factory.d.ts.map +1 -0
  5. package/dist/agent-factory.js +21 -0
  6. package/dist/agent-factory.js.map +1 -0
  7. package/dist/agent-runtime.d.ts +2 -0
  8. package/dist/agent-runtime.d.ts.map +1 -0
  9. package/dist/agent-runtime.js +292 -0
  10. package/dist/agent-runtime.js.map +1 -0
  11. package/dist/cli.d.ts +3 -0
  12. package/dist/cli.d.ts.map +1 -0
  13. package/dist/cli.js +40 -0
  14. package/dist/cli.js.map +1 -0
  15. package/dist/config.d.ts +17 -0
  16. package/dist/config.d.ts.map +1 -0
  17. package/dist/config.js +90 -0
  18. package/dist/config.js.map +1 -0
  19. package/dist/delta-renderer.d.ts +19 -0
  20. package/dist/delta-renderer.d.ts.map +1 -0
  21. package/dist/delta-renderer.js +104 -0
  22. package/dist/delta-renderer.js.map +1 -0
  23. package/dist/migration.d.ts +5 -0
  24. package/dist/migration.d.ts.map +1 -0
  25. package/dist/migration.js +70 -0
  26. package/dist/migration.js.map +1 -0
  27. package/dist/tools.d.ts +3 -0
  28. package/dist/tools.d.ts.map +1 -0
  29. package/dist/tools.js +24 -0
  30. package/dist/tools.js.map +1 -0
  31. package/package.json +28 -0
  32. package/src/__tests__/config.test.ts +111 -0
  33. package/src/__tests__/main.test.ts +43 -0
  34. package/src/__tests__/tools.test.ts +15 -0
  35. package/src/agent-factory.ts +23 -0
  36. package/src/agent-runtime.ts +256 -0
  37. package/src/cli.ts +48 -0
  38. package/src/config.ts +109 -0
  39. package/src/delta-renderer.ts +127 -0
  40. package/src/migration.ts +72 -0
  41. package/src/tools.ts +23 -0
  42. package/tsconfig.json +18 -0
  43. package/vitest.config.ts +8 -0
package/README.md ADDED
@@ -0,0 +1,85 @@
1
+ # air
2
+
3
+ 用 1% 的功能完成 99% 的事情。
4
+
5
+ 一个极简的 AI 命令行助手。只有一个 shell 工具,AI 自己用文件系统记东西,上下文满了自动迁移。
6
+
7
+ ## 安装
8
+
9
+ ```bash
10
+ git clone git@github.com:ai-zen/air.git
11
+ cd air
12
+ npm install
13
+ npm run build
14
+ ```
15
+
16
+ ## 使用
17
+
18
+ ```bash
19
+ # 设置 API Key(DeepSeek)
20
+ air key sk-xxxxxxxxxxxxxxxx
21
+
22
+ # 交互模式(自动恢复上次对话)
23
+ air
24
+
25
+ # 直接发一条消息
26
+ air 用 shell 帮我看看当前目录有哪些文件
27
+
28
+ # 查看配置
29
+ air config
30
+ ```
31
+
32
+ ### 交互命令
33
+
34
+ | 命令 | 说明 |
35
+ |------|------|
36
+ | `/exit` `/quit` | 退出 |
37
+ | `/save` | 保存快照 |
38
+ | `/load` | 加载快照 |
39
+ | `/new` | 清空上下文重新开始 |
40
+ | `/back` | 撤回消息(可选修改后重发) |
41
+ | `/editor` | 打开系统编辑器输入多行文本 |
42
+ | `/help` | 帮助 |
43
+
44
+ ## 设计
45
+
46
+ ```
47
+ ~/.ai-zen/air/
48
+ ├── config.json # { "apiKey": "sk-xxx" }
49
+ ├── context.json # [ { role, content }, ... ] 当前对话
50
+ ├── snapshots/ # /save 或迁移前自动快照
51
+ └── temp/ # AI 自己写入的长期记忆 (*.md)
52
+ ```
53
+
54
+ ### 核心理念
55
+
56
+ - **模型**: DeepSeek-V4-Flash(写死,只有一个)
57
+ - **工具**: 只有一个 `shell`,AI 用它执行命令、读写文件
58
+ - **记忆**: AI 自己决定记什么,用 shell 写入 `temp/*.md`,下次启动时读取。air 不做额外的持久化机制
59
+ - **上下文**: JSON 序列化后超过 50 万字符自动迁移,迁移前拍快照
60
+ - **行为准则**: 先商量再动手,危险操作必须获得用户书面确认。追责原则——每一步基于用户指令,用户承担责任
61
+
62
+ ## 项目结构
63
+
64
+ ```
65
+ src/
66
+ ├── cli.ts # CLI 入口,commander (48行)
67
+ ├── config.ts # 配置与文件读写 (109行)
68
+ ├── delta-renderer.ts # 流式渲染器 (126行,复用自 agents 项目)
69
+ ├── tools.ts # 工具定义——shell (23行)
70
+ ├── agent-factory.ts # Agent 工厂——构建模型与 Agent (23行)
71
+ ├── migration.ts # 上下文计数与任务迁移 (72行)
72
+ ├── agent-runtime.ts # 运行时——对话循环与命令处理 (256行)
73
+ └── __tests__/
74
+ ├── config.test.ts # 配置/上下文/快照测试 (110行)
75
+ ├── main.test.ts # contextSize/shouldMigrate 测试 (43行)
76
+ └── tools.test.ts # shell 工具结构测试 (15行)
77
+ ```
78
+
79
+ 共 40 KB,826 行。
80
+
81
+ ## 测试
82
+
83
+ ```bash
84
+ npm test
85
+ ```
package/TODO.md ADDED
@@ -0,0 +1,8 @@
1
+ # air
2
+
3
+ ## TODO
4
+
5
+ - [x] 一个固定的模型 + 一套固定的提示词
6
+ - [x] 最基础的上下文循环 + 唯一个命令行工具
7
+ - [x] 所有记忆直接落到文件系统
8
+ - [x] 上下文达到一定程度就做任务迁移
@@ -0,0 +1,3 @@
1
+ import { Agent } from "@ai-zen/agents-core";
2
+ export declare function buildAgent(savedMessages: any[]): Promise<Agent>;
3
+ //# sourceMappingURL=agent-factory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-factory.d.ts","sourceRoot":"","sources":["../src/agent-factory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAA4B,MAAM,qBAAqB,CAAC;AAgBtE,wBAAsB,UAAU,CAAC,aAAa,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,KAAK,CAAC,CAMrE"}
@@ -0,0 +1,21 @@
1
+ import { Agent, Message, OpenAI, ChatGPT } from "@ai-zen/agents-core";
2
+ import { readConfig } from "./config.js";
3
+ import { shellTool } from "./tools.js";
4
+ const MODEL_NAME = "deepseek-v4-flash";
5
+ const API_ENDPOINT = "https://api.deepseek.com/v1";
6
+ async function buildModel(apiKey) {
7
+ const endpoint = new OpenAI({ openai_endpoint: API_ENDPOINT, api_key: apiKey });
8
+ return new ChatGPT({
9
+ model_config: {},
10
+ request_config: await endpoint.chatCompletion(MODEL_NAME),
11
+ });
12
+ }
13
+ export async function buildAgent(savedMessages) {
14
+ const config = readConfig();
15
+ const model = await buildModel(config.apiKey);
16
+ const messages = [];
17
+ for (const m of savedMessages)
18
+ messages.push(new Message(m));
19
+ return new Agent({ model, messages, tools: [shellTool] });
20
+ }
21
+ //# sourceMappingURL=agent-factory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-factory.js","sourceRoot":"","sources":["../src/agent-factory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAEtE,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEvC,MAAM,UAAU,GAAG,mBAAmB,CAAC;AACvC,MAAM,YAAY,GAAG,6BAA6B,CAAC;AAEnD,KAAK,UAAU,UAAU,CAAC,MAAc;IACtC,MAAM,QAAQ,GAAG,IAAI,MAAM,CAAC,EAAE,eAAe,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;IAChF,OAAO,IAAI,OAAO,CAAC;QACjB,YAAY,EAAE,EAAE;QAChB,cAAc,EAAE,MAAM,QAAQ,CAAC,cAAc,CAAC,UAAU,CAAC;KAC1D,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,aAAoB;IACnD,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,MAAM,KAAK,GAAG,MAAM,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC9C,MAAM,QAAQ,GAAsB,EAAE,CAAC;IACvC,KAAK,MAAM,CAAC,IAAI,aAAa;QAAE,QAAQ,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7D,OAAO,IAAI,KAAK,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;AAC5D,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function runConversation(initialMessage?: string): Promise<void>;
2
+ //# sourceMappingURL=agent-runtime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-runtime.d.ts","sourceRoot":"","sources":["../src/agent-runtime.ts"],"names":[],"mappings":"AAwDA,wBAAsB,eAAe,CAAC,cAAc,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAuM5E"}
@@ -0,0 +1,292 @@
1
+ import chalk from "chalk";
2
+ import { Message } from "@ai-zen/agents-core";
3
+ import { DeltaRenderer } from "./delta-renderer.js";
4
+ import inquirer from "inquirer";
5
+ import { readConfig, readMessages, saveMessages, clearMessages, saveSnapshot, listSnapshots, loadSnapshot } from "./config.js";
6
+ import { buildAgent } from "./agent-factory.js";
7
+ import { contextSize, shouldMigrate, generateMigrationDoc, MAX_CONTEXT_CHARS } from "./migration.js";
8
+ const SYSTEM_PROMPT = [
9
+ "你是一个AI助手,专门帮助用户回答问题和执行任务。请用中文回复。",
10
+ "",
11
+ "## 行为准则",
12
+ "1. 做任何改动之前,必须先跟用户商量,获得明确指示之后再行动。",
13
+ "2. 用户没有明确要求产出文件时,不得自行创建任何文件到项目中。讨论就停留在讨论层面。",
14
+ "3. 区分危险操作:删除文件、覆盖文件、安装卸载软件、修改系统配置、执行耗时任务等属于危险操作。执行前必须评估影响范围,并向用户说明风险,获得用户明确的书面的确认之后再执行。",
15
+ "4. 追责原则:你的每一步操作都应当基于用户的明确指令。如果出了问题,可以从用户说过的话追溯责任——是用户让你做的,用户承担责任。所以你不需要畏手畏脚,只要用户明确说了\u201c做\u201d,你就放心去做。",
16
+ "",
17
+ "## 记忆",
18
+ "你可以使用 shell 工具执行任何命令。如果你有需要长期记住的信息(用户偏好、项目约定、任务进度等),请写入以下位置:",
19
+ "- 全局记忆: ~/.ai-zen/air/temp/*.md",
20
+ "- 项目记忆: $(cwd)/.ai-zen/air/temp/*.md",
21
+ "下次启动时用 shell 读取即可。这是你唯一的记忆方式。",
22
+ ].join("\n");
23
+ // 流式发送
24
+ async function sendAndPrint(agent, text) {
25
+ const renderer = new DeltaRenderer({
26
+ reasoningHeader: "\n\n💭 思考中...\n",
27
+ contentHeader: "\n\n💭 回答中...\n",
28
+ });
29
+ function onChunk(chunk) {
30
+ const delta = chunk?.choices?.[0]?.delta;
31
+ const fr = chunk?.choices?.[0]?.finish_reason ?? null;
32
+ if (delta)
33
+ renderer.render(delta, fr);
34
+ }
35
+ function onRun() { renderer.reset(); }
36
+ agent.events.on("run", onRun);
37
+ agent.events.on("chunk", onChunk);
38
+ await agent.send(text);
39
+ agent.events.off("run", onRun);
40
+ agent.events.off("chunk", onChunk);
41
+ process.stdout.write("\n\n");
42
+ console.log();
43
+ }
44
+ async function sendAndSave(agent, text) {
45
+ console.log(chalk.green.bold("\n🤖 AI:"));
46
+ await sendAndPrint(agent, text);
47
+ }
48
+ // 对话循环
49
+ export async function runConversation(initialMessage) {
50
+ const config = readConfig();
51
+ if (!config.apiKey) {
52
+ console.error("❌ 请先设置 API Key: air key <your-key>");
53
+ console.error(" 获取 Key: https://platform.deepseek.com/api_keys");
54
+ process.exit(1);
55
+ }
56
+ let msgs = readMessages();
57
+ if (msgs.length === 0) {
58
+ msgs = [Message.System(SYSTEM_PROMPT)];
59
+ saveMessages(msgs);
60
+ }
61
+ let agent = await buildAgent(msgs);
62
+ if (initialMessage) {
63
+ console.log(`\n💬 你: ${initialMessage}`);
64
+ try {
65
+ await sendAndSave(agent, initialMessage);
66
+ saveMessages(agent.messages);
67
+ console.log("💾 已保存\n");
68
+ }
69
+ catch (err) {
70
+ console.error(`\n❌ ${err.message}`);
71
+ }
72
+ return;
73
+ }
74
+ const msgCount = agent.messages.filter((m) => m.role !== "system").length;
75
+ console.log(msgCount > 0
76
+ ? `\n💬 继续上次对话 (${msgCount} 条,/${contextSize(agent.messages)} 字符,输入 /new 重新开始)\n`
77
+ : "\n💬 air — 极简 AI 助手 (输入 /help 查看命令)\n");
78
+ async function ask() {
79
+ const { input } = await inquirer.prompt([
80
+ { type: "input", name: "input", message: "你:" },
81
+ ]);
82
+ const t = input.trim();
83
+ if (!t) {
84
+ await ask();
85
+ return;
86
+ }
87
+ if (t.startsWith("/")) {
88
+ const c = t.toLowerCase();
89
+ if (c === "/exit" || c === "/quit") {
90
+ console.log("\n👋 再见!");
91
+ process.exit(0);
92
+ }
93
+ if (c === "/save") {
94
+ console.log(`\n✅ 快照: ${saveSnapshot(agent.messages)}\n`);
95
+ await ask();
96
+ return;
97
+ }
98
+ if (c === "/new") {
99
+ clearMessages();
100
+ const msgs = [Message.System(SYSTEM_PROMPT)];
101
+ saveMessages(msgs);
102
+ agent = await buildAgent(msgs);
103
+ console.log("\n🆕 重新开始\n");
104
+ await ask();
105
+ return;
106
+ }
107
+ if (c === "/load") {
108
+ const snapshots = listSnapshots();
109
+ if (snapshots.length === 0) {
110
+ console.log("\n📭 没有可用的快照\n");
111
+ await ask();
112
+ return;
113
+ }
114
+ const { selectedName } = await inquirer.prompt([
115
+ {
116
+ type: "list",
117
+ name: "selectedName",
118
+ message: "选择要加载的快照:",
119
+ pageSize: 15,
120
+ choices: [
121
+ { name: "↩️ 取消操作", value: "" },
122
+ ...snapshots.map((s) => ({ name: s.date, value: s.name })),
123
+ ],
124
+ },
125
+ ]);
126
+ if (!selectedName) {
127
+ console.log("\n已取消\n");
128
+ await ask();
129
+ return;
130
+ }
131
+ let msgs = loadSnapshot(selectedName);
132
+ if (msgs.length === 0) {
133
+ msgs = [Message.System(SYSTEM_PROMPT)];
134
+ }
135
+ saveMessages(msgs);
136
+ agent = await buildAgent(msgs);
137
+ const snap = snapshots.find((s) => s.name === selectedName);
138
+ console.log("\n✅ 已加载快照: " + (snap ? snap.date : selectedName) + "\n");
139
+ await ask();
140
+ return;
141
+ }
142
+ if (c === "/back") {
143
+ await handleBack();
144
+ await ask();
145
+ return;
146
+ }
147
+ if (c === "/editor") {
148
+ const { content } = await inquirer.prompt([
149
+ { type: "editor", name: "content", message: "编辑消息:" },
150
+ ]);
151
+ if (!content.trim()) {
152
+ console.log("\n已取消\n");
153
+ await ask();
154
+ return;
155
+ }
156
+ try {
157
+ await sendAndSave(agent, content.trim());
158
+ saveMessages(agent.messages);
159
+ }
160
+ catch (err) {
161
+ console.error(`\n❌ ${err.message}`);
162
+ }
163
+ await ask();
164
+ return;
165
+ }
166
+ if (c === "/help") {
167
+ console.log("\n/exit /quit 退出\n/save 保存快照\n/load 加载快照\n/new 重新开始\n/back 撤回消息\n/help 帮助\n");
168
+ await ask();
169
+ return;
170
+ }
171
+ console.log(`\n❌ 未知命令: ${t}\n`);
172
+ await ask();
173
+ return;
174
+ }
175
+ try {
176
+ await sendAndSave(agent, t);
177
+ saveMessages(agent.messages);
178
+ if (shouldMigrate(agent.messages)) {
179
+ console.log(`🔄 上下文 ${contextSize(agent.messages)}/${MAX_CONTEXT_CHARS},准备迁移...`);
180
+ try {
181
+ const snap = saveSnapshot(agent.messages);
182
+ console.log(` 💾 快照: ${snap}`);
183
+ const summary = await generateMigrationDoc(agent.messages);
184
+ const msgs = [Message.System(SYSTEM_PROMPT), Message.User(summary)];
185
+ saveMessages(msgs);
186
+ agent = await buildAgent(msgs);
187
+ console.log("✅ 迁移完成\n");
188
+ }
189
+ catch (err) {
190
+ console.error(`❌ 迁移失败: ${err.message}\n`);
191
+ }
192
+ }
193
+ }
194
+ catch (err) {
195
+ console.error(`\n❌ ${err.message}`);
196
+ }
197
+ await ask();
198
+ }
199
+ async function handleBack() {
200
+ const targets = [];
201
+ for (let i = 0; i < agent.messages.length; i++) {
202
+ const msg = agent.messages[i];
203
+ if (msg.role === "user") {
204
+ const text = typeof msg.content === "string" ? msg.content : "";
205
+ if (text) {
206
+ targets.push({ index: i, role: "user", label: "👤 用户", preview: text.substring(0, 60) + (text.length > 60 ? "..." : "") });
207
+ }
208
+ }
209
+ else if (msg.role === "tool" || msg.role === "function") {
210
+ const text = typeof msg.content === "string" ? msg.content : "";
211
+ if (text) {
212
+ targets.push({ index: i, role: msg.role, label: "🔧 工具", preview: text.substring(0, 60) + (text.length > 60 ? "..." : "") });
213
+ }
214
+ }
215
+ }
216
+ if (targets.length === 0) {
217
+ console.log("\n❌ 还没有消息可以撤回\n");
218
+ return;
219
+ }
220
+ console.log("\n📋 选择要撤回到哪条消息(将删除所选及其之后的所有内容):\n");
221
+ const { selectedIndex } = await inquirer.prompt([
222
+ {
223
+ type: "list",
224
+ name: "selectedIndex",
225
+ message: "撤回到:",
226
+ pageSize: 15,
227
+ choices: [
228
+ { name: "↩️ 取消操作", value: -1 },
229
+ ...targets.map((t) => ({ name: t.label + " " + t.preview, value: t.index })),
230
+ ],
231
+ },
232
+ ]);
233
+ if (selectedIndex === -1) {
234
+ console.log("\n已取消\n");
235
+ return;
236
+ }
237
+ const selectedMsg = agent.messages[selectedIndex];
238
+ const isUserMsg = selectedMsg.role === "user";
239
+ const originalText = typeof selectedMsg.content === "string" ? selectedMsg.content : "";
240
+ const sliceEnd = isUserMsg ? selectedIndex : selectedIndex + 1;
241
+ agent.messages = agent.messages.slice(0, sliceEnd);
242
+ if (isUserMsg) {
243
+ console.log("\n原内容: " + originalText.substring(0, 200) + (originalText.length > 200 ? "..." : "") + "\n");
244
+ const { editChoice } = await inquirer.prompt([
245
+ {
246
+ type: "list",
247
+ name: "editChoice",
248
+ message: "请选择:",
249
+ choices: [
250
+ { name: "✏️ 修改后重新发送", value: "edit" },
251
+ { name: "🔄 直接重新发送", value: "resend" },
252
+ { name: "↩️ 取消操作", value: "cancel" },
253
+ ],
254
+ },
255
+ ]);
256
+ if (editChoice === "cancel") {
257
+ console.log("\n已取消\n");
258
+ return;
259
+ }
260
+ let textToSend = originalText;
261
+ if (editChoice === "edit") {
262
+ const { editedContent } = await inquirer.prompt([
263
+ { type: "input", name: "editedContent", message: "修改消息:", default: originalText },
264
+ ]);
265
+ if (!editedContent.trim()) {
266
+ console.log("\n❌ 消息不能为空\n");
267
+ return;
268
+ }
269
+ textToSend = editedContent.trim();
270
+ }
271
+ agent = await buildAgent(agent.messages);
272
+ await sendAndSave(agent, textToSend);
273
+ saveMessages(agent.messages);
274
+ }
275
+ else {
276
+ console.log("\n💡 请输入一条新消息继续对话\n");
277
+ const { newMessage } = await inquirer.prompt([
278
+ { type: "input", name: "newMessage", message: "新消息:" },
279
+ ]);
280
+ if (!newMessage.trim()) {
281
+ console.log("\n已取消\n");
282
+ return;
283
+ }
284
+ agent = await buildAgent(agent.messages);
285
+ await sendAndSave(agent, newMessage.trim());
286
+ saveMessages(agent.messages);
287
+ }
288
+ }
289
+ await ask();
290
+ process.on("SIGINT", () => { console.log("\n\n👋 再见!"); process.exit(0); });
291
+ }
292
+ //# sourceMappingURL=agent-runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-runtime.js","sourceRoot":"","sources":["../src/agent-runtime.ts"],"names":[],"mappings":"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"}
package/dist/cli.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
package/dist/cli.js ADDED
@@ -0,0 +1,40 @@
1
+ #!/usr/bin/env node
2
+ import { readFileSync } from "node:fs";
3
+ import { Command } from "commander";
4
+ import { runConversation } from "./agent-runtime.js";
5
+ import { readConfig, saveConfig } from "./config.js";
6
+ const { version } = JSON.parse(readFileSync(new URL("../package.json", import.meta.url), "utf-8"));
7
+ const program = new Command();
8
+ program
9
+ .name("air")
10
+ .description("极简 AI 命令行助手")
11
+ .version(version);
12
+ program
13
+ .command("key")
14
+ .description("设置 API Key")
15
+ .argument("<apiKey>", "DeepSeek API Key")
16
+ .action((apiKey) => {
17
+ saveConfig(apiKey);
18
+ console.log("✅ API Key 已设置");
19
+ });
20
+ program
21
+ .command("config")
22
+ .description("查看当前配置")
23
+ .action(() => {
24
+ const c = readConfig();
25
+ const key = c.apiKey ? "****" + c.apiKey.slice(-4) : "(未设置)";
26
+ console.log(`API Key: ${key}`);
27
+ });
28
+ program
29
+ .argument("[message]", "要发送的消息(不传则进入交互模式)")
30
+ .action(async (message) => {
31
+ const config = readConfig();
32
+ if (!config.apiKey) {
33
+ console.error("❌ 请先设置 API Key: air key <your-key>");
34
+ console.error(" 获取 Key: https://platform.deepseek.com/api_keys");
35
+ process.exit(1);
36
+ }
37
+ await runConversation(message);
38
+ });
39
+ program.parse(process.argv);
40
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAErD,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,KAAK,CAC5B,YAAY,CAAC,IAAI,GAAG,CAAC,iBAAiB,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CACnE,CAAC;AAEF,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,KAAK,CAAC;KACX,WAAW,CAAC,aAAa,CAAC;KAC1B,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,OAAO;KACJ,OAAO,CAAC,KAAK,CAAC;KACd,WAAW,CAAC,YAAY,CAAC;KACzB,QAAQ,CAAC,UAAU,EAAE,kBAAkB,CAAC;KACxC,MAAM,CAAC,CAAC,MAAc,EAAE,EAAE;IACzB,UAAU,CAAC,MAAM,CAAC,CAAC;IACnB,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;AAC/B,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,QAAQ,CAAC;KACrB,MAAM,CAAC,GAAG,EAAE;IACX,MAAM,CAAC,GAAG,UAAU,EAAE,CAAC;IACvB,MAAM,GAAG,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;IAC7D,OAAO,CAAC,GAAG,CAAC,YAAY,GAAG,EAAE,CAAC,CAAC;AACjC,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,QAAQ,CAAC,WAAW,EAAE,mBAAmB,CAAC;KAC1C,MAAM,CAAC,KAAK,EAAE,OAAgB,EAAE,EAAE;IACjC,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;QACnB,OAAO,CAAC,KAAK,CAAC,oCAAoC,CAAC,CAAC;QACpD,OAAO,CAAC,KAAK,CAAC,mDAAmD,CAAC,CAAC;QACnE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,MAAM,eAAe,CAAC,OAAO,CAAC,CAAC;AACjC,CAAC,CAAC,CAAC;AAEL,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC"}
@@ -0,0 +1,17 @@
1
+ export interface Config {
2
+ apiKey: string;
3
+ }
4
+ export declare function ensureDir(): void;
5
+ export declare function readConfig(): Config;
6
+ export declare function saveConfig(apiKey: string): void;
7
+ export declare function readMessages(): any[];
8
+ export declare function saveMessages(messages: any[]): void;
9
+ export declare function clearMessages(): void;
10
+ export declare function saveSnapshot(messages: any[]): string;
11
+ export interface SnapshotInfo {
12
+ name: string;
13
+ date: string;
14
+ }
15
+ export declare function listSnapshots(): SnapshotInfo[];
16
+ export declare function loadSnapshot(name: string): any[];
17
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,MAAM;IACrB,MAAM,EAAE,MAAM,CAAC;CAChB;AAWD,wBAAgB,SAAS,IAAI,IAAI,CAGhC;AAED,wBAAgB,UAAU,IAAI,MAAM,CAYnC;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAG/C;AAID,wBAAgB,YAAY,IAAI,GAAG,EAAE,CAUpC;AAED,wBAAgB,YAAY,CAAC,QAAQ,EAAE,GAAG,EAAE,GAAG,IAAI,CAGlD;AAED,wBAAgB,aAAa,IAAI,IAAI,CAEpC;AAID,wBAAgB,YAAY,CAAC,QAAQ,EAAE,GAAG,EAAE,GAAG,MAAM,CAQpD;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED,wBAAgB,aAAa,IAAI,YAAY,EAAE,CAa9C;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,GAAG,EAAE,CAUhD"}
package/dist/config.js ADDED
@@ -0,0 +1,90 @@
1
+ import { existsSync, readFileSync, writeFileSync, mkdirSync, readdirSync } from "node:fs";
2
+ import { homedir } from "node:os";
3
+ import { join } from "node:path";
4
+ // ==================== 路径 ====================
5
+ const AIR_DIR = () => join(homedir(), ".ai-zen", "air");
6
+ const CONFIG_FILE = () => join(AIR_DIR(), "config.json");
7
+ const CONTEXT_FILE = () => join(AIR_DIR(), "context.json");
8
+ const SNAPSHOTS_DIR = () => join(AIR_DIR(), "snapshots");
9
+ // ==================== 配置(只有 apiKey) ====================
10
+ export function ensureDir() {
11
+ const d = AIR_DIR();
12
+ if (!existsSync(d))
13
+ mkdirSync(d, { recursive: true });
14
+ }
15
+ export function readConfig() {
16
+ ensureDir();
17
+ const f = CONFIG_FILE();
18
+ if (!existsSync(f)) {
19
+ writeFileSync(f, JSON.stringify({ apiKey: "" }, null, 2), "utf-8");
20
+ return { apiKey: "" };
21
+ }
22
+ try {
23
+ return { apiKey: JSON.parse(readFileSync(f, "utf-8")).apiKey || "" };
24
+ }
25
+ catch {
26
+ return { apiKey: "" };
27
+ }
28
+ }
29
+ export function saveConfig(apiKey) {
30
+ ensureDir();
31
+ writeFileSync(CONFIG_FILE(), JSON.stringify({ apiKey }, null, 2), "utf-8");
32
+ }
33
+ // ==================== 唯一上下文(就是 messages 数组) ====================
34
+ export function readMessages() {
35
+ ensureDir();
36
+ const f = CONTEXT_FILE();
37
+ if (!existsSync(f))
38
+ return [];
39
+ try {
40
+ const data = JSON.parse(readFileSync(f, "utf-8"));
41
+ return Array.isArray(data) ? data : [];
42
+ }
43
+ catch {
44
+ return [];
45
+ }
46
+ }
47
+ export function saveMessages(messages) {
48
+ ensureDir();
49
+ writeFileSync(CONTEXT_FILE(), JSON.stringify(messages, null, 2), "utf-8");
50
+ }
51
+ export function clearMessages() {
52
+ saveMessages([]);
53
+ }
54
+ // ==================== 快照(以 ISO 时间命名,存到 snapshots 目录) ====================
55
+ export function saveSnapshot(messages) {
56
+ ensureDir();
57
+ const d = SNAPSHOTS_DIR();
58
+ if (!existsSync(d))
59
+ mkdirSync(d, { recursive: true });
60
+ const name = new Date().toISOString().replace(/[:.]/g, "-");
61
+ const file = join(d, `${name}.json`);
62
+ writeFileSync(file, JSON.stringify(messages, null, 2), "utf-8");
63
+ return name;
64
+ }
65
+ export function listSnapshots() {
66
+ const d = SNAPSHOTS_DIR();
67
+ if (!existsSync(d))
68
+ return [];
69
+ const files = readdirSync(d).filter((f) => f.endsWith(".json")).sort().reverse();
70
+ return files.map((f) => {
71
+ const name = f.replace(/\.json$/, "");
72
+ const isoStr = name.replace(/^(\d{4}-\d{2}-\d{2})T(\d{2})-(\d{2})-(\d{2})-(\d{3})Z$/, "$1T$2:$3:$4.$5Z");
73
+ const date = new Date(isoStr).toLocaleString("zh-CN");
74
+ return { name, date };
75
+ });
76
+ }
77
+ export function loadSnapshot(name) {
78
+ const d = SNAPSHOTS_DIR();
79
+ const file = join(d, `${name}.json`);
80
+ if (!existsSync(file))
81
+ return [];
82
+ try {
83
+ const data = JSON.parse(readFileSync(file, "utf-8"));
84
+ return Array.isArray(data) ? data : [];
85
+ }
86
+ catch {
87
+ return [];
88
+ }
89
+ }
90
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import { AgentNS } from "@ai-zen/agents-core";
2
+ export interface DeltaRendererOptions {
3
+ reasoningHeader?: string;
4
+ contentHeader?: string;
5
+ reasoningStyle?: any;
6
+ contentStyle?: any;
7
+ indent?: string;
8
+ }
9
+ export declare class DeltaRenderer {
10
+ private reasoningPrinted;
11
+ private contentPrinted;
12
+ private toolPrints;
13
+ private opts;
14
+ constructor(opts?: DeltaRendererOptions);
15
+ render(delta: AgentNS.Delta, finishReason?: AgentNS.FinishReason | null): void;
16
+ reset(): void;
17
+ private renderToolCalls;
18
+ }
19
+ //# sourceMappingURL=delta-renderer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delta-renderer.d.ts","sourceRoot":"","sources":["../src/delta-renderer.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAU9C,MAAM,WAAW,oBAAoB;IACnC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,GAAG,CAAC;IACrB,YAAY,CAAC,EAAE,GAAG,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,aAAa;IACxB,OAAO,CAAC,gBAAgB,CAAS;IACjC,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,UAAU,CAAqC;IACvD,OAAO,CAAC,IAAI,CAAiC;gBAEjC,IAAI,GAAE,oBAAyB;IAU3C,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,YAAY,GAAE,OAAO,CAAC,YAAY,GAAG,IAAW,GAAG,IAAI;IA4BpF,KAAK,IAAI,IAAI;IAMb,OAAO,CAAC,eAAe;CAyDxB"}