@zhushanwen/subagent-core 0.2.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 (330) hide show
  1. package/README.md +114 -0
  2. package/dist/chunk-3VOERJPJ.js +22 -0
  3. package/dist/chunk-A4IVZWVX.js +31 -0
  4. package/dist/execution/engine/engines/zcode/constants.cjs +54 -0
  5. package/dist/execution/engine/engines/zcode/constants.d.cts +31 -0
  6. package/dist/execution/engine/engines/zcode/constants.d.ts +31 -0
  7. package/dist/execution/engine/engines/zcode/constants.js +22 -0
  8. package/dist/execution/engine/engines/zcode/reader.cjs +276 -0
  9. package/dist/execution/engine/engines/zcode/reader.d.cts +20 -0
  10. package/dist/execution/engine/engines/zcode/reader.d.ts +20 -0
  11. package/dist/execution/engine/engines/zcode/reader.js +239 -0
  12. package/dist/execution/engine/paths.cjs +55 -0
  13. package/dist/execution/engine/paths.d.cts +8 -0
  14. package/dist/execution/engine/paths.d.ts +8 -0
  15. package/dist/execution/engine/paths.js +26 -0
  16. package/dist/execution/relay-env.cjs +62 -0
  17. package/dist/execution/relay-env.d.cts +33 -0
  18. package/dist/execution/relay-env.d.ts +33 -0
  19. package/dist/execution/relay-env.js +20 -0
  20. package/dist/index.cjs +1852 -0
  21. package/dist/index.d.cts +1184 -0
  22. package/dist/index.d.ts +1184 -0
  23. package/dist/index.js +1810 -0
  24. package/dist/types-BxyAidGf.d.cts +875 -0
  25. package/dist/types-BxyAidGf.d.ts +875 -0
  26. package/package.json +99 -0
  27. package/src/__tests__/agent-opts-resolver-schema-prompt.test.ts +142 -0
  28. package/src/__tests__/append-system-prompt-assembly.test.ts +242 -0
  29. package/src/__tests__/builtin-workflows-structure.test.ts +180 -0
  30. package/src/__tests__/derive-closed-display-parity.test.ts +93 -0
  31. package/src/__tests__/fr4-get-state-handshake.test.ts +125 -0
  32. package/src/__tests__/fr8-orphan-recovery.test.ts +259 -0
  33. package/src/__tests__/m2-append-content-probe.test.ts +73 -0
  34. package/src/__tests__/manifest-store.test.ts +368 -0
  35. package/src/__tests__/record-store-cache.test.ts +335 -0
  36. package/src/__tests__/record-store-index.test.ts +560 -0
  37. package/src/__tests__/record-store-last-line.test.ts +129 -0
  38. package/src/__tests__/review-fix-loop-script.test.ts +288 -0
  39. package/src/__tests__/review-fix-loop-utils.test.ts +2377 -0
  40. package/src/__tests__/robustness-low-batch1.test.ts +286 -0
  41. package/src/__tests__/robustness-medium-batch1.test.ts +69 -0
  42. package/src/__tests__/robustness-medium-batch2.test.ts +65 -0
  43. package/src/__tests__/robustness-medium-batch3.test.ts +30 -0
  44. package/src/__tests__/robustness-medium-batch4.test.ts +358 -0
  45. package/src/__tests__/session-runner.test.ts +69 -0
  46. package/src/__tests__/smoke.test.ts +9 -0
  47. package/src/__tests__/stream-sink.test.ts +203 -0
  48. package/src/core/__tests__/host-services.test.ts +144 -0
  49. package/src/core/__tests__/logger.test.ts +78 -0
  50. package/src/core/__tests__/notify-ports.test.ts +104 -0
  51. package/src/core/host-services.ts +97 -0
  52. package/src/core/logger.ts +47 -0
  53. package/src/core/notify-ports.ts +126 -0
  54. package/src/execution/__tests__/__fixtures__/notifier-golden-snapshots.json +53 -0
  55. package/src/execution/__tests__/__fixtures__/truncline.snapshot.json +1 -0
  56. package/src/execution/__tests__/agent-result-mapper.test.ts +150 -0
  57. package/src/execution/__tests__/alive-store.test.ts +147 -0
  58. package/src/execution/__tests__/ask-user-transit-e2e.test.ts +490 -0
  59. package/src/execution/__tests__/channel-registry-handshake.test.ts +242 -0
  60. package/src/execution/__tests__/chat-engine-routing.test.ts +610 -0
  61. package/src/execution/__tests__/chatmode-first-round-closure-spawn.test.ts +190 -0
  62. package/src/execution/__tests__/concurrency-pool.test.ts +250 -0
  63. package/src/execution/__tests__/config.test.ts +302 -0
  64. package/src/execution/__tests__/delivery-methods.test.ts +424 -0
  65. package/src/execution/__tests__/dialog-queue.test.ts +299 -0
  66. package/src/execution/__tests__/epipe-fallback.test.ts +241 -0
  67. package/src/execution/__tests__/execute-and-await-worktree.test.ts +243 -0
  68. package/src/execution/__tests__/execute-nesting.test.ts +323 -0
  69. package/src/execution/__tests__/execute-options-mapper.test.ts +200 -0
  70. package/src/execution/__tests__/execution-record.test.ts +1394 -0
  71. package/src/execution/__tests__/explicit-agent-ref-guard.test.ts +171 -0
  72. package/src/execution/__tests__/finalize-record.test.ts +367 -0
  73. package/src/execution/__tests__/finalized-marker.test.ts +104 -0
  74. package/src/execution/__tests__/format-schema-instruction.test.ts +169 -0
  75. package/src/execution/__tests__/gc-timer.test.ts +184 -0
  76. package/src/execution/__tests__/get-record-for-action-restart.test.ts +254 -0
  77. package/src/execution/__tests__/helpers/mock-extension-api.ts +30 -0
  78. package/src/execution/__tests__/helpers/spawn-mock.ts +242 -0
  79. package/src/execution/__tests__/host-mode.test.ts +87 -0
  80. package/src/execution/__tests__/lifecycle-manager-lock.test.ts +211 -0
  81. package/src/execution/__tests__/lifecycle-manager.test.ts +383 -0
  82. package/src/execution/__tests__/lifecycle-predicates.test.ts +116 -0
  83. package/src/execution/__tests__/manifest-parentid.test.ts +117 -0
  84. package/src/execution/__tests__/model-resolver.test.ts +465 -0
  85. package/src/execution/__tests__/nested-visibility-env-propagation.test.ts +287 -0
  86. package/src/execution/__tests__/nested-visibility.test.ts +325 -0
  87. package/src/execution/__tests__/output-collector.test.ts +358 -0
  88. package/src/execution/__tests__/path-encoding.test.ts +104 -0
  89. package/src/execution/__tests__/pi-invocation.test.ts +134 -0
  90. package/src/execution/__tests__/record-store.test.ts +1057 -0
  91. package/src/execution/__tests__/records-cwd-isolation.test.ts +91 -0
  92. package/src/execution/__tests__/recursive-visibility-baseline.test.ts +339 -0
  93. package/src/execution/__tests__/recursive-visibility-env.test.ts +273 -0
  94. package/src/execution/__tests__/relay-env.test.ts +42 -0
  95. package/src/execution/__tests__/resource-policy.test.ts +109 -0
  96. package/src/execution/__tests__/rpc-mode.test.ts +89 -0
  97. package/src/execution/__tests__/run-and-finalize-chatmode.test.ts +267 -0
  98. package/src/execution/__tests__/run-spawn-chatmode-settled.test.ts +253 -0
  99. package/src/execution/__tests__/run-spawn-edges.test.ts +687 -0
  100. package/src/execution/__tests__/run-spawn-integration.test.ts +933 -0
  101. package/src/execution/__tests__/run-spawn-resume.test.ts +322 -0
  102. package/src/execution/__tests__/run-spawn-rpc-mode.test.ts +196 -0
  103. package/src/execution/__tests__/run-spawn-stdout-callback-throw.test.ts +199 -0
  104. package/src/execution/__tests__/session-context-resolver.test.ts +167 -0
  105. package/src/execution/__tests__/session-file-gc.test.ts +293 -0
  106. package/src/execution/__tests__/session-reconstructor.test.ts +379 -0
  107. package/src/execution/__tests__/session-runner-epipe.test.ts +178 -0
  108. package/src/execution/__tests__/session-runner-schema-env.test.ts +350 -0
  109. package/src/execution/__tests__/spawn-args.test.ts +445 -0
  110. package/src/execution/__tests__/spawn-event-adapter-rpc.test.ts +189 -0
  111. package/src/execution/__tests__/spawn-event-adapter.test.ts +167 -0
  112. package/src/execution/__tests__/spawn-worktree-guidance.test.ts +207 -0
  113. package/src/execution/__tests__/spawned-children.test.ts +92 -0
  114. package/src/execution/__tests__/start-sync-model-guard.test.ts +150 -0
  115. package/src/execution/__tests__/stdin-writer.test.ts +462 -0
  116. package/src/execution/__tests__/stream-sink-retirement.test.ts +261 -0
  117. package/src/execution/__tests__/subagent-service-abort.test.ts +60 -0
  118. package/src/execution/__tests__/subagent-service-message-close.test.ts +629 -0
  119. package/src/execution/__tests__/subagent-service-parent-guard.test.ts +180 -0
  120. package/src/execution/__tests__/subagent-service.test.ts +788 -0
  121. package/src/execution/__tests__/subprocess-agent-runner-routing.test.ts +310 -0
  122. package/src/execution/__tests__/subprocess-agent-runner.test.ts +612 -0
  123. package/src/execution/__tests__/temp-prompt.test.ts +53 -0
  124. package/src/execution/__tests__/timeout-integration.test.ts +615 -0
  125. package/src/execution/__tests__/tombstone-store.test.ts +73 -0
  126. package/src/execution/__tests__/turn-limiter-semantics.test.ts +194 -0
  127. package/src/execution/__tests__/turn-limiter.test.ts +65 -0
  128. package/src/execution/__tests__/ui-channels.test.ts +187 -0
  129. package/src/execution/__tests__/ui-interaction-model.test.ts +67 -0
  130. package/src/execution/__tests__/ui-request-handler-factory.test.ts +369 -0
  131. package/src/execution/__tests__/ui-request-handler.test.ts +204 -0
  132. package/src/execution/__tests__/ui-request-observability.test.ts +113 -0
  133. package/src/execution/__tests__/ui-request-queue.test.ts +133 -0
  134. package/src/execution/__tests__/worktree-manager.test.ts +633 -0
  135. package/src/execution/__tests__/worktree-pid-registration.integration.test.ts +229 -0
  136. package/src/execution/__tests__/worktree-reconcile.integration.test.ts +181 -0
  137. package/src/execution/__tests__/worktree-registry.test.ts +199 -0
  138. package/src/execution/agent-registry.ts +199 -0
  139. package/src/execution/agent-result-mapper.ts +90 -0
  140. package/src/execution/alive-store.ts +119 -0
  141. package/src/execution/argv-mirror.ts +113 -0
  142. package/src/execution/best-effort.ts +38 -0
  143. package/src/execution/channel-registry-access.ts +144 -0
  144. package/src/execution/concurrency-pool.ts +116 -0
  145. package/src/execution/config.ts +165 -0
  146. package/src/execution/dialog-queue.ts +330 -0
  147. package/src/execution/engine/__tests__/common/data-dir.test.ts +78 -0
  148. package/src/execution/engine/__tests__/common/errors.test.ts +132 -0
  149. package/src/execution/engine/__tests__/common/event-journal.test.ts +177 -0
  150. package/src/execution/engine/__tests__/common/kill-chain.test.ts +192 -0
  151. package/src/execution/engine/__tests__/common/nesting-guard.test.ts +81 -0
  152. package/src/execution/engine/__tests__/common/persona-router.test.ts +123 -0
  153. package/src/execution/engine/__tests__/common/pool-manager.test.ts +154 -0
  154. package/src/execution/engine/__tests__/common/schema-emulation.test.ts +128 -0
  155. package/src/execution/engine/__tests__/conformance/__fixtures__/pi-golden-events.json +28 -0
  156. package/src/execution/engine/__tests__/conformance/agent-event-invariants.ts +141 -0
  157. package/src/execution/engine/__tests__/conformance/contract.abort.test.ts +109 -0
  158. package/src/execution/engine/__tests__/conformance/contract.agent-events.test.ts +101 -0
  159. package/src/execution/engine/__tests__/conformance/contract.probe.test.ts +77 -0
  160. package/src/execution/engine/__tests__/conformance/contract.read-degradation.test.ts +104 -0
  161. package/src/execution/engine/__tests__/conformance/engine-conformance.live.test.ts +201 -0
  162. package/src/execution/engine/__tests__/conformance/golden-replay.pi.test.ts +76 -0
  163. package/src/execution/engine/__tests__/conformance/golden-replay.zcode.test.ts +79 -0
  164. package/src/execution/engine/__tests__/engine-discovery.test.ts +87 -0
  165. package/src/execution/engine/__tests__/model-prompt.test.ts +197 -0
  166. package/src/execution/engine/__tests__/paths.test.ts +39 -0
  167. package/src/execution/engine/__tests__/registry.test.ts +120 -0
  168. package/src/execution/engine/__tests__/routing.test.ts +231 -0
  169. package/src/execution/engine/common/data-dir.ts +66 -0
  170. package/src/execution/engine/common/errors.ts +183 -0
  171. package/src/execution/engine/common/event-journal.ts +254 -0
  172. package/src/execution/engine/common/journal-replay.ts +62 -0
  173. package/src/execution/engine/common/kill-chain.ts +221 -0
  174. package/src/execution/engine/common/nesting-guard.ts +50 -0
  175. package/src/execution/engine/common/persona-router.ts +108 -0
  176. package/src/execution/engine/common/pool-manager.ts +226 -0
  177. package/src/execution/engine/common/schema-emulation.ts +189 -0
  178. package/src/execution/engine/common/session-view-projection.ts +51 -0
  179. package/src/execution/engine/engine-discovery.ts +65 -0
  180. package/src/execution/engine/engines/pi/__tests__/pi-engine.test.ts +469 -0
  181. package/src/execution/engine/engines/pi/__tests__/reader.test.ts +155 -0
  182. package/src/execution/engine/engines/pi/__tests__/task-spec-mapper.test.ts +164 -0
  183. package/src/execution/engine/engines/pi/pi-engine.ts +415 -0
  184. package/src/execution/engine/engines/pi/reader.ts +48 -0
  185. package/src/execution/engine/engines/pi/registration.ts +35 -0
  186. package/src/execution/engine/engines/pi/task-spec-mapper.ts +100 -0
  187. package/src/execution/engine/engines/zcode/__tests__/__fixtures__/zcode-golden-spawn.json +39 -0
  188. package/src/execution/engine/engines/zcode/__tests__/launcher.test.ts +150 -0
  189. package/src/execution/engine/engines/zcode/__tests__/parser.test.ts +246 -0
  190. package/src/execution/engine/engines/zcode/__tests__/preparer.test.ts +228 -0
  191. package/src/execution/engine/engines/zcode/__tests__/reader.test.ts +210 -0
  192. package/src/execution/engine/engines/zcode/__tests__/registration.test.ts +71 -0
  193. package/src/execution/engine/engines/zcode/__tests__/zcode-engine.live.test.ts +127 -0
  194. package/src/execution/engine/engines/zcode/__tests__/zcode-engine.test.ts +580 -0
  195. package/src/execution/engine/engines/zcode/constants.ts +43 -0
  196. package/src/execution/engine/engines/zcode/golden-sample.ts +39 -0
  197. package/src/execution/engine/engines/zcode/launcher.ts +161 -0
  198. package/src/execution/engine/engines/zcode/parser.ts +436 -0
  199. package/src/execution/engine/engines/zcode/preparer.ts +363 -0
  200. package/src/execution/engine/engines/zcode/reader.ts +381 -0
  201. package/src/execution/engine/engines/zcode/registration.ts +37 -0
  202. package/src/execution/engine/engines/zcode/zcode-engine.ts +658 -0
  203. package/src/execution/engine/host-task-spec.ts +47 -0
  204. package/src/execution/engine/model-prompt.ts +158 -0
  205. package/src/execution/engine/paths.ts +42 -0
  206. package/src/execution/engine/port.ts +153 -0
  207. package/src/execution/engine/registry.ts +133 -0
  208. package/src/execution/engine/routing.ts +218 -0
  209. package/src/execution/engine/types.ts +309 -0
  210. package/src/execution/execute-options-mapper.ts +115 -0
  211. package/src/execution/execution-record.ts +984 -0
  212. package/src/execution/finalize-record.ts +254 -0
  213. package/src/execution/finalized-marker.ts +70 -0
  214. package/src/execution/get-state-handshake.ts +104 -0
  215. package/src/execution/host-mode.ts +56 -0
  216. package/src/execution/idle-gc.ts +47 -0
  217. package/src/execution/lifecycle-manager.ts +513 -0
  218. package/src/execution/lifecycle-predicates.ts +65 -0
  219. package/src/execution/manifest-store.ts +256 -0
  220. package/src/execution/model-config-service.ts +250 -0
  221. package/src/execution/model-resolver.ts +248 -0
  222. package/src/execution/notifier.ts +372 -0
  223. package/src/execution/notify-ledger.ts +580 -0
  224. package/src/execution/output-collector.ts +228 -0
  225. package/src/execution/path-encoding.ts +60 -0
  226. package/src/execution/pi-invocation.ts +120 -0
  227. package/src/execution/record-entry.ts +132 -0
  228. package/src/execution/record-store.ts +1265 -0
  229. package/src/execution/relay-env.ts +37 -0
  230. package/src/execution/session-context-resolver.ts +64 -0
  231. package/src/execution/session-file-gc.ts +120 -0
  232. package/src/execution/session-pending.ts +170 -0
  233. package/src/execution/session-reconstructor.ts +678 -0
  234. package/src/execution/session-runner.ts +1789 -0
  235. package/src/execution/sessions-index.ts +304 -0
  236. package/src/execution/spawn-event-adapter.ts +363 -0
  237. package/src/execution/stdin-writer.ts +198 -0
  238. package/src/execution/stream-sink.ts +126 -0
  239. package/src/execution/subagent-service.ts +2268 -0
  240. package/src/execution/subprocess-agent-runner.ts +317 -0
  241. package/src/execution/temp-prompt.ts +62 -0
  242. package/src/execution/tombstone-store.ts +72 -0
  243. package/src/execution/turn-limiter.ts +102 -0
  244. package/src/execution/types.ts +1023 -0
  245. package/src/execution/ui-channels.ts +216 -0
  246. package/src/execution/ui-interaction-model.ts +48 -0
  247. package/src/execution/ui-request-handler-factory.ts +243 -0
  248. package/src/execution/ui-request-observability.ts +81 -0
  249. package/src/execution/ui-request-queue.ts +184 -0
  250. package/src/execution/worktree-manager.ts +688 -0
  251. package/src/execution/worktree-registry.ts +279 -0
  252. package/src/index.ts +87 -0
  253. package/src/orchestration/__tests__/__fixtures__/worker-template.snapshot.txt +349 -0
  254. package/src/orchestration/__tests__/agent-call-catch-fallback.test.ts +202 -0
  255. package/src/orchestration/__tests__/agent-call-stream.test.ts +152 -0
  256. package/src/orchestration/__tests__/args-validator.test.ts +143 -0
  257. package/src/orchestration/__tests__/config-loader.test.ts +503 -0
  258. package/src/orchestration/__tests__/error-recovery-handlers.test.ts +809 -0
  259. package/src/orchestration/__tests__/error-recovery-postmessage-defense.test.ts +404 -0
  260. package/src/orchestration/__tests__/error-recovery-serialize-failed-result.test.ts +56 -0
  261. package/src/orchestration/__tests__/error-recovery-workflow-call.test.ts +166 -0
  262. package/src/orchestration/__tests__/execute-agent-call.test.ts +451 -0
  263. package/src/orchestration/__tests__/launcher-nested-workflow.test.ts +600 -0
  264. package/src/orchestration/__tests__/lifecycle-runid-injection.test.ts +96 -0
  265. package/src/orchestration/__tests__/lifecycle.test.ts +659 -0
  266. package/src/orchestration/__tests__/non-cloneable-return-e2e.test.ts +95 -0
  267. package/src/orchestration/__tests__/review-fix-loop-scriptpath-failfast.test.ts +183 -0
  268. package/src/orchestration/__tests__/script-lint.test.ts +831 -0
  269. package/src/orchestration/__tests__/skill-discovery.test.ts +210 -0
  270. package/src/orchestration/__tests__/test-mocks.ts +197 -0
  271. package/src/orchestration/__tests__/worker-exit-without-result.test.ts +368 -0
  272. package/src/orchestration/__tests__/worker-host.test.ts +120 -0
  273. package/src/orchestration/__tests__/worker-returnmeta-passthrough.test.ts +164 -0
  274. package/src/orchestration/__tests__/worker-script-builder-runtime.test.ts +563 -0
  275. package/src/orchestration/__tests__/worker-script-builder.test.ts +309 -0
  276. package/src/orchestration/__tests__/worker-script-template-snapshot.test.ts +129 -0
  277. package/src/orchestration/__tests__/workflow-nesting-e2e.test.ts +317 -0
  278. package/src/orchestration/__tests__/workflow-script-lint-memo.test.ts +110 -0
  279. package/src/orchestration/agent-opts-resolver.ts +174 -0
  280. package/src/orchestration/args-validator.ts +127 -0
  281. package/src/orchestration/config-loader.ts +316 -0
  282. package/src/orchestration/error-recovery.ts +1018 -0
  283. package/src/orchestration/execute-agent-call.ts +256 -0
  284. package/src/orchestration/launcher.ts +455 -0
  285. package/src/orchestration/lifecycle.ts +399 -0
  286. package/src/orchestration/models/__tests__/budget.test.ts +307 -0
  287. package/src/orchestration/models/agent-call.ts +83 -0
  288. package/src/orchestration/models/budget.ts +118 -0
  289. package/src/orchestration/models/ports.ts +164 -0
  290. package/src/orchestration/models/run-runtime.ts +104 -0
  291. package/src/orchestration/models/run-spec.ts +83 -0
  292. package/src/orchestration/models/run-state.ts +44 -0
  293. package/src/orchestration/models/trace.ts +183 -0
  294. package/src/orchestration/models/types.ts +301 -0
  295. package/src/orchestration/models/workflow-run.ts +254 -0
  296. package/src/orchestration/models/workflow-script-registry.ts +35 -0
  297. package/src/orchestration/models/workflow-script.ts +117 -0
  298. package/src/orchestration/script-lint.ts +766 -0
  299. package/src/orchestration/skill-discovery.ts +135 -0
  300. package/src/orchestration/worker-handle.ts +115 -0
  301. package/src/orchestration/worker-host.ts +98 -0
  302. package/src/orchestration/worker-script-builder.ts +421 -0
  303. package/src/orchestration/workflow-files.ts +85 -0
  304. package/src/orchestration/workflow-script-registry-impl.ts +133 -0
  305. package/src/shared/__tests__/agent-ref.test.ts +34 -0
  306. package/src/shared/__tests__/meta-parser.test.ts +304 -0
  307. package/src/shared/__tests__/model-ref.test.ts +306 -0
  308. package/src/shared/__tests__/resource-discovery-manifest-cache.test.ts +288 -0
  309. package/src/shared/__tests__/resource-discovery.test.ts +749 -0
  310. package/src/shared/__tests__/resource-meta.test.ts +51 -0
  311. package/src/shared/__tests__/schema-jsonify.test.ts +81 -0
  312. package/src/shared/__tests__/timer-delay.test.ts +61 -0
  313. package/src/shared/agent-event.ts +13 -0
  314. package/src/shared/agent-ref.ts +57 -0
  315. package/src/shared/meta-parser.ts +261 -0
  316. package/src/shared/model-ref.ts +286 -0
  317. package/src/shared/resource-discovery.ts +835 -0
  318. package/src/shared/resource-meta.ts +65 -0
  319. package/src/shared/schema-env.ts +44 -0
  320. package/src/shared/schema-jsonify.ts +58 -0
  321. package/src/shared/timer-delay.ts +54 -0
  322. package/src/shared/xml-injection.ts +35 -0
  323. package/workflows/README.md +81 -0
  324. package/workflows/_shared/agent-refs.cjs +40 -0
  325. package/workflows/chain.js +137 -0
  326. package/workflows/map-reduce.js +180 -0
  327. package/workflows/parallel.js +154 -0
  328. package/workflows/review-fix-loop-utils.cjs +1542 -0
  329. package/workflows/review-fix-loop.js +1605 -0
  330. package/workflows/scatter-gather.js +184 -0
