@zhushanwen/subagent-core 0.4.0 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (309) hide show
  1. package/dist/{chunk-4KN4TTG7.js → chunk-43ONBFZX.js} +1 -1
  2. package/dist/{chunk-X7SZ5HLQ.js → chunk-V3VHZ2VX.js} +20 -27
  3. package/dist/execution/engine/engines/zcode/constants.cjs +29 -41
  4. package/dist/execution/engine/engines/zcode/constants.d.cts +65 -53
  5. package/dist/execution/engine/engines/zcode/constants.d.ts +65 -53
  6. package/dist/execution/engine/engines/zcode/constants.js +17 -27
  7. package/dist/execution/engine/engines/zcode/reader.d.cts +2 -1
  8. package/dist/execution/engine/engines/zcode/reader.d.ts +2 -1
  9. package/dist/execution/engine/engines/zcode/reader.js +2 -2
  10. package/dist/index.cjs +17100 -14082
  11. package/dist/index.d.cts +5336 -4033
  12. package/dist/index.d.ts +5336 -4033
  13. package/dist/index.js +17020 -14055
  14. package/dist/{types-DpUO16pj.d.cts → types-C3fE3R9x.d.cts} +280 -112
  15. package/dist/{types-DpUO16pj.d.ts → types-C3fE3R9x.d.ts} +280 -112
  16. package/dist.bundle/index.cjs +34933 -0
  17. package/package.json +3 -3
  18. package/src/__tests__/agent-opts-resolver-schema-prompt.test.ts +0 -1
  19. package/src/__tests__/append-system-prompt-assembly.test.ts +8 -7
  20. package/src/__tests__/fr4-get-state-handshake.test.ts +2 -2
  21. package/src/__tests__/m2-append-content-probe.test.ts +0 -1
  22. package/src/__tests__/manifest-store.test.ts +10 -9
  23. package/src/__tests__/record-store-cache.test.ts +0 -2
  24. package/src/__tests__/record-store-index.test.ts +1 -2
  25. package/src/__tests__/review-fix-loop-script.test.ts +4 -2
  26. package/src/__tests__/review-fix-loop-utils.test.ts +10 -10
  27. package/src/__tests__/robustness-low-batch1.test.ts +6 -5
  28. package/src/__tests__/robustness-medium-batch1.test.ts +2 -2
  29. package/src/__tests__/robustness-medium-batch2.test.ts +17 -6
  30. package/src/__tests__/robustness-medium-batch4.test.ts +2 -2
  31. package/src/__tests__/session-runner.test.ts +1 -1
  32. package/src/core/__tests__/host-services.test.ts +2 -2
  33. package/src/core/__tests__/logger.test.ts +1 -1
  34. package/src/core/error-message.ts +9 -0
  35. package/src/core/host-services.ts +21 -5
  36. package/src/core/notify-ports.ts +18 -5
  37. package/src/execution/__tests__/agent-profile.test.ts +4 -4
  38. package/src/execution/__tests__/agent-registry.test.ts +370 -0
  39. package/src/execution/__tests__/agent-result-mapper.test.ts +18 -2
  40. package/src/execution/__tests__/agents-assembly.test.ts +2 -2
  41. package/src/execution/__tests__/alive-store.test.ts +1 -1
  42. package/src/execution/__tests__/ask-user-transit-e2e.test.ts +6 -6
  43. package/src/execution/__tests__/chat-engine-routing.test.ts +68 -33
  44. package/src/execution/__tests__/chatmode-first-round-closure-spawn.test.ts +4 -4
  45. package/src/execution/__tests__/cold-resurrect.test.ts +283 -0
  46. package/src/execution/__tests__/collect-budget.test.ts +291 -0
  47. package/src/execution/__tests__/collect-coordinator-service.test.ts +327 -0
  48. package/src/execution/__tests__/collect-coordinator.test.ts +371 -0
  49. package/src/execution/__tests__/collect-mixed-dispatch.test.ts +262 -0
  50. package/src/execution/__tests__/config-collect-sync.test.ts +120 -0
  51. package/src/execution/__tests__/config.test.ts +1 -1
  52. package/src/execution/__tests__/delivery-methods.test.ts +75 -62
  53. package/src/execution/__tests__/descendant-sweep-guards.test.ts +220 -0
  54. package/src/execution/__tests__/descendant-sweep.test.ts +6 -6
  55. package/src/execution/__tests__/dialog-queue.test.ts +2 -2
  56. package/src/execution/__tests__/engine-model-validation.test.ts +741 -0
  57. package/src/execution/__tests__/epipe-fallback.test.ts +29 -24
  58. package/src/execution/__tests__/execute-and-await-worktree.test.ts +21 -91
  59. package/src/execution/__tests__/execute-nesting.test.ts +34 -188
  60. package/src/execution/__tests__/execution-record.test.ts +217 -60
  61. package/src/execution/__tests__/execution-runtime-face.test.ts +5 -5
  62. package/src/execution/__tests__/explicit-agent-ref-guard.test.ts +4 -4
  63. package/src/execution/__tests__/finalize-record.test.ts +173 -17
  64. package/src/execution/__tests__/finalized-marker.test.ts +1 -1
  65. package/src/execution/__tests__/gc-timer.test.ts +56 -3
  66. package/src/execution/__tests__/get-record-for-action-restart.test.ts +12 -12
  67. package/src/execution/__tests__/get-state-handshake.test.ts +1 -1
  68. package/src/execution/__tests__/helpers/mock-extension-api.ts +1 -1
  69. package/src/execution/__tests__/helpers/session-runner-mocks.ts +113 -0
  70. package/src/execution/__tests__/helpers/spawn-mock.ts +150 -3
  71. package/src/execution/__tests__/helpers/subagent-service-mocks.ts +137 -0
  72. package/src/execution/__tests__/keep-alive-no-progress.test.ts +50 -148
  73. package/src/execution/__tests__/kill-all-escalation.test.ts +2 -2
  74. package/src/execution/__tests__/lifecycle-predicates.test.ts +1 -2
  75. package/src/execution/__tests__/manifest-parentid.test.ts +4 -4
  76. package/src/execution/__tests__/manifest-store-tmp-recovery.test.ts +1 -1
  77. package/src/execution/__tests__/max-turns-to-watchdog-ms.test.ts +1 -1
  78. package/src/execution/__tests__/model-resolver.test.ts +2 -2
  79. package/src/execution/__tests__/nested-visibility-env-propagation.test.ts +23 -121
  80. package/src/execution/__tests__/nested-visibility.test.ts +2 -0
  81. package/src/execution/__tests__/notify-batch.test.ts +500 -0
  82. package/src/execution/__tests__/notify-ledger.test.ts +1000 -18
  83. package/src/execution/__tests__/output-collector.test.ts +117 -6
  84. package/src/execution/__tests__/pi-invocation.test.ts +36 -4
  85. package/src/execution/__tests__/record-entry-collect.test.ts +102 -0
  86. package/src/execution/__tests__/record-store.test.ts +10 -9
  87. package/src/execution/__tests__/records-cwd-isolation.test.ts +2 -2
  88. package/src/execution/__tests__/recursive-visibility-baseline.test.ts +29 -132
  89. package/src/execution/__tests__/recursive-visibility-env.test.ts +55 -179
  90. package/src/execution/__tests__/relay-env.test.ts +12 -1
  91. package/src/execution/__tests__/rpc-mode.test.ts +2 -2
  92. package/src/execution/__tests__/run-and-finalize-anchoring.test.ts +387 -0
  93. package/src/execution/__tests__/run-and-finalize-chatmode.test.ts +15 -9
  94. package/src/execution/__tests__/run-spawn-chatmode-settled.test.ts +4 -4
  95. package/src/execution/__tests__/run-spawn-edges.test.ts +17 -15
  96. package/src/execution/__tests__/run-spawn-integration.test.ts +2 -2
  97. package/src/execution/__tests__/run-spawn-resume.test.ts +2 -2
  98. package/src/execution/__tests__/run-spawn-rpc-mode.test.ts +2 -2
  99. package/src/execution/__tests__/run-spawn-stdout-callback-throw.test.ts +4 -4
  100. package/src/execution/__tests__/service-kill-escalation.test.ts +7 -5
  101. package/src/execution/__tests__/session-context-resolver.test.ts +0 -2
  102. package/src/execution/__tests__/session-file-gc.test.ts +36 -1
  103. package/src/execution/__tests__/session-pending.test.ts +257 -14
  104. package/src/execution/__tests__/session-reconstructor.test.ts +366 -15
  105. package/src/execution/__tests__/session-runner-branch-cache-lru.test.ts +1 -1
  106. package/src/execution/__tests__/session-runner-close-prune.test.ts +2 -2
  107. package/src/execution/__tests__/session-runner-dispatch.test.ts +489 -0
  108. package/src/execution/__tests__/session-runner-epipe.test.ts +3 -3
  109. package/src/execution/__tests__/session-runner-heartbeat-idle-fallback.test.ts +5 -4
  110. package/src/execution/__tests__/session-runner-lifecycle-helpers.test.ts +290 -0
  111. package/src/execution/__tests__/session-runner-schema-env.test.ts +7 -5
  112. package/src/execution/__tests__/settled-watchdog.test.ts +282 -47
  113. package/src/execution/__tests__/spawn-args.test.ts +11 -10
  114. package/src/execution/__tests__/spawn-event-adapter-rpc.test.ts +26 -23
  115. package/src/execution/__tests__/spawn-event-adapter.test.ts +3 -3
  116. package/src/execution/__tests__/spawn-worktree-guidance.test.ts +5 -4
  117. package/src/execution/__tests__/spawned-children.test.ts +2 -1
  118. package/src/execution/__tests__/start-collect-guard.test.ts +255 -0
  119. package/src/execution/__tests__/start-sync-model-guard.test.ts +5 -5
  120. package/src/execution/__tests__/stdin-writer.test.ts +6 -4
  121. package/src/execution/__tests__/stream-sink-retirement.test.ts +6 -6
  122. package/src/execution/__tests__/subagent-actions-core.test.ts +48 -22
  123. package/src/execution/__tests__/subagent-service-message-close.test.ts +29 -26
  124. package/src/execution/__tests__/subagent-service-multiproc-guard.test.ts +21 -8
  125. package/src/execution/__tests__/subagent-service-notify-gate.test.ts +27 -22
  126. package/src/execution/__tests__/subagent-service-parent-guard.test.ts +30 -29
  127. package/src/execution/__tests__/subagent-service-recovery-bounds.test.ts +45 -20
  128. package/src/execution/__tests__/subagent-service.test.ts +37 -30
  129. package/src/execution/__tests__/subprocess-agent-runner-routing.test.ts +88 -12
  130. package/src/execution/__tests__/subprocess-agent-runner-timeout.test.ts +75 -0
  131. package/src/execution/__tests__/subprocess-agent-runner.test.ts +22 -20
  132. package/src/execution/__tests__/sync-collect-recovery.test.ts +1117 -0
  133. package/src/execution/__tests__/temp-prompt.test.ts +1 -1
  134. package/src/execution/__tests__/timeout-integration.test.ts +6 -5
  135. package/src/execution/__tests__/tombstone-store.test.ts +1 -1
  136. package/src/execution/__tests__/turn-limiter-semantics.test.ts +1 -1
  137. package/src/execution/__tests__/turn-limiter.test.ts +1 -1
  138. package/src/execution/__tests__/ui-request-handler-factory.test.ts +12 -6
  139. package/src/execution/__tests__/ui-request-handler.test.ts +4 -3
  140. package/src/execution/__tests__/ui-request-queue.test.ts +142 -2
  141. package/src/execution/__tests__/worktree-git-ops.test.ts +1 -1
  142. package/src/execution/__tests__/worktree-manager.test.ts +14 -5
  143. package/src/execution/__tests__/worktree-pid-registration.integration.test.ts +4 -3
  144. package/src/execution/__tests__/worktree-reconcile-aging.test.ts +2 -2
  145. package/src/execution/__tests__/worktree-reconcile.integration.test.ts +1 -1
  146. package/src/execution/__tests__/worktree-registry.test.ts +1 -1
  147. package/src/execution/agent-registry.ts +74 -30
  148. package/src/execution/agent-result-mapper.ts +3 -0
  149. package/src/execution/cold-resurrect.ts +199 -0
  150. package/src/execution/collect-coordinator.ts +200 -0
  151. package/src/execution/config.ts +77 -5
  152. package/src/execution/engine/__tests__/common/capability-gate.test.ts +91 -0
  153. package/src/execution/engine/__tests__/common/data-dir.test.ts +1 -1
  154. package/src/execution/engine/__tests__/common/event-journal.test.ts +1 -1
  155. package/src/execution/engine/__tests__/common/journal-wiring.test.ts +84 -0
  156. package/src/execution/engine/__tests__/common/kill-chain.test.ts +34 -7
  157. package/src/execution/engine/__tests__/common/persona-router.test.ts +4 -5
  158. package/src/execution/engine/__tests__/common/pool-manager.test.ts +213 -53
  159. package/src/execution/engine/__tests__/common/session-view-service-zcode-dbpath.test.ts +149 -0
  160. package/src/execution/engine/__tests__/common/session-view-service.test.ts +499 -0
  161. package/src/execution/engine/__tests__/conformance/contract.abort.test.ts +22 -112
  162. package/src/execution/engine/__tests__/conformance/contract.agent-events.test.ts +15 -28
  163. package/src/execution/engine/__tests__/conformance/contract.read-degradation.test.ts +1 -1
  164. package/src/execution/engine/__tests__/conformance/engine-conformance.live.test.ts +12 -12
  165. package/src/execution/engine/__tests__/conformance/golden-replay.pi.test.ts +2 -2
  166. package/src/execution/engine/__tests__/conformance/golden-replay.zcode.test.ts +21 -82
  167. package/src/execution/engine/__tests__/conformance/zcode-appserver-harness.ts +4 -7
  168. package/src/execution/engine/__tests__/engine-discovery.test.ts +15 -3
  169. package/src/execution/engine/__tests__/model-prompt.test.ts +15 -3
  170. package/src/execution/engine/__tests__/registry.test.ts +4 -2
  171. package/src/execution/engine/__tests__/routing.test.ts +115 -6
  172. package/src/execution/engine/common/capability-gate.ts +92 -0
  173. package/src/execution/engine/common/journal-wiring.ts +97 -0
  174. package/src/execution/engine/common/kill-chain.ts +42 -10
  175. package/src/execution/engine/common/nesting-guard.ts +66 -0
  176. package/src/execution/engine/common/persona-router.ts +18 -8
  177. package/src/execution/engine/common/pool-manager.ts +332 -78
  178. package/src/execution/engine/common/session-view-service.ts +506 -0
  179. package/src/execution/engine/common/session-view-types.ts +125 -0
  180. package/src/execution/engine/engines/pi/__tests__/pi-engine.test.ts +174 -28
  181. package/src/execution/engine/engines/pi/__tests__/spawn-opts-direct.test.ts +257 -0
  182. package/src/execution/{argv-mirror.ts → engine/engines/pi/argv-mirror.ts} +43 -21
  183. package/src/execution/{get-state-handshake.ts → engine/engines/pi/get-state-handshake.ts} +1 -1
  184. package/src/execution/{output-collector.ts → engine/engines/pi/output-collector.ts} +108 -19
  185. package/src/execution/engine/engines/pi/pi-engine.ts +434 -38
  186. package/src/execution/{pi-invocation.ts → engine/engines/pi/pi-invocation.ts} +2 -2
  187. package/src/execution/engine/engines/pi/reader.ts +11 -0
  188. package/src/execution/engine/engines/pi/registration.ts +4 -2
  189. package/src/execution/{session-runner.ts → engine/engines/pi/session-runner.ts} +617 -412
  190. package/src/execution/{spawn-event-adapter.ts → engine/engines/pi/spawn-event-adapter.ts} +75 -34
  191. package/src/execution/{stdin-writer.ts → engine/engines/pi/stdin-writer.ts} +10 -9
  192. package/src/execution/{temp-prompt.ts → engine/engines/pi/temp-prompt.ts} +2 -2
  193. package/src/execution/{turn-limiter.ts → engine/engines/pi/turn-limiter.ts} +1 -1
  194. package/src/execution/engine/engines/zcode/__tests__/__fixtures__/fake-appserver.mjs +54 -27
  195. package/src/execution/engine/engines/zcode/__tests__/appserver-launcher.test.ts +321 -0
  196. package/src/execution/engine/engines/zcode/__tests__/connection.test.ts +13 -12
  197. package/src/execution/engine/engines/zcode/__tests__/parser.test.ts +7 -210
  198. package/src/execution/engine/engines/zcode/__tests__/preparer.test.ts +6 -110
  199. package/src/execution/engine/engines/zcode/__tests__/session-channel-dispose-harvest.test.ts +247 -0
  200. package/src/execution/engine/engines/zcode/__tests__/session-channel-turn-timers.test.ts +451 -0
  201. package/src/execution/engine/engines/zcode/__tests__/session-channel.test.ts +20 -8
  202. package/src/execution/engine/engines/zcode/__tests__/zcode-engine-appserver.test.ts +77 -110
  203. package/src/execution/engine/engines/zcode/__tests__/zcode-engine-degrade.test.ts +26 -320
  204. package/src/execution/engine/engines/zcode/__tests__/zcode-engine-dispose.test.ts +210 -0
  205. package/src/execution/engine/engines/zcode/__tests__/zcode-engine-retry.test.ts +353 -0
  206. package/src/execution/engine/engines/zcode/__tests__/zcode-engine-status.test.ts +282 -0
  207. package/src/execution/engine/engines/zcode/__tests__/zcode-engine-timeout.test.ts +372 -0
  208. package/src/execution/engine/engines/zcode/__tests__/zcode-engine.live.test.ts +48 -148
  209. package/src/execution/engine/engines/zcode/appserver-launcher.ts +167 -0
  210. package/src/execution/engine/engines/zcode/connection.ts +24 -11
  211. package/src/execution/engine/engines/zcode/constants.ts +75 -71
  212. package/src/execution/engine/engines/zcode/golden-sample.ts +8 -46
  213. package/src/execution/engine/engines/zcode/parser.ts +12 -346
  214. package/src/execution/engine/engines/zcode/preparer.ts +12 -143
  215. package/src/execution/engine/engines/zcode/session-channel.ts +351 -39
  216. package/src/execution/engine/engines/zcode/zcode-engine.ts +665 -760
  217. package/src/execution/engine/host-task-spec.ts +32 -36
  218. package/src/execution/engine/model-validation.ts +177 -0
  219. package/src/execution/engine/port.ts +24 -6
  220. package/src/execution/engine/routing.ts +75 -1
  221. package/src/execution/engine/types.ts +30 -103
  222. package/src/execution/execution-record.ts +229 -144
  223. package/src/execution/finalize-record.ts +141 -99
  224. package/src/execution/idle-gc.ts +28 -0
  225. package/src/execution/lifecycle-predicates.ts +1 -1
  226. package/src/execution/notifier.ts +234 -25
  227. package/src/execution/notify-host.ts +232 -0
  228. package/src/execution/record-entry.ts +16 -0
  229. package/src/execution/record-store.ts +280 -103
  230. package/src/execution/round-settlement.ts +93 -0
  231. package/src/execution/session-file-gc.ts +96 -62
  232. package/src/execution/session-reconstructor.ts +256 -143
  233. package/src/execution/sessions-index.ts +117 -47
  234. package/src/execution/settled-watchdog.ts +264 -52
  235. package/src/execution/subagent-actions-core.ts +84 -28
  236. package/src/execution/subagent-service.ts +1225 -964
  237. package/src/execution/subprocess-agent-runner.ts +144 -97
  238. package/src/execution/sync-rebuild.ts +87 -0
  239. package/src/execution/types.ts +72 -0
  240. package/src/execution/ui-request-handler-factory.ts +102 -74
  241. package/src/execution/ui-request-queue.ts +50 -19
  242. package/src/index.ts +442 -316
  243. package/src/orchestration/__tests__/agent-call-catch-fallback.test.ts +1 -1
  244. package/src/orchestration/__tests__/agent-call-stream.test.ts +2 -2
  245. package/src/orchestration/__tests__/args-validator.test.ts +14 -0
  246. package/src/orchestration/__tests__/config-loader.test.ts +1 -1
  247. package/src/orchestration/__tests__/error-recovery-rebuild-failure.test.ts +1 -1
  248. package/src/orchestration/__tests__/error-recovery-terminal-hardening.test.ts +11 -9
  249. package/src/orchestration/__tests__/execute-agent-call.test.ts +151 -11
  250. package/src/orchestration/__tests__/file-run-store-prune.test.ts +1 -1
  251. package/src/orchestration/__tests__/file-run-store-throttle.test.ts +1 -1
  252. package/src/orchestration/__tests__/file-run-store.test.ts +7 -6
  253. package/src/orchestration/__tests__/launcher-nested-workflow.test.ts +2 -2
  254. package/src/orchestration/__tests__/lifecycle-abort-broadcast-signal.test.ts +1 -1
  255. package/src/orchestration/__tests__/lifecycle-runid-injection.test.ts +3 -3
  256. package/src/orchestration/__tests__/lifecycle.test.ts +7 -5
  257. package/src/orchestration/__tests__/non-cloneable-return-e2e.test.ts +1 -1
  258. package/src/orchestration/__tests__/review-fix-loop-scriptpath-failfast.test.ts +1 -1
  259. package/src/orchestration/__tests__/run-snapshot.test.ts +8 -5
  260. package/src/orchestration/__tests__/script-generate.test.ts +5 -5
  261. package/src/orchestration/__tests__/script-lint.test.ts +17 -0
  262. package/src/orchestration/__tests__/skill-discovery.test.ts +2 -2
  263. package/src/orchestration/__tests__/test-mocks.ts +2 -0
  264. package/src/orchestration/__tests__/worker-exit-without-result.test.ts +7 -6
  265. package/src/orchestration/__tests__/worker-message-pump-finalize-run.test.ts +229 -0
  266. package/src/orchestration/__tests__/{error-recovery-handlers.test.ts → worker-message-pump-handlers.test.ts} +27 -19
  267. package/src/orchestration/__tests__/{error-recovery-postmessage-defense.test.ts → worker-message-pump-postmessage-defense.test.ts} +8 -8
  268. package/src/orchestration/__tests__/{error-recovery-serialize-failed-result.test.ts → worker-message-pump-serialize-failed-result.test.ts} +2 -2
  269. package/src/orchestration/__tests__/{error-recovery-workflow-call.test.ts → worker-message-pump-workflow-call.test.ts} +1 -1
  270. package/src/orchestration/__tests__/worker-pending-timeout-abort.test.ts +1 -1
  271. package/src/orchestration/__tests__/worker-script-builder.test.ts +1 -1
  272. package/src/orchestration/__tests__/workflow-files.test.ts +10 -10
  273. package/src/orchestration/__tests__/workflow-nesting-e2e.test.ts +1 -1
  274. package/src/orchestration/__tests__/workflow-script-registry-impl.test.ts +1 -1
  275. package/src/orchestration/agent-opts-resolver.ts +1 -1
  276. package/src/orchestration/args-validator.ts +53 -31
  277. package/src/orchestration/execute-agent-call.ts +19 -73
  278. package/src/orchestration/launcher.ts +128 -81
  279. package/src/orchestration/lifecycle.ts +43 -45
  280. package/src/orchestration/models/ports.ts +4 -4
  281. package/src/orchestration/models/run-runtime.ts +2 -2
  282. package/src/orchestration/models/trace.ts +1 -1
  283. package/src/orchestration/models/types.ts +111 -22
  284. package/src/orchestration/models/workflow-run.ts +1 -1
  285. package/src/orchestration/script-lint.ts +91 -58
  286. package/src/orchestration/{error-recovery.ts → worker-message-pump.ts} +157 -150
  287. package/src/shared/__tests__/atomic-write.test.ts +1 -1
  288. package/src/shared/__tests__/meta-parser.test.ts +151 -0
  289. package/src/shared/__tests__/resource-discovery-host-roots.test.ts +5 -5
  290. package/src/shared/__tests__/resource-discovery.test.ts +258 -215
  291. package/src/shared/atomic-write.ts +12 -9
  292. package/src/shared/meta-parser.ts +158 -84
  293. package/src/shared/model-ref.ts +15 -2
  294. package/src/shared/resource-discovery.ts +9 -183
  295. package/src/shared/schema-jsonify.ts +1 -1
  296. package/workflows/review-fix-loop-utils.cjs +151 -89
  297. package/workflows/review-fix-loop-utils.d.cts +287 -0
  298. package/src/execution/__tests__/execute-options-mapper.test.ts +0 -200
  299. package/src/execution/engine/engines/pi/__tests__/task-spec-mapper.test.ts +0 -164
  300. package/src/execution/engine/engines/pi/task-spec-mapper.ts +0 -100
  301. package/src/execution/engine/engines/zcode/__tests__/__fixtures__/zcode-golden-spawn.json +0 -39
  302. package/src/execution/engine/engines/zcode/__tests__/launcher.test.ts +0 -150
  303. package/src/execution/engine/engines/zcode/__tests__/preparer-appserver.test.ts +0 -387
  304. package/src/execution/engine/engines/zcode/__tests__/zcode-engine.test.ts +0 -710
  305. package/src/execution/engine/engines/zcode/appserver-home.ts +0 -442
  306. package/src/execution/engine/engines/zcode/appserver-probe.ts +0 -141
  307. package/src/execution/engine/engines/zcode/launcher.ts +0 -161
  308. package/src/execution/execute-options-mapper.ts +0 -115
  309. package/src/shared/__tests__/resource-discovery-manifest-cache.test.ts +0 -288
