@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/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;
@@ -8,8 +8,8 @@
8
8
 
9
9
  ```bash
10
10
  npm install --ignore-scripts --no-save \
11
- @tencent-ai/agent-harness@0.1.4-snapshot-FULL_40_CHAR_COMMIT_SHA \
12
- @tencent-ai/agent-harness-darwin-arm64@0.1.4-snapshot-FULL_40_CHAR_COMMIT_SHA
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.12+ 的主包 bootstrap 会转入显式安装的匹配 SFE。IDE 仍可直接 spawn 平台包物理 executable,
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 都从其相邻目录解析。Windows
80
- Job addon 已嵌入 SFE,不是需要单独 unpack 的 sidecar。
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:Job Object 实现编译为 `job-object.node` 并由 Bun 直接嵌入 SFE;Harness、Resource
118
- Executor 在各自最早的 Windows entry 自加入独立的 kill-on-close Jobaddon 的原生 waiter
119
- 监视直接父进程。没有代理 launcher 进程,因此 stdio/IPC 仍由真实目标独占,平台包也没有第二个
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 与 annotations |
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
- Windows SFE 在加载通用 application entry 前由内嵌 N-API addon 创建随机 named strict Job,并让
331
- 真实 Harness PID 自加入;Job 使用 `KILL_ON_JOB_CLOSE`,不允许 breakaway,原生 waiter 在直接父
332
- 进程退出时终止整个 Job。per-session Agent CLI、每个 Resource generation 与 private Executor
333
- generation 也在各自最早入口自加入独立 nested Job。真实 target 仍直接拥有 stdio/IPC,没有代理
334
- launcher 消费 `NODE_CHANNEL_FD`;crash/restart 终止旧 target,进程退出关闭 Job handle、回收其中的
335
- stdio MCP,再提交新 runtime epoch。环境中的 Job name 只用于一次性定位;Harness Executor
336
- child 都必须用原生 verifier exact PID 执行 `OpenJobObject`、`IsProcessInJob` 并确认 Job flags,
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 必须 exact-PID named Job proof 成功,否则 runtime fail closed。 |
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 strict Job 是受信任本地 stdio MCP 的生命周期
377
+ POSIX process group/guardian 和 Windows Bun 原生 no-orphans Job 是受信任本地 stdio MCP 的生命周期
373
378
  治理,不是恶意代码 sandbox。POSIX 主动 `setsid`/`setpgid` 逃离 group 的 descendant
374
- 不在安全承诺内;Windows Job 明确不允许 breakaway。
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 named Job proof、capability gate、Executor IPC、nested Job crash cleanup/restart | `windows-job*.test.ts`、`e2e/executor-stdio-mcp.test.ts` | unit/PE 全平台;lifecycle 仅 Windows runner |
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 及其可达 durable Subagent graph |
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 删除 root 及其完整可达
808
- durable Subagent graph。删除前扫描 root 的物理 JSONL(包括当前 replay head 外的旧
809
- branch)并验证 nested child lineage、单一 parent、cycle、owner path 和 symlink safety;
810
- 因此 running/background child 也会被回收,但损坏或不安全的 graph 会在 catalog 改变前
811
- fail closed。不可达的其他 root/child graph 保持不变。
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 transcript、meta、
815
- file-rollback tool-result blobs,再删除 root-owned artifacts;tombstone 最后删除。
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。Delete graph 复用 fork 64 child、512 edge、20,000
819
- history item 64 MiB source 安全上限,超限不会发布删除。
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。Windows SFE 在加载通用 application entry
2147
- 通过内嵌 N-API addon 创建不允许 breakaway process-wide strict Job,并让真实 Harness PID
2148
- 自加入;addon 的原生 waiter 监视直接父进程,父进程退出时终止整个 Job。Resource、private
2149
- Executor 与 per-session Agent CLI target 也在各自最早入口自加入独立 nested Job,因此不存在会
2150
- 消费 stdio/IPC 的代理 launcher process;planned rotation 或 crash recovery 终止旧 target,target
2151
- 退出关闭其 Job handle、回收 descendants,再提交 replacement。随机 named Job 只是 locator;当前 PID 的 membership 和
2152
- `KILL_ON_JOB_CLOSE`/无-breakaway flags 必须由原生 verifier 证明,否则启动 fail hard
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
+ launcherplanned 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 使用 process-wide strict Job 提供
2244
- Harness parent-death boundary,并为每个 Executor generation 创建 nested strict Job
2245
- wrapper exit supervisor 观察到新 epoch 前关闭 Job 并回收 stdio MCP。只有 exact-PID
2246
- named Job proof 通过才广告/启用 stdio。这是 trusted local MCP 的生命周期治理,不是
2247
- 恶意 executable sandbox。
2247
+ 的 exact Executor `ChildProcess` 清理。Windows SFE 固化 Bun 1.4 的 `--no-orphans`,
2248
+ Bun 原生 kill-on-close Job Object 提供 parent-death boundaryHarness、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 per-generation nested Job
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:named Job proof、PE architecture、capability gate 和 Executor IPC
2294
- spawn spec 有跨平台 unit/static coverage;真实 nested Job crash/restart、MCP descendant
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.4",
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.111",
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.111",
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/style-guide": "0.0.0",
148
- "@genie/vitest-config": "0.0.0"
147
+ "@genie/vitest-config": "0.0.0",
148
+ "@genie/style-guide": "0.0.0"
149
149
  },
150
150
  "engines": {
151
- "node": ">=22.12 <=24"
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",