@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
@@ -184,83 +184,111 @@ function sdkTimeoutArg(req: UiRequest): [] | [{ timeout: number }] {
184
184
  return isValidDialogTimeout(req.timeout) ? [{ timeout: req.timeout }] : [];
185
185
  }
186
186
 
187
+ /** 各 method 的默认转发器(表驱动分发;dialog 类 await SDK,fire-and-forget 类同步调用后回 ack)。
188
+ * 落空(未知 method)语义留在 defaultDialogForward,与原 default 分支逐字节一致。 */
189
+ type DialogMethodForwarder = (req: UiRequest, ui: HostUIChannel) => Promise<UiResponse>;
190
+
191
+ async function forwardSelect(req: UiRequest, ui: HostUIChannel): Promise<UiResponse> {
192
+ const selected = await ui.select(req.title ?? "", req.options ?? [], ...sdkTimeoutArg(req));
193
+ return selected === undefined ? { cancelled: true } : { value: selected };
194
+ }
195
+
196
+ async function forwardConfirm(req: UiRequest, ui: HostUIChannel): Promise<UiResponse> {
197
+ // SDK confirm 必传 message(req.message 缺失时降级空串,不报错阻塞)
198
+ const confirmed = await ui.confirm(req.title ?? "", req.message ?? "", ...sdkTimeoutArg(req));
199
+ return { confirmed };
200
+ }
201
+
202
+ async function forwardInput(req: UiRequest, ui: HostUIChannel): Promise<UiResponse> {
203
+ const text = await ui.input(req.title ?? "", req.placeholder, ...sdkTimeoutArg(req));
204
+ return text === undefined ? { cancelled: true } : { value: text };
205
+ }
206
+
207
+ async function forwardEditor(req: UiRequest, ui: HostUIChannel): Promise<UiResponse> {
208
+ // SDK editor 必填,但部分 host 运行时未实现——try/catch 降级 cancelled + warn(不卡队列)。
209
+ // 不用 typeof 守卫:editor 在类型上必填,typeof 检查会被 TS2367 拒(条件永假)。
210
+ try {
211
+ const text = await ui.editor(req.title ?? "", req.prefill);
212
+ return text === undefined ? { cancelled: true } : { value: text };
213
+ } catch (err) {
214
+ logger.warn(
215
+ "[subagents] ctx.ui.editor unavailable/threw, returning cancelled",
216
+ { detail: { id: req.id, error: err instanceof Error ? err.message : String(err) } },
217
+ );
218
+ return { cancelled: true };
219
+ }
220
+ }
221
+
222
+ // ── fire-and-forget 类(§3.2 映射表:GUI 模式下由 createUiRequestHandlerForMode 直接转发)
223
+ // 子进程 rpc-mode 发出的 fire-and-forget method,channel miss 后落到此处。
224
+ // 全部回 {ack:true}(fire-and-forget 语义:子进程不等响应)。
225
+
226
+ async function forwardNotify(req: UiRequest, ui: HostUIChannel): Promise<UiResponse> {
227
+ // notifyType 运行时收窄:UiRequest.notifyType 是宽 string,ctx.ui.notify 要字面量联合。
228
+ // 非法值 fallback "info"(pi 侧也会静默降级 info,此处显式 fallback 避免类型不安全)。
229
+ const rawType = req.notifyType;
230
+ const notifyType = rawType === "info" || rawType === "warning" || rawType === "error"
231
+ ? rawType
232
+ : "info";
233
+ ui.notify(req.message ?? "", notifyType);
234
+ return { ack: true };
235
+ }
236
+
237
+ async function forwardSetStatus(req: UiRequest, ui: HostUIChannel): Promise<UiResponse> {
238
+ ui.setStatus(req.statusKey ?? "", req.statusText);
239
+ return { ack: true };
240
+ }
241
+
242
+ async function forwardSetWidget(req: UiRequest, ui: HostUIChannel): Promise<UiResponse> {
243
+ // setWidget channel-miss 语义(§3.2 D1):
244
+ // req.channel === "gui_widget"(带 marker 但 channel 未注册)→ 不转发(marker 行无渲染意义)
245
+ // req.channel === undefined(普通 widget)→ 转发文本行到主 agent
246
+ // channel 命中 registry 时由 createRealHandler 优先走 channel handler,不进这里。
247
+ if (req.channel === "gui_widget") {
248
+ return { ack: true };
249
+ }
250
+ ui.setWidget(req.widgetKey ?? "", req.widgetLines, { placement: req.widgetPlacement });
251
+ return { ack: true };
252
+ }
253
+
254
+ async function forwardSetTitle(req: UiRequest, ui: HostUIChannel): Promise<UiResponse> {
255
+ ui.setTitle(req.title ?? "");
256
+ return { ack: true };
257
+ }
258
+
259
+ async function forwardSetEditorText(req: UiRequest, ui: HostUIChannel): Promise<UiResponse> {
260
+ ui.setEditorText(req.text ?? "");
261
+ return { ack: true };
262
+ }
263
+
264
+ /** method → 转发器路由表(key 与原 switch case 标签一一对应;值可选表达落空语义)。 */
265
+ const DIALOG_METHOD_FORWARDERS: Readonly<
266
+ Record<string, DialogMethodForwarder | undefined>
267
+ > = {
268
+ select: forwardSelect,
269
+ confirm: forwardConfirm,
270
+ input: forwardInput,
271
+ editor: forwardEditor,
272
+ notify: forwardNotify,
273
+ setStatus: forwardSetStatus,
274
+ setWidget: forwardSetWidget,
275
+ setTitle: forwardSetTitle,
276
+ set_editor_text: forwardSetEditorText,
277
+ };
278
+
187
279
  async function defaultDialogForward(
188
280
  req: UiRequest,
189
281
  ctx: HostUIContext,
190
282
  ): Promise<UiResponse> {
191
- const ui = ctx.ui;
192
- switch (req.method) {
193
- case "select": {
194
- const selected = await ui.select(req.title ?? "", req.options ?? [], ...sdkTimeoutArg(req));
195
- return selected === undefined ? { cancelled: true } : { value: selected };
196
- }
197
- case "confirm": {
198
- // SDK confirm 必传 message(req.message 缺失时降级空串,不报错阻塞)
199
- const confirmed = await ui.confirm(req.title ?? "", req.message ?? "", ...sdkTimeoutArg(req));
200
- return { confirmed };
201
- }
202
- case "input": {
203
- const text = await ui.input(req.title ?? "", req.placeholder, ...sdkTimeoutArg(req));
204
- return text === undefined ? { cancelled: true } : { value: text };
205
- }
206
- case "editor": {
207
- // SDK editor 必填,但部分 host 运行时未实现——try/catch 降级 cancelled + warn(不卡队列)。
208
- // 不用 typeof 守卫:editor 在类型上必填,typeof 检查会被 TS2367 拒(条件永假)。
209
- try {
210
- const text = await ui.editor(req.title ?? "", req.prefill);
211
- return text === undefined ? { cancelled: true } : { value: text };
212
- } catch (err) {
213
- logger.warn(
214
- "[subagents] ctx.ui.editor unavailable/threw, returning cancelled",
215
- { detail: { id: req.id, error: err instanceof Error ? err.message : String(err) } },
216
- );
217
- return { cancelled: true };
218
- }
219
- }
220
- // ── fire-and-forget 类(§3.2 映射表:GUI 模式下由 createUiRequestHandlerForMode 直接转发)
221
- // 子进程 rpc-mode 发出的 fire-and-forget method,channel miss 后落到此处。
222
- // 全部回 {ack:true}(fire-and-forget 语义:子进程不等响应)。
223
- case "notify": {
224
- // notifyType 运行时收窄:UiRequest.notifyType 是宽 string,ctx.ui.notify 要字面量联合。
225
- // 非法值 fallback "info"(pi 侧也会静默降级 info,此处显式 fallback 避免类型不安全)。
226
- const rawType = req.notifyType;
227
- const notifyType = rawType === "info" || rawType === "warning" || rawType === "error"
228
- ? rawType
229
- : "info";
230
- ui.notify(req.message ?? "", notifyType);
231
- return { ack: true };
232
- }
233
- case "setStatus": {
234
- ui.setStatus(req.statusKey ?? "", req.statusText);
235
- return { ack: true };
236
- }
237
- case "setWidget": {
238
- // setWidget channel-miss 语义(§3.2 D1):
239
- // req.channel === "gui_widget"(带 marker 但 channel 未注册)→ 不转发(marker 行无渲染意义)
240
- // req.channel === undefined(普通 widget)→ 转发文本行到主 agent
241
- // channel 命中 registry 时由 createRealHandler 优先走 channel handler,不进这里。
242
- if (req.channel === "gui_widget") {
243
- return { ack: true };
244
- }
245
- ui.setWidget(req.widgetKey ?? "", req.widgetLines, { placement: req.widgetPlacement });
246
- return { ack: true };
247
- }
248
- case "setTitle": {
249
- ui.setTitle(req.title ?? "");
250
- return { ack: true };
251
- }
252
- case "set_editor_text": {
253
- ui.setEditorText(req.text ?? "");
254
- return { ack: true };
255
- }
256
- default: {
257
- // 未知 method(非 dialog 非 fire-and-forget)——保留 warn(协议演进信号,P3 限流兜底),
258
- // 回 ack(落到 default 的一定不是 dialog,fire-and-forget 正确应答是 ack,与 TUI 分支先例一致)。
259
- logger.warn(
260
- "[subagents] defaultDialogForward: unknown method",
261
- { detail: { method: req.method, id: req.id } },
262
- );
263
- return { ack: true };
264
- }
283
+ const forwarder = DIALOG_METHOD_FORWARDERS[req.method];
284
+ if (!forwarder) {
285
+ // 未知 method(非 dialog 非 fire-and-forget)——保留 warn(协议演进信号,P3 限流兜底),
286
+ // ack(落到 default 的一定不是 dialog,fire-and-forget 正确应答是 ack,与 TUI 分支先例一致)。
287
+ logger.warn(
288
+ "[subagents] defaultDialogForward: unknown method",
289
+ { detail: { method: req.method, id: req.id } },
290
+ );
291
+ return { ack: true };
265
292
  }
293
+ return forwarder(req, ctx.ui);
266
294
  }
@@ -19,11 +19,12 @@ import type { UiRequest } from "./dialog-queue.ts";
19
19
  // 类型再导出:dialog-queue.ts 是 UiRequest/UiResponse/UiRequestHandler 的规范来源,
20
20
  // 本模块再导出供测试 import(避免测试直接依赖 dialog-queue 内部实现)。
21
21
  export type { UiRequest, UiRequestHandler, UiResponse } from "./dialog-queue.ts";
22
- import type { SessionRunnerContext } from "./session-runner.ts";
23
- import type { ExtensionUiRequest } from "./spawn-event-adapter.ts";
24
- import { respond } from "./stdin-writer.ts";
22
+ import type { SessionRunnerContext } from "./engine/engines/pi/session-runner.ts";
23
+ import type { ExtensionUiRequest } from "./engine/engines/pi/spawn-event-adapter.ts";
24
+ import { respond } from "./engine/engines/pi/stdin-writer.ts";
25
25
  import { parseChannel } from "./ui-channels.ts";
26
26
  import { notifyMissingHandlerGlobal } from "./ui-request-observability.ts";
27
+ import { toErrorMessage } from "../core/error-message.ts";
27
28
 
28
29
  const logger = getLogger("subagents");
29
30
 
@@ -62,7 +63,7 @@ export function createUiRequestQueue(
62
63
  // .finally 照常释放 processing 推进队列(单个请求失败不阻塞后续 UI 请求)。
63
64
  handleUiRequest(child, id, request, ctx, signal)
64
65
  .catch((err: unknown) => {
65
- const m = err instanceof Error ? err.message : String(err);
66
+ const m = toErrorMessage(err);
66
67
  logger.error(`[subagents] ui request ${id} (${request.method}) failed unexpectedly: ${m}`);
67
68
  })
68
69
  .finally(() => {
@@ -157,28 +158,58 @@ async function handleUiRequest(
157
158
  // [R3] 子进程已退出,跳过写入
158
159
  if (signal?.aborted) return;
159
160
  logger.error("[subagents] uiRequestHandler threw", {
160
- detail: err instanceof Error ? err.message : String(err),
161
+ detail: toErrorMessage(err),
161
162
  });
162
163
  respond(child, id, { cancelled: true }, signal);
163
164
  }
164
165
  }
165
166
 
167
+ /** method-specific 字段值守卫(与原 inline 判定 1:1:`typeof === "string"` / `"number"` / `Array.isArray`)。 */
168
+ function isStringValue(value: unknown): boolean {
169
+ return typeof value === "string";
170
+ }
171
+
172
+ function isNumberValue(value: unknown): boolean {
173
+ return typeof value === "number";
174
+ }
175
+
176
+ function isArrayValue(value: unknown): boolean {
177
+ return Array.isArray(value);
178
+ }
179
+
180
+ /** extractMethodFields 字段复制规格表(与 Pi rpc-types.ts 1:1,序 = 原复制序)。
181
+ * guard = in 命中后的值类型守卫(验不过不复制);null = 仅 in 检查直赋
182
+ *(原 statusText/widgetLines/widgetPlacement 无类型守卫的形态)。 */
183
+ const METHOD_FIELD_COPY_SPECS: ReadonlyArray<{
184
+ key: string;
185
+ guard: ((value: unknown) => boolean) | null;
186
+ }> = [
187
+ { key: "title", guard: isStringValue },
188
+ { key: "options", guard: isArrayValue },
189
+ { key: "message", guard: isStringValue },
190
+ { key: "placeholder", guard: isStringValue },
191
+ { key: "prefill", guard: isStringValue },
192
+ { key: "notifyType", guard: isStringValue },
193
+ { key: "statusKey", guard: isStringValue },
194
+ { key: "statusText", guard: null },
195
+ { key: "widgetKey", guard: isStringValue },
196
+ { key: "widgetLines", guard: null },
197
+ { key: "widgetPlacement", guard: null },
198
+ { key: "text", guard: isStringValue },
199
+ { key: "timeout", guard: isNumberValue },
200
+ ];
201
+
166
202
  /** 从 ExtensionUiRequest 提取 method-specific 字段到 UiRequest(与 Pi rpc-types.ts 1:1)。
167
- * 按 method 变体类型安全地复制对应字段;缺失字段不复制(保持 UiRequest 可选)。 */
203
+ * 按 method 变体类型安全地复制对应字段;缺失字段不复制(保持 UiRequest 可选)。
204
+ * 断言说明:source/out 的 Record 断言仅为动态 key 索引,复制经 in 检查 + guard 运行时守卫。 */
168
205
  function extractMethodFields(req: ExtensionUiRequest): Partial<UiRequest> {
169
206
  const out: Partial<UiRequest> = {};
170
- if ("title" in req && typeof req.title === "string") out.title = req.title;
171
- if ("options" in req && Array.isArray(req.options)) out.options = req.options;
172
- if ("message" in req && typeof req.message === "string") out.message = req.message;
173
- if ("placeholder" in req && typeof req.placeholder === "string") out.placeholder = req.placeholder;
174
- if ("prefill" in req && typeof req.prefill === "string") out.prefill = req.prefill;
175
- if ("notifyType" in req && typeof req.notifyType === "string") out.notifyType = req.notifyType;
176
- if ("statusKey" in req && typeof req.statusKey === "string") out.statusKey = req.statusKey;
177
- if ("statusText" in req) out.statusText = req.statusText;
178
- if ("widgetKey" in req && typeof req.widgetKey === "string") out.widgetKey = req.widgetKey;
179
- if ("widgetLines" in req) out.widgetLines = req.widgetLines;
180
- if ("widgetPlacement" in req) out.widgetPlacement = req.widgetPlacement;
181
- if ("text" in req && typeof req.text === "string") out.text = req.text;
182
- if ("timeout" in req && typeof req.timeout === "number") out.timeout = req.timeout;
207
+ const source: Record<string, unknown> = req;
208
+ for (const { key, guard } of METHOD_FIELD_COPY_SPECS) {
209
+ if (!(key in source)) continue;
210
+ const value = source[key];
211
+ if (guard !== null && !guard(value)) continue;
212
+ (out as Record<string, unknown>)[key] = value;
213
+ }
183
214
  return out;
184
215
  }