@zhushanwen/subagent-core 0.4.0 → 0.6.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 (309) hide show
  1. package/dist/{chunk-4KN4TTG7.js → chunk-43ONBFZX.js} +1 -1
  2. package/dist/{chunk-X7SZ5HLQ.js → chunk-V3VHZ2VX.js} +20 -27
  3. package/dist/execution/engine/engines/zcode/constants.cjs +29 -41
  4. package/dist/execution/engine/engines/zcode/constants.d.cts +65 -53
  5. package/dist/execution/engine/engines/zcode/constants.d.ts +65 -53
  6. package/dist/execution/engine/engines/zcode/constants.js +17 -27
  7. package/dist/execution/engine/engines/zcode/reader.d.cts +2 -1
  8. package/dist/execution/engine/engines/zcode/reader.d.ts +2 -1
  9. package/dist/execution/engine/engines/zcode/reader.js +2 -2
  10. package/dist/index.cjs +17100 -14082
  11. package/dist/index.d.cts +5336 -4033
  12. package/dist/index.d.ts +5336 -4033
  13. package/dist/index.js +17020 -14055
  14. package/dist/{types-DpUO16pj.d.cts → types-C3fE3R9x.d.cts} +280 -112
  15. package/dist/{types-DpUO16pj.d.ts → types-C3fE3R9x.d.ts} +280 -112
  16. package/dist.bundle/index.cjs +34933 -0
  17. package/package.json +3 -3
  18. package/src/__tests__/agent-opts-resolver-schema-prompt.test.ts +0 -1
  19. package/src/__tests__/append-system-prompt-assembly.test.ts +8 -7
  20. package/src/__tests__/fr4-get-state-handshake.test.ts +2 -2
  21. package/src/__tests__/m2-append-content-probe.test.ts +0 -1
  22. package/src/__tests__/manifest-store.test.ts +10 -9
  23. package/src/__tests__/record-store-cache.test.ts +0 -2
  24. package/src/__tests__/record-store-index.test.ts +1 -2
  25. package/src/__tests__/review-fix-loop-script.test.ts +4 -2
  26. package/src/__tests__/review-fix-loop-utils.test.ts +10 -10
  27. package/src/__tests__/robustness-low-batch1.test.ts +6 -5
  28. package/src/__tests__/robustness-medium-batch1.test.ts +2 -2
  29. package/src/__tests__/robustness-medium-batch2.test.ts +17 -6
  30. package/src/__tests__/robustness-medium-batch4.test.ts +2 -2
  31. package/src/__tests__/session-runner.test.ts +1 -1
  32. package/src/core/__tests__/host-services.test.ts +2 -2
  33. package/src/core/__tests__/logger.test.ts +1 -1
  34. package/src/core/error-message.ts +9 -0
  35. package/src/core/host-services.ts +21 -5
  36. package/src/core/notify-ports.ts +18 -5
  37. package/src/execution/__tests__/agent-profile.test.ts +4 -4
  38. package/src/execution/__tests__/agent-registry.test.ts +370 -0
  39. package/src/execution/__tests__/agent-result-mapper.test.ts +18 -2
  40. package/src/execution/__tests__/agents-assembly.test.ts +2 -2
  41. package/src/execution/__tests__/alive-store.test.ts +1 -1
  42. package/src/execution/__tests__/ask-user-transit-e2e.test.ts +6 -6
  43. package/src/execution/__tests__/chat-engine-routing.test.ts +68 -33
  44. package/src/execution/__tests__/chatmode-first-round-closure-spawn.test.ts +4 -4
  45. package/src/execution/__tests__/cold-resurrect.test.ts +283 -0
  46. package/src/execution/__tests__/collect-budget.test.ts +291 -0
  47. package/src/execution/__tests__/collect-coordinator-service.test.ts +327 -0
  48. package/src/execution/__tests__/collect-coordinator.test.ts +371 -0
  49. package/src/execution/__tests__/collect-mixed-dispatch.test.ts +262 -0
  50. package/src/execution/__tests__/config-collect-sync.test.ts +120 -0
  51. package/src/execution/__tests__/config.test.ts +1 -1
  52. package/src/execution/__tests__/delivery-methods.test.ts +75 -62
  53. package/src/execution/__tests__/descendant-sweep-guards.test.ts +220 -0
  54. package/src/execution/__tests__/descendant-sweep.test.ts +6 -6
  55. package/src/execution/__tests__/dialog-queue.test.ts +2 -2
  56. package/src/execution/__tests__/engine-model-validation.test.ts +741 -0
  57. package/src/execution/__tests__/epipe-fallback.test.ts +29 -24
  58. package/src/execution/__tests__/execute-and-await-worktree.test.ts +21 -91
  59. package/src/execution/__tests__/execute-nesting.test.ts +34 -188
  60. package/src/execution/__tests__/execution-record.test.ts +217 -60
  61. package/src/execution/__tests__/execution-runtime-face.test.ts +5 -5
  62. package/src/execution/__tests__/explicit-agent-ref-guard.test.ts +4 -4
  63. package/src/execution/__tests__/finalize-record.test.ts +173 -17
  64. package/src/execution/__tests__/finalized-marker.test.ts +1 -1
  65. package/src/execution/__tests__/gc-timer.test.ts +56 -3
  66. package/src/execution/__tests__/get-record-for-action-restart.test.ts +12 -12
  67. package/src/execution/__tests__/get-state-handshake.test.ts +1 -1
  68. package/src/execution/__tests__/helpers/mock-extension-api.ts +1 -1
  69. package/src/execution/__tests__/helpers/session-runner-mocks.ts +113 -0
  70. package/src/execution/__tests__/helpers/spawn-mock.ts +150 -3
  71. package/src/execution/__tests__/helpers/subagent-service-mocks.ts +137 -0
  72. package/src/execution/__tests__/keep-alive-no-progress.test.ts +50 -148
  73. package/src/execution/__tests__/kill-all-escalation.test.ts +2 -2
  74. package/src/execution/__tests__/lifecycle-predicates.test.ts +1 -2
  75. package/src/execution/__tests__/manifest-parentid.test.ts +4 -4
  76. package/src/execution/__tests__/manifest-store-tmp-recovery.test.ts +1 -1
  77. package/src/execution/__tests__/max-turns-to-watchdog-ms.test.ts +1 -1
  78. package/src/execution/__tests__/model-resolver.test.ts +2 -2
  79. package/src/execution/__tests__/nested-visibility-env-propagation.test.ts +23 -121
  80. package/src/execution/__tests__/nested-visibility.test.ts +2 -0
  81. package/src/execution/__tests__/notify-batch.test.ts +500 -0
  82. package/src/execution/__tests__/notify-ledger.test.ts +1000 -18
  83. package/src/execution/__tests__/output-collector.test.ts +117 -6
  84. package/src/execution/__tests__/pi-invocation.test.ts +36 -4
  85. package/src/execution/__tests__/record-entry-collect.test.ts +102 -0
  86. package/src/execution/__tests__/record-store.test.ts +10 -9
  87. package/src/execution/__tests__/records-cwd-isolation.test.ts +2 -2
  88. package/src/execution/__tests__/recursive-visibility-baseline.test.ts +29 -132
  89. package/src/execution/__tests__/recursive-visibility-env.test.ts +55 -179
  90. package/src/execution/__tests__/relay-env.test.ts +12 -1
  91. package/src/execution/__tests__/rpc-mode.test.ts +2 -2
  92. package/src/execution/__tests__/run-and-finalize-anchoring.test.ts +387 -0
  93. package/src/execution/__tests__/run-and-finalize-chatmode.test.ts +15 -9
  94. package/src/execution/__tests__/run-spawn-chatmode-settled.test.ts +4 -4
  95. package/src/execution/__tests__/run-spawn-edges.test.ts +17 -15
  96. package/src/execution/__tests__/run-spawn-integration.test.ts +2 -2
  97. package/src/execution/__tests__/run-spawn-resume.test.ts +2 -2
  98. package/src/execution/__tests__/run-spawn-rpc-mode.test.ts +2 -2
  99. package/src/execution/__tests__/run-spawn-stdout-callback-throw.test.ts +4 -4
  100. package/src/execution/__tests__/service-kill-escalation.test.ts +7 -5
  101. package/src/execution/__tests__/session-context-resolver.test.ts +0 -2
  102. package/src/execution/__tests__/session-file-gc.test.ts +36 -1
  103. package/src/execution/__tests__/session-pending.test.ts +257 -14
  104. package/src/execution/__tests__/session-reconstructor.test.ts +366 -15
  105. package/src/execution/__tests__/session-runner-branch-cache-lru.test.ts +1 -1
  106. package/src/execution/__tests__/session-runner-close-prune.test.ts +2 -2
  107. package/src/execution/__tests__/session-runner-dispatch.test.ts +489 -0
  108. package/src/execution/__tests__/session-runner-epipe.test.ts +3 -3
  109. package/src/execution/__tests__/session-runner-heartbeat-idle-fallback.test.ts +5 -4
  110. package/src/execution/__tests__/session-runner-lifecycle-helpers.test.ts +290 -0
  111. package/src/execution/__tests__/session-runner-schema-env.test.ts +7 -5
  112. package/src/execution/__tests__/settled-watchdog.test.ts +282 -47
  113. package/src/execution/__tests__/spawn-args.test.ts +11 -10
  114. package/src/execution/__tests__/spawn-event-adapter-rpc.test.ts +26 -23
  115. package/src/execution/__tests__/spawn-event-adapter.test.ts +3 -3
  116. package/src/execution/__tests__/spawn-worktree-guidance.test.ts +5 -4
  117. package/src/execution/__tests__/spawned-children.test.ts +2 -1
  118. package/src/execution/__tests__/start-collect-guard.test.ts +255 -0
  119. package/src/execution/__tests__/start-sync-model-guard.test.ts +5 -5
  120. package/src/execution/__tests__/stdin-writer.test.ts +6 -4
  121. package/src/execution/__tests__/stream-sink-retirement.test.ts +6 -6
  122. package/src/execution/__tests__/subagent-actions-core.test.ts +48 -22
  123. package/src/execution/__tests__/subagent-service-message-close.test.ts +29 -26
  124. package/src/execution/__tests__/subagent-service-multiproc-guard.test.ts +21 -8
  125. package/src/execution/__tests__/subagent-service-notify-gate.test.ts +27 -22
  126. package/src/execution/__tests__/subagent-service-parent-guard.test.ts +30 -29
  127. package/src/execution/__tests__/subagent-service-recovery-bounds.test.ts +45 -20
  128. package/src/execution/__tests__/subagent-service.test.ts +37 -30
  129. package/src/execution/__tests__/subprocess-agent-runner-routing.test.ts +88 -12
  130. package/src/execution/__tests__/subprocess-agent-runner-timeout.test.ts +75 -0
  131. package/src/execution/__tests__/subprocess-agent-runner.test.ts +22 -20
  132. package/src/execution/__tests__/sync-collect-recovery.test.ts +1117 -0
  133. package/src/execution/__tests__/temp-prompt.test.ts +1 -1
  134. package/src/execution/__tests__/timeout-integration.test.ts +6 -5
  135. package/src/execution/__tests__/tombstone-store.test.ts +1 -1
  136. package/src/execution/__tests__/turn-limiter-semantics.test.ts +1 -1
  137. package/src/execution/__tests__/turn-limiter.test.ts +1 -1
  138. package/src/execution/__tests__/ui-request-handler-factory.test.ts +12 -6
  139. package/src/execution/__tests__/ui-request-handler.test.ts +4 -3
  140. package/src/execution/__tests__/ui-request-queue.test.ts +142 -2
  141. package/src/execution/__tests__/worktree-git-ops.test.ts +1 -1
  142. package/src/execution/__tests__/worktree-manager.test.ts +14 -5
  143. package/src/execution/__tests__/worktree-pid-registration.integration.test.ts +4 -3
  144. package/src/execution/__tests__/worktree-reconcile-aging.test.ts +2 -2
  145. package/src/execution/__tests__/worktree-reconcile.integration.test.ts +1 -1
  146. package/src/execution/__tests__/worktree-registry.test.ts +1 -1
  147. package/src/execution/agent-registry.ts +74 -30
  148. package/src/execution/agent-result-mapper.ts +3 -0
  149. package/src/execution/cold-resurrect.ts +199 -0
  150. package/src/execution/collect-coordinator.ts +200 -0
  151. package/src/execution/config.ts +77 -5
  152. package/src/execution/engine/__tests__/common/capability-gate.test.ts +91 -0
  153. package/src/execution/engine/__tests__/common/data-dir.test.ts +1 -1
  154. package/src/execution/engine/__tests__/common/event-journal.test.ts +1 -1
  155. package/src/execution/engine/__tests__/common/journal-wiring.test.ts +84 -0
  156. package/src/execution/engine/__tests__/common/kill-chain.test.ts +34 -7
  157. package/src/execution/engine/__tests__/common/persona-router.test.ts +4 -5
  158. package/src/execution/engine/__tests__/common/pool-manager.test.ts +213 -53
  159. package/src/execution/engine/__tests__/common/session-view-service-zcode-dbpath.test.ts +149 -0
  160. package/src/execution/engine/__tests__/common/session-view-service.test.ts +499 -0
  161. package/src/execution/engine/__tests__/conformance/contract.abort.test.ts +22 -112
  162. package/src/execution/engine/__tests__/conformance/contract.agent-events.test.ts +15 -28
  163. package/src/execution/engine/__tests__/conformance/contract.read-degradation.test.ts +1 -1
  164. package/src/execution/engine/__tests__/conformance/engine-conformance.live.test.ts +12 -12
  165. package/src/execution/engine/__tests__/conformance/golden-replay.pi.test.ts +2 -2
  166. package/src/execution/engine/__tests__/conformance/golden-replay.zcode.test.ts +21 -82
  167. package/src/execution/engine/__tests__/conformance/zcode-appserver-harness.ts +4 -7
  168. package/src/execution/engine/__tests__/engine-discovery.test.ts +15 -3
  169. package/src/execution/engine/__tests__/model-prompt.test.ts +15 -3
  170. package/src/execution/engine/__tests__/registry.test.ts +4 -2
  171. package/src/execution/engine/__tests__/routing.test.ts +115 -6
  172. package/src/execution/engine/common/capability-gate.ts +92 -0
  173. package/src/execution/engine/common/journal-wiring.ts +97 -0
  174. package/src/execution/engine/common/kill-chain.ts +42 -10
  175. package/src/execution/engine/common/nesting-guard.ts +66 -0
  176. package/src/execution/engine/common/persona-router.ts +18 -8
  177. package/src/execution/engine/common/pool-manager.ts +332 -78
  178. package/src/execution/engine/common/session-view-service.ts +506 -0
  179. package/src/execution/engine/common/session-view-types.ts +125 -0
  180. package/src/execution/engine/engines/pi/__tests__/pi-engine.test.ts +174 -28
  181. package/src/execution/engine/engines/pi/__tests__/spawn-opts-direct.test.ts +257 -0
  182. package/src/execution/{argv-mirror.ts → engine/engines/pi/argv-mirror.ts} +43 -21
  183. package/src/execution/{get-state-handshake.ts → engine/engines/pi/get-state-handshake.ts} +1 -1
  184. package/src/execution/{output-collector.ts → engine/engines/pi/output-collector.ts} +108 -19
  185. package/src/execution/engine/engines/pi/pi-engine.ts +434 -38
  186. package/src/execution/{pi-invocation.ts → engine/engines/pi/pi-invocation.ts} +2 -2
  187. package/src/execution/engine/engines/pi/reader.ts +11 -0
  188. package/src/execution/engine/engines/pi/registration.ts +4 -2
  189. package/src/execution/{session-runner.ts → engine/engines/pi/session-runner.ts} +617 -412
  190. package/src/execution/{spawn-event-adapter.ts → engine/engines/pi/spawn-event-adapter.ts} +75 -34
  191. package/src/execution/{stdin-writer.ts → engine/engines/pi/stdin-writer.ts} +10 -9
  192. package/src/execution/{temp-prompt.ts → engine/engines/pi/temp-prompt.ts} +2 -2
  193. package/src/execution/{turn-limiter.ts → engine/engines/pi/turn-limiter.ts} +1 -1
  194. package/src/execution/engine/engines/zcode/__tests__/__fixtures__/fake-appserver.mjs +54 -27
  195. package/src/execution/engine/engines/zcode/__tests__/appserver-launcher.test.ts +321 -0
  196. package/src/execution/engine/engines/zcode/__tests__/connection.test.ts +13 -12
  197. package/src/execution/engine/engines/zcode/__tests__/parser.test.ts +7 -210
  198. package/src/execution/engine/engines/zcode/__tests__/preparer.test.ts +6 -110
  199. package/src/execution/engine/engines/zcode/__tests__/session-channel-dispose-harvest.test.ts +247 -0
  200. package/src/execution/engine/engines/zcode/__tests__/session-channel-turn-timers.test.ts +451 -0
  201. package/src/execution/engine/engines/zcode/__tests__/session-channel.test.ts +20 -8
  202. package/src/execution/engine/engines/zcode/__tests__/zcode-engine-appserver.test.ts +77 -110
  203. package/src/execution/engine/engines/zcode/__tests__/zcode-engine-degrade.test.ts +26 -320
  204. package/src/execution/engine/engines/zcode/__tests__/zcode-engine-dispose.test.ts +210 -0
  205. package/src/execution/engine/engines/zcode/__tests__/zcode-engine-retry.test.ts +353 -0
  206. package/src/execution/engine/engines/zcode/__tests__/zcode-engine-status.test.ts +282 -0
  207. package/src/execution/engine/engines/zcode/__tests__/zcode-engine-timeout.test.ts +372 -0
  208. package/src/execution/engine/engines/zcode/__tests__/zcode-engine.live.test.ts +48 -148
  209. package/src/execution/engine/engines/zcode/appserver-launcher.ts +167 -0
  210. package/src/execution/engine/engines/zcode/connection.ts +24 -11
  211. package/src/execution/engine/engines/zcode/constants.ts +75 -71
  212. package/src/execution/engine/engines/zcode/golden-sample.ts +8 -46
  213. package/src/execution/engine/engines/zcode/parser.ts +12 -346
  214. package/src/execution/engine/engines/zcode/preparer.ts +12 -143
  215. package/src/execution/engine/engines/zcode/session-channel.ts +351 -39
  216. package/src/execution/engine/engines/zcode/zcode-engine.ts +665 -760
  217. package/src/execution/engine/host-task-spec.ts +32 -36
  218. package/src/execution/engine/model-validation.ts +177 -0
  219. package/src/execution/engine/port.ts +24 -6
  220. package/src/execution/engine/routing.ts +75 -1
  221. package/src/execution/engine/types.ts +30 -103
  222. package/src/execution/execution-record.ts +229 -144
  223. package/src/execution/finalize-record.ts +141 -99
  224. package/src/execution/idle-gc.ts +28 -0
  225. package/src/execution/lifecycle-predicates.ts +1 -1
  226. package/src/execution/notifier.ts +234 -25
  227. package/src/execution/notify-host.ts +232 -0
  228. package/src/execution/record-entry.ts +16 -0
  229. package/src/execution/record-store.ts +280 -103
  230. package/src/execution/round-settlement.ts +93 -0
  231. package/src/execution/session-file-gc.ts +96 -62
  232. package/src/execution/session-reconstructor.ts +256 -143
  233. package/src/execution/sessions-index.ts +117 -47
  234. package/src/execution/settled-watchdog.ts +264 -52
  235. package/src/execution/subagent-actions-core.ts +84 -28
  236. package/src/execution/subagent-service.ts +1225 -964
  237. package/src/execution/subprocess-agent-runner.ts +144 -97
  238. package/src/execution/sync-rebuild.ts +87 -0
  239. package/src/execution/types.ts +72 -0
  240. package/src/execution/ui-request-handler-factory.ts +102 -74
  241. package/src/execution/ui-request-queue.ts +50 -19
  242. package/src/index.ts +442 -316
  243. package/src/orchestration/__tests__/agent-call-catch-fallback.test.ts +1 -1
  244. package/src/orchestration/__tests__/agent-call-stream.test.ts +2 -2
  245. package/src/orchestration/__tests__/args-validator.test.ts +14 -0
  246. package/src/orchestration/__tests__/config-loader.test.ts +1 -1
  247. package/src/orchestration/__tests__/error-recovery-rebuild-failure.test.ts +1 -1
  248. package/src/orchestration/__tests__/error-recovery-terminal-hardening.test.ts +11 -9
  249. package/src/orchestration/__tests__/execute-agent-call.test.ts +151 -11
  250. package/src/orchestration/__tests__/file-run-store-prune.test.ts +1 -1
  251. package/src/orchestration/__tests__/file-run-store-throttle.test.ts +1 -1
  252. package/src/orchestration/__tests__/file-run-store.test.ts +7 -6
  253. package/src/orchestration/__tests__/launcher-nested-workflow.test.ts +2 -2
  254. package/src/orchestration/__tests__/lifecycle-abort-broadcast-signal.test.ts +1 -1
  255. package/src/orchestration/__tests__/lifecycle-runid-injection.test.ts +3 -3
  256. package/src/orchestration/__tests__/lifecycle.test.ts +7 -5
  257. package/src/orchestration/__tests__/non-cloneable-return-e2e.test.ts +1 -1
  258. package/src/orchestration/__tests__/review-fix-loop-scriptpath-failfast.test.ts +1 -1
  259. package/src/orchestration/__tests__/run-snapshot.test.ts +8 -5
  260. package/src/orchestration/__tests__/script-generate.test.ts +5 -5
  261. package/src/orchestration/__tests__/script-lint.test.ts +17 -0
  262. package/src/orchestration/__tests__/skill-discovery.test.ts +2 -2
  263. package/src/orchestration/__tests__/test-mocks.ts +2 -0
  264. package/src/orchestration/__tests__/worker-exit-without-result.test.ts +7 -6
  265. package/src/orchestration/__tests__/worker-message-pump-finalize-run.test.ts +229 -0
  266. package/src/orchestration/__tests__/{error-recovery-handlers.test.ts → worker-message-pump-handlers.test.ts} +27 -19
  267. package/src/orchestration/__tests__/{error-recovery-postmessage-defense.test.ts → worker-message-pump-postmessage-defense.test.ts} +8 -8
  268. package/src/orchestration/__tests__/{error-recovery-serialize-failed-result.test.ts → worker-message-pump-serialize-failed-result.test.ts} +2 -2
  269. package/src/orchestration/__tests__/{error-recovery-workflow-call.test.ts → worker-message-pump-workflow-call.test.ts} +1 -1
  270. package/src/orchestration/__tests__/worker-pending-timeout-abort.test.ts +1 -1
  271. package/src/orchestration/__tests__/worker-script-builder.test.ts +1 -1
  272. package/src/orchestration/__tests__/workflow-files.test.ts +10 -10
  273. package/src/orchestration/__tests__/workflow-nesting-e2e.test.ts +1 -1
  274. package/src/orchestration/__tests__/workflow-script-registry-impl.test.ts +1 -1
  275. package/src/orchestration/agent-opts-resolver.ts +1 -1
  276. package/src/orchestration/args-validator.ts +53 -31
  277. package/src/orchestration/execute-agent-call.ts +19 -73
  278. package/src/orchestration/launcher.ts +128 -81
  279. package/src/orchestration/lifecycle.ts +43 -45
  280. package/src/orchestration/models/ports.ts +4 -4
  281. package/src/orchestration/models/run-runtime.ts +2 -2
  282. package/src/orchestration/models/trace.ts +1 -1
  283. package/src/orchestration/models/types.ts +111 -22
  284. package/src/orchestration/models/workflow-run.ts +1 -1
  285. package/src/orchestration/script-lint.ts +91 -58
  286. package/src/orchestration/{error-recovery.ts → worker-message-pump.ts} +157 -150
  287. package/src/shared/__tests__/atomic-write.test.ts +1 -1
  288. package/src/shared/__tests__/meta-parser.test.ts +151 -0
  289. package/src/shared/__tests__/resource-discovery-host-roots.test.ts +5 -5
  290. package/src/shared/__tests__/resource-discovery.test.ts +258 -215
  291. package/src/shared/atomic-write.ts +12 -9
  292. package/src/shared/meta-parser.ts +158 -84
  293. package/src/shared/model-ref.ts +15 -2
  294. package/src/shared/resource-discovery.ts +9 -183
  295. package/src/shared/schema-jsonify.ts +1 -1
  296. package/workflows/review-fix-loop-utils.cjs +151 -89
  297. package/workflows/review-fix-loop-utils.d.cts +287 -0
  298. package/src/execution/__tests__/execute-options-mapper.test.ts +0 -200
  299. package/src/execution/engine/engines/pi/__tests__/task-spec-mapper.test.ts +0 -164
  300. package/src/execution/engine/engines/pi/task-spec-mapper.ts +0 -100
  301. package/src/execution/engine/engines/zcode/__tests__/__fixtures__/zcode-golden-spawn.json +0 -39
  302. package/src/execution/engine/engines/zcode/__tests__/launcher.test.ts +0 -150
  303. package/src/execution/engine/engines/zcode/__tests__/preparer-appserver.test.ts +0 -387
  304. package/src/execution/engine/engines/zcode/__tests__/zcode-engine.test.ts +0 -710
  305. package/src/execution/engine/engines/zcode/appserver-home.ts +0 -442
  306. package/src/execution/engine/engines/zcode/appserver-probe.ts +0 -141
  307. package/src/execution/engine/engines/zcode/launcher.ts +0 -161
  308. package/src/execution/execute-options-mapper.ts +0 -115
  309. package/src/shared/__tests__/resource-discovery-manifest-cache.test.ts +0 -288