@@ -1,6 +1,8 @@
1
- // preparer.test.ts —— 池目录 SSOT / 原子写 / mtime 免重写 / 无 plugins 块 / 凭据与模型
2
- // 前置错误(验收 3)。凭据源 = v2 config 单源(2026-08-25 拍板:不读
3
- // ~/.zcode/cli/config.json——GUI 不管理该文件,可能残留历史验证配置)。
1
+ // preparer.test.ts —— v2 单源模型解析 / 模型可发现性 / 凭据与模型前置错误。
2
+ // 凭据源 = v2 config 单源(2026-08-25 拍板:不读 ~/.zcode/cli/config.json——GUI 不
3
+ // 管理该文件,可能残留历史验证配置)。原 HOME 池化面(池目录 SSOT / 原子写 /
4
+ // mtime 免重写 / 池 config 无 plugins 块)已随「共享宿主 HOME」重构删除(2026-09:
5
+ // app-server 侧凭据经 appserver-launcher fs 拦截注入,不再建池写 config)。
4
6
 
5
7
  import * as fs from "node:fs";
6
8
  import * as os from "node:os";
@@ -8,17 +10,9 @@ import * as path from "node:path";
8
10
 
9
11
  import { beforeEach, describe, expect, it } from "vitest";
10
12
 
