@ai-zen/air 0.2.1 → 0.2.2

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 (58) hide show
  1. package/README.md +21 -6
  2. package/README.zh.md +31 -6
  3. package/dist/chat/commands/back.d.ts +2 -2
  4. package/dist/chat/commands/back.d.ts.map +1 -1
  5. package/dist/chat/commands/back.js.map +1 -1
  6. package/dist/chat/commands/editor.d.ts +2 -2
  7. package/dist/chat/commands/editor.d.ts.map +1 -1
  8. package/dist/chat/commands/editor.js.map +1 -1
  9. package/dist/chat/commands/exit.d.ts +2 -2
  10. package/dist/chat/commands/exit.d.ts.map +1 -1
  11. package/dist/chat/commands/exit.js.map +1 -1
  12. package/dist/chat/commands/index.d.ts +3 -0
  13. package/dist/chat/commands/index.d.ts.map +1 -0
  14. package/dist/chat/commands/index.js +37 -0
  15. package/dist/chat/commands/index.js.map +1 -0
  16. package/dist/chat/commands/load.d.ts +2 -2
  17. package/dist/chat/commands/load.d.ts.map +1 -1
  18. package/dist/chat/commands/load.js +1 -3
  19. package/dist/chat/commands/load.js.map +1 -1
  20. package/dist/chat/commands/new.d.ts +2 -2
  21. package/dist/chat/commands/new.d.ts.map +1 -1
  22. package/dist/chat/commands/new.js +8 -3
  23. package/dist/chat/commands/new.js.map +1 -1
  24. package/dist/chat/commands/save.d.ts +2 -2
  25. package/dist/chat/commands/save.d.ts.map +1 -1
  26. package/dist/chat/commands/save.js.map +1 -1
  27. package/dist/chat/message.d.ts +2 -2
  28. package/dist/chat/message.d.ts.map +1 -1
  29. package/dist/chat/message.js +1 -1
  30. package/dist/chat/message.js.map +1 -1
  31. package/dist/chat/runtime.d.ts +1 -1
  32. package/dist/chat/runtime.d.ts.map +1 -1
  33. package/dist/chat/runtime.js +23 -6
  34. package/dist/chat/runtime.js.map +1 -1
  35. package/dist/chat/shared.d.ts +6 -0
  36. package/dist/chat/shared.d.ts.map +1 -0
  37. package/dist/chat/shared.js +16 -0
  38. package/dist/chat/shared.js.map +1 -0
  39. package/dist/cli.js +2 -2
  40. package/dist/cli.js.map +1 -1
  41. package/package.json +1 -1
  42. package/src/__tests__/{session.test.ts → chat.test.ts} +16 -16
  43. package/src/{session → chat}/commands/back.ts +2 -2
  44. package/src/{session → chat}/commands/editor.ts +2 -2
  45. package/src/chat/commands/exit.ts +6 -0
  46. package/src/chat/commands/index.ts +38 -0
  47. package/src/{session → chat}/commands/load.ts +2 -2
  48. package/src/chat/commands/new.ts +12 -0
  49. package/src/{session → chat}/commands/save.ts +2 -2
  50. package/src/{session → chat}/message.ts +2 -2
  51. package/src/{session → chat}/runtime.ts +24 -6
  52. package/src/chat/shared.ts +21 -0
  53. package/src/cli.ts +2 -2
  54. package/src/session/commands/exit.ts +0 -6
  55. package/src/session/commands/new.ts +0 -7
  56. package/src/session/shared.ts +0 -83
  57. /package/src/{session → chat}/commands/help.ts +0 -0
  58. /package/src/{session → chat}/print.ts +0 -0
package/README.md CHANGED
@@ -85,20 +85,35 @@ $ gred "hello" file.txt
85
85
  ```
86
86
  src/
87
87
  ├── cli.ts # CLI entry, commander
88
- ├── config.ts # Config read/write
89
- ├── delta-renderer.ts # Stream renderer (from agents project)
88
+ ├── config.ts # Config, context, snapshot read/write
89
+ ├── delta-renderer.ts # Stream renderer
90
+ ├── hook.ts # Fallback terminal hook (install/uninstall)
91
+ ├── migration.ts # Context counting & migration
90
92
  ├── tools.ts # Tool definitions — shell
91
93
  ├── agent-factory.ts # Agent factory — build model & agent
92
- ├── migration.ts # Context counting & migration
93
- ├── agent-runtime.ts # Runtime conversation loop & commands
94
- ├── hook.ts # Fallback terminal hook (install/uninstall)
94
+ ├── chat/
95
+ ├── shared.ts # ChatCtx type & SYSTEM_PROMPT
96
+ ├── runtime.ts # runChat() & chatLoop() — core runtime
97
+ │ ├── message.ts # handleMessage() — send & migrate
98
+ │ ├── print.ts # sendAndPrint() — stream output
99
+ │ └── commands/
100
+ │ ├── index.ts # dispatchCommand() — command router
101
+ │ ├── back.ts # /back — recall & resend
102
+ │ ├── editor.ts # /editor — multi-line input
103
+ │ ├── exit.ts # /exit — quit
104
+ │ ├── help.ts # /help
105
+ │ ├── load.ts # /load — load snapshot
106
+ │ ├── new.ts # /new — new session
107
+ │ └── save.ts # /save — save snapshot
95
108
  └── __tests__/
109
+ ├── chat.test.ts # Chat session tests
96
110
  ├── config.test.ts # Config/context/snapshot tests
97
111
  ├── main.test.ts # contextSize/shouldMigrate tests
112
+ ├── e2e.test.ts # End-to-end tests
98
113
  └── tools.test.ts # Shell tool structure tests
99
114
  ```
100
115
 
101
- ~46 KB, 870 lines.
116
+ ~49 KB, 881 lines.
102
117
 
103
118
  ## Tests
104
119
 
package/README.zh.md CHANGED
@@ -52,6 +52,16 @@ air hook uninstall
52
52
  | `/editor` | 打开系统编辑器输入多行文本 |
53
53
  | `/help` | 帮助 |
54
54
 
55
+ ### 兜底终端钩子
56
+
57
+ 安装后,任何 shell 中不存在的命令都会自动转发到 `air`,AI 会解读你的意图并帮助你。
58
+
59
+ ```bash
60
+ $ gred "hello" file.txt
61
+ # → command not found → 自动转发到 air
62
+ # → AI: "你是不是想用 grep?"
63
+ ```
64
+
55
65
  ## 设计
56
66
 
57
67
  ```
@@ -75,20 +85,35 @@ air hook uninstall
75
85
  ```
76
86
  src/
77
87
  ├── cli.ts # CLI 入口,commander
78
- ├── config.ts # 配置与文件读写
79
- ├── delta-renderer.ts # 流式渲染器(复用自 agents 项目)
88
+ ├── config.ts # 配置、上下文、快照读写
89
+ ├── delta-renderer.ts # 流式渲染器
90
+ ├── hook.ts # 兜底终端钩子(install/uninstall)
91
+ ├── migration.ts # 上下文计数与迁移
80
92
  ├── tools.ts # 工具定义——shell
