@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.
- package/README.md +61 -44
- package/README.zh.md +97 -0
- package/dist/agent-factory.js +1 -1
- package/dist/agent-factory.js.map +1 -1
- package/dist/agent-runtime.d.ts.map +1 -1
- package/dist/agent-runtime.js +241 -228
- package/dist/agent-runtime.js.map +1 -1
- package/dist/chat/commands/back.d.ts +3 -0
- package/dist/chat/commands/back.d.ts.map +1 -0
- package/dist/chat/commands/back.js +95 -0
- package/dist/chat/commands/back.js.map +1 -0
- package/dist/chat/commands/editor.d.ts +3 -0
- package/dist/chat/commands/editor.d.ts.map +1 -0
- package/dist/chat/commands/editor.js +20 -0
- package/dist/chat/commands/editor.js.map +1 -0
- package/dist/chat/commands/exit.d.ts +3 -0
- package/dist/chat/commands/exit.d.ts.map +1 -0
- package/dist/chat/commands/exit.js +5 -0
- package/dist/chat/commands/exit.js.map +1 -0
- package/dist/chat/commands/help.d.ts +2 -0
- package/dist/chat/commands/help.d.ts.map +1 -0
- package/dist/chat/commands/help.js +4 -0
- package/dist/chat/commands/help.js.map +1 -0
- package/dist/chat/commands/load.d.ts +3 -0
- package/dist/chat/commands/load.d.ts.map +1 -0
- package/dist/chat/commands/load.js +39 -0
- package/dist/chat/commands/load.js.map +1 -0
- package/dist/chat/commands/message.d.ts +5 -0
- package/dist/chat/commands/message.d.ts.map +1 -0
- package/dist/chat/commands/message.js +53 -0
- package/dist/chat/commands/message.js.map +1 -0
- package/dist/chat/commands/new.d.ts +3 -0
- package/dist/chat/commands/new.d.ts.map +1 -0
- package/dist/chat/commands/new.js +6 -0
- package/dist/chat/commands/new.js.map +1 -0
- package/dist/chat/commands/save.d.ts +3 -0
- package/dist/chat/commands/save.d.ts.map +1 -0
- package/dist/chat/commands/save.js +5 -0
- package/dist/chat/commands/save.js.map +1 -0
- package/dist/chat/message.d.ts +3 -0
- package/dist/chat/message.d.ts.map +1 -0
- package/dist/chat/message.js +31 -0
- package/dist/chat/message.js.map +1 -0
- package/dist/chat/print.d.ts +3 -0
- package/dist/chat/print.d.ts.map +1 -0
- package/dist/chat/print.js +24 -0
- package/dist/chat/print.js.map +1 -0
- package/dist/chat/runtime.d.ts +2 -0
- package/dist/chat/runtime.d.ts.map +1 -0
- package/dist/chat/runtime.js +47 -0
- package/dist/chat/runtime.js.map +1 -0
- package/dist/chat/session.d.ts +8 -0
- package/dist/chat/session.d.ts.map +1 -0
- package/dist/chat/session.js +77 -0
- package/dist/chat/session.js.map +1 -0
- package/dist/cli.js +19 -3
- package/dist/cli.js.map +1 -1
- package/dist/config.js +1 -1
- package/dist/config.js.map +1 -1
- package/dist/hook.d.ts +3 -0
- package/dist/hook.d.ts.map +1 -0
- package/dist/hook.js +82 -0
- package/dist/hook.js.map +1 -0
- package/dist/session/commands/back.d.ts +3 -0
- package/dist/session/commands/back.d.ts.map +1 -0
- package/dist/session/commands/back.js +95 -0
- package/dist/session/commands/back.js.map +1 -0
- package/dist/session/commands/editor.d.ts +3 -0
- package/dist/session/commands/editor.d.ts.map +1 -0
- package/dist/session/commands/editor.js +20 -0
- package/dist/session/commands/editor.js.map +1 -0
- package/dist/session/commands/exit.d.ts +3 -0
- package/dist/session/commands/exit.d.ts.map +1 -0
- package/dist/session/commands/exit.js +5 -0
- package/dist/session/commands/exit.js.map +1 -0
- package/dist/session/commands/help.d.ts +2 -0
- package/dist/session/commands/help.d.ts.map +1 -0
- package/dist/session/commands/help.js +4 -0
- package/dist/session/commands/help.js.map +1 -0
- package/dist/session/commands/load.d.ts +3 -0
- package/dist/session/commands/load.d.ts.map +1 -0
- package/dist/session/commands/load.js +37 -0
- package/dist/session/commands/load.js.map +1 -0
- package/dist/session/commands/new.d.ts +3 -0
- package/dist/session/commands/new.d.ts.map +1 -0
- package/dist/session/commands/new.js +6 -0
- package/dist/session/commands/new.js.map +1 -0
- package/dist/session/commands/save.d.ts +3 -0
- package/dist/session/commands/save.d.ts.map +1 -0
- package/dist/session/commands/save.js +5 -0
- package/dist/session/commands/save.js.map +1 -0
- package/dist/session/message.d.ts +3 -0
- package/dist/session/message.d.ts.map +1 -0
- package/dist/session/message.js +31 -0
- package/dist/session/message.js.map +1 -0
- package/dist/session/print.d.ts +3 -0
- package/dist/session/print.d.ts.map +1 -0
- package/dist/session/print.js +24 -0
- package/dist/session/print.js.map +1 -0
- package/dist/session/runtime.d.ts +2 -0
- package/dist/session/runtime.d.ts.map +1 -0
- package/dist/session/runtime.js +46 -0
- package/dist/session/runtime.js.map +1 -0
- package/dist/session/shared.d.ts +8 -0
- package/dist/session/shared.d.ts.map +1 -0
- package/dist/session/shared.js +77 -0
- package/dist/session/shared.js.map +1 -0
- package/package.json +12 -3
- package/src/__tests__/e2e.test.ts +187 -0
- package/src/__tests__/session.test.ts +147 -0
- package/src/agent-factory.ts +1 -1
- package/src/cli.ts +19 -4
- package/src/config.ts +1 -1
- package/src/hook.ts +93 -0
- package/src/session/commands/back.ts +90 -0
- package/src/session/commands/editor.ts +18 -0
- package/src/session/commands/exit.ts +6 -0
- package/src/session/commands/help.ts +3 -0
- package/src/session/commands/load.ts +38 -0
- package/src/session/commands/new.ts +7 -0
- package/src/session/commands/save.ts +6 -0
- package/src/session/message.ts +27 -0
- package/src/session/print.ts +27 -0
- package/src/session/runtime.ts +47 -0
- package/src/session/shared.ts +83 -0
- package/src/agent-runtime.ts +0 -265
package/README.md
CHANGED
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
# air
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
> Do 99% of things with 1% of the features.
|
|
4
4
|
|
|
5
|
-
|
|
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
|
-
#
|
|
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
|
|
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
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
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
|
|
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
|
-
-
|
|
62
|
-
-
|
|
63
|
-
-
|
|
64
|
-
-
|
|
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
|
|
72
|
-
├── config.ts #
|
|
73
|
-
├── delta-renderer.ts #
|
|
74
|
-
├── tools.ts #
|
|
75
|
-
├── agent-factory.ts # Agent
|
|
76
|
-
├── migration.ts #
|
|
77
|
-
├── agent-runtime.ts #
|
|
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 #
|
|
80
|
-
├── main.test.ts # contextSize/shouldMigrate
|
|
81
|
-
└── tools.test.ts #
|
|
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
|
-
|
|
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
|
+
```
|
package/dist/agent-factory.js
CHANGED
|
@@ -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;
|
|
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":"
|
|
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"}
|