11
- import { resolvePoolDir } from "../../../paths.ts";
12
- import {
13
- ZcodePrepareError,
14
- computeZcodePoolKey,
15
- listZcodeModels,
16
- prepareZcodeHome,
17
- resolveZcodeModelRef,
18
- } from "../preparer.ts";
13
+ import { ZcodePrepareError, listZcodeModels, resolveZcodeModelRef } from "../preparer.ts";
19
14
 
20
15
  let tmpRoot: string;
21
- let dataDir: string;
22
16
  let v2Path: string;
23
17
 
24
18
  function writeJson(p: string, v: unknown): void {
@@ -41,7 +35,6 @@ function seedSources(): void {
41
35
 
42
36
  beforeEach(() => {
43
37
  tmpRoot = fs.mkdtempSync(path.join(os.tmpdir(), "zcode-preparer-"));
44
- dataDir = path.join(tmpRoot, "data");
45
38
  v2Path = path.join(tmpRoot, "v2-config.json");
46
39
  seedSources();
47
40
  });
@@ -129,100 +122,3 @@ describe("listZcodeModels(U7 可发现性)", () => {
129
122
  expect(listZcodeModels({ v2ConfigPath: path.join(tmpRoot, "absent.json") })).toEqual([]);
130
123
  });
131
124
  });
