nexus-agentd 0.1.8 → 0.2.0
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/LICENSE +22 -22
- package/README.md +224 -446
- package/dist/a2a/runtime.d.ts +5 -4
- package/dist/a2a/runtime.js +83 -13
- package/dist/acp/runtime.d.ts +3 -8
- package/dist/acp/runtime.js +63 -79
- package/dist/completion-contract.d.ts +1 -0
- package/dist/completion-contract.js +9 -0
- package/dist/config.js +1 -15
- package/dist/control-plane.d.ts +0 -1
- package/dist/control-plane.js +1 -19
- package/dist/run-store.d.ts +1 -1
- package/dist/server.js +63 -248
- package/dist/session-contract.d.ts +3 -2
- package/dist/session.d.ts +11 -2
- package/dist/session.js +202 -17
- package/dist/types.d.ts +25 -45
- package/dist/webui/app.js +912 -1074
- package/dist/webui/icons.d.ts +0 -1
- package/dist/webui/icons.js +0 -1
- package/dist/webui/index.js +10 -10
- package/dist/webui/markup.js +65 -66
- package/dist/webui/styles.js +256 -268
- package/nexus-agentd.example.json +40 -47
- package/package.json +52 -52
- package/dist/agent-instructions.d.ts +0 -11
- package/dist/agent-instructions.js +0 -44
- package/dist/artifact-store.d.ts +0 -41
- package/dist/artifact-store.js +0 -340
- package/dist/workspace-files.d.ts +0 -48
- package/dist/workspace-files.js +0 -269
package/README.md
CHANGED
|
@@ -1,466 +1,244 @@
|
|
|
1
|
-
# Agent Nexus Gateway
|
|
2
|
-
|
|
3
|
-
[](https://github.com/lumia1998/nexus-gateway/actions/workflows/ci.yml)
|
|
4
|
-
|
|
5
|
-
`nexus-agentd` 是 Agent Nexus 的本地 Gateway。它在一台机器上统一管理 ACP 进程和远程 A2A
|
|
6
|
-
Agent,并向 Koishi AgentNexus 或其他客户端提供 HTTP/SSE API。管理控制台使用 **Agent Nexus**
|
|
7
|
-
品牌,不依赖 CDN、前端框架或父仓库。
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
--host 0.0.0.0
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
nexus-agentd \
|
|
66
|
-
--config "$HOME/.config/agent-nexus/nexus-agentd.json" \
|
|
67
|
-
--host 0.0.0.0 \
|
|
68
|
-
--port 8787 \
|
|
69
|
-
--workspace "$HOME/projects"
|
|
70
|
-
~~~
|
|
71
|
-
|
|
72
|
-
首次启动后:
|
|
73
|
-
|
|
74
|
-
1. 打开终端打印的 http://<gateway-host>:8787/ui/。
|
|
75
|
-
2. 设置至少 12 位的 Console Password。
|
|
76
|
-
3. 在 API Keys 页面创建给 Koishi 或其他客户端使用的数据面 API Key。
|
|
77
|
-
4. 在 Workspaces 页面确认工作区 allowlist,在 Agents 页面检查 ACP/A2A Agent。
|
|
78
|
-
|
|
79
|
-
Console Password 和 API Key 是两套凭证:前者只用于管理页面登录,后者只用于数据面 API。不要把 Console Password 填到 Koishi 插件的 gatewayKey。
|
|
80
|
-
|
|
81
|
-
配置已经存在时,--host、--port 和 --workspace 不会重新覆盖已有配置;后续启动只需要指定同一个 --config。
|
|
82
|
-
也可以通过 NEXUS_AGENTD_CONFIG 环境变量提供配置路径。
|
|
83
|
-
|
|
84
|
-
### systemd user service(可选)
|
|
85
|
-
|
|
86
|
-
仓库不内置 systemd unit。使用 npm 包时,可以创建 ~/.config/systemd/user/nexus-agentd.service:
|
|
87
|
-
|
|
88
|
-
~~~ini
|
|
89
|
-
[Unit]
|
|
90
|
-
Description=Nexus Agent Gateway
|
|
91
|
-
After=network-online.target
|
|
92
|
-
Wants=network-online.target
|
|
93
|
-
|
|
94
|
-
[Service]
|
|
95
|
-
Type=simple
|
|
96
|
-
WorkingDirectory=%h/projects
|
|
97
|
-
Environment=NODE_ENV=production
|
|
98
|
-
Environment="PATH=%h/.local/bin:/usr/local/bin:/usr/bin:/bin"
|
|
99
|
-
ExecStart=%h/.local/bin/nexus-agentd --config %h/.config/agent-nexus/nexus-agentd.json
|
|
100
|
-
Restart=on-failure
|
|
101
|
-
RestartSec=3
|
|
102
|
-
TimeoutStopSec=20
|
|
103
|
-
KillMode=mixed
|
|
104
|
-
UMask=0077
|
|
105
|
-
|
|
106
|
-
[Install]
|
|
107
|
-
WantedBy=default.target
|
|
108
|
-
~~~
|
|
109
|
-
|
|
110
|
-
加载、启用和检查:
|
|
111
|
-
|
|
112
|
-
~~~bash
|
|
113
|
-
systemctl --user daemon-reload
|
|
114
|
-
systemctl --user enable --now nexus-agentd.service
|
|
115
|
-
systemctl --user status nexus-agentd.service
|
|
116
|
-
~~~
|
|
117
|
-
|
|
118
|
-
常用运维命令:
|
|
119
|
-
|
|
120
|
-
~~~bash
|
|
121
|
-
systemctl --user restart nexus-agentd.service
|
|
122
|
-
journalctl --user -u nexus-agentd.service -n 100 --no-pager
|
|
123
|
-
curl http://127.0.0.1:8787/health
|
|
124
|
-
~~~
|
|
125
|
-
|
|
126
|
-
如果使用 nvm、mise 或其他用户级 Node 安装方式,请把 unit 中的 PATH 改成实际值,否则 Gateway 可能能启动,但找不到 Agent CLI。
|
|
127
|
-
需要用户未登录时也自动启动时,可按发行版策略执行 loginctl enable-linger "$USER"。
|
|
128
|
-
|
|
129
|
-
如果按源码部署,把 unit 中的 `WorkingDirectory` 改成 Gateway 工作树,并将 `ExecStart` 改为实际 Node
|
|
130
|
-
绝对路径加上 `dist/cli.js`,例如:`/usr/bin/node %h/nexus-gateway/dist/cli.js --config
|
|
131
|
-
%h/.config/agent-nexus/nexus-agentd.json`。不要在 systemd 中依赖交互式 Shell 的 nvm 初始化。
|
|
132
|
-
|
|
133
|
-
### 源码部署(开发分支或未发布版本)
|
|
134
|
-
|
|
135
|
-
源码部署适合当前仓库和尚未发布到 npm 的版本;生产环境请使用外部进程管理器负责守护,
|
|
136
|
-
不要把运行数据、Artifact 仓库或密钥放进 Git 工作树:
|
|
137
|
-
|
|
138
|
-
~~~bash
|
|
139
|
-
git clone https://github.com/lumia1998/nexus-gateway.git
|
|
140
|
-
cd nexus-gateway
|
|
141
|
-
mkdir -p "$HOME/.config/agent-nexus" "$HOME/projects"
|
|
142
|
-
npm ci
|
|
143
|
-
npm run build
|
|
144
|
-
node dist/cli.js \
|
|
145
|
-
--config "$HOME/.config/agent-nexus/nexus-agentd.json" \
|
|
146
|
-
--host 0.0.0.0 \
|
|
147
|
-
--port 8787 \
|
|
148
|
-
--workspace "$HOME/projects"
|
|
149
|
-
~~~
|
|
150
|
-
|
|
151
|
-
源码仓库没有 Docker、PM2 或 systemd 配置,需要由宿主机的进程管理器负责守护和重启。
|
|
152
|
-
|
|
153
|
-
## 认证边界
|
|
154
|
-
|
|
155
|
-
控制面和数据面使用不同凭证:
|
|
156
|
-
|
|
157
|
-
- Console Password 只用于管理员登录。服务端以 scrypt 哈希保存,登录后只下发
|
|
158
|
-
`HttpOnly; SameSite=Strict` Cookie,浏览器不保存密码。
|
|
159
|
-
- API Key 只用于 `/v1/agents` 和 `/v1/sessions/*`。Key 可以命名、限制为全部或指定 Agent、
|
|
160
|
-
停用、删除、重生成和按需 reveal。
|
|
161
|
-
- Key 自动生成为 `nx_sk_...`;也可设置至少 16 位的自定义值。
|
|
162
|
-
- 为支持管理员按需 reveal,API Key 可恢复地保存在权限为 `0600` 的配置文件中,不会出现在
|
|
163
|
-
普通配置响应或日志里。
|
|
164
|
-
|
|
165
|
-
旧配置中的 `authToken` 会继续作为名为 `Legacy Access Key` 的全 Agent 数据面 Key 工作。它不会
|
|
166
|
-
被当成 Console Password。升级后第一次打开 WebUI 会要求单独设置管理员密码,原有 Agent 和
|
|
167
|
-
Workspace 配置保持不变。
|
|
168
|
-
|
|
169
|
-
## WebUI
|
|
170
|
-
|
|
171
|
-
固定侧栏有总览、运行记录、智能体、工作区、文件、API 密钥和运行设置七个主页面。管理员菜单位于侧栏底部,
|
|
172
|
-
提供 Light / Dark / System 主题、修改密码和退出登录。
|
|
173
|
-
|
|
174
|
-
- Overview 只显示真实 Agent、Ready 和当前内存 Session 数量。
|
|
175
|
-
- 运行记录把当前任务和历史任务分开显示,记录用户原始任务、真实运行阶段、状态、结果摘要、
|
|
176
|
-
耗时和产物;每 5 秒自动刷新,也可查看完整详情。
|
|
177
|
-
- Agents 支持本地 ACP 与远程 A2A;readiness 每 20 秒自动刷新,也可手动刷新。
|
|
178
|
-
- Workspaces 管理 ACP 的 realpath allowlist;A2A 不使用本地 Workspace。
|
|
179
|
-
- 文件页面在 allowlist 内浏览、上传、下载、新建目录、重命名和删除文件,并可生成临时公开链接。
|
|
180
|
-
发布操作只复制选定文件,不会把工作区映射成公开静态目录。
|
|
181
|
-
- API Keys 显示真实状态和最后使用时间,并提供独立的显式 reveal 操作。
|
|
182
|
-
- 运行设置可以直接修改 Session 空闲有效期、ACP 单次任务超时和清理任务周期,保存后立即热生效。
|
|
183
|
-
默认值分别是 24 小时、30 分钟和 60 秒;A2A 请求超时在每个 Agent 的编辑页单独设置,默认 60 秒、
|
|
184
|
-
最大 30 分钟。
|
|
185
|
-
|
|
1
|
+
# Agent Nexus Gateway
|
|
2
|
+
|
|
3
|
+
[](https://github.com/lumia1998/nexus-gateway/actions/workflows/ci.yml)
|
|
4
|
+
|
|
5
|
+
`nexus-agentd` 是 Agent Nexus 的本地 Gateway。它在一台机器上统一管理 ACP 进程和远程 A2A
|
|
6
|
+
Agent,并向 Koishi AgentNexus 或其他客户端提供 HTTP/SSE API。管理控制台使用 **Agent Nexus**
|
|
7
|
+
品牌,不依赖 CDN、前端框架或父仓库。
|
|
8
|
+
|
|
9
|
+
## 启动
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
npm install -g nexus-agentd
|
|
13
|
+
nexus-agentd
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
首次启动会创建 `./nexus-agentd.json`,默认监听 `127.0.0.1:8787`。打开打印出的 WebUI 地址,
|
|
17
|
+
设置至少 12 位的 Console Password,然后登录。新安装不会自动创建 API Key;在控制台的
|
|
18
|
+
**API Keys** 页面按实际客户端需要创建。
|
|
19
|
+
|
|
20
|
+
局域网使用时显式监听所有网卡:
|
|
21
|
+
|
|
22
|
+
```bash
|
|
23
|
+
mkdir -p /data/repos
|
|
24
|
+
nexus-agentd --host 0.0.0.0 --workspace /data/repos
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
`0.0.0.0` 是受支持的监听地址。CLI 会同时打印本机和检测到的 LAN IPv4 WebUI 地址。
|
|
28
|
+
`--host`、`--port` 和 `--workspace` 只用于首次创建配置;配置存在后直接指定文件:
|
|
29
|
+
|
|
30
|
+
```bash
|
|
31
|
+
nexus-agentd --config /etc/agent-nexus/nexus-agentd.json
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
## 认证边界
|
|
35
|
+
|
|
36
|
+
控制面和数据面使用不同凭证:
|
|
37
|
+
|
|
38
|
+
- Console Password 只用于管理员登录。服务端以 scrypt 哈希保存,登录后只下发
|
|
39
|
+
`HttpOnly; SameSite=Strict` Cookie,浏览器不保存密码。
|
|
40
|
+
- API Key 只用于 `/v1/agents` 和 `/v1/sessions/*`。Key 可以命名、限制为全部或指定 Agent、
|
|
41
|
+
停用、删除、重生成和按需 reveal。
|
|
42
|
+
- Key 自动生成为 `nx_sk_...`;也可设置至少 16 位的自定义值。
|
|
43
|
+
- 为支持管理员按需 reveal,API Key 可恢复地保存在权限为 `0600` 的配置文件中,不会出现在
|
|
44
|
+
普通配置响应或日志里。
|
|
45
|
+
|
|
46
|
+
旧配置中的 `authToken` 会继续作为名为 `Legacy Access Key` 的全 Agent 数据面 Key 工作。它不会
|
|
47
|
+
被当成 Console Password。升级后第一次打开 WebUI 会要求单独设置管理员密码,原有 Agent 和
|
|
48
|
+
Workspace 配置保持不变。
|
|
49
|
+
|
|
50
|
+
## WebUI
|
|
51
|
+
|
|
52
|
+
固定侧栏有总览、运行记录、智能体、工作区、API 密钥和运行设置六个主页面。管理员菜单位于侧栏底部,
|
|
53
|
+
提供 Light / Dark / System 主题、修改密码和退出登录。
|
|
54
|
+
|
|
55
|
+
- Overview 只显示真实 Agent、Ready 和当前内存 Session 数量。
|
|
56
|
+
- 运行记录把当前任务和历史任务分开显示,记录用户原始任务、真实运行阶段、状态、结果摘要、
|
|
57
|
+
耗时和产物;每 5 秒自动刷新,也可查看完整详情。
|
|
58
|
+
- Agents 支持本地 ACP 与远程 A2A;readiness 每 20 秒自动刷新,也可手动刷新。
|
|
59
|
+
- Workspaces 管理 ACP 的 realpath allowlist;A2A 不使用本地 Workspace。
|
|
60
|
+
- API Keys 显示真实状态和最后使用时间,并提供独立的显式 reveal 操作。
|
|
61
|
+
- 运行设置可以直接修改 Session 空闲有效期、ACP 单次任务超时和清理任务周期,保存后立即热生效。
|
|
62
|
+
默认值分别是 24 小时、30 分钟和 60 秒;A2A 请求超时在每个 Agent 的编辑页单独设置,默认 60 秒、
|
|
63
|
+
最大 30 分钟。
|
|
64
|
+
|
|
186
65
|
## Agent 协议
|
|
187
66
|
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
| Driver | 默认入口 |
|
|
191
|
-
|---|---|
|
|
192
|
-
| `opencode` | `opencode acp` |
|
|
193
|
-
| `claude` | `claude-agent-acp` |
|
|
194
|
-
| `codex` | `codex-acp` |
|
|
195
|
-
| `pi` | `pi-acp` |
|
|
196
|
-
| `openclaw` | `openclaw acp` |
|
|
197
|
-
| `hermes` | `hermes acp` |
|
|
198
|
-
|
|
199
|
-
Claude Code、Codex、Pi 通常需要对应 Adapter:
|
|
67
|
+
每个任务都会附带协议级完成约束:Agent 在结束 turn 前必须处理完工作,等待用户输入或授权时必须使用
|
|
68
|
+
协议请求,并提供非空最终说明或 Artifact。Gateway 只接受以下完成证明:
|
|
200
69
|
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
70
|
+
- ACP `session/prompt` 返回 `stopReason=end_turn`;`max_tokens`、`max_turn_requests`、拒绝和取消不会被
|
|
71
|
+
误报为成功。
|
|
72
|
+
- A2A Task 明确进入 `COMPLETED`;如果远端直接返回 Message 而没有创建 Task,则以完整消息流结束作为
|
|
73
|
+
turn 边界。已经出现 Task 状态但没有终态的流会标记失败。
|
|
74
|
+
- Session 仍有待处理的 permission/input 请求,或者最终文本与 Artifact 都为空时,不允许进入
|
|
75
|
+
`completed`。
|
|
207
76
|
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
### OpenCode、Claude Code 和 Hermes 的宿主机准备
|
|
212
|
-
|
|
213
|
-
这三个 Agent 不需要修改 Gateway 源码,差异只在宿主机的可执行文件、ACP 入口和登录环境:
|
|
214
|
-
|
|
215
|
-
| Agent | Gateway 默认启动命令 | readiness 检查 | 宿主机要求 |
|
|
216
|
-
| --- | --- | --- | --- |
|
|
217
|
-
| OpenCode | opencode acp | opencode --version | 安装 OpenCode CLI;使用原生 ACP。 |
|
|
218
|
-
| Claude Code(CC) | claude-agent-acp | claude-agent-acp --version | 安装 @agentclientprotocol/claude-agent-acp,并准备 Claude Code 登录环境。 |
|
|
219
|
-
| Hermes | hermes acp | hermes acp --check | 安装 Hermes CLI;使用原生 ACP。 |
|
|
220
|
-
|
|
221
|
-
Claude Code、Codex 和 Pi 的常用 Adapter 可以一起安装:
|
|
222
|
-
|
|
223
|
-
~~~bash
|
|
224
|
-
npm install --global --prefix "$HOME/.local" \
|
|
225
|
-
@agentclientprotocol/claude-agent-acp \
|
|
226
|
-
@agentclientprotocol/codex-acp \
|
|
227
|
-
pi-acp
|
|
228
|
-
~~~
|
|
229
|
-
|
|
230
|
-
OpenCode 和 Hermes 请按各自项目的官方方式安装。Gateway 不执行 OpenCode、Claude Code 或 Hermes 的登录命令;登录必须在运行 nexus-agentd 的同一个操作系统用户环境中完成。
|
|
231
|
-
|
|
232
|
-
可在同一用户的交互式 Shell 中检查:
|
|
233
|
-
|
|
234
|
-
~~~bash
|
|
235
|
-
command -v opencode && opencode --version
|
|
236
|
-
command -v claude-agent-acp && claude-agent-acp --version
|
|
237
|
-
command -v hermes && hermes acp --check
|
|
238
|
-
~~~
|
|
239
|
-
|
|
240
|
-
如果命令在交互式 Shell 中可用、在 systemd 中不可用,检查 unit 的 PATH、HOME、XDG_CONFIG_HOME 和登录凭据。某个 Agent 未安装或检查失败不会影响其他 Agent。
|
|
241
|
-
|
|
242
|
-
一个最小的 ACP 配置示例(可在 WebUI 的 Agents 页面创建,也可写入本机配置文件):
|
|
243
|
-
|
|
244
|
-
~~~json
|
|
245
|
-
{
|
|
246
|
-
"workspaceRoots": ["/home/lumia/projects"],
|
|
247
|
-
"agents": {
|
|
248
|
-
"opencode": {
|
|
249
|
-
"protocol": "acp",
|
|
250
|
-
"driver": "opencode",
|
|
251
|
-
"name": "OpenCode",
|
|
252
|
-
"workspace": "/home/lumia/projects"
|
|
253
|
-
},
|
|
254
|
-
"claude": {
|
|
255
|
-
"protocol": "acp",
|
|
256
|
-
"driver": "claude",
|
|
257
|
-
"name": "Claude Code",
|
|
258
|
-
"workspace": "/home/lumia/projects"
|
|
259
|
-
},
|
|
260
|
-
"hermes": {
|
|
261
|
-
"protocol": "acp",
|
|
262
|
-
"driver": "hermes",
|
|
263
|
-
"name": "Hermes",
|
|
264
|
-
"workspace": "/home/lumia/projects"
|
|
265
|
-
}
|
|
266
|
-
}
|
|
267
|
-
}
|
|
268
|
-
~~~
|
|
269
|
-
|
|
270
|
-
`workspace` 必须位于 `workspaceRoots` 之下;如果只通过 WebUI 配置,Gateway 会校验并保存这些字段。
|
|
271
|
-
|
|
272
|
-
ACP Agent 的 `permissionPolicy` 有三种取值:`ask`(默认,每次权限请求交给用户确认)、`allow`(始终允许,
|
|
273
|
-
自动选择 ACP 返回的允许项,不创建等待确认的请求)和 `deny`(始终拒绝,自动选择拒绝项)。`allow` 会放行该
|
|
274
|
-
Agent 发起的所有 ACP 权限请求,请只对可信的 Agent 和工作区使用;没有明确的允许项时 Gateway 会安全地取消请求。
|
|
275
|
-
该字段只适用于 ACP,A2A Agent 不使用本地 ACP 权限策略。
|
|
276
|
-
|
|
277
|
-
Gateway 会在每个 Agent Session 的首次请求前自动注入一段 Agent Nexus 交互规范,提醒 Agent 在需要
|
|
278
|
-
用户选择、确认、支付或补充信息时使用 ACP elicitation/A2A `input-required`,不要只输出普通文本问题。
|
|
279
|
-
这段规范不需要为 OpenCode、Claude Code 或 Hermes 手工重复配置。若某个 Agent 还需要额外规则,可在 Agent
|
|
280
|
-
配置中增加 `instructions`;它会在内置规范之后追加,并限制为最多 32768 个字符。提示词注入只是行为约定,
|
|
281
|
-
Agent 仍必须实际支持相应的 ACP/A2A/MCP 用户输入机制,Gateway 不会把普通文本自动猜成等待状态。
|
|
282
|
-
|
|
283
|
-
### A2A
|
|
284
|
-
|
|
285
|
-
A2A 使用官方 `@a2a-js/sdk` 客户端,通过完整的 Agent Card URL 发现名称、能力和实际调用地址,
|
|
286
|
-
支持 JSON-RPC / HTTP+JSON 传输、流式消息(SDK 自动回退为非流式)、任务状态、Artifacts 和取消。
|
|
287
|
-
首选传输可设为 `auto`、`jsonrpc` 或 `http-json`;可配置无认证、Bearer 或自定义 Header。私有网段
|
|
288
|
-
和局域网 URL 不会被禁止。
|
|
289
|
-
|
|
290
|
-
```json
|
|
291
|
-
{
|
|
292
|
-
"protocol": "a2a",
|
|
293
|
-
"name": "Research Agent",
|
|
294
|
-
"instructions": "需要用户确认时保持任务等待,并使用 Agent 的 input-required 能力。",
|
|
295
|
-
"agentCardUrl": "http://192.168.1.20:8080/.well-known/agent-card.json",
|
|
296
|
-
"preferredTransport": "auto",
|
|
297
|
-
"auth": {
|
|
298
|
-
"type": "bearer",
|
|
299
|
-
"value": "env:RESEARCH_AGENT_TOKEN"
|
|
300
|
-
},
|
|
301
|
-
"timeoutMs": 60000
|
|
302
|
-
}
|
|
303
|
-
```
|
|
304
|
-
|
|
305
|
-
旧配置中的 `agentUrl` 仍按“服务根地址 + `/.well-known/agent-card.json`”方式发现 Card,无需手工
|
|
306
|
-
迁移;在 WebUI 中保存一次后会写入新的 `agentCardUrl` 字段。
|
|
307
|
-
|
|
308
|
-
## 配置
|
|
309
|
-
|
|
310
|
-
推荐从首次启动生成的待初始化配置开始。完整示例见
|
|
311
|
-
[`nexus-agentd.example.json`](./nexus-agentd.example.json)。数值和数组字段会严格校验,错误配置
|
|
312
|
-
会在启动或原子热重载前被拒绝,不再静默截断或忽略错误类型。
|
|
313
|
-
|
|
314
|
-
常用资源限制:
|
|
315
|
-
|
|
316
|
-
```json
|
|
317
|
-
{
|
|
318
|
-
"maxRequestBytes": 1048576,
|
|
319
|
-
"maxAttachmentBytes": 33554432,
|
|
320
|
-
"artifactStoragePath": "./artifacts",
|
|
321
|
-
"maxArtifactBytes": 536870912,
|
|
322
|
-
"maxArtifactStorageBytes": 4294967296,
|
|
323
|
-
"maxPublishedArtifacts": 4096,
|
|
324
|
-
"maxConcurrentArtifactPublishes": 4,
|
|
325
|
-
"artifactTtlMs": 86400000,
|
|
326
|
-
"requestTimeoutMs": 30000,
|
|
327
|
-
"promptTimeoutMs": 1800000,
|
|
328
|
-
"cleanupIntervalMs": 60000,
|
|
329
|
-
"maxSessions": 64,
|
|
330
|
-
"maxSseConnections": 128,
|
|
331
|
-
"maxConnections": 256,
|
|
332
|
-
"sessionTtlMs": 86400000
|
|
333
|
-
}
|
|
334
|
-
```
|
|
77
|
+
成功的 Session 响应包含 `completion`,其中记录当前 Run ID、协议、完成来源、stop reason、最终文本和
|
|
78
|
+
产物存在性以及完成时间。这个证明验证的是协议边界和结果存在性,不替代业务内容本身的语义验收。
|
|
335
79
|
|
|
80
|
+
### ACP
|
|
81
|
+
|
|
82
|
+
| Driver | 默认入口 |
|
|
83
|
+
|---|---|
|
|
84
|
+
| `opencode` | `opencode acp` |
|
|
85
|
+
| `claude` | `claude-agent-acp` |
|
|
86
|
+
| `codex` | `codex-acp` |
|
|
87
|
+
| `pi` | `pi-acp` |
|
|
88
|
+
| `openclaw` | `openclaw acp` |
|
|
89
|
+
| `hermes` | `hermes acp` |
|
|
90
|
+
|
|
91
|
+
Claude Code、Codex、Pi 通常需要对应 Adapter:
|
|
92
|
+
|
|
93
|
+
```bash
|
|
94
|
+
npm install -g \
|
|
95
|
+
@agentclientprotocol/claude-agent-acp \
|
|
96
|
+
@agentclientprotocol/codex-acp \
|
|
97
|
+
pi-acp
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
`command`、`args`、`inheritEnv` 和 `env` 是仅可在本机配置文件修改的高级字段,WebUI 不接受这些
|
|
101
|
+
字段。Workspace 在启动进程前经过 `realpath` 边界校验。
|
|
102
|
+
|
|
103
|
+
### A2A
|
|
104
|
+
|
|
105
|
+
A2A 使用官方 `@a2a-js/sdk` 客户端,通过完整的 Agent Card URL 发现名称、能力和实际调用地址,
|
|
106
|
+
支持 JSON-RPC / HTTP+JSON 传输、流式消息(SDK 自动回退为非流式)、任务状态、Artifacts 和取消。
|
|
107
|
+
首选传输可设为 `auto`、`jsonrpc` 或 `http-json`;可配置无认证、Bearer 或自定义 Header。私有网段
|
|
108
|
+
和局域网 URL 不会被禁止。
|
|
109
|
+
|
|
110
|
+
```json
|
|
111
|
+
{
|
|
112
|
+
"protocol": "a2a",
|
|
113
|
+
"name": "Research Agent",
|
|
114
|
+
"agentCardUrl": "http://192.168.1.20:8080/.well-known/agent-card.json",
|
|
115
|
+
"preferredTransport": "auto",
|
|
116
|
+
"auth": {
|
|
117
|
+
"type": "bearer",
|
|
118
|
+
"value": "env:RESEARCH_AGENT_TOKEN"
|
|
119
|
+
},
|
|
120
|
+
"timeoutMs": 60000
|
|
121
|
+
}
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
旧配置中的 `agentUrl` 仍按“服务根地址 + `/.well-known/agent-card.json`”方式发现 Card,无需手工
|
|
125
|
+
迁移;在 WebUI 中保存一次后会写入新的 `agentCardUrl` 字段。
|
|
126
|
+
|
|
127
|
+
## 配置
|
|
128
|
+
|
|
129
|
+
推荐从首次启动生成的待初始化配置开始。完整示例见
|
|
130
|
+
[`nexus-agentd.example.json`](./nexus-agentd.example.json)。数值和数组字段会严格校验,错误配置
|
|
131
|
+
会在启动或原子热重载前被拒绝,不再静默截断或忽略错误类型。
|
|
132
|
+
|
|
133
|
+
常用资源限制:
|
|
134
|
+
|
|
135
|
+
```json
|
|
136
|
+
{
|
|
137
|
+
"maxRequestBytes": 1048576,
|
|
138
|
+
"maxAttachmentBytes": 33554432,
|
|
139
|
+
"requestTimeoutMs": 30000,
|
|
140
|
+
"promptTimeoutMs": 1800000,
|
|
141
|
+
"cleanupIntervalMs": 60000,
|
|
142
|
+
"maxSessions": 64,
|
|
143
|
+
"maxSseConnections": 128,
|
|
144
|
+
"maxConnections": 256,
|
|
145
|
+
"sessionTtlMs": 86400000
|
|
146
|
+
}
|
|
147
|
+
```
|
|
148
|
+
|
|
336
149
|
输入附件通过 Session 临时保存,默认单个文件最多 16 MiB、单个 Session 最多 32 MiB、最多 16 个文件;
|
|
337
|
-
HTTP 上传总上限由 `maxAttachmentBytes` 控制,默认 32 MiB,允许调整到 64 MiB。Session 释放时附件也会
|
|
338
|
-
一起清理。ACP 会优先使用 Agent 声明支持的 image/audio/embeddedContext 能力,否则为 Agent 提供受限的
|
|
150
|
+
HTTP 上传总上限由 `maxAttachmentBytes` 控制,默认 32 MiB,允许调整到 64 MiB。Session 释放时附件也会
|
|
151
|
+
一起清理。ACP 会优先使用 Agent 声明支持的 image/audio/embeddedContext 能力,否则为 Agent 提供受限的
|
|
339
152
|
`file://` resource link;A2A 则以带文件名和媒体类型的二进制 Part 发送。
|
|
340
153
|
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
```
|
|
385
|
-
|
|
386
|
-
GET /v1/bootstrap/status
|
|
387
|
-
POST /v1/bootstrap/initialize
|
|
388
|
-
GET /v1/admin/auth/status
|
|
389
|
-
POST /v1/admin/auth/login
|
|
390
|
-
POST /v1/admin/auth/logout
|
|
391
|
-
```
|
|
392
|
-
|
|
393
|
-
管理员 Cookie 端点:
|
|
394
|
-
|
|
395
|
-
```text
|
|
396
|
-
GET /v1/admin/overview
|
|
397
|
-
GET /v1/admin/config
|
|
398
|
-
GET /v1/admin/agents
|
|
399
|
-
GET /v1/admin/runs
|
|
400
|
-
GET /v1/admin/runs/:id
|
|
401
|
-
PUT /v1/admin/agents/:id
|
|
402
|
-
DELETE /v1/admin/agents/:id
|
|
403
|
-
PUT /v1/admin/config/workspace-roots
|
|
404
|
-
PUT /v1/admin/config/runtime
|
|
405
|
-
PUT /v1/admin/password
|
|
406
|
-
GET /v1/admin/api-keys
|
|
407
|
-
POST /v1/admin/api-keys
|
|
408
|
-
PATCH /v1/admin/api-keys/:id
|
|
409
|
-
DELETE /v1/admin/api-keys/:id
|
|
410
|
-
POST /v1/admin/api-keys/:id/reveal
|
|
411
|
-
POST /v1/admin/api-keys/:id/regenerate
|
|
412
|
-
GET /v1/admin/files/roots
|
|
413
|
-
GET /v1/admin/files
|
|
414
|
-
GET /v1/admin/files/content
|
|
415
|
-
PUT /v1/admin/files/content
|
|
416
|
-
DELETE /v1/admin/files/content
|
|
417
|
-
POST /v1/admin/files/directory
|
|
418
|
-
POST /v1/admin/files/move
|
|
419
|
-
POST /v1/admin/files/publish
|
|
420
|
-
```
|
|
421
|
-
|
|
154
|
+
ACP Session 还支持显式发布工作区文件。发布接口只接受 realpath 仍位于该 Session 工作区中的普通文件,
|
|
155
|
+
拒绝目录、路径穿越和符号链接逃逸,单个文件最多 12 MiB。响应将文件作为 Session Artifact 返回;不会
|
|
156
|
+
暴露宿主机绝对路径。
|
|
157
|
+
|
|
158
|
+
API Key 与 A2A 认证值支持 `env:VAR`。Console Password 哈希由 WebUI 管理,不要手工生成或把
|
|
159
|
+
旧 `authToken` 复制到该字段。
|
|
160
|
+
|
|
161
|
+
运行记录保存在配置文件同目录的 `nexus-agentd-runs.json` sidecar 中,默认最多保留 1000 条。
|
|
162
|
+
记录文件使用 `0600` 权限和原子替换;进行中的任务若遇到 Gateway 重启,会在下次启动时标记为
|
|
163
|
+
“已中断/失败”,而不会一直显示为运行中。
|
|
164
|
+
|
|
165
|
+
## API
|
|
166
|
+
|
|
167
|
+
匿名端点:
|
|
168
|
+
|
|
169
|
+
```text
|
|
170
|
+
GET /health
|
|
171
|
+
GET /v1/bootstrap/status
|
|
172
|
+
POST /v1/bootstrap/initialize
|
|
173
|
+
GET /v1/admin/auth/status
|
|
174
|
+
POST /v1/admin/auth/login
|
|
175
|
+
POST /v1/admin/auth/logout
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
管理员 Cookie 端点:
|
|
179
|
+
|
|
180
|
+
```text
|
|
181
|
+
GET /v1/admin/overview
|
|
182
|
+
GET /v1/admin/config
|
|
183
|
+
GET /v1/admin/agents
|
|
184
|
+
GET /v1/admin/runs
|
|
185
|
+
GET /v1/admin/runs/:id
|
|
186
|
+
PUT /v1/admin/agents/:id
|
|
187
|
+
DELETE /v1/admin/agents/:id
|
|
188
|
+
PUT /v1/admin/config/workspace-roots
|
|
189
|
+
PUT /v1/admin/config/runtime
|
|
190
|
+
PUT /v1/admin/password
|
|
191
|
+
GET /v1/admin/api-keys
|
|
192
|
+
POST /v1/admin/api-keys
|
|
193
|
+
PATCH /v1/admin/api-keys/:id
|
|
194
|
+
DELETE /v1/admin/api-keys/:id
|
|
195
|
+
POST /v1/admin/api-keys/:id/reveal
|
|
196
|
+
POST /v1/admin/api-keys/:id/regenerate
|
|
197
|
+
```
|
|
198
|
+
|
|
422
199
|
Bearer API Key 数据面:
|
|
423
200
|
|
|
424
201
|
```text
|
|
202
|
+
GET /v1/meta
|
|
425
203
|
GET /v1/agents
|
|
426
204
|
POST /v1/sessions
|
|
427
205
|
GET /v1/sessions/:id
|
|
206
|
+
DELETE /v1/sessions/:id
|
|
428
207
|
POST /v1/sessions/:id/attachments
|
|
429
208
|
POST /v1/sessions/:id/message
|
|
209
|
+
POST /v1/sessions/:id/requests/:requestId/resolve
|
|
210
|
+
POST /v1/sessions/:id/artifacts/publish
|
|
430
211
|
POST /v1/sessions/:id/cancel
|
|
431
212
|
GET /v1/sessions/:id/events
|
|
432
|
-
GET /v1/sessions/:id/files
|
|
433
|
-
GET /v1/sessions/:id/files/content
|
|
434
|
-
POST /v1/sessions/:id/files/publish
|
|
435
|
-
```
|
|
436
|
-
|
|
437
|
-
`GET /v1/artifacts/:token/:expiresAt/:name` 是匿名下载端点;它只接受发布操作生成的不可猜测 token,并在 TTL
|
|
438
|
-
到期后返回 404。该端点不支持目录列举,也不能据此访问原工作区。
|
|
439
|
-
|
|
440
|
-
API Key 的 Agent scope 在 Agent inventory、Session 创建和后续 Session 操作上都会检查;Session
|
|
441
|
-
还绑定创建它的 Key,其他 Key 即使拥有同一 Agent scope 也不能读取或控制该 Session。
|
|
442
|
-
运行记录接口仅接受管理员 Cookie,数据面 API Key 无权读取。
|
|
443
|
-
|
|
444
|
-
## 局域网安全
|
|
445
|
-
|
|
446
|
-
- 默认仍只监听 localhost;需要 LAN 时显式使用 `--host 0.0.0.0`,并用主机防火墙限制来源。
|
|
447
|
-
- LAN 上的纯 HTTP 为兼容 Cookie 默认不设置 `Secure`;跨不可信网络应放在 HTTPS/mTLS 反向代理
|
|
448
|
-
或可信隧道后,并将 `secureAdminCookies` 设为 `true`。
|
|
449
|
-
- 管理写操作要求同源 `Origin`,Cookie 使用 `SameSite=Strict`;登录和无效 API Key 有失败限速。
|
|
450
|
-
- File Browser 的所有路径都在 realpath 后重新校验工作区边界;Session 发布还同时校验 API Key
|
|
451
|
-
scope 与 Session 所有权。公开链接应只发送给预期接收者。
|
|
452
|
-
- 不直接暴露公网。使用专用低权限系统账号运行 Gateway。
|
|
453
|
-
- 配置更新使用 `0600` 临时文件校验后原子替换;Secret 不进入普通响应和结构化错误日志。
|
|
454
|
-
|
|
455
|
-
## 验证
|
|
456
|
-
|
|
457
|
-
```bash
|
|
458
|
-
npm test
|
|
459
|
-
npm run typecheck
|
|
460
|
-
npm run build
|
|
461
|
-
npm pack --dry-run --json
|
|
462
213
|
```
|
|
463
214
|
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
215
|
+
`/v1/meta` 和 Session 响应包含 Gateway `instanceId`;完成的 Session 还包含与当前 Run 绑定的
|
|
216
|
+
`completion` 证明,客户端可识别进程重启和迟到/伪造的完成状态。授权与输入通过精确的
|
|
217
|
+
`requestId` 解析;过期 ID 返回 `409`,不会误答后续请求。`DELETE /v1/sessions/:id` 会取消活动任务、
|
|
218
|
+
释放 Agent 进程并移除内存 Session。
|
|
219
|
+
|
|
220
|
+
API Key 的 Agent scope 在 Agent inventory、Session 创建和后续 Session 操作上都会检查;Session
|
|
221
|
+
还绑定创建它的 Key,其他 Key 即使拥有同一 Agent scope 也不能读取或控制该 Session。
|
|
222
|
+
运行记录接口仅接受管理员 Cookie,数据面 API Key 无权读取。
|
|
223
|
+
|
|
224
|
+
## 局域网安全
|
|
225
|
+
|
|
226
|
+
- 默认仍只监听 localhost;需要 LAN 时显式使用 `--host 0.0.0.0`,并用主机防火墙限制来源。
|
|
227
|
+
- LAN 上的纯 HTTP 为兼容 Cookie 默认不设置 `Secure`;跨不可信网络应放在 HTTPS/mTLS 反向代理
|
|
228
|
+
或可信隧道后,并将 `secureAdminCookies` 设为 `true`。
|
|
229
|
+
- 管理写操作要求同源 `Origin`,Cookie 使用 `SameSite=Strict`;登录和无效 API Key 有失败限速。
|
|
230
|
+
- 不直接暴露公网。使用专用低权限系统账号运行 Gateway。
|
|
231
|
+
- 配置更新使用 `0600` 临时文件校验后原子替换;Secret 不进入普通响应和结构化错误日志。
|
|
232
|
+
|
|
233
|
+
## 验证
|
|
234
|
+
|
|
235
|
+
```bash
|
|
236
|
+
npm test
|
|
237
|
+
npm run typecheck
|
|
238
|
+
npm run build
|
|
239
|
+
npm pack --dry-run --json
|
|
240
|
+
```
|
|
241
|
+
|
|
242
|
+
## License
|
|
243
|
+
|
|
244
|
+
[MIT](./LICENSE)
|