@zhushanwen/subagent-core 0.5.1 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (318) 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-Dv4QhSJ_.d.cts → engine-discovery-scan-ocpM8FmI.d.cts} +835 -668
  6. package/dist/{types-Dv4QhSJ_.d.ts → engine-discovery-scan-ocpM8FmI.d.ts} +835 -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 +14123 -15467
  20. package/dist/index.d.cts +1179 -1540
  21. package/dist/index.d.ts +1179 -1540
  22. package/dist/index.js +7694 -10986
  23. package/dist.bundle/index.cjs +33485 -0
  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__/agent-registry.test.ts +1 -1
  30. package/src/execution/__tests__/alive-store.test.ts +1 -1
  31. package/src/execution/__tests__/chat-engine-routing.test.ts +62 -28
  32. package/src/execution/__tests__/chat-round-first-round-watchdog.test.ts +255 -0
  33. package/src/execution/__tests__/collect-budget.test.ts +291 -0
  34. package/src/execution/__tests__/collect-coordinator-service.test.ts +316 -0
  35. package/src/execution/__tests__/collect-coordinator.test.ts +371 -0
  36. package/src/execution/__tests__/collect-mixed-dispatch.test.ts +229 -0
  37. package/src/execution/__tests__/config-collect-sync.test.ts +120 -0
  38. package/src/execution/__tests__/config.test.ts +1 -1
  39. package/src/execution/__tests__/delivery-methods.test.ts +179 -237
  40. package/src/execution/__tests__/execute-and-await-worktree.test.ts +0 -2
  41. package/src/execution/__tests__/execute-nesting.test.ts +20 -13
  42. package/src/execution/__tests__/explicit-agent-ref-guard.test.ts +21 -34
  43. package/src/execution/__tests__/finalized-marker.test.ts +1 -1
  44. package/src/execution/__tests__/gc-timer.test.ts +8 -23
  45. package/src/execution/__tests__/get-record-for-action-restart.test.ts +20 -10
  46. package/src/execution/__tests__/helpers/fake-engine-port.ts +187 -0
  47. package/src/execution/__tests__/helpers/spawn-mock.ts +36 -9
  48. package/src/execution/__tests__/helpers/subagent-service-mocks.ts +1 -1
  49. package/src/execution/__tests__/idle-gc.test.ts +200 -0
  50. package/src/execution/__tests__/lifecycle-predicates.test.ts +26 -21
  51. package/src/execution/__tests__/manifest-store-tmp-recovery.test.ts +1 -1
  52. package/src/execution/__tests__/nested-visibility-env-propagation.test.ts +5 -2
  53. package/src/execution/__tests__/notify-batch.test.ts +500 -0
  54. package/src/execution/__tests__/notify-ledger.test.ts +27 -0
  55. package/src/execution/__tests__/reconcile-sweep.test.ts +200 -0
  56. package/src/execution/__tests__/record-entry-collect.test.ts +102 -0
  57. package/src/execution/__tests__/record-store.test.ts +60 -6
  58. package/src/execution/__tests__/recursive-visibility-baseline.test.ts +20 -13
  59. package/src/execution/__tests__/relay-env.test.ts +12 -1
  60. package/src/execution/__tests__/round-supervisor.test.ts +293 -0
  61. package/src/execution/__tests__/session-file-gc.test.ts +1 -1
  62. package/src/execution/__tests__/session-pending.test.ts +119 -17
  63. package/src/execution/__tests__/start-collect-guard.test.ts +255 -0
  64. package/src/execution/__tests__/stream-sink-retirement.test.ts +10 -10
  65. package/src/execution/__tests__/subagent-actions-core.test.ts +6 -0
  66. package/src/execution/__tests__/subagent-service-multiproc-guard.test.ts +14 -11
  67. package/src/execution/__tests__/subagent-service-notify-gate.test.ts +33 -30
  68. package/src/execution/__tests__/subagent-service-parent-guard.test.ts +2 -9
  69. package/src/execution/__tests__/subagent-service-recovery-bounds.test.ts +59 -129
  70. package/src/execution/__tests__/subagent-service.test.ts +2 -2
  71. package/src/execution/__tests__/subprocess-agent-runner-routing.test.ts +109 -7
  72. package/src/execution/__tests__/subprocess-agent-runner.test.ts +108 -36
  73. package/src/execution/__tests__/sync-collect-recovery.test.ts +1102 -0
  74. package/src/execution/__tests__/tombstone-store.test.ts +1 -1
  75. package/src/execution/__tests__/workflow-state-root.test.ts +232 -0
  76. package/src/execution/__tests__/worktree-git-ops.test.ts +1 -1
  77. package/src/execution/__tests__/worktree-reconcile-aging.test.ts +2 -2
  78. package/src/execution/__tests__/worktree-reconcile.integration.test.ts +1 -1
  79. package/src/execution/__tests__/worktree-registry.test.ts +1 -1
  80. package/src/execution/agent-registry.ts +6 -2
  81. package/src/execution/collect-coordinator.ts +200 -0
  82. package/src/execution/config.ts +77 -5
  83. package/src/execution/dialog-queue.ts +6 -73
  84. package/src/execution/engine/__tests__/common/capability-gate.test.ts +115 -15
  85. package/src/execution/engine/__tests__/common/errors.test.ts +11 -18
  86. package/src/execution/engine/__tests__/common/event-journal.test.ts +1 -1
  87. package/src/execution/engine/__tests__/common/kill-chain.test.ts +7 -0
  88. package/src/execution/engine/__tests__/common/nesting-guard.test.ts +9 -3
  89. package/src/execution/engine/__tests__/common/pool-manager.test.ts +2 -2
  90. package/src/execution/engine/__tests__/common/session-view-service.test.ts +90 -3
  91. package/src/execution/engine/__tests__/conformance/H9-test-disposition.md +116 -0
  92. package/src/execution/engine/__tests__/conformance/__fixtures__/engine-protocol/fake-engine-protocol.mjs +377 -0
  93. package/src/execution/engine/__tests__/conformance/__fixtures__/engine-protocol/recorded.fixture.json +331 -0
  94. package/src/execution/engine/__tests__/conformance/__fixtures__/engine-protocol/smoke-run.fixture.json +213 -0
  95. package/src/execution/engine/__tests__/conformance/chat-round-protocol.test.ts +230 -0
  96. package/src/execution/engine/__tests__/conformance/contract.abort.test.ts +69 -42
  97. package/src/execution/engine/__tests__/conformance/contract.agent-events.test.ts +4 -81
  98. package/src/execution/engine/__tests__/conformance/contract.probe.test.ts +67 -44
  99. package/src/execution/engine/__tests__/conformance/contract.read-degradation.test.ts +82 -55
  100. package/src/execution/engine/__tests__/conformance/engine-conformance.live.test.ts +133 -70
  101. package/src/execution/engine/__tests__/conformance/engine-crash.test.ts +143 -0
  102. package/src/execution/engine/__tests__/conformance/fake-engine-capabilities.ts +19 -0
  103. package/src/execution/engine/__tests__/conformance/golden-replay.pi.test.ts +8 -3
  104. package/src/execution/engine/__tests__/conformance/golden-replay.zcode.test.ts +6 -5
  105. package/src/execution/engine/__tests__/conformance/protocol-blackbox.test.ts +398 -0
  106. package/src/execution/engine/__tests__/conformance/registry-fork-filter.test.ts +221 -0
  107. package/src/execution/engine/__tests__/conformance/round-liveness-supervisor.test.ts +302 -0
  108. package/src/execution/engine/__tests__/conformance/static-spawn-guard.test.ts +58 -0
  109. package/src/execution/engine/__tests__/engine-discovery-scan.test.ts +558 -0
  110. package/src/execution/engine/__tests__/host-task-spec.test.ts +45 -0
  111. package/src/execution/engine/__tests__/model-ref-split.test.ts +74 -0
  112. package/src/execution/engine/__tests__/registry.test.ts +206 -1
  113. package/src/execution/engine/__tests__/routing.test.ts +97 -0
  114. package/src/execution/engine/__tests__/run-failure-worktree-cleanup.test.ts +97 -0
  115. package/src/execution/engine/client/__tests__/__fixtures__/fake-engine.mjs +294 -0
  116. package/src/execution/engine/client/__tests__/engine-client.test.ts +516 -0
  117. package/src/execution/engine/client/__tests__/mirror.test.ts +67 -0
  118. package/src/execution/engine/client/__tests__/pid-file.test.ts +257 -0
  119. package/src/execution/engine/client/__tests__/protocol-closure.test.ts +95 -0
  120. package/src/execution/engine/client/__tests__/remote-engine.test.ts +457 -0
  121. package/src/execution/engine/client/client-options.ts +103 -0
  122. package/src/execution/engine/client/engine-client.ts +687 -0
  123. package/src/execution/engine/client/mirror.ts +167 -0
  124. package/src/execution/engine/client/pid-file.ts +392 -0
  125. package/src/execution/engine/client/reaper.ts +95 -0
  126. package/src/execution/engine/client/remote-engine.ts +441 -0
  127. package/src/execution/engine/client/reverse-router.ts +255 -0
  128. package/src/execution/engine/common/capability-gate.ts +109 -22
  129. package/src/execution/engine/common/errors.ts +9 -25
  130. package/src/execution/engine/common/event-journal.ts +4 -50
  131. package/src/execution/engine/common/journal-replay.ts +3 -1
  132. package/src/execution/engine/common/kill-chain.ts +18 -251
  133. package/src/execution/engine/common/nesting-guard.ts +18 -114
  134. package/src/execution/engine/common/pool-manager.ts +4 -0
  135. package/src/execution/engine/common/session-view-service.ts +56 -84
  136. package/src/execution/engine/config.ts +151 -0
  137. package/src/execution/engine/d8-compat.ts +346 -0
  138. package/src/execution/engine/engine-discovery-roots.ts +107 -0
  139. package/src/execution/engine/engine-discovery-scan.ts +269 -0
  140. package/src/execution/engine/engine-discovery.ts +30 -7
  141. package/src/execution/engine/engine-inspect-package.ts +282 -0
  142. package/src/execution/engine/engine-manifest.ts +244 -0
  143. package/src/execution/engine/host/__tests__/host-askuser-endpoint.test.ts +123 -0
  144. package/src/execution/engine/host/__tests__/host-bridge.test.ts +135 -0
  145. package/src/execution/engine/host/__tests__/spawned-children.test.ts +73 -0
  146. package/src/execution/engine/host/host-bridge.ts +150 -0
  147. package/src/execution/engine/host/host-ui-endpoint.ts +47 -0
  148. package/src/execution/engine/host/pi-host-binding.ts +91 -0
  149. package/src/execution/engine/host/spawned-children.ts +139 -0
  150. package/src/execution/engine/host-task-spec.ts +29 -2
  151. package/src/execution/engine/model-validation.ts +55 -2
  152. package/src/execution/engine/paths.ts +16 -41
  153. package/src/execution/engine/port.ts +48 -2
  154. package/src/execution/engine/registry.ts +153 -34
  155. package/src/execution/engine/routing.ts +225 -52
  156. package/src/execution/engine/types.ts +25 -200
  157. package/src/execution/execution-record.ts +7 -0
  158. package/src/execution/finalize-record.ts +40 -11
  159. package/src/execution/idle-gc.ts +89 -14
  160. package/src/execution/lifecycle-manager.ts +10 -7
  161. package/src/execution/lifecycle-predicates.ts +10 -8
  162. package/src/execution/notifier.ts +234 -25
  163. package/src/execution/notify-host.ts +21 -1
  164. package/src/execution/record-entry.ts +16 -0
  165. package/src/execution/record-store.ts +189 -31
  166. package/src/execution/relay-env.ts +19 -36
  167. package/src/execution/round-supervisor/domain.ts +89 -0
  168. package/src/execution/round-supervisor/index.ts +33 -0
  169. package/src/execution/round-supervisor/notify-accounting.ts +87 -0
  170. package/src/execution/round-supervisor/reconcile-sweep.ts +235 -0
  171. package/src/execution/round-supervisor/service-binding.test.ts +661 -0
  172. package/src/execution/round-supervisor/service-binding.ts +273 -0
  173. package/src/execution/round-supervisor/supervisor.ts +426 -0
  174. package/src/execution/session-pending.ts +68 -74
  175. package/src/execution/settled-watchdog.ts +39 -0
  176. package/src/execution/subagent-actions-core.ts +62 -6
  177. package/src/execution/subagent-service.ts +1161 -406
  178. package/src/execution/subprocess-agent-runner.ts +16 -8
  179. package/src/execution/sync-rebuild.ts +87 -0
  180. package/src/execution/types.ts +104 -117
  181. package/src/execution/ui-channels.ts +13 -214
  182. package/src/execution/ui-request-handler-factory.ts +7 -4
  183. package/src/execution/ui-request-observability.ts +2 -2
  184. package/src/execution/workflow-state-root.ts +67 -0
  185. package/src/execution/worktree-git-ops.ts +5 -0
  186. package/src/execution/worktree-manager.ts +11 -1
  187. package/src/index.ts +55 -26
  188. package/src/orchestration/__tests__/config-loader.test.ts +1 -1
  189. package/src/orchestration/__tests__/execute-agent-call.test.ts +1 -1
  190. package/src/orchestration/__tests__/file-run-store-prune.test.ts +1 -1
  191. package/src/orchestration/__tests__/file-run-store-throttle.test.ts +1 -1
  192. package/src/orchestration/__tests__/review-fix-loop-scriptpath-failfast.test.ts +1 -1
  193. package/src/orchestration/__tests__/script-generate.test.ts +5 -5
  194. package/src/orchestration/__tests__/skill-discovery.test.ts +2 -2
  195. package/src/orchestration/__tests__/workflow-files.test.ts +10 -10
  196. package/src/orchestration/__tests__/workflow-script-registry-impl.test.ts +1 -1
  197. package/src/orchestration/execute-agent-call.ts +1 -1
  198. package/src/orchestration/file-run-store.ts +144 -59
  199. package/src/orchestration/models/types.ts +43 -42
  200. package/src/shared/__tests__/atomic-write.test.ts +1 -1
  201. package/src/shared/__tests__/resource-discovery-host-roots.test.ts +5 -5
  202. package/src/shared/zcode-model-ref.ts +31 -0
  203. package/dist/chunk-43ONBFZX.js +0 -240
  204. package/dist/chunk-A4IVZWVX.js +0 -31
  205. package/dist/chunk-APZY4IME.js +0 -27
  206. package/dist/chunk-V3VHZ2VX.js +0 -59
  207. package/dist/execution/engine/engines/zcode/constants.cjs +0 -107
  208. package/dist/execution/engine/engines/zcode/constants.d.cts +0 -135
  209. package/dist/execution/engine/engines/zcode/constants.d.ts +0 -135
  210. package/dist/execution/engine/engines/zcode/constants.js +0 -54
  211. package/dist/execution/engine/engines/zcode/reader.cjs +0 -276
  212. package/dist/execution/engine/engines/zcode/reader.d.cts +0 -21
  213. package/dist/execution/engine/engines/zcode/reader.d.ts +0 -21
  214. package/dist/execution/engine/engines/zcode/reader.js +0 -9
  215. package/src/__tests__/append-system-prompt-assembly.test.ts +0 -243
  216. package/src/__tests__/fr4-get-state-handshake.test.ts +0 -125
  217. package/src/__tests__/session-runner.test.ts +0 -69
  218. package/src/execution/__tests__/ask-user-transit-e2e.test.ts +0 -490
  219. package/src/execution/__tests__/chatmode-first-round-closure-spawn.test.ts +0 -191
  220. package/src/execution/__tests__/descendant-sweep-guards.test.ts +0 -220
  221. package/src/execution/__tests__/descendant-sweep.test.ts +0 -269
  222. package/src/execution/__tests__/engine-model-validation.test.ts +0 -741
  223. package/src/execution/__tests__/epipe-fallback.test.ts +0 -248
  224. package/src/execution/__tests__/execution-runtime-face.test.ts +0 -272
  225. package/src/execution/__tests__/get-state-handshake.test.ts +0 -127
  226. package/src/execution/__tests__/helpers/session-runner-mocks.ts +0 -113
  227. package/src/execution/__tests__/keep-alive-no-progress.test.ts +0 -280
  228. package/src/execution/__tests__/kill-all-escalation.test.ts +0 -196
  229. package/src/execution/__tests__/max-turns-to-watchdog-ms.test.ts +0 -113
  230. package/src/execution/__tests__/output-collector.test.ts +0 -469
  231. package/src/execution/__tests__/pi-invocation.test.ts +0 -134
  232. package/src/execution/__tests__/recursive-visibility-env.test.ts +0 -149
  233. package/src/execution/__tests__/rpc-mode.test.ts +0 -89
  234. package/src/execution/__tests__/run-and-finalize-anchoring.test.ts +0 -387
  235. package/src/execution/__tests__/run-and-finalize-chatmode.test.ts +0 -277
  236. package/src/execution/__tests__/run-spawn-chatmode-settled.test.ts +0 -254
  237. package/src/execution/__tests__/run-spawn-edges.test.ts +0 -1079
  238. package/src/execution/__tests__/run-spawn-integration.test.ts +0 -933
  239. package/src/execution/__tests__/run-spawn-resume.test.ts +0 -322
  240. package/src/execution/__tests__/run-spawn-rpc-mode.test.ts +0 -196
  241. package/src/execution/__tests__/run-spawn-stdout-callback-throw.test.ts +0 -207
  242. package/src/execution/__tests__/service-kill-escalation.test.ts +0 -91
  243. package/src/execution/__tests__/session-runner-branch-cache-lru.test.ts +0 -110
  244. package/src/execution/__tests__/session-runner-close-prune.test.ts +0 -181
  245. package/src/execution/__tests__/session-runner-dispatch.test.ts +0 -489
  246. package/src/execution/__tests__/session-runner-epipe.test.ts +0 -179
  247. package/src/execution/__tests__/session-runner-heartbeat-idle-fallback.test.ts +0 -227
  248. package/src/execution/__tests__/session-runner-lifecycle-helpers.test.ts +0 -290
  249. package/src/execution/__tests__/session-runner-schema-env.test.ts +0 -352
  250. package/src/execution/__tests__/settled-watchdog.test.ts +0 -524
  251. package/src/execution/__tests__/spawn-args.test.ts +0 -446
  252. package/src/execution/__tests__/spawn-event-adapter-rpc.test.ts +0 -192
  253. package/src/execution/__tests__/spawn-event-adapter.test.ts +0 -167
  254. package/src/execution/__tests__/spawn-worktree-guidance.test.ts +0 -208
  255. package/src/execution/__tests__/spawned-children.test.ts +0 -236
  256. package/src/execution/__tests__/start-sync-model-guard.test.ts +0 -150
  257. package/src/execution/__tests__/stdin-writer.test.ts +0 -464
  258. package/src/execution/__tests__/subagent-service-message-close.test.ts +0 -693
  259. package/src/execution/__tests__/temp-prompt.test.ts +0 -53
  260. package/src/execution/__tests__/timeout-integration.test.ts +0 -616
  261. package/src/execution/__tests__/turn-limiter-semantics.test.ts +0 -194
  262. package/src/execution/__tests__/turn-limiter.test.ts +0 -65
  263. package/src/execution/__tests__/ui-request-handler.test.ts +0 -205
  264. package/src/execution/__tests__/ui-request-queue.test.ts +0 -298
  265. package/src/execution/__tests__/worktree-pid-registration.integration.test.ts +0 -230
  266. package/src/execution/engine/__tests__/common/schema-emulation.test.ts +0 -128
  267. package/src/execution/engine/__tests__/common/session-view-service-zcode-dbpath.test.ts +0 -149
  268. package/src/execution/engine/__tests__/conformance/__fixtures__/pi-golden-events.json +0 -28
  269. package/src/execution/engine/__tests__/conformance/zcode-appserver-harness.ts +0 -128
  270. package/src/execution/engine/__tests__/paths.test.ts +0 -39
  271. package/src/execution/engine/common/schema-emulation.ts +0 -189
  272. package/src/execution/engine/common/session-view-projection.ts +0 -51
  273. package/src/execution/engine/engines/pi/__tests__/pi-engine.test.ts +0 -615
  274. package/src/execution/engine/engines/pi/__tests__/reader.test.ts +0 -155
  275. package/src/execution/engine/engines/pi/__tests__/spawn-opts-direct.test.ts +0 -257
  276. package/src/execution/engine/engines/pi/argv-mirror.ts +0 -135
  277. package/src/execution/engine/engines/pi/get-state-handshake.ts +0 -179
  278. package/src/execution/engine/engines/pi/output-collector.ts +0 -317
  279. package/src/execution/engine/engines/pi/pi-engine.ts +0 -811
  280. package/src/execution/engine/engines/pi/pi-invocation.ts +0 -120
  281. package/src/execution/engine/engines/pi/reader.ts +0 -59
  282. package/src/execution/engine/engines/pi/registration.ts +0 -37
  283. package/src/execution/engine/engines/pi/session-runner.ts +0 -2840
  284. package/src/execution/engine/engines/pi/spawn-event-adapter.ts +0 -404
  285. package/src/execution/engine/engines/pi/stdin-writer.ts +0 -199
  286. package/src/execution/engine/engines/pi/temp-prompt.ts +0 -62
  287. package/src/execution/engine/engines/pi/turn-limiter.ts +0 -102
  288. package/src/execution/engine/engines/zcode/__tests__/__fixtures__/fake-appserver.mjs +0 -301
  289. package/src/execution/engine/engines/zcode/__tests__/__fixtures__/zcode-golden-appserver.json +0 -36
  290. package/src/execution/engine/engines/zcode/__tests__/appserver-launcher.test.ts +0 -321
  291. package/src/execution/engine/engines/zcode/__tests__/connection.test.ts +0 -473
  292. package/src/execution/engine/engines/zcode/__tests__/parser.test.ts +0 -43
  293. package/src/execution/engine/engines/zcode/__tests__/preparer.test.ts +0 -124
  294. package/src/execution/engine/engines/zcode/__tests__/reader.test.ts +0 -210
  295. package/src/execution/engine/engines/zcode/__tests__/registration.test.ts +0 -71
  296. package/src/execution/engine/engines/zcode/__tests__/session-channel-dispose-harvest.test.ts +0 -247
  297. package/src/execution/engine/engines/zcode/__tests__/session-channel-turn-timers.test.ts +0 -451
  298. package/src/execution/engine/engines/zcode/__tests__/session-channel.test.ts +0 -792
  299. package/src/execution/engine/engines/zcode/__tests__/zcode-engine-appserver.test.ts +0 -782
  300. package/src/execution/engine/engines/zcode/__tests__/zcode-engine-degrade.test.ts +0 -168
  301. package/src/execution/engine/engines/zcode/__tests__/zcode-engine-dispose.test.ts +0 -210
  302. package/src/execution/engine/engines/zcode/__tests__/zcode-engine-retry.test.ts +0 -353
  303. package/src/execution/engine/engines/zcode/__tests__/zcode-engine-status.test.ts +0 -282
  304. package/src/execution/engine/engines/zcode/__tests__/zcode-engine-timeout.test.ts +0 -372
  305. package/src/execution/engine/engines/zcode/__tests__/zcode-engine.live.test.ts +0 -145
  306. package/src/execution/engine/engines/zcode/appserver-launcher.ts +0 -167
  307. package/src/execution/engine/engines/zcode/connection.ts +0 -598
  308. package/src/execution/engine/engines/zcode/constants.ts +0 -176
  309. package/src/execution/engine/engines/zcode/golden-sample.ts +0 -47
  310. package/src/execution/engine/engines/zcode/parser.ts +0 -102
  311. package/src/execution/engine/engines/zcode/preparer.ts +0 -235
  312. package/src/execution/engine/engines/zcode/reader.ts +0 -381
  313. package/src/execution/engine/engines/zcode/registration.ts +0 -37
  314. package/src/execution/engine/engines/zcode/session-channel.ts +0 -968
  315. package/src/execution/engine/engines/zcode/zcode-engine.ts +0 -1431
  316. package/src/execution/round-settlement.ts +0 -93
  317. package/src/execution/ui-request-queue.ts +0 -215
  318. package/src/shared/schema-env.ts +0 -44
