nexus-agentd 0.2.5 → 0.2.6

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 CHANGED
@@ -1,22 +1,22 @@
1
- MIT License
2
-
3
- Copyright (c) 2026 lumia1998
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to deal
7
- in the Software without restriction, including without limitation the rights
8
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
11
-
12
- The above copyright notice and this permission notice shall be included in all
13
- copies or substantial portions of the Software.
14
-
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
- SOFTWARE.
22
-
1
+ MIT License
2
+
3
+ Copyright (c) 2026 lumia1998
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
22
+
package/README.md CHANGED
@@ -1,250 +1,270 @@
1
- # Agent Nexus Gateway
2
-
3
- [![CI](https://github.com/lumia1998/nexus-gateway/actions/workflows/ci.yml/badge.svg)](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
-
65
- ## Agent 协议
66
-
67
- 每个任务都会附带协议级完成约束:Agent 在结束 turn 前必须处理完工作,等待用户输入或授权时必须使用
68
- 协议请求,并提供非空最终说明或 Artifact。Gateway 只接受以下完成证明:
69
-
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`。
76
-
77
- 成功的 Session 响应包含 `completion`,其中记录当前 Run ID、协议、完成来源、stop reason、最终文本和
78
- 产物存在性以及完成时间。这个证明验证的是协议边界和结果存在性,不替代业务内容本身的语义验收。
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
- ACP 权限策略支持 `ask`(询问)、`allow`(始终允许)和 `deny`(拒绝)。`allow` 会优先选择
104
- Agent 提供的 `allow_once`,不创建待确认请求;它适合管理员明确授权、工作区边界可信的自动化 Agent。
105
- 默认仍为 `ask`。
106
-
107
- ### A2A
108
-
109
- A2A 使用官方 `@a2a-js/sdk` 客户端,通过完整的 Agent Card URL 发现名称、能力和实际调用地址,
110
- 支持 JSON-RPC / HTTP+JSON 传输、流式消息(SDK 自动回退为非流式)、任务状态、Artifacts 和取消。
111
- 首选传输可设为 `auto`、`jsonrpc` 或 `http-json`;可配置无认证、Bearer 或自定义 Header。私有网段
112
- 和局域网 URL 不会被禁止。
113
-
114
- ```json
115
- {
116
- "protocol": "a2a",
117
- "name": "Research Agent",
118
- "agentCardUrl": "http://192.168.1.20:8080/.well-known/agent-card.json",
119
- "preferredTransport": "auto",
120
- "auth": {
121
- "type": "bearer",
122
- "value": "env:RESEARCH_AGENT_TOKEN"
123
- },
124
- "timeoutMs": 60000
125
- }
126
- ```
127
-
128
- 旧配置中的 `agentUrl` 仍按“服务根地址 + `/.well-known/agent-card.json`”方式发现 Card,无需手工
129
- 迁移;在 WebUI 中保存一次后会写入新的 `agentCardUrl` 字段。
130
-
131
- ## 配置
132
-
133
- 推荐从首次启动生成的待初始化配置开始。完整示例见
134
- [`nexus-agentd.example.json`](./nexus-agentd.example.json)。数值和数组字段会严格校验,错误配置
135
- 会在启动或原子热重载前被拒绝,不再静默截断或忽略错误类型。
136
-
137
- 常用资源限制:
138
-
139
- ```json
140
- {
141
- "maxRequestBytes": 1048576,
142
- "maxAttachmentBytes": 33554432,
143
- "requestTimeoutMs": 30000,
144
- "promptTimeoutMs": 1800000,
145
- "cleanupIntervalMs": 60000,
146
- "maxSessions": 64,
147
- "maxSseConnections": 128,
148
- "maxConnections": 256,
149
- "sessionTtlMs": 86400000
150
- }
151
- ```
152
-
153
- 输入附件通过 Session 临时保存,默认单个文件最多 16 MiB、单个 Session 最多 32 MiB、最多 16 个文件;
154
- HTTP 上传总上限由 `maxAttachmentBytes` 控制,默认 32 MiB,允许调整到 64 MiB。Session 释放时附件也会
155
- 一起清理。ACP 会优先使用 Agent 声明支持的 image/audio/embeddedContext 能力,否则为 Agent 提供受限的
156
- `file://` resource link;A2A 则以带文件名和媒体类型的二进制 Part 发送。
157
-
158
- ACP Session 还支持显式发布工作区文件。发布接口只接受 realpath 仍位于该 Session 工作区中的普通文件,
159
- 拒绝目录、路径穿越和符号链接逃逸,单个文件最多 12 MiB。请求 body 支持单文件 `{ "path": "..." }` 或
160
- 批量 `{ "paths": ["..."] }`(一次最多 32 条),响应在正常 Session 视图上附加
161
- `publishedArtifacts` 数组,本次发布的文件以 base64 内联返回;不会暴露宿主机绝对路径,也不生成外部 URL。
162
-
163
- API Key 与 A2A 认证值支持 `env:VAR`。Console Password 哈希由 WebUI 管理,不要手工生成或把
164
- 旧 `authToken` 复制到该字段。
165
-
166
- 运行记录保存在配置文件同目录的 `nexus-agentd-runs.json` sidecar 中,默认最多保留 1000 条。
167
- 记录文件使用 `0600` 权限和原子替换;进行中的任务若遇到 Gateway 重启,会在下次启动时标记为
168
- “已中断/失败”,而不会一直显示为运行中。
169
-
170
- ## API
171
-
172
- 匿名端点:
173
-
174
- ```text
175
- GET /health
176
- GET /v1/bootstrap/status
177
- POST /v1/bootstrap/initialize
178
- GET /v1/admin/auth/status
179
- POST /v1/admin/auth/login
180
- POST /v1/admin/auth/logout
181
- ```
182
-
183
- 管理员 Cookie 端点:
184
-
185
- ```text
186
- GET /v1/admin/overview
187
- GET /v1/admin/config
188
- GET /v1/admin/agents
189
- GET /v1/admin/runs
190
- GET /v1/admin/runs/:id
191
- PUT /v1/admin/agents/:id
192
- DELETE /v1/admin/agents/:id
193
- PUT /v1/admin/config/workspace-roots
194
- PUT /v1/admin/config/runtime
195
- PUT /v1/admin/password
196
- GET /v1/admin/api-keys
197
- POST /v1/admin/api-keys
198
- PATCH /v1/admin/api-keys/:id
199
- DELETE /v1/admin/api-keys/:id
200
- POST /v1/admin/api-keys/:id/reveal
201
- POST /v1/admin/api-keys/:id/regenerate
202
- ```
203
-
204
- Bearer API Key 数据面:
205
-
206
- ```text
207
- GET /v1/meta
208
- GET /v1/agents
209
- POST /v1/sessions
210
- GET /v1/sessions/:id
211
- DELETE /v1/sessions/:id
212
- POST /v1/sessions/:id/attachments
213
- POST /v1/sessions/:id/message
214
- POST /v1/sessions/:id/requests/:requestId/resolve
215
- POST /v1/sessions/:id/artifacts/publish
216
- POST /v1/sessions/:id/cancel
217
- GET /v1/sessions/:id/events
218
- ```
219
-
220
- `/v1/meta` 和 Session 响应包含 Gateway `instanceId`;完成的 Session 还包含与当前 Run 绑定的
221
- `completion` 证明,客户端可识别进程重启和迟到/伪造的完成状态。授权与输入通过精确的
222
- `requestId` 解析;过期 ID 返回 `409`,不会误答后续请求。`DELETE /v1/sessions/:id` 会取消活动任务、
223
- 释放 Agent 整个进程组并移除内存 Session。Gateway 停止时会先终止 Session,再在有限宽限期后关闭残留
224
- HTTP/SSE 连接,避免长连接或 Agent 孙进程阻塞服务重启。
225
-
226
- API Key 的 Agent scope 在 Agent inventory、Session 创建和后续 Session 操作上都会检查;Session
227
- 还绑定创建它的 Key,其他 Key 即使拥有同一 Agent scope 也不能读取或控制该 Session。
228
- 运行记录接口仅接受管理员 Cookie,数据面 API Key 无权读取。
229
-
230
- ## 局域网安全
231
-
232
- - 默认仍只监听 localhost;需要 LAN 时显式使用 `--host 0.0.0.0`,并用主机防火墙限制来源。
233
- - LAN 上的纯 HTTP 为兼容 Cookie 默认不设置 `Secure`;跨不可信网络应放在 HTTPS/mTLS 反向代理
234
- 或可信隧道后,并将 `secureAdminCookies` 设为 `true`。
235
- - 管理写操作要求同源 `Origin`,Cookie 使用 `SameSite=Strict`;登录和无效 API Key 有失败限速。
236
- - 不直接暴露公网。使用专用低权限系统账号运行 Gateway。
237
- - 配置更新使用 `0600` 临时文件校验后原子替换;Secret 不进入普通响应和结构化错误日志。
238
-
239
- ## 验证
240
-
241
- ```bash
242
- npm test
243
- npm run typecheck
244
- npm run build
245
- npm pack --dry-run --json
246
- ```
247
-
248
- ## License
249
-
250
- [MIT](./LICENSE)
1
+ # Agent Nexus Gateway
2
+
3
+ [![CI](https://github.com/lumia1998/nexus-gateway/actions/workflows/ci.yml/badge.svg)](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
+ “设置”页面集中管理运行参数、浅色 / 深色 / 跟随系统主题和控制台密码。
54
+
55
+ - 总览显示智能体、就绪和当前内存会话数量,并列出需要注意的智能体。
56
+ - 运行记录把当前任务和历史任务分开显示,记录用户原始任务、真实运行阶段、状态、结果摘要、
57
+ 耗时和产物;每 5 秒自动刷新,也可查看完整详情。
58
+ 顶部统计涵盖全部保留记录;列表载入最近 200 条,搜索和筛选作用于已载入的记录。
59
+ 轮询保留搜索框、输入法组合态与筛选控件,表格详情和菜单支持键盘操作。
60
+ - Agents 支持本地 ACP 与远程 A2A;readiness 每 20 秒自动刷新,也可手动刷新。
61
+ - Workspaces 管理 ACP 的 realpath allowlist;A2A 不使用本地 Workspace。
62
+ - API Keys 显示真实状态和最后使用时间,并提供独立的显式 reveal 操作。
63
+ - 设置中的运行参数可以直接修改会话空闲有效期、ACP 单次任务超时和清理任务周期,保存后立即热生效。
64
+ 运行参数与控制台密码共用右上角“保存更改”,修改智能体权限策略后列表会立即刷新。
65
+ 默认值分别是 24 小时、30 分钟和 60 秒;A2A 请求超时在每个 Agent 的编辑页单独设置,默认 60 秒、
66
+ 最大 30 分钟。
67
+
68
+ ## Agent 协议
69
+
70
+ 每个任务都会附带协议级完成约束:Agent 在结束 turn 前必须处理完工作,等待用户输入或授权时必须使用
71
+ 协议请求,并提供非空最终说明或 Artifact。Gateway 只接受以下完成证明:
72
+
73
+ - ACP `session/prompt` 返回 `stopReason=end_turn`;`max_tokens`、`max_turn_requests`、拒绝和取消不会被
74
+ 误报为成功。
75
+ - A2A Task 明确进入 `COMPLETED`;如果远端直接返回 Message 而没有创建 Task,则以完整消息流结束作为
76
+ turn 边界。已经出现 Task 状态但没有终态的流会标记失败。
77
+ - Session 仍有待处理的 permission/input 请求,或者最终文本与 Artifact 都为空时,不允许进入
78
+ `completed`。
79
+
80
+ 成功的 Session 响应包含 `completion`,其中记录当前 Run ID、协议、完成来源、stop reason、最终文本和
81
+ 产物存在性以及完成时间。这个证明验证的是协议边界和结果存在性,不替代业务内容本身的语义验收。
82
+
83
+ ### ACP
84
+
85
+ | Driver | 默认入口 |
86
+ |---|---|
87
+ | `opencode` | `opencode acp` |
88
+ | `claude` | `claude-agent-acp` |
89
+ | `codex` | `codex-acp` |
90
+ | `pi` | `pi-acp` |
91
+ | `openclaw` | `openclaw acp` |
92
+ | `hermes` | `hermes acp` |
93
+
94
+ Claude Code、Codex、Pi 通常需要对应 Adapter:
95
+
96
+ ```bash
97
+ npm install -g \
98
+ @agentclientprotocol/claude-agent-acp \
99
+ @agentclientprotocol/codex-acp \
100
+ pi-acp
101
+ ```
102
+
103
+ `command`、`args`、`inheritEnv` 和 `env` 是仅可在本机配置文件修改的高级字段,WebUI 不接受这些
104
+ 字段。Workspace 在启动进程前经过 `realpath` 边界校验。
105
+
106
+ ACP 权限策略支持 `ask`(询问)、`allow`(始终允许)和 `deny`(拒绝)。`allow` 会优先选择
107
+ Agent 提供的 `allow_once`,不创建待确认请求;它适合管理员明确授权、工作区边界可信的自动化 Agent。
108
+ 默认仍为 `ask`。
109
+
110
+ ### A2A
111
+
112
+ A2A 使用官方 `@a2a-js/sdk` 客户端,通过完整的 Agent Card URL 发现名称、能力和实际调用地址,
113
+ 支持 JSON-RPC / HTTP+JSON 传输、流式消息(SDK 自动回退为非流式)、任务状态、Artifacts 和取消。
114
+ 首选传输可设为 `auto`、`jsonrpc` 或 `http-json`;可配置无认证、Bearer 或自定义 Header。私有网段
115
+ 和局域网 URL 不会被禁止。
116
+
117
+ Agent Card 和它声明的全部接口 URL 必须使用 HTTP(S),不含用户名、密码或 fragment;接口必须与
118
+ 配置的 Card 地址同源(协议、主机、端口均一致)。发现和业务请求都拒绝 HTTP 重定向,包括同源
119
+ 重定向,请直接配置最终地址。跨源部署可通过同源反向代理接入,避免把认证值发送给 Card 指定的其他站点。
120
+
121
+ ```json
122
+ {
123
+ "protocol": "a2a",
124
+ "name": "Research Agent",
125
+ "agentCardUrl": "http://192.168.1.20:8080/.well-known/agent-card.json",
126
+ "preferredTransport": "auto",
127
+ "auth": {
128
+ "type": "bearer",
129
+ "value": "env:RESEARCH_AGENT_TOKEN"
130
+ },
131
+ "timeoutMs": 60000
132
+ }
133
+ ```
134
+
135
+ 旧配置中的 `agentUrl` 仍按“服务根地址 + `/.well-known/agent-card.json`”方式发现 Card,无需手工
136
+ 迁移;在 WebUI 中保存一次后会写入新的 `agentCardUrl` 字段。
137
+
138
+ ## 配置
139
+
140
+ 推荐从首次启动生成的待初始化配置开始。完整示例见
141
+ [`nexus-agentd.example.json`](./nexus-agentd.example.json)。数值和数组字段会严格校验,错误配置
142
+ 会在启动或原子热重载前被拒绝,不再静默截断或忽略错误类型。
143
+
144
+ 常用资源限制:
145
+
146
+ ```json
147
+ {
148
+ "maxRequestBytes": 1048576,
149
+ "maxAttachmentBytes": 33554432,
150
+ "requestTimeoutMs": 30000,
151
+ "promptTimeoutMs": 1800000,
152
+ "cleanupIntervalMs": 60000,
153
+ "maxSessions": 64,
154
+ "maxSseConnections": 128,
155
+ "maxConnections": 256,
156
+ "sessionTtlMs": 86400000
157
+ }
158
+ ```
159
+
160
+ 输入附件通过 Session 临时保存,默认单个文件最多 16 MiB、单个 Session 最多 32 MiB、最多 16 个文件;
161
+ HTTP 上传总上限由 `maxAttachmentBytes` 控制,默认 32 MiB,允许调整到 64 MiB。Session 释放时附件也会
162
+ 一起清理。ACP 会优先使用 Agent 声明支持的 image/audio/embeddedContext 能力,否则为 Agent 提供受限的
163
+ `file://` resource link;A2A 则以带文件名和媒体类型的二进制 Part 发送。
164
+
165
+ ACP Session 还支持显式发布工作区文件。发布接口只接受 realpath 仍位于该 Session 工作区中的普通文件,
166
+ 拒绝目录、路径穿越和符号链接逃逸,单个文件最多 12 MiB。请求 body 支持单文件 `{ "path": "..." }` 或
167
+ 批量 `{ "paths": ["..."] }`(一次最多 32 条),响应在正常 Session 视图上附加
168
+ `publishedArtifacts` 数组,本次发布的文件以 base64 内联返回;不会暴露宿主机绝对路径,也不生成外部 URL。
169
+
170
+ Agent 也可以在最终文本里用 `MEDIA:<path>` 行声明交付文件,Gateway 在该轮完成前把它们快照为
171
+ Artifact,已处理的 `MEDIA:` 行不会出现在最终输出里。这条路径的边界是配置的 `workspaceRoots`,
172
+ 比发布接口的 Session 工作区更宽——Agent 常把交付文件写在工作区旁边的 skill 目录,该目录必须在
173
+ `workspaceRoots` 内才会被附加。单轮最多 8 个文件、单个文件最多 12 MiB;越界路径(含 `file://`
174
+ 形式)被拒绝,原因写入 Session 事件流,该轮仍正常完成。
175
+
176
+ API Key 与 A2A 认证值支持 `env:VAR`。Console Password 哈希由 WebUI 管理,不要手工生成或把
177
+ 旧 `authToken` 复制到该字段。
178
+
179
+ 运行记录保存在配置文件同目录的 `nexus-agentd-runs.json` sidecar 中,默认最多保留 1000 条。
180
+ 记录文件使用 `0600` 权限和原子替换;进行中的任务若遇到 Gateway 重启,会在下次启动时标记为
181
+ “已中断/失败”,而不会一直显示为运行中。
182
+
183
+ ## API
184
+
185
+ 匿名端点:
186
+
187
+ ```text
188
+ GET /health
189
+ GET /v1/bootstrap/status
190
+ POST /v1/bootstrap/initialize
191
+ GET /v1/admin/auth/status
192
+ POST /v1/admin/auth/login
193
+ POST /v1/admin/auth/logout
194
+ ```
195
+
196
+ 管理员 Cookie 端点:
197
+
198
+ ```text
199
+ GET /v1/admin/overview
200
+ GET /v1/admin/config
201
+ GET /v1/admin/agents
202
+ GET /v1/admin/runs
203
+ GET /v1/admin/runs/:id
204
+ PUT /v1/admin/agents/:id
205
+ DELETE /v1/admin/agents/:id
206
+ PUT /v1/admin/config/workspace-roots
207
+ PUT /v1/admin/config/runtime
208
+ PUT /v1/admin/password
209
+ GET /v1/admin/api-keys
210
+ POST /v1/admin/api-keys
211
+ PATCH /v1/admin/api-keys/:id
212
+ DELETE /v1/admin/api-keys/:id
213
+ POST /v1/admin/api-keys/:id/reveal
214
+ POST /v1/admin/api-keys/:id/regenerate
215
+ ```
216
+
217
+ Bearer API Key 数据面:
218
+
219
+ ```text
220
+ GET /v1/meta
221
+ GET /v1/agents
222
+ POST /v1/sessions
223
+ GET /v1/sessions/:id
224
+ DELETE /v1/sessions/:id
225
+ POST /v1/sessions/:id/attachments
226
+ POST /v1/sessions/:id/message
227
+ POST /v1/sessions/:id/requests/:requestId/resolve
228
+ POST /v1/sessions/:id/artifacts/publish
229
+ POST /v1/sessions/:id/cancel
230
+ GET /v1/sessions/:id/events
231
+ ```
232
+
233
+ `/v1/meta` 和 Session 响应包含 Gateway `instanceId`;完成的 Session 还包含与当前 Run 绑定的
234
+ `completion` 证明,客户端可识别进程重启和迟到/伪造的完成状态。授权与输入通过精确的
235
+ `requestId` 解析;过期 ID 返回 `409`,不会误答后续请求。`DELETE /v1/sessions/:id` 会取消活动任务、
236
+ 释放 Agent 整个进程组并移除内存 Session。Gateway 停止时会先终止 Session,再在有限宽限期后关闭残留
237
+ HTTP/SSE 连接,避免长连接或 Agent 孙进程阻塞服务重启。
238
+
239
+ 消息和待输入回复的 `202` 表示已接受,执行结果通过 Session/SSE 查询;A2A 回复等待旧消息流结束后
240
+ 发送,不会在等待期间占用会话操作锁。取消 ACP 或 A2A 会话会释放 runtime,随后向该会话提交消息或
241
+ 回复返回 `409`,需要新建会话继续。ACP 初始化和 `session/new` 共用 30 秒握手期限,超时会失败并
242
+ 回收子进程及会话槽位;该期限独立于任务执行超时。
243
+
244
+ API Key 的 Agent scope 在 Agent inventory、Session 创建和后续 Session 操作上都会检查;Session
245
+ 还绑定创建它的 Key,其他 Key 即使拥有同一 Agent scope 也不能读取或控制该 Session。
246
+ 运行记录接口仅接受管理员 Cookie,数据面 API Key 无权读取。
247
+
248
+ ## 局域网安全
249
+
250
+ - 默认仍只监听 localhost;需要 LAN 时显式使用 `--host 0.0.0.0`,并用主机防火墙限制来源。
251
+ - LAN 上的纯 HTTP 为兼容 Cookie 默认不设置 `Secure`;跨不可信网络应放在 HTTPS/mTLS 反向代理
252
+ 或可信隧道后,并将 `secureAdminCookies` 设为 `true`。
253
+ - 管理写操作要求同源 `Origin`,Cookie 使用 `SameSite=Strict`;登录和无效 API Key 有失败限速。
254
+ - 不直接暴露公网。使用专用低权限系统账号运行 Gateway。
255
+ - 配置更新使用 `0600` 临时文件校验后原子替换;Secret 不进入普通响应和结构化错误日志。
256
+
257
+ ## 验证
258
+
259
+ ```bash
260
+ npm test
261
+ npm run typecheck
262
+ npm run build
263
+ npx playwright install chromium
264
+ npm run test:webui
265
+ npm pack --dry-run --json
266
+ ```
267
+
268
+ ## License
269
+
270
+ [MIT](./LICENSE)
@@ -10,6 +10,8 @@ export declare class A2AClientRuntime implements AgentSessionRuntime {
10
10
  private taskId;
11
11
  private contextId;
12
12
  private prompting;
13
+ private promptFinished?;
14
+ private queuedResponse;
13
15
  private disposed;
14
16
  private activeController?;
15
17
  private readonly artifactCache;
@@ -23,6 +25,7 @@ export declare class A2AClientRuntime implements AgentSessionRuntime {
23
25
  respondPending(response: AgentdPendingResponse | string, attachments?: AgentdInputAttachment[]): Promise<void>;
24
26
  cancel(): Promise<void>;
25
27
  dispose(): Promise<void>;
28
+ isAvailable(): boolean;
26
29
  private messageRequest;
27
30
  private processResponse;
28
31
  private processTask;