132
-
133
- describe("computeZcodePoolKey", () => {
134
- it("provider 特殊字符安全化 + model 短名保留点号(zsub homePoolDir 同构)", () => {
135
- expect(computeZcodePoolKey("builtin:bigmodel-coding-plan/GLM-5.3")).toBe(
136
- "home-builtin-bigmodel-coding-plan-GLM-5.3",
137
- );
138
- expect(computeZcodePoolKey("router/mimo-v2.5-pro")).toBe("home-router-mimo-v2.5-pro");
139
- });
140
- });
141
-
142
- describe("prepareZcodeHome(验收 3)", () => {
143
- it("池目录 = resolvePoolDir SSOT,config.json 原子写且无 plugins 块", () => {
144
- const prepared = prepareZcodeHome({
145
- engineDataDir: dataDir,
146
- modelRef: `${PROVIDER_A}/GLM-5.3`,
147
- sources: { v2ConfigPath: v2Path },
148
- });
149
- expect(prepared.wroteConfig).toBe(true);
150
- // 池目录必须与 paths.ts SSOT 同源(禁自拼)
151
- expect(prepared.homeDir).toBe(resolvePoolDir(dataDir, "zcode", prepared.poolKey));
152
- expect(prepared.poolKey).toBe("home-builtin-bigmodel-coding-plan-GLM-5.3");
153
-
154
- const written = JSON.parse(fs.readFileSync(prepared.configPath, "utf8")) as Record<string, unknown>;
155
- expect(written["model"]).toEqual({ main: `${PROVIDER_A}/GLM-5.3` });
156
- expect(Object.keys(written["provider"] as Record<string, unknown>)).toEqual([PROVIDER_A]);
157
- // 第二重门禁:刻意不写 plugins 块(防递归 + 不加载宿主插件)
158
- expect("plugins" in written).toBe(false);
159
- // 原子写:无 tmp 残留
160
- const leftovers = fs.readdirSync(path.dirname(prepared.configPath)).filter((f) => f.includes(".tmp-"));
161
- expect(leftovers).toEqual([]);
162
- // 只写目标 provider(每池单 provider 单模型,凭据落盘面最小)
163
- const providerEntry = (written["provider"] as Record<string, { options?: { apiKey?: string } }>)[PROVIDER_A]!;
164
- expect(providerEntry.options?.apiKey).toBe("key-a");
165
- });
166
-
167
- it("mtime 比对免重写:源未变时第二次 prepare 零写入", () => {
168
- const opts = {
169
- engineDataDir: dataDir,
170
- modelRef: `${PROVIDER_A}/GLM-5.3`,
171
- sources: { v2ConfigPath: v2Path },
172
- };
173
- const first = prepareZcodeHome(opts);
174
- expect(first.wroteConfig).toBe(true);
175
- const statAfterFirst = fs.statSync(first.configPath);
176
- const second = prepareZcodeHome(opts);
177
- expect(second.wroteConfig).toBe(false);
178
- expect(fs.statSync(second.configPath).mtimeMs).toBe(statAfterFirst.mtimeMs);
179
- });
180
-
181
- it("源 config 变新(mtime 推进)触发重写(凭据刷新传播)", async () => {
182
- const opts = {
183
- engineDataDir: dataDir,
184
- modelRef: `${PROVIDER_A}/GLM-5.3`,
185
- sources: { v2ConfigPath: v2Path },
186
- };
187
- prepareZcodeHome(opts);
188
- // 源 mtime 推到未来(模拟桌面端刷新 apiKey)
189
- const future = new Date(Date.now() + 10_000);
190
- fs.utimesSync(v2Path, future, future);
191
- const again = prepareZcodeHome(opts);
192
- expect(again.wroteConfig).toBe(true);
193
- });
194
-
195
- it("池 config 损坏(torn write 形态)时重建", () => {
196
- const opts = {
197
- engineDataDir: dataDir,
198
- modelRef: `${PROVIDER_A}/GLM-5.3`,
199
- sources: { v2ConfigPath: v2Path },
200
- };
201
- const first = prepareZcodeHome(opts);
202
- fs.writeFileSync(first.configPath, "{ torn", "utf8");
203
- const again = prepareZcodeHome(opts);
204
- expect(again.wroteConfig).toBe(true);
205
- expect(() => JSON.parse(fs.readFileSync(again.configPath, "utf8"))).not.toThrow();
206
- });
207
-
208
- it("v2 注册表内非默认 provider(如自定义 UUID provider)也能建池", () => {
209
- const prepared = prepareZcodeHome({
210
- engineDataDir: dataDir,
211
- modelRef: `${PROVIDER_B}/mimo-v2.5-pro`,
212
- sources: { v2ConfigPath: v2Path },
213
- });
214
- const written = JSON.parse(fs.readFileSync(prepared.configPath, "utf8")) as {
215
- provider: Record<string, { options?: { apiKey?: string } }>;
216
- };
217
- expect(written.provider[PROVIDER_B]!.options?.apiKey).toBe("key-b");
218
- });
219
-
220
- it("模型引用在 v2 不存在 → model_not_available", () => {
221
- try {
222
- prepareZcodeHome({ engineDataDir: dataDir, modelRef: "ghost/m", sources: { v2ConfigPath: v2Path } });
223
- expect.unreachable("should throw");
224
- } catch (err) {
225
- expect((err as ZcodePrepareError).code).toBe("model_not_available");
226
- }
227
- });
228
- });
@@ -0,0 +1,247 @@
1
+ // session-channel-dispose-harvest.test.ts —— P0-1 U5 dispose 前收割单测(机制层)。
2
+ //
3
+ // 设计权威源:docs/design/timeout-zcode-turn-and-settled-watchdog.md §3.4(退化路径)、
4
+ // §6 D7(dispose 收割兜底)、§11 P-Z3(close 吞没 → dispose 触发 failAllTurns)。
5
+ // P-Z3 的「close 事件吞没」在真实子进程形态不可确定性注入(Node child 进程退出后
6
+ // stdio 关闭即触发 close 事件)——真实现场归 Gate B;本文件用 mock 连接承载机制层
7
+ // 可判定形态:不触发 onClose(= close 吞没的机制等价物)→ dispose → 在途 turn 收敛
8
+ // 为明确失败。与 zcode-engine-dispose.test.ts(fake-appserver 子进程集成面)互补。
9
+ //
10
+ // 覆盖:
11
+ // ① close 吞没形态:dispose 触发 failAllTurns——在途 turn 于 dispose 时收割
12
+ // (P-Z3 核心断言),收割后到达的终态不再改写(settled 守卫);
13
+ // ② grace 窗口内全部终态化:并发多会话 turn 全量收割,不留永久 pending;
14
+ // ③ 正常 close 主路径零回归:onClose 收割先行 → dispose no-op 不改写收割错误;
15
+ // ④ 终态已落定(成功)后 dispose:settled 守卫不改写已成功结果;
16
+ // ⑤ dispose 收割后 closeSession 短路:runTurn finally 不再发 session/close
17
+ // (防写死进程/惰性重建——D7 收割语义的必要闭环)+ 正常完成对照(发 close);
18
+ // ⑥ 二次 dispose 幂等。
19
+
20
+ import { afterEach, describe, expect, it } from "vitest";
21
+
22
+ import type { AppServerConnection } from "../connection.ts";
23
+ import {
24
+ SessionChannel,
25
+ type SessionTurnResult,
26
+ type SessionTurnOptions,
27
+ } from "../session-channel.ts";
28
+
29
+ // ============================================================
30
+ // mock 连接 + 驱动器(与 session-channel-turn-timers.test.ts 同形态,
31
+ // 增补 onClose handler 的手动触发面——close 吞没注入的机制等价物)
32
+ // ============================================================
33
+
34
+ interface MockChannel {
35
+ ch: SessionChannel;
36
+ /** 我方发出的请求帧流水(method 序可断言)。 */
37
+ requests: Array<{ method: string; params: unknown }>;
38
+ /** 手动触发连接崩溃广播(close 吞没形态 = 不触发;正常形态 = 测试显式触发)。 */
39
+ emitClose: (reason: string) => void;
40
+ emit: (method: string, params: unknown) => void;
41
+ emitTerminal: (sessionId: string | undefined, status: string) => void;
42
+ }
43
+
44
+ let sidSeq = 0;
45
+
46
+ function makeMockChannel(): MockChannel {
47
+ const notifications = new Map<string, (params: unknown) => void>();
48
+ const requests: Array<{ method: string; params: unknown }> = [];
49
+ const closeHandlers = new Set<(reason: string) => void>();
50
+ const conn = {
51
+ alive: true,
52
+ onNotification: (method: string, h: (params: unknown) => void) => {
53
+ notifications.set(method, h);
54
+ return () => notifications.delete(method);
55
+ },
56
+ onClose: (h: (reason: string) => void) => {
57
+ closeHandlers.add(h);
58
+ return () => closeHandlers.delete(h);
59
+ },
60
+ request: (method: string, params: unknown) => {
61
+ requests.push({ method, params });
62
+ if (method === "session/create") {
63
+ sidSeq += 1;
64
+ return Promise.resolve({ session: { sessionId: `sess_h${sidSeq}` } });
65
+ }
66
+ if (method === "session/send") return Promise.resolve({ accepted: true });
67
+ if (method === "session/read") return Promise.resolve({ messages: [] });
68
+ return Promise.resolve({});
69
+ },
70
+ } as unknown as AppServerConnection;
71
+ const ch = new SessionChannel(conn);
72
+ return {
73
+ ch,
74
+ requests,
75
+ emitClose: (reason) => {
76
+ for (const fn of [...closeHandlers]) fn(reason);
77
+ },
78
+ emit: (method, params) => notifications.get(method)?.(params),
79
+ emitTerminal: (sessionId, status) =>
80
+ notifications
81
+ .get("v4/telemetry/event")
82
+ ?.({ kind: "turn.terminal", status, sessionId }),
83
+ };
84
+ }
85
+
86
+ interface TurnTracker {
87
+ outcome: "pending" | "fulfilled" | "rejected";
88
+ result: SessionTurnResult | undefined;
89
+ error: unknown;
90
+ promise: Promise<SessionTurnResult>;
91
+ /** onSessionCreated 回填(getter——回调晚于 tracker 构造,值拷贝会恒空)。 */
92
+ readonly sessionId: string;
93
+ }
94
+
95
+ function startTurn(ch: SessionChannel, opts: SessionTurnOptions = {}): TurnTracker {
96
+ let sessionId = "";
97
+ const promise = ch.runTurn({ workspacePath: "/tmp/ws-harvest", mode: "yolo" }, "任务", {
98
+ onSessionCreated: (sid) => {
99
+ sessionId = sid;
100
+ },
101
+ ...opts,
102
+ });
103
+ const t: TurnTracker = {
104
+ outcome: "pending",
105
+ result: undefined,
106
+ error: undefined,
107
+ promise,
108
+ get sessionId(): string {
109
+ return sessionId;
110
+ },
111
+ };
112
+ void promise.then(
113
+ (r) => {
114
+ t.outcome = "fulfilled";
115
+ t.result = r;
116
+ },
117
+ (e) => {
118
+ t.outcome = "rejected";
119
+ t.error = e;
120
+ },
121
+ );
122
+ return t;
123
+ }
124
+
125
+ /** 排空微任务链(create→subscribe→send 全是已 resolve 的 promise——一拍 setTimeout 足够)。 */
126
+ function flush(): Promise<void> {
127
+ return new Promise((resolve) => setTimeout(resolve, 0));
128
+ }
129
+
130
+ async function settle(t: TurnTracker): Promise<void> {
131
+ await t.promise.then(
132
+ () => undefined,
133
+ () => undefined,
134
+ );
135
+ }
136
+
137
+ let enginesChannels: SessionChannel[] = [];
138
+ afterEach(() => {
139
+ for (const ch of enginesChannels.splice(0)) ch.dispose();
140
+ });
141
+
142
+ // ============================================================
143
+ // dispose 收割(P0-1 U5/D7:close 缺失/被吞没的退化路径闭合)
144
+ // ============================================================
145
+
146
+ describe("dispose 收割(P-Z3 机制层:close 吞没 → dispose 触发 failAllTurns)", () => {
147
+ it("close 吞没形态:dispose 时在途 turn 收割为明确失败,迟到终态不再改写", async () => {
148
+ const m = makeMockChannel();
149
+ enginesChannels.push(m.ch);
150
+ const t = startTurn(m.ch);
151
+ await flush();
152
+ expect(t.outcome).toBe("pending"); // send 已发、无终态——在途
153
+
154
+ m.ch.dispose(); // close 吞没(onClose 未触发)→ dispose 收割兜底
155
+ await settle(t);
156
+
157
+ expect(t.outcome).toBe("rejected");
158
+ const err = t.error as Error;
159
+ expect(err).toBeInstanceOf(Error);
160
+ expect(err.message).toContain("已 dispose");
161
+ expect(err.message).toContain("收割");
162
+ expect(err.message).toContain("恢复指引");
163
+ // 收割后到达的权威终态:settled 守卫——落定结果不改写
164
+ m.emitTerminal(t.sessionId, "success");
165
+ expect(t.outcome).toBe("rejected");
166
+ expect((t.error as Error).message).toBe(err.message);
167
+ });
168
+
169
+ it("grace 窗口内全部终态化:并发双会话 turn 全量收割,不留永久 pending", async () => {
170
+ const m = makeMockChannel();
171
+ enginesChannels.push(m.ch);
172
+ const t1 = startTurn(m.ch);
173
+ const t2 = startTurn(m.ch);
174
+ await flush();
175
+ expect(t1.sessionId).not.toBe(t2.sessionId); // 双会话确实并发
176
+ expect(t1.outcome).toBe("pending");
177
+ expect(t2.outcome).toBe("pending");
178
+
179
+ m.ch.dispose();
180
+ await Promise.all([settle(t1), settle(t2)]);
181
+
182
+ expect(t1.outcome).toBe("rejected");
183
+ expect(t2.outcome).toBe("rejected");
184
+ expect((t1.error as Error).message).toContain("已 dispose");
185
+ expect((t2.error as Error).message).toContain("已 dispose");
186
+ });
187
+
188
+ it("正常 close 主路径零回归:onClose 收割先行(错误=连接层 reason),dispose no-op 不改写", async () => {
189
+ const m = makeMockChannel();
190
+ enginesChannels.push(m.ch);
191
+ const t = startTurn(m.ch);
192
+ await flush();
193
+
194
+ m.emitClose("进程退出(code=0 signal=SIGTERM)"); // onClose 主路径收割(正常 close 到达)
195
+ await settle(t);
196
+ expect(t.outcome).toBe("rejected");
197
+ const onCloseErr = t.error as Error;
198
+ expect(onCloseErr.message).toContain("app-server 进程退出");
199
+
200
+ m.ch.dispose(); // activeTurns 已空——幂等 no-op,收割错误不被 dispose 文案改写
201
+ expect(t.outcome).toBe("rejected");
202
+ expect((t.error as Error).message).toBe(onCloseErr.message);
203
+ });
204
+
205
+ it("终态已落定(成功)后 dispose:settled 守卫不改写已成功结果", async () => {
206
+ const m = makeMockChannel();
207
+ enginesChannels.push(m.ch);
208
+ const t = startTurn(m.ch);
209
+ await flush();
210
+ m.emitTerminal(t.sessionId, "success");
211
+ await settle(t);
212
+ expect(t.outcome).toBe("fulfilled");
213
+
214
+ m.ch.dispose(); // 已成功收尾的 turn 不受 dispose 收割影响
215
+ expect(t.outcome).toBe("fulfilled");
216
+ expect(t.result?.terminal).toEqual({ status: "success", source: "turn.terminal" });
217
+ });
218
+
219
+ it("dispose 收割后 closeSession 短路:finally 不发 session/close(防写死进程/惰性重建);正常完成对照=发 close", async () => {
220
+ const m1 = makeMockChannel();
221
+ enginesChannels.push(m1.ch);
222
+ const t1 = startTurn(m1.ch);
223
+ await flush();
224
+ m1.ch.dispose();
225
+ await settle(t1);
226
+ await flush(); // runTurn finally 的 closeSession 已过
227
+ expect(t1.outcome).toBe("rejected");
228
+ expect(m1.requests.map((r) => r.method)).not.toContain("session/close");
229
+
230
+ // 对照:正常完成的 turn,finally 发 session/close(D4 用后即毁——零回归面)
231
+ const m2 = makeMockChannel();
232
+ enginesChannels.push(m2.ch);
233
+ const t2 = startTurn(m2.ch);
234
+ await flush();
235
+ m2.emitTerminal(t2.sessionId, "success");
236
+ await settle(t2);
237
+ expect(t2.outcome).toBe("fulfilled");
238
+ expect(m2.requests.map((r) => r.method)).toContain("session/close");
239
+ });
240
+
241
+ it("二次 dispose 幂等:无在途 turn 时 dispose 是 no-op 不抛", async () => {
242
+ const m = makeMockChannel();
243
+ enginesChannels.push(m.ch);
244
+ expect(() => m.ch.dispose()).not.toThrow();
245
+ expect(() => m.ch.dispose()).not.toThrow();
246
+ });
247
+ });