@zhushanwen/subagent-core 0.6.0 → 0.7.1

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.
Files changed (278) hide show
  1. package/README.md +1 -1
  2. package/dist/chunk-KXVBIVOU.js +16 -0
  3. package/dist/chunk-T2SYBW3I.js +24 -0
  4. package/dist/chunk-VURUAGMM.js +2305 -0
  5. package/dist/{types-C3fE3R9x.d.cts → engine-discovery-scan-ocpM8FmI.d.cts} +770 -668
  6. package/dist/{types-C3fE3R9x.d.ts → engine-discovery-scan-ocpM8FmI.d.ts} +770 -668
  7. package/dist/execution/engine/engine-discovery-scan.cjs +2210 -0
  8. package/dist/execution/engine/engine-discovery-scan.d.cts +4 -0
  9. package/dist/execution/engine/engine-discovery-scan.d.ts +4 -0
  10. package/dist/execution/engine/engine-discovery-scan.js +20 -0
  11. package/dist/execution/engine/paths.cjs +6 -23
  12. package/dist/execution/engine/paths.d.cts +1 -8
  13. package/dist/execution/engine/paths.d.ts +1 -8
  14. package/dist/execution/engine/paths.js +1 -1
  15. package/dist/execution/relay-env.cjs +12 -28
  16. package/dist/execution/relay-env.d.cts +1 -33
  17. package/dist/execution/relay-env.d.ts +1 -33
  18. package/dist/execution/relay-env.js +5 -3
  19. package/dist/index.cjs +14045 -16059
  20. package/dist/index.d.cts +1035 -1579
  21. package/dist/index.d.ts +1035 -1579
  22. package/dist/index.js +9838 -13800
  23. package/dist.bundle/index.cjs +28875 -30323
  24. package/package.json +20 -26
  25. package/src/__tests__/record-store-last-line.test.ts +16 -7
  26. package/src/core/error-message.ts +7 -6
  27. package/src/core/host-services.ts +8 -2
  28. package/src/core/notify-ports.ts +17 -2
  29. package/src/execution/__tests__/chat-engine-routing.test.ts +62 -28
  30. package/src/execution/__tests__/chat-round-first-round-watchdog.test.ts +255 -0
  31. package/src/execution/__tests__/collect-coordinator-service.test.ts +36 -47
  32. package/src/execution/__tests__/collect-mixed-dispatch.test.ts +20 -53
  33. package/src/execution/__tests__/delivery-methods.test.ts +179 -237
  34. package/src/execution/__tests__/execute-and-await-worktree.test.ts +0 -2
  35. package/src/execution/__tests__/execute-nesting.test.ts +20 -13
  36. package/src/execution/__tests__/explicit-agent-ref-guard.test.ts +20 -33
  37. package/src/execution/__tests__/gc-timer.test.ts +7 -22
  38. package/src/execution/__tests__/get-record-for-action-restart.test.ts +20 -10
  39. package/src/execution/__tests__/helpers/fake-engine-port.ts +187 -0
  40. package/src/execution/__tests__/helpers/spawn-mock.ts +36 -9
  41. package/src/execution/__tests__/helpers/subagent-service-mocks.ts +1 -1
  42. package/src/execution/__tests__/idle-gc.test.ts +200 -0
  43. package/src/execution/__tests__/lifecycle-predicates.test.ts +26 -21
  44. package/src/execution/__tests__/nested-visibility-env-propagation.test.ts +5 -2
  45. package/src/execution/__tests__/reconcile-sweep.test.ts +200 -0
  46. package/src/execution/__tests__/record-store.test.ts +60 -6
  47. package/src/execution/__tests__/recursive-visibility-baseline.test.ts +20 -13
  48. package/src/execution/__tests__/round-supervisor.test.ts +293 -0
  49. package/src/execution/__tests__/session-pending.test.ts +119 -17
  50. package/src/execution/__tests__/stream-sink-retirement.test.ts +10 -10
  51. package/src/execution/__tests__/subagent-service-multiproc-guard.test.ts +1 -11
  52. package/src/execution/__tests__/subagent-service-notify-gate.test.ts +33 -30
  53. package/src/execution/__tests__/subagent-service-parent-guard.test.ts +2 -9
  54. package/src/execution/__tests__/subagent-service-recovery-bounds.test.ts +59 -129
  55. package/src/execution/__tests__/subagent-service.test.ts +2 -2
  56. package/src/execution/__tests__/subprocess-agent-runner-routing.test.ts +109 -7
  57. package/src/execution/__tests__/subprocess-agent-runner.test.ts +108 -36
  58. package/src/execution/__tests__/sync-collect-recovery.test.ts +21 -36
  59. package/src/execution/__tests__/workflow-state-root.test.ts +232 -0
  60. package/src/execution/agent-registry.ts +6 -2
  61. package/src/execution/dialog-queue.ts +6 -73
  62. package/src/execution/engine/__tests__/common/capability-gate.test.ts +115 -15
  63. package/src/execution/engine/__tests__/common/errors.test.ts +11 -18
  64. package/src/execution/engine/__tests__/common/kill-chain.test.ts +7 -0
  65. package/src/execution/engine/__tests__/common/nesting-guard.test.ts +9 -3
  66. package/src/execution/engine/__tests__/common/session-view-service.test.ts +90 -3
  67. package/src/execution/engine/__tests__/conformance/H9-test-disposition.md +116 -0
  68. package/src/execution/engine/__tests__/conformance/__fixtures__/engine-protocol/fake-engine-protocol.mjs +377 -0
  69. package/src/execution/engine/__tests__/conformance/__fixtures__/engine-protocol/recorded.fixture.json +331 -0
  70. package/src/execution/engine/__tests__/conformance/__fixtures__/engine-protocol/smoke-run.fixture.json +213 -0
  71. package/src/execution/engine/__tests__/conformance/chat-round-protocol.test.ts +230 -0
  72. package/src/execution/engine/__tests__/conformance/contract.abort.test.ts +69 -42
  73. package/src/execution/engine/__tests__/conformance/contract.agent-events.test.ts +4 -81
  74. package/src/execution/engine/__tests__/conformance/contract.probe.test.ts +67 -44
  75. package/src/execution/engine/__tests__/conformance/contract.read-degradation.test.ts +81 -54
  76. package/src/execution/engine/__tests__/conformance/engine-conformance.live.test.ts +133 -70
  77. package/src/execution/engine/__tests__/conformance/engine-crash.test.ts +143 -0
  78. package/src/execution/engine/__tests__/conformance/fake-engine-capabilities.ts +19 -0
  79. package/src/execution/engine/__tests__/conformance/golden-replay.pi.test.ts +7 -2
  80. package/src/execution/engine/__tests__/conformance/golden-replay.zcode.test.ts +6 -5
  81. package/src/execution/engine/__tests__/conformance/protocol-blackbox.test.ts +398 -0
  82. package/src/execution/engine/__tests__/conformance/registry-fork-filter.test.ts +221 -0
  83. package/src/execution/engine/__tests__/conformance/round-liveness-supervisor.test.ts +302 -0
  84. package/src/execution/engine/__tests__/conformance/static-spawn-guard.test.ts +58 -0
  85. package/src/execution/engine/__tests__/engine-discovery-scan.test.ts +558 -0
  86. package/src/execution/engine/__tests__/host-task-spec.test.ts +45 -0
  87. package/src/execution/engine/__tests__/model-ref-split.test.ts +74 -0
  88. package/src/execution/engine/__tests__/registry.test.ts +206 -1
  89. package/src/execution/engine/__tests__/routing.test.ts +97 -0
  90. package/src/execution/engine/__tests__/run-failure-worktree-cleanup.test.ts +97 -0
  91. package/src/execution/engine/client/__tests__/__fixtures__/fake-engine.mjs +294 -0
  92. package/src/execution/engine/client/__tests__/engine-client.test.ts +516 -0
  93. package/src/execution/engine/client/__tests__/mirror.test.ts +67 -0
  94. package/src/execution/engine/client/__tests__/pid-file.test.ts +257 -0
  95. package/src/execution/engine/client/__tests__/protocol-closure.test.ts +95 -0
  96. package/src/execution/engine/client/__tests__/remote-engine.test.ts +457 -0
  97. package/src/execution/engine/client/client-options.ts +103 -0
  98. package/src/execution/engine/client/engine-client.ts +687 -0
  99. package/src/execution/engine/client/mirror.ts +167 -0
  100. package/src/execution/engine/client/pid-file.ts +392 -0
  101. package/src/execution/engine/client/reaper.ts +95 -0
  102. package/src/execution/engine/client/remote-engine.ts +441 -0
  103. package/src/execution/engine/client/reverse-router.ts +255 -0
  104. package/src/execution/engine/common/capability-gate.ts +109 -22
  105. package/src/execution/engine/common/errors.ts +9 -25
  106. package/src/execution/engine/common/event-journal.ts +4 -50
  107. package/src/execution/engine/common/journal-replay.ts +3 -1
  108. package/src/execution/engine/common/kill-chain.ts +18 -251
  109. package/src/execution/engine/common/nesting-guard.ts +18 -114
  110. package/src/execution/engine/common/pool-manager.ts +4 -0
  111. package/src/execution/engine/common/session-view-service.ts +56 -84
  112. package/src/execution/engine/config.ts +151 -0
  113. package/src/execution/engine/d8-compat.ts +346 -0
  114. package/src/execution/engine/engine-discovery-roots.ts +107 -0
  115. package/src/execution/engine/engine-discovery-scan.ts +269 -0
  116. package/src/execution/engine/engine-discovery.ts +30 -7
  117. package/src/execution/engine/engine-inspect-package.ts +282 -0
  118. package/src/execution/engine/engine-manifest.ts +244 -0
  119. package/src/execution/engine/host/__tests__/host-askuser-endpoint.test.ts +123 -0
  120. package/src/execution/engine/host/__tests__/host-bridge.test.ts +135 -0
  121. package/src/execution/engine/host/__tests__/spawned-children.test.ts +73 -0
  122. package/src/execution/engine/host/host-bridge.ts +150 -0
  123. package/src/execution/engine/host/host-ui-endpoint.ts +47 -0
  124. package/src/execution/engine/host/pi-host-binding.ts +91 -0
  125. package/src/execution/engine/host/spawned-children.ts +139 -0
  126. package/src/execution/engine/host-task-spec.ts +29 -2
  127. package/src/execution/engine/model-validation.ts +55 -2
  128. package/src/execution/engine/paths.ts +16 -41
  129. package/src/execution/engine/port.ts +48 -2
  130. package/src/execution/engine/registry.ts +153 -34
  131. package/src/execution/engine/routing.ts +225 -52
  132. package/src/execution/engine/types.ts +25 -200
  133. package/src/execution/finalize-record.ts +25 -0
  134. package/src/execution/idle-gc.ts +89 -14
  135. package/src/execution/lifecycle-manager.ts +10 -7
  136. package/src/execution/lifecycle-predicates.ts +10 -8
  137. package/src/execution/record-store.ts +29 -2
  138. package/src/execution/relay-env.ts +19 -36
  139. package/src/execution/round-supervisor/domain.ts +89 -0
  140. package/src/execution/round-supervisor/index.ts +33 -0
  141. package/src/execution/round-supervisor/notify-accounting.ts +87 -0
  142. package/src/execution/round-supervisor/reconcile-sweep.ts +235 -0
  143. package/src/execution/round-supervisor/service-binding.test.ts +661 -0
  144. package/src/execution/round-supervisor/service-binding.ts +273 -0
  145. package/src/execution/round-supervisor/supervisor.ts +426 -0
  146. package/src/execution/session-pending.ts +68 -74
  147. package/src/execution/settled-watchdog.ts +39 -0
  148. package/src/execution/subagent-service.ts +746 -400
  149. package/src/execution/subprocess-agent-runner.ts +16 -8
  150. package/src/execution/types.ts +41 -117
  151. package/src/execution/ui-channels.ts +13 -214
  152. package/src/execution/ui-request-handler-factory.ts +7 -4
  153. package/src/execution/ui-request-observability.ts +2 -2
  154. package/src/execution/workflow-state-root.ts +67 -0
  155. package/src/execution/worktree-git-ops.ts +5 -0
  156. package/src/execution/worktree-manager.ts +11 -1
  157. package/src/index.ts +55 -26
  158. package/src/orchestration/__tests__/execute-agent-call.test.ts +1 -1
  159. package/src/orchestration/execute-agent-call.ts +1 -1
  160. package/src/orchestration/file-run-store.ts +144 -59
  161. package/src/orchestration/models/types.ts +43 -42
  162. package/src/shared/zcode-model-ref.ts +31 -0
  163. package/dist/chunk-43ONBFZX.js +0 -240
  164. package/dist/chunk-A4IVZWVX.js +0 -31
  165. package/dist/chunk-APZY4IME.js +0 -27
  166. package/dist/chunk-V3VHZ2VX.js +0 -59
  167. package/dist/execution/engine/engines/zcode/constants.cjs +0 -107
  168. package/dist/execution/engine/engines/zcode/constants.d.cts +0 -135
  169. package/dist/execution/engine/engines/zcode/constants.d.ts +0 -135
  170. package/dist/execution/engine/engines/zcode/constants.js +0 -54
  171. package/dist/execution/engine/engines/zcode/reader.cjs +0 -276
  172. package/dist/execution/engine/engines/zcode/reader.d.cts +0 -21
  173. package/dist/execution/engine/engines/zcode/reader.d.ts +0 -21
  174. package/dist/execution/engine/engines/zcode/reader.js +0 -9
  175. package/src/__tests__/append-system-prompt-assembly.test.ts +0 -243
  176. package/src/__tests__/fr4-get-state-handshake.test.ts +0 -125
  177. package/src/__tests__/session-runner.test.ts +0 -69
  178. package/src/execution/__tests__/ask-user-transit-e2e.test.ts +0 -490
  179. package/src/execution/__tests__/chatmode-first-round-closure-spawn.test.ts +0 -191
  180. package/src/execution/__tests__/descendant-sweep-guards.test.ts +0 -220
  181. package/src/execution/__tests__/descendant-sweep.test.ts +0 -269
  182. package/src/execution/__tests__/engine-model-validation.test.ts +0 -741
  183. package/src/execution/__tests__/epipe-fallback.test.ts +0 -248
  184. package/src/execution/__tests__/execution-runtime-face.test.ts +0 -272
  185. package/src/execution/__tests__/get-state-handshake.test.ts +0 -127
  186. package/src/execution/__tests__/helpers/session-runner-mocks.ts +0 -113
  187. package/src/execution/__tests__/keep-alive-no-progress.test.ts +0 -280
  188. package/src/execution/__tests__/kill-all-escalation.test.ts +0 -196
  189. package/src/execution/__tests__/max-turns-to-watchdog-ms.test.ts +0 -113
  190. package/src/execution/__tests__/output-collector.test.ts +0 -469
  191. package/src/execution/__tests__/pi-invocation.test.ts +0 -166
  192. package/src/execution/__tests__/recursive-visibility-env.test.ts +0 -149
  193. package/src/execution/__tests__/rpc-mode.test.ts +0 -89
  194. package/src/execution/__tests__/run-and-finalize-anchoring.test.ts +0 -387
  195. package/src/execution/__tests__/run-and-finalize-chatmode.test.ts +0 -277
  196. package/src/execution/__tests__/run-spawn-chatmode-settled.test.ts +0 -254
  197. package/src/execution/__tests__/run-spawn-edges.test.ts +0 -1079
  198. package/src/execution/__tests__/run-spawn-integration.test.ts +0 -933
  199. package/src/execution/__tests__/run-spawn-resume.test.ts +0 -322
  200. package/src/execution/__tests__/run-spawn-rpc-mode.test.ts +0 -196
  201. package/src/execution/__tests__/run-spawn-stdout-callback-throw.test.ts +0 -207
  202. package/src/execution/__tests__/service-kill-escalation.test.ts +0 -91
  203. package/src/execution/__tests__/session-runner-branch-cache-lru.test.ts +0 -110
  204. package/src/execution/__tests__/session-runner-close-prune.test.ts +0 -181
  205. package/src/execution/__tests__/session-runner-dispatch.test.ts +0 -489
  206. package/src/execution/__tests__/session-runner-epipe.test.ts +0 -179
  207. package/src/execution/__tests__/session-runner-heartbeat-idle-fallback.test.ts +0 -227
  208. package/src/execution/__tests__/session-runner-lifecycle-helpers.test.ts +0 -290
  209. package/src/execution/__tests__/session-runner-schema-env.test.ts +0 -352
  210. package/src/execution/__tests__/settled-watchdog.test.ts +0 -524
  211. package/src/execution/__tests__/spawn-args.test.ts +0 -446
  212. package/src/execution/__tests__/spawn-event-adapter-rpc.test.ts +0 -192
  213. package/src/execution/__tests__/spawn-event-adapter.test.ts +0 -167
  214. package/src/execution/__tests__/spawn-worktree-guidance.test.ts +0 -208
  215. package/src/execution/__tests__/spawned-children.test.ts +0 -236
  216. package/src/execution/__tests__/start-sync-model-guard.test.ts +0 -150
  217. package/src/execution/__tests__/stdin-writer.test.ts +0 -464
  218. package/src/execution/__tests__/subagent-service-message-close.test.ts +0 -693
  219. package/src/execution/__tests__/temp-prompt.test.ts +0 -53
  220. package/src/execution/__tests__/timeout-integration.test.ts +0 -616
  221. package/src/execution/__tests__/turn-limiter-semantics.test.ts +0 -194
  222. package/src/execution/__tests__/turn-limiter.test.ts +0 -65
  223. package/src/execution/__tests__/ui-request-handler.test.ts +0 -205
  224. package/src/execution/__tests__/ui-request-queue.test.ts +0 -298
  225. package/src/execution/__tests__/worktree-pid-registration.integration.test.ts +0 -230
  226. package/src/execution/engine/__tests__/common/schema-emulation.test.ts +0 -128
  227. package/src/execution/engine/__tests__/common/session-view-service-zcode-dbpath.test.ts +0 -149
  228. package/src/execution/engine/__tests__/conformance/__fixtures__/pi-golden-events.json +0 -28
  229. package/src/execution/engine/__tests__/conformance/zcode-appserver-harness.ts +0 -128
  230. package/src/execution/engine/__tests__/paths.test.ts +0 -39
  231. package/src/execution/engine/common/schema-emulation.ts +0 -189
  232. package/src/execution/engine/common/session-view-projection.ts +0 -51
  233. package/src/execution/engine/engines/pi/__tests__/pi-engine.test.ts +0 -615
  234. package/src/execution/engine/engines/pi/__tests__/reader.test.ts +0 -155
  235. package/src/execution/engine/engines/pi/__tests__/spawn-opts-direct.test.ts +0 -257
  236. package/src/execution/engine/engines/pi/argv-mirror.ts +0 -135
  237. package/src/execution/engine/engines/pi/get-state-handshake.ts +0 -179
  238. package/src/execution/engine/engines/pi/output-collector.ts +0 -317
  239. package/src/execution/engine/engines/pi/pi-engine.ts +0 -811
  240. package/src/execution/engine/engines/pi/pi-invocation.ts +0 -120
  241. package/src/execution/engine/engines/pi/reader.ts +0 -59
  242. package/src/execution/engine/engines/pi/registration.ts +0 -37
  243. package/src/execution/engine/engines/pi/session-runner.ts +0 -2840
  244. package/src/execution/engine/engines/pi/spawn-event-adapter.ts +0 -404
  245. package/src/execution/engine/engines/pi/stdin-writer.ts +0 -199
  246. package/src/execution/engine/engines/pi/temp-prompt.ts +0 -62
  247. package/src/execution/engine/engines/pi/turn-limiter.ts +0 -102
  248. package/src/execution/engine/engines/zcode/__tests__/__fixtures__/fake-appserver.mjs +0 -301
  249. package/src/execution/engine/engines/zcode/__tests__/__fixtures__/zcode-golden-appserver.json +0 -36
  250. package/src/execution/engine/engines/zcode/__tests__/appserver-launcher.test.ts +0 -321
  251. package/src/execution/engine/engines/zcode/__tests__/connection.test.ts +0 -473
  252. package/src/execution/engine/engines/zcode/__tests__/parser.test.ts +0 -43
  253. package/src/execution/engine/engines/zcode/__tests__/preparer.test.ts +0 -124
  254. package/src/execution/engine/engines/zcode/__tests__/reader.test.ts +0 -210
  255. package/src/execution/engine/engines/zcode/__tests__/registration.test.ts +0 -71
  256. package/src/execution/engine/engines/zcode/__tests__/session-channel-dispose-harvest.test.ts +0 -247
  257. package/src/execution/engine/engines/zcode/__tests__/session-channel-turn-timers.test.ts +0 -451
  258. package/src/execution/engine/engines/zcode/__tests__/session-channel.test.ts +0 -792
  259. package/src/execution/engine/engines/zcode/__tests__/zcode-engine-appserver.test.ts +0 -782
  260. package/src/execution/engine/engines/zcode/__tests__/zcode-engine-degrade.test.ts +0 -168
  261. package/src/execution/engine/engines/zcode/__tests__/zcode-engine-dispose.test.ts +0 -210
  262. package/src/execution/engine/engines/zcode/__tests__/zcode-engine-retry.test.ts +0 -353
  263. package/src/execution/engine/engines/zcode/__tests__/zcode-engine-status.test.ts +0 -282
  264. package/src/execution/engine/engines/zcode/__tests__/zcode-engine-timeout.test.ts +0 -372
  265. package/src/execution/engine/engines/zcode/__tests__/zcode-engine.live.test.ts +0 -145
  266. package/src/execution/engine/engines/zcode/appserver-launcher.ts +0 -167
  267. package/src/execution/engine/engines/zcode/connection.ts +0 -598
  268. package/src/execution/engine/engines/zcode/constants.ts +0 -176
  269. package/src/execution/engine/engines/zcode/golden-sample.ts +0 -47
  270. package/src/execution/engine/engines/zcode/parser.ts +0 -102
  271. package/src/execution/engine/engines/zcode/preparer.ts +0 -235
  272. package/src/execution/engine/engines/zcode/reader.ts +0 -381
  273. package/src/execution/engine/engines/zcode/registration.ts +0 -37
  274. package/src/execution/engine/engines/zcode/session-channel.ts +0 -968
  275. package/src/execution/engine/engines/zcode/zcode-engine.ts +0 -1431
  276. package/src/execution/round-settlement.ts +0 -93
  277. package/src/execution/ui-request-queue.ts +0 -215
  278. package/src/shared/schema-env.ts +0 -44
