@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
@@ -76,13 +76,13 @@ function checkEntryPoint(source: string): LintFinding[] {
76
76
  function checkLine(lineText: string, lineNum: number): LintFinding[] {
77
77
  const results: LintFinding[] = [];
78
78
 
79
- // 跳过注释行
79
+ // 跳过注释行
80
80
  const trimmed = lineText.trim();
81
81
  if (trimmed.startsWith("//") || trimmed.startsWith("*") || trimmed.startsWith("/*")) {
82
82
  return results;
83
83
  }
84
84
 
85
- // result.output / result.parsedOutput / result.content
85
+ // result.output / result.parsedOutput / result.content
86
86
  const resultAccessPatterns: Array<{ regex: RegExp; field: string }> = [
87
87
  { regex: /\bresult\s*\.\s*output\b/, field: "output" },
88
88
  { regex: /\bresult\s*\.\s*parsedOutput\b/, field: "parsedOutput" },
@@ -99,7 +99,7 @@ function checkLine(lineText: string, lineNum: number): LintFinding[] {
99
99
  }
100
100
  }
101
101
 
102
- // 文件传状态(readFileSync of STATE)
102
+ // 文件传状态(readFileSync of STATE)
103
103
  if (/readFileSync\(.*STATE.*\)|readFileSync\(.*state.*\.json/i.test(lineText)) {
104
104
  results.push({
105
105
  severity: "warning",
@@ -109,7 +109,7 @@ function checkLine(lineText: string, lineNum: number): LintFinding[] {
109
109
  });
110
110
  }
111
111
 
112
- // unlinkSync 清理状态
112
+ // unlinkSync 清理状态
113
113
  if (/unlinkSync.*state/i.test(lineText)) {
114
114
  results.push({
115
115
  severity: "warning",
@@ -136,6 +136,36 @@ function stripStringsAndComments(line: string): string {
136
136
  .replace(/\/\*[\s\S]*?\*\//g, "");
137
137
  }
138
138
 
139
+ /** 注释行判定:行注释开头或块注释续行开头(* 与斜杠星号前缀)。 */
140
+ function isCommentLine(trimmed: string): boolean {
141
+ return trimmed.startsWith("//") || trimmed.startsWith("*") || trimmed.startsWith("/*");
142
+ }
143
+
144
+ /** 括号平衡增量:圆/花/方括号开符计 +1,闭符计 -1,其余 0。 */
145
+ function bracketDepthDelta(text: string): number {
146
+ let delta = 0;
147
+ for (const ch of text) {
148
+ if (ch === "(" || ch === "{" || ch === "[") delta++;
149
+ if (ch === ")" || ch === "}" || ch === "]") delta--;
150
+ }
151
+ return delta;
152
+ }
153
+
154
+ // 检测行内「agent(」字面量对象调用起点;命中返回替换后的调用头圆括号及其后原文
155
+ //(计括号用),未命中 / 非字面量实参返回 undefined。
156
+ //
157
+ // 非字面量实参(agent(callVar) / agent(expr))返回 undefined:description 等选项在调用点
158
+ // 静态不可见,checkAgentDescription 无法验证运行时构造的调用——继续报 warning 即误报
159
+ // (review-fix-loop 的 agent(call) 三连误报根因)。
160
+ // 形如 agent( 换行 { 的多行字面量调用(argTail 为空)保留原追踪行为。
161
+ function matchAgentCallHead(codeLine: string): string | undefined {
162
+ if (!/\bagent\s*\(/.test(codeLine)) return undefined;
163
+ const afterAgent = codeLine.replace(/^.*?\bagent\s*\(/, "(");
164
+ const argTail = afterAgent.trimStart().slice(1).trimStart();
165
+ if (argTail.length > 0 && !argTail.startsWith("{")) return undefined;
166
+ return afterAgent;
167
+ }
168
+
139
169
  /**
140
170
  * 遍历 source 中所有 agent 调用的行范围,对每个调用执行 callback。
141
171
  *
@@ -150,9 +180,6 @@ function stripStringsAndComments(line: string): string {
150
180
  * 内嵌的 agent() 调用——它们同样被 `\bagent\s*\(` 匹配)。
151
181
  *
152
182
  * 匹配前逐行剔除字符串/注释内容(MF-4):字符串字面量里的 "agent(s)" 不再误触发。
153
- * 非字面量实参(agent(callVar) / agent(expr))跳过不回调:description 等选项在调用点
154
- * 静态不可见,checkAgentDescription 无法验证运行时构造的调用——继续报 warning 即误报
155
- * (review-fix-loop 的 agent(call) 三连误报根因)。
156
183
  *
157
184
  * @param callback (startLine, endLine) 0-based 行号
158
185
  */
@@ -169,49 +196,35 @@ function forEachAgentCallRange(
169
196
  const line = lines[i];
170
197
  const trimmed = line.trim();
171
198
 
172
- // 跳过注释
173
- if (trimmed.startsWith("//") || trimmed.startsWith("*") || trimmed.startsWith("/*")) {
199
+ // 跳过注释
200
+ if (isCommentLine(trimmed)) {
174
201
  continue;
175
202
  }
176
203
 
177
204
  // 匹配/计括号都用剔除字符串与注释后的行,避免字面量内容干扰
178
205
  const codeLine = stripStringsAndComments(line);
179
206
 
180
- // 检测 agent 调用开始
181
- if (!inAgentCall && /\bagent\s*\(/.test(codeLine)) {
207
+ if (!inAgentCall) {
208
+ // 检测 agent 调用开始(非字面量实参 → undefined,跳过本行)
209
+ const afterAgent = matchAgentCallHead(codeLine);
210
+ if (afterAgent === undefined) continue;
182
211
  inAgentCall = true;
183
212
  depth = 0;
184
213
  agentStartLine = i;
185
- // 从 agent( 开始计括号
186
- const afterAgent = codeLine.replace(/^.*?\bagent\s*\(/, "(");
187
- // 非字面量实参(agent(callVar) / agent(expr))→ 跳过(见函数头注释)。
188
- // 形如 `agent(` 换行 `{` 的多行字面量调用(argTail 为空)保留原追踪行为。
189
- const argTail = afterAgent.trimStart().slice(1).trimStart();
190
- if (argTail.length > 0 && !argTail.startsWith("{")) {
191
- inAgentCall = false;
192
- continue;
193
- }
194
- for (const ch of afterAgent) {
195
- if (ch === "(" || ch === "{" || ch === "[") depth++;
196
- if (ch === ")" || ch === "}" || ch === "]") depth--;
197
- }
214
+ // 从 agent( 开始计括号
215
+ depth += bracketDepthDelta(afterAgent);
198
216
  if (depth <= 0) {
199
- // 单行 agent 调用
217
+ // 单行 agent 调用
200
218
  callback(agentStartLine, i);
201
219
  inAgentCall = false;
202
220
  }
203
221
  continue;
204
222
  }
205
223
 
206
- if (inAgentCall) {
207
- for (const ch of codeLine) {
208
- if (ch === "(" || ch === "{" || ch === "[") depth++;
209
- if (ch === ")" || ch === "}" || ch === "]") depth--;
210
- }
211
- if (depth <= 0) {
212
- callback(agentStartLine, i);
213
- inAgentCall = false;
214
- }
224
+ depth += bracketDepthDelta(codeLine);
225
+ if (depth <= 0) {
226
+ callback(agentStartLine, i);
227
+ inAgentCall = false;
215
228
  }
216
229
  }
217
230
  }
@@ -247,15 +260,15 @@ function checkAgentCallOptions(
247
260
  for (let i = startLine; i <= endLine; i++) {
248
261
  const line = lines[i];
249
262
 
250
- // 跳过变量声明(const/let/var outputSchema = ...)
263
+ // 跳过变量声明(const/let/var outputSchema = ...)
251
264
  if (/\b(?:const|let|var)\s+outputSchema\b/.test(line)) {
252
265
  continue;
253
266
  }
254
267
 
255
- // 匹配:outputSchema 作为对象 key(简写或显式)
268
+ // 匹配:outputSchema 作为对象 key(简写或显式)
256
269
  if (/\boutputSchema\s*[,\}]/.test(line) || /\boutputSchema\s*:/.test(line)) {
257
- // 排除:outputSchema 作为 value(在另一个 key 的冒号后)
258
- // e.g. "schema: outputSchema," — outputSchema 前是冒号
270
+ // 排除:outputSchema 作为 value(在另一个 key 的冒号后)
271
+ // e.g. "schema: outputSchema," — outputSchema 前是冒号
259
272
  const beforeOutput = line.substring(0, line.indexOf("outputSchema"));
260
273
  if (/:\s*$/.test(beforeOutput)) {
261
274
  continue; // outputSchema 是 value,不是 key
@@ -329,7 +342,7 @@ function checkAgentDescription(source: string): LintFinding[] {
329
342
  // 对象以展开开头(agent({ ...call, ... })):description 来自运行时对象、调用点静态
330
343
  // 不可见——无法验证即不报(review-fix-loop 的 agent({ ...call, agent: ... }) 即此形态)。
331
344
  if (/\{\s*\.\.\./.test(range)) return;
332
- // 匹配 description 或 label 作为对象 key(后跟冒号)
345
+ // 匹配 description 或 label 作为对象 key(后跟冒号)
333
346
  if (!/\b(description|label)\s*:/.test(range)) {
334
347
  findings.push({
335
348
  severity: "warning",
@@ -416,7 +429,7 @@ function isIIFEAwaited(source: string, iifeStart: number): boolean {
416
429
  function checkBareAsyncIIFE(source: string): LintFinding[] {
417
430
  if (!ENTRY_POINT_PATTERNS.some((p) => p.test(source))) return [];
418
431
 
419
- // 用 matchAll 检查所有 IIFE(脚本可能有多个,每个都需独立判断)
432
+ // 用 matchAll 检查所有 IIFE(脚本可能有多个,每个都需独立判断)
420
433
  const findings: LintFinding[] = [];
421
434
  for (const match of source.matchAll(BARE_ASYNC_IIFE_PATTERN)) {
422
435
  const iifeStart = match.index ?? 0;
@@ -519,13 +532,13 @@ function checkMetaPhases(source: string): LintFinding[] {
519
532
  function checkPhaseConsistency(source: string): LintFinding[] {
520
533
  const findings: LintFinding[] = [];
521
534
 
522
- // 提取 meta.phases 声明的字符串 + 声明所在行号
535
+ // 提取 meta.phases 声明的字符串 + 声明所在行号
523
536
  const declared = new Map<string, number>();
524
537
  const phasesArrayMatch = source.match(/phases\s*:\s*\[[^\]]*\]/);
525
538
  if (phasesArrayMatch && phasesArrayMatch.index !== undefined) {
526
539
  const inner = phasesArrayMatch[0];
527
- // 对象数组(如 [{title,detail}])由 checkMetaPhases 单独报,这里跳过提取,
528
- // 避免从对象字段里误抽出字符串作 declared。
540
+ // 对象数组(如 [{title,detail}])由 checkMetaPhases 单独报,这里跳过提取,
541
+ // 避免从对象字段里误抽出字符串作 declared。
529
542
  if (!/\[\s*\{/.test(inner)) {
530
543
  const phasesLine = source.slice(0, phasesArrayMatch.index).split("\n").length;
531
544
  for (const m of inner.matchAll(/['"]([^'"]+)['"]/g)) {
@@ -534,7 +547,7 @@ function checkPhaseConsistency(source: string): LintFinding[] {
534
547
  }
535
548
  }
536
549
 
537
- // 提取所有 phase() 调用实参 + 首次出现的行号
550
+ // 提取所有 phase() 调用实参 + 首次出现的行号
538
551
  const called = new Map<string, number>();
539
552
  for (const m of source.matchAll(/\bphase\s*\(\s*['"]([^'"]+)['"]/g)) {
540
553
  if (m.index === undefined) continue;
@@ -542,10 +555,10 @@ function checkPhaseConsistency(source: string): LintFinding[] {
542
555
  if (!called.has(m[1])) called.set(m[1], lineNum);
543
556
  }
544
557
 
545
- // 两者都为空 → 跳过(脚本不使用 phase 机制)
558
+ // 两者都为空 → 跳过(脚本不使用 phase 机制)
546
559
  if (declared.size === 0 && called.size === 0) return [];
547
560
 
548
- // 声明了但从未 phase() 调用
561
+ // 声明了但从未 phase() 调用
549
562
  for (const [name, line] of declared) {
550
563
  if (!called.has(name)) {
551
564
  findings.push({
@@ -557,7 +570,7 @@ function checkPhaseConsistency(source: string): LintFinding[] {
557
570
  }
558
571
  }
559
572
 
560
- // 调用了但未声明
573
+ // 调用了但未声明
561
574
  for (const [name, line] of called) {
562
575
  if (!declared.has(name)) {
563
576
  findings.push({
@@ -613,6 +626,54 @@ function checkMetaFieldQuality(field: string, value: string): LintFinding[] {
613
626
  return findings;
614
627
  }
615
628
 
629
+ /** 对象的 keys 全部收集进集合(非对象安全退化:不加任何 key)。 */
630
+ function collectObjectKeys(src: unknown, out: Set<string>): void {
631
+ if (src === null || typeof src !== "object") return;
632
+ for (const k of Object.keys(src as Record<string, unknown>)) out.add(k);
633
+ }
634
+
635
+ /** patternProperties 的 `^word\\d+$` 形态提取 word 前缀作参数名(其余形态不加)。 */
636
+ function collectPatternPropertyNames(pp: unknown, out: Set<string>): void {
637
+ if (pp === null || typeof pp !== "object") return;
638
+ for (const p of Object.keys(pp as Record<string, unknown>)) {
639
+ const m = p.match(/^\^([a-zA-Z]+)\\d\+\$$/);
640
+ if (m) out.add(m[1] as string);
641
+ }
642
+ }
643
+
644
+ /** W1 参数名集合 = parameters.properties keys + patternProperties 的 word 前缀。 */
645
+ function collectDeclaredParamNames(parameters: unknown): Set<string> {
646
+ const paramNames = new Set<string>();
647
+ if (parameters === null || typeof parameters !== "object") return paramNames;
648
+ const params = parameters as Record<string, unknown>;
649
+ collectObjectKeys(params.properties, paramNames);
650
+ collectPatternPropertyNames(params.patternProperties, paramNames);
651
+ return paramNames;
652
+ }
653
+
654
+ /** W1:单字段内已声明参数名的 ':'/'=' 形态检查(文案见 finding)。 */
655
+ function findParamNameFindings(
656
+ field: string,
657
+ value: string,
658
+ paramNames: ReadonlySet<string>,
659
+ ): LintFinding[] {
660
+ const findings: LintFinding[] = [];
661
+ // W1:已声明参数名的 ':'/'=' 形态(参数名转义防 RegExp 注入崩溃——exec-review F2;
662
+ // ':' 形态加 \\b 前缀防子串误报(subtask: 不命中 task——exec-review F6))
663
+ for (const name of paramNames) {
664
+ const nameEsc = name.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
665
+ if (new RegExp(`\\b${nameEsc}:\\s`).test(value) || new RegExp(`\\b${nameEsc}=\\S`).test(value)) {
666
+ findings.push({
667
+ severity: "error",
668
+ line: 1,
669
+ message: `meta.${field} 包含已声明参数名 '${name}'('${name}:' / '${name}=' 形态)——参数契约请 read 脚本文件的 @pi-meta parameters 查询,description/when/notFor 只放路由信息`,
670
+ suggestion: `从 meta.${field} 移除 '${name}: ...' / '${name}=...',改在 parameters/usage 中声明`,
671
+ });
672
+ }
673
+ }
674
+ return findings;
675
+ }
676
+
616
677
  /**
617
678
  * W1-W3:SSOT lint(m4)——保 §5.1 注入段 description 短单句、不含已声明参数名。
618
679
  * 仅对 parseResourceMeta 解析成功的 meta 执行(旧 const meta 格式不检查)。
@@ -624,44 +685,16 @@ function checkMetaFieldQuality(field: string, value: string): LintFinding[] {
624
685
  */
625
686
  function checkMetaQuality(meta: { description?: string; when?: string; notFor?: string; parameters?: Record<string, unknown> }): LintFinding[] {
626
687
  const findings: LintFinding[] = [];
627
- const description = meta.description ?? "";
628
-
629
- // W1 参数名集合
630
- const paramNames = new Set<string>();
631
- if (meta.parameters && typeof meta.parameters === "object") {
632
- const props = (meta.parameters as Record<string, unknown>).properties;
633
- if (props !== null && typeof props === "object") {
634
- for (const k of Object.keys(props as Record<string, unknown>)) paramNames.add(k);
635
- }
636
- const pp = (meta.parameters as Record<string, unknown>).patternProperties;
637
- if (pp !== null && typeof pp === "object") {
638
- for (const p of Object.keys(pp as Record<string, unknown>)) {
639
- const m = p.match(/^\^([a-zA-Z]+)\\d\+\$$/);
640
- if (m) paramNames.add(m[1] as string);
641
- }
642
- }
643
- }
688
+ const paramNames = collectDeclaredParamNames(meta.parameters);
644
689
 
645
690
  const fields: Array<[string, string]> = [
646
- ["description", description],
691
+ ["description", meta.description ?? ""],
647
692
  ["when", meta.when ?? ""],
648
693
  ["notFor", meta.notFor ?? ""],
649
694
  ];
650
695
  for (const [field, value] of fields) {
651
696
  if (value.length === 0) continue;
652
- // W1:已声明参数名的 ':'/'=' 形态(参数名转义防 RegExp 注入崩溃——exec-review F2;
653
- // ':' 形态加 \\b 前缀防子串误报(subtask: 不命中 task——exec-review F6))
654
- for (const name of paramNames) {
655
- const nameEsc = name.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
656
- if (new RegExp(`\\b${nameEsc}:\\s`).test(value) || new RegExp(`\\b${nameEsc}=\\S`).test(value)) {
657
- findings.push({
658
- severity: "error",
659
- line: 1,
660
- message: `meta.${field} 包含已声明参数名 '${name}'('${name}:' / '${name}=' 形态)——参数契约请 read 脚本文件的 @pi-meta parameters 查询,description/when/notFor 只放路由信息`,
661
- suggestion: `从 meta.${field} 移除 '${name}: ...' / '${name}=...',改在 parameters/usage 中声明`,
662
- });
663
- }
664
- }
697
+ findings.push(...findParamNameFindings(field, value, paramNames));
665
698
  findings.push(...checkMetaFieldQuality(field, value));
666
699
  }
667
700
  return findings;
@@ -724,10 +757,10 @@ export function lintScript(source: string): LintResult {
724
757
  const lines = source.split("\n");
725
758
  const findings: LintFinding[] = [];
726
759
 
727
- // 入口检查(必须有 agent/parallel/pipeline 之一)
760
+ // 入口检查(必须有 agent/parallel/pipeline 之一)
728
761
  findings.push(...checkEntryPoint(source));
729
762
 
730
- // 逐行检查(result.output、文件传状态等)
763
+ // 逐行检查(result.output、文件传状态等)
731
764
  for (let i = 0; i < lines.length; i++) {
732
765
  findings.push(...checkLine(lines[i], i + 1));
733
766
  }
@@ -735,23 +768,23 @@ export function lintScript(source: string): LintResult {
735
768
  // agent 调用上下文检查(outputSchema 作为 key)
736
769
  findings.push(...checkAgentCalls(source));
737
770
 
738
- // [HISTORICAL] 顶层未 await 的异步 IIFE + 内部调 agent——子进程被提前 kill。
739
- // 教训来源:daily-news-impact.js 用 (async function main(){...})();() 包裹整个脚本,
740
- // worker 外层 IIFE 不等内层 IIFE 就 postMessage("return"),主线程 transition done
741
- // → release runtime → controller.abort() → spawn 后 2ms SIGKILL 子进程。
742
- // 诊断耗时 4 轮:先后误判为 model 故障 / 工具缺失 / turn-signal abort / 并发门闩 gate 异常,
743
- // 最终靠 worker-host → handleReturn → release → abort 的调用栈定位。
771
+ // [HISTORICAL] 顶层未 await 的异步 IIFE + 内部调 agent——子进程被提前 kill。
772
+ // 教训来源:daily-news-impact.js 用 (async function main(){...})();() 包裹整个脚本,
773
+ // worker 外层 IIFE 不等内层 IIFE 就 postMessage("return"),主线程 transition done
774
+ // → release runtime → controller.abort() → spawn 后 2ms SIGKILL 子进程。
775
+ // 诊断耗时 4 轮:先后误判为 model 故障 / 工具缺失 / turn-signal abort / 并发门闩 gate 异常,
776
+ // 最终靠 worker-host → handleReturn → release → abort 的调用栈定位。
744
777
  findings.push(...checkBareAsyncIIFE(source));
745
778
 
746
- // m4 W1-W3:meta 质量(description/when/notFor 短单句 + 不含已声明参数名)。
747
- // 仅对 IF1 解析成功的 @pi-meta 执行——旧 const meta 格式(D1 无 adapter)不检查。
779
+ // m4 W1-W3:meta 质量(description/when/notFor 短单句 + 不含已声明参数名)。
780
+ // 仅对 IF1 解析成功的 @pi-meta 执行——旧 const meta 格式(D1 无 adapter)不检查。
748
781
  const meta = parseResourceMeta(source, "workflow");
749
782
  if (meta && meta.kind === "workflow") {
750
783
  findings.push(...checkMetaQuality(meta));
751
784
  }
752
785
 
753
- // 显示性检查(warning):agent 缺 description / meta.phases 形式 / phase 一致性。
754
- // 目的:让 TUI /workflows 视图避免 unnamed agent 与 (unnamed) phase 分组。
786
+ // 显示性检查(warning):agent 缺 description / meta.phases 形式 / phase 一致性。
787
+ // 目的:让 TUI /workflows 视图避免 unnamed agent 与 (unnamed) phase 分组。
755
788
  findings.push(...checkAgentDescription(source));
756
789
  findings.push(...checkMetaPhases(source));
757
790
  findings.push(...checkPhaseConsistency(source));
@@ -29,7 +29,7 @@ export type WorkerExitHandler = (code: number) => void;
29
29
 
30
30
  export class WorkerHandle {
31
31
  private readonly worker: Worker;
32
- /**
32
+ /**
33
33
  * 竞态守卫。true = 此 handle 仍是当前活动 handle;false = 已 terminate,
34
34
  * 后续事件(已终止 worker 延迟触发的 message/error/exit)必须忽略。
35
35
  *
@@ -42,17 +42,17 @@ export class WorkerHandle {
42
42
  this.worker = worker;
43
43
  }
44
44
 
45
- /** 此 handle 是否仍是当前活动 handle(terminate 后 false,G-025)。 */
45
+ /** 此 handle 是否仍是当前活动 handle(terminate 后 false,G-025)。 */
46
46
  get isCurrent(): boolean {
47
47
  return this.current;
48
48
  }
49
49
 
50
- /** 底层 Worker(WorkerHost/RunRuntime 偶尔需要直接访问,如 ref/href)。 */
50
+ /** 底层 Worker(WorkerHost/RunRuntime 偶尔需要直接访问,如 ref/href)。 */
51
51
  get raw(): Worker {
52
52
  return this.worker;
53
53
  }
54
54
 
55
- /**
55
+ /**
56
56
  * 向 worker 发送消息。terminate 后 no-op(已终止 handle 的 postMessage 无意义)。
57
57
  */
58
58
  postMessage(msg: unknown): void {
@@ -60,7 +60,7 @@ export class WorkerHandle {
60
60
  this.worker.postMessage(msg);
61
61
  }
62
62
 
63
- /**
63
+ /**
64
64
  * 终止 worker 线程。幂等——重复调用安全,第二次起 no-op。
65
65
  * 置 isCurrent=false 后再 await worker.terminate,确保并发 exit 事件
66
66
  * 在 terminate resolve 之前到达时也被守卫拦下。
@@ -71,13 +71,13 @@ export class WorkerHandle {
71
71
  try {
72
72
  await this.worker.terminate();
73
73
  } catch (err) {
74
- // terminate 失败不阻断(worker 可能已退出)。current 已 false,安全。
75
- // 不向上抛——调用方(RunRuntime.release)不应被底层线程错误打断。
74
+ // terminate 失败不阻断(worker 可能已退出)。current 已 false,安全。
75
+ // 不向上抛——调用方(RunRuntime.release)不应被底层线程错误打断。
76
76
  void err;
77
77
  }
78
78
  }
79
79
 
80
- /**
80
+ /**
81
81
  * 绑定 message 回调。仅当 isCurrent 时触发——已终止 handle 的事件被吞掉。
82
82
  * 返回 this 便于链式 onMessage(...).onError(...).onExit(...)。
83
83
  */
@@ -89,7 +89,7 @@ export class WorkerHandle {
89
89
  return this;
90
90
  }
91
91
 
92
- /**
92
+ /**
93
93
  * 绑定 error 回调。仅当 isCurrent 时触发。
94
94
  */
95
95
  onError(handler: WorkerErrorHandler): this {
@@ -100,7 +100,7 @@ export class WorkerHandle {
100
100
  return this;
101
101
  }
102
102
 
103
- /**
103
+ /**
104
104
  * 绑定 exit 回调。仅当 isCurrent 时触发——这是 G-025 的关键守卫:
105
105
  * terminate(old) → startWorker(new) → old exit 触发时,old handle.current
106
106
  * 已为 false,回调 no-op,不会误删 new worker。
@@ -28,7 +28,7 @@ import { buildWorkerScript } from "./worker-script-builder.ts";
28
28
  // ── WorkerHostImpl ───────────────────────────────────────────
29
29
 
30
30
  export class WorkerHostImpl implements WorkerHost {
31
- /**
31
+ /**
32
32
  * 启动一个 Worker thread 运行 workflow 脚本。
33
33
  *
34
34
  * 1. 用 buildWorkerScript(spec.scriptSource) 包装用户脚本(注入 agent/parallel/
@@ -59,9 +59,9 @@ export class WorkerHostImpl implements WorkerHost {
59
59
  name: spec.scriptName,
60
60
  description: spec.description,
61
61
  },
62
- // D-12 regression fix (round-2 #1):注入 budget,否则 worker 内 $BUDGET.total 恒为 0。
63
- // 旧 agent-call-handler.ts 删除时同时丢失了 budget 注入和 budget-update 发送方,
64
- // 导致依赖 $BUDGET 做动态预算分支的脚本静默得到全 0。
62
+ // D-12 regression fix (round-2 #1):注入 budget,否则 worker 内 $BUDGET.total 恒为 0。
63
+ // 旧 agent-call-handler.ts 删除时同时丢失了 budget 注入和 budget-update 发送方,
64
+ // 导致依赖 $BUDGET 做动态预算分支的脚本静默得到全 0。
65
65
  budget: {
66
66
  maxTokens: spec.budgetTokens,
67
67
  usedTokens: 0,
@@ -77,9 +77,9 @@ export class WorkerHostImpl implements WorkerHost {
77
77
 
78
78
  const handle = new WorkerHandle(worker);
79
79
 
80
- // 绑定事件——WorkerHandle 内部用 isCurrent 守卫,terminate 后回调 no-op(G-025)。
81
- // handlers 的 onMessage/onError/onExit 都是 async,这里 void 掉 promise(worker 事件
82
- // 不能 await,且 handler 内部错误由 lifecycle 统一捕获)。
80
+ // 绑定事件——WorkerHandle 内部用 isCurrent 守卫,terminate 后回调 no-op(G-025)。
81
+ // handlers 的 onMessage/onError/onExit 都是 async,这里 void 掉 promise(worker 事件
82
+ // 不能 await,且 handler 内部错误由 lifecycle 统一捕获)。
83
83
  handle.onMessage((raw) => {
84
84
  void handlers.onMessage(raw);
85
85
  });
@@ -87,9 +87,9 @@ export class WorkerHostImpl implements WorkerHost {
87
87
  void handlers.onError(err);
88
88
  });
89
89
  handle.onExit((code) => {
90
- // C.3 修复:传 handle 给 onExit,调用方用 handle.isCurrent 做竞态防护。
91
- // 注意:此时 handle.isCurrent 仍为 true(onExit 回调仅在 isCurrent 时触发,
92
- // WorkerHandle 的内部守卫已过滤掉 terminate 后的 stale exit)。
90
+ // C.3 修复:传 handle 给 onExit,调用方用 handle.isCurrent 做竞态防护。
91
+ // 注意:此时 handle.isCurrent 仍为 true(onExit 回调仅在 isCurrent 时触发,
92
+ // WorkerHandle 的内部守卫已过滤掉 terminate 后的 stale exit)。
93
93
  void handlers.onExit(code, handle);
94
94
  });
95
95