@ai-zen/air 0.1.9 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (126) hide show
  1. package/README.md +61 -44
  2. package/README.zh.md +97 -0
  3. package/dist/agent-factory.js +1 -1
  4. package/dist/agent-factory.js.map +1 -1
  5. package/dist/agent-runtime.d.ts.map +1 -1
  6. package/dist/agent-runtime.js +241 -228
  7. package/dist/agent-runtime.js.map +1 -1
  8. package/dist/chat/commands/back.d.ts +3 -0
  9. package/dist/chat/commands/back.d.ts.map +1 -0
  10. package/dist/chat/commands/back.js +95 -0
  11. package/dist/chat/commands/back.js.map +1 -0
  12. package/dist/chat/commands/editor.d.ts +3 -0
  13. package/dist/chat/commands/editor.d.ts.map +1 -0
  14. package/dist/chat/commands/editor.js +20 -0
  15. package/dist/chat/commands/editor.js.map +1 -0
  16. package/dist/chat/commands/exit.d.ts +3 -0
  17. package/dist/chat/commands/exit.d.ts.map +1 -0
  18. package/dist/chat/commands/exit.js +5 -0
  19. package/dist/chat/commands/exit.js.map +1 -0
  20. package/dist/chat/commands/help.d.ts +2 -0
  21. package/dist/chat/commands/help.d.ts.map +1 -0
  22. package/dist/chat/commands/help.js +4 -0
  23. package/dist/chat/commands/help.js.map +1 -0
  24. package/dist/chat/commands/load.d.ts +3 -0
  25. package/dist/chat/commands/load.d.ts.map +1 -0
  26. package/dist/chat/commands/load.js +39 -0
  27. package/dist/chat/commands/load.js.map +1 -0
  28. package/dist/chat/commands/message.d.ts +5 -0
  29. package/dist/chat/commands/message.d.ts.map +1 -0
  30. package/dist/chat/commands/message.js +53 -0
  31. package/dist/chat/commands/message.js.map +1 -0
  32. package/dist/chat/commands/new.d.ts +3 -0
  33. package/dist/chat/commands/new.d.ts.map +1 -0
  34. package/dist/chat/commands/new.js +6 -0
  35. package/dist/chat/commands/new.js.map +1 -0
  36. package/dist/chat/commands/save.d.ts +3 -0
  37. package/dist/chat/commands/save.d.ts.map +1 -0
  38. package/dist/chat/commands/save.js +5 -0
  39. package/dist/chat/commands/save.js.map +1 -0
  40. package/dist/chat/message.d.ts +3 -0
  41. package/dist/chat/message.d.ts.map +1 -0
  42. package/dist/chat/message.js +31 -0
  43. package/dist/chat/message.js.map +1 -0
  44. package/dist/chat/print.d.ts +3 -0
  45. package/dist/chat/print.d.ts.map +1 -0
  46. package/dist/chat/print.js +24 -0
  47. package/dist/chat/print.js.map +1 -0
  48. package/dist/chat/runtime.d.ts +2 -0
  49. package/dist/chat/runtime.d.ts.map +1 -0
  50. package/dist/chat/runtime.js +47 -0
  51. package/dist/chat/runtime.js.map +1 -0
  52. package/dist/chat/session.d.ts +8 -0
  53. package/dist/chat/session.d.ts.map +1 -0
  54. package/dist/chat/session.js +77 -0
  55. package/dist/chat/session.js.map +1 -0
  56. package/dist/cli.js +19 -3
  57. package/dist/cli.js.map +1 -1
  58. package/dist/config.js +1 -1
  59. package/dist/config.js.map +1 -1
  60. package/dist/hook.d.ts +3 -0
  61. package/dist/hook.d.ts.map +1 -0
  62. package/dist/hook.js +82 -0
  63. package/dist/hook.js.map +1 -0
  64. package/dist/session/commands/back.d.ts +3 -0
  65. package/dist/session/commands/back.d.ts.map +1 -0
  66. package/dist/session/commands/back.js +95 -0
  67. package/dist/session/commands/back.js.map +1 -0
  68. package/dist/session/commands/editor.d.ts +3 -0
  69. package/dist/session/commands/editor.d.ts.map +1 -0
  70. package/dist/session/commands/editor.js +20 -0
  71. package/dist/session/commands/editor.js.map +1 -0
  72. package/dist/session/commands/exit.d.ts +3 -0
  73. package/dist/session/commands/exit.d.ts.map +1 -0
  74. package/dist/session/commands/exit.js +5 -0
  75. package/dist/session/commands/exit.js.map +1 -0
  76. package/dist/session/commands/help.d.ts +2 -0
  77. package/dist/session/commands/help.d.ts.map +1 -0
  78. package/dist/session/commands/help.js +4 -0
  79. package/dist/session/commands/help.js.map +1 -0
  80. package/dist/session/commands/load.d.ts +3 -0
  81. package/dist/session/commands/load.d.ts.map +1 -0
  82. package/dist/session/commands/load.js +37 -0
  83. package/dist/session/commands/load.js.map +1 -0
  84. package/dist/session/commands/new.d.ts +3 -0
  85. package/dist/session/commands/new.d.ts.map +1 -0
  86. package/dist/session/commands/new.js +6 -0
  87. package/dist/session/commands/new.js.map +1 -0
  88. package/dist/session/commands/save.d.ts +3 -0
  89. package/dist/session/commands/save.d.ts.map +1 -0
  90. package/dist/session/commands/save.js +5 -0
  91. package/dist/session/commands/save.js.map +1 -0
  92. package/dist/session/message.d.ts +3 -0
  93. package/dist/session/message.d.ts.map +1 -0
  94. package/dist/session/message.js +31 -0
  95. package/dist/session/message.js.map +1 -0
  96. package/dist/session/print.d.ts +3 -0
  97. package/dist/session/print.d.ts.map +1 -0
  98. package/dist/session/print.js +24 -0
  99. package/dist/session/print.js.map +1 -0
  100. package/dist/session/runtime.d.ts +2 -0
  101. package/dist/session/runtime.d.ts.map +1 -0
  102. package/dist/session/runtime.js +46 -0
  103. package/dist/session/runtime.js.map +1 -0
  104. package/dist/session/shared.d.ts +8 -0
  105. package/dist/session/shared.d.ts.map +1 -0
  106. package/dist/session/shared.js +77 -0
  107. package/dist/session/shared.js.map +1 -0
  108. package/package.json +12 -3
  109. package/src/__tests__/e2e.test.ts +187 -0
  110. package/src/__tests__/session.test.ts +147 -0
  111. package/src/agent-factory.ts +1 -1
  112. package/src/cli.ts +19 -4
  113. package/src/config.ts +1 -1
  114. package/src/hook.ts +93 -0
  115. package/src/session/commands/back.ts +90 -0
  116. package/src/session/commands/editor.ts +18 -0
  117. package/src/session/commands/exit.ts +6 -0
  118. package/src/session/commands/help.ts +3 -0
  119. package/src/session/commands/load.ts +38 -0
  120. package/src/session/commands/new.ts +7 -0
  121. package/src/session/commands/save.ts +6 -0
  122. package/src/session/message.ts +27 -0
  123. package/src/session/print.ts +27 -0
  124. package/src/session/runtime.ts +47 -0
  125. package/src/session/shared.ts +83 -0
  126. package/src/agent-runtime.ts +0 -265
