@zhushanwen/subagent-core 0.5.1 → 0.7.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 (318) hide show
  1. package/README.md +1 -1
  2. package/dist/chunk-KXVBIVOU.js +16 -0
  3. package/dist/chunk-T2SYBW3I.js +24 -0
  4. package/dist/chunk-VURUAGMM.js +2305 -0
  5. package/dist/{types-Dv4QhSJ_.d.cts → engine-discovery-scan-ocpM8FmI.d.cts} +835 -668
  6. package/dist/{types-Dv4QhSJ_.d.ts → engine-discovery-scan-ocpM8FmI.d.ts} +835 -668
  7. package/dist/execution/engine/engine-discovery-scan.cjs +2210 -0
  8. package/dist/execution/engine/engine-discovery-scan.d.cts +4 -0
  9. package/dist/execution/engine/engine-discovery-scan.d.ts +4 -0
  10. package/dist/execution/engine/engine-discovery-scan.js +20 -0
  11. package/dist/execution/engine/paths.cjs +6 -23
  12. package/dist/execution/engine/paths.d.cts +1 -8
  13. package/dist/execution/engine/paths.d.ts +1 -8
  14. package/dist/execution/engine/paths.js +1 -1
  15. package/dist/execution/relay-env.cjs +12 -28
  16. package/dist/execution/relay-env.d.cts +1 -33
  17. package/dist/execution/relay-env.d.ts +1 -33
  18. package/dist/execution/relay-env.js +5 -3
  19. package/dist/index.cjs +14123 -15467
  20. package/dist/index.d.cts +1179 -1540
  21. package/dist/index.d.ts +1179 -1540
  22. package/dist/index.js +7694 -10986
  23. package/dist.bundle/index.cjs +33485 -0
  24. package/package.json +20 -26
  25. package/src/__tests__/record-store-last-line.test.ts +16 -7
  26. package/src/core/error-message.ts +7 -6
  27. package/src/core/host-services.ts +8 -2
  28. package/src/core/notify-ports.ts +17 -2
  29. package/src/execution/__tests__/agent-registry.test.ts +1 -1
  30. package/src/execution/__tests__/alive-store.test.ts +1 -1
  31. package/src/execution/__tests__/chat-engine-routing.test.ts +62 -28
  32. package/src/execution/__tests__/chat-round-first-round-watchdog.test.ts +255 -0
  33. package/src/execution/__tests__/collect-budget.test.ts +291 -0
  34. package/src/execution/__tests__/collect-coordinator-service.test.ts +316 -0
  35. package/src/execution/__tests__/collect-coordinator.test.ts +371 -0
  36. package/src/execution/__tests__/collect-mixed-dispatch.test.ts +229 -0
  37. package/src/execution/__tests__/config-collect-sync.test.ts +120 -0
  38. package/src/execution/__tests__/config.test.ts +1 -1
  39. package/src/execution/__tests__/delivery-methods.test.ts +179 -237
  40. package/src/execution/__tests__/execute-and-await-worktree.test.ts +0 -2
  41. package/src/execution/__tests__/execute-nesting.test.ts +20 -13
  42. package/src/execution/__tests__/explicit-agent-ref-guard.test.ts +21 -34
  43. package/src/execution/__tests__/finalized-marker.test.ts +1 -1
  44. package/src/execution/__tests__/gc-timer.test.ts +8 -23
  45. package/src/execution/__tests__/get-record-for-action-restart.test.ts +20 -10
  46. package/src/execution/__tests__/helpers/fake-engine-port.ts +187 -0
  47. package/src/execution/__tests__/helpers/spawn-mock.ts +36 -9
  48. package/src/execution/__tests__/helpers/subagent-service-mocks.ts +1 -1
  49. package/src/execution/__tests__/idle-gc.test.ts +200 -0
  50. package/src/execution/__tests__/lifecycle-predicates.test.ts +26 -21
  51. package/src/execution/__tests__/manifest-store-tmp-recovery.test.ts +1 -1
  52. package/src/execution/__tests__/nested-visibility-env-propagation.test.ts +5 -2
  53. package/src/execution/__tests__/notify-batch.test.ts +500 -0
  54. package/src/execution/__tests__/notify-ledger.test.ts +27 -0
  55. package/src/execution/__tests__/reconcile-sweep.test.ts +200 -0
  56. package/src/execution/__tests__/record-entry-collect.test.ts +102 -0
  57. package/src/execution/__tests__/record-store.test.ts +60 -6
  58. package/src/execution/__tests__/recursive-visibility-baseline.test.ts +20 -13
  59. package/src/execution/__tests__/relay-env.test.ts +12 -1
  60. package/src/execution/__tests__/round-supervisor.test.ts +293 -0
  61. package/src/execution/__tests__/session-file-gc.test.ts +1 -1
  62. package/src/execution/__tests__/session-pending.test.ts +119 -17
  63. package/src/execution/__tests__/start-collect-guard.test.ts +255 -0
  64. package/src/execution/__tests__/stream-sink-retirement.test.ts +10 -10
  65. package/src/execution/__tests__/subagent-actions-core.test.ts +6 -0
  66. package/src/execution/__tests__/subagent-service-multiproc-guard.test.ts +14 -11
  67. package/src/execution/__tests__/subagent-service-notify-gate.test.ts +33 -30
  68. package/src/execution/__tests__/subagent-service-parent-guard.test.ts +2 -9
  69. package/src/execution/__tests__/subagent-service-recovery-bounds.test.ts +59 -129
  70. package/src/execution/__tests__/subagent-service.test.ts +2 -2
  71. package/src/execution/__tests__/subprocess-agent-runner-routing.test.ts +109 -7
  72. package/src/execution/__tests__/subprocess-agent-runner.test.ts +108 -36
  73. package/src/execution/__tests__/sync-collect-recovery.test.ts +1102 -0
  74. package/src/execution/__tests__/tombstone-store.test.ts +1 -1
  75. package/src/execution/__tests__/workflow-state-root.test.ts +232 -0
  76. package/src/execution/__tests__/worktree-git-ops.test.ts +1 -1
  77. package/src/execution/__tests__/worktree-reconcile-aging.test.ts +2 -2
  78. package/src/execution/__tests__/worktree-reconcile.integration.test.ts +1 -1
  79. package/src/execution/__tests__/worktree-registry.test.ts +1 -1
  80. package/src/execution/agent-registry.ts +6 -2
  81. package/src/execution/collect-coordinator.ts +200 -0
  82. package/src/execution/config.ts +77 -5
  83. package/src/execution/dialog-queue.ts +6 -73
  84. package/src/execution/engine/__tests__/common/capability-gate.test.ts +115 -15
  85. package/src/execution/engine/__tests__/common/errors.test.ts +11 -18
  86. package/src/execution/engine/__tests__/common/event-journal.test.ts +1 -1
  87. package/src/execution/engine/__tests__/common/kill-chain.test.ts +7 -0
  88. package/src/execution/engine/__tests__/common/nesting-guard.test.ts +9 -3
  89. package/src/execution/engine/__tests__/common/pool-manager.test.ts +2 -2
  90. package/src/execution/engine/__tests__/common/session-view-service.test.ts +90 -3
  91. package/src/execution/engine/__tests__/conformance/H9-test-disposition.md +116 -0
  92. package/src/execution/engine/__tests__/conformance/__fixtures__/engine-protocol/fake-engine-protocol.mjs +377 -0
  93. package/src/execution/engine/__tests__/conformance/__fixtures__/engine-protocol/recorded.fixture.json +331 -0
  94. package/src/execution/engine/__tests__/conformance/__fixtures__/engine-protocol/smoke-run.fixture.json +213 -0
  95. package/src/execution/engine/__tests__/conformance/chat-round-protocol.test.ts +230 -0
  96. package/src/execution/engine/__tests__/conformance/contract.abort.test.ts +69 -42
  97. package/src/execution/engine/__tests__/conformance/contract.agent-events.test.ts +4 -81
  98. package/src/execution/engine/__tests__/conformance/contract.probe.test.ts +67 -44
  99. package/src/execution/engine/__tests__/conformance/contract.read-degradation.test.ts +82 -55
  100. package/src/execution/engine/__tests__/conformance/engine-conformance.live.test.ts +133 -70
  101. package/src/execution/engine/__tests__/conformance/engine-crash.test.ts +143 -0
  102. package/src/execution/engine/__tests__/conformance/fake-engine-capabilities.ts +19 -0
  103. package/src/execution/engine/__tests__/conformance/golden-replay.pi.test.ts +8 -3
  104. package/src/execution/engine/__tests__/conformance/golden-replay.zcode.test.ts +6 -5
  105. package/src/execution/engine/__tests__/conformance/protocol-blackbox.test.ts +398 -0
  106. package/src/execution/engine/__tests__/conformance/registry-fork-filter.test.ts +221 -0
  107. package/src/execution/engine/__tests__/conformance/round-liveness-supervisor.test.ts +302 -0
  108. package/src/execution/engine/__tests__/conformance/static-spawn-guard.test.ts +58 -0
  109. package/src/execution/engine/__tests__/engine-discovery-scan.test.ts +558 -0
  110. package/src/execution/engine/__tests__/host-task-spec.test.ts +45 -0
  111. package/src/execution/engine/__tests__/model-ref-split.test.ts +74 -0
  112. package/src/execution/engine/__tests__/registry.test.ts +206 -1
  113. package/src/execution/engine/__tests__/routing.test.ts +97 -0
  114. package/src/execution/engine/__tests__/run-failure-worktree-cleanup.test.ts +97 -0
  115. package/src/execution/engine/client/__tests__/__fixtures__/fake-engine.mjs +294 -0
  116. package/src/execution/engine/client/__tests__/engine-client.test.ts +516 -0
  117. package/src/execution/engine/client/__tests__/mirror.test.ts +67 -0
  118. package/src/execution/engine/client/__tests__/pid-file.test.ts +257 -0
  119. package/src/execution/engine/client/__tests__/protocol-closure.test.ts +95 -0
  120. package/src/execution/engine/client/__tests__/remote-engine.test.ts +457 -0
  121. package/src/execution/engine/client/client-options.ts +103 -0
  122. package/src/execution/engine/client/engine-client.ts +687 -0
  123. package/src/execution/engine/client/mirror.ts +167 -0
  124. package/src/execution/engine/client/pid-file.ts +392 -0
  125. package/src/execution/engine/client/reaper.ts +95 -0
  126. package/src/execution/engine/client/remote-engine.ts +441 -0
  127. package/src/execution/engine/client/reverse-router.ts +255 -0
  128. package/src/execution/engine/common/capability-gate.ts +109 -22
  129. package/src/execution/engine/common/errors.ts +9 -25
  130. package/src/execution/engine/common/event-journal.ts +4 -50
  131. package/src/execution/engine/common/journal-replay.ts +3 -1
  132. package/src/execution/engine/common/kill-chain.ts +18 -251
  133. package/src/execution/engine/common/nesting-guard.ts +18 -114
  134. package/src/execution/engine/common/pool-manager.ts +4 -0
  135. package/src/execution/engine/common/session-view-service.ts +56 -84
  136. package/src/execution/engine/config.ts +151 -0
  137. package/src/execution/engine/d8-compat.ts +346 -0
  138. package/src/execution/engine/engine-discovery-roots.ts +107 -0
  139. package/src/execution/engine/engine-discovery-scan.ts +269 -0
  140. package/src/execution/engine/engine-discovery.ts +30 -7
  141. package/src/execution/engine/engine-inspect-package.ts +282 -0
  142. package/src/execution/engine/engine-manifest.ts +244 -0
  143. package/src/execution/engine/host/__tests__/host-askuser-endpoint.test.ts +123 -0
  144. package/src/execution/engine/host/__tests__/host-bridge.test.ts +135 -0
  145. package/src/execution/engine/host/__tests__/spawned-children.test.ts +73 -0
  146. package/src/execution/engine/host/host-bridge.ts +150 -0
  147. package/src/execution/engine/host/host-ui-endpoint.ts +47 -0
  148. package/src/execution/engine/host/pi-host-binding.ts +91 -0
  149. package/src/execution/engine/host/spawned-children.ts +139 -0
  150. package/src/execution/engine/host-task-spec.ts +29 -2
  151. package/src/execution/engine/model-validation.ts +55 -2
  152. package/src/execution/engine/paths.ts +16 -41
  153. package/src/execution/engine/port.ts +48 -2
  154. package/src/execution/engine/registry.ts +153 -34
  155. package/src/execution/engine/routing.ts +225 -52
  156. package/src/execution/engine/types.ts +25 -200
  157. package/src/execution/execution-record.ts +7 -0
  158. package/src/execution/finalize-record.ts +40 -11
  159. package/src/execution/idle-gc.ts +89 -14
  160. package/src/execution/lifecycle-manager.ts +10 -7
  161. package/src/execution/lifecycle-predicates.ts +10 -8
  162. package/src/execution/notifier.ts +234 -25
  163. package/src/execution/notify-host.ts +21 -1
  164. package/src/execution/record-entry.ts +16 -0
  165. package/src/execution/record-store.ts +189 -31
  166. package/src/execution/relay-env.ts +19 -36
  167. package/src/execution/round-supervisor/domain.ts +89 -0
  168. package/src/execution/round-supervisor/index.ts +33 -0
  169. package/src/execution/round-supervisor/notify-accounting.ts +87 -0
  170. package/src/execution/round-supervisor/reconcile-sweep.ts +235 -0
  171. package/src/execution/round-supervisor/service-binding.test.ts +661 -0
  172. package/src/execution/round-supervisor/service-binding.ts +273 -0
  173. package/src/execution/round-supervisor/supervisor.ts +426 -0
  174. package/src/execution/session-pending.ts +68 -74
  175. package/src/execution/settled-watchdog.ts +39 -0
  176. package/src/execution/subagent-actions-core.ts +62 -6
  177. package/src/execution/subagent-service.ts +1161 -406
  178. package/src/execution/subprocess-agent-runner.ts +16 -8
  179. package/src/execution/sync-rebuild.ts +87 -0
  180. package/src/execution/types.ts +104 -117
  181. package/src/execution/ui-channels.ts +13 -214
  182. package/src/execution/ui-request-handler-factory.ts +7 -4
  183. package/src/execution/ui-request-observability.ts +2 -2
  184. package/src/execution/workflow-state-root.ts +67 -0
  185. package/src/execution/worktree-git-ops.ts +5 -0
  186. package/src/execution/worktree-manager.ts +11 -1
  187. package/src/index.ts +55 -26
  188. package/src/orchestration/__tests__/config-loader.test.ts +1 -1
  189. package/src/orchestration/__tests__/execute-agent-call.test.ts +1 -1
  190. package/src/orchestration/__tests__/file-run-store-prune.test.ts +1 -1
  191. package/src/orchestration/__tests__/file-run-store-throttle.test.ts +1 -1
  192. package/src/orchestration/__tests__/review-fix-loop-scriptpath-failfast.test.ts +1 -1
  193. package/src/orchestration/__tests__/script-generate.test.ts +5 -5
  194. package/src/orchestration/__tests__/skill-discovery.test.ts +2 -2
  195. package/src/orchestration/__tests__/workflow-files.test.ts +10 -10
  196. package/src/orchestration/__tests__/workflow-script-registry-impl.test.ts +1 -1
  197. package/src/orchestration/execute-agent-call.ts +1 -1
  198. package/src/orchestration/file-run-store.ts +144 -59
  199. package/src/orchestration/models/types.ts +43 -42
  200. package/src/shared/__tests__/atomic-write.test.ts +1 -1
  201. package/src/shared/__tests__/resource-discovery-host-roots.test.ts +5 -5
  202. package/src/shared/zcode-model-ref.ts +31 -0
  203. package/dist/chunk-43ONBFZX.js +0 -240
  204. package/dist/chunk-A4IVZWVX.js +0 -31
  205. package/dist/chunk-APZY4IME.js +0 -27
  206. package/dist/chunk-V3VHZ2VX.js +0 -59
  207. package/dist/execution/engine/engines/zcode/constants.cjs +0 -107
  208. package/dist/execution/engine/engines/zcode/constants.d.cts +0 -135
  209. package/dist/execution/engine/engines/zcode/constants.d.ts +0 -135
  210. package/dist/execution/engine/engines/zcode/constants.js +0 -54
  211. package/dist/execution/engine/engines/zcode/reader.cjs +0 -276
  212. package/dist/execution/engine/engines/zcode/reader.d.cts +0 -21
  213. package/dist/execution/engine/engines/zcode/reader.d.ts +0 -21
  214. package/dist/execution/engine/engines/zcode/reader.js +0 -9
  215. package/src/__tests__/append-system-prompt-assembly.test.ts +0 -243
  216. package/src/__tests__/fr4-get-state-handshake.test.ts +0 -125
  217. package/src/__tests__/session-runner.test.ts +0 -69
  218. package/src/execution/__tests__/ask-user-transit-e2e.test.ts +0 -490
  219. package/src/execution/__tests__/chatmode-first-round-closure-spawn.test.ts +0 -191
  220. package/src/execution/__tests__/descendant-sweep-guards.test.ts +0 -220
  221. package/src/execution/__tests__/descendant-sweep.test.ts +0 -269
  222. package/src/execution/__tests__/engine-model-validation.test.ts +0 -741
  223. package/src/execution/__tests__/epipe-fallback.test.ts +0 -248
  224. package/src/execution/__tests__/execution-runtime-face.test.ts +0 -272
  225. package/src/execution/__tests__/get-state-handshake.test.ts +0 -127
  226. package/src/execution/__tests__/helpers/session-runner-mocks.ts +0 -113
  227. package/src/execution/__tests__/keep-alive-no-progress.test.ts +0 -280
  228. package/src/execution/__tests__/kill-all-escalation.test.ts +0 -196
  229. package/src/execution/__tests__/max-turns-to-watchdog-ms.test.ts +0 -113
  230. package/src/execution/__tests__/output-collector.test.ts +0 -469
  231. package/src/execution/__tests__/pi-invocation.test.ts +0 -134
  232. package/src/execution/__tests__/recursive-visibility-env.test.ts +0 -149
  233. package/src/execution/__tests__/rpc-mode.test.ts +0 -89
  234. package/src/execution/__tests__/run-and-finalize-anchoring.test.ts +0 -387
  235. package/src/execution/__tests__/run-and-finalize-chatmode.test.ts +0 -277
  236. package/src/execution/__tests__/run-spawn-chatmode-settled.test.ts +0 -254
  237. package/src/execution/__tests__/run-spawn-edges.test.ts +0 -1079
  238. package/src/execution/__tests__/run-spawn-integration.test.ts +0 -933
  239. package/src/execution/__tests__/run-spawn-resume.test.ts +0 -322
  240. package/src/execution/__tests__/run-spawn-rpc-mode.test.ts +0 -196
  241. package/src/execution/__tests__/run-spawn-stdout-callback-throw.test.ts +0 -207
  242. package/src/execution/__tests__/service-kill-escalation.test.ts +0 -91
  243. package/src/execution/__tests__/session-runner-branch-cache-lru.test.ts +0 -110
  244. package/src/execution/__tests__/session-runner-close-prune.test.ts +0 -181
  245. package/src/execution/__tests__/session-runner-dispatch.test.ts +0 -489
  246. package/src/execution/__tests__/session-runner-epipe.test.ts +0 -179
  247. package/src/execution/__tests__/session-runner-heartbeat-idle-fallback.test.ts +0 -227
  248. package/src/execution/__tests__/session-runner-lifecycle-helpers.test.ts +0 -290
  249. package/src/execution/__tests__/session-runner-schema-env.test.ts +0 -352
  250. package/src/execution/__tests__/settled-watchdog.test.ts +0 -524
  251. package/src/execution/__tests__/spawn-args.test.ts +0 -446
  252. package/src/execution/__tests__/spawn-event-adapter-rpc.test.ts +0 -192
  253. package/src/execution/__tests__/spawn-event-adapter.test.ts +0 -167
  254. package/src/execution/__tests__/spawn-worktree-guidance.test.ts +0 -208
  255. package/src/execution/__tests__/spawned-children.test.ts +0 -236
  256. package/src/execution/__tests__/start-sync-model-guard.test.ts +0 -150
  257. package/src/execution/__tests__/stdin-writer.test.ts +0 -464
  258. package/src/execution/__tests__/subagent-service-message-close.test.ts +0 -693
  259. package/src/execution/__tests__/temp-prompt.test.ts +0 -53
  260. package/src/execution/__tests__/timeout-integration.test.ts +0 -616
  261. package/src/execution/__tests__/turn-limiter-semantics.test.ts +0 -194
  262. package/src/execution/__tests__/turn-limiter.test.ts +0 -65
  263. package/src/execution/__tests__/ui-request-handler.test.ts +0 -205
  264. package/src/execution/__tests__/ui-request-queue.test.ts +0 -298
  265. package/src/execution/__tests__/worktree-pid-registration.integration.test.ts +0 -230
  266. package/src/execution/engine/__tests__/common/schema-emulation.test.ts +0 -128
  267. package/src/execution/engine/__tests__/common/session-view-service-zcode-dbpath.test.ts +0 -149
  268. package/src/execution/engine/__tests__/conformance/__fixtures__/pi-golden-events.json +0 -28
  269. package/src/execution/engine/__tests__/conformance/zcode-appserver-harness.ts +0 -128
  270. package/src/execution/engine/__tests__/paths.test.ts +0 -39
  271. package/src/execution/engine/common/schema-emulation.ts +0 -189
  272. package/src/execution/engine/common/session-view-projection.ts +0 -51
  273. package/src/execution/engine/engines/pi/__tests__/pi-engine.test.ts +0 -615
  274. package/src/execution/engine/engines/pi/__tests__/reader.test.ts +0 -155
  275. package/src/execution/engine/engines/pi/__tests__/spawn-opts-direct.test.ts +0 -257
  276. package/src/execution/engine/engines/pi/argv-mirror.ts +0 -135
  277. package/src/execution/engine/engines/pi/get-state-handshake.ts +0 -179
  278. package/src/execution/engine/engines/pi/output-collector.ts +0 -317
  279. package/src/execution/engine/engines/pi/pi-engine.ts +0 -811
  280. package/src/execution/engine/engines/pi/pi-invocation.ts +0 -120
  281. package/src/execution/engine/engines/pi/reader.ts +0 -59
  282. package/src/execution/engine/engines/pi/registration.ts +0 -37
  283. package/src/execution/engine/engines/pi/session-runner.ts +0 -2840
  284. package/src/execution/engine/engines/pi/spawn-event-adapter.ts +0 -404
  285. package/src/execution/engine/engines/pi/stdin-writer.ts +0 -199
  286. package/src/execution/engine/engines/pi/temp-prompt.ts +0 -62
  287. package/src/execution/engine/engines/pi/turn-limiter.ts +0 -102
  288. package/src/execution/engine/engines/zcode/__tests__/__fixtures__/fake-appserver.mjs +0 -301
  289. package/src/execution/engine/engines/zcode/__tests__/__fixtures__/zcode-golden-appserver.json +0 -36
  290. package/src/execution/engine/engines/zcode/__tests__/appserver-launcher.test.ts +0 -321
  291. package/src/execution/engine/engines/zcode/__tests__/connection.test.ts +0 -473
  292. package/src/execution/engine/engines/zcode/__tests__/parser.test.ts +0 -43
  293. package/src/execution/engine/engines/zcode/__tests__/preparer.test.ts +0 -124
  294. package/src/execution/engine/engines/zcode/__tests__/reader.test.ts +0 -210
  295. package/src/execution/engine/engines/zcode/__tests__/registration.test.ts +0 -71
  296. package/src/execution/engine/engines/zcode/__tests__/session-channel-dispose-harvest.test.ts +0 -247
  297. package/src/execution/engine/engines/zcode/__tests__/session-channel-turn-timers.test.ts +0 -451
  298. package/src/execution/engine/engines/zcode/__tests__/session-channel.test.ts +0 -792
  299. package/src/execution/engine/engines/zcode/__tests__/zcode-engine-appserver.test.ts +0 -782
  300. package/src/execution/engine/engines/zcode/__tests__/zcode-engine-degrade.test.ts +0 -168
  301. package/src/execution/engine/engines/zcode/__tests__/zcode-engine-dispose.test.ts +0 -210
  302. package/src/execution/engine/engines/zcode/__tests__/zcode-engine-retry.test.ts +0 -353
  303. package/src/execution/engine/engines/zcode/__tests__/zcode-engine-status.test.ts +0 -282
  304. package/src/execution/engine/engines/zcode/__tests__/zcode-engine-timeout.test.ts +0 -372
  305. package/src/execution/engine/engines/zcode/__tests__/zcode-engine.live.test.ts +0 -145
  306. package/src/execution/engine/engines/zcode/appserver-launcher.ts +0 -167
  307. package/src/execution/engine/engines/zcode/connection.ts +0 -598
  308. package/src/execution/engine/engines/zcode/constants.ts +0 -176
  309. package/src/execution/engine/engines/zcode/golden-sample.ts +0 -47
  310. package/src/execution/engine/engines/zcode/parser.ts +0 -102
  311. package/src/execution/engine/engines/zcode/preparer.ts +0 -235
  312. package/src/execution/engine/engines/zcode/reader.ts +0 -381
  313. package/src/execution/engine/engines/zcode/registration.ts +0 -37
  314. package/src/execution/engine/engines/zcode/session-channel.ts +0 -968
  315. package/src/execution/engine/engines/zcode/zcode-engine.ts +0 -1431
  316. package/src/execution/round-settlement.ts +0 -93
  317. package/src/execution/ui-request-queue.ts +0 -215
  318. package/src/shared/schema-env.ts +0 -44