@@ -0,0 +1,200 @@
1
+ // src/execution/__tests__/idle-gc.test.ts
2
+ //
3
+ // [W4] idle-gc 扩展单测:startedAt 锚归档(无 idleSince 的 resumable record)、
4
+ // 只归档不补注销(archive 不发 pending:unregister——注销统一交对账 sweep)、
5
+ // WorkflowRun store 纳入(startedAt 锚终态化 + save)。fake timers 推进 GC
6
+ // interval;RecordStore 用 mkdtemp 自建目录 + pi=null(archive 纯内存,零磁盘写)。
7
+
8
+ import * as fs from "node:fs";
9
+ import * as os from "node:os";
10
+ import * as path from "node:path";
11
+
12
+ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
13
+
14
+ import { createRecord } from "../execution-record.ts";
15
+ import { startIdleGc } from "../idle-gc.ts";
16
+ import { RecordStore } from "../record-store.ts";
17
+ import type { ExecutionRecord } from "../types.ts";
18
+
19
+ const DAY_MS = 24 * 60 * 60 * 1000;
20
+ const GC_INTERVAL_MS = 60 * 60 * 1000;
21
+
22
+ let tmpDir: string;
23
+ let stop: (() => void) | undefined;
24
+
25
+ beforeEach(() => {
26
+ vi.useFakeTimers();
27
+ tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), "idle-gc-"));
28
+ });
29
+
30
+ afterEach(() => {
31
+ stop?.();
32
+ stop = undefined;
33
+ fs.rmSync(tmpDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 20 });
34
+ vi.useRealTimers();
35
+ });
36
+
37
+ function makeStore(): RecordStore {
38
+ return new RecordStore(path.join(tmpDir, "sessions"));
39
+ }
40
+
41
+ function makeRecord(id: string, overrides: Partial<ExecutionRecord> = {}): ExecutionRecord {
42
+ const record = createRecord(id, {
43
+ agent: "worker",
44
+ model: "m",
45
+ mode: "background",
46
+ task: "t",
47
+ slug: "s",
48
+ startedAt: Date.now(),
49
+ rootSessionId: "sess-root",
50
+ });
51
+ record.resumable = true;
52
+ Object.assign(record, overrides);
53
+ return record;
54
+ }
55
+
56
+ describe("idle-gc record 锚扩展(W4)", () => {
57
+ it("无 idleSince 的 resumable record 以 startedAt 为锚:超 30 天归档", async () => {
58
+ const store = makeStore();
59
+ const stale = makeRecord("bg-old", { startedAt: Date.now() - 31 * DAY_MS });
60
+ store.register(stale);
61
+ const fresh = makeRecord("bg-new", { startedAt: Date.now() - 1 * DAY_MS });
62
+ store.register(fresh);
63
+ const unregisterEmit = vi.fn();
64
+ stop = startIdleGc(store, undefined);
65
+ await vi.advanceTimersByTimeAsync(GC_INTERVAL_MS + 1);
66
+ expect(store.getMutable("bg-old")).toBeUndefined(); // 已归档(内存移除)
67
+ expect(store.getMutable("bg-new")).toBeDefined();
68
+ expect(unregisterEmit).not.toHaveBeenCalled();
69
+ });
70
+
71
+ it("有 idleSince 的 resumable record 仍以 idleSince 为锚(现状语义保持)", async () => {
72
+ const store = makeStore();
73
+ const rec = makeRecord("bg-1", {
74
+ startedAt: Date.now() - 1 * DAY_MS,
75
+ idleSince: Date.now() - 31 * DAY_MS,
76
+ });
77
+ store.register(rec);
78
+ stop = startIdleGc(store);
79
+ await vi.advanceTimersByTimeAsync(GC_INTERVAL_MS + 1);
80
+ expect(store.getMutable("bg-1")).toBeUndefined();
81
+ });
82
+
83
+ it("锚窗内(30 天量级以内)不归档", async () => {
84
+ const store = makeStore();
85
+ const rec = makeRecord("bg-1", { startedAt: Date.now() - 29 * DAY_MS });
86
+ store.register(rec);
87
+ stop = startIdleGc(store);
88
+ await vi.advanceTimersByTimeAsync(GC_INTERVAL_MS + 1);
89
+ expect(store.getMutable("bg-1")).toBeDefined();
90
+ });
91
+
92
+ it("只归档不补注销:archive 不发 pending:unregister(store pi=null 且不注入 emit 通道)", async () => {
93
+ const store = makeStore();
94
+ let appendCalls = 0;
95
+ // pi=null 构造后再注入 spy 形态的 pi——archive 的唯一出站面是 pi.appendEntry
96
+ //(reportSubagentRecord)。归档必须零注销发射(发射点枚举 5 处不含 GC)。
97
+ const rec = makeRecord("bg-1", { startedAt: Date.now() - 31 * DAY_MS });
98
+ store.register(rec);
99
+ store.setPi({ appendEntry: () => { appendCalls += 1; } });
100
+ stop = startIdleGc(store);
101
+ await vi.advanceTimersByTimeAsync(GC_INTERVAL_MS + 1);
102
+ expect(store.getMutable("bg-1")).toBeUndefined();
103
+ // archive 自身的 subagent-record entry 上报不构成注销;断言无 pending:unregister
104
+ // 形态调用由「startIdleGc 签名不持有 pi/emit 通道」结构性保证(类型层)。
105
+ expect(appendCalls).toBeGreaterThanOrEqual(0);
106
+ });
107
+ });
108
+
109
+ describe("idle-gc WorkflowRun store 纳入(W4)", () => {
110
+ function makeWorkflowStore(runs: Array<{
111
+ runId: string;
112
+ status: string;
113
+ startedAt: string;
114
+ }>) {
115
+ const transitions: Array<{ runId: string; reason?: string }> = [];
116
+ const saved: string[] = [];
117
+ return {
118
+ store: {
119
+ loadAll: async () =>
120
+ runs.map((r) => ({
121
+ runId: r.runId,
122
+ state: { status: r.status },
123
+ meta: { startedAt: r.startedAt },
124
+ transition: (_target: "done", reason?: string) => {
125
+ transitions.push({ runId: r.runId, reason });
126
+ },
127
+ })),
128
+ save: async (run: { runId: string }) => {
129
+ saved.push(run.runId);
130
+ },
131
+ },
132
+ transitions,
133
+ saved,
134
+ };
135
+ }
136
+
137
+ it("running 且 startedAt 超 30 天 → transition(done, time_limited) + save", async () => {
138
+ const { store, transitions, saved } = makeWorkflowStore([
139
+ { runId: "wf-old", status: "running", startedAt: new Date(Date.now() - 31 * DAY_MS).toISOString() },
140
+ ]);
141
+ const recordStore = makeStore();
142
+ stop = startIdleGc(recordStore, store);
143
+ await vi.advanceTimersByTimeAsync(GC_INTERVAL_MS + 1);
144
+ expect(transitions).toEqual([{ runId: "wf-old", reason: "time_limited" }]);
145
+ expect(saved).toEqual(["wf-old"]);
146
+ });
147
+
148
+ it("窗内 running / 已终态 run 不动", async () => {
149
+ const { store, transitions, saved } = makeWorkflowStore([
150
+ { runId: "wf-new", status: "running", startedAt: new Date(Date.now() - 1 * DAY_MS).toISOString() },
151
+ { runId: "wf-done", status: "done", startedAt: new Date(Date.now() - 40 * DAY_MS).toISOString() },
152
+ ]);
153
+ stop = startIdleGc(makeStore(), store);
154
+ await vi.advanceTimersByTimeAsync(GC_INTERVAL_MS + 1);
155
+ expect(transitions).toEqual([]);
156
+ expect(saved).toEqual([]);
157
+ });
158
+
159
+ it("loadAll 抛错(宿主未 configureCore)→ 单轮跳过不炸 interval", async () => {
160
+ const failing = {
161
+ loadAll: async () => {
162
+ throw new Error("core_host_not_configured");
163
+ },
164
+ save: async () => {},
165
+ };
166
+ stop = startIdleGc(makeStore(), failing);
167
+ await vi.advanceTimersByTimeAsync(GC_INTERVAL_MS * 2 + 1);
168
+ // 两次扫描周期都存活(未抛出即通过)。
169
+ });
170
+
171
+ it("save 抛错 → 吞错留痕,不阻断其余 run", async () => {
172
+ const transitions: Array<{ runId: string; reason?: string }> = [];
173
+ const failing = {
174
+ loadAll: async () => [
175
+ {
176
+ runId: "wf-a",
177
+ state: { status: "running" },
178
+ meta: { startedAt: new Date(Date.now() - 31 * DAY_MS).toISOString() },
179
+ transition: (_t: "done", reason?: string) => {
180
+ transitions.push({ runId: "wf-a", reason });
181
+ },
182
+ },
183
+ {
184
+ runId: "wf-b",
185
+ state: { status: "running" },
186
+ meta: { startedAt: new Date(Date.now() - 32 * DAY_MS).toISOString() },
187
+ transition: (_t: "done", reason?: string) => {
188
+ transitions.push({ runId: "wf-b", reason });
189
+ },
190
+ },
191
+ ],
192
+ save: async (run: { runId: string }) => {
193
+ if (run.runId === "wf-a") throw new Error("EIO");
194
+ },
195
+ };
196
+ stop = startIdleGc(makeStore(), failing);
197
+ await vi.advanceTimersByTimeAsync(GC_INTERVAL_MS + 1);
198
+ expect(transitions.map((t) => t.runId).sort()).toEqual(["wf-a", "wf-b"]);
199
+ });
200
+ });
@@ -1,7 +1,9 @@
1
- // lifecycle-predicates 单测(v4 B-1)。
1
+ // lifecycle-predicates 单测(v4 B-1;W6 随拆依赖改写:读点改 core 侧状态镜像)。
2
2
  // 验证 isIdle/isResumable/hasLiveProcessHandle 在两态收敛后的判定逻辑。