@@ -0,0 +1,104 @@
1
+ /**
2
+ * Workflow Extension — Run Runtime
3
+ *
4
+ * 聚合内运行时资源(仅 status==="running" 时存在)。技术资源聚合,
5
+ * Engine 层类型,持 WorkerHandle 具体类(D-12 不造 interface)。
6
+ *
7
+ * 职责:封装一次 running-segment 的所有技术资源(worker 线程 +
8
+ * abort controller),统一 release 入口(AC-2:单 release 替代多 boolean flag)。
9
+ * (旧并发门闩 gate 抽象已删——no-op,实际并发由 SubagentService ConcurrencyPool 管理;
10
+ * 原 withSlot 的 pre-abort 检查内联到 error-recovery dispatchAgentCall。)
11
+ *
12
+ * 一次性生命周期(G3-001):runtime 释放后不再复用——AbortController 一次性
13
+ * 语义决定 controller 无法跨释放复用,所以整个 RunRuntime 重建。唯一注入路径:
14
+ * assignRuntime(runWorkflow 创建)与 replaceRuntime(error-recovery 崩溃重试)。
15
+ *
16
+ * 参考:domain-models.md §10、clarification.md G3-001。
17
+ */
18
+
19
+ import { WorkerHandle } from "../worker-handle.ts";
20
+
21
+ /**
22
+ * release mode 枚举——调用方表达意图。
23
+ *
24
+ * 一次性生命周期后唯一语义:terminal(终局释放,worker + controller 全释放,
25
+ * runtime 即被调用方丢弃)。原 "pause" 值已随 pause/resume 生命周期删除(F8)
26
+ * ——release 后不存在「保留待恢复」的中间形态。
27
+ */
28
+ export type ReleaseMode = "terminal";
29
+
30
+ // ── RunRuntime ───────────────────────────────────────────────
31
+
32
+ export class RunRuntime {
33
+ /** Worker 线程句柄。 */
34
+ readonly worker: WorkerHandle;
35
+ /** per-running-segment AbortController(一次性,无法复用——G3-001)。 */
36
+ readonly controller: AbortController;
37
+ /** Run 级墙钟时间预算计时器(spec.budgetTimeMs > 0 时由 lifecycle 调度,
38
+ * 到期 abortRun time_limited)。release 时清理,避免 abort/replaceRuntime
39
+ * 后孤儿计时器仍触发(rebuildRuntime 会重排一个全新的计时器,旧的不应残留)。 */
40
+ readonly timeBudgetTimer?: ReturnType<typeof setTimeout>;
41
+ /**
42
+ * 本 runtime 代际是否已收到 worker 的终态消息(return / error)。
43
+ *
44
+ * [F1] worker exit(0) 且本标记为 false = worker 静默退出、未交付任何终态——最常见根因
45
+ * 是 execute() 返回值不可克隆,worker 侧 _safePost 吞掉 DataCloneError 后 return 消息
46
+ * 根本没发出。旧实现 handleWorkerExit 对 code===0 no-op → run 永久 running、runAndWait
47
+ * 悬挂。handleWorkerExit 据此判定转 done,failed。
48
+ *
49
+ * 按代际归零:字段挂在 RunRuntime(每代际 new 一个实例)而非 run.meta——script-error
50
+ * 重试退避窗口内(error 消息已收到、run 仍 running、旧 worker exit(0))必须 no-op 等
51
+ * rebuild;若挂 meta 则 rebuild 后新 worker 再静默退出时会被旧标记误放行,重新悬挂。
52
+ *
53
+ * 写点:① handleWorkerMessage 的 return/error 分支(WorkerHandle.isCurrent 守卫保证
54
+ * 消息必来自当前代际);② handleWorkerError 进入处理前([R4-F1] 同代际幂等守卫——
55
+ * worker 崩溃时 error + exit(1) 双事件各派发一次 handleWorkerError,第一个事件标记
56
+ * 本代际已处理,第二个事件命中标志跳过,消除单次崩溃计数 +2 / 双 rebuild 交错)。
57
+ * rebuildRuntime 构造新 RunRuntime 自然重置。
58
+ */
59
+ receivedTerminalMessage = false;
60
+ /** 防止 release 重复执行(幂等)。 */
61
+ private released = false;
62
+
63
+ constructor(
64
+ worker: WorkerHandle,
65
+ controller: AbortController,
66
+ timeBudgetTimer?: ReturnType<typeof setTimeout>,
67
+ ) {
68
+ this.worker = worker;
69
+ this.controller = controller;
70
+ this.timeBudgetTimer = timeBudgetTimer;
71
+ }
72
+
73
+ /**
74
+ * 释放所有资源:terminate worker + abort controller。
75
+ *
76
+ * 幂等——重复调用安全(第二次起 no-op,released flag 守卫)。
77
+ * 调用后此 RunRuntime 应被调用方丢弃(WorkflowRun.runtime = undefined),
78
+ * 崩溃重试时由 replaceRuntime 注入新实例(G3-001)。
79
+ *
80
+ * worker.terminate 本身幂等,controller.abort 本身幂等
81
+ * (重复 abort 无副作用),但 released flag 让本方法语义更明确:
82
+ * 「释放过一次的 runtime 不再释放第二次」。
83
+ *
84
+ * @param mode terminal —— 终局释放(唯一值,保留参数为调用方语义显式化)
85
+ */
86
+ release(_mode: ReleaseMode): void {
87
+ if (this.released) return;
88
+ this.released = true;
89
+ // 清理 run 级时间预算计时器——abort/terminate/replaceRuntime 后它不应再触发
90
+ // (rebuildRuntime 会重排全新计时器;孤儿触发会把已终态的 run 误转 done)。
91
+ if (this.timeBudgetTimer) clearTimeout(this.timeBudgetTimer);
92
+ // worker.terminate 异步但幂等——不 await(release 是同步签名,调用方
93
+ // 不应被底层线程关闭阻塞;worker 收到 terminate 后自行清理)。
94
+ void this.worker.terminate();
95
+ // controller.abort 触发 listener(kill agent subprocess、中止在飞调用)。
96
+ // 一次性语义——已 aborted 的 controller 重复 abort 无副作用。
97
+ this.controller.abort();
98
+ }
99
+
100
+ /** 是否已 release(测试 + 诊断用)。 */
101
+ get isReleased(): boolean {
102
+ return this.released;
103
+ }
104
+ }
@@ -0,0 +1,83 @@
1
+ /**
2
+ * Workflow Extension — RunSpec 值对象
3
+ *
4
+ * 单次 workflow run 的不可变规格(domain-models.md §2)。
5
+ *
6
+ * 设计:
7
+ * - 全部字段 readonly——run 一旦创建,规格不可改(状态变化走 RunState)
8
+ * - scriptSource 是已 strip `export const meta` 的可执行源(WorkflowScript.toExecutable)
9
+ * - budgetTokens/budgetTimeMs 是上限(可选,未设 = 不限制)
10
+ *
11
+ * 层归属:Engine。
12
+ *
13
+ * 参考:domain-models.md §2。
14
+ */
15
+
16
+ import type { Budget } from "./budget.ts";
17
+
18
+ /**
19
+ * RunSpec——一次 workflow run 的不可变输入规格。
20
+ *
21
+ * 作为 RunStore 持久化的一部分(WorkflowRun.spec),崩溃恢复重水合后
22
+ * 需要 scriptSource/args 重建 worker(G3-001)。
23
+ */
24
+ export interface RunSpec {
25
+ /** 已 strip export 的可执行源(WorkflowScript.toExecutable 产物)。 */
26
+ readonly scriptSource: string;
27
+ /**
28
+ * 参数契约(JSON Schema draft-07,来自 script.meta.parameters 整对象透传,m3 DM2)。
29
+ *
30
+ * undefined = 不校验(安全退化——漏拷 parameters 退化是「不校验」非「校验错」)。
31
+ * 由调用方(actionRun/runAndWait/executeNestedWorkflow)从 script.meta.parameters 拷贝。
32
+ * lifecycle.runWorkflow 首行经 validateRunArgs 校验 spec.args(coerceTypes 原地规范化
33
+ * args 对象内容,字段引用不变;worker 启动与崩溃重建共用同一对象)。
34
+ */
35
+ readonly parameters?: Record<string, unknown>;
36
+ /** 调用方传入的参数(worker 内通过 $ARGS 访问)。 */
37
+ readonly args: Record<string, unknown>;
38
+ /**
39
+ * Run 级 model override(Option B:经 workerData → worker global $MODEL → agent() fallback)。
40
+ *
41
+ * undefined = 继承主 agent 模型(零配置默认)。设置时该 run 内所有 agent() 调用默认继承
42
+ * (除非 per-call 显式指定 model)。注意:不 merge 进 args(对称单路径注入),
43
+ * 而是经 worker-script-builder 注入为 $MODEL worker global。
44
+ */
45
+ readonly model?: string;
46
+ /**
47
+ * Run 级 thinkingLevel override(Option B:经 workerData → worker global $THINKING_LEVEL)。
48
+ *
49
+ * undefined = 继承主 agent thinkingLevel。取值范围由 THINKING_ORDER SSOT 派生(含 max)。
50
+ */
51
+ readonly thinkingLevel?: string;
52
+ /** Token 预算上限(未设或 0 = 不限制,见 Budget 守卫)。 */
53
+ readonly budgetTokens?: number;
54
+ /** 时间预算上限(ms,wall-clock,由 lifecycle.scheduleTimeBudget 调度)。 */
55
+ readonly budgetTimeMs?: number;
56
+ /**
57
+ * 父 Budget 共享引用(嵌套 workflow() 时由 executeNestedWorkflow 传入)。
58
+ *
59
+ * 设置时 lifecycle.runWorkflow 直接复用此 Budget 实例,而非 new 一个独立 Budget——
60
+ * 子 run 的 consume 直接反映到父 Budget,消除并行嵌套下的超支窗口(F-7 方案 B)。
61
+ * 顶层 run 无此字段(budgetTokens 走独立 Budget 构造)。
62
+ */
63
+ readonly budgetRef?: Budget;
64
+ /** 脚本名(meta.name 或文件名 stem)。 */
65
+ readonly scriptName: string;
66
+ /**
67
+ * Run 级简短标签(≤20 字符),区别于 scriptName(脚本身份名)。
68
+ * 区分同脚本的不同 run 实例(如 'migrate-users-batch1' vs 'migrate-users-batch2')。
69
+ * 旧持久化 run 缺失时为 undefined,渲染时回落 scriptName。
70
+ */
71
+ readonly slug?: string;
72
+ /** 脚本文件绝对路径(用于诊断/日志)。 */
73
+ readonly scriptPath: string;
74
+ /** 人类可读描述(meta.description)。 */
75
+ readonly description?: string;
76
+ /**
77
+ * 父 workflow 调用链(嵌套 workflow() 时自动填充,循环检测用)。
78
+ *
79
+ * 顶层 run 无此字段。子 run 的 chain = [...parentChain, parentScriptName]。
80
+ * executeNestedWorkflow 检查目标 name 是否已在 chain 中,防止 A→B→A 死循环。
81
+ */
82
+ readonly parentWorkflowChain?: readonly string[];
83
+ }
@@ -0,0 +1,44 @@
1
+ /**
2
+ * Workflow Extension — RunState 值对象
3
+ *
4
+ * 单次 workflow run 的可持久化状态(domain-models.md §3)。
5
+ *
6
+ * 设计:
7
+ * - status/reason/budget/calls/trace/errorLogs 是可变字段(运行中持续更新)
8
+ * - error/scriptResult 仅终态有值(done 时)
9
+ * - 与 RunSpec 的区别:RunSpec 不可变(输入),RunState 可变(执行快照)
10
+ *
11
+ * 层归属:Engine。
12
+ *
13
+ * 参考:domain-models.md §3。
14
+ */
15
+
16
+ import type { AgentCall } from "./agent-call.ts";
17
+ import type { Budget } from "./budget.ts";
18
+ import type { Trace } from "./trace.ts";
19
+ import type { DoneReason, RunStatus, WorkerLogEntry } from "./types.ts";
20
+
21
+ /**
22
+ * RunState——一次 run 的可持久化执行状态。
23
+ *
24
+ * 持久化由 RunStore.save(WorkflowRun) 触发(WorkflowRun 持 RunState)。
25
+ * 跨进程重启时 RunState 从 JSONL 重水合(callCache 保留,worker 由崩溃恢复重建)。
26
+ */
27
+ export interface RunState {
28
+ /** 当前状态(running/done)。 */
29
+ status: RunStatus;
30
+ /** 终态原因(done 时必有)。 */
31
+ reason?: DoneReason;
32
+ /** Token/cost 预算(含 usedTokens/usedCost 累积)。 */
33
+ budget: Budget;
34
+ /** 按 callId 索引的 agent 调用集合(含 result,跨 runtime 重建存活——callCache replay)。 */
35
+ calls: Map<number, AgentCall>;
36
+ /** 执行追踪事件流(唯一来源 D-10)。 */
37
+ trace: Trace;
38
+ /** Worker console.* 捕获条目(run 级诊断,仅展示在 TUI widget)。 */
39
+ errorLogs: WorkerLogEntry[];
40
+ /** done && reason !== completed 时可有(失败/中止/预算超限的原因)。 */
41
+ error?: string;
42
+ /** done && reason === completed 时有(脚本 execute 返回值)。 */
43
+ scriptResult?: unknown;
44
+ }
@@ -0,0 +1,183 @@
1
+ /**
2
+ * Workflow Extension — Trace 值对象
3
+ *
4
+ * 执行追踪事件流(D-10 单一来源)。纯 append-only + 单字段 update。
5
+ *
6
+ * 设计:
7
+ * - trace 节点存储 + 变更逻辑收敛为值对象(外部不能直接打洞 nodes 数组)。
8
+ * - update 只改单个 node 的 status/result/error/completedAt/sessionId(TracePatch)。
9
+ * - callId 不存在时 update no-op(防御性,避免 race 下抛错)。
10
+ * - 持久化(appendEntry)与事件通知(emit)不在本值对象内——它们由 engine 函数
11
+ * 在调用 update 前后负责(值对象只管数据形状,不管 IO)。
12
+ *
13
+ * 层归属:Engine。
14
+ *
15
+ * 参考:domain-models.md §6(字段/不变式)。
16
+ */
17
+ import type { AgentResult, ExecutionTraceNode, TracePatch } from "./types.ts";
18
+
19
+ // ── result.content 裁剪 ────────────────────────────────────────
20
+
21
+ /**
22
+ * trace 节点 result.content 裁剪上限(严格大于才裁)。
23
+ *
24
+ * export 供测试边界构造(对齐 budget.ts export 常量先例)。
25
+ * 只裁 trace 节点侧——AgentCall.result 不裁(markDone 存全量在前,
26
+ * worker cached replay 数据源保真)。
27
+ */
28
+ export const TRACE_RESULT_MAX_CHARS = 8000;
29
+
30
+ /**
31
+ * 裁剪保留的头/尾长度(各半)。
32
+ *
33
+ * 耦合声明:TRIM_HEAD_CHARS + TRIM_TAIL_CHARS === TRACE_RESULT_MAX_CHARS
34
+ * (各半相等)是 doc 示例「8001 → 裁后 8000+标记 ≈ 8057」的前提
35
+ * (rt-w1-design.json W1C2 / trimTraceResult 注释同款表述)——改 MAX 时
36
+ * 需同步检查 head/tail 是否仍各半,及上述注释/文档示例数字。
37
+ * 比例钉死在 trace.test.ts 断言中;变更需复查 detail-content.ts
38
+ * 尾 5 行消费点(TUI 尾部预览依赖 tail 段)。
39
+ */
40
+ const TRIM_HEAD_CHARS = 4000;
41
+ const TRIM_TAIL_CHARS = 4000;
42
+
43
+ /**
44
+ * 裁剪 trace result 的 content(Trace 私有纯函数)。
45
+ *
46
+ * - undefined 透传;未超限原引用透传(零拷贝,不超限路径行为与无裁剪时一致)。
47
+ * - 超限返回新对象:head + 含原始长度的标记 + tail(只裁 content,
48
+ * result 其他字段浅拷贝保留)。节点持裁剪副本,与传入对象脱钩。
49
+ * - 边界附近(如 8001 字符)裁后总长 8000 + 标记长度 > 原始长度属
50
+ * 既定语义(head/tail 固定比例下净增长有界),禁止自行缩短 head/tail。
51
+ */
52
+ function trimTraceResult(result: AgentResult | undefined): AgentResult | undefined {
53
+ if (result === undefined) return result;
54
+ const { content } = result;
55
+ if (content.length <= TRACE_RESULT_MAX_CHARS) return result;
56
+ const trimmed =
57
+ content.slice(0, TRIM_HEAD_CHARS) +
58
+ `\n…[trace result truncated, original ${content.length} chars]…\n` +
59
+ content.slice(-TRIM_TAIL_CHARS);
60
+ return { ...result, content: trimmed };
61
+ }
62
+
63
+ /**
64
+ * Trace 值对象(事件流,唯一来源 D-10)。
65
+ *
66
+ * 不变式:
67
+ * - nodes 只增不改索引顺序(append-only)
68
+ * - update 只改单个 node 的 status/result/error/completedAt/sessionId
69
+ * - byIndex 与 nodes 恒一致(每个 append/remove 同步维护,无惰性重建);
70
+ * Map 值与数组元素引用共享(非拷贝),nodes 仍是持久化与 TUI 投影 SSOT
71
+ * - 不含 verifyStrategy(G-020 删除,不迁移)
72
+ */
73
+ export class Trace {
74
+ private readonly nodes: ExecutionTraceNode[] = [];
75
+ /** stepIndex 倒排索引(查询加速 O(1);值与 nodes 元素引用共享)。 */
76
+ private readonly byIndex = new Map<number, ExecutionTraceNode>();
77
+
78
+ /**
79
+ * 从已有节点数组重建 Trace(用于 RunStore 反序列化重水合)。
80
+ *
81
+ * 防御性拷贝——传入数组不被持有,外部 mutation 不影响 Trace。
82
+ * 不验证节点顺序/唯一性(调用方保证快照来源可信)。
83
+ * 不做裁剪——落盘快照已是 write 路径裁剪后形态,旧版本未裁剪长
84
+ * content 重水合保持原样(read 路径无二次信息损失)。
85
+ * 重水合后 call.traceNode(来自快照 calls[].traceNode,
86
+ * jsonl-run-store.ts:156 直接传入)与 Trace.nodes 副本非同引用——
87
+ * D-10 引用共享仅 live append 路径成立。
88
+ */
89
+ static fromArray(nodes: readonly ExecutionTraceNode[]): Trace {
90
+ const trace = new Trace();
91
+ for (const node of nodes) {
92
+ const copy = { ...node };
93
+ trace.nodes.push(copy);
94
+ trace.byIndex.set(copy.stepIndex, copy); // 重复 stepIndex last-wins
95
+ }
96
+ return trace;
97
+ }
98
+
99
+ /**
100
+ * Append a trace node(append-only,不改已有节点)。
101
+ *
102
+ * 入口裁剪:超长 result.content 先 mutate 入参节点的 result 字段,
103
+ * 再 push 原节点引用(禁止 push 副本——保持 AgentCall.traceNode 与
104
+ * Trace.nodes 共享同一引用的 D-10 不变式)。
105
+ */
106
+ append(node: ExecutionTraceNode): void {
107
+ node.result = trimTraceResult(node.result);
108
+ this.nodes.push(node);
109
+ this.byIndex.set(node.stepIndex, node);
110
+ }
111
+
112
+ /**
113
+ * Update a trace node by stepIndex (callId) with a partial patch.
114
+ *
115
+ * 只改 patch 中提供的字段(status/result/error/completedAt/sessionId)。
116
+ * stepIndex 不存在时 no-op(防御性——agent 完成/失败回调可能晚于 run 终止到达)。
117
+ */
118
+ update(stepIndex: number, patch: TracePatch): void {
119
+ const node = this.findByStepIndex(stepIndex);
120
+ if (!node) return; // no-op: 不存在不抛错(D-10 防御性)
121
+
122
+ if (patch.status !== undefined) node.status = patch.status;
123
+ // 入口裁剪:节点持裁剪副本,与 patch.result 脱钩为两个对象
124
+ // (call.result 保留全量——replay 数据源保真)。patch.result 未提供不动。
125
+ if (patch.result !== undefined) node.result = trimTraceResult(patch.result);
126
+ if (patch.error !== undefined) node.error = patch.error;
127
+ if (patch.completedAt !== undefined) node.completedAt = patch.completedAt;
128
+ if (patch.sessionId !== undefined) node.sessionId = patch.sessionId;
129
+ if (patch.sessionFile !== undefined) node.sessionFile = patch.sessionFile;
130
+ }
131
+
132
+ /**
133
+ * 查找指定 stepIndex 的节点(byIndex O(1),trace 中 stepIndex 应唯一)。
134
+ *
135
+ * 语义差异声明(旧线性扫 first-match → Map last-wins):仅在破坏
136
+ * stepIndex 唯一性的违规使用下可见,两组场景——
137
+ * 1. 重复 append 同 stepIndex 且未 remove:返回最后一个节点(last-wins;
138
+ * 旧线性扫 first-match 会返回第一个)。
139
+ * 2. 重复 append 后 removeByStepIndex:remove 的 findIndex 命中首个旧节点
140
+ * splice,而 byIndex.delete 把整个 stepIndex 键删掉——nodes 残留第二个
141
+ * 节点成为孤儿(find/update 不可达,length/toArray 仍可见)。
142
+ * 合法路径无差异:唯一性由 discard 先 remove 再 append 保证(W1TC12 锚定)。
143
+ */
144
+ private findByStepIndex(stepIndex: number): ExecutionTraceNode | undefined {
145
+ return this.byIndex.get(stepIndex);
146
+ }
147
+
148
+ /** 按节点引用删除(仅用于测试或 run 重建场景;正常运行不调用)。 */
149
+ find(stepIndex: number): ExecutionTraceNode | undefined {
150
+ return this.findByStepIndex(stepIndex);
151
+ }
152
+
153
+ /**
154
+ * 按 stepIndex 移除节点(崩溃重建清理在飞 call 用)。
155
+ *
156
+ * 正常运行不调用(append-only 不变式)。仅 error-recovery 的 discardInFlightCalls
157
+ * (rebuildRuntime 内,F2)清理被旧 runtime abort 的在飞 call 时用——移除其 trace
158
+ * 节点,让重跑重发 agent-call 时 append 全新节点走全新执行路径(避免 stale
159
+ * "running" 节点残留 + trace.update 命中旧节点导致新节点 orphan)。
160
+ * stepIndex 不存在时 no-op(防御性)。
161
+ */
162
+ removeByStepIndex(stepIndex: number): void {
163
+ // 先 findIndex 判存在再删,避免 byIndex 与 nodes 漂移
164
+ const idx = this.nodes.findIndex((n) => n.stepIndex === stepIndex);
165
+ if (idx === -1) return;
166
+ this.nodes.splice(idx, 1);
167
+ this.byIndex.delete(stepIndex);
168
+ }
169
+
170
+ /**
171
+ * readonly 视图——返回内部 nodes 数组引用(仅类型级 readonly,运行时无
172
+ * 防御)。消费方禁止结构化 mutate(push/splice/重排/覆盖元素):byIndex
173
+ * 引入后外部结构化 mutate 会使 nodes 与倒排索引 desync。字段级变更走 update()。
174
+ */
175
+ toArray(): readonly ExecutionTraceNode[] {
176
+ return this.nodes;
177
+ }
178
+
179
+ /** 当前节点数。 */
180
+ get length(): number {
181
+ return this.nodes.length;
182
+ }
183
+ }