package/README.md CHANGED
@@ -1,16 +1,16 @@
1
1
  # air
2
2
 
3
- 1% 的功能完成 99% 的事情。
3
+ > Do 99% of things with 1% of the features.
4
4
 
5
- 一个极简的 AI 命令行助手。只有一个 shell 工具,AI 自己用文件系统记东西,上下文满了自动迁移。
5
+ A minimalist AI CLI assistant. Just one shell tool — the AI remembers things by writing to the filesystem, and automatically migrates context when it gets too long.
6
6
 
7
- ## 安装
7
+ ## Installation
8
8
 
9
9
  ```bash
10
- # 全局安装(推荐)
10
+ # Global install (recommended)
11
11
  npm install -g @ai-zen/air
12
12
 
13
- # 或从源码构建
13
+ # Or build from source
14
14
  git clone git@github.com:ai-zen/air.git
15
15
  cd air
16
16
  npm install
@@ -18,72 +18,89 @@ npm run build
18
18
  npm install -g .
19
19
  ```
20
20
 
21
- ## 使用
21
+ ## Usage
22
22
 
23
23
  ```bash
24
- # 设置 API KeyDeepSeek
24
+ # Set API Key (DeepSeek)
25
25
  air key sk-xxxxxxxxxxxxxxxx
26
26
 
27
- # 交互模式(自动恢复上次对话)
27
+ # Interactive mode (auto-resumes last conversation)
28
28
  air
29
29
 
30
- # 直接发一条消息
31
- air shell 帮我看看当前目录有哪些文件
30
+ # One-shot message
31
+ air use shell to list files in current directory
32
32
 
33
- # 查看配置
33
+ # View config
34
34
  air config
35
+
36
+ # Install fallback hook (redirects unknown commands to air)
37
+ air hook install
38
+
39
+ # Uninstall fallback hook
40
+ air hook uninstall
35
41
  ```
36
42
 