@@ -0,0 +1,232 @@
1
+ // [D4-① 通知簇职责轴] background 完成通知的 host 面——原 SubagentService 私有通知簇
2
+ // (notifyComplete / notifyClosed / piAdapter / toNotifyRecord / emitPendingRegister /
3
+ // emitPendingUnregister + notifier 实例持有)整体搬移至此(行为逐字节等价:搬移 +
4
+ // 依赖注入,不重写逻辑)。变化轴:改通知文案 / dedup 身份 / 放行守卫 / pending 注册
5
+ // 注销协议,只改本文件;Service 只保留编排与依赖注入(getPi / listRunning / isIdle)。
6
+
7
+ import { displayAgentName } from "../shared/agent-ref.ts";
8
+ import { snapshot } from "./execution-record.ts";
9
+ import { hasIdleTimer } from "./lifecycle-manager.ts";
10
+ import { hasLiveProcessHandle, isIdle, isResumable } from "./lifecycle-predicates.ts";
11
+ import type { BgNotifier, BatchBudgetParams, NotifierHost } from "./notifier.ts";
12
+ import { createNotifier } from "./notifier.ts";
13
+ import type { BgNotifyRecord } from "./notifier.ts";
14
+ import type { ExecutionRecord, RecordSnapshot } from "./types.ts";
15
+
16
+ /** Pi ExtensionAPI 的最小接口(duck-typed)——原定义于 subagent-service.ts,随通知簇
17
+ * (piAdapter / emitPending* 的依赖)搬移至此并导出(Service 的 session 注入参数仍引用)。
18
+ * subagent-service 直接调 pi.sendMessage 发 background 完成通知(BgNotifier 滑动窗口合并),
19
+ * 不委托 pending-notifications EventBus 中继——后者只管 registry 不参与通知发送。 */
20
+ export interface PiLike {
21
+ appendEntry(customType: string, data?: unknown): void;
22
+ events: { emit(channel: string, data: unknown): void };
23
+ sendMessage(
24
+ message: { customType: string; content: string; display: boolean; details?: unknown },
25
+ options?: { triggerTurn?: boolean; deliverAs?: "steer" | "followUp" | "nextTurn" }, // g4-allow: 类型注解——PiLike 接口形状(pi.sendMessage 签面子集),非投递调用
26
+ ): void;
27
+ /** 订阅 pi 事件(D8:notifier 的 settled 边沿订阅用 'agent_settled')。
28
+ * pi 0.84.1 的 on 返回 void 且无 off——退订语义由调用侧 disposed 标志包装兑现。
29
+ * 可选:旧测试 mock pi 可能未实现 on,缺省时 notifier 退化为内核退避路径。 */
30
+ on?(event: "agent_settled", handler: () => void): void;
31
+ }
32
+
33
+ /** NotifyHost 的依赖注入(Service 侧供给,全部惰性求值——pi/session 级状态运行时可变)。 */
34
+ export interface NotifyHostDeps {
35
+ /** 当前 pi session handle(session_start 注入 / shutdown 置 null)。 */
36
+ getPi: () => PiLike | null;
37
+ /** store 的 running record 快照(piAdapter.hasRunningBackground 用)。 */
38
+ listRunning: () => RecordSnapshot[];
39
+ /** 主 agent isIdle 查询(ctx.isIdle,initSession 注入;未注入时 undefined)。 */
40
+ getIsIdle: () => (() => boolean) | undefined;
41
+ }
42
+
43
+ /** 通知簇 host 面(Service 经此消费;notifier 实例封装在内部不外露)。 */
44
+ export interface NotifyHost {
45
+ /** background 完成回注(原 Service.notifyComplete)。 */
46
+ notifyComplete(record: ExecutionRecord): void;
47
+ /** [C-1] chatMode close 终态通知(原 Service.notifyClosed)。 */
48
+ notifyClosed(record: ExecutionRecord, emptyBody?: boolean): void;
49
+ /** pending-notifications 注册(原模块函数 emitPendingRegister,pi 经 deps 取)。 */
50
+ emitPendingRegister(id: string, name?: string): void;
51
+ /** pending-notifications 注销(原模块函数 emitPendingUnregister)。 */
52
+ emitPendingUnregister(id: string, reason: string): void;
53
+ /** [sync-collect U2 合并] record → BgNotifyRecord 映射——collectCoordinator 的
54
+ * toNotifyRecord/notifyAsync 依赖注入消费(守卫放行逻辑单一权威在本文件)。 */
55
+ toNotifyRecord(record: ExecutionRecord): BgNotifyRecord | undefined;
56
+ /** [sync-collect 合并] 单条直发——collectCoordinator notifyAsync 与 E9 dispose
57
+ * 转换路径消费(已越过 toNotifyRecord 守卫的成品通知)。 */
58
+ notify(record: BgNotifyRecord): void;
59
+ /** [sync-collect 合并] sync 批投递——collectCoordinator flushBatch 与 E1 补发消费。 */
60
+ notifyBatch(records: readonly BgNotifyRecord[], budget?: BatchBudgetParams): boolean;
61
+ /** dispose 的逆操作(initSession 复活,原 notifier.revive 委托)。 */
62
+ revive(): void;
63
+ /** dispose 前冲刷待发通知(原 notifier.flushPendingNotifications 委托)。 */
64
+ flushPendingNotifications(): void;
65
+ /** 丢弃 pending 通知(原 notifier.dispose 委托)。 */
66
+ dispose(): void;
67
+ }
68
+
69
+ /** pending-notifications 注册/注销 helper(避免重复代码)。
70
+ * name 是 GUI pending 通知的显示名——取 basename 短名(displayAgentName),
71
+ * 完整路径仍走 record.agent(env 注入 / 持久化)。 */
72
+ function emitPendingRegister(pi: PiLike | null, id: string, name?: string): void {
73
+ pi?.events.emit("pending:register", {
74
+ id,
75
+ type: "subagent",
76
+ name: name ? displayAgentName(name) : id,
77
+ });
78
+ }
79
+
80
+ function emitPendingUnregister(
81
+ pi: PiLike | null,
82
+ id: string,
83
+ reason: string,
84
+ ): void {
85
+ pi?.events.emit("pending:unregister", {
86
+ id,
87
+ reason,
88
+ });
89
+ }
90
+
91
+ /** 通知簇工厂:notifier 实例随本函数创建并封装(原 Service 构造器
92
+ * `createNotifier(this.piAdapter())` 的等价形态)。 */
93
+ export function createNotifyHost(deps: NotifyHostDeps): NotifyHost {
94
+ /** notifier 的 NotifierHost 适配器(绑定到 pi.sendMessage + store 查询)。 */
95
+ const piAdapter = (): NotifierHost => {
96
+ return {
97
+ sendMessage: (message, options) => {
98
+ deps.getPi()?.sendMessage(message, options);
99
+ },
100
+ hasRunningBackground: () => {
101
+ // [M3] 「在跑的 background 工作」= 有活进程且非等待续聊(idle timer armed)。
102
+ // v4 B-1 把旧 idle 折入 running 且 record 留 store:轮次完成的 chatMode record
103
+ // (timer armed、无在跑轮)与 one-shot 完成后等待 message 升级的 record 都不再计入。
104
+ // 旧判定 `mode === "background"` 对这两类恒 true → 轮次完成通知恒挂 60s 合并窗口
105
+ // (notifier MERGE_WINDOW_MS),主 agent 的续聊回复固定延迟 60s 送达,持续对话(G1)失效。
106
+ return deps.listRunning().some(
107
+ (r) => r.mode === "background" && hasLiveProcessHandle(r.id) && !hasIdleTimer(r.id),
108
+ );
109
+ },
110
+ isIdle: () => deps.getIsIdle()?.() ?? true,
111
+ // [must-fix #4 / D8] settled 边沿订阅,与 isIdle 同源(session_start 注入的 pi)。
112
+ // 只注入原生订阅能力;disposed 标志包装(退订语义)在 notifier 的 port 装配完成。
113
+ onAgentSettled: (handler) => { deps.getPi()?.on?.("agent_settled", handler); },
114
+ };
115
+ };
116
+
117
+ const notifier: BgNotifier = createNotifier(piAdapter());
118
+
119
+ /** record → BgNotifyRecord(notifier.notify 入参映射,内部不外露)。
120
+ * v4 B-1:守卫放行 closed(终态,含 cancelled)、isIdle(对话模式轮次完成,notify 主 agent G1)
121
+ * 或 isResumable(running + 无活进程——SP-5 one-shot 成功完成 / MF-6 失败轮回退)。
122
+ * 正在执行(running + 活进程 + 非 timer-armed)返回 undefined(调用方 notifyComplete 跳过)。
123
+ * SP-1: closed 统一终态,closedReason 由 BgNotifyRecord 携带。 */
124
+ const toNotifyRecord = (record: ExecutionRecord): BgNotifyRecord | undefined => {
125
+ const snap = snapshot(record);
126
+ const s = snap.status;
127
+ // [N1] isResumable 放行:SP-5 one-shot 成功完成后 finalizeRoundToIdle 把 record 回退
128
+ // running-resumable——进程已死且永不 arm idle timer(armIdleTimer 只在 agent_settled 的
129
+ // chatMode 分支调用),旧守卫(closed / isIdle only)对其恒拒绝 → 完成通知静默丢失,
130
+ // 而 one-shot 失败走 finalizeRecord 保持 closed 反而通知——与 tool 契约「runs once,
131
+ // notifies on completion」完全倒置。isResumable = running + 无活进程,恰为该完成态;
132
+ // 在跑轮的 record 有活进程,不会被误放行。
133
+ if (s !== "closed" && !isIdle(record) && !isResumable(record)) return undefined;
134
+ // closed → BgNotifyRecord.closed(cancelled 区分靠 closedReason);chatMode 的 isIdle/
135
+ // isResumable(轮次完成或 MF-6 失败轮回退,对话可续)→ running(轮次完成)。
136
+ // isResumable 且非 chatMode(SP-5 one-shot 成功完成)→ closed:对主 agent 的语义是
137
+ // completed(非对话轮次),且只有 closed 分支文案携带 worktree patchFile 的 git apply
138
+ // 提示——one-shot worktree 模式的改动回收依赖该提示(running 分支文案不含 patchFile)。
139
+ const notifyStatus: BgNotifyRecord["status"] =
140
+ s === "closed" || !record.chatMode ? "closed" : "running";
141
+ return {
142
+ id: snap.id,
143
+ status: notifyStatus,
144
+ agent: snap.agent,
145
+ model: snap.model,
146
+ result: snap.result,
147
+ error: snap.error,
148
+ startedAt: snap.startedAt,
149
+ endedAt: snap.endedAt,
150
+ patchFile: record.patchFile,
151
+ // round 透传给 notifier 的 dedup key(对话模式按轮次去重,G1 决策 9)。
152
+ round: record.round,
153
+ // SP-1: closedReason 透传给 notifier(L2 原因,供通知文案按需展示)。
154
+ closedReason: record.closedReason,
155
+ // [wave2] chatMode 条件透传 sessionFile:通知末尾追加 Full transcript 指针行
156
+ //(增量语义的全文恢复通道,见 notifier.buildLlmContent)。one-shot(chatMode
157
+ // falsy)不透传——通知输出逐字节不变(G4),该条件由 message-close 测试的
158
+ // 必选用例锁死(漏加条件时 notifier 单测不红——notifier 层只见最终字段)。
159
+ sessionFile: record.chatMode ? record.sessionFile : undefined,
160
+ };
161
+ };
162
+
163
+ return {
164
+ /** background 完成回注(record → BgNotifyRecord 映射 + notifier.notify)。
165
+ * 正在执行(running + 活进程 + 非 timer-armed)静默跳过——notify 只对 closed(终态)、
166
+ * isIdle(chatMode 轮次完成)或 isResumable(SP-5 one-shot 成功完成 / MF-6 失败轮回退)有意义。
167
+ * SP-1: closed 统一终态(done/failed/crashed 合并),closedReason 携带 L2 原因。 */
168
+ notifyComplete(record: ExecutionRecord): void {
169
+ const notify = toNotifyRecord(record);
170
+ if (notify) notifier.notify(notify);
171
+ },
172
+
173
+ /** [C-1] chatMode close 终态通知(设计 D2:正文空/本轮增量 + sessionFile 指针行)。
174
+ *
175
+ * 与 notifyComplete 的差异只在 dedup 身份与轮次统计:终态通知必须与最后一轮的轮次通知
176
+ * 区分(轮次通知 key=`id:round`),否则同 key 被 60s dedup 吞——close 后父 agent 永远
177
+ * 收不到带指针行的终态通知(审查 C-1)。故 round 置 undefined(key 回退为裸 id),
178
+ * 轮数改经 totalRounds 进文案 "completed after N rounds."(C-2)。
179
+ *
180
+ * 仅 chatMode close 语义调用(closeChatIdle / closeAfterRoundSettled 终态化成功后)。
181
+ * one-shot 显式拒绝(G4:one-shot close 路径现状无终态通知,字节不变);cancel 走
182
+ * cancelBackground 自己的 notifyComplete,不经本方法。幂等性:两条 close 路径均由
183
+ * closeSubagent 的 status 分流守卫(closed 后幂等 no-op)/ CAS 抢锁保证只执行一次,
184
+ * 本方法自身不重复发送;迟到的轮次收尾 .then 通知与轮次通知同 key=`id:round`,
185
+ * 60s 窗内仍被吞,不构成第三条。 */
186
+ /** @param emptyBody true = 终态通知正文置空串(D2 路径②)。W16 P-1 修复后
187
+ * closeChatIdle 的 doneResult.text 改用 record.result 保真(close 终态
188
+ * subagent-record entry 的 result 不抹空轮终真实值),「正文空」不再由合成空
189
+ * text 的副作用承载,改为显式参数——持久化 result 与通知正文两个关注点解耦。 */
190
+ notifyClosed(record: ExecutionRecord, emptyBody = false): void {
191
+ if (!record.chatMode) return;
192
+ const notify = toNotifyRecord(record);
193
+ if (!notify) return;
194
+ notify.round = undefined;
195
+ if (emptyBody) notify.result = "";
196
+ if (record.round != null) notify.totalRounds = record.round;
197
+ notifier.notify(notify);
198
+ },
199
+
200
+ emitPendingRegister(id: string, name?: string): void {
201
+ emitPendingRegister(deps.getPi(), id, name);
202
+ },
203
+
204
+ emitPendingUnregister(id: string, reason: string): void {
205
+ emitPendingUnregister(deps.getPi(), id, reason);
206
+ },
207
+
208
+ toNotifyRecord(record: ExecutionRecord): BgNotifyRecord | undefined {
209
+ return toNotifyRecord(record);
210
+ },
211
+
212
+ notify(record: BgNotifyRecord): void {
213
+ notifier.notify(record);
214
+ },
215
+
216
+ notifyBatch(records: readonly BgNotifyRecord[], budget?: BatchBudgetParams): boolean {
217
+ return notifier.notifyBatch(records, budget);
218
+ },
219
+
220
+ revive(): void {
221
+ notifier.revive();
222
+ },
223
+
224
+ flushPendingNotifications(): void {
225
+ notifier.flushPendingNotifications();
226
+ },
227
+
228
+ dispose(): void {
229
+ notifier.dispose();
230
+ },
231
+ };
232
+ }
@@ -97,6 +97,18 @@ export interface SubagentRecordEntryData {
97
97
  * 透传不枚举内部键(zcode = { sessionId, dbPath });缺省 = pi(存量 entry 零迁移)。
98
98
  */
99
99
  engineHandle?: { sessionRef: Record<string, string>; journalPath?: string; poolKey: string };
100
+ /**
101
+ * 同步收集模式标记(subagent-sync-collect 设计 §3.1.3,U1 foundation)。
102
+ * undefined = async(缺省语义,旧 entry 零迁移——undefined 经 JSON.stringify 自然缺省)。
103
+ * 消费方:U5 rebuildEntryRecord 投影扩展 + E1 重建扫描。
104
+ */
105
+ collectMode?: "sync";
106
+ /**
107
+ * 离开批终局标记(subagent-sync-collect 设计 §3.1.3,U1 foundation)。两出口统一
108
+ * 落标(批闭合 flush / E9 dispose 转换,均 appendEntry 持久化)。undefined =
109
+ * 未离开批 / 旧 entry 零迁移。消费方:U5 E1 重建扫描只收无标记成员(防双重通知)。
110
+ */
111
+ batchFinalized?: boolean;
100
112
  }
101
113
 
102
114
  /** SubagentRecord → 自描述 entry data(快照投影,不 mutate 源)。
@@ -134,5 +146,9 @@ export function toSubagentRecordEntry(record: SubagentRecord): SubagentRecordEnt
134
146
  engine: record.engine,
135
147
  engineFallback: record.engineFallback,
136
148
  engineHandle: record.engineHandle,
149
+ // 同步收集两字段(U1 foundation):undefined 经 JSON.stringify 自然缺省,
150
+ // 旧记录/旧 entry 序列化产物字节不变(零迁移)。
151
+ collectMode: record.collectMode,
152
+ batchFinalized: record.batchFinalized,
137
153
  };
138
154
  }