@zqagent/core 0.1.30 → 0.2.5
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/CONTRIBUTING.md +65 -0
- package/LICENSE +190 -0
- package/README.md +102 -146
- package/README.oss.en.md +161 -0
- package/README.oss.md +165 -0
- package/README.oss.zh-TW.md +165 -0
- package/SECURITY.md +51 -0
- package/dist/{ToolRegistry-BmvPxgMr.d.cts → ToolRegistry-C3pTFiaJ.d.cts} +13 -4
- package/dist/{ToolRegistry-BmvPxgMr.d.ts → ToolRegistry-C3pTFiaJ.d.ts} +13 -4
- package/dist/cli/index.cjs +17799 -2062
- package/dist/cli/index.cjs.map +1 -1
- package/dist/cli/index.js +16729 -985
- package/dist/cli/index.js.map +1 -1
- package/dist/{explore-OI6htHN1.d.cts → explore-D4lCKXbA.d.ts} +160 -19
- package/dist/{explore-Pmhyk4gv.d.ts → explore-Dj1j_GyN.d.cts} +160 -19
- package/dist/index.cjs +3626 -453
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +337 -27
- package/dist/index.d.ts +337 -27
- package/dist/index.js +3617 -452
- package/dist/index.js.map +1 -1
- package/dist/server/index.cjs +14029 -1482
- package/dist/server/index.cjs.map +1 -1
- package/dist/server/index.js +14036 -1482
- package/dist/server/index.js.map +1 -1
- package/dist/tools/ask.cjs +14 -0
- package/dist/tools/ask.cjs.map +1 -1
- package/dist/tools/ask.d.cts +8 -2
- package/dist/tools/ask.d.ts +8 -2
- package/dist/tools/ask.js +13 -0
- package/dist/tools/ask.js.map +1 -1
- package/dist/tools/diff.cjs +59 -30
- package/dist/tools/diff.cjs.map +1 -1
- package/dist/tools/diff.d.cts +1 -1
- package/dist/tools/diff.d.ts +1 -1
- package/dist/tools/diff.js +59 -30
- package/dist/tools/diff.js.map +1 -1
- package/dist/tools/directories.d.cts +1 -1
- package/dist/tools/directories.d.ts +1 -1
- package/dist/tools/explore.cjs +1050 -309
- package/dist/tools/explore.cjs.map +1 -1
- package/dist/tools/explore.d.cts +2 -2
- package/dist/tools/explore.d.ts +2 -2
- package/dist/tools/explore.js +1057 -309
- package/dist/tools/explore.js.map +1 -1
- package/dist/tools/files.cjs +58 -43
- package/dist/tools/files.cjs.map +1 -1
- package/dist/tools/files.d.cts +10 -4
- package/dist/tools/files.d.ts +10 -4
- package/dist/tools/files.js +56 -42
- package/dist/tools/files.js.map +1 -1
- package/dist/tools/git.cjs +816 -63
- package/dist/tools/git.cjs.map +1 -1
- package/dist/tools/git.d.cts +200 -2
- package/dist/tools/git.d.ts +200 -2
- package/dist/tools/git.js +788 -62
- package/dist/tools/git.js.map +1 -1
- package/dist/tools/media.cjs +1191 -0
- package/dist/tools/media.cjs.map +1 -0
- package/dist/tools/media.d.cts +31 -0
- package/dist/tools/media.d.ts +31 -0
- package/dist/tools/media.js +1159 -0
- package/dist/tools/media.js.map +1 -0
- package/dist/tools/plan.d.cts +1 -1
- package/dist/tools/plan.d.ts +1 -1
- package/dist/tools/search.cjs +513 -33
- package/dist/tools/search.cjs.map +1 -1
- package/dist/tools/search.d.cts +12 -1
- package/dist/tools/search.d.ts +12 -1
- package/dist/tools/search.js +508 -33
- package/dist/tools/search.js.map +1 -1
- package/dist/tools/shell.cjs +631 -41
- package/dist/tools/shell.cjs.map +1 -1
- package/dist/tools/shell.d.cts +37 -4
- package/dist/tools/shell.d.ts +37 -4
- package/dist/tools/shell.js +626 -40
- package/dist/tools/shell.js.map +1 -1
- package/dist/tools/todo.d.cts +1 -1
- package/dist/tools/todo.d.ts +1 -1
- package/dist/tools/web.cjs +51 -18
- package/dist/tools/web.cjs.map +1 -1
- package/dist/tools/web.d.cts +1 -1
- package/dist/tools/web.d.ts +1 -1
- package/dist/tools/web.js +51 -18
- package/dist/tools/web.js.map +1 -1
- package/package.json +43 -8
package/README.oss.en.md
ADDED
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
# ZQAgent
|
|
2
|
+
|
|
3
|
+
**English** · [简体中文](./README.md) · [繁體中文](./README.zh-TW.md)
|
|
4
|
+
|
|
5
|
+
**Your AI assistant in the terminal, on the desktop, or on your phone — write code, edit files, run commands. Anything with side effects asks you first.**
|
|
6
|
+
|
|
7
|
+
[](https://github.com/__OSS_REPO__/actions/workflows/ci.yml)
|
|
8
|
+
[](./LICENSE)
|
|
9
|
+
[](https://nodejs.org/)
|
|
10
|
+
|
|
11
|
+

|
|
12
|
+
|
|
13
|
+
ZQAgent is a self-hostable AI coding agent. It reads code, edits files, and runs commands on its own — but **every side-effecting action asks for your approval first**.
|
|
14
|
+
|
|
15
|
+
- **Bring your own model key** — DeepSeek, OpenAI, or any OpenAI-compatible endpoint. Pay for what you use instead of a subscription.
|
|
16
|
+
- **Approval by default** — four modes (discuss / plan / interactive / auto); file writes and shell commands are confirmed one by one.
|
|
17
|
+
- **Works everywhere** — terminal CLI, desktop app, and remote task dispatch from your phone or QQ.
|
|
18
|
+
- **Extensible** — plug in MCP servers, or add command tools and custom agents; changes take effect immediately.
|
|
19
|
+
|
|
20
|
+
> This repository is the **open-source part**: the agent engine, built-in tools, permission system, CLI, and node service.
|
|
21
|
+
> Cloud accounts, subscriptions, and billing (Hub) are closed source, and are not required for local use.
|
|
22
|
+
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
## Install
|
|
26
|
+
|
|
27
|
+
**Linux (no dependencies, recommended)**
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
curl -fsSL https://agent.cd-zq.com/install.sh | sh
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
The script downloads a single-file executable for your architecture, verifies its SHA-256, and puts it on your `PATH`. No Node.js required.
|
|
34
|
+
|
|
35
|
+
**Other platforms / npm** (requires Node.js >= 18.17)
|
|
36
|
+
|
|
37
|
+
```bash
|
|
38
|
+
npm i -g @zqagent/core
|
|
39
|
+
zqagent
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
On first launch, run `/connect` and follow the prompts: pick a provider (OpenAI / DeepSeek / Qwen / Zhipu GLM / Kimi / custom) → enter your API key → choose a model → set reasoning effort. Keys are encrypted with AES-256-GCM and stored locally in `~/.config/zqagent/`; they are never uploaded.
|
|
43
|
+
|
|
44
|
+
To run from source instead:
|
|
45
|
+
|
|
46
|
+
```bash
|
|
47
|
+
pnpm install
|
|
48
|
+
pnpm build
|
|
49
|
+
node packages/core/bin/zqagent
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
## Quick start
|
|
53
|
+
|
|
54
|
+
```text
|
|
55
|
+
$ zqagent
|
|
56
|
+
[interactive][code] > read this project and tell me what it does
|
|
57
|
+
|
|
58
|
+
● list_files .
|
|
59
|
+
● read_file README.md
|
|
60
|
+
● read_file package.json
|
|
61
|
+
✓ This is a TypeScript AI agent engine...
|
|
62
|
+
|
|
63
|
+
[interactive][code] > change the default port in src/config.ts to 8788, then run the tests
|
|
64
|
+
|
|
65
|
+
● read_file src/config.ts
|
|
66
|
+
⏵ replace_in_file 1 change, waiting for approval
|
|
67
|
+
[Y] allow once [A] always allow [D] deny
|
|
68
|
+
> Y
|
|
69
|
+
● run_shell pnpm test
|
|
70
|
+
✓ 42 passed
|
|
71
|
+
✓ Changed the default port; tests pass
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
Common commands:
|
|
75
|
+
|
|
76
|
+
| Command | Description |
|
|
77
|
+
| --- | --- |
|
|
78
|
+
| `/connect` | Configure the model connection (provider / key / model / reasoning effort) |
|
|
79
|
+
| `/plan` | Plan mode: read-only exploration, proposes a plan and waits |
|
|
80
|
+
| `/interactive` | Interactive mode: every side-effecting action needs approval (default) |
|
|
81
|
+
| `/auto` | Auto mode: allow everything (risky — use in isolated environments only) |
|
|
82
|
+
| `/discuss` | Discuss mode: read-only conversation |
|
|
83
|
+
| `/sessions` | List and resume previous sessions |
|
|
84
|
+
| `/agent` | Switch or maintain custom agents |
|
|
85
|
+
| `/mcp` | Manage MCP servers |
|
|
86
|
+
| `/tools` | Show all tools and their risk levels |
|
|
87
|
+
|
|
88
|
+
While a task is running you can type additional instructions at any time — no need to wait for it to finish. Press `ESC` twice to interrupt.
|
|
89
|
+
|
|
90
|
+
## How it works
|
|
91
|
+
|
|
92
|
+

|
|
93
|
+
|
|
94
|
+
`TurnEngine` drives each task: the model thinks → calls a tool → observes the result → next round,
|
|
95
|
+
until the task is done or the turn limit is reached.
|
|
96
|
+
|
|
97
|
+
Every tool call goes through `PermissionEngine`: each tool declares a risk level (read / write / exec),
|
|
98
|
+
and the current mode decides whether it runs directly or requires approval.
|
|
99
|
+
|
|
100
|
+
## Built-in tools
|
|
101
|
+
|
|
102
|
+
| Category | Tools |
|
|
103
|
+
| --- | --- |
|
|
104
|
+
| Files | `read_file` `write_file` `replace_in_file` `list_files` `grep` |
|
|
105
|
+
| Shell | `run_shell` `shell_task_output` `shell_task_kill` (persistent shell, background tasks) |
|
|
106
|
+
| Web | `web_search` `web_fetch` |
|
|
107
|
+
| Git | `git_log` `git_status` `git_diff` |
|
|
108
|
+
| Patches | `apply_patch` `apply_unified_diff` |
|
|
109
|
+
| Collaboration | `ask_user` `propose_plan` `request_directory` `todo_write` |
|
|
110
|
+
| Exploration | `explore` (sub-agent for cross-file research; returns conclusions only) |
|
|
111
|
+
| Media | `media` `ffmpeg` `ffprobe` (audio/video; requires ffmpeg on the host) |
|
|
112
|
+
|
|
113
|
+
Tools can be added, removed, or disabled at runtime; the next model call picks up the change immediately.
|
|
114
|
+
|
|
115
|
+
## Security model
|
|
116
|
+
|
|
117
|
+
ZQAgent assumes **model output is untrusted**:
|
|
118
|
+
|
|
119
|
+
- File writes, command execution, and network access require approval by default.
|
|
120
|
+
- API keys are encrypted locally and never appear in the repository or logs.
|
|
121
|
+
- The workspace is the permission boundary: the agent has exactly the permissions of the user and directory it was started in.
|
|
122
|
+
- Do not expose the node service directly to the internet.
|
|
123
|
+
|
|
124
|
+
Please **do not open a public issue** for security problems — follow [SECURITY.md](./SECURITY.md) instead.
|
|
125
|
+
|
|
126
|
+
## Documentation
|
|
127
|
+
|
|
128
|
+
| Topic | Document |
|
|
129
|
+
| --- | --- |
|
|
130
|
+
| Architecture and event flow | [docs/en/architecture.md](./docs/en/architecture.md) |
|
|
131
|
+
| Wire protocol (frames / messages / signatures) | [docs/en/wire-protocol.md](./docs/en/wire-protocol.md) |
|
|
132
|
+
| Node service REST API | [docs/en/server-api.md](./docs/en/server-api.md) |
|
|
133
|
+
| Shared library (protocol / crypto / approvals / notifications) | [docs/en/shared.md](./docs/en/shared.md) |
|
|
134
|
+
| Context compaction | [docs/en/context-compaction.md](./docs/en/context-compaction.md) |
|
|
135
|
+
| LLM connection errors | [docs/en/llm-connection-troubleshooting.md](./docs/en/llm-connection-troubleshooting.md) |
|
|
136
|
+
| QQ bot integration | [docs/qq-bot.md](./docs/qq-bot.md) *(Chinese)* |
|
|
137
|
+
| Windows tool compatibility | [docs/windows-tool-compat.md](./docs/windows-tool-compat.md) *(Chinese)* |
|
|
138
|
+
| CLI single-file (SEA) packaging and troubleshooting | [docs/cli-sea-troubleshooting.md](./docs/cli-sea-troubleshooting.md) *(Chinese)* |
|
|
139
|
+
|
|
140
|
+
Every document except the QQ bot, Windows compatibility, and CLI-packaging notes is available
|
|
141
|
+
in English; those three are currently Chinese only.
|
|
142
|
+
|
|
143
|
+
User-facing guides (installation, CLI usage, agents, MCP): <https://agent.cd-zq.com/en/>
|
|
144
|
+
|
|
145
|
+
## Development
|
|
146
|
+
|
|
147
|
+
```bash
|
|
148
|
+
pnpm install
|
|
149
|
+
pnpm typecheck # tsc --noEmit
|
|
150
|
+
pnpm test # vitest
|
|
151
|
+
pnpm build # tsup → dist/
|
|
152
|
+
pnpm dev # run the CLI from source
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
Please read [CONTRIBUTING.md](./CONTRIBUTING.md) before submitting a pull request. Changes touching permissions,
|
|
156
|
+
approval, or command execution get extra scrutiny.
|
|
157
|
+
|
|
158
|
+
## License
|
|
159
|
+
|
|
160
|
+
[Apache-2.0](./LICENSE). `@zqagent` and the ZQAgent name are trademarks of this project;
|
|
161
|
+
redistributions and hosted services must not imply official endorsement.
|
package/README.oss.md
ADDED
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
# ZQAgent
|
|
2
|
+
|
|
3
|
+
**简体中文** · [English](./README.en.md) · [繁體中文](./README.zh-TW.md)
|
|
4
|
+
|
|
5
|
+
**在终端、桌面或手机上,让 AI 帮你写代码、改文件、跑命令——有副作用的操作先问你。**
|
|
6
|
+
|
|
7
|
+
[](https://github.com/__OSS_REPO__/actions/workflows/ci.yml)
|
|
8
|
+
[](./LICENSE)
|
|
9
|
+
[](https://nodejs.org/)
|
|
10
|
+
|
|
11
|
+

|
|
12
|
+
|
|
13
|
+
ZQAgent 是一个可自托管的 AI 编码 Agent。它自己读代码、改文件、跑命令,但**每一个有副作用的动作都会先问你**。
|
|
14
|
+
|
|
15
|
+
- **自带模型 Key**:DeepSeek、OpenAI 或任意 OpenAI 兼容端点,用多少花多少,不被订阅制绑定。
|
|
16
|
+
- **审批可控**:讨论 / 计划 / 交互 / 自动四种模式,写文件、执行命令逐次确认。
|
|
17
|
+
- **多端可用**:终端 CLI、桌面应用,以及手机或 QQ 远程派任务。
|
|
18
|
+
- **可扩展**:接入 MCP 外部工具,或用命令工具、自定义 Agent 扩展能力,改完即生效。
|
|
19
|
+
|
|
20
|
+
> 本仓库是**开源部分**:Agent 引擎、内置工具、权限系统、CLI 与节点服务。
|
|
21
|
+
> 云端账号、订阅与计费(Hub)为闭源,但不影响本地完整使用。
|
|
22
|
+
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
## 安装
|
|
26
|
+
|
|
27
|
+
**Linux(零依赖,推荐)**
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
curl -fsSL https://agent.cd-zq.com/install.sh | sh
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
脚本下载对应架构的单文件可执行程序、校验 SHA-256,并装进 `PATH`,无需预先安装 Node。
|
|
34
|
+
|
|
35
|
+
**其它平台 / 用 npm 管理版本**(需要 Node.js >= 18.17)
|
|
36
|
+
|
|
37
|
+
```bash
|
|
38
|
+
npm i -g @zqagent/core
|
|
39
|
+
zqagent
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
首次启动输入 `/connect`,按提示选择 provider(DeepSeek / OpenAI / 自定义)→ 填写 API Key →
|
|
43
|
+
选择模型 → 设置推理强度。Key 使用 AES-256-GCM 加密保存在本机 `~/.config/zqagent/`,
|
|
44
|
+
不会上传到任何服务器。
|
|
45
|
+
|
|
46
|
+
不想全局安装,也可以直接从源码运行:
|
|
47
|
+
|
|
48
|
+
```bash
|
|
49
|
+
pnpm install
|
|
50
|
+
pnpm build
|
|
51
|
+
node packages/core/bin/zqagent
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
## 快速开始
|
|
55
|
+
|
|
56
|
+
```text
|
|
57
|
+
$ zqagent
|
|
58
|
+
[interactive][code] > 读一下这个项目,告诉我它是做什么的
|
|
59
|
+
|
|
60
|
+
● list_files .
|
|
61
|
+
● read_file README.md
|
|
62
|
+
● read_file package.json
|
|
63
|
+
✓ 这是一个 TypeScript 实现的 AI Agent 引擎……
|
|
64
|
+
|
|
65
|
+
[interactive][code] > 把 src/config.ts 里的默认端口改成 8788,然后跑测试
|
|
66
|
+
|
|
67
|
+
● read_file src/config.ts
|
|
68
|
+
⏵ replace_in_file 1 处修改,等待审批
|
|
69
|
+
[Y] 允许一次 [A] 总是允许 [D] 拒绝
|
|
70
|
+
> Y
|
|
71
|
+
● run_shell pnpm test
|
|
72
|
+
✓ 42 passed
|
|
73
|
+
✓ 已修改默认端口,测试通过
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
常用命令:
|
|
77
|
+
|
|
78
|
+
| 命令 | 说明 |
|
|
79
|
+
| --- | --- |
|
|
80
|
+
| `/connect` | 配置模型连接(provider / Key / 模型 / 推理强度) |
|
|
81
|
+
| `/plan` | 计划模式:只读探索,输出方案后等待确认 |
|
|
82
|
+
| `/interactive` | 交互模式:有副作用的操作逐次审批(默认) |
|
|
83
|
+
| `/auto` | 自动模式:全部放行(高风险,建议只在隔离环境使用) |
|
|
84
|
+
| `/discuss` | 讨论模式:纯只读对话 |
|
|
85
|
+
| `/sessions` | 列出并恢复历史会话 |
|
|
86
|
+
| `/agent` | 切换或维护自定义 Agent |
|
|
87
|
+
| `/mcp` | 管理 MCP 服务器 |
|
|
88
|
+
| `/tools` | 查看全部工具及其风险等级 |
|
|
89
|
+
|
|
90
|
+
任务执行过程中可以直接输入文字追加指示,无需等它跑完;连按两次 `ESC` 中断。
|
|
91
|
+
|
|
92
|
+
## 它是怎么工作的
|
|
93
|
+
|
|
94
|
+

|
|
95
|
+
|
|
96
|
+
一次任务由 `TurnEngine` 驱动:模型思考 → 调用工具 → 观察结果 → 进入下一轮,
|
|
97
|
+
直到任务完成或达到轮次上限。
|
|
98
|
+
|
|
99
|
+
所有工具调用都经过 `PermissionEngine`:每个工具声明风险等级(读 / 写 / 执行),
|
|
100
|
+
再由当前运行模式决定是直接放行、还是弹出审批。
|
|
101
|
+
|
|
102
|
+
## 内置工具
|
|
103
|
+
|
|
104
|
+
| 类别 | 工具 |
|
|
105
|
+
| --- | --- |
|
|
106
|
+
| 文件 | `read_file` `write_file` `replace_in_file` `list_files` `grep` |
|
|
107
|
+
| Shell | `run_shell` `shell_task_output` `shell_task_kill`(持久化 shell,支持后台任务) |
|
|
108
|
+
| 网络 | `web_search` `web_fetch` |
|
|
109
|
+
| Git | `git_log` `git_status` `git_diff` |
|
|
110
|
+
| 补丁 | `apply_patch` `apply_unified_diff` |
|
|
111
|
+
| 协作 | `ask_user` `propose_plan` `request_directory` `todo_write` |
|
|
112
|
+
| 探索 | `explore`(子代理:跨文件调研,只返回结论) |
|
|
113
|
+
| 媒体 | `media` `ffmpeg` `ffprobe`(音视频处理,需本机有 ffmpeg) |
|
|
114
|
+
|
|
115
|
+
工具可在运行时新增、删除、禁用,下一次模型调用立即生效。
|
|
116
|
+
|
|
117
|
+
## 安全模型
|
|
118
|
+
|
|
119
|
+
ZQAgent 的前提是**模型输出不可信**:
|
|
120
|
+
|
|
121
|
+
- 写文件、执行命令、访问网络默认需要审批。
|
|
122
|
+
- API Key 加密存储在本机,仓库与日志中不会出现明文。
|
|
123
|
+
- 工作区就是权限边界:以哪个用户、在哪个目录启动,就拥有该用户对该目录的权限。
|
|
124
|
+
- 不要把节点服务直接暴露到公网。
|
|
125
|
+
|
|
126
|
+
发现安全问题请**不要开公开 issue**,按 [SECURITY.md](./SECURITY.md) 私下报告。
|
|
127
|
+
|
|
128
|
+
## 文档
|
|
129
|
+
|
|
130
|
+
| 主题 | 文档 |
|
|
131
|
+
| --- | --- |
|
|
132
|
+
| 架构与事件流 | [docs/architecture.md](./docs/architecture.md) |
|
|
133
|
+
| 线协议(帧 / 消息 / 签名) | [docs/wire-protocol.md](./docs/wire-protocol.md) |
|
|
134
|
+
| 上下文压缩 | [docs/context-compaction.md](./docs/context-compaction.md) |
|
|
135
|
+
| 节点服务 REST API | [docs/server-api.md](./docs/server-api.md) |
|
|
136
|
+
| QQ 机器人 | [docs/qq-bot.md](./docs/qq-bot.md) |
|
|
137
|
+
| 共享库(协议 / 加密 / 审批 / 通知) | [docs/shared.md](./docs/shared.md) |
|
|
138
|
+
| Windows 终端兼容 | [docs/windows-tool-compat.md](./docs/windows-tool-compat.md) |
|
|
139
|
+
| 单文件可执行(SEA)排错 | [docs/cli-sea-troubleshooting.md](./docs/cli-sea-troubleshooting.md) |
|
|
140
|
+
| LLM 连接错误排查 | [docs/llm-connection-troubleshooting.md](./docs/llm-connection-troubleshooting.md) |
|
|
141
|
+
|
|
142
|
+
面向使用者的指南(安装、CLI 用法、Agent、MCP):<https://agent.cd-zq.com/>
|
|
143
|
+
|
|
144
|
+
架构、线协议、REST API、共享库、上下文压缩与连接排错另有英文版:
|
|
145
|
+
[architecture](./docs/en/architecture.md) · [wire-protocol](./docs/en/wire-protocol.md) ·
|
|
146
|
+
[server-api](./docs/en/server-api.md) · [shared](./docs/en/shared.md) ·
|
|
147
|
+
[context-compaction](./docs/en/context-compaction.md) ·
|
|
148
|
+
[llm-connection](./docs/en/llm-connection-troubleshooting.md)
|
|
149
|
+
|
|
150
|
+
## 开发
|
|
151
|
+
|
|
152
|
+
```bash
|
|
153
|
+
pnpm install
|
|
154
|
+
pnpm typecheck # tsc --noEmit
|
|
155
|
+
pnpm test # vitest
|
|
156
|
+
pnpm build # tsup → dist/
|
|
157
|
+
pnpm dev # 源码方式启动 CLI
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
提交前请阅读 [CONTRIBUTING.md](./CONTRIBUTING.md)。涉及权限、审批、命令执行的改动会被重点审查。
|
|
161
|
+
|
|
162
|
+
## 许可
|
|
163
|
+
|
|
164
|
+
[Apache-2.0](./LICENSE)。`@zqagent` 与 ZQAgent 名称为本项目商标,
|
|
165
|
+
二次分发或托管服务请勿暗示官方背书。
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
# ZQAgent
|
|
2
|
+
|
|
3
|
+
[简体中文](./README.md) · [English](./README.en.md) · **繁體中文**
|
|
4
|
+
|
|
5
|
+
**在終端、桌面或手機上,讓 AI 幫你寫程式、改檔案、跑指令——有副作用的操作會先問你。**
|
|
6
|
+
|
|
7
|
+
[](https://github.com/__OSS_REPO__/actions/workflows/ci.yml)
|
|
8
|
+
[](./LICENSE)
|
|
9
|
+
[](https://nodejs.org/)
|
|
10
|
+
|
|
11
|
+

|
|
12
|
+
|
|
13
|
+
ZQAgent 是一個可自架的 AI 編碼 Agent。它會自己讀程式碼、改檔案、跑指令,但**每一個有副作用的動作都會先問你**。
|
|
14
|
+
|
|
15
|
+
- **自備模型金鑰**:DeepSeek、OpenAI 或任意 OpenAI 相容端點,用多少付多少,不被訂閱制綁住。
|
|
16
|
+
- **預設需審批**:討論 / 計畫 / 互動 / 自動四種模式,寫檔案、執行指令逐次確認。
|
|
17
|
+
- **多端可用**:終端 CLI、桌面應用,以及從手機或 QQ 遠端派任務。
|
|
18
|
+
- **可擴充**:接入 MCP 外部工具,或用指令工具、自訂 Agent 擴充能力,改完即生效。
|
|
19
|
+
|
|
20
|
+
> 本儲存庫是**開源部分**:Agent 引擎、內建工具、權限系統、CLI 與節點服務。
|
|
21
|
+
> 雲端帳號、訂閱與計費(Hub)為閉源,但不影響本機完整使用。
|
|
22
|
+
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
## 安裝
|
|
26
|
+
|
|
27
|
+
**Linux(零依賴,推薦)**
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
curl -fsSL https://agent.cd-zq.com/install.sh | sh
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
腳本會下載對應架構的單檔可執行檔、驗證 SHA-256,並放進 `PATH`,不需要預先安裝 Node.js。
|
|
34
|
+
|
|
35
|
+
**其它平台 / 用 npm**(需要 Node.js >= 18.17)
|
|
36
|
+
|
|
37
|
+
```bash
|
|
38
|
+
npm i -g @zqagent/core
|
|
39
|
+
zqagent
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
首次啟動請輸入 `/connect`,依提示選擇 provider(OpenAI / DeepSeek / 通義千問 / 智譜 GLM / Kimi / 自訂)→
|
|
43
|
+
輸入 API Key → 選擇模型 → 設定推理強度。金鑰以 AES-256-GCM 加密保存在本機
|
|
44
|
+
`~/.config/zqagent/`,不會上傳。
|
|
45
|
+
|
|
46
|
+
也可以直接從原始碼執行:
|
|
47
|
+
|
|
48
|
+
```bash
|
|
49
|
+
pnpm install
|
|
50
|
+
pnpm build
|
|
51
|
+
node packages/core/bin/zqagent
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
## 快速開始
|
|
55
|
+
|
|
56
|
+
```text
|
|
57
|
+
$ zqagent
|
|
58
|
+
[interactive][code] > 讀一下這個專案,用三句話說明它在做什麼
|
|
59
|
+
|
|
60
|
+
● list_files .
|
|
61
|
+
● read_file README.md
|
|
62
|
+
● read_file package.json
|
|
63
|
+
✓ 這是一個 TypeScript 實作的 AI Agent 引擎……
|
|
64
|
+
|
|
65
|
+
[interactive][code] > 把 src/config.ts 的預設連接埠改成 8788,然後跑測試
|
|
66
|
+
|
|
67
|
+
● read_file src/config.ts
|
|
68
|
+
⏵ replace_in_file 1 處修改,等待審批
|
|
69
|
+
[Y] 允許一次 [A] 總是允許 [D] 拒絕
|
|
70
|
+
> Y
|
|
71
|
+
● run_shell pnpm test
|
|
72
|
+
✓ 42 passed
|
|
73
|
+
✓ 已修改預設連接埠,測試通過
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
常用指令:
|
|
77
|
+
|
|
78
|
+
| 指令 | 說明 |
|
|
79
|
+
| --- | --- |
|
|
80
|
+
| `/connect` | 設定模型連線(provider / 金鑰 / 模型 / 推理強度) |
|
|
81
|
+
| `/plan` | 計畫模式:唯讀探索,提出方案後等待確認 |
|
|
82
|
+
| `/interactive` | 互動模式:有副作用的操作逐次審批(預設) |
|
|
83
|
+
| `/auto` | 自動模式:全部放行(高風險,建議只在隔離環境使用) |
|
|
84
|
+
| `/discuss` | 討論模式:純唯讀對話 |
|
|
85
|
+
| `/sessions` | 列出並恢復歷史工作階段 |
|
|
86
|
+
| `/agent` | 切換或維護自訂 Agent |
|
|
87
|
+
| `/mcp` | 管理 MCP 伺服器 |
|
|
88
|
+
| `/tools` | 檢視全部工具及其風險等級 |
|
|
89
|
+
|
|
90
|
+
任務執行過程中可以直接輸入文字追加指示,不需等它跑完;連按兩次 `ESC` 中斷。
|
|
91
|
+
|
|
92
|
+
## 運作方式
|
|
93
|
+
|
|
94
|
+

|
|
95
|
+
|
|
96
|
+
每個任務由 `TurnEngine` 驅動:模型思考 → 呼叫工具 → 觀察結果 → 進入下一輪,
|
|
97
|
+
直到任務完成或達到輪次上限。
|
|
98
|
+
|
|
99
|
+
所有工具呼叫都經過 `PermissionEngine`:每個工具宣告風險等級(讀 / 寫 / 執行),
|
|
100
|
+
再由目前的執行模式決定是直接放行,還是跳出審批。
|
|
101
|
+
|
|
102
|
+
## 內建工具
|
|
103
|
+
|
|
104
|
+
| 類別 | 工具 |
|
|
105
|
+
| --- | --- |
|
|
106
|
+
| 檔案 | `read_file` `write_file` `replace_in_file` `list_files` `grep` |
|
|
107
|
+
| Shell | `run_shell` `shell_task_output` `shell_task_kill`(持續連線的 shell,支援背景任務) |
|
|
108
|
+
| 網路 | `web_search` `web_fetch` |
|
|
109
|
+
| Git | `git_log` `git_status` `git_diff` |
|
|
110
|
+
| 補丁 | `apply_patch` `apply_unified_diff` |
|
|
111
|
+
| 協作 | `ask_user` `propose_plan` `request_directory` `todo_write` |
|
|
112
|
+
| 探索 | `explore`(子代理:跨檔案調研,只回傳結論) |
|
|
113
|
+
| 媒體 | `media` `ffmpeg` `ffprobe`(影音處理,需本機有 ffmpeg) |
|
|
114
|
+
|
|
115
|
+
工具可在執行時新增、移除、停用,下一次模型呼叫立即生效。
|
|
116
|
+
|
|
117
|
+
## 安全模型
|
|
118
|
+
|
|
119
|
+
ZQAgent 的前提是**模型輸出不可信**:
|
|
120
|
+
|
|
121
|
+
- 寫檔案、執行指令、存取網路預設需要審批。
|
|
122
|
+
- API Key 加密保存在本機,儲存庫與日誌中不會出現明文。
|
|
123
|
+
- 工作區就是權限邊界:以哪個使用者、在哪個目錄啟動,就擁有該使用者對該目錄的權限。
|
|
124
|
+
- 不要把節點服務直接暴露到公網。
|
|
125
|
+
|
|
126
|
+
發現安全問題請**不要開公開 issue**,請依 [SECURITY.md](./SECURITY.md) 私下回報。
|
|
127
|
+
|
|
128
|
+
## 文件
|
|
129
|
+
|
|
130
|
+
| 主題 | 文件 |
|
|
131
|
+
| --- | --- |
|
|
132
|
+
| 架構與事件流 | [docs/architecture.md](./docs/architecture.md) |
|
|
133
|
+
| 線協議(幀 / 訊息 / 簽章) | [docs/wire-protocol.md](./docs/wire-protocol.md) |
|
|
134
|
+
| 上下文壓縮 | [docs/context-compaction.md](./docs/context-compaction.md) |
|
|
135
|
+
| 節點服務 REST API | [docs/server-api.md](./docs/server-api.md) |
|
|
136
|
+
| 共享函式庫(協議 / 加密 / 審批 / 通知) | [docs/shared.md](./docs/shared.md) |
|
|
137
|
+
| QQ 機器人 | [docs/qq-bot.md](./docs/qq-bot.md) |
|
|
138
|
+
| Windows 終端相容性 | [docs/windows-tool-compat.md](./docs/windows-tool-compat.md) |
|
|
139
|
+
| CLI 單檔(SEA)打包與排錯 | [docs/cli-sea-troubleshooting.md](./docs/cli-sea-troubleshooting.md) |
|
|
140
|
+
| LLM 連線錯誤排查 | [docs/llm-connection-troubleshooting.md](./docs/llm-connection-troubleshooting.md) |
|
|
141
|
+
|
|
142
|
+
使用者導向的指南(安裝、CLI 用法、Agent、MCP):<https://agent.cd-zq.com/>
|
|
143
|
+
|
|
144
|
+
架構、線協議、REST API、共享函式庫、上下文壓縮與連線排錯另有英文版:
|
|
145
|
+
[architecture](./docs/en/architecture.md) · [wire-protocol](./docs/en/wire-protocol.md) ·
|
|
146
|
+
[server-api](./docs/en/server-api.md) · [shared](./docs/en/shared.md) ·
|
|
147
|
+
[context-compaction](./docs/en/context-compaction.md) ·
|
|
148
|
+
[llm-connection](./docs/en/llm-connection-troubleshooting.md)
|
|
149
|
+
|
|
150
|
+
## 開發
|
|
151
|
+
|
|
152
|
+
```bash
|
|
153
|
+
pnpm install
|
|
154
|
+
pnpm typecheck # tsc --noEmit
|
|
155
|
+
pnpm test # vitest
|
|
156
|
+
pnpm build # tsup → dist/
|
|
157
|
+
pnpm dev # 以原始碼啟動 CLI
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
提交前請閱讀 [CONTRIBUTING.md](./CONTRIBUTING.md)。涉及權限、審批、指令執行的變更會被重點審查。
|
|
161
|
+
|
|
162
|
+
## 授權
|
|
163
|
+
|
|
164
|
+
[Apache-2.0](./LICENSE)。`@zqagent` 與 ZQAgent 名稱為本專案商標,
|
|
165
|
+
二次散布或託管服務請勿暗示官方背書。
|
package/SECURITY.md
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
# 安全策略
|
|
2
|
+
|
|
3
|
+
## 报告漏洞
|
|
4
|
+
|
|
5
|
+
**请不要用公开 issue 报告安全问题。** ZQAgent 会读写文件、执行命令,安全问题一旦公开,
|
|
6
|
+
影响的是所有已部署的节点。
|
|
7
|
+
|
|
8
|
+
请通过以下任一渠道私下报告:
|
|
9
|
+
|
|
10
|
+
- 邮件:security@cd-zq.com(如需 PGP 加密,请先来信说明,我们会提供公钥)
|
|
11
|
+
- 或通过 GitHub 的 [Private vulnerability reporting](https://docs.github.com/en/code-security/security-advisories/guidance-on-reporting-and-writing/privately-reporting-a-security-vulnerability)
|
|
12
|
+
|
|
13
|
+
请在报告中包含:
|
|
14
|
+
|
|
15
|
+
- 受影响的版本(`zqagent --version`)与平台
|
|
16
|
+
- 复现步骤或最小复现脚本
|
|
17
|
+
- 影响范围(能否绕过审批、读到工作区外的文件、执行未授权命令等)
|
|
18
|
+
|
|
19
|
+
## 响应时限
|
|
20
|
+
|
|
21
|
+
| 阶段 | 目标 |
|
|
22
|
+
| --- | --- |
|
|
23
|
+
| 确认收到 | 3 个工作日内 |
|
|
24
|
+
| 初步评估与定级 | 7 个工作日内 |
|
|
25
|
+
| 修复与披露 | 视严重程度,一般 30 天内 |
|
|
26
|
+
|
|
27
|
+
修复发布后,我们会在 CHANGELOG 与 GitHub Security Advisory 中致谢报告者(除非你要求匿名)。
|
|
28
|
+
|
|
29
|
+
## 支持范围
|
|
30
|
+
|
|
31
|
+
| 版本 | 是否接收安全修复 |
|
|
32
|
+
| --- | --- |
|
|
33
|
+
| 最新 minor | ✅ |
|
|
34
|
+
| 上一个 minor | ✅(仅高危) |
|
|
35
|
+
| 更早版本 | ❌ 请先升级 |
|
|
36
|
+
|
|
37
|
+
## 安全边界(部署前请知悉)
|
|
38
|
+
|
|
39
|
+
ZQAgent 的设计前提是:**模型输出不可信**。因此:
|
|
40
|
+
|
|
41
|
+
- 写文件、执行命令、访问网络等有副作用的操作默认需要逐次审批(`interactive` 模式)。
|
|
42
|
+
- `auto` 模式会跳过审批,只应在隔离环境或可丢弃的工作区使用。
|
|
43
|
+
- API Key 使用 AES-256-GCM 加密保存在本机 `~/.config/zqagent/`,但仍建议为 agent 单独申请一把低权限、可限额的 Key。
|
|
44
|
+
- 不要把 `zqagent serve` 直接暴露到公网;对外提供服务请通过反向代理并启用鉴权。
|
|
45
|
+
- 工作区即权限边界:以哪个用户、在哪个目录启动,就拥有该用户对该目录的全部权限。
|
|
46
|
+
|
|
47
|
+
## 不在范围内的报告
|
|
48
|
+
|
|
49
|
+
- 需要用户主动执行 `auto` 模式或手动放行后才会发生的问题
|
|
50
|
+
- 依赖库自身的已知漏洞(请同时反馈给上游,我们会跟进升级)
|
|
51
|
+
- 缺少速率限制、缺少 HTTPS 等纯部署配置问题(可提普通 issue)
|
|
@@ -86,7 +86,7 @@ interface Message {
|
|
|
86
86
|
};
|
|
87
87
|
}[];
|
|
88
88
|
/** 通知类型:错误 / 中断 / 上下文压缩 / 模型切换 */
|
|
89
|
-
kind?: "error" | "interrupted" | "compacted" | "model_switch";
|
|
89
|
+
kind?: "error" | "interrupted" | "compacted" | "model_switch" | "retry";
|
|
90
90
|
/** 通知附加文本 */
|
|
91
91
|
text?: string;
|
|
92
92
|
}
|
|
@@ -139,6 +139,14 @@ interface ToolMetadata {
|
|
|
139
139
|
/** 是否强制需要人工审批 */
|
|
140
140
|
requiresApproval: boolean;
|
|
141
141
|
}
|
|
142
|
+
/** 工具执行上下文(由引擎注入) */
|
|
143
|
+
interface ToolExecContext {
|
|
144
|
+
/**
|
|
145
|
+
* 中断信号。可中断的工具(如 run_shell)应把它传给子进程,
|
|
146
|
+
* 使用户中断能立即终止正在执行的命令,而不是等命令自然结束。
|
|
147
|
+
*/
|
|
148
|
+
signal?: AbortSignal;
|
|
149
|
+
}
|
|
142
150
|
/** 单个工具规格 */
|
|
143
151
|
interface ToolSpec {
|
|
144
152
|
/** 工具名 */
|
|
@@ -146,7 +154,7 @@ interface ToolSpec {
|
|
|
146
154
|
/** OpenAI 工具 Schema(供 LLM 识别调用方式) */
|
|
147
155
|
schema: ToolSchema;
|
|
148
156
|
/** 实际执行函数 */
|
|
149
|
-
func: (args: Record<string, unknown
|
|
157
|
+
func: (args: Record<string, unknown>, ctx?: ToolExecContext) => unknown;
|
|
150
158
|
/** 工具元数据(供权限引擎评估风险) */
|
|
151
159
|
metadata: ToolMetadata;
|
|
152
160
|
/**
|
|
@@ -171,7 +179,7 @@ declare class ToolRegistry {
|
|
|
171
179
|
* @param source 工具来源标识(展示用,如 "mcp:<server>")
|
|
172
180
|
* @returns 注册完成后的 ToolSpec
|
|
173
181
|
*/
|
|
174
|
-
register(func: (args: Record<string, unknown
|
|
182
|
+
register(func: (args: Record<string, unknown>, ctx?: ToolExecContext) => unknown, metadata: ToolMetadata, schema?: ToolSchema, source?: string): ToolSpec;
|
|
175
183
|
/** 移除工具。@returns 是否移除成功 */
|
|
176
184
|
remove(name: string): boolean;
|
|
177
185
|
/** 是否存在指定工具 */
|
|
@@ -193,9 +201,10 @@ declare class ToolRegistry {
|
|
|
193
201
|
/**
|
|
194
202
|
* 执行工具
|
|
195
203
|
*
|
|
204
|
+
* @param ctx 执行上下文(引擎注入的中断信号等)
|
|
196
205
|
* @throws 工具未注册时抛出错误
|
|
197
206
|
*/
|
|
198
|
-
execute(name: string, args: Record<string, unknown
|
|
207
|
+
execute(name: string, args: Record<string, unknown>, ctx?: ToolExecContext): unknown;
|
|
199
208
|
/**
|
|
200
209
|
* 构建默认 Schema
|
|
201
210
|
*
|
|
@@ -86,7 +86,7 @@ interface Message {
|
|
|
86
86
|
};
|
|
87
87
|
}[];
|
|
88
88
|
/** 通知类型:错误 / 中断 / 上下文压缩 / 模型切换 */
|
|
89
|
-
kind?: "error" | "interrupted" | "compacted" | "model_switch";
|
|
89
|
+
kind?: "error" | "interrupted" | "compacted" | "model_switch" | "retry";
|
|
90
90
|
/** 通知附加文本 */
|
|
91
91
|
text?: string;
|
|
92
92
|
}
|
|
@@ -139,6 +139,14 @@ interface ToolMetadata {
|
|
|
139
139
|
/** 是否强制需要人工审批 */
|
|
140
140
|
requiresApproval: boolean;
|
|
141
141
|
}
|
|
142
|
+
/** 工具执行上下文(由引擎注入) */
|
|
143
|
+
interface ToolExecContext {
|
|
144
|
+
/**
|
|
145
|
+
* 中断信号。可中断的工具(如 run_shell)应把它传给子进程,
|
|
146
|
+
* 使用户中断能立即终止正在执行的命令,而不是等命令自然结束。
|
|
147
|
+
*/
|
|
148
|
+
signal?: AbortSignal;
|
|
149
|
+
}
|
|
142
150
|
/** 单个工具规格 */
|
|
143
151
|
interface ToolSpec {
|
|
144
152
|
/** 工具名 */
|
|
@@ -146,7 +154,7 @@ interface ToolSpec {
|
|
|
146
154
|
/** OpenAI 工具 Schema(供 LLM 识别调用方式) */
|
|
147
155
|
schema: ToolSchema;
|
|
148
156
|
/** 实际执行函数 */
|
|
149
|
-
func: (args: Record<string, unknown
|
|
157
|
+
func: (args: Record<string, unknown>, ctx?: ToolExecContext) => unknown;
|
|
150
158
|
/** 工具元数据(供权限引擎评估风险) */
|
|
151
159
|
metadata: ToolMetadata;
|
|
152
160
|
/**
|
|
@@ -171,7 +179,7 @@ declare class ToolRegistry {
|
|
|
171
179
|
* @param source 工具来源标识(展示用,如 "mcp:<server>")
|
|
172
180
|
* @returns 注册完成后的 ToolSpec
|
|
173
181
|
*/
|
|
174
|
-
register(func: (args: Record<string, unknown
|
|
182
|
+
register(func: (args: Record<string, unknown>, ctx?: ToolExecContext) => unknown, metadata: ToolMetadata, schema?: ToolSchema, source?: string): ToolSpec;
|
|
175
183
|
/** 移除工具。@returns 是否移除成功 */
|
|
176
184
|
remove(name: string): boolean;
|
|
177
185
|
/** 是否存在指定工具 */
|
|
@@ -193,9 +201,10 @@ declare class ToolRegistry {
|
|
|
193
201
|
/**
|
|
194
202
|
* 执行工具
|
|
195
203
|
*
|
|
204
|
+
* @param ctx 执行上下文(引擎注入的中断信号等)
|
|
196
205
|
* @throws 工具未注册时抛出错误
|
|
197
206
|
*/
|
|
198
|
-
execute(name: string, args: Record<string, unknown
|
|
207
|
+
execute(name: string, args: Record<string, unknown>, ctx?: ToolExecContext): unknown;
|
|
199
208
|
/**
|
|
200
209
|
* 构建默认 Schema
|
|
201
210
|
*
|