37
- ### 交互命令
43
+ ### Interactive Commands
44
+
45
+ | Command | Description |
46
+ |---------|-------------|
47
+ | `/exit` `/quit` | Exit |
48
+ | `/save` | Save snapshot |
49
+ | `/load` | Load snapshot |
50
+ | `/new` | Clear context and start fresh |
51
+ | `/back` | Recall a message (optionally edit and resend) |
52
+ | `/editor` | Open system editor for multi-line input |
53
+ | `/help` | Help |
54
+
55
+ ### Fallback Terminal Hook
38
56
 
39
- | 命令 | 说明 |
40
- |------|------|
41
- | `/exit` `/quit` | 退出 |
42
- | `/save` | 保存快照 |
43
- | `/load` | 加载快照 |
44
- | `/new` | 清空上下文重新开始 |
45
- | `/back` | 撤回消息(可选修改后重发) |
46
- | `/editor` | 打开系统编辑器输入多行文本 |
47
- | `/help` | 帮助 |
57
+ When installed, any command that doesn't exist in your shell gets automatically forwarded to `air`. The AI will interpret what you meant and help you out.
58
+
59
+ ```bash
60
+ $ gred "hello" file.txt
61
+ # command not found → auto-redirects to air
62
+ # AI: "Did you mean grep?"
63
+ ```
48
64
 
49
- ## 设计
65
+ ## Design
50
66
 
51
67
  ```
52
68
  ~/.ai-zen/air/
53
69
  ├── config.json # { "apiKey": "sk-xxx" }
54
- ├── context.json # [ { role, content }, ... ] 当前对话
55
- ├── snapshots/ # /save 或迁移前自动快照
56
- └── temp/ # AI 自己写入的长期记忆 (*.md)
70
+ ├── context.json # [ { role, content }, ... ] Current conversation
71
+ ├── snapshots/ # Auto snapshots before migration or /save
72
+ └── temp/ # Long-term memory written by AI (*.md)
57
73
  ```
58
74
 
59
- ### 核心理念
75
+ ### Core Philosophy
60
76
 
61
- - **模型**: DeepSeek-V4-Flash(写死,只有一个)
62
- - **工具**: 只有一个 `shell`,AI 用它执行命令、读写文件
63
- - **记忆**: AI 自己决定记什么,用 shell 写入 `temp/*.md`,下次启动时读取。air 不做额外的持久化机制
64
- - **上下文**: JSON 序列化后超过 50 万字符自动迁移,迁移前拍快照
65
- - **行为准则**: 先商量再动手,危险操作必须获得用户书面确认。追责原则——每一步基于用户指令,用户承担责任
77
+ - **Model**: DeepSeek-V4-Flash (hardcoded, only one)
78
+ - **Tool**: Just one `shell` tool — the AI executes commands, reads and writes files through it
79
+ - **Memory**: The AI decides what to remember, writes to `temp/*.md` via shell, reads on next startup. No extra persistence mechanism
80
+ - **Context**: Auto-migrates when JSON serialization exceeds 500K chars, takes a snapshot before migration
81
+ - **Rules**: Consult the user before making changes. Dangerous operations require explicit written confirmation. The user takes responsibility for their own instructions
66
82
 
67
- ## 项目结构
83
+ ## Project Structure
68
84
 
69
85
  ```
70
86
  src/
71
- ├── cli.ts # CLI 入口,commander (48行)
72
- ├── config.ts # 配置与文件读写 (109行)
73
- ├── delta-renderer.ts # 流式渲染器 (126行,复用自 agents 项目)
74
- ├── tools.ts # 工具定义——shell (23行)
75
- ├── agent-factory.ts # Agent 工厂——构建模型与 Agent (23行)
76
- ├── migration.ts # 上下文计数与任务迁移 (72行)
77
- ├── agent-runtime.ts # 运行时——对话循环与命令处理 (256行)
87
+ ├── cli.ts # CLI entry, commander
88
+ ├── config.ts # Config read/write
89
+ ├── delta-renderer.ts # Stream renderer (from agents project)
90
+ ├── tools.ts # Tool definitions — shell
91
+ ├── 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)
78
95
  └── __tests__/
79
- ├── config.test.ts # 配置/上下文/快照测试 (110行)
80
- ├── main.test.ts # contextSize/shouldMigrate 测试 (43行)
81
- └── tools.test.ts # shell 工具结构测试 (15行)
96
+ ├── config.test.ts # Config/context/snapshot tests
97
+ ├── main.test.ts # contextSize/shouldMigrate tests
98
+ └── tools.test.ts # Shell tool structure tests
82
99
  ```
83
100
 
84
- 40 KB,826 行。
101
+ ~46 KB, 870 lines.
85
102
 
86
- ## 测试
103
+ ## Tests
87
104
 
