@zhushanwen/subagent-core 0.2.0 → 0.5.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 (347) hide show
  1. package/README.md +45 -2
  2. package/agents/analyst.md +60 -0
  3. package/agents/coder.md +69 -0
  4. package/agents/debugger.md +66 -0
  5. package/agents/doc-reviewer.md +49 -0
  6. package/agents/explorer.md +63 -0
  7. package/agents/general-purpose.md +32 -0
  8. package/agents/orchestrator.md +61 -0
  9. package/agents/planner.md +53 -0
  10. package/agents/researcher.md +67 -0
  11. package/agents/reviewer.md +73 -0
  12. package/dist/chunk-43ONBFZX.js +240 -0
  13. package/dist/chunk-APZY4IME.js +27 -0
  14. package/dist/chunk-V3VHZ2VX.js +59 -0
  15. package/dist/execution/engine/engines/zcode/constants.cjs +62 -9
  16. package/dist/execution/engine/engines/zcode/constants.d.cts +116 -12
  17. package/dist/execution/engine/engines/zcode/constants.d.ts +116 -12
  18. package/dist/execution/engine/engines/zcode/constants.js +39 -7
  19. package/dist/execution/engine/engines/zcode/reader.d.cts +2 -1
  20. package/dist/execution/engine/engines/zcode/reader.d.ts +2 -1
  21. package/dist/execution/engine/engines/zcode/reader.js +4 -234
  22. package/dist/execution/engine/paths.js +7 -19
  23. package/dist/index.cjs +18234 -1277
  24. package/dist/index.d.cts +5646 -673
  25. package/dist/index.d.ts +5646 -673
  26. package/dist/index.js +17828 -1277
  27. package/dist/{types-BxyAidGf.d.cts → types-Dv4QhSJ_.d.cts} +678 -112
  28. package/dist/{types-BxyAidGf.d.ts → types-Dv4QhSJ_.d.ts} +678 -112
  29. package/package.json +7 -4
  30. package/src/__tests__/agent-opts-resolver-schema-prompt.test.ts +0 -1
  31. package/src/__tests__/append-system-prompt-assembly.test.ts +8 -7
  32. package/src/__tests__/fr4-get-state-handshake.test.ts +2 -2
  33. package/src/__tests__/m2-append-content-probe.test.ts +0 -1
  34. package/src/__tests__/manifest-store.test.ts +10 -9
  35. package/src/__tests__/record-store-cache.test.ts +0 -2
  36. package/src/__tests__/record-store-index.test.ts +1 -2
  37. package/src/__tests__/review-fix-loop-script.test.ts +93 -3
  38. package/src/__tests__/review-fix-loop-utils.test.ts +31 -10
  39. package/src/__tests__/robustness-low-batch1.test.ts +6 -5
  40. package/src/__tests__/robustness-medium-batch1.test.ts +2 -2
  41. package/src/__tests__/robustness-medium-batch2.test.ts +17 -6
  42. package/src/__tests__/robustness-medium-batch4.test.ts +2 -2
  43. package/src/__tests__/session-runner.test.ts +1 -1
  44. package/src/__tests__/smoke.test.ts +9 -2
  45. package/src/core/__tests__/host-services.test.ts +2 -2
  46. package/src/core/__tests__/logger.test.ts +1 -1
  47. package/src/core/error-message.ts +9 -0
  48. package/src/core/host-services.ts +21 -5
  49. package/src/core/notify-ports.ts +18 -5
  50. package/src/execution/__tests__/agent-profile.test.ts +232 -0
  51. package/src/execution/__tests__/agent-registry.test.ts +370 -0
  52. package/src/execution/__tests__/agent-result-mapper.test.ts +18 -2
  53. package/src/execution/__tests__/agents-assembly.test.ts +219 -0
  54. package/src/execution/__tests__/ask-user-transit-e2e.test.ts +6 -6
  55. package/src/execution/__tests__/chat-engine-routing.test.ts +136 -30
  56. package/src/execution/__tests__/chatmode-first-round-closure-spawn.test.ts +5 -4
  57. package/src/execution/__tests__/cold-resurrect.test.ts +283 -0
  58. package/src/execution/__tests__/create-concurrency-pool.test.ts +194 -0
  59. package/src/execution/__tests__/delivery-methods.test.ts +77 -62
  60. package/src/execution/__tests__/descendant-sweep-guards.test.ts +220 -0
  61. package/src/execution/__tests__/descendant-sweep.test.ts +269 -0
  62. package/src/execution/__tests__/dialog-queue.test.ts +199 -1
  63. package/src/execution/__tests__/engine-model-validation.test.ts +741 -0
  64. package/src/execution/__tests__/epipe-fallback.test.ts +31 -24
  65. package/src/execution/__tests__/execute-and-await-worktree.test.ts +21 -91
  66. package/src/execution/__tests__/execute-nesting.test.ts +34 -188
  67. package/src/execution/__tests__/execution-record.test.ts +217 -60
  68. package/src/execution/__tests__/execution-runtime-face.test.ts +272 -0
  69. package/src/execution/__tests__/explicit-agent-ref-guard.test.ts +3 -3
  70. package/src/execution/__tests__/finalize-record.test.ts +278 -16
  71. package/src/execution/__tests__/gc-timer.test.ts +57 -2
  72. package/src/execution/__tests__/get-record-for-action-restart.test.ts +14 -12
  73. package/src/execution/__tests__/get-state-handshake.test.ts +127 -0
  74. package/src/execution/__tests__/helpers/mock-extension-api.ts +1 -1
  75. package/src/execution/__tests__/helpers/session-runner-mocks.ts +113 -0
  76. package/src/execution/__tests__/helpers/spawn-mock.ts +150 -3
  77. package/src/execution/__tests__/helpers/subagent-service-mocks.ts +137 -0
  78. package/src/execution/__tests__/keep-alive-no-progress.test.ts +280 -0
  79. package/src/execution/__tests__/kill-all-escalation.test.ts +196 -0
  80. package/src/execution/__tests__/lifecycle-manager-idle-timer-identity.test.ts +117 -0
  81. package/src/execution/__tests__/lifecycle-manager.test.ts +39 -0
  82. package/src/execution/__tests__/lifecycle-predicates.test.ts +1 -2
  83. package/src/execution/__tests__/manifest-parentid.test.ts +4 -4
  84. package/src/execution/__tests__/manifest-store-tmp-recovery.test.ts +99 -0
  85. package/src/execution/__tests__/max-turns-to-watchdog-ms.test.ts +113 -0
  86. package/src/execution/__tests__/model-resolver.test.ts +2 -2
  87. package/src/execution/__tests__/nested-visibility-env-propagation.test.ts +23 -121
  88. package/src/execution/__tests__/nested-visibility.test.ts +2 -0
  89. package/src/execution/__tests__/notify-ledger.test.ts +1249 -0
  90. package/src/execution/__tests__/output-collector.test.ts +117 -6
  91. package/src/execution/__tests__/pi-invocation.test.ts +1 -1
  92. package/src/execution/__tests__/record-store-orphan-revive.test.ts +159 -0
  93. package/src/execution/__tests__/record-store.test.ts +89 -5
  94. package/src/execution/__tests__/records-cwd-isolation.test.ts +2 -2
  95. package/src/execution/__tests__/recursive-visibility-baseline.test.ts +29 -132
  96. package/src/execution/__tests__/recursive-visibility-env.test.ts +55 -179
  97. package/src/execution/__tests__/rpc-mode.test.ts +2 -2
  98. package/src/execution/__tests__/run-and-finalize-anchoring.test.ts +387 -0
  99. package/src/execution/__tests__/run-and-finalize-chatmode.test.ts +19 -9
  100. package/src/execution/__tests__/run-spawn-chatmode-settled.test.ts +5 -4
  101. package/src/execution/__tests__/run-spawn-edges.test.ts +418 -26
  102. package/src/execution/__tests__/run-spawn-integration.test.ts +3 -3
  103. package/src/execution/__tests__/run-spawn-resume.test.ts +2 -2
  104. package/src/execution/__tests__/run-spawn-rpc-mode.test.ts +2 -2
  105. package/src/execution/__tests__/run-spawn-stdout-callback-throw.test.ts +16 -8
  106. package/src/execution/__tests__/service-kill-escalation.test.ts +91 -0
  107. package/src/execution/__tests__/session-context-resolver.test.ts +0 -2
  108. package/src/execution/__tests__/session-file-gc.test.ts +35 -0
  109. package/src/execution/__tests__/session-pending.test.ts +471 -0
  110. package/src/execution/__tests__/session-reconstructor.test.ts +366 -15
  111. package/src/execution/__tests__/session-runner-branch-cache-lru.test.ts +110 -0
  112. package/src/execution/__tests__/session-runner-close-prune.test.ts +181 -0
  113. package/src/execution/__tests__/session-runner-dispatch.test.ts +489 -0
  114. package/src/execution/__tests__/session-runner-epipe.test.ts +4 -3
  115. package/src/execution/__tests__/session-runner-heartbeat-idle-fallback.test.ts +227 -0
  116. package/src/execution/__tests__/session-runner-lifecycle-helpers.test.ts +290 -0
  117. package/src/execution/__tests__/session-runner-schema-env.test.ts +7 -5
  118. package/src/execution/__tests__/settled-watchdog.test.ts +524 -0
  119. package/src/execution/__tests__/spawn-args.test.ts +11 -10
  120. package/src/execution/__tests__/spawn-event-adapter-rpc.test.ts +26 -23
  121. package/src/execution/__tests__/spawn-event-adapter.test.ts +1 -1
  122. package/src/execution/__tests__/spawn-worktree-guidance.test.ts +5 -4
  123. package/src/execution/__tests__/spawned-children.test.ts +155 -11
  124. package/src/execution/__tests__/start-sync-model-guard.test.ts +4 -4
  125. package/src/execution/__tests__/stdin-writer.test.ts +6 -4
  126. package/src/execution/__tests__/stream-sink-retirement.test.ts +6 -6
  127. package/src/execution/__tests__/subagent-actions-core.test.ts +1017 -0
  128. package/src/execution/__tests__/subagent-service-message-close.test.ts +99 -35
  129. package/src/execution/__tests__/subagent-service-multiproc-guard.test.ts +174 -0
  130. package/src/execution/__tests__/subagent-service-notify-gate.test.ts +271 -0
  131. package/src/execution/__tests__/subagent-service-parent-guard.test.ts +33 -29
  132. package/src/execution/__tests__/subagent-service-recovery-bounds.test.ts +341 -0
  133. package/src/execution/__tests__/subagent-service.test.ts +37 -30
  134. package/src/execution/__tests__/subprocess-agent-runner-routing.test.ts +88 -12
  135. package/src/execution/__tests__/subprocess-agent-runner-timeout.test.ts +75 -0
  136. package/src/execution/__tests__/subprocess-agent-runner.test.ts +22 -20
  137. package/src/execution/__tests__/temp-prompt.test.ts +1 -1
  138. package/src/execution/__tests__/timeout-integration.test.ts +13 -12
  139. package/src/execution/__tests__/turn-limiter-semantics.test.ts +1 -1
  140. package/src/execution/__tests__/turn-limiter.test.ts +1 -1
  141. package/src/execution/__tests__/ui-request-handler-factory.test.ts +107 -7
  142. package/src/execution/__tests__/ui-request-handler.test.ts +4 -3
  143. package/src/execution/__tests__/ui-request-queue.test.ts +167 -2
  144. package/src/execution/__tests__/worktree-git-ops.test.ts +571 -0
  145. package/src/execution/__tests__/worktree-manager.test.ts +14 -5
  146. package/src/execution/__tests__/worktree-pid-registration.integration.test.ts +4 -3
  147. package/src/execution/__tests__/worktree-reconcile-aging.test.ts +204 -0
  148. package/src/execution/agent-registry.ts +298 -30
  149. package/src/execution/agent-result-mapper.ts +3 -0
  150. package/src/execution/agents-assembly.ts +88 -0
  151. package/src/execution/cold-resurrect.ts +199 -0
  152. package/src/execution/concurrency-pool.ts +71 -9
  153. package/src/execution/dialog-queue.ts +101 -3
  154. package/src/execution/engine/__tests__/common/capability-gate.test.ts +91 -0
  155. package/src/execution/engine/__tests__/common/data-dir.test.ts +1 -1
  156. package/src/execution/engine/__tests__/common/journal-wiring.test.ts +84 -0
  157. package/src/execution/engine/__tests__/common/kill-chain.test.ts +34 -7
  158. package/src/execution/engine/__tests__/common/persona-router.test.ts +4 -5
  159. package/src/execution/engine/__tests__/common/pool-manager.test.ts +211 -51
  160. package/src/execution/engine/__tests__/common/session-view-service-zcode-dbpath.test.ts +149 -0
  161. package/src/execution/engine/__tests__/common/session-view-service.test.ts +499 -0
  162. package/src/execution/engine/__tests__/conformance/contract.abort.test.ts +56 -99
  163. package/src/execution/engine/__tests__/conformance/contract.agent-events.test.ts +88 -15
  164. package/src/execution/engine/__tests__/conformance/engine-conformance.live.test.ts +33 -7
  165. package/src/execution/engine/__tests__/conformance/golden-replay.pi.test.ts +1 -1
  166. package/src/execution/engine/__tests__/conformance/golden-replay.zcode.test.ts +75 -54
  167. package/src/execution/engine/__tests__/conformance/zcode-appserver-harness.ts +128 -0
  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 +94 -3
  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/engine-discovery.ts +12 -16
  181. package/src/execution/engine/engines/pi/__tests__/pi-engine.test.ts +174 -28
  182. package/src/execution/engine/engines/pi/__tests__/spawn-opts-direct.test.ts +257 -0
  183. package/src/execution/{argv-mirror.ts → engine/engines/pi/argv-mirror.ts} +43 -21
  184. package/src/execution/{get-state-handshake.ts → engine/engines/pi/get-state-handshake.ts} +86 -11
  185. package/src/execution/{output-collector.ts → engine/engines/pi/output-collector.ts} +108 -19
  186. package/src/execution/engine/engines/pi/pi-engine.ts +434 -38
  187. package/src/execution/{pi-invocation.ts → engine/engines/pi/pi-invocation.ts} +2 -2
  188. package/src/execution/engine/engines/pi/reader.ts +11 -0
  189. package/src/execution/engine/engines/pi/registration.ts +4 -2
  190. package/src/execution/engine/engines/pi/session-runner.ts +2840 -0
  191. package/src/execution/{spawn-event-adapter.ts → engine/engines/pi/spawn-event-adapter.ts} +75 -34
  192. package/src/execution/{stdin-writer.ts → engine/engines/pi/stdin-writer.ts} +10 -9
  193. package/src/execution/{temp-prompt.ts → engine/engines/pi/temp-prompt.ts} +2 -2
  194. package/src/execution/{turn-limiter.ts → engine/engines/pi/turn-limiter.ts} +1 -1
  195. package/src/execution/engine/engines/zcode/__tests__/__fixtures__/fake-appserver.mjs +301 -0
  196. package/src/execution/engine/engines/zcode/__tests__/__fixtures__/zcode-golden-appserver.json +36 -0
  197. package/src/execution/engine/engines/zcode/__tests__/appserver-launcher.test.ts +321 -0
  198. package/src/execution/engine/engines/zcode/__tests__/connection.test.ts +473 -0
  199. package/src/execution/engine/engines/zcode/__tests__/parser.test.ts +7 -210
  200. package/src/execution/engine/engines/zcode/__tests__/preparer.test.ts +6 -110
  201. package/src/execution/engine/engines/zcode/__tests__/session-channel-dispose-harvest.test.ts +247 -0
  202. package/src/execution/engine/engines/zcode/__tests__/session-channel-turn-timers.test.ts +451 -0
  203. package/src/execution/engine/engines/zcode/__tests__/session-channel.test.ts +792 -0
  204. package/src/execution/engine/engines/zcode/__tests__/zcode-engine-appserver.test.ts +782 -0
  205. package/src/execution/engine/engines/zcode/__tests__/zcode-engine-degrade.test.ts +168 -0
  206. package/src/execution/engine/engines/zcode/__tests__/zcode-engine-dispose.test.ts +210 -0
  207. package/src/execution/engine/engines/zcode/__tests__/zcode-engine-retry.test.ts +353 -0
  208. package/src/execution/engine/engines/zcode/__tests__/zcode-engine-status.test.ts +282 -0
  209. package/src/execution/engine/engines/zcode/__tests__/zcode-engine-timeout.test.ts +372 -0
  210. package/src/execution/engine/engines/zcode/__tests__/zcode-engine.live.test.ts +65 -47
  211. package/src/execution/engine/engines/zcode/appserver-launcher.ts +167 -0
  212. package/src/execution/engine/engines/zcode/connection.ts +598 -0
  213. package/src/execution/engine/engines/zcode/constants.ts +147 -14
  214. package/src/execution/engine/engines/zcode/golden-sample.ts +42 -34
  215. package/src/execution/engine/engines/zcode/parser.ts +12 -346
  216. package/src/execution/engine/engines/zcode/preparer.ts +22 -150
  217. package/src/execution/engine/engines/zcode/session-channel.ts +968 -0
  218. package/src/execution/engine/engines/zcode/zcode-engine.ts +1023 -250
  219. package/src/execution/engine/host-task-spec.ts +32 -36
  220. package/src/execution/engine/model-validation.ts +177 -0
  221. package/src/execution/engine/port.ts +65 -7
  222. package/src/execution/engine/registry.ts +53 -0
  223. package/src/execution/engine/routing.ts +75 -1
  224. package/src/execution/engine/types.ts +30 -103
  225. package/src/execution/execution-record.ts +222 -144
  226. package/src/execution/finalize-record.ts +181 -85
  227. package/src/execution/idle-gc.ts +28 -0
  228. package/src/execution/lifecycle-manager.ts +27 -3
  229. package/src/execution/lifecycle-predicates.ts +1 -1
  230. package/src/execution/manifest-store.ts +53 -62
  231. package/src/execution/notifier.ts +10 -10
  232. package/src/execution/notify-host.ts +212 -0
  233. package/src/execution/notify-ledger.ts +117 -16
  234. package/src/execution/record-entry.ts +8 -2
  235. package/src/execution/record-store.ts +148 -88
  236. package/src/execution/round-settlement.ts +93 -0
  237. package/src/execution/session-file-gc.ts +96 -62
  238. package/src/execution/session-pending.ts +213 -62
  239. package/src/execution/session-reconstructor.ts +256 -143
  240. package/src/execution/sessions-index.ts +127 -102
  241. package/src/execution/settled-watchdog.ts +311 -0
  242. package/src/execution/subagent-actions-core.ts +686 -0
  243. package/src/execution/subagent-service.ts +1106 -907
  244. package/src/execution/subprocess-agent-runner.ts +144 -97
  245. package/src/execution/types.ts +9 -0
  246. package/src/execution/ui-request-handler-factory.ts +126 -75
  247. package/src/execution/ui-request-queue.ts +50 -19
  248. package/src/execution/worktree-git-ops.ts +397 -0
  249. package/src/execution/worktree-manager.ts +72 -10
  250. package/src/execution/worktree-registry.ts +6 -12
  251. package/src/index.ts +542 -9
  252. package/src/orchestration/__tests__/__fixtures__/worker-template.snapshot.txt +42 -3
  253. package/src/orchestration/__tests__/agent-call-catch-fallback.test.ts +3 -5
  254. package/src/orchestration/__tests__/agent-call-stream.test.ts +2 -2
  255. package/src/orchestration/__tests__/args-meta.test.ts +358 -0
  256. package/src/orchestration/__tests__/args-validator.test.ts +14 -0
  257. package/src/orchestration/__tests__/error-recovery-rebuild-failure.test.ts +312 -0
  258. package/src/orchestration/__tests__/error-recovery-terminal-hardening.test.ts +384 -0
  259. package/src/orchestration/__tests__/execute-agent-call.test.ts +151 -11
  260. package/src/orchestration/__tests__/file-run-store-prune.test.ts +168 -0
  261. package/src/orchestration/__tests__/file-run-store-throttle.test.ts +168 -0
  262. package/src/orchestration/__tests__/file-run-store.test.ts +390 -0
  263. package/src/orchestration/__tests__/helpers/flush-microtasks.ts +13 -0
  264. package/src/orchestration/__tests__/launcher-nested-workflow.test.ts +34 -0
  265. package/src/orchestration/__tests__/lifecycle-abort-broadcast-signal.test.ts +357 -0
  266. package/src/orchestration/__tests__/lifecycle-recover-crashed.test.ts +289 -0
  267. package/src/orchestration/__tests__/lifecycle-runid-injection.test.ts +3 -3
  268. package/src/orchestration/__tests__/lifecycle.test.ts +84 -5
  269. package/src/orchestration/__tests__/non-cloneable-return-e2e.test.ts +1 -1
  270. package/src/orchestration/__tests__/run-snapshot.test.ts +356 -0
  271. package/src/orchestration/__tests__/script-generate.test.ts +314 -0
  272. package/src/orchestration/__tests__/script-lint.test.ts +17 -0
  273. package/src/orchestration/__tests__/test-mocks.ts +2 -0
  274. package/src/orchestration/__tests__/worker-exit-without-result.test.ts +7 -6
  275. package/src/orchestration/__tests__/worker-message-pump-finalize-run.test.ts +229 -0
  276. package/src/orchestration/__tests__/{error-recovery-handlers.test.ts → worker-message-pump-handlers.test.ts} +28 -27
  277. package/src/orchestration/__tests__/{error-recovery-postmessage-defense.test.ts → worker-message-pump-postmessage-defense.test.ts} +8 -8
  278. package/src/orchestration/__tests__/{error-recovery-serialize-failed-result.test.ts → worker-message-pump-serialize-failed-result.test.ts} +2 -2
  279. package/src/orchestration/__tests__/{error-recovery-workflow-call.test.ts → worker-message-pump-workflow-call.test.ts} +1 -1
  280. package/src/orchestration/__tests__/worker-pending-timeout-abort.test.ts +275 -0
  281. package/src/orchestration/__tests__/worker-script-builder-runtime.test.ts +78 -1
  282. package/src/orchestration/__tests__/worker-script-builder.test.ts +1 -1
  283. package/src/orchestration/__tests__/workflow-files.test.ts +186 -0
  284. package/src/orchestration/__tests__/workflow-nesting-e2e.test.ts +1 -1
  285. package/src/orchestration/__tests__/workflow-run-summary.test.ts +119 -0
  286. package/src/orchestration/__tests__/workflow-script-registry-impl.test.ts +124 -0
  287. package/src/orchestration/agent-opts-resolver.ts +8 -8
  288. package/src/orchestration/args-meta.ts +198 -0
  289. package/src/orchestration/args-validator.ts +53 -31
  290. package/src/orchestration/execute-agent-call.ts +25 -79
  291. package/src/orchestration/file-run-store.ts +327 -0
  292. package/src/orchestration/launcher.ts +160 -104
  293. package/src/orchestration/lifecycle.ts +371 -97
  294. package/src/orchestration/models/agent-call.ts +7 -7
  295. package/src/orchestration/models/budget.ts +5 -5
  296. package/src/orchestration/models/ports.ts +4 -4
  297. package/src/orchestration/models/run-runtime.ts +15 -15
  298. package/src/orchestration/models/trace.ts +9 -9
  299. package/src/orchestration/models/types.ts +111 -22
  300. package/src/orchestration/models/workflow-run.ts +28 -28
  301. package/src/orchestration/models/workflow-script.ts +4 -4
  302. package/src/orchestration/run-snapshot.ts +266 -0
  303. package/src/orchestration/script-generate.ts +154 -0
  304. package/src/orchestration/script-lint.ts +123 -90
  305. package/src/orchestration/worker-handle.ts +10 -10
  306. package/src/orchestration/worker-host.ts +10 -10
  307. package/src/orchestration/{error-recovery.ts → worker-message-pump.ts} +498 -221
  308. package/src/orchestration/worker-script-builder.ts +401 -346
  309. package/src/orchestration/workflow-files.ts +37 -11
  310. package/src/orchestration/workflow-run-summary.ts +69 -0
  311. package/src/orchestration/workflow-script-registry-impl.ts +31 -9
  312. package/src/shared/__tests__/agent-ref.test.ts +209 -2
  313. package/src/shared/__tests__/atomic-write.test.ts +267 -0
  314. package/src/shared/__tests__/bounded-serialize.test.ts +236 -0
  315. package/src/shared/__tests__/injection-render.test.ts +518 -0
  316. package/src/shared/__tests__/meta-parser.test.ts +151 -0
  317. package/src/shared/__tests__/resource-discovery-host-roots.test.ts +474 -0
  318. package/src/shared/__tests__/resource-discovery.test.ts +261 -217
  319. package/src/shared/agent-ref.ts +143 -2
  320. package/src/shared/atomic-write.ts +323 -0
  321. package/src/shared/bounded-serialize.ts +154 -0
  322. package/src/shared/injection-render.ts +279 -0
  323. package/src/shared/meta-parser.ts +182 -68
  324. package/src/shared/model-ref.ts +15 -2
  325. package/src/shared/resource-discovery.ts +97 -204
  326. package/src/shared/resource-meta.ts +14 -0
  327. package/src/shared/schema-jsonify.ts +1 -1
  328. package/src/shared/xml-injection.ts +9 -9
  329. package/workflows/README.md +9 -9
  330. package/workflows/chain.js +4 -2
  331. package/workflows/map-reduce.js +5 -3
  332. package/workflows/parallel.js +5 -3
  333. package/workflows/review-fix-loop-utils.cjs +165 -92
  334. package/workflows/review-fix-loop-utils.d.cts +287 -0
  335. package/workflows/review-fix-loop.js +18 -7
  336. package/workflows/scatter-gather.js +4 -2
  337. package/dist/chunk-3VOERJPJ.js +0 -22
  338. package/src/execution/__tests__/execute-options-mapper.test.ts +0 -200
  339. package/src/execution/engine/engines/pi/__tests__/task-spec-mapper.test.ts +0 -164
  340. package/src/execution/engine/engines/pi/task-spec-mapper.ts +0 -100
  341. package/src/execution/engine/engines/zcode/__tests__/__fixtures__/zcode-golden-spawn.json +0 -39
  342. package/src/execution/engine/engines/zcode/__tests__/launcher.test.ts +0 -150
  343. package/src/execution/engine/engines/zcode/__tests__/zcode-engine.test.ts +0 -580
  344. package/src/execution/engine/engines/zcode/launcher.ts +0 -161
  345. package/src/execution/execute-options-mapper.ts +0 -115
  346. package/src/execution/session-runner.ts +0 -1789
  347. package/src/shared/__tests__/resource-discovery-manifest-cache.test.ts +0 -288