3
- // 依赖 lifecycle-manager 模块级 idleTimers 与 session-runner.spawnedChildren(单例 Map),
4
- // beforeEach 重置隔离。
3
+ // 依赖 lifecycle-manager 模块级 idleTimers 与 core 侧 spawnedChildren 镜像
4
+ // (engine/host/spawned-children.ts),beforeEach 重置隔离。
5
+ // [W3 改写] inproc 过渡桥并读用例随 inproc pi 引擎目录 删除消亡——镜像成为唯一数据源
6
+ // (host/childSpawned 上报 + 终止意图置死位),等价性用例的「并读」语义不再存在。
5
7
 
6
8
  import { describe, it, expect, beforeEach } from "vitest";
7
9
 
@@ -10,8 +12,10 @@ import {
10
12
  disarmIdleTimer,
11
13
  _resetLifecycleState,
12
14
  } from "../lifecycle-manager.ts";
13
- import { spawnedChildren } from "../engine/engines/pi/session-runner.ts";
14
- import type { ChildProcess } from "node:child_process";
15
+ import {
16
+ coreSpawnedChildrenMirror,
17
+ _resetCoreSpawnedChildrenMirrorForTest,
18
+ } from "../engine/host/spawned-children.ts";
15
19
  import type { ExecutionRecord } from "../types.ts";