88
105
  ```bash
89
106
  npm test
package/README.zh.md ADDED
@@ -0,0 +1,97 @@
1
+ # air
2
+
3
+ 用 1% 的功能完成 99% 的事情。
4
+
5
+ 一个极简的 AI 命令行助手。只有一个 shell 工具,AI 自己用文件系统记东西,上下文满了自动迁移。
6
+
7
+ ## 安装
8
+
9
+ ```bash
10
+ # 全局安装(推荐)
11
+ npm install -g @ai-zen/air
12
+
13
+ # 或从源码构建
14
+ git clone git@github.com:ai-zen/air.git
15
+ cd air
16
+ npm install
17
+ npm run build
18
+ npm install -g .
19
+ ```
20
+
21
+ ## 使用
22
+
23
+ ```bash
24
+ # 设置 API Key(DeepSeek)
25
+ air key sk-xxxxxxxxxxxxxxxx
26
+
27
+ # 交互模式(自动恢复上次对话)
28
+ air
29
+
30
+ # 直接发一条消息
31
+ air 用 shell 帮我看看当前目录有哪些文件
32
+
33
+ # 查看配置
34
+ air config
35
+
36
+ # 安装兜底终端钩子(命令不存在时自动转发到 air)
37
+ air hook install
38
+
39
+ # 卸载兜底终端钩子
40
+ air hook uninstall
41
+ ```
42
+
43
+ ### 交互命令
44
+
45
+ | 命令 | 说明 |
46
+ |------|------|
47
+ | `/exit` `/quit` | 退出 |
48
+ | `/save` | 保存快照 |
49
+ | `/load` | 加载快照 |
50
+ | `/new` | 清空上下文重新开始 |
51
+ | `/back` | 撤回消息(可选修改后重发) |
52
+ | `/editor` | 打开系统编辑器输入多行文本 |
53
+ | `/help` | 帮助 |
54
+
55
+ ## 设计
56
+
57
+ ```
58
+ ~/.ai-zen/air/
59
+ ├── config.json # { "apiKey": "sk-xxx" }
60
+ ├── context.json # [ { role, content }, ... ] 当前对话
61
+ ├── snapshots/ # /save 或迁移前自动快照
62
+ └── temp/ # AI 自己写入的长期记忆 (*.md)
63
+ ```
64
+
65
+ ### 核心理念
66
+
67
+ - **模型**: DeepSeek-V4-Flash(写死,只有一个)
68
+ - **工具**: 只有一个 `shell`,AI 用它执行命令、读写文件
69
+ - **记忆**: AI 自己决定记什么,用 shell 写入 `temp/*.md`,下次启动时读取。air 不做额外的持久化机制
70
+ - **上下文**: JSON 序列化后超过 50 万字符自动迁移,迁移前拍快照
71
+ - **行为准则**: 先商量再动手,危险操作必须获得用户书面确认。追责原则——每一步基于用户指令,用户承担责任
72
+
73
+ ## 项目结构
74
+
75
+ ```
76
+ src/
77
+ ├── cli.ts # CLI 入口,commander
78
+ ├── config.ts # 配置与文件读写
79
+ ├── delta-renderer.ts # 流式渲染器(复用自 agents 项目)
80
+ ├── tools.ts # 工具定义——shell
81
+ ├── agent-factory.ts # Agent 工厂——构建模型与 Agent
82
+ ├── migration.ts # 上下文计数与任务迁移
83
+ ├── agent-runtime.ts # 运行时——对话循环与命令处理
84
+ ├── hook.ts # 兜底终端钩子(install/uninstall)
85
+ └── __tests__/
86
+ ├── config.test.ts # 配置/上下文/快照测试
87
+ ├── main.test.ts # contextSize/shouldMigrate 测试
88
+ └── tools.test.ts # shell 工具结构测试
89
+ ```
90
+
91
+ 共 46 KB,870 行。
92
+
93
+ ## 测试
94
+
95
+ ```bash
96
+ npm test
97
+ ```
@@ -2,7 +2,7 @@ import { Agent, Message, OpenAI, ChatGPT } from "@ai-zen/agents-core";
2
2
  import { readConfig } from "./config.js";
3
3
  import { shellTool } from "./tools.js";
4
4
  const MODEL_NAME = "deepseek-v4-flash";
5
- const API_ENDPOINT = "https://api.deepseek.com/v1";
5
+ const API_ENDPOINT = process.env.AIR_API_ENDPOINT || "https://api.deepseek.com/v1";
6
6
  async function buildModel(apiKey) {
7
7
  const endpoint = new OpenAI({ openai_endpoint: API_ENDPOINT, api_key: apiKey });
8
8
  return new ChatGPT({
@@ -1 +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"}
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,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,6BAA6B,CAAC;AAEnF,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"}
@@ -1 +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,CAgN5E"}
1
+ {"version":3,"file":"agent-runtime.d.ts","sourceRoot":"","sources":["../src/agent-runtime.ts"],"names":[],"mappings":"AA0RA,wBAAsB,eAAe,CAAC,cAAc,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAyC5E"}