@@ -0,0 +1,273 @@
1
+ // src/execution/round-supervisor/service-binding.ts
2
+ //
3
+ // [W4] SubagentService 与轮次活性监督器 / 注册对账 sweep 的装配绑定面。
4
+ //
5
+ // 从 subagent-service.ts 抽出(max-lines 纪律——监督器 deps 装配 + giveUp 编排 +
6
+ // sweep 挂点是纯绑定代码,内聚为一个文件;机制与语义注释见 supervisor.ts /
7
+ // reconcile-sweep.ts / domain.ts)。变化轴:改监督器通知文案 / giveUp 终态化编排 /
8
+ // sweep 的 store 读侧判据,只动本文件。
9
+ //
10
+ // 全部依赖经 RoundSupervisorBinding 惰性闭包注入(session 级状态运行时可变——
11
+ // 对齐 notify-host.ts createNotifyHost 的 deps 惰性求值先例)。
12
+
13
+ import { bestEffort } from "../best-effort.ts";
14
+ import { COLD_LOOKUP_SCAN_LIMIT } from "../cold-resurrect.ts";
15
+ import { tryTransition } from "../execution-record.ts";
16
+ import { writeFinalized } from "../finalized-marker.ts";
17
+ import { hasLiveProcessHandle } from "../lifecycle-predicates.ts";
18
+ import { FileRunStore } from "../../orchestration/file-run-store.ts";
19
+ import { resolvePiWorkflowStateDir } from "../workflow-state-root.ts";
20
+ import type { PiLike } from "../notify-host.ts";
21
+ import type { RecordStore } from "../record-store.ts";
22
+ import type { AgentResult, ExecutionRecord } from "../types.ts";
23
+ import {
24
+ RoundSupervisor,
25
+ runReconcileSweep,
26
+ type GiveUpKind,
27
+ type SupervisorCandidateRecord,
28
+ type SupervisorRecordView,
29
+ } from "./index.ts";
30
+
31
+ /** 绑定面(SubagentService 供给;全部惰性——见文件头注)。 */
32
+ export interface RoundSupervisorBinding {
33
+ getStore(): RecordStore;
34
+ getPi(): PiLike | null;
35
+ /** 所属根 session id(候选过滤;未初始化时 null)。 */
36
+ getSessionRootId(): string | null;
37
+ /** 主 session 文件(sweep 差集输入源;未 flush/未知时 undefined = 空跑)。 */
38
+ getMainSessionFile(): string | undefined;
39
+ /**
40
+ * record 终态化委托(service.finalizeRecord——注销合法发射点①的宿主路径)。
41
+ * 监督器 giveUp 的内存 record 分支消费;CAS 防双收尾由本文件 giveUp 先 tryTransition。
42
+ */
43
+ finalizeClosed(record: ExecutionRecord, result: AgentResult): Promise<void>;
44
+ }
45
+
46
+ /** 监督器通知出口(决策指引 / 终止 / 替代通知统一走 steer——唤醒主 agent 的注意力
47
+ * 而非自动复活任务;pi 缺席(dispose 后)静默丢弃,对齐 notify-host 语义)。 */
48
+ function supervisorNotify(binding: RoundSupervisorBinding, content: string): void {
49
+ binding.getPi()?.sendMessage(
50
+ { customType: "subagent-round-supervisor", content, display: false },
51
+ { deliverAs: "steer" },
52
+ );
53
+ }
54
+
55
+ /** record 视图(内存 getMutable 优先,磁盘 findLightById 兜底——boot 重认领面对的
56
+ * 存量 record 只在磁盘:重启后内存 records Map 为空)。 */
57
+ function supervisorRecordView(binding: RoundSupervisorBinding, id: string): SupervisorRecordView | undefined {
58
+ const memory = binding.getStore().getMutable(id);
59
+ if (memory !== undefined) {
60
+ return {
61
+ id: memory.id,
62
+ status: memory.status === "closed" ? "closed" : "running",
63
+ resumable: memory.resumable === true,
64
+ hasResult: memory.result !== undefined,
65
+ chatMode: memory.chatMode === true,
66
+ rootSessionId: memory.rootSessionId,
67
+ agent: memory.agent,
68
+ slug: memory.slug,
69
+ startedAt: memory.startedAt,
70
+ closedReason: memory.closedReason,
71
+ };
72
+ }
73
+ const disk = binding.getStore().findLightById(id);
74
+ if (disk === undefined) return undefined;
75
+ return {
76
+ id: disk.id,
77
+ status: disk.status === "closed" ? "closed" : "running",
78
+ resumable: disk.resumable === true,
79
+ hasResult: disk.result !== undefined,
80
+ chatMode: disk.chatMode === true,
81
+ rootSessionId: disk.rootSessionId,
82
+ agent: disk.agent,
83
+ slug: disk.slug,
84
+ startedAt: disk.startedAt,
85
+ closedReason: disk.closedReason,
86
+ };
87
+ }
88
+
89
+ /** 本 root session 的 running record 候选(内存 ∪ 磁盘重建投影)。 */
90
+ function supervisorCandidates(binding: RoundSupervisorBinding): SupervisorCandidateRecord[] {
91
+ const rootFilter = binding.getSessionRootId() ?? undefined;
92
+ return binding
93
+ .getStore()
94
+ .collectRecords(COLD_LOOKUP_SCAN_LIMIT, "running", rootFilter)
95
+ .map((r) => ({
96
+ id: r.id,
97
+ rootSessionId: r.rootSessionId,
98
+ agent: r.agent,
99
+ slug: r.slug,
100
+ startedAt: r.startedAt,
101
+ }));
102
+ }
103
+
104
+ /**
105
+ * 监督器「该放弃 / superseded」执行(RoundSupervisorDeps.giveUp)。
106
+ * 形态分流:
107
+ * - 内存 record:CAS tryTransition → finalizeClosed(终态化 + 注销①发射 + worktree/
108
+ * manifest 收尾)——watchdog-expired 额外发终止通知(此时可重派);superseded 的
109
+ * 替代通知已由监督器先行发出。boot 直断不经本函数(孤儿恢复层直断 + in-flight
110
+ * 的重启中断 error 语义由 finalizeOrphanRecord 落位,见 supervisor.bootPartition 头注)。
111
+ * - 磁盘态(内存无 + findLightById 命中,boot 重认领后看门狗到期的形态):终态
112
+ * entry 落盘(reportSubagentRecord)+ finalized sidecar(best-effort,对齐孤儿
113
+ * 恢复形态)——不走 finalizeRecord(无内存 record,archive/CAS 不适用),其注销
114
+ * 由对账 sweep(发射点⑤「record 终态 → 差集补发」)收口。
115
+ */
116
+ async function supervisorGiveUp(
117
+ binding: RoundSupervisorBinding,
118
+ recordId: string,
119
+ kind: GiveUpKind,
120
+ detail: { replacementId?: string },
121
+ ): Promise<void> {
122
+ const store = binding.getStore();
123
+ const memory = store.getMutable(recordId);
124
+ const errorText =
125
+ kind === "watchdog-expired"
126
+ ? "round supervisor: decision watchdog expired (guidance unanswered, no convergence) — task terminated; safe to re-dispatch"
127
+ : `round supervisor: superseded by replacement task ${detail.replacementId ?? "(unknown)"}`;
128
+ if (memory !== undefined) {
129
+ const failedResult: AgentResult = {
130
+ text: "",
131
+ turns: memory.turnCount,
132
+ durationMs: Date.now() - memory.startedAt,
133
+ success: false,
134
+ error: errorText,
135
+ sessionId: memory.id,
136
+ toolCalls: [],
137
+ };
138
+ // CAS 抢锁防与 cancel/dispose 双收尾;抢锁失败 = 对方已终态化,收尾跳过。
139
+ if (!tryTransitionClosed(memory)) return;
140
+ try {
141
+ await binding.finalizeClosed(memory, failedResult);
142
+ } catch (err) {
143
+ bestEffort(err, `round supervisor give-up finalize (${recordId})`, "error");
144
+ }
145
+ if (kind === "watchdog-expired") {
146
+ const view = supervisorRecordView(binding, recordId);
147
+ if (view !== undefined) {
148
+ supervisorNotify(
149
+ binding,
150
+ `Subagent "${view.agent}" (${view.slug || recordId}) was terminated after the decision watchdog ` +
151
+ `expired without your decision. It is now closed — you can safely re-dispatch the task if still needed.`,
152
+ );
153
+ }
154
+ }
155
+ return;
156
+ }
157
+ // 磁盘态分支(boot 重认领后的放弃——record 不在内存)。
158
+ const disk = store.findLightById(recordId);
159
+ if (disk === undefined) return;
160
+ if (disk.sessionFile) {
161
+ try {
162
+ writeFinalized(disk.sessionFile, "gc");
163
+ } catch (err) {
164
+ bestEffort(err, `round supervisor give-up sidecar (${recordId})`);
165
+ }
166
+ }
167
+ try {
168
+ store.reportSubagentRecord({
169
+ ...disk,
170
+ status: "closed",
171
+ closedReason: "gc",
172
+ endedAt: Date.now(),
173
+ error: errorText,
174
+ });
175
+ } catch (err) {
176
+ bestEffort(err, `round supervisor give-up entry (${recordId})`, "error");
177
+ }
178
+ }
179
+
180
+ /** tryTransition closed+gc 的本地命名(CAS 语义见 execution-record.ts)。 */
181
+ function tryTransitionClosed(record: ExecutionRecord): boolean {
182
+ return tryTransition(record, "closed", "gc");
183
+ }
184
+
185
+ /** 装配监督器实例(SubagentService.roundSupervisor 字段的工厂)。 */
186
+ export function createRoundSupervisorForService(binding: RoundSupervisorBinding): RoundSupervisor {
187
+ return new RoundSupervisor({
188
+ now: () => Date.now(),
189
+ getRecordView: (id) => supervisorRecordView(binding, id),
190
+ listCandidateRecords: () => supervisorCandidates(binding),
191
+ hasLiveProcess: (recordId) => hasLiveProcessHandle(recordId),
192
+ sendMergedFailureNotice: (view, errMsg) =>
193
+ supervisorNotify(
194
+ binding,
195
+ `Subagent "${view.agent}" (${view.slug || view.id}) failed: the engine/child process driving it died ` +
196
+ `(${errMsg}). The task is NOT completed and stays resumable — this supervisor has taken over and will ` +
197
+ `deliver a resume/re-dispatch guidance shortly. Do NOT re-dispatch this task before that guidance arrives.`,
198
+ ),
199
+ sendDecisionGuidance: (view, opts) =>
200
+ supervisorNotify(
201
+ binding,
202
+ `Subagent "${view.agent}" (${view.slug || view.id}, id=${view.id}) died mid-task and stays resumable. ` +
203
+ `Decide now: resume it by sending a message to id=${view.id}, or re-dispatch a replacement task. ` +
204
+ `If you take no action it will be terminated automatically when the decision watchdog expires.` +
205
+ (opts.exemptionDisclaimer
206
+ ? ` If you have already re-dispatched or no longer need this task, ignore this guidance; ` +
207
+ `the original task will be terminated automatically when the watchdog expires.`
208
+ : ""),
209
+ ),
210
+ sendReplacedNotice: (view, replacementId) =>
211
+ supervisorNotify(
212
+ binding,
213
+ `Subagent "${view.agent}" (${view.slug || view.id}, id=${view.id}) was already replaced by your new ` +
214
+ `task ${replacementId} (same agent/slug started within the watchdog window). The original record is ` +
215
+ `being terminated; no resume is needed.`,
216
+ ),
217
+ giveUp: (recordId, kind, detail) => void supervisorGiveUp(binding, recordId, kind, detail),
218
+ });
219
+ }
220
+
221
+ /**
222
+ * [W4] 注册对账 sweep(发射点枚举⑤):对「本 session register entry × 对应
223
+ * record/run ∈ 终态集 ∪ 已归档/不存在」差集补发 unregister——appendEntry 权威落盘 +
224
+ * 尽力 emit(写法论证见 reconcile-sweep.ts 头注)。[F2] 判据按类型分流:subagent 走
225
+ * RecordStore,workflow/畸形走 FileRunStore(findStateByIdSync),bash 无收口通道
226
+ * 保守跳过(显式偏差 impl-plan §5)。触发点 = initSession(session
227
+ * reattach / session_start / 监督器启动三时机的承载点,根进程 only——与孤儿恢复
228
+ * 同一单扫描者判据,isChildProcess 由调用方传)。与 registry rebuild 的先后时序
229
+ * 不作保证,残余窗口由下次 session_start 收口(设计明示容忍)。
230
+ */
231
+ export function runPendingReconcileSweepForService(binding: RoundSupervisorBinding, isChildProcess: boolean): void {
232
+ if (isChildProcess) return;
233
+ try {
234
+ // [F2] workflow run 判据供给:FileRunStore 构造轻量(无 IO 副作用,lastSavedAt
235
+ // 空 Map——findStateByIdSync 同步只读不触碰节流记账),sweep 挂点低频
236
+ // (initSession),每轮构造一次闭包持有。
237
+ // [F-1 修复] stateDir 必须与 pi 壳 JsonlRunStore 的落盘布局同源
238
+ //(<sessionDir>/workflow-state/,推导 = resolvePiWorkflowStateDir);缺省根
239
+ // <dataRoot>/workflow-state 是 zcode 宿主布局,与 pi 生产落盘不相交——曾致
240
+ // findStateByIdSync 恒 missing → sweep 按终态补注销活跃 run(W4 引入的装配错位)。
241
+ const workflowStore = new FileRunStore({ stateDir: resolvePiWorkflowStateDir() });
242
+ runReconcileSweep({
243
+ sessionFile: binding.getMainSessionFile(),
244
+ lookupRecordState: (id) => {
245
+ const memory = binding.getStore().getMutable(id);
246
+ if (memory !== undefined) {
247
+ return memory.status === "closed"
248
+ ? { terminal: true, closedReason: memory.closedReason }
249
+ : "active";
250
+ }
251
+ const disk = binding.getStore().findLightById(id);
252
+ if (disk === undefined) return "missing";
253
+ return disk.status === "closed"
254
+ ? { terminal: true, closedReason: disk.closedReason }
255
+ : "active";
256
+ },
257
+ // [F2] type=workflow 及畸形条目的收口判据(设计 D2 sweep 判据补全——
258
+ // 「终态集 ∪ 已归档/不存在」对 workflow run 同样成立)。running 映射 active
259
+ // (含全行损坏的保守形态);done → terminal(reason 即 DoneReason,经
260
+ // closedReasonToPendingReason 未知值兜底);文件缺失 → missing。
261
+ lookupWorkflowRunState: (runId) => {
262
+ const state = workflowStore.findStateByIdSync(runId);
263
+ if (state.kind === "missing") return "missing";
264
+ if (state.kind === "terminal") return { terminal: true, closedReason: state.reason };
265
+ return "active";
266
+ },
267
+ appendEntry: (customType, data) => binding.getPi()?.appendEntry(customType, data),
268
+ emit: (channel, data) => binding.getPi()?.events.emit(channel, data),
269
+ });
270
+ } catch (err) {
271
+ bestEffort(err, "pending reconcile sweep", "error");
272
+ }
273
+ }