@tencent-ai/agent-harness 0.1.4 → 0.1.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/README.md +14 -14
- package/cli/dist/codebuddy-headless.js +11 -11
- package/cli/dist/codebuddy.js +19 -19
- package/docs/acp-v2.md +86 -0
- package/docs/distribution.md +10 -9
- package/docs/integration-layer.md +21 -15
- package/docs/protocol.md +29 -25
- package/package.json +6 -8
package/docs/acp-v2.md
CHANGED
|
@@ -426,6 +426,92 @@ canonical profile 使用标准 method,而不是产品 notification:
|
|
|
426
426
|
- session 配置:Session Config Options 加 `session/set_config_option`;
|
|
427
427
|
- 前台等待:`state_update: requires_action`,解决后转为 `running`。
|
|
428
428
|
|
|
429
|
+
### 7.1 AskUserQuestion form wire
|
|
430
|
+
|
|
431
|
+
Agent CLI 的 `AskUserQuestion` 一次可以发送 1–4 个问题;每个问题都可以是单选或多选,
|
|
432
|
+
并且都带一份独立的自由文本回答。Harness 不为它增加私有 method 或 `_meta` 答案结构,
|
|
433
|
+
而是原样转发标准 `elicitation/create` form request。
|
|
434
|
+
|
|
435
|
+
第 `i` 个问题使用以下稳定字段 ID:
|
|
436
|
+
|
|
437
|
+
- `q_i`:必填的选择结果;
|
|
438
|
+
- `q_i_option_j`:第 `j` 个预设选项的 wire value;显示文案仍在 enum option 的
|
|
439
|
+
`title` 中;
|
|
440
|
+
- `q_i_custom`:可选自由文本属性,同时也是选择列表中“自定义回答”项的 wire value。
|
|
441
|
+
|
|
442
|
+
单选的 `q_i` 是 `type: "string"` + `oneOf`;多选是 `type: "array"` +
|
|
443
|
+
`items.anyOf`。两者都把 `{ "const": "q_i_custom", "title": "Other" }`
|
|
444
|
+
放进选项列表,从而让 Client 通过该值关联同名的自由文本属性。选项、单选/多选和回答值
|
|
445
|
+
全部由标准 `requestedSchema` 表达;`_meta` 不承载这些语义。
|
|
446
|
+
|
|
447
|
+
以下表单同时包含一道单选题和一道多选题:
|
|
448
|
+
|
|
449
|
+
```json
|
|
450
|
+
{
|
|
451
|
+
"type": "object",
|
|
452
|
+
"properties": {
|
|
453
|
+
"q_0": {
|
|
454
|
+
"type": "string",
|
|
455
|
+
"title": "Database",
|
|
456
|
+
"oneOf": [
|
|
457
|
+
{ "const": "q_0_option_0", "title": "SQLite" },
|
|
458
|
+
{ "const": "q_0_option_1", "title": "Postgres" },
|
|
459
|
+
{ "const": "q_0_custom", "title": "Other" }
|
|
460
|
+
]
|
|
461
|
+
},
|
|
462
|
+
"q_0_custom": {
|
|
463
|
+
"type": "string",
|
|
464
|
+
"title": "Database custom answer"
|
|
465
|
+
},
|
|
466
|
+
"q_1": {
|
|
467
|
+
"type": "array",
|
|
468
|
+
"title": "Tests",
|
|
469
|
+
"items": {
|
|
470
|
+
"anyOf": [
|
|
471
|
+
{ "const": "q_1_option_0", "title": "Unit tests" },
|
|
472
|
+
{ "const": "q_1_option_1", "title": "E2E tests" },
|
|
473
|
+
{ "const": "q_1_custom", "title": "Other" }
|
|
474
|
+
]
|
|
475
|
+
},
|
|
476
|
+
"minItems": 1
|
|
477
|
+
},
|
|
478
|
+
"q_1_custom": {
|
|
479
|
+
"type": "string",
|
|
480
|
+
"title": "Tests custom answer"
|
|
481
|
+
}
|
|
482
|
+
},
|
|
483
|
+
"required": ["q_0", "q_1"]
|
|
484
|
+
}
|
|
485
|
+
```
|
|
486
|
+
|
|
487
|
+
每道题都使用自定义回答时,Client 返回:
|
|
488
|
+
|
|
489
|
+
```json
|
|
490
|
+
{
|
|
491
|
+
"action": "accept",
|
|
492
|
+
"content": {
|
|
493
|
+
"q_0": "q_0_custom",
|
|
494
|
+
"q_0_custom": "MySQL",
|
|
495
|
+
"q_1": ["q_1_custom"],
|
|
496
|
+
"q_1_custom": "Contract tests"
|
|
497
|
+
}
|
|
498
|
+
}
|
|
499
|
+
```
|
|
500
|
+
|
|
501
|
+
多选题可以同时选择预设项和自定义回答:
|
|
502
|
+
|
|
503
|
+
```json
|
|
504
|
+
{
|
|
505
|
+
"q_1": ["q_1_option_0", "q_1_custom"],
|
|
506
|
+
"q_1_custom": "Contract tests"
|
|
507
|
+
}
|
|
508
|
+
```
|
|
509
|
+
|
|
510
|
+
Client 应在用户选择 `q_i_custom` 时同时提交非空的同名字符串属性;未选择时可以省略该
|
|
511
|
+
属性,也可以提交空字符串。Agent 会再次校验引用和值必须成对出现、选项 ID 必须属于该题,
|
|
512
|
+
且多选数组必须非空并且没有重复项。自定义回答仍使用 `action: "accept"`;只有用户明确
|
|
513
|
+
拒绝或取消交互时,Client 才应返回 `decline` 或 `cancel`,不能把自定义回答合成为取消。
|
|
514
|
+
|
|
429
515
|
Harness 额外广告一个 session-scoped Plugin Config Option:
|
|
430
516
|
|
|
431
517
|
- `configId: "enabledPlugins"` 是 `session/set_config_option` 的稳定 selector;
|
package/docs/distribution.md
CHANGED
|
@@ -8,8 +8,8 @@
|
|
|
8
8
|
|
|
9
9
|
```bash
|
|
10
10
|
npm install --ignore-scripts --no-save \
|
|
11
|
-
@tencent-ai/agent-harness@0.1.
|
|
12
|
-
@tencent-ai/agent-harness-darwin-arm64@0.1.
|
|
11
|
+
@tencent-ai/agent-harness@0.1.5-snapshot-FULL_40_CHAR_COMMIT_SHA \
|
|
12
|
+
@tencent-ai/agent-harness-darwin-arm64@0.1.5-snapshot-FULL_40_CHAR_COMMIT_SHA
|
|
13
13
|
./node_modules/.bin/agent-harness --version
|
|
14
14
|
```
|
|
15
15
|
|
|
@@ -71,13 +71,14 @@ runtime 作为显式环境契约交给 Agent shell 的 JavaScript 安全 sidecar
|
|
|
71
71
|
`PATH` 没有 `node` 时误把 Harness SFE 当成 Node。只需要检查或自行组装进程环境时才单独使用
|
|
72
72
|
`resolveAgentHarnessBinary()`。
|
|
73
73
|
|
|
74
|
-
Node 22.
|
|
74
|
+
Node 22.15+ 的主包 bootstrap 会转入显式安装的匹配 SFE。IDE 仍可直接 spawn 平台包物理 executable,
|
|
75
75
|
以便持有真实 Harness PID,而不经过短暂的 npm bootstrap 进程。
|
|
76
76
|
|
|
77
77
|
所有平台包都声明 `preferUnplugged: true`,供 Yarn PnP 把 executable 物化到磁盘。Electron Host
|
|
78
78
|
打包应用时还必须把选中平台包的完整 `bin/**` 放入 `asarUnpack`;只 unpack 顶层 SFE 不够,因为
|
|
79
|
-
sandbox、safe-delete/brokered shell helper 和 Product 等物理 sidecar 都从其相邻目录解析。
|
|
80
|
-
|
|
79
|
+
sandbox、safe-delete/brokered shell helper 和 Product 等物理 sidecar 都从其相邻目录解析。
|
|
80
|
+
Windows process containment 由 SFE 固化的 Bun `--no-orphans` 提供,没有需要 unpack 的
|
|
81
|
+
Harness-owned Job addon。
|
|
81
82
|
|
|
82
83
|
## SFE 内部边界
|
|
83
84
|
|
|
@@ -114,10 +115,10 @@ Windows SFE 内的微信支付插件完整性检查直接使用 `bun:ffi` 调用
|
|
|
114
115
|
- macOS:`bin/native/darwin-<arch>/process-snapshot.node` 用于退出时枚举进程组及后代;
|
|
115
116
|
`bin/vendor/shim/native/darwin-<arch>/brokered-sandbox-native.node` 供沙箱内的外部 Node
|
|
116
117
|
子进程消费 sandbox extension 与同步访问 broker;
|
|
117
|
-
- Windows
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
executable;
|
|
118
|
+
- Windows:唯一 SFE 在编译时固化 Bun 1.4 的 `--no-orphans`;Bun 原生用 kill-on-close
|
|
119
|
+
Job Object 监视直接父进程并回收后代。Harness、Resource 与 Executor 都重入同一 SFE,
|
|
120
|
+
不发布 Harness-owned addon 或代理 launcher,因此 stdio/IPC 仍由真实目标独占,平台包也
|
|
121
|
+
没有第二个 executable;
|
|
121
122
|
- Linux:`bin/runtime/sandbox-runtime/vendor/seccomp/<arch>/{apply-seccomp,unix-block.bpf}`
|
|
122
123
|
保留 legacy sandbox 的 AF_UNIX 隔离;
|
|
123
124
|
- 所有 target 都只携带本机的 `genie-trash`;macOS 另带 brokered shell 所需的
|
|
@@ -225,7 +225,7 @@ per-server stdio compatibility carrier。
|
|
|
225
225
|
|
|
226
226
|
| Operation | 行为 |
|
|
227
227
|
| ---------------------------------- | ------------------------------------------------------------------ |
|
|
228
|
-
| `tools/list` | 返回 view 缓存的 tool name、schema、description 与
|
|
228
|
+
| `tools/list` | 返回 view 缓存的 tool name、schema、description、annotations 与 `_meta` |
|
|
229
229
|
| `tools/call` | 通过 exact binding 调用 Executor,不接受 raw Executor address |
|
|
230
230
|
| `notifications/tools/list_changed` | authoritative registration snapshot 变化后通知已连接的 Agent CLI |
|
|
231
231
|
| cancellation | 双向传播取消,并 interrupt 对应 Executor Effect fiber |
|
|
@@ -234,6 +234,14 @@ per-server stdio compatibility carrier。
|
|
|
234
234
|
`tool/cancel`;超时不仅结束 Harness promise,也会 interrupt 对应 Executor Effect
|
|
235
235
|
fiber,避免后台 invocation 继续占用 MCP connection。
|
|
236
236
|
|
|
237
|
+
上游 MCP Tool `_meta` 作为标准、不透明的展示扩展透传。当前
|
|
238
|
+
`@executor-js/plugin-mcp@1.5.40` 的默认 manifest projection 会丢弃该字段,因此 Harness
|
|
239
|
+
通过依赖 patch 把它保存在 Executor 已有的 `annotations.mcp.upstreamMeta` 内部 envelope,
|
|
240
|
+
再在 private registration snapshot 出口恢复为标准 `_meta`;内部 envelope 不会投影成 MCP
|
|
241
|
+
Tool annotations。单个 `_meta` 的 JSON 编码上限是 256 KiB,跨边界时深拷贝;Harness
|
|
242
|
+
不读取其中的权限、路由或凭据信息。Agent CLI 可以按自己的 extension contract 使用
|
|
243
|
+
`shortDescription`、MCP Apps UI metadata 等字段。
|
|
244
|
+
|
|
237
245
|
成功结果保留 `content`、`structuredContent` 和 `_meta`。当前 Executor MCP plugin 会在
|
|
238
246
|
部分 upstream `isError: true` 路径丢失 `structuredContent`/`_meta`;Harness 只保证返回
|
|
239
247
|
合法 MCP error,不承诺该错误分支完全无损。
|
|
@@ -327,16 +335,13 @@ POSIX stdio 已启用 guardian:
|
|
|
327
335
|
- Executor child 与 guardian 都使用最小 allowlisted environment;source 的显式 stdio
|
|
328
336
|
env 只叠加到这份 sanitized base。
|
|
329
337
|
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
验证成功后立即从真实进程 environment 删除,只保留当前 PID 的进程内 attachment proof。单独
|
|
338
|
-
伪造 marker 会 fail hard,Job name 也不会继续传给 MCP/其他 descendants。`taskkill /T` 只保留为
|
|
339
|
-
CodeBuddy session 的正常关闭路径,不被当作 parent-death proof。
|
|
338
|
+
所有 SFE 在编译时固化 Bun 1.4 的 `--no-orphans`,通用 application entry 在任何角色分派前
|
|
339
|
+
校验该参数。Windows 下 Bun 原生使用 kill-on-close Job Object 监视直接父进程;per-session
|
|
340
|
+
Agent CLI、每个 Resource generation 与 private Executor generation 都通过同一 SFE 重入,
|
|
341
|
+
自然得到相同契约。真实 target 仍直接拥有 stdio/IPC,没有代理 launcher 消费
|
|
342
|
+
`NODE_CHANNEL_FD`;crash/restart 终止旧 target 时由 Bun 回收其中的 stdio MCP,再提交新
|
|
343
|
+
runtime epoch。Harness 不再发布 native addon,也不维护 named marker 或 membership proof;
|
|
344
|
+
`taskkill /T` 只保留为 CodeBuddy session 的正常关闭路径,不被当作 parent-death proof。
|
|
340
345
|
|
|
341
346
|
## 3. 固定边界与限制
|
|
342
347
|
|
|
@@ -353,7 +358,7 @@ CodeBuddy session 的正常关闭路径,不被当作 parent-death proof。
|
|
|
353
358
|
| R9 | Agent CLI permission 是唯一产品权限源;Executor policy 只避免重复审批。 |
|
|
354
359
|
| R10 | Harness 不新增 durable integration/credential store;child restart 使用 declarative rehydrate。 |
|
|
355
360
|
| R11 | 单 upstream 不可达只影响该 registration;runtime crash 使全部 MCP 暂时 unavailable,但 session 继续。 |
|
|
356
|
-
| R12 | POSIX stdio 使用 guardian;Windows
|
|
361
|
+
| R12 | POSIX stdio 使用 guardian;Windows SFE 必须启用 Bun 原生 `--no-orphans` containment,否则 runtime fail closed。 |
|
|
357
362
|
|
|
358
363
|
当前不提供:
|
|
359
364
|
|
|
@@ -369,9 +374,10 @@ CodeBuddy session 的正常关闭路径,不被当作 parent-death proof。
|
|
|
369
374
|
- 单个 stdio MCP process 的独立监管。Executor plugin 没有 per-child lifecycle hook,
|
|
370
375
|
因此 stdio cleanup 以整个 Executor process group 为单位。
|
|
371
376
|
|
|
372
|
-
POSIX process group/guardian 和 Windows
|
|
377
|
+
POSIX process group/guardian 和 Windows 上 Bun 原生 no-orphans Job 是受信任本地 stdio MCP 的生命周期
|
|
373
378
|
治理,不是恶意代码 sandbox。POSIX 主动 `setsid`/`setpgid` 逃离 group 的 descendant
|
|
374
|
-
不在安全承诺内;Windows Job
|
|
379
|
+
不在安全承诺内;Windows 侧由 Bun 维护 kill-on-close Job,不允许 Harness 私自降级为
|
|
380
|
+
`taskkill` 或普通进程树扫描。
|
|
375
381
|
|
|
376
382
|
Executor catalog 使用内存 FumaDB;Harness 整体退出后不独立存活,也不跨多个 Harness
|
|
377
383
|
process 共享。durable Agent session/history 仍由 Agent CLI 持有。
|
|
@@ -396,7 +402,7 @@ process 共享。durable Agent session/history 仍由 Agent CLI 持有。
|
|
|
396
402
|
| `tools/call` request timeout 下发 `tool/cancel` 并终止 private invocation | `e2e/executor-tool-timeout.test.ts` | 已覆盖 |
|
|
397
403
|
| health timeout 后 process-group cleanup/restart、crash fuse half-open recovery、close/cancel 与 cleanup/backoff race | `executor-supervisor.test.ts`、`e2e/executor-health-timeout.test.ts`、`e2e/stability-soak.test.ts` | unit 全平台;process lifecycle 为 macOS/Linux 覆盖 |
|
|
398
404
|
| invocation-scoped elicitation signal、view revoke 与 late response cancel | `session-mcp-view.test.ts` | 已覆盖 |
|
|
399
|
-
| Windows
|
|
405
|
+
| Windows Bun no-orphans capability gate、Executor/Resource IPC、nested SFE crash cleanup/restart | `sfe-process-containment.test.ts`、`e2e/bun-no-orphans-sfe.test.ts`、`e2e/executor-stdio-mcp.test.ts`、`e2e/resource-windows-no-orphans.test.ts` | unit 全平台;lifecycle 仅 Windows runner |
|
|
400
406
|
|
|
401
407
|
Harness resource/runtime 以 [`protocol.md`](protocol.md) 为准;ACP MCP、permission 与
|
|
402
408
|
elicitation wire 语义以 [`acp-v2.md`](acp-v2.md) 为准。MCP tool-level `isError` 不自动
|
package/docs/protocol.md
CHANGED
|
@@ -471,7 +471,7 @@ unavailable,新 Product commit 推进 execution generation 时再清理 overri
|
|
|
471
471
|
| -------------- | ------------ | --------------------------- | ----------------------------------------------------------------------- |
|
|
472
472
|
| Host → Harness | request | `session/new` | 立即启动 Agent CLI child,以返回的 `sessionId` attach |
|
|
473
473
|
| Host → Harness | request | `session/list` | 通过 Resource child 读取 durable catalog |
|
|
474
|
-
| Host → Harness | request | `session/delete` | 关闭 attachment 后删除 root
|
|
474
|
+
| Host → Harness | request | `session/delete` | 关闭 attachment 后删除 root 及其物理 owned Agent-tool 数据 |
|
|
475
475
|
| Host → Harness | request | `session/fork` | 从 durable conversation 的当前 head 或指定 turn boundary 创建新 session |
|
|
476
476
|
| Host → Harness | request | `session/rewind` | 在同一 `sessionId` 上原子移动 durable conversation head |
|
|
477
477
|
| Host → Harness | request | `session/resume` | durable replay + dormant attachment;不会因浏览历史启动 Agent CLI child |
|
|
@@ -804,19 +804,21 @@ setup 一致;takeover 还要求 additional directories 完全一致且新 Clie
|
|
|
804
804
|
Cold resume 不注册 Executor integration 或连接 upstream MCP;首次 Agent CLI child
|
|
805
805
|
materialization 才创建 session MCP view。
|
|
806
806
|
|
|
807
|
-
`session/close` 只改变 runtime;`session/delete` 由 Agent CLI
|
|
808
|
-
|
|
809
|
-
|
|
810
|
-
|
|
811
|
-
|
|
807
|
+
`session/close` 只改变 runtime;`session/delete` 由 Agent CLI 删除指定 catalog root
|
|
808
|
+
及其物理 owned directory 下的 Agent-tool Subagent 数据。显式 `session/fork` 是独立
|
|
809
|
+
catalog root,不会随 source 删除。删除不读取或校验 transcript JSONL,因此重复、损坏
|
|
810
|
+
或很大的历史 item 不会阻断删除,也不会让耗时随会话轮数增长。Nested ownership 只从
|
|
811
|
+
受控 `subagents/` 目录和小型 identity sidecar 推导,并验证 canonical runtime identity、
|
|
812
|
+
完整 lineage、catalog-root 隔离、owner path 与 symlink safety;不安全的 nested 引用被
|
|
813
|
+
忽略,当前 root 明确拥有的数据仍可删除。
|
|
812
814
|
|
|
813
815
|
每个 project copy 的 catalog commit 是把 root JSONL 原子 rename 为不参与
|
|
814
|
-
`session/list` 的 delete tombstone。之后 deepest-first 删除 descendant
|
|
815
|
-
|
|
816
|
+
`session/list` 的 delete tombstone。之后 deepest-first 删除 descendant runtime-owned
|
|
817
|
+
directory,再删除 root-owned directory、root meta 与 file-rollback;tombstone 最后删除。
|
|
816
818
|
后半程失败不会返回成功,且保留 tombstone 供同一 `session/delete` 幂等续做。Legacy
|
|
817
819
|
catalog 中同一 `sessionId` 的多个 project copy 会全部 preflight 后逐个提交;任一 copy
|
|
818
|
-
中断时重复调用继续剩余 copy。
|
|
819
|
-
|
|
820
|
+
中断时重复调用继续剩余 copy。Project lookup 对每个 project 只做目标 root 的固定数量
|
|
821
|
+
exact stat probe,不读取该 project 的其他 session entry。
|
|
820
822
|
协议没有 `session_end` update,prompt 结束使用 ACP v2 `state_update` lifecycle。
|
|
821
823
|
|
|
822
824
|
### 3.5 Reverse interaction
|
|
@@ -832,6 +834,8 @@ Reverse interaction 只能来自已 attach 且 response boundary 已提交的 se
|
|
|
832
834
|
JSON-RPC request ID。cancel、close、stdio disconnect 或下一次 prompt 会终止相关的
|
|
833
835
|
session-scoped reverse request。Network owner detach 会终止已经发给旧 connection 的
|
|
834
836
|
request;detach 后新产生的 request bounded wait rebind,成功后只发给新 owner。
|
|
837
|
+
`AskUserQuestion` 的多问题、单/多选和每题自定义回答 form wire 约定见
|
|
838
|
+
[ACP v2](acp-v2.md#71-askuserquestion-form-wire)。
|
|
835
839
|
|
|
836
840
|
### 3.6 Subagent
|
|
837
841
|
|
|
@@ -2143,13 +2147,13 @@ close 走各自 supervisor cleanup,Harness 异常退出时 lease EOF 触发 gu
|
|
|
2143
2147
|
无法确认 cleanup 时触发 one-way containment fuse:server 原子进入 draining、关闭既有
|
|
2144
2148
|
stdio/HTTP/WS connection,清理期间 `/readyz` 保持 503,随后 Harness 以失败状态退出,
|
|
2145
2149
|
由外层 supervisor 重启;在同一进程内不再接受 initialize/spawn。这是 fail-closed
|
|
2146
|
-
resource containment,不是恶意多租户 sandbox
|
|
2147
|
-
|
|
2148
|
-
|
|
2149
|
-
|
|
2150
|
-
|
|
2151
|
-
|
|
2152
|
-
|
|
2150
|
+
resource containment,不是恶意多租户 sandbox。所有 SFE 在编译时固化 Bun 1.4 的
|
|
2151
|
+
`--no-orphans`,并在 application entry 校验该 immutable execution argument。Windows 下
|
|
2152
|
+
Bun 原生使用 kill-on-close Job Object 监视直接父进程;Resource、private Executor 与
|
|
2153
|
+
per-session Agent CLI target 都通过同一 SFE 重入,因此不存在消费 stdio/IPC 的代理
|
|
2154
|
+
launcher。planned rotation 或 crash recovery 终止旧 target 时,Bun 回收其 descendants,
|
|
2155
|
+
再由 supervisor 提交 replacement。Harness 不再维护 native addon、named marker 或第二套
|
|
2156
|
+
Job membership proof。
|
|
2153
2157
|
|
|
2154
2158
|
## 9. 与 Codex app-server / ACP 的关系
|
|
2155
2159
|
|
|
@@ -2240,11 +2244,11 @@ POSIX stdio 当前使用 minimal environment、独立 process group,以及 roo
|
|
|
2240
2244
|
guardian:private initialize 前先完成 root bind acknowledgement;随后建立的 stubborn
|
|
2241
2245
|
stdio anchor 独立监测 guardian。cleanup 对 group 与 ancestry snapshot 发 TERM,并以
|
|
2242
2246
|
一次 terminal SIGKILL 收口。root bind 前 guardian 不 signal group,由 supervisor 持有
|
|
2243
|
-
的 exact Executor `ChildProcess` 清理。Windows
|
|
2244
|
-
|
|
2245
|
-
|
|
2246
|
-
|
|
2247
|
-
|
|
2247
|
+
的 exact Executor `ChildProcess` 清理。Windows SFE 固化 Bun 1.4 的 `--no-orphans`,
|
|
2248
|
+
由 Bun 原生 kill-on-close Job Object 提供 parent-death boundary;Harness、Resource、
|
|
2249
|
+
Executor 和 Agent CLI 私有角色都重入同一 SFE。只有该 immutable execution argument
|
|
2250
|
+
生效时才广告/启用 stdio。这是 trusted local MCP 的生命周期治理,不是恶意 executable
|
|
2251
|
+
sandbox。
|
|
2248
2252
|
|
|
2249
2253
|
具体 lifecycle、命名、credential adapter、connection reuse、限制和测试矩阵维护在
|
|
2250
2254
|
[`integration-layer.md`](integration-layer.md)。
|
|
@@ -2273,7 +2277,7 @@ AGENT_HARNESS_PLATFORM_TARBALL=<current-platform-tarball> \
|
|
|
2273
2277
|
Plugin/Marketplace/Config/Skills、公开 structured error schema 与 private→public
|
|
2274
2278
|
fail-closed boundary、backpressure、auth 和 cleanup;
|
|
2275
2279
|
- dedicated Resource child:versioned process lifecycle、exact `targetPid`/runtime instance
|
|
2276
|
-
identity、POSIX guardian 与 UDS `0700`/`0600`、Windows
|
|
2280
|
+
identity、POSIX guardian 与 UDS `0700`/`0600`、Windows Bun no-orphans containment 与
|
|
2277
2281
|
canonical Named Pipe、chunk/size boundary、Product generation drain/cooperative close、
|
|
2278
2282
|
hard-crash local recovery、read/idempotent retry、mutation `outcomeUnknown` 和 crash-loop
|
|
2279
2283
|
fuse half-open;
|
|
@@ -2290,8 +2294,8 @@ AGENT_HARNESS_PLATFORM_TARBALL=<current-platform-tarball> \
|
|
|
2290
2294
|
- Executor failure E2E:tool request timeout 下发 `tool/cancel`;health timeout 后
|
|
2291
2295
|
cleanup/restart、crash fuse single-flight half-open recovery,以及 close/cancel 与
|
|
2292
2296
|
timer、probe、cleanup/backoff race;
|
|
2293
|
-
- Windows stdio:
|
|
2294
|
-
spawn spec 有跨平台 unit/static coverage;真实 nested
|
|
2297
|
+
- Windows stdio:Bun no-orphans build invariant、capability gate 和 Executor IPC
|
|
2298
|
+
spawn spec 有跨平台 unit/static coverage;真实 nested SFE crash/restart、MCP descendant
|
|
2295
2299
|
cleanup 只在 Windows runner 执行;
|
|
2296
2300
|
- transport fixture:stdio、HTTP/SSE、WebSocket、POSIX Unix socket,以及 Windows runner
|
|
2297
2301
|
上强制 bearer 的 Named Pipe 共用同一 public ACP v2 boundary 与 ordering;HTTP 额外覆盖
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tencent-ai/agent-harness",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.5",
|
|
4
4
|
"description": "Standalone JSON-RPC agent harness backed by CodeBuddy Code",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -120,10 +120,10 @@
|
|
|
120
120
|
},
|
|
121
121
|
"dependencies": {
|
|
122
122
|
"@agentclientprotocol/sdk": "1.4.0",
|
|
123
|
-
"@effect/platform-node": "4.0.0-rc.
|
|
123
|
+
"@effect/platform-node": "4.0.0-rc.112",
|
|
124
124
|
"@modelcontextprotocol/sdk": "1.29.0",
|
|
125
125
|
"ajv": "^8.20.0",
|
|
126
|
-
"effect": "4.0.0-rc.
|
|
126
|
+
"effect": "4.0.0-rc.112",
|
|
127
127
|
"evlog": "2.26.0",
|
|
128
128
|
"ws": "^8.18.3",
|
|
129
129
|
"zod": "^4.0.0"
|
|
@@ -144,11 +144,11 @@
|
|
|
144
144
|
"@types/ws": "^8.18.1",
|
|
145
145
|
"typescript": "npm:@typescript/typescript6@^6.0.0",
|
|
146
146
|
"vitest": "^4.1.10",
|
|
147
|
-
"@genie/
|
|
148
|
-
"@genie/
|
|
147
|
+
"@genie/vitest-config": "0.0.0",
|
|
148
|
+
"@genie/style-guide": "0.0.0"
|
|
149
149
|
},
|
|
150
150
|
"engines": {
|
|
151
|
-
"node": ">=22.
|
|
151
|
+
"node": ">=22.15 <=24"
|
|
152
152
|
},
|
|
153
153
|
"nx": {
|
|
154
154
|
"targets": {
|
|
@@ -268,9 +268,7 @@
|
|
|
268
268
|
"build:sfe": "node scripts/build-sfe.mjs",
|
|
269
269
|
"build:sfe:worker": "node scripts/build-sfe-worker.mjs",
|
|
270
270
|
"build:native:darwin": "node scripts/build-darwin-process-snapshot.mjs",
|
|
271
|
-
"build:native:windows": "node scripts/build-windows-job-object.mjs",
|
|
272
271
|
"check:native:darwin": "node scripts/build-darwin-process-snapshot.mjs --check",
|
|
273
|
-
"check:native:windows": "node scripts/build-windows-job-object.mjs --check",
|
|
274
272
|
"clean": "node -e \"const fs=require('node:fs'); for (const path of ['lib','cli','out-tsc','tsconfig.lib.tsbuildinfo','executor/lib','executor/tsconfig.tsbuildinfo']) fs.rmSync(path, { force: true, recursive: true })\"",
|
|
275
273
|
"lint": "pnpm --dir executor run lint && genie-lint",
|
|
276
274
|
"package:tarball": "pnpm run build && pnpm --config.ignore-scripts=true pack --out agent-harness.tgz",
|