81
93
  ├── agent-factory.ts # Agent 工厂——构建模型与 Agent
82
- ├── migration.ts # 上下文计数与任务迁移
83
- ├── agent-runtime.ts # 运行时——对话循环与命令处理
84
- ├── hook.ts # 兜底终端钩子(install/uninstall)
94
+ ├── chat/
95
+ ├── shared.ts # ChatCtx 类型 & SYSTEM_PROMPT
96
+ ├── runtime.ts # runChat() & chatLoop() — 核心运行时
97
+ │ ├── message.ts # handleMessage() — 发送与迁移
98
+ │ ├── print.ts # sendAndPrint() — 流式输出
99
+ │ └── commands/
100
+ │ ├── index.ts # dispatchCommand() — 命令分发入口
101
+ │ ├── back.ts # /back — 撤回消息
102
+ │ ├── editor.ts # /editor — 多行编辑器输入
103
+ │ ├── exit.ts # /exit — 退出
104
+ │ ├── help.ts # /help
105
+ │ ├── load.ts # /load — 加载快照
106
+ │ ├── new.ts # /new — 新会话
107
+ │ └── save.ts # /save — 保存快照
85
108
  └── __tests__/
109
+ ├── chat.test.ts # 聊天测试
86
110
  ├── config.test.ts # 配置/上下文/快照测试
87
111
  ├── main.test.ts # contextSize/shouldMigrate 测试
112
+ ├── e2e.test.ts # 端到端测试
88
113
  └── tools.test.ts # shell 工具结构测试