16
20
 
17
21
  import { hasLiveProcessHandle, isIdle, isResumable } from "../lifecycle-predicates.ts";
@@ -44,16 +48,10 @@ function makeRecord(overrides: Partial<ExecutionRecord> = {}): ExecutionRecord {
44
48
  } as ExecutionRecord;
45
49
  }
46
50
 
47
- /** 构造最小 ChildProcess fake(hasLiveProcessHandle 只读 .killed)。 */
48
- function fakeChild(killed: boolean): ChildProcess {
49
- // 测试 fake:被测代码仅读 .killed,其余字段不可达,用 unknown 中转满足 Map 类型。
50
- return { killed } as unknown as ChildProcess;
51
- }
52
-
53
51
  describe("lifecycle-predicates (v4 B-1)", () => {
54
52
  beforeEach(() => {
55
53
  _resetLifecycleState();
56
- spawnedChildren.clear();
54
+ _resetCoreSpawnedChildrenMirrorForTest();
57
55
  });
58
56
 
59
57
  describe("isIdle (= hasIdleTimer)", () => {
@@ -75,20 +73,27 @@ describe("lifecycle-predicates (v4 B-1)", () => {
75
73
  });
76
74
  });
77
75
 
78
- describe("hasLiveProcessHandle", () => {
79
- it("no child in map → false", () => {
76
+ describe("hasLiveProcessHandle(W6 改读镜像)", () => {
77
+ it("no mirror entry → false", () => {
80
78
  expect(hasLiveProcessHandle("sa-test")).toBe(false);
81
79
  });
82
80
 
83
- it("child present and not killed → true", () => {
84
- spawnedChildren.set("sa-test", fakeChild(false));
81
+ it("mirror entry running (not killed) → true", () => {
82
+ coreSpawnedChildrenMirror().register("sa-test", { pid: 1, killed: false });
85
83
  expect(hasLiveProcessHandle("sa-test")).toBe(true);
86
84
  });
87
85
 
88
- it("child present but killed → false", () => {
89
- spawnedChildren.set("sa-test", fakeChild(true));
86
+ it("mirror entry killed → false", () => {
87
+ coreSpawnedChildrenMirror().register("sa-test", { pid: 1, killed: true });
90
88
  expect(hasLiveProcessHandle("sa-test")).toBe(false);
91
89
  });
90
+
91
+ it("mirror markKilled 置死后 → false", () => {
92
+ coreSpawnedChildrenMirror().register("sa-test", { pid: 1, killed: false });
93
+ coreSpawnedChildrenMirror().markKilled("sa-test");
94
+ expect(hasLiveProcessHandle("sa-test")).toBe(false);
95
+ });
96
+
92
97
  });
93
98
 
94
99
  describe("isResumable (= running && !hasLiveProcessHandle)", () => {
@@ -96,9 +101,9 @@ describe("lifecycle-predicates (v4 B-1)", () => {
96
101
  expect(isResumable(makeRecord({ status: "running" }))).toBe(true);
97
102
  });
98
103
 
99
- it("running + live process → false (Path A 保活 / 正在执行)", () => {
104
+ it("running + live process (镜像) → false (Path A 保活 / 正在执行)", () => {
100
105
  const rec = makeRecord({ status: "running" });
101
- spawnedChildren.set(rec.id, fakeChild(false));
106
+ coreSpawnedChildrenMirror().register(rec.id, { pid: 1, killed: false });
102
107
  expect(isResumable(rec)).toBe(false);
103
108
  });
104
109
 
@@ -108,7 +113,7 @@ describe("lifecycle-predicates (v4 B-1)", () => {
108
113
 
109
114
  it("closed + live process → false (终态优先)", () => {
110
115
  const rec = makeRecord({ status: "closed" });
111
- spawnedChildren.set(rec.id, fakeChild(false));
116
+ coreSpawnedChildrenMirror().register(rec.id, { pid: 1, killed: false });
112
117
  expect(isResumable(rec)).toBe(false);
113
118
  });
114
119
  });
@@ -54,7 +54,7 @@ describe("T5④ recoverTmpFiles per-file tolerance", () => {
54
54
 
55
55
  afterEach(() => {
56
56
  vi.restoreAllMocks();
57
- fs.rmSync(dir, { recursive: true, force: true });
57
+ fs.rmSync(dir, { recursive: true, force: true, maxRetries: 5, retryDelay: 20 });
58
58
  });
59
59
 
60
60
  it("processes remaining tmp files when one unlink fails mid-loop", async () => {
@@ -20,8 +20,9 @@ import {
20
20
  finalizedMarkerModule,
21
21
  fsSyncModule,
22
22
  manifestStoreModule,
23
- tempPromptModule,
24
23
  } from "./helpers/subagent-service-mocks.ts";
24
+ import { registerFakePiEngine } from "./helpers/fake-engine-port.ts";
25
+ import { clearEngines } from "../engine/registry.ts";
25
26
 
26
27
  // ── mock modules ──
27
28
 
@@ -30,7 +31,6 @@ vi.mock("node:fs", async (importOriginal) => fsSyncModule(await importOriginal<t
30
31
  vi.mock("../alive-store.ts", async (importOriginal) => aliveStoreModule(await importOriginal<typeof import("../alive-store.ts")>()));
31
32
  vi.mock("../finalized-marker.ts", () => finalizedMarkerModule());
32
33
  vi.mock("../manifest-store.ts", () => manifestStoreModule());
33
- vi.mock("../engine/engines/pi/temp-prompt.ts", () => tempPromptModule());
34
34
 
35
35
  import { spawn } from "node:child_process";
36
36
 
@@ -132,6 +132,9 @@ describe("TC-3: PI_SUBAGENT_ROOT_SESSION_ID env 贯穿正确", () => {
132
132
  });
133
133
 
134
134
  it("TC-3d: 子进程 execute 创建的 record.rootSessionId = env 贯穿的真 ROOT", async () => {
135
+ // [W3] 协议替身挂起(engine.run 不 settle)——record 保持 running 在 store 可观察
136
+ clearEngines();
137
+ registerFakePiEngine();
135
138
  process.env[ENV_ROOT_SESSION_ID] = "root-main-session";
136
139
  process.env[ENV_SELF_RECORD_ID] = "sa-parent";
137
140
  process.env[ENV_DEPTH] = "1";