@@ -31,7 +31,9 @@ import type { LifecycleDeps } from "./models/ports.ts";
31
31
  import type { RunSpec } from "./models/run-spec.ts";
32
32
  import type { DoneReason } from "./models/types.ts";
33
33
  import type { WorkflowRun } from "./models/workflow-run.ts";
34
+ import type { WorkflowScript } from "./models/workflow-script.ts";
34
35
  import type { WorkflowScriptRegistry } from "./models/workflow-script-registry.ts";
36
+ import type { LintResult } from "./script-lint.ts";
35
37
  import { assertSafeTimerDelay } from "../shared/timer-delay.ts";
36
38
 
37
39
  // ── 常量 ─────────────────────────────────────────────────────
@@ -106,6 +108,14 @@ function pollInterval(): Promise<void> {
106
108
  });
107
109
  }
108
110
 
111
+ /** lint findings 摘要串(runAndWait / executeNestedWorkflow 共用同一错误文案格式)。 */
112
+ function formatLintErrorSummary(lintResult: LintResult): string {
113
+ return lintResult.findings
114
+ .filter((f) => f.severity === "error")
115
+ .map((f) => `L${f.line}: ${f.message}`)
116
+ .join("; ");
117
+ }
118
+
109
119
  /**
110
120
  * 从 WorkflowRun 构建 WorkflowRunResult(D-8)。
111
121
  *
@@ -184,11 +194,11 @@ async function pollRunToResult(
184
194
  return finalRun
185
195
  ? toResult(finalRun)
186
196
  : {
187
- status: "done",
188
- reason: "time_limited",
189
- error: `Workflow timed out after ${explicitTimeoutMs}ms`,
190
- runId,
191
- };
197
+ status: "done",
198
+ reason: "time_limited",
199
+ error: `Workflow timed out after ${explicitTimeoutMs}ms`,
200
+ runId,
201
+ };
192
202
  }
193
203
 
194
204
  // ── runAndWait ───────────────────────────────────────────────
@@ -214,6 +224,11 @@ async function pollRunToResult(
214
224
  * @param timeoutMs 超时上限(可选)。[预算语义对齐 + U2] 未传或 <=0 = 不限(轮询至 done /
215
225
  * abort 为止,不限时由 XYZ_SUBAGENT_RUN_WATCHDOG_MS 兜底)——旧实现默认 10 分钟会误杀长任务,
216
226
  * 且 0/负值会落成立即超时;仅显式正数才限时。
227
+ * @param model Run 级 model override(可选)。[host-surface] 经 spec.model → workerData →
228
+ * $MODEL → agent() fallback(RunSpec Option B 同一路径)。缺省不覆盖——宿主未显式指定
229
+ * model 时维持脚本内 agent() 显式参数 / agent .md / 引擎默认的既有解析序。此前该入口
230
+ * 无 model 通道,消费方(zsw CLI --model)只能丢弃该参数——行为劈叉于走 buildSpec 的
231
+ * 异步入口。
217
232
  * @returns WorkflowRunResult(status 恒 "done")
218
233
  */