89
114
  ```
90
115
 
91
- 46 KB,870 行。
116
+ 49 KB,881 行。
92
117
 
93
118
  ## 测试
94
119
 
@@ -1,3 +1,3 @@
1
- import type { SessionCtx } from "../session.js";
2
- export declare function cmdBack(ctx: SessionCtx): Promise<void>;
1
+ import type { ChatCtx } from "../shared.js";
2
+ export declare function cmdBack(ctx: ChatCtx): Promise<void>;
3
3
  //# sourceMappingURL=back.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"back.d.ts","sourceRoot":"","sources":["../../../src/chat/commands/back.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAKhD,wBAAsB,OAAO,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAmF5D"}
1
+ {"version":3,"file":"back.d.ts","sourceRoot":"","sources":["../../../src/chat/commands/back.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAK5C,wBAAsB,OAAO,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAmFzD"}
@@ -1 +1 @@
1
- {"version":3,"file":"back.js","sourceRoot":"","sources":["../../../src/chat/commands/back.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"back.js","sourceRoot":"","sources":["../../../src/chat/commands/back.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,3 @@
1
- import type { SessionCtx } from "../session.js";
2
- export declare function cmdEditor(ctx: SessionCtx): Promise<void>;
1
+ import type { ChatCtx } from "../shared.js";
2
+ export declare function cmdEditor(ctx: ChatCtx): Promise<void>;
3
3
  //# sourceMappingURL=editor.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"editor.d.ts","sourceRoot":"","sources":["../../../src/chat/commands/editor.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAIhD,wBAAsB,SAAS,CAAC,GAAG,EAAE,UAAU,iBAY9C"}
1
+ {"version":3,"file":"editor.d.ts","sourceRoot":"","sources":["../../../src/chat/commands/editor.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAI5C,wBAAsB,SAAS,CAAC,GAAG,EAAE,OAAO,iBAY3C"}
@@ -1 +1 @@
1
- {"version":3,"file":"editor.js","sourceRoot":"","sources":["../../../src/chat/commands/editor.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,UAAU,CAAC;AAEhC,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAE/C,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,GAAe;IAC7C,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC;QACxC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE;KACtD,CAAC,CAAC;IACH,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;QACpB,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACvB,OAAO;IACT,CAAC;IACD,IAAI,CAAC;QACH,MAAM,YAAY,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;QAC9C,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IACnC,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAAC,OAAO,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;IAAC,CAAC;AAC7D,CAAC"}
1
+ {"version":3,"file":"editor.js","sourceRoot":"","sources":["../../../src/chat/commands/editor.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,UAAU,CAAC;AAEhC,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAE/C,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,GAAY;IAC1C,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC;QACxC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE;KACtD,CAAC,CAAC;IACH,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;QACpB,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACvB,OAAO;IACT,CAAC;IACD,IAAI,CAAC;QACH,MAAM,YAAY,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;QAC9C,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IACnC,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAAC,OAAO,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;IAAC,CAAC;AAC7D,CAAC"}
@@ -1,3 +1,3 @@
1
- import type { SessionCtx } from "../session.js";
2
- export declare function cmdExit(ctx: SessionCtx): Promise<void>;
1
+ import type { ChatCtx } from "../shared.js";
2
+ export declare function cmdExit(ctx: ChatCtx): Promise<void>;
3
3
  //# sourceMappingURL=exit.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"exit.d.ts","sourceRoot":"","sources":["../../../src/chat/commands/exit.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAEhD,wBAAsB,OAAO,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAG5D"}
1
+ {"version":3,"file":"exit.d.ts","sourceRoot":"","sources":["../../../src/chat/commands/exit.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAE5C,wBAAsB,OAAO,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAGzD"}
@@ -1 +1 @@
1
- {"version":3,"file":"exit.js","sourceRoot":"","sources":["../../../src/chat/commands/exit.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,GAAe;IAC3C,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IACxB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC"}
1
+ {"version":3,"file":"exit.js","sourceRoot":"","sources":["../../../src/chat/commands/exit.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,GAAY;IACxC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IACxB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { ChatCtx } from "../shared.js";
2
+ export declare function dispatchCommand(ctx: ChatCtx, cmd: string): Promise<void>;
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/chat/commands/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAS5C,wBAAsB,eAAe,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA4B9E"}
@@ -0,0 +1,37 @@
1
+ import { cmdExit } from "./exit.js";
2
+ import { cmdHelp } from "./help.js";
3
+ import { cmdSave } from "./save.js";
4
+ import { cmdNew } from "./new.js";
5
+ import { cmdLoad } from "./load.js";
6
+ import { cmdEditor } from "./editor.js";
7
+ import { cmdBack } from "./back.js";
8
+ export async function dispatchCommand(ctx, cmd) {
9
+ switch (cmd) {
10
+ case "/exit":
11
+ case "/quit":
12
+ cmdExit(ctx);
13
+ break;
14
+ case "/save":
15
+ await cmdSave(ctx);
16
+ break;
17
+ case "/new":
18
+ await cmdNew(ctx);
19
+ break;
20
+ case "/load":
21
+ await cmdLoad(ctx);
22
+ break;
23
+ case "/back":
24
+ await cmdBack(ctx);
25
+ break;
26
+ case "/editor":
27
+ await cmdEditor(ctx);
28
+ break;
29
+ case "/help":
30
+ cmdHelp();
31
+ break;
32
+ default:
33
+ console.log(`\n❌ 未知命令: ${cmd}\n`);
34
+ break;
35
+ }
36
+ }
37
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/chat/commands/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,GAAY,EAAE,GAAW;IAC7D,QAAQ,GAAG,EAAE,CAAC;QACZ,KAAK,OAAO,CAAC;QACb,KAAK,OAAO;YACV,OAAO,CAAC,GAAG,CAAC,CAAC;YACb,MAAM;QACR,KAAK,OAAO;YACV,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC;YACnB,MAAM;QACR,KAAK,MAAM;YACT,MAAM,MAAM,CAAC,GAAG,CAAC,CAAC;YAClB,MAAM;QACR,KAAK,OAAO;YACV,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC;YACnB,MAAM;QACR,KAAK,OAAO;YACV,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC;YACnB,MAAM;QACR,KAAK,SAAS;YACZ,MAAM,SAAS,CAAC,GAAG,CAAC,CAAC;YACrB,MAAM;QACR,KAAK,OAAO;YACV,OAAO,EAAE,CAAC;YACV,MAAM;QACR;YACE,OAAO,CAAC,GAAG,CAAC,aAAa,GAAG,IAAI,CAAC,CAAC;YAClC,MAAM;IACV,CAAC;AACH,CAAC"}
@@ -1,3 +1,3 @@
1
- import type { SessionCtx } from "../session.js";
2
- export declare function cmdLoad(ctx: SessionCtx): Promise<void>;
1
+ import type { ChatCtx } from "../shared.js";
2
+ export declare function cmdLoad(ctx: ChatCtx): Promise<void>;
3
3
  //# sourceMappingURL=load.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"load.d.ts","sourceRoot":"","sources":["../../../src/chat/commands/load.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAKhD,wBAAsB,OAAO,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAgC5D"}
1
+ {"version":3,"file":"load.d.ts","sourceRoot":"","sources":["../../../src/chat/commands/load.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAK5C,wBAAsB,OAAO,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CA8BzD"}
@@ -1,13 +1,12 @@
1
1
  import { Message } from "@ai-zen/agents-core";
2
2
  import inquirer from "inquirer";
3
- import { SYSTEM_PROMPT } from "../session.js";
3
+ import { SYSTEM_PROMPT } from "../shared.js";
4
4
  import { listSnapshots, loadSnapshot, saveMessages } from "../../config.js";
5
5
  import { buildAgent } from "../../agent-factory.js";
6
6
  export async function cmdLoad(ctx) {
7
7
  const snapshots = listSnapshots();
8
8
  if (snapshots.length === 0) {
9
9
  console.log("\n📭 没有可用的快照\n");
10
- ctx.agent = await buildAgent([]);
11
10
  return;
12
11
  }
13
12
  const { selectedName } = await inquirer.prompt([
@@ -24,7 +23,6 @@ export async function cmdLoad(ctx) {
24
23
  ]);
25
24
  if (!selectedName) {
26
25
  console.log("\n已取消\n");
27
- ctx.agent = await buildAgent([]);
28
26
  return;
29
27
  }
30
28
  let loaded = loadSnapshot(selectedName);
@@ -1 +1 @@
1
- {"version":3,"file":"load.js","sourceRoot":"","sources":["../../../src/chat/commands/load.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC9C,OAAO,QAAQ,MAAM,UAAU,CAAC;AAEhC,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC5E,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAEpD,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,GAAe;IAC3C,MAAM,SAAS,GAAG,aAAa,EAAE,CAAC;IAClC,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3B,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;QAC9B,GAAG,CAAC,KAAK,GAAG,MAAM,UAAU,CAAC,EAAE,CAAC,CAAC;QACjC,OAAO;IACT,CAAC;IACD,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC;QAC7C;YACE,IAAI,EAAE,MAAM;YACZ,IAAI,EAAE,cAAc;YACpB,OAAO,EAAE,WAAW;YACpB,QAAQ,EAAE,EAAE;YACZ,OAAO,EAAE;gBACP,EAAE,IAAI,EAAE,oBAAoB,EAAE,KAAK,EAAE,EAAE,EAAE;gBACzC,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;aAC3D;SACF;KACF,CAAC,CAAC;IACH,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACvB,GAAG,CAAC,KAAK,GAAG,MAAM,UAAU,CAAC,EAAE,CAAC,CAAC;QACjC,OAAO;IACT,CAAC;IACD,IAAI,MAAM,GAAG,YAAY,CAAC,YAAY,CAAC,CAAC;IACxC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,MAAM,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC;IAC3C,CAAC;IACD,YAAY,CAAC,MAAM,CAAC,CAAC;IACrB,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,YAAY,CAAC,CAAC;IAC5D,OAAO,CAAC,GAAG,CAAC,aAAa,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,GAAG,IAAI,CAAC,CAAC;IACtE,GAAG,CAAC,KAAK,GAAG,MAAM,UAAU,CAAC,MAAM,CAAC,CAAC;AACvC,CAAC"}
1
+ {"version":3,"file":"load.js","sourceRoot":"","sources":["../../../src/chat/commands/load.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC9C,OAAO,QAAQ,MAAM,UAAU,CAAC;AAEhC,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC5E,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAEpD,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,GAAY;IACxC,MAAM,SAAS,GAAG,aAAa,EAAE,CAAC;IAClC,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3B,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;QAC9B,OAAO;IACT,CAAC;IACD,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC;QAC7C;YACE,IAAI,EAAE,MAAM;YACZ,IAAI,EAAE,cAAc;YACpB,OAAO,EAAE,WAAW;YACpB,QAAQ,EAAE,EAAE;YACZ,OAAO,EAAE;gBACP,EAAE,IAAI,EAAE,oBAAoB,EAAE,KAAK,EAAE,EAAE,EAAE;gBACzC,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;aAC3D;SACF;KACF,CAAC,CAAC;IACH,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACvB,OAAO;IACT,CAAC;IACD,IAAI,MAAM,GAAG,YAAY,CAAC,YAAY,CAAC,CAAC;IACxC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,MAAM,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC;IAC3C,CAAC;IACD,YAAY,CAAC,MAAM,CAAC,CAAC;IACrB,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,YAAY,CAAC,CAAC;IAC5D,OAAO,CAAC,GAAG,CAAC,aAAa,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,GAAG,IAAI,CAAC,CAAC;IACtE,GAAG,CAAC,KAAK,GAAG,MAAM,UAAU,CAAC,MAAM,CAAC,CAAC;AACvC,CAAC"}
@@ -1,3 +1,3 @@
1
- import type { SessionCtx } from "../session.js";
2
- export declare function cmdNew(ctx: SessionCtx): Promise<void>;
1
+ import type { ChatCtx } from "../shared.js";
2
+ export declare function cmdNew(ctx: ChatCtx): Promise<void>;
3
3
  //# sourceMappingURL=new.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"new.d.ts","sourceRoot":"","sources":["../../../src/chat/commands/new.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAGhD,wBAAsB,MAAM,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAG3D"}
1
+ {"version":3,"file":"new.d.ts","sourceRoot":"","sources":["../../../src/chat/commands/new.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAM5C,wBAAsB,MAAM,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAKxD"}
@@ -1,6 +1,11 @@
1
- import { saveAndNew } from "../session.js";
1
+ import { Message } from "@ai-zen/agents-core";
2
+ import { saveMessages } from "../../config.js";
3
+ import { buildAgent } from "../../agent-factory.js";
4
+ import { SYSTEM_PROMPT } from "../shared.js";
2
5
  export async function cmdNew(ctx) {
3
- await saveAndNew(ctx);
4
- console.log("\n🆕 重新开始\n");
6
+ const msgs = [Message.System(SYSTEM_PROMPT)];
7
+ saveMessages(msgs);
8
+ ctx.agent = await buildAgent(msgs);
9
+ console.log("\n🆕 新会话\n");
5
10
  }
6
11
  //# sourceMappingURL=new.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"new.js","sourceRoot":"","sources":["../../../src/chat/commands/new.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAE3C,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,GAAe;IAC1C,MAAM,UAAU,CAAC,GAAG,CAAC,CAAC;IACtB,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;AAC7B,CAAC"}
1
+ {"version":3,"file":"new.js","sourceRoot":"","sources":["../../../src/chat/commands/new.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAE7C,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,GAAY;IACvC,MAAM,IAAI,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC;IAC7C,YAAY,CAAC,IAAI,CAAC,CAAC;IACnB,GAAG,CAAC,KAAK,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,CAAC;IACnC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;AAC5B,CAAC"}
@@ -1,3 +1,3 @@
1
- import type { SessionCtx } from "../session.js";
2
- export declare function cmdSave(ctx: SessionCtx): Promise<void>;
1
+ import type { ChatCtx } from "../shared.js";
2
+ export declare function cmdSave(ctx: ChatCtx): Promise<void>;
3
3
  //# sourceMappingURL=save.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"save.d.ts","sourceRoot":"","sources":["../../../src/chat/commands/save.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAGhD,wBAAsB,OAAO,CAAC,GAAG,EAAE,UAAU,iBAE5C"}
1
+ {"version":3,"file":"save.d.ts","sourceRoot":"","sources":["../../../src/chat/commands/save.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAG5C,wBAAsB,OAAO,CAAC,GAAG,EAAE,OAAO,iBAEzC"}
@@ -1 +1 @@
1
- {"version":3,"file":"save.js","sourceRoot":"","sources":["../../../src/chat/commands/save.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAE/C,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,GAAe;IAC3C,OAAO,CAAC,GAAG,CAAC,WAAW,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;AAC/D,CAAC"}
1
+ {"version":3,"file":"save.js","sourceRoot":"","sources":["../../../src/chat/commands/save.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAE/C,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,GAAY;IACxC,OAAO,CAAC,GAAG,CAAC,WAAW,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;AAC/D,CAAC"}
@@ -1,3 +1,3 @@
1
- import type { SessionCtx } from "./session.js";
2
- export declare function handleMessage(ctx: SessionCtx, text: string): Promise<void>;
1
+ import type { ChatCtx } from "./shared.js";
2
+ export declare function handleMessage(ctx: ChatCtx, text: string): Promise<void>;
3
3
  //# sourceMappingURL=message.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"message.d.ts","sourceRoot":"","sources":["../../src/chat/message.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAO/C,wBAAsB,aAAa,CAAC,GAAG,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAkBhF"}
1
+ {"version":3,"file":"message.d.ts","sourceRoot":"","sources":["../../src/chat/message.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAO3C,wBAAsB,aAAa,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAkB7E"}
@@ -1,5 +1,5 @@
1
1
  import { Message } from "@ai-zen/agents-core";
2
- import { SYSTEM_PROMPT } from "./session.js";
2
+ import { SYSTEM_PROMPT } from "./shared.js";
3
3
  import { sendAndPrint } from "./print.js";
4
4
  import { saveMessages, saveSnapshot } from "../config.js";
5
5
  import { buildAgent } from "../agent-factory.js";
@@ -1 +1 @@
1
- {"version":3,"file":"message.js","sourceRoot":"","sources":["../../src/chat/message.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAE9C,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAEtG,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,GAAe,EAAE,IAAY;IAC/D,IAAI,CAAC;QACH,MAAM,YAAY,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QACpC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAEjC,IAAI,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC;YACtC,OAAO,CAAC,GAAG,CAAC,UAAU,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,iBAAiB,UAAU,CAAC,CAAC;YACtF,IAAI,CAAC;gBACH,MAAM,IAAI,GAAG,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;gBAC9C,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC;gBAChC,MAAM,OAAO,GAAG,MAAM,oBAAoB,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;gBAC/D,MAAM,IAAI,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;gBACpE,YAAY,CAAC,IAAI,CAAC,CAAC;gBACnB,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;gBACxB,GAAG,CAAC,KAAK,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,CAAC;YACrC,CAAC;YAAC,OAAO,GAAQ,EAAE,CAAC;gBAAC,OAAO,CAAC,KAAK,CAAC,WAAW,GAAG,CAAC,OAAO,IAAI,CAAC,CAAC;YAAC,CAAC;QACnE,CAAC;IACH,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAAC,OAAO,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;IAAC,CAAC;AAC7D,CAAC"}
1
+ {"version":3,"file":"message.js","sourceRoot":"","sources":["../../src/chat/message.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAE9C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAEtG,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,GAAY,EAAE,IAAY;IAC5D,IAAI,CAAC;QACH,MAAM,YAAY,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QACpC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAEjC,IAAI,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC;YACtC,OAAO,CAAC,GAAG,CAAC,UAAU,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,iBAAiB,UAAU,CAAC,CAAC;YACtF,IAAI,CAAC;gBACH,MAAM,IAAI,GAAG,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;gBAC9C,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC;gBAChC,MAAM,OAAO,GAAG,MAAM,oBAAoB,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;gBAC/D,MAAM,IAAI,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;gBACpE,YAAY,CAAC,IAAI,CAAC,CAAC;gBACnB,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;gBACxB,GAAG,CAAC,KAAK,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,CAAC;YACrC,CAAC;YAAC,OAAO,GAAQ,EAAE,CAAC;gBAAC,OAAO,CAAC,KAAK,CAAC,WAAW,GAAG,CAAC,OAAO,IAAI,CAAC,CAAC;YAAC,CAAC;QACnE,CAAC;IACH,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAAC,OAAO,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;IAAC,CAAC;AAC7D,CAAC"}
@@ -1,2 +1,2 @@
1
- export declare function runConversation(initialMessage?: string): Promise<void>;
1
+ export declare function runChat(initialMessage?: string): Promise<void>;
2
2
  //# sourceMappingURL=runtime.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../src/chat/runtime.ts"],"names":[],"mappings":"AAOA,wBAAsB,eAAe,CAAC,cAAc,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAwC5E"}
1
+ {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../src/chat/runtime.ts"],"names":[],"mappings":"AAyBA,wBAAsB,OAAO,CAAC,cAAc,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAuCpE"}
@@ -1,10 +1,28 @@
1
1
  import { Message } from "@ai-zen/agents-core";
2
+ import inquirer from "inquirer";
2
3
  import { readConfig, readMessages, saveMessages, saveSnapshot } from "../config.js";
3
4
  import { buildAgent } from "../agent-factory.js";
4
5
  import { contextSize } from "../migration.js";
5
- import { SYSTEM_PROMPT, saveAndNew, ask } from "./session.js";
6
+ import { SYSTEM_PROMPT } from "./shared.js";
7
+ import { dispatchCommand } from "./commands/index.js";
8
+ import { handleMessage } from "./message.js";
6
9
  import { sendAndPrint } from "./print.js";
7
- export async function runConversation(initialMessage) {
10
+ async function chatLoop(ctx) {
11
+ while (true) {
12
+ const { input } = await inquirer.prompt([
13
+ { type: "input", name: "input", message: "你:" },
14
+ ]);
15
+ const t = input.trim();
16
+ if (!t)
17
+ continue;
18
+ if (t.startsWith("/")) {
19
+ await dispatchCommand(ctx, t.toLowerCase());
20
+ continue;
21
+ }
22
+ await handleMessage(ctx, t);
23
+ }
24
+ }
25
+ export async function runChat(initialMessage) {
8
26
  const config = readConfig();
9
27
  if (!config.apiKey) {
10
28
  console.error("❌ 请先设置 API Key: air key <your-key>");
@@ -24,7 +42,7 @@ export async function runConversation(initialMessage) {
24
42
  const snap = saveSnapshot(ctx.agent.messages);
25
43
  console.log(`💾 已存档旧对话: ${snap}\n`);
26
44
  }
27
- await saveAndNew(ctx);
45
+ await dispatchCommand(ctx, "/new");
28
46
  console.log(`💬 你: ${initialMessage}`);
29
47
  try {
30
48
  await sendAndPrint(ctx.agent, initialMessage);
@@ -34,14 +52,13 @@ export async function runConversation(initialMessage) {
34
52
  console.error(`\n❌ ${err.message}`);
35
53
  }
36
54
  console.log("\n💬 继续对话 (输入 /exit 退出)\n");
37
- await ask(ctx);
55
+ await chatLoop(ctx);
38
56
  return;
39
57
  }
40
58
  const msgCount = ctx.agent.messages.filter((m) => m.role !== "system").length;
41
59
  console.log(msgCount > 0
42
60
  ? `\n💬 继续上次对话 (${msgCount} 条,/${contextSize(ctx.agent.messages)} 字符,输入 /new 重新开始)\n`
43
61
  : "\n💬 air — 极简 AI 助手 (输入 /help 查看命令)\n");
44
- await ask(ctx);
45
- process.on("SIGINT", () => { console.log("\n\n👋 再见!"); process.exit(0); });
62
+ await chatLoop(ctx);
46
63
  }
47
64
  //# sourceMappingURL=runtime.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../src/chat/runtime.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../src/chat/runtime.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import { Agent } from "@ai-zen/agents-core";
2
+ export interface ChatCtx {
3
+ agent: Agent;
4
+ }
5
+ export declare const SYSTEM_PROMPT: string;
6
+ //# sourceMappingURL=shared.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../src/chat/shared.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAE5C,MAAM,WAAW,OAAO;IACtB,KAAK,EAAE,KAAK,CAAC;CACd;AAED,eAAO,MAAM,aAAa,QAcd,CAAC"}
@@ -0,0 +1,16 @@
1
+ export const SYSTEM_PROMPT = [
2
+ "你是一个AI助手,专门帮助用户回答问题和执行任务。请用中文回复。",
3
+ "",
4
+ "## 行为准则",
5
+ "1. 做任何改动之前,必须先跟用户商量,获得明确指示之后再行动。",
6
+ "2. 用户没有明确要求产出文件时,不得自行创建任何文件到项目中。讨论就停留在讨论层面。",
7
+ "3. 区分危险操作:删除文件、覆盖文件、安装卸载软件、修改系统配置、执行耗时任务等属于危险操作。执行前必须评估影响范围,并向用户说明风险,获得用户明确的书面的确认之后再执行。",
8
+ "4. 追责原则:你的每一步操作都应当基于用户的明确指令。如果出了问题,可以从用户说过的话追溯责任——是用户让你做的,用户承担责任。所以你不需要畏手畏脚,只要用户明确说了\u201c做\u201d,你就放心去做。",
9
+ "",
10
+ "## 记忆",
11
+ "你可以使用 shell 工具执行任何命令。如果你有需要长期记住的信息(用户偏好、项目约定、任务进度等),请写入以下位置:",
12
+ "- 全局记忆: ~/.ai-zen/air/temp/*.md",
13
+ "- 项目记忆: $(cwd)/.ai-zen/air/temp/*.md",
14
+ "下次启动时用 shell 读取即可。这是你唯一的记忆方式。",
15
+ ].join("\n");
16
+ //# sourceMappingURL=shared.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared.js","sourceRoot":"","sources":["../../src/chat/shared.ts"],"names":[],"mappings":"AAMA,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,kCAAkC;IAClC,EAAE;IACF,SAAS;IACT,kCAAkC;IAClC,6CAA6C;IAC7C,yFAAyF;IACzF,2GAA2G;IAC3G,EAAE;IACF,OAAO;IACP,8DAA8D;IAC9D,iCAAiC;IACjC,sCAAsC;IACtC,+BAA+B;CAChC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC"}
package/dist/cli.js CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import { readFileSync } from "node:fs";
3
3
  import { Command } from "commander";
4
- import { runConversation } from "./session/runtime.js";
4
+ import { runChat } from "./chat/runtime.js";
5
5
  import { installHook, uninstallHook } from "./hook.js";
6
6
  import { readConfig, saveConfig } from "./config.js";
7
7
  const { version } = JSON.parse(readFileSync(new URL("../package.json", import.meta.url), "utf-8"));
@@ -50,7 +50,7 @@ program
50
50
  console.error(" 获取 Key: https://platform.deepseek.com/api_keys");
51
51
  process.exit(1);
52
52
  }
53
- await runConversation(message?.join(" "));
53
+ await runChat(message?.join(" "));
54
54
  });
55
55
  program.parse(process.argv);
56
56
  //# sourceMappingURL=cli.js.map
package/dist/cli.js.map CHANGED
@@ -1 +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,sBAAsB,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AACvD,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,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,8BAA8B,CAAC;KAC3C,QAAQ,CAAC,UAAU,EAAE,qBAAqB,CAAC;KAC3C,MAAM,CAAC,CAAC,MAAc,EAAE,EAAE;IACzB,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,WAAW,EAAE,CAAC;IAChB,CAAC;SAAM,IAAI,MAAM,KAAK,WAAW,EAAE,CAAC;QAClC,aAAa,EAAE,CAAC;IAClB,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,KAAK,CAAC,gCAAgC,CAAC,CAAC;IAClD,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,QAAQ,CAAC,cAAc,EAAE,mBAAmB,CAAC;KAC7C,MAAM,CAAC,KAAK,EAAE,OAAkB,EAAE,EAAE;IACnC,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,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC5C,CAAC,CAAC,CAAC;AAEL,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC"}
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,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AACvD,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,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,8BAA8B,CAAC;KAC3C,QAAQ,CAAC,UAAU,EAAE,qBAAqB,CAAC;KAC3C,MAAM,CAAC,CAAC,MAAc,EAAE,EAAE;IACzB,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,WAAW,EAAE,CAAC;IAChB,CAAC;SAAM,IAAI,MAAM,KAAK,WAAW,EAAE,CAAC;QAClC,aAAa,EAAE,CAAC;IAClB,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,KAAK,CAAC,gCAAgC,CAAC,CAAC;IAClD,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,QAAQ,CAAC,cAAc,EAAE,mBAAmB,CAAC;KAC7C,MAAM,CAAC,KAAK,EAAE,OAAkB,EAAE,EAAE;IACnC,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,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AACpC,CAAC,CAAC,CAAC;AAEL,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ai-zen/air",
3
- "version": "0.2.1",
3
+ "version": "0.2.2",
4
4
  "description": "Minimalist AI CLI assistant \u2014 one shell tool, filesystem memory, auto context migration",
5
5
  "type": "module",
6
6
  "main": "./dist/agent-runtime.js",
@@ -1,5 +1,5 @@
1
1
  import { describe, it, expect, vi, beforeEach } from "vitest";
2
- import type { SessionCtx } from "../session/shared.js";
2
+ import type { ChatCtx } from "../chat/shared.js";
3
3
 
4
4
  // Mock all external dependencies
5
5
  vi.mock("inquirer", () => ({ default: { prompt: vi.fn() } }));
@@ -16,7 +16,7 @@ vi.mock("../agent-factory.js", () => ({
16
16
  send: vi.fn(),
17
17
  })),
18
18
  }));
19
- vi.mock("../session/print.js", () => ({
19
+ vi.mock("../chat/print.js", () => ({
20
20
  sendAndPrint: vi.fn(),
21
21
  }));
22
22
 
@@ -24,18 +24,18 @@ const mockPrompt = vi.mocked((await import("inquirer")).default.prompt);
24
24
  const { saveMessages, saveSnapshot, listSnapshots, loadSnapshot } = await import("../config.js");
25
25
  const { buildAgent } = await import("../agent-factory.js");
26
26
 
27
- function makeCtx(msgs: any[] = []): SessionCtx {
27
+ function makeCtx(msgs: any[] = []): ChatCtx {
28
28
  return { agent: { messages: msgs, events: { on: vi.fn(), off: vi.fn() }, send: vi.fn() } as any };
29
29
  }
30
30
 
31
- // ==================== shared.ts ====================
31
+ // ==================== cmdNew ====================
32
32
 
33
- describe("saveAndNew", () => {
33
+ describe("cmdNew", () => {
34
34
  it("写入 system prompt 并构建 agent", async () => {
35
- const { saveAndNew } = await import("../session/shared.js");
35
+ const { cmdNew } = await import("../chat/commands/new.js");
36
36
  const ctx = makeCtx();
37
37
 
38
- await saveAndNew(ctx);
38
+ await cmdNew(ctx);
39
39
 
40
40
  expect(saveMessages).toHaveBeenCalledWith(
41
41
  expect.arrayContaining([expect.objectContaining({ role: "system" })])
@@ -54,28 +54,28 @@ describe("dispatchCommand", () => {
54
54
 
55
55
  it('"/exit" 调用 cmdExit(process.exit)', async () => {
56
56
  // Can't easily test process.exit, just verify it doesn't throw
57
- const { runConversation } = await import("../session/runtime.js");
57
+ const { runChat } = await import("../chat/runtime.js");
58
58
  // dispatchCommand is internal, tested via routing only
59
59
  });
60
60
 
61
61
  it('"/save" 调用 cmdSave', async () => {
62
- const { cmdSave } = await import("../session/commands/save.js");
62
+ const { cmdSave } = await import("../chat/commands/save.js");
63
63
  const ctx = makeCtx([{ role: "system", content: "sys" }]);
64
64
  await cmdSave(ctx);
65
65
  expect(saveSnapshot).toHaveBeenCalledWith(ctx.agent.messages);
66
66
  });
67
67
 
68
68
  it('"/new" 调用 cmdNew 并打印提示', async () => {
69
- const { cmdNew } = await import("../session/commands/new.js");
69
+ const { cmdNew } = await import("../chat/commands/new.js");
70
70
  const ctx = makeCtx();
71
71
  const spy = vi.spyOn(console, "log").mockImplementation(() => {});
72
72
  await cmdNew(ctx);
73
- expect(spy).toHaveBeenCalledWith("\n🆕 重新开始\n");
73
+ expect(spy).toHaveBeenCalledWith("\n🆕 新会话\n");
74
74
  spy.mockRestore();
75
75
  });
76
76
 
77
77
  it('"/help" 打印帮助信息', async () => {
78
- const { cmdHelp } = await import("../session/commands/help.js");
78
+ const { cmdHelp } = await import("../chat/commands/help.js");
79
79
  const spy = vi.spyOn(console, "log").mockImplementation(() => {});
80
80
  cmdHelp();
81
81
  expect(spy).toHaveBeenCalled();
@@ -91,7 +91,7 @@ describe("cmdBack", () => {
91
91
  });
92
92
 
93
93
  it("没有消息时提示无可撤回", async () => {
94
- const { cmdBack } = await import("../session/commands/back.js");
94
+ const { cmdBack } = await import("../chat/commands/back.js");
95
95
  const ctx = makeCtx([{ role: "system", content: "sys" }]);
96
96
  const spy = vi.spyOn(console, "log").mockImplementation(() => {});
97
97
  await cmdBack(ctx);
@@ -100,7 +100,7 @@ describe("cmdBack", () => {
100
100
  });
101
101
 
102
102
  it("取消操作时不修改消息", async () => {
103
- const { cmdBack } = await import("../session/commands/back.js");
103
+ const { cmdBack } = await import("../chat/commands/back.js");
104
104
  const msgs = [
105
105
  { role: "system", content: "sys" },
106
106
  { role: "user", content: "你好" },
@@ -120,7 +120,7 @@ describe("cmdLoad", () => {
120
120
  });
121
121
 
122
122
  it("没有快照时提示", async () => {
123
- const { cmdLoad } = await import("../session/commands/load.js");
123
+ const { cmdLoad } = await import("../chat/commands/load.js");
124
124
  const ctx = makeCtx();
125
125
  vi.mocked(listSnapshots).mockReturnValueOnce([]);
126
126
  const spy = vi.spyOn(console, "log").mockImplementation(() => {});
@@ -138,7 +138,7 @@ describe("cmdEditor", () => {
138
138
  });
139
139
 
140
140
  it("取消编辑不报错", async () => {
141
- const { cmdEditor } = await import("../session/commands/editor.js");
141
+ const { cmdEditor } = await import("../chat/commands/editor.js");
142
142
  const ctx = makeCtx();
143
143
  mockPrompt.mockResolvedValueOnce({ content: "" });
144
144
  await cmdEditor(ctx);
@@ -1,10 +1,10 @@
1
1
  import inquirer from "inquirer";
2
- import type { SessionCtx } from "../shared.js";
2
+ import type { ChatCtx } from "../shared.js";
3
3
  import { sendAndPrint } from "../print.js";
4
4
  import { saveMessages } from "../../config.js";
5
5
  import { buildAgent } from "../../agent-factory.js";
6
6
 
7
- export async function cmdBack(ctx: SessionCtx): Promise<void> {
7
+ export async function cmdBack(ctx: ChatCtx): Promise<void> {
8
8
  const targets: { index: number; role: string; label: string; preview: string }[] = [];
9
9
  for (let i = 0; i < ctx.agent.messages.length; i++) {
10
10
  const msg = ctx.agent.messages[i];
@@ -1,9 +1,9 @@
1
1
  import inquirer from "inquirer";
2
- import type { SessionCtx } from "../shared.js";
2
+ import type { ChatCtx } from "../shared.js";
3
3
  import { sendAndPrint } from "../print.js";
4
4
  import { saveMessages } from "../../config.js";
5
5
 
6
- export async function cmdEditor(ctx: SessionCtx) {
6
+ export async function cmdEditor(ctx: ChatCtx) {
7
7
  const { content } = await inquirer.prompt([
8
8
  { type: "editor", name: "content", message: "编辑消息:" },
9
9
  ]);
@@ -0,0 +1,6 @@
1
+ import type { ChatCtx } from "../shared.js";
2
+
3
+ export async function cmdExit(ctx: ChatCtx): Promise<void> {
4
+ console.log("\n👋 再见!");
5
+ process.exit(0);
6
+ }
@@ -0,0 +1,38 @@
1
+ import type { ChatCtx } from "../shared.js";
2
+ import { cmdExit } from "./exit.js";
3
+ import { cmdHelp } from "./help.js";
4
+ import { cmdSave } from "./save.js";
5
+ import { cmdNew } from "./new.js";
6
+ import { cmdLoad } from "./load.js";
7
+ import { cmdEditor } from "./editor.js";
8
+ import { cmdBack } from "./back.js";
9
+
10
+ export async function dispatchCommand(ctx: ChatCtx, cmd: string): Promise<void> {
11
+ switch (cmd) {
12
+ case "/exit":
13
+ case "/quit":
14
+ cmdExit(ctx);
15
+ break;
16
+ case "/save":
17
+ await cmdSave(ctx);
18
+ break;
19
+ case "/new":
20
+ await cmdNew(ctx);
21
+ break;
22
+ case "/load":
23
+ await cmdLoad(ctx);
24
+ break;
25
+ case "/back":
26
+ await cmdBack(ctx);
27
+ break;
28
+ case "/editor":
29
+ await cmdEditor(ctx);
30
+ break;
31
+ case "/help":
32
+ cmdHelp();
33
+ break;
34
+ default:
35
+ console.log(`\n❌ 未知命令: ${cmd}\n`);
36
+ break;
37
+ }
38
+ }
@@ -1,11 +1,11 @@
1
1
  import { Message } from "@ai-zen/agents-core";
2
2
  import inquirer from "inquirer";
3
- import type { SessionCtx } from "../shared.js";
3
+ import type { ChatCtx } from "../shared.js";
4
4
  import { SYSTEM_PROMPT } from "../shared.js";
5
5
  import { listSnapshots, loadSnapshot, saveMessages } from "../../config.js";
6
6
  import { buildAgent } from "../../agent-factory.js";
7
7
 
8
- export async function cmdLoad(ctx: SessionCtx): Promise<void> {
8
+ export async function cmdLoad(ctx: ChatCtx): Promise<void> {
9
9
  const snapshots = listSnapshots();
10
10
  if (snapshots.length === 0) {
11
11
  console.log("\n📭 没有可用的快照\n");
@@ -0,0 +1,12 @@
1
+ import type { ChatCtx } from "../shared.js";
2
+ import { Message } from "@ai-zen/agents-core";
3
+ import { saveMessages } from "../../config.js";
4
+ import { buildAgent } from "../../agent-factory.js";
5
+ import { SYSTEM_PROMPT } from "../shared.js";
6
+
7
+ export async function cmdNew(ctx: ChatCtx): Promise<void> {
8
+ const msgs = [Message.System(SYSTEM_PROMPT)];
9
+ saveMessages(msgs);
10
+ ctx.agent = await buildAgent(msgs);
11
+ console.log("\n🆕 新会话\n");
12
+ }
@@ -1,6 +1,6 @@
1
- import type { SessionCtx } from "../shared.js";
1
+ import type { ChatCtx } from "../shared.js";
2
2
  import { saveSnapshot } from "../../config.js";
3
3
 
4
- export async function cmdSave(ctx: SessionCtx) {
4
+ export async function cmdSave(ctx: ChatCtx) {
5
5
  console.log(`\n✅ 快照: ${saveSnapshot(ctx.agent.messages)}\n`);
6
6
  }
@@ -1,12 +1,12 @@
1
1
  import { Message } from "@ai-zen/agents-core";
2
- import type { SessionCtx } from "./shared.js";
2
+ import type { ChatCtx } from "./shared.js";
3
3
  import { SYSTEM_PROMPT } from "./shared.js";
4
4
  import { sendAndPrint } from "./print.js";
5
5
  import { saveMessages, saveSnapshot } from "../config.js";
6
6
  import { buildAgent } from "../agent-factory.js";
7
7
  import { contextSize, shouldMigrate, generateMigrationDoc, MAX_CONTEXT_CHARS } from "../migration.js";
8
8
 
9
- export async function handleMessage(ctx: SessionCtx, text: string): Promise<void> {
9
+ export async function handleMessage(ctx: ChatCtx, text: string): Promise<void> {
10
10
  try {
11
11
  await sendAndPrint(ctx.agent, text);
12
12
  saveMessages(ctx.agent.messages);
@@ -1,11 +1,29 @@
1
1
  import { Agent, Message } from "@ai-zen/agents-core";
2
+ import inquirer from "inquirer";
2
3
  import { readConfig, readMessages, saveMessages, saveSnapshot } from "../config.js";
3
4
  import { buildAgent } from "../agent-factory.js";
4
5
  import { contextSize } from "../migration.js";
5
- import { SessionCtx, SYSTEM_PROMPT, saveAndNew, ask } from "./shared.js";
6
+ import { ChatCtx, SYSTEM_PROMPT } from "./shared.js";
7
+ import { dispatchCommand } from "./commands/index.js";
8
+ import { handleMessage } from "./message.js";
6
9
  import { sendAndPrint } from "./print.js";
7
10
 
8
- export async function runConversation(initialMessage?: string): Promise<void> {
11
+ async function chatLoop(ctx: ChatCtx) {
12
+ while (true) {
13
+ const { input } = await inquirer.prompt([
14
+ { type: "input", name: "input", message: "你:" },
15
+ ]);
16
+ const t = input.trim();
17
+ if (!t) continue;
18
+ if (t.startsWith("/")) {
19
+ await dispatchCommand(ctx, t.toLowerCase());
20
+ continue;
21
+ }
22
+ await handleMessage(ctx, t);
23
+ }
24
+ }
25
+
26
+ export async function runChat(initialMessage?: string): Promise<void> {
9
27
  const config = readConfig();
10
28
  if (!config.apiKey) {
11
29
  console.error("❌ 请先设置 API Key: air key <your-key>");
@@ -19,7 +37,7 @@ export async function runConversation(initialMessage?: string): Promise<void> {
19
37
  saveMessages(msgs);
20
38
  }
21
39
  const agent: Agent = await buildAgent(msgs);
22
- const ctx: SessionCtx = { agent };
40
+ const ctx: ChatCtx = { agent };
23
41
 
24
42
  if (initialMessage) {
25
43
  const hasHistory = ctx.agent.messages.some(m => m.role === "user" || m.role === "assistant");
@@ -27,14 +45,14 @@ export async function runConversation(initialMessage?: string): Promise<void> {
27
45
  const snap = saveSnapshot(ctx.agent.messages);
28
46
  console.log(`💾 已存档旧对话: ${snap}\n`);
29
47
  }
30
- await saveAndNew(ctx);
48
+ await dispatchCommand(ctx, "/new");
31
49
  console.log(`💬 你: ${initialMessage}`);
32
50
  try {
33
51
  await sendAndPrint(ctx.agent, initialMessage);
34
52
  saveMessages(ctx.agent.messages);
35
53
  } catch (err: any) { console.error(`\n❌ ${err.message}`); }
36
54
  console.log("\n💬 继续对话 (输入 /exit 退出)\n");
37
- await ask(ctx);
55
+ await chatLoop(ctx);
38
56
  return;
39
57
  }
40
58
 
@@ -43,5 +61,5 @@ export async function runConversation(initialMessage?: string): Promise<void> {
43
61
  ? `\n💬 继续上次对话 (${msgCount} 条,/${contextSize(ctx.agent.messages)} 字符,输入 /new 重新开始)\n`
44
62
  : "\n💬 air — 极简 AI 助手 (输入 /help 查看命令)\n");
45
63
 
46
- await ask(ctx);
64
+ await chatLoop(ctx);
47
65
  }
@@ -0,0 +1,21 @@
1
+ import { Agent } from "@ai-zen/agents-core";
2
+
3
+ export interface ChatCtx {
4
+ agent: Agent;
5
+ }
6
+
7
+ export 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");
package/src/cli.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import { readFileSync } from "node:fs";
3
3
  import { Command } from "commander";
4
- import { runConversation } from "./session/runtime.js";
4
+ import { runChat } from "./chat/runtime.js";
5
5
  import { installHook, uninstallHook } from "./hook.js";
6
6
  import { readConfig, saveConfig } from "./config.js";
7
7
 
@@ -57,7 +57,7 @@ program
57
57
  console.error(" 获取 Key: https://platform.deepseek.com/api_keys");
58
58
  process.exit(1);
59
59
  }
60
- await runConversation(message?.join(" "));
60
+ await runChat(message?.join(" "));
61
61
  });
62
62
 
63
63
  program.parse(process.argv);
@@ -1,6 +0,0 @@
1
- import type { SessionCtx } from "../shared.js";
2
-
3
- export async function cmdExit(ctx: SessionCtx): Promise<void> {
4
- console.log("\n👋 再见!");
5
- process.exit(0);
6
- }
@@ -1,7 +0,0 @@
1
- import type { SessionCtx } from "../shared.js";
2
- import { saveAndNew } from "../shared.js";
3
-
4
- export async function cmdNew(ctx: SessionCtx): Promise<void> {
5
- await saveAndNew(ctx);
6
- console.log("\n🆕 重新开始\n");
7
- }
@@ -1,83 +0,0 @@
1
- import { Agent, Message } from "@ai-zen/agents-core";
2
- import inquirer from "inquirer";
3
- import { saveMessages } from "../config.js";
4
- import { buildAgent } from "../agent-factory.js";
5
- import { handleMessage } from "./message.js";
6
- import { cmdExit } from "./commands/exit.js";
7
- import { cmdHelp } from "./commands/help.js";
8
- import { cmdSave } from "./commands/save.js";
9
- import { cmdNew } from "./commands/new.js";
10
- import { cmdLoad } from "./commands/load.js";
11
- import { cmdEditor } from "./commands/editor.js";
12
- import { cmdBack } from "./commands/back.js";
13
-
14
- export interface SessionCtx {
15
- agent: Agent;
16
- }
17
-
18
- export const SYSTEM_PROMPT = [
19
- "你是一个AI助手,专门帮助用户回答问题和执行任务。请用中文回复。",
20
- "",
21
- "## 行为准则",
22
- "1. 做任何改动之前,必须先跟用户商量,获得明确指示之后再行动。",
23
- "2. 用户没有明确要求产出文件时,不得自行创建任何文件到项目中。讨论就停留在讨论层面。",
24
- "3. 区分危险操作:删除文件、覆盖文件、安装卸载软件、修改系统配置、执行耗时任务等属于危险操作。执行前必须评估影响范围,并向用户说明风险,获得用户明确的书面的确认之后再执行。",
25
- "4. 追责原则:你的每一步操作都应当基于用户的明确指令。如果出了问题,可以从用户说过的话追溯责任——是用户让你做的,用户承担责任。所以你不需要畏手畏脚,只要用户明确说了\u201c做\u201d,你就放心去做。",
26
- "",
27
- "## 记忆",
28
- "你可以使用 shell 工具执行任何命令。如果你有需要长期记住的信息(用户偏好、项目约定、任务进度等),请写入以下位置:",
29
- "- 全局记忆: ~/.ai-zen/air/temp/*.md",
30
- "- 项目记忆: $(cwd)/.ai-zen/air/temp/*.md",
31
- "下次启动时用 shell 读取即可。这是你唯一的记忆方式。",
32
- ].join("\n");
33
-
34
- export async function saveAndNew(ctx: SessionCtx): Promise<void> {
35
- const msgs = [Message.System(SYSTEM_PROMPT)];
36
- saveMessages(msgs);
37
- ctx.agent = await buildAgent(msgs);
38
- }
39
-
40
- async function dispatchCommand(ctx: SessionCtx, cmd: string): Promise<void> {
41
- switch (cmd) {
42
- case "/exit":
43
- case "/quit":
44
- cmdExit(ctx);
45
- break;
46
- case "/save":
47
- await cmdSave(ctx);
48
- break;
49
- case "/new":
50
- await cmdNew(ctx);
51
- break;
52
- case "/load":
53
- await cmdLoad(ctx);
54
- break;
55
- case "/back":
56
- await cmdBack(ctx);
57
- break;
58
- case "/editor":
59
- await cmdEditor(ctx);
60
- break;
61
- case "/help":
62
- cmdHelp();
63
- break;
64
- default:
65
- console.log(`\n❌ 未知命令: ${cmd}\n`);
66
- break;
67
- }
68
- }
69
-
70
- export async function ask(ctx: SessionCtx) {
71
- while (true) {
72
- const { input } = await inquirer.prompt([
73
- { type: "input", name: "input", message: "你:" },
74
- ]);
75
- const t = input.trim();
76
- if (!t) continue;
77
- if (t.startsWith("/")) {
78
- await dispatchCommand(ctx, t.toLowerCase());
79
- continue;
80
- }
81
- await handleMessage(ctx, t);
82
- }
83
- }
File without changes
File without changes