@@ -1,93 +0,0 @@
1
- // [D4-② 轮次结算职责轴] chatMode 轮次完成的业务闭包(原 SubagentService
2
- // buildSessionRunnerContext 内的 onRoundSettled 回调 ~95 行区域)整体搬移至此
3
- // (行为逐字节等价:搬移 + 依赖注入,不重写逻辑)。变化轴:改轮次增量派生 /
4
- // notify 时序 / base 推进 / closeAfterRound 消费语义,只改本文件;Service 经
5
- // buildSessionRunnerContext 注入三个依赖回调(notify / 持久化上报 / close 兑现)。
6
-
7
- import { getLogger } from "../core/logger.ts";
8
-
9
- import { getFullTextFrom, nextRoundBaseTurnIndex } from "./execution-record.ts";
10
- import type { ExecutionRecord } from "./types.ts";
11
-
12
- const logger = getLogger("subagents");
13
-
14
- /** 轮次结算的依赖注入(Service 侧供给)。 */
15
- export interface RoundSettlementDeps {
16
- /** 本轮增量的通知投递(Service.notifyComplete——经 notifyHost)。 */
17
- notifyComplete: (record: ExecutionRecord) => void;
18
- /** 轮终迁移持久化上报(store.reportRecordTransition——live ≡ reload 等价性)。 */
19
- reportRecordTransition: (record: ExecutionRecord) => void;
20
- /** closeAfterRound 兑现(Service.closeAfterRoundSettled——chatMode 优雅关闭的终态化)。 */
21
- closeAfterRoundSettled: (record: ExecutionRecord) => Promise<void>;
22
- }
23
-
24
- /** 构造 onRoundSettled 回调(session-runner agent_settled 时调用)。
25
- *
26
- * [V2 决策 2] chatMode 首轮闭环:session-runner 已 arm idle timer,
27
- * isIdle=true 让 notify 守卫放行(时序:armIdleTimer → onRoundSettled)。
28
- * 回调体原为 subagent-service.ts buildSessionRunnerContext 的内联闭包,D4-② 拆出。 */
29
- export function createRoundSettler(deps: RoundSettlementDeps): (record: ExecutionRecord) => void {
30
- return (record) => {
31
- // v4 B-1:status 保持 running(旧 idle 折入 running);session-runner 已 arm idle timer,
32
- // isIdle=true 让 notify 守卫放行(时序:armIdleTimer → onRoundSettled,见 session-runner.ts:670)。
33
- // round 可能初始 undefined(与 notifier.ts `record.round ?? 0` 兜底一致),
34
- // 首轮 0+1=1。round 是 notifier dedup key 的组成部分,递增后同 id 下一轮不被 60s dedup 吞。
35
- record.round = (record.round ?? 0) + 1;
36
- // [N2][增量] 轮次回复写点(增量语义):roundText 自 roundBaseTurnIndex 起派生本轮增量
37
- //(undefined 视为 0——首轮增量 = 全量,与改造前首轮逐字节一致)。成功轮次的 MF-2 原写点
38
- //(doFinalizeRoundToIdle)不可达——agent_settled 恒 arm idle timer → runAndFinalize 恒
39
- // early return。写入 record.result 后再 notify;本轮无非空增量且无 lastError(纯工具轮 /
40
- // interrupt 抢占轮 / 模型空回复)时固定占位 "(no output this round)"(D5:增量语义下沿用
41
- // 旧 record.result = 上一轮增量 → 本轮通知正文 = 上一轮内容,父 agent 误读为原样重复回复;
42
- // lastError 兜底保留让失败轮通知可读)。后续 closeAfterRoundSettled 的合成 result 读
43
- // record.result,同样携带本轮增量。
44
- const roundText = getFullTextFrom(record, record.roundBaseTurnIndex ?? 0);
45
- record.result = roundText ||
46
- (record.lastError ? `round did not complete: ${record.lastError}` : "(no output this round)");
47
- // 先送达本轮增量(notify),再推进 base / 消费 closeAfterRound——终态通知由
48
- // closeAfterRoundSettled / closeChatIdle 的 notifyClosed 显式发出(dedup 身份为裸 id,
49
- // 与本次 round notify 的 id:round key 区分),保证「本轮增量 + 终态通知」都送达;
50
- // 轮次收尾 .then 的冷路径 notifyComplete 仍与本次 round notify 同 key 被 60s
51
- // dedup 吞(不构成第三条)。
52
- //
53
- // 幂等性(覆盖面如实限定):同步路径 at-least-once——notifyComplete(同步 void)抛错时
54
- // 推进/消费被跳过 → base 不推进 → 增量未消费,下轮 roundText 必含本轮文本(重发载体为
55
- // 后续轮次增量拼接)。轮次收尾 .then 的冷路径 notifyComplete 不构成重发通道
56
- // (notifier dedup.set 与 pending.splice 均先于 sendMessage,同 key `${id}:${round}`——
57
- // round 已递增——60s 窗内重入被吞)。异步 flush 窗口不保证:合并 timer armed(其他 busy
58
- // background 在场)或 isIdle 退避期间 notify 的『成功』只是入队,实际 sendMessage 发生在
59
- // base 推进之后的异步时机;该窗口进程崩溃或 sendMessage 失败 → 丢失不可重发(现状全量
60
- // 重发的次轮自愈在增量语义下消失),wave1 期恢复通道仅父 agent 经 /subagents 详情读取
61
- // record.result,wave2 指针行落地后补全。反序(先推进后 notify)在同步路径 notify 失败时
62
- // 静默丢增量且无任何重算机会,故 notify 后推进是定案。重复发送由 notifier dedup key
63
- // 60s 窗界定。
64
- deps.notifyComplete(record);
65
- // R1 观测哨(不变式违反形态):推进前检查末 turn 未闭合且 text 非空——pi 现序下不可达
66
- //(带 usage 的 message_end 恒先于 turn_end,settle 时 turn 全闭合,见 types.ts
67
- // roundBaseTurnIndex 注释的行号锚定),ES1 单测自造事件序列锁不住 pi 层变化;pi 升级若
68
- // 改变 turn_end/agent_end 时序,此哨兵留痕(该形态下公式仍把文本计入本轮,不丢数据)。
69
- const lastTurn = record.turns[record.turns.length - 1];
70
- if (lastTurn !== undefined && !lastTurn.closed && lastTurn.text.length > 0) {
71
- logger.warn(
72
- `[subagents] round settle with unclosed non-empty turn (record=${record.id}, turnIndex=${record.turns.length - 1}) — pi turn_end/agent_end ordering may have changed`,
73
- );
74
- }
75
- // [增量] base 推进(notify 之后):下一轮增量从本轮边界起。滞后空 turn 不计入边界
76
- //(防御分支,留在下一轮增量内防丢文本——nextRoundBaseTurnIndex 注释)。
77
- record.roundBaseTurnIndex = nextRoundBaseTurnIndex(record);
78
- // 轮终迁移持久化(residual-fixes U3 补全):热路径轮终不经 doFinalizeRoundToIdle
79
- //(agent_settled 恒 arm idle timer → runAndFinalize 恒 early return,MF-2 原写点
80
- // 不可达)——不 appendEntry 则 runtime/W18 派生缓存不失效,renderer 停留在
81
- // register 快照(无 result),chat 等续聊的 waiting 形态显示不出来、spinner
82
- // 卡死。显式上报:entry 携带本轮 result/round/chatMode(§5.4:result 有值 +
83
- // chatMode=true → waiting)。closeAfterRound 的终态 entry 在此后追加,序不变。
84
- deps.reportRecordTransition(record);
85
- // [M5] closeAfterRound 消费点:chatMode 每轮完成的统一汇聚点(热路径轮不经
86
- // runAndFinalize CAS 分支——agent_settled 恒 arm idle timer → runAndFinalize 恒
87
- // early return,旧消费点对 chatMode 不可达,标志置了无人消费、tool 谎报 closed:true)。
88
- if (record.closeAfterRound) {
89
- record.closeAfterRound = undefined;
90
- void deps.closeAfterRoundSettled(record);
91
- }
92
- };
93
- }
@@ -1,215 +0,0 @@
1
- // src/execution/ui-request-queue.ts
2
- //
3
- // W3/W2: 子进程 extension_ui_request 的 FIFO 串行队列 + 转发处理。
4
- //
5
- // 从 session-runner.ts 提取(保持文件 < 1000 行)。职责单一:
6
- // - createUiRequestQueue:每个子进程一个队列,保证多个 UI 请求(ask_user 等)
7
- // FIFO 串行处理,防止并发询问用户导致交错。
8
- // - handleUiRequest:从 ExtensionUiRequest 构造 UiRequest → 调主 agent uiRequestHandler
9
- // → 按 UiResponse 形状回写 stdin。
10
- // - extractMethodFields:method-specific 字段类型安全复制。
11
- //
12
- // session-runner.runSpawn 在 stdout pump 中拿到 extension_ui_request 后调 enqueue 入队。
13
-
14
- import type { ChildProcess } from "node:child_process";
15
-
16
- import { getLogger } from "../core/logger.ts";
17
-
18
- import type { UiRequest } from "./dialog-queue.ts";
19
- // 类型再导出:dialog-queue.ts 是 UiRequest/UiResponse/UiRequestHandler 的规范来源,
20
- // 本模块再导出供测试 import(避免测试直接依赖 dialog-queue 内部实现)。
21
- export type { UiRequest, UiRequestHandler, UiResponse } from "./dialog-queue.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
- import { parseChannel } from "./ui-channels.ts";
26
- import { notifyMissingHandlerGlobal } from "./ui-request-observability.ts";
27
- import { toErrorMessage } from "../core/error-message.ts";
28
-
29
- const logger = getLogger("subagents");
30
-
31
- /**
32
- * 创建 UI 请求队列。返回 enqueue 函数,调用方将 extension_ui_request 入队。
33
- *
34
- * 多个 extension_ui_request 并发到达时,队列保证 FIFO 串行处理:
35
- * 前一个请求的 uiRequestHandler resolve 后,才将下一个请求发给主 agent UI。
36
- * 防止并发询问用户导致交错(用户同时看到多个问题)。
37
- *
38
- * 设计:队列是 runSpawn 生命周期内的闭包状态(非模块级),
39
- * 每个子进程实例独立队列,无跨 session 泄漏。
40
- *
41
- * @param child 子进程(stdin 写入 extension_ui_response)
42
- * @param ctx SessionRunnerContext(含 uiRequestHandler 回调)
43
- * @returns enqueue 函数:(id, request) => void,将请求入队并触发顺序处理
44
- */
45
- export function createUiRequestQueue(
46
- child: ChildProcess,
47
- ctx: SessionRunnerContext,
48
- ): (id: string, request: ExtensionUiRequest) => void {
49
- // [R3] AbortController 取消 pending handler——子进程退出时队列不再阻塞
50
- const abortController = new AbortController();
51
- const queue: Array<{ id: string; request: ExtensionUiRequest; signal: AbortSignal }> = [];
52
- let processing = false;
53
- let closed = false;
54
-
55
- function processNext(): void {
56
- if (processing || queue.length === 0 || closed) return;
57
- processing = true;
58
- const { id, request, signal } = queue.shift()!;
59
- // [F2] .catch 在 .finally 之前:handleUiRequest 是 async 函数,任何同步异常(parseChannel
60
- // 解析 throw / respond → writeStdinLine 的 EPIPE 同步 throw / catch 分支内 respond 再次
61
- // throw)都会变成 rejection。旧链只有 .finally——rejection 穿透后无人接 →
62
- // unhandledRejection(Node 15+ 默认 mode=throw)可崩父进程。记 error 后吞掉,
63
- // .finally 照常释放 processing 推进队列(单个请求失败不阻塞后续 UI 请求)。
64
- handleUiRequest(child, id, request, ctx, signal)
65
- .catch((err: unknown) => {
66
- const m = toErrorMessage(err);
67
- logger.error(`[subagents] ui request ${id} (${request.method}) failed unexpectedly: ${m}`);
68
- })
69
- .finally(() => {
70
- processing = false;
71
- processNext();
72
- });
73
- }
74
-
75
- // [R3] 子进程退出时 abort 所有 pending handler,队列不再阻塞
76
- // [SR-4] 同步清理 L2 队列中该 child 的 pending dialog——child 在 dialog 等 L2 时退出,
77
- // L2 里该项永不 settle → processing 永远 true → 所有其他子进程 dialog 永久阻塞(全局死锁)。
78
- // pid 缺省(spawn 后极短窗口 child.pid 可能为 undefined)时跳过——此时该 child 还未在 L2
79
- // 注册过任何 dialog(handleUiRequest 构造 UiRequest 时用同样的 child.pid,pid undefined 时
80
- // 不填 _childPid,rejectChildDialogs 也匹配不到),无清理必要。
81
- const onClose = (): void => {
82
- // #19/#17 幂等守卫:close + error 可能都触发,二次调用会重复 rejectChildDialogs(虽依赖 L2 的 settled 幂等,
83
- // 但 close 状态本身需守卫——避免 closed=true 后 queue.length=0 + abort 重复执行,以及重复 reject 导致语义噪声)。
84
- if (closed) return;
85
- closed = true;
86
- abortController.abort();
87
- queue.length = 0;
88
- if (child.pid !== undefined) {
89
- ctx.dialogQueue?.rejectChildDialogs({ pid: child.pid });
90
- }
91
- };
92
- child.on("close", onClose);
93
- child.on("error", onClose);
94
-
95
- return function enqueue(id: string, request: ExtensionUiRequest): void {
96
- if (closed) return;
97
- queue.push({ id, request, signal: abortController.signal });
98
- processNext();
99
- };
100
- }
101
-
102
- /**
103
- * 处理子进程发来的 extension_ui_request(ask_user 及其他 Pi UI method)。
104
- *
105
- * 流程:从 ExtensionUiRequest 构造 UiRequest(含 channel/channelPayload)
106
- * → 调用主 agent uiRequestHandler → 按 UiResponse 形状回写 stdin。
107
- *
108
- * handler 未设置时不再静默忽略——console.warn 兜底(FR-9 可观测性),
109
- * W3 接入 SubagentService.notifyMissingHandler 的 appendEntry。
110
- *
111
- * @param child 子进程(stdin 写入响应)
112
- * @param id 请求 id(子进程用它关联 response)
113
- * @param request ExtensionUiRequest(method 平铺,从 enqueueUiRequest 传入)
114
- * @param ctx SessionRunnerContext(含 uiRequestHandler 回调)
115
- * @param signal abort signal(子进程退出时触发,取消正在等待的 handler)
116
- * @returns Promise(队列等待用:resolve 表示响应已写入 stdin 或已放弃)
117
- */
118
- async function handleUiRequest(
119
- child: ChildProcess,
120
- id: string,
121
- request: ExtensionUiRequest,
122
- ctx: SessionRunnerContext,
123
- signal?: AbortSignal,
124
- ): Promise<void> {
125
- const handler = ctx.uiRequestHandler;
126
- if (!handler) {
127
- // #9 + #11:handler 缺失时不再静默 return(会让子进程永久挂起等 response)。
128
- // - notifyMissingHandlerGlobal:经 globalThis 桥接到 observability 单例做 per-session 去重告警
129
- // (FR-9 可观测性;未注册时走 fallback warn 不丢日志)
130
- // - respond(cancelled):让子进程收到明确取消,不再永久挂起。等价于用户主动取消的语义。
131
- // 去重 key 用 child.pid(队列内拿不到真实 sessionId;pid 是子进程会话的稳定标识,
132
- // 去重粒度正确——同一子进程多次 handler 缺失只告警一次)。
133
- notifyMissingHandlerGlobal(child.pid?.toString() ?? id);
134
- respond(child, id, { cancelled: true }, signal);
135
- return;
136
- }
137
-
138
- // 从 ExtensionUiRequest 构造 UiRequest(含 channel/channelPayload)
139
- const { channel, channelPayload } = parseChannel(request);
140
- // [SR-4] 填入 child.pid 作为内部元数据:L2 队列的 rejectChildDialogs 据此关联 child close
141
- // 清理。factory 层 enqueue 时读 req._childPid 传给 opts.child。pid undefined(spawn 后极短
142
- // 窗口)时不填——rejectChildDialogs 也匹配不到(onClose 同样用 child.pid 守卫),无副作用。
143
- const uiReq: UiRequest = {
144
- id,
145
- method: request.method,
146
- ...(child.pid !== undefined ? { _childPid: child.pid } : {}),
147
- ...(channel !== undefined ? { channel } : {}),
148
- ...(channelPayload !== undefined ? { channelPayload } : {}),
149
- ...extractMethodFields(request),
150
- };
151
-
152
- try {
153
- const result = await handler(uiReq);
154
- // [R3] 子进程已退出,跳过写入
155
- if (signal?.aborted) return;
156
- respond(child, id, result, signal);
157
- } catch (err) {
158
- // [R3] 子进程已退出,跳过写入
159
- if (signal?.aborted) return;
160
- logger.error("[subagents] uiRequestHandler threw", {
161
- detail: toErrorMessage(err),
162
- });
163
- respond(child, id, { cancelled: true }, signal);
164
- }
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
-
202
- /** 从 ExtensionUiRequest 提取 method-specific 字段到 UiRequest(与 Pi rpc-types.ts 1:1)。
203
- * 按 method 变体类型安全地复制对应字段;缺失字段不复制(保持 UiRequest 可选)。
204
- * 断言说明:source/out 的 Record 断言仅为动态 key 索引,复制经 in 检查 + guard 运行时守卫。 */
205
- function extractMethodFields(req: ExtensionUiRequest): Partial<UiRequest> {
206
- const out: Partial<UiRequest> = {};
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
- }
214
- return out;
215
- }
@@ -1,44 +0,0 @@
1
- /**
2
- * schema env 跨包契约常量(零依赖叶子模块)。
3
- *
4
- * 抽取自 session-runner.ts(S5 记账项):session-runner 依赖树沉重(pi SDK /
5
- * spawn 链),跨包契约测试若从它 import 常量会把整条依赖树拖进测试进程。
6
- * 本模块只含常量与纯函数、零 import,为 structured-output 侧(及任何消费者)
7
- * 的跨包契约测试提供稳定 import 点。
8
- *
9
- * 层归属:Shared(orchestration 与 execution 共用,先例 timer-delay.ts)。
10
- */
11
-
12
- /**
13
- * 跨包契约 env 名:workflow 子进程把权威 JSON Schema 通过此 env 传给 structured-output 扩展。
14
- *
15
- * [跨包契约 SSOT] 此字面量是两个独立 npm 包(@zhushanwen/pi-subagent-workflow 与
16
- * @zhushanwen/pi-structured-output)之间的隐式 env 契约。structured-output 包内同名常量为
17
- * `ENV_SCHEMA = "PI_WORKFLOW_SCHEMA"`(见 extensions/universal/structured-output/src/index.ts)。
18
- * 两包是独立 npm 包不能直接 import,故各自保留常量但显式标注此契约关系——
19
- * 任一端改名必须同步另一端,否则权威 schema 注入会静默断桥(子进程不注册 tool/hook)。
20
- */
21
- export const SCHEMA_ENV_VAR = "PI_WORKFLOW_SCHEMA";
22
-
23
- /**
24
- * schema env 值的字节上限(256 KiB):超过则注入前 fail-fast 拒绝。
25
- *
26
- * 背景(SO-DATA-4):schema 经 childEnv 注入子进程,env 值随 spawn argv/env 块走
27
- * execve 语义——单条 env 值过大叠加全量继承的 process.env 时可能触发 E2BIG
28
- *(ARG_MAX 约束,Linux 通常 ~2MB 总上限,macOS 更紧),spawn 直接失败且错误难归因
29
- *(E2BIG 报在 spawn 调用点,与 schema 内容无关的表象)。256KB 对 JSON Schema 是
30
- * 宽裕上限(正常 schema 数 KB),提前拒绝把「难归因的 spawn 失败」变成
31
- * 「注入点处含实际大小的明确报错」。
32
- */
33
- /** 1 KiB 字节数(换算基数,SCHEMA_ENV_MAX_BYTES 组合用)。 */
34
- const BYTES_PER_KIB = 1024;
35
- /** 上限的 KiB 形态(256 KiB = 262144 bytes,注释与文档引用值)。 */
36
- const SCHEMA_ENV_MAX_KIB = 256;
37
- export const SCHEMA_ENV_MAX_BYTES = SCHEMA_ENV_MAX_KIB * BYTES_PER_KIB;
38
-
39
- /**
40
- * 计算 schema env 值的 UTF-8 字节长度(注入大小 = 该值,用于超限判定与错误消息)。
41
- */
42
- export function schemaEnvByteLength(schemaEnv: string): number {
43
- return Buffer.byteLength(schemaEnv, "utf8");
44
- }