219
234
  export async function runAndWait(
@@ -222,8 +237,9 @@ export async function runAndWait(
222
237
  deps: LauncherDeps,
223
238
  signal?: AbortSignal,
224
239
  timeoutMs?: number,
240
+ model?: string,
225
241
  ): Promise<WorkflowRunResult> {
226
- // 1. registry 查找脚本(workflowRef = 绝对路径,S2 路径统一)
242
+ // 1. registry 查找脚本(workflowRef = 绝对路径,S2 路径统一)
227
243
  const script = await deps.registry.getPath(name);
228
244
  if (!script) {
229
245
  return {
@@ -234,36 +250,37 @@ export async function runAndWait(
234
250
  };
235
251
  }
236
252
 
237
- // 2. lint 校验(失败抛错——脚本本身有问题,不应静默吞)
253
+ // 2. lint 校验(失败抛错——脚本本身有问题,不应静默吞)
238
254
  const lintResult = script.validate();
239
255
  if (!lintResult.valid) {
240
- const errors = lintResult.findings
241
- .filter((f) => f.severity === "error")
242
- .map((f) => `L${f.line}: ${f.message}`)
243
- .join("; ");
244
- throw new Error(`Workflow script '${name}' has lint errors: ${errors}`);
256
+ throw new Error(
257
+ `Workflow script '${name}' has lint errors: ${formatLintErrorSummary(lintResult)}`,
258
+ );
245
259
  }
246
260
 
247
- // 3. 构建 RunSpec
248
- // 不设 budgetTimeMs:runAndWait 自身用轮询 deadline(pollRunToResult 内 while + safeAbort)
249
- // 实施 timeout,并产出「Workflow timed out after Xms」的具体错误信息。spec 级
250
- // 时间预算(lifecycle.scheduleTimeBudget)服务于 fire-and-forget 的交互式 run
251
- // (tool-workflow actionRun),若在此也设会与轮询 deadline 同时触发产生竞态。
261
+ // 3. 构建 RunSpec
262
+ // 不设 budgetTimeMs:runAndWait 自身用轮询 deadline(pollRunToResult 内 while + safeAbort)
263
+ // 实施 timeout,并产出「Workflow timed out after Xms」的具体错误信息。spec 级
264
+ // 时间预算(lifecycle.scheduleTimeBudget)服务于 fire-and-forget 的交互式 run
265
+ // (tool-workflow actionRun),若在此也设会与轮询 deadline 同时触发产生竞态。
266
+ // model 是例外:时间预算必须二选一(竞态),model 只有单通道(spec Option B),
267
+ // 调用方显式传入即透传,不与任何轮询面竞争。
252
268
  const spec: RunSpec = {
253
269
  scriptSource: script.toExecutable(),
254
270
  args,
255
271
  budgetTokens: undefined,
272
+ model,
256
273
  scriptName: script.name,
257
274
  scriptPath: script.path,
258
275
  description: script.meta.description,
259
276
  parameters: script.meta.parameters,
260
277
  };
261
278
 
262
- // 4. 启动 workflow + 5. 轮询至 done(含 6. timeout → abortRun,C.7)
263
- // pending-notification 的 register/unregister 由 runWorkflow(启动注册)+
264
- // transition("done") 路径(完成注销)统一处理,runAndWait 不再重复 emit。
265
- // m3:chokepoint 校验失败(ArgsValidationError)→ 返回 invalid_args 结果(run 从未
266
- // 创建,runId 恒 ''),非 ArgsValidationError 保持传播。
279
+ // 4. 启动 workflow + 5. 轮询至 done(含 6. timeout → abortRun,C.7)
280
+ // pending-notification 的 register/unregister 由 runWorkflow(启动注册)+
281
+ // transition("done") 路径(完成注销)统一处理,runAndWait 不再重复 emit。
282
+ // m3:chokepoint 校验失败(ArgsValidationError)→ 返回 invalid_args 结果(run 从未
283
+ // 创建,runId 恒 ''),非 ArgsValidationError 保持传播。
267
284
  let runId: string;
268
285
  try {
269
286
  runId = await runWorkflow(spec, deps, signal);
@@ -296,26 +313,125 @@ async function safeAbort(
296
313
  try {
297
314
  await abortRun(runId, deps, reason, doneReason);
298
315
  } catch (err) {
299
- // run 可能已终态或不存在——忽略,调用方据 toResult 判断
316
+ // run 可能已终态或不存在——忽略,调用方据 toResult 判断
300
317
  void err;
301
318
  }
302
319
  }
303
320
 
304
321
  // ── executeNestedWorkflow(workflow() 嵌套调用实现) ────────
305
322
 
323
+ /** 父 run 的循环检测链:[...parentChain, parentScriptName](顶层 run 无 chain 时前段为空)。 */
324
+ function buildParentChain(parentRun: WorkflowRun): string[] {
325
+ return [...(parentRun.spec.parentWorkflowChain ?? []), parentRun.spec.scriptName];
326
+ }
327
+
328
+ /** Step 2 的 signal 继承产物(childController + 父 signal/回调——finally 移除 listener 用)。 */
329
+ interface InheritedSignal {
330
+ childController: AbortController;
331
+ parentSignal: AbortSignal | undefined;
332
+ onParentAbort: () => void;
333
+ }
334
+
335
+ /**
336
+ * Step 2: signal 继承——子 run 响应父 run abort(parentController → childController)。
337
+ *
338
+ * [L-2] onParentAbort 提取为命名函数以便 finally removeEventListener,防子 run 完成后
339
+ * parentSignal 上残留 listener(多次嵌套调用会累积)。
340
+ */
341
+ function inheritParentSignal(parentRun: WorkflowRun): InheritedSignal {
342
+ const childController = new AbortController();
343
+ const parentSignal = parentRun.runtime?.controller.signal;
344
+ const onParentAbort = (): void => childController.abort();
345
+ if (parentSignal) {
346
+ if (parentSignal.aborted) {
347
+ childController.abort();
348
+ } else {
349
+ parentSignal.addEventListener("abort", onParentAbort, { once: true });
350
+ }
351
+ }
352
+ return { childController, parentSignal, onParentAbort };
353
+ }
354
+
355
+ /**
356
+ * Step 4: 构建 RunSpec(共享父 Budget + 循环链)。
357
+ *
358
+ * budget 共享(F-7 方案 B):子 run 直接复用父 Budget 引用(budgetRef),consume 实时
359
+ * 累加到父 Budget,消除并行嵌套下的超支窗口,无需 sync-back。
360
+ */
361
+ function buildNestedSpec(
362
+ args: Record<string, unknown>,
363
+ parentRun: WorkflowRun,
364
+ script: WorkflowScript,
365
+ chain: string[],
366
+ ): RunSpec {
367
+ return {
368
+ scriptSource: script.toExecutable(),
369
+ args,
370
+ budgetRef: parentRun.state.budget,
371
+ // Run-level override 传播(与父 run 对齐):子 run 继承父 run 的 model/thinkingLevel,
372
+ // 否则嵌套 workflow 丢失父 run 的模型指定,回落主 agent 模型。
373
+ model: parentRun.spec.model,
374
+ thinkingLevel: parentRun.spec.thinkingLevel,
375
+ scriptName: script.name,
376
+ scriptPath: script.path,
377
+ description: script.meta.description,
378
+ parameters: script.meta.parameters,
379
+ parentWorkflowChain: chain,
380
+ };
381
+ }
382
+
383
+ /**
384
+ * 嵌套 workflow timeout 从父 run 完整传导:父 spec.budgetTimeMs 显式设定时原样作为子 run
385
+ * 轮询 deadline(不 min(DEFAULT) 封顶——旧实现把父 time:2h 截断到 10min,违背「显式传参
386
+ * 完整生效」语义);父未设 → undefined,无 deadline(不限)。
387
+ * [U2] 预算语义统一:父 budgetTimeMs <=0(含 0/负)与 undefined 同义 = 不限——与
388
+ * lifecycle.runWorkflow 的 budgetTimeMs 判定(>0 才挂 scheduleTimeBudget)对齐。
389
+ */
390
+ function resolveNestedTimeoutMs(parentRun: WorkflowRun): number | undefined {
391
+ const raw = parentRun.spec.budgetTimeMs;
392
+ return raw !== undefined && raw > 0 ? raw : undefined;
393
+ }
394
+
395
+ /**
396
+ * Step 6: 结果转换(budget 已通过共享 budgetRef 实时同步,无需 sync-back)。
397
+ * completed → content = 字符串原样 / 其余 JSON.stringify;非 completed → error result。
398
+ */
399
+ function toNestedCallResult(
400
+ name: string,
401
+ result: WorkflowRunResult,
402
+ ): { content: string; parsedOutput?: unknown; error?: string } {
403
+ if (result.reason === "completed") {
404
+ const scriptResult = result.scriptResult;
405
+ return {
406
+ content:
407
+ typeof scriptResult === "string"
408
+ ? scriptResult
409
+ : JSON.stringify(scriptResult ?? ""),
410
+ parsedOutput:
411
+ typeof scriptResult === "object" && scriptResult !== null
412
+ ? scriptResult
413
+ : undefined,
414
+ };
415
+ }
416
+ return {
417
+ content: "",
418
+ error: result.error ?? `Workflow '${name}' ended: ${result.reason}`,
419
+ };
420
+ }
421
+
306
422
  /**
307
423
  * workflow() 嵌套调用的 Engine 实现。
308
424
  *
309
- * Worker 脚本内调 workflow(name, args) 时,error-recovery.dispatchWorkflowCall 路由
425
+ * Worker 脚本内调 workflow(name, args) 时,worker-message-pump.dispatchWorkflowCall 路由
310
426
  * 到 deps.onWorkflowCall,后者(Interface 层 makeDeps 注入)委托本函数。
311
427
  *
312
- * 流程(6 步):
428
+ * 流程(6 步,Step 2-6 的机制细节见各 helper):
313
429
  * 1. 循环检测——name 已在 parentWorkflowChain 中则拒绝(防 A→B→A 死循环)
314
- * 2. signal 继承——子 run 响应父 run abort(parentController → childController
430
+ * 2. signal 继承——子 run 响应父 run abort(inheritParentSignal
315
431
  * 3. registry.get + lint——失败返回 error result(不抛错,让脚本 soft-fail)
316
432
  * 4. 构建 RunSpec(共享父 Budget 引用 + parentWorkflowChain 延长)+ runWorkflow
317
433
  * 5. pollRunToResult 轮询至 done(复用 runAndWait 的轮询逻辑)
318
- * 6. 结果转换(budget 已通过共享引用实时同步)
434
+ * 6. 结果转换(toNestedCallResult)
319
435
  *
320
436
  * 不走 runAndWait:runAndWait 内部构建 RunSpec 不支持 parentWorkflowChain 与 budget
321
437
  * 共享引用,故直接构建 spec + runWorkflow + pollRunToResult。
@@ -332,11 +448,8 @@ export async function executeNestedWorkflow(
332
448
  parentRun: WorkflowRun,
333
449
  deps: LauncherDeps,
334
450
  ): Promise<{ content: string; parsedOutput?: unknown; error?: string }> {
335
- // Step 1: 循环检测——parentWorkflowChain 不存在时为 [](顶层 run)
336
- const chain = [
337
- ...(parentRun.spec.parentWorkflowChain ?? []),
338
- parentRun.spec.scriptName,
339
- ];
451
+ // Step 1: 循环检测——parentWorkflowChain 不存在时为 [](顶层 run)
452
+ const chain = buildParentChain(parentRun);
340
453
  if (chain.includes(name)) {
341
454
  return {
342
455
  content: "",
@@ -344,24 +457,13 @@ export async function executeNestedWorkflow(
344
457
  };
345
458
  }
346
459
 
347
- // Step 2: signal 继承——子 run 响应父 run abort
348
- // [L-2] 提取命名 onParentAbort 以便 finally removeEventListener,防子 run 完成后
349
- // parentSignal 上残留 listener(多次嵌套调用会累积)。
350
- const childController = new AbortController();
351
- const parentSignal = parentRun.runtime?.controller.signal;
352
- const onParentAbort = (): void => childController.abort();
353
- if (parentSignal) {
354
- if (parentSignal.aborted) {
355
- childController.abort();
356
- } else {
357
- parentSignal.addEventListener("abort", onParentAbort, { once: true });
358
- }
359
- }
460
+ // Step 2: signal 继承——子 run 响应父 run abort
461
+ const { childController, parentSignal, onParentAbort } = inheritParentSignal(parentRun);
360
462
 
361
- // Step 3+:registry 查找 + lint + RunSpec + runWorkflow + poll 全程 try(m3 E8——
362
- // try 起点提到 Step 2 的 listener 注册之后,覆盖 Step 3-6。runWorkflow throw
363
- // (含 chokepoint ArgsValidationError)与 not found/lint 早返回均走 finally 移除
364
- // parentSignal listener——修复原 try 外 runWorkflow 的泄漏路径)。
463
+ // Step 3+:registry 查找 + lint + RunSpec + runWorkflow + poll 全程 try(m3 E8——
464
+ // try 起点在 Step 2 的 listener 注册之后,覆盖 Step 3-6。runWorkflow throw
465
+ // (含 chokepoint ArgsValidationError)与 not found/lint 早返回均走 finally 移除
466
+ // parentSignal listener——修复原 try 外 runWorkflow 的泄漏路径)。
365
467
  try {
366
468
  // Step 3: registry 查找 + lint(失败返回 error result,不抛错)
367
469
  const script = await deps.registry.getPath(name);
@@ -370,76 +472,30 @@ export async function executeNestedWorkflow(
370
472
  }
371
473
  const lintResult = script.validate();
372
474
  if (!lintResult.valid) {
373
- const errors = lintResult.findings
374
- .filter((f) => f.severity === "error")
375
- .map((f) => `L${f.line}: ${f.message}`)
376
- .join("; ");
377
475
  return {
378
476
  content: "",
379
- error: `Workflow script '${name}' has lint errors: ${errors}`,
477
+ error: `Workflow script '${name}' has lint errors: ${formatLintErrorSummary(lintResult)}`,
380
478
  };
381
479
  }
382
480
 
383
- // Step 4: 构建 RunSpec(共享父 Budget + 循环链)+ 启动子 workflow
384
- // budget 共享(F-7 方案 B):子 run 直接复用父 Budget 引用(budgetRef),consume 实时
385
- // 累加到父 Budget,消除并行嵌套下的超支窗口,无需 Step 6 sync-back。
386
- const spec: RunSpec = {
387
- scriptSource: script.toExecutable(),
388
- args,
389
- budgetRef: parentRun.state.budget,
390
- // Run-level override 传播(与父 run 对齐):子 run 继承父 run 的 model/thinkingLevel,
391
- // 否则嵌套 workflow 丢失父 run 的模型指定,回落主 agent 模型。
392
- model: parentRun.spec.model,
393
- thinkingLevel: parentRun.spec.thinkingLevel,
394
- scriptName: script.name,
395
- scriptPath: script.path,
396
- description: script.meta.description,
397
- parameters: script.meta.parameters,
398
- parentWorkflowChain: chain,
399
- };
481
+ // Step 4: 构建 RunSpec + 启动子 workflow
482
+ // budgetRef(共享 Budget)已在 spec 透传给子 run 处理 token/cost 预算,
483
+ // resolveNestedTimeoutMs budgetTimeMs 只服务 pollRunToResult 的轮询 deadline
484
+ // (wall-clock 兜底)。
485
+ const spec = buildNestedSpec(args, parentRun, script, chain);
400
486
  const runId = await runWorkflow(spec, deps, childController.signal);
401
487
 
402
488
  // Step 5: 轮询至 done(复用 runAndWait 的轮询逻辑)
403
- // [H-1] 嵌套 workflow timeout 从父 run 完整传导:父 spec.budgetTimeMs 显式设定时
404
- // 原样作为子 run 轮询 deadline(不 min(DEFAULT) 封顶——旧实现把父 time:2h 截断到
405
- // 10min,违背「显式传参完整生效」语义);父未设 → undefined,无 deadline(不限)。
406
- // budgetRef(共享 Budget)已在 Step 4 透传给子 run 处理 token/cost 预算,
407
- // 此处的 budgetTimeMs 只服务 pollRunToResult 的轮询 deadline(wall-clock 兜底)。
408
- // [U2] 预算语义统一:父 budgetTimeMs <=0(含 0/负)与 undefined 同义 = 不限——
409
- // 与 lifecycle.runWorkflow 的 budgetTimeMs 判定(>0 才挂 scheduleTimeBudget)对齐。
410
- // 旧实现 0 传导给子 run 后 deadline=now 立即超时("timed out after 0ms"),与
411
- // lifecycle 的 0=不限 语义分裂。pollRunToResult 内亦对非正值兜底归一(双写防漂移),
412
- // 此处显式归一是传导语义的文档化表达。
413
- const rawNestedTimeoutMs = parentRun.spec.budgetTimeMs;
414
- const nestedTimeoutMs =
415
- rawNestedTimeoutMs !== undefined && rawNestedTimeoutMs > 0 ? rawNestedTimeoutMs : undefined;
416
-
417
489
  const result = await pollRunToResult(
418
490
  runId,
419
491
  deps,
420
492
  childController.signal,
421
- nestedTimeoutMs,
493
+ resolveNestedTimeoutMs(parentRun),
422
494
  "Aborted by parent signal",
423
495
  );
424
496
 
425
- // Step 6: 结果转换(budget 已通过共享 budgetRef 实时同步,无需 sync-back)
426
- if (result.reason === "completed") {
427
- const scriptResult = result.scriptResult;
428
- return {
429
- content:
430
- typeof scriptResult === "string"
431
- ? scriptResult
432
- : JSON.stringify(scriptResult ?? ""),
433
- parsedOutput:
434
- typeof scriptResult === "object" && scriptResult !== null
435
- ? scriptResult
436
- : undefined,
437
- };
438
- }
439
- return {
440
- content: "",
441
- error: result.error ?? `Workflow '${name}' ended: ${result.reason}`,
442
- };
497
+ // Step 6: 结果转换
498
+ return toNestedCallResult(name, result);
443
499
  } catch (err) {
444
500
  // m3:chokepoint 校验失败 → {error}(§5.3 指引文案),非 ArgsValidationError 保持传播
445
501
  // (dispatchWorkflowCall 的 .catch 兜底转 postResult,worker 不崩)。