@zhushanwen/subagent-core 0.2.0 → 0.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (347) hide show
  1. package/README.md +45 -2
  2. package/agents/analyst.md +60 -0
  3. package/agents/coder.md +69 -0
  4. package/agents/debugger.md +66 -0
  5. package/agents/doc-reviewer.md +49 -0
  6. package/agents/explorer.md +63 -0
  7. package/agents/general-purpose.md +32 -0
  8. package/agents/orchestrator.md +61 -0
  9. package/agents/planner.md +53 -0
  10. package/agents/researcher.md +67 -0
  11. package/agents/reviewer.md +73 -0
  12. package/dist/chunk-43ONBFZX.js +240 -0
  13. package/dist/chunk-APZY4IME.js +27 -0
  14. package/dist/chunk-V3VHZ2VX.js +59 -0
  15. package/dist/execution/engine/engines/zcode/constants.cjs +62 -9
  16. package/dist/execution/engine/engines/zcode/constants.d.cts +116 -12
  17. package/dist/execution/engine/engines/zcode/constants.d.ts +116 -12
  18. package/dist/execution/engine/engines/zcode/constants.js +39 -7
  19. package/dist/execution/engine/engines/zcode/reader.d.cts +2 -1
  20. package/dist/execution/engine/engines/zcode/reader.d.ts +2 -1
  21. package/dist/execution/engine/engines/zcode/reader.js +4 -234
  22. package/dist/execution/engine/paths.js +7 -19
  23. package/dist/index.cjs +18234 -1277
  24. package/dist/index.d.cts +5646 -673
  25. package/dist/index.d.ts +5646 -673
  26. package/dist/index.js +17828 -1277
  27. package/dist/{types-BxyAidGf.d.cts → types-Dv4QhSJ_.d.cts} +678 -112
  28. package/dist/{types-BxyAidGf.d.ts → types-Dv4QhSJ_.d.ts} +678 -112
  29. package/package.json +7 -4
  30. package/src/__tests__/agent-opts-resolver-schema-prompt.test.ts +0 -1
  31. package/src/__tests__/append-system-prompt-assembly.test.ts +8 -7
  32. package/src/__tests__/fr4-get-state-handshake.test.ts +2 -2
  33. package/src/__tests__/m2-append-content-probe.test.ts +0 -1
  34. package/src/__tests__/manifest-store.test.ts +10 -9
  35. package/src/__tests__/record-store-cache.test.ts +0 -2
  36. package/src/__tests__/record-store-index.test.ts +1 -2
  37. package/src/__tests__/review-fix-loop-script.test.ts +93 -3
  38. package/src/__tests__/review-fix-loop-utils.test.ts +31 -10
  39. package/src/__tests__/robustness-low-batch1.test.ts +6 -5
  40. package/src/__tests__/robustness-medium-batch1.test.ts +2 -2
  41. package/src/__tests__/robustness-medium-batch2.test.ts +17 -6
  42. package/src/__tests__/robustness-medium-batch4.test.ts +2 -2
  43. package/src/__tests__/session-runner.test.ts +1 -1
  44. package/src/__tests__/smoke.test.ts +9 -2
  45. package/src/core/__tests__/host-services.test.ts +2 -2
  46. package/src/core/__tests__/logger.test.ts +1 -1
  47. package/src/core/error-message.ts +9 -0
  48. package/src/core/host-services.ts +21 -5
  49. package/src/core/notify-ports.ts +18 -5
  50. package/src/execution/__tests__/agent-profile.test.ts +232 -0
  51. package/src/execution/__tests__/agent-registry.test.ts +370 -0
  52. package/src/execution/__tests__/agent-result-mapper.test.ts +18 -2
  53. package/src/execution/__tests__/agents-assembly.test.ts +219 -0
  54. package/src/execution/__tests__/ask-user-transit-e2e.test.ts +6 -6
  55. package/src/execution/__tests__/chat-engine-routing.test.ts +136 -30
  56. package/src/execution/__tests__/chatmode-first-round-closure-spawn.test.ts +5 -4
  57. package/src/execution/__tests__/cold-resurrect.test.ts +283 -0
  58. package/src/execution/__tests__/create-concurrency-pool.test.ts +194 -0
  59. package/src/execution/__tests__/delivery-methods.test.ts +77 -62
  60. package/src/execution/__tests__/descendant-sweep-guards.test.ts +220 -0
  61. package/src/execution/__tests__/descendant-sweep.test.ts +269 -0
  62. package/src/execution/__tests__/dialog-queue.test.ts +199 -1
  63. package/src/execution/__tests__/engine-model-validation.test.ts +741 -0
  64. package/src/execution/__tests__/epipe-fallback.test.ts +31 -24
  65. package/src/execution/__tests__/execute-and-await-worktree.test.ts +21 -91
  66. package/src/execution/__tests__/execute-nesting.test.ts +34 -188
  67. package/src/execution/__tests__/execution-record.test.ts +217 -60
  68. package/src/execution/__tests__/execution-runtime-face.test.ts +272 -0
  69. package/src/execution/__tests__/explicit-agent-ref-guard.test.ts +3 -3
  70. package/src/execution/__tests__/finalize-record.test.ts +278 -16
  71. package/src/execution/__tests__/gc-timer.test.ts +57 -2
  72. package/src/execution/__tests__/get-record-for-action-restart.test.ts +14 -12
  73. package/src/execution/__tests__/get-state-handshake.test.ts +127 -0
  74. package/src/execution/__tests__/helpers/mock-extension-api.ts +1 -1
  75. package/src/execution/__tests__/helpers/session-runner-mocks.ts +113 -0
  76. package/src/execution/__tests__/helpers/spawn-mock.ts +150 -3
  77. package/src/execution/__tests__/helpers/subagent-service-mocks.ts +137 -0
  78. package/src/execution/__tests__/keep-alive-no-progress.test.ts +280 -0
  79. package/src/execution/__tests__/kill-all-escalation.test.ts +196 -0
  80. package/src/execution/__tests__/lifecycle-manager-idle-timer-identity.test.ts +117 -0
  81. package/src/execution/__tests__/lifecycle-manager.test.ts +39 -0
  82. package/src/execution/__tests__/lifecycle-predicates.test.ts +1 -2
  83. package/src/execution/__tests__/manifest-parentid.test.ts +4 -4
  84. package/src/execution/__tests__/manifest-store-tmp-recovery.test.ts +99 -0
  85. package/src/execution/__tests__/max-turns-to-watchdog-ms.test.ts +113 -0
  86. package/src/execution/__tests__/model-resolver.test.ts +2 -2
  87. package/src/execution/__tests__/nested-visibility-env-propagation.test.ts +23 -121
  88. package/src/execution/__tests__/nested-visibility.test.ts +2 -0
  89. package/src/execution/__tests__/notify-ledger.test.ts +1249 -0
  90. package/src/execution/__tests__/output-collector.test.ts +117 -6
  91. package/src/execution/__tests__/pi-invocation.test.ts +1 -1
  92. package/src/execution/__tests__/record-store-orphan-revive.test.ts +159 -0
  93. package/src/execution/__tests__/record-store.test.ts +89 -5
  94. package/src/execution/__tests__/records-cwd-isolation.test.ts +2 -2
  95. package/src/execution/__tests__/recursive-visibility-baseline.test.ts +29 -132
  96. package/src/execution/__tests__/recursive-visibility-env.test.ts +55 -179
  97. package/src/execution/__tests__/rpc-mode.test.ts +2 -2
  98. package/src/execution/__tests__/run-and-finalize-anchoring.test.ts +387 -0
  99. package/src/execution/__tests__/run-and-finalize-chatmode.test.ts +19 -9
  100. package/src/execution/__tests__/run-spawn-chatmode-settled.test.ts +5 -4
  101. package/src/execution/__tests__/run-spawn-edges.test.ts +418 -26
  102. package/src/execution/__tests__/run-spawn-integration.test.ts +3 -3
  103. package/src/execution/__tests__/run-spawn-resume.test.ts +2 -2
  104. package/src/execution/__tests__/run-spawn-rpc-mode.test.ts +2 -2
  105. package/src/execution/__tests__/run-spawn-stdout-callback-throw.test.ts +16 -8
  106. package/src/execution/__tests__/service-kill-escalation.test.ts +91 -0
  107. package/src/execution/__tests__/session-context-resolver.test.ts +0 -2
  108. package/src/execution/__tests__/session-file-gc.test.ts +35 -0
  109. package/src/execution/__tests__/session-pending.test.ts +471 -0
  110. package/src/execution/__tests__/session-reconstructor.test.ts +366 -15
  111. package/src/execution/__tests__/session-runner-branch-cache-lru.test.ts +110 -0
  112. package/src/execution/__tests__/session-runner-close-prune.test.ts +181 -0
  113. package/src/execution/__tests__/session-runner-dispatch.test.ts +489 -0
  114. package/src/execution/__tests__/session-runner-epipe.test.ts +4 -3
  115. package/src/execution/__tests__/session-runner-heartbeat-idle-fallback.test.ts +227 -0
  116. package/src/execution/__tests__/session-runner-lifecycle-helpers.test.ts +290 -0
  117. package/src/execution/__tests__/session-runner-schema-env.test.ts +7 -5
  118. package/src/execution/__tests__/settled-watchdog.test.ts +524 -0
  119. package/src/execution/__tests__/spawn-args.test.ts +11 -10
  120. package/src/execution/__tests__/spawn-event-adapter-rpc.test.ts +26 -23
  121. package/src/execution/__tests__/spawn-event-adapter.test.ts +1 -1
  122. package/src/execution/__tests__/spawn-worktree-guidance.test.ts +5 -4
  123. package/src/execution/__tests__/spawned-children.test.ts +155 -11
  124. package/src/execution/__tests__/start-sync-model-guard.test.ts +4 -4
  125. package/src/execution/__tests__/stdin-writer.test.ts +6 -4
  126. package/src/execution/__tests__/stream-sink-retirement.test.ts +6 -6
  127. package/src/execution/__tests__/subagent-actions-core.test.ts +1017 -0
  128. package/src/execution/__tests__/subagent-service-message-close.test.ts +99 -35
  129. package/src/execution/__tests__/subagent-service-multiproc-guard.test.ts +174 -0
  130. package/src/execution/__tests__/subagent-service-notify-gate.test.ts +271 -0
  131. package/src/execution/__tests__/subagent-service-parent-guard.test.ts +33 -29
  132. package/src/execution/__tests__/subagent-service-recovery-bounds.test.ts +341 -0
  133. package/src/execution/__tests__/subagent-service.test.ts +37 -30
  134. package/src/execution/__tests__/subprocess-agent-runner-routing.test.ts +88 -12
  135. package/src/execution/__tests__/subprocess-agent-runner-timeout.test.ts +75 -0
  136. package/src/execution/__tests__/subprocess-agent-runner.test.ts +22 -20
  137. package/src/execution/__tests__/temp-prompt.test.ts +1 -1
  138. package/src/execution/__tests__/timeout-integration.test.ts +13 -12
  139. package/src/execution/__tests__/turn-limiter-semantics.test.ts +1 -1
  140. package/src/execution/__tests__/turn-limiter.test.ts +1 -1
  141. package/src/execution/__tests__/ui-request-handler-factory.test.ts +107 -7
  142. package/src/execution/__tests__/ui-request-handler.test.ts +4 -3
  143. package/src/execution/__tests__/ui-request-queue.test.ts +167 -2
  144. package/src/execution/__tests__/worktree-git-ops.test.ts +571 -0
  145. package/src/execution/__tests__/worktree-manager.test.ts +14 -5
  146. package/src/execution/__tests__/worktree-pid-registration.integration.test.ts +4 -3
  147. package/src/execution/__tests__/worktree-reconcile-aging.test.ts +204 -0
  148. package/src/execution/agent-registry.ts +298 -30
  149. package/src/execution/agent-result-mapper.ts +3 -0
  150. package/src/execution/agents-assembly.ts +88 -0
  151. package/src/execution/cold-resurrect.ts +199 -0
  152. package/src/execution/concurrency-pool.ts +71 -9
  153. package/src/execution/dialog-queue.ts +101 -3
  154. package/src/execution/engine/__tests__/common/capability-gate.test.ts +91 -0
  155. package/src/execution/engine/__tests__/common/data-dir.test.ts +1 -1
  156. package/src/execution/engine/__tests__/common/journal-wiring.test.ts +84 -0
  157. package/src/execution/engine/__tests__/common/kill-chain.test.ts +34 -7
  158. package/src/execution/engine/__tests__/common/persona-router.test.ts +4 -5
  159. package/src/execution/engine/__tests__/common/pool-manager.test.ts +211 -51
  160. package/src/execution/engine/__tests__/common/session-view-service-zcode-dbpath.test.ts +149 -0
  161. package/src/execution/engine/__tests__/common/session-view-service.test.ts +499 -0
  162. package/src/execution/engine/__tests__/conformance/contract.abort.test.ts +56 -99
  163. package/src/execution/engine/__tests__/conformance/contract.agent-events.test.ts +88 -15
  164. package/src/execution/engine/__tests__/conformance/engine-conformance.live.test.ts +33 -7
  165. package/src/execution/engine/__tests__/conformance/golden-replay.pi.test.ts +1 -1
  166. package/src/execution/engine/__tests__/conformance/golden-replay.zcode.test.ts +75 -54
  167. package/src/execution/engine/__tests__/conformance/zcode-appserver-harness.ts +128 -0
  168. package/src/execution/engine/__tests__/engine-discovery.test.ts +15 -3
  169. package/src/execution/engine/__tests__/model-prompt.test.ts +15 -3
  170. package/src/execution/engine/__tests__/registry.test.ts +94 -3
  171. package/src/execution/engine/__tests__/routing.test.ts +115 -6
  172. package/src/execution/engine/common/capability-gate.ts +92 -0
  173. package/src/execution/engine/common/journal-wiring.ts +97 -0
  174. package/src/execution/engine/common/kill-chain.ts +42 -10
  175. package/src/execution/engine/common/nesting-guard.ts +66 -0
  176. package/src/execution/engine/common/persona-router.ts +18 -8
  177. package/src/execution/engine/common/pool-manager.ts +332 -78
  178. package/src/execution/engine/common/session-view-service.ts +506 -0
  179. package/src/execution/engine/common/session-view-types.ts +125 -0
  180. package/src/execution/engine/engine-discovery.ts +12 -16
  181. package/src/execution/engine/engines/pi/__tests__/pi-engine.test.ts +174 -28
  182. package/src/execution/engine/engines/pi/__tests__/spawn-opts-direct.test.ts +257 -0
  183. package/src/execution/{argv-mirror.ts → engine/engines/pi/argv-mirror.ts} +43 -21
  184. package/src/execution/{get-state-handshake.ts → engine/engines/pi/get-state-handshake.ts} +86 -11
  185. package/src/execution/{output-collector.ts → engine/engines/pi/output-collector.ts} +108 -19
  186. package/src/execution/engine/engines/pi/pi-engine.ts +434 -38
  187. package/src/execution/{pi-invocation.ts → engine/engines/pi/pi-invocation.ts} +2 -2
  188. package/src/execution/engine/engines/pi/reader.ts +11 -0
  189. package/src/execution/engine/engines/pi/registration.ts +4 -2
  190. package/src/execution/engine/engines/pi/session-runner.ts +2840 -0
  191. package/src/execution/{spawn-event-adapter.ts → engine/engines/pi/spawn-event-adapter.ts} +75 -34
  192. package/src/execution/{stdin-writer.ts → engine/engines/pi/stdin-writer.ts} +10 -9
  193. package/src/execution/{temp-prompt.ts → engine/engines/pi/temp-prompt.ts} +2 -2
  194. package/src/execution/{turn-limiter.ts → engine/engines/pi/turn-limiter.ts} +1 -1
  195. package/src/execution/engine/engines/zcode/__tests__/__fixtures__/fake-appserver.mjs +301 -0
  196. package/src/execution/engine/engines/zcode/__tests__/__fixtures__/zcode-golden-appserver.json +36 -0
  197. package/src/execution/engine/engines/zcode/__tests__/appserver-launcher.test.ts +321 -0
  198. package/src/execution/engine/engines/zcode/__tests__/connection.test.ts +473 -0
  199. package/src/execution/engine/engines/zcode/__tests__/parser.test.ts +7 -210
  200. package/src/execution/engine/engines/zcode/__tests__/preparer.test.ts +6 -110
  201. package/src/execution/engine/engines/zcode/__tests__/session-channel-dispose-harvest.test.ts +247 -0
  202. package/src/execution/engine/engines/zcode/__tests__/session-channel-turn-timers.test.ts +451 -0
  203. package/src/execution/engine/engines/zcode/__tests__/session-channel.test.ts +792 -0
  204. package/src/execution/engine/engines/zcode/__tests__/zcode-engine-appserver.test.ts +782 -0
  205. package/src/execution/engine/engines/zcode/__tests__/zcode-engine-degrade.test.ts +168 -0
  206. package/src/execution/engine/engines/zcode/__tests__/zcode-engine-dispose.test.ts +210 -0
  207. package/src/execution/engine/engines/zcode/__tests__/zcode-engine-retry.test.ts +353 -0
  208. package/src/execution/engine/engines/zcode/__tests__/zcode-engine-status.test.ts +282 -0
  209. package/src/execution/engine/engines/zcode/__tests__/zcode-engine-timeout.test.ts +372 -0
  210. package/src/execution/engine/engines/zcode/__tests__/zcode-engine.live.test.ts +65 -47
  211. package/src/execution/engine/engines/zcode/appserver-launcher.ts +167 -0
  212. package/src/execution/engine/engines/zcode/connection.ts +598 -0
  213. package/src/execution/engine/engines/zcode/constants.ts +147 -14
  214. package/src/execution/engine/engines/zcode/golden-sample.ts +42 -34
  215. package/src/execution/engine/engines/zcode/parser.ts +12 -346
  216. package/src/execution/engine/engines/zcode/preparer.ts +22 -150
  217. package/src/execution/engine/engines/zcode/session-channel.ts +968 -0
  218. package/src/execution/engine/engines/zcode/zcode-engine.ts +1023 -250
  219. package/src/execution/engine/host-task-spec.ts +32 -36
  220. package/src/execution/engine/model-validation.ts +177 -0
  221. package/src/execution/engine/port.ts +65 -7
  222. package/src/execution/engine/registry.ts +53 -0
  223. package/src/execution/engine/routing.ts +75 -1
  224. package/src/execution/engine/types.ts +30 -103
  225. package/src/execution/execution-record.ts +222 -144
  226. package/src/execution/finalize-record.ts +181 -85
  227. package/src/execution/idle-gc.ts +28 -0
  228. package/src/execution/lifecycle-manager.ts +27 -3
  229. package/src/execution/lifecycle-predicates.ts +1 -1
  230. package/src/execution/manifest-store.ts +53 -62
  231. package/src/execution/notifier.ts +10 -10
  232. package/src/execution/notify-host.ts +212 -0
  233. package/src/execution/notify-ledger.ts +117 -16
  234. package/src/execution/record-entry.ts +8 -2
  235. package/src/execution/record-store.ts +148 -88
  236. package/src/execution/round-settlement.ts +93 -0
  237. package/src/execution/session-file-gc.ts +96 -62
  238. package/src/execution/session-pending.ts +213 -62
  239. package/src/execution/session-reconstructor.ts +256 -143
  240. package/src/execution/sessions-index.ts +127 -102
  241. package/src/execution/settled-watchdog.ts +311 -0
  242. package/src/execution/subagent-actions-core.ts +686 -0
  243. package/src/execution/subagent-service.ts +1106 -907
  244. package/src/execution/subprocess-agent-runner.ts +144 -97
  245. package/src/execution/types.ts +9 -0
  246. package/src/execution/ui-request-handler-factory.ts +126 -75
  247. package/src/execution/ui-request-queue.ts +50 -19
  248. package/src/execution/worktree-git-ops.ts +397 -0
  249. package/src/execution/worktree-manager.ts +72 -10
  250. package/src/execution/worktree-registry.ts +6 -12
  251. package/src/index.ts +542 -9
  252. package/src/orchestration/__tests__/__fixtures__/worker-template.snapshot.txt +42 -3
  253. package/src/orchestration/__tests__/agent-call-catch-fallback.test.ts +3 -5
  254. package/src/orchestration/__tests__/agent-call-stream.test.ts +2 -2
  255. package/src/orchestration/__tests__/args-meta.test.ts +358 -0
  256. package/src/orchestration/__tests__/args-validator.test.ts +14 -0
  257. package/src/orchestration/__tests__/error-recovery-rebuild-failure.test.ts +312 -0
  258. package/src/orchestration/__tests__/error-recovery-terminal-hardening.test.ts +384 -0
  259. package/src/orchestration/__tests__/execute-agent-call.test.ts +151 -11
  260. package/src/orchestration/__tests__/file-run-store-prune.test.ts +168 -0
  261. package/src/orchestration/__tests__/file-run-store-throttle.test.ts +168 -0
  262. package/src/orchestration/__tests__/file-run-store.test.ts +390 -0
  263. package/src/orchestration/__tests__/helpers/flush-microtasks.ts +13 -0
  264. package/src/orchestration/__tests__/launcher-nested-workflow.test.ts +34 -0
  265. package/src/orchestration/__tests__/lifecycle-abort-broadcast-signal.test.ts +357 -0
  266. package/src/orchestration/__tests__/lifecycle-recover-crashed.test.ts +289 -0
  267. package/src/orchestration/__tests__/lifecycle-runid-injection.test.ts +3 -3
  268. package/src/orchestration/__tests__/lifecycle.test.ts +84 -5
  269. package/src/orchestration/__tests__/non-cloneable-return-e2e.test.ts +1 -1
  270. package/src/orchestration/__tests__/run-snapshot.test.ts +356 -0
  271. package/src/orchestration/__tests__/script-generate.test.ts +314 -0
  272. package/src/orchestration/__tests__/script-lint.test.ts +17 -0
  273. package/src/orchestration/__tests__/test-mocks.ts +2 -0
  274. package/src/orchestration/__tests__/worker-exit-without-result.test.ts +7 -6
  275. package/src/orchestration/__tests__/worker-message-pump-finalize-run.test.ts +229 -0
  276. package/src/orchestration/__tests__/{error-recovery-handlers.test.ts → worker-message-pump-handlers.test.ts} +28 -27
  277. package/src/orchestration/__tests__/{error-recovery-postmessage-defense.test.ts → worker-message-pump-postmessage-defense.test.ts} +8 -8
  278. package/src/orchestration/__tests__/{error-recovery-serialize-failed-result.test.ts → worker-message-pump-serialize-failed-result.test.ts} +2 -2
  279. package/src/orchestration/__tests__/{error-recovery-workflow-call.test.ts → worker-message-pump-workflow-call.test.ts} +1 -1
  280. package/src/orchestration/__tests__/worker-pending-timeout-abort.test.ts +275 -0
  281. package/src/orchestration/__tests__/worker-script-builder-runtime.test.ts +78 -1
  282. package/src/orchestration/__tests__/worker-script-builder.test.ts +1 -1
  283. package/src/orchestration/__tests__/workflow-files.test.ts +186 -0
  284. package/src/orchestration/__tests__/workflow-nesting-e2e.test.ts +1 -1
  285. package/src/orchestration/__tests__/workflow-run-summary.test.ts +119 -0
  286. package/src/orchestration/__tests__/workflow-script-registry-impl.test.ts +124 -0
  287. package/src/orchestration/agent-opts-resolver.ts +8 -8
  288. package/src/orchestration/args-meta.ts +198 -0
  289. package/src/orchestration/args-validator.ts +53 -31
  290. package/src/orchestration/execute-agent-call.ts +25 -79
  291. package/src/orchestration/file-run-store.ts +327 -0
  292. package/src/orchestration/launcher.ts +160 -104
  293. package/src/orchestration/lifecycle.ts +371 -97
  294. package/src/orchestration/models/agent-call.ts +7 -7
  295. package/src/orchestration/models/budget.ts +5 -5
  296. package/src/orchestration/models/ports.ts +4 -4
  297. package/src/orchestration/models/run-runtime.ts +15 -15
  298. package/src/orchestration/models/trace.ts +9 -9
  299. package/src/orchestration/models/types.ts +111 -22
  300. package/src/orchestration/models/workflow-run.ts +28 -28
  301. package/src/orchestration/models/workflow-script.ts +4 -4
  302. package/src/orchestration/run-snapshot.ts +266 -0
  303. package/src/orchestration/script-generate.ts +154 -0
  304. package/src/orchestration/script-lint.ts +123 -90
  305. package/src/orchestration/worker-handle.ts +10 -10
  306. package/src/orchestration/worker-host.ts +10 -10
  307. package/src/orchestration/{error-recovery.ts → worker-message-pump.ts} +498 -221
  308. package/src/orchestration/worker-script-builder.ts +401 -346
  309. package/src/orchestration/workflow-files.ts +37 -11
  310. package/src/orchestration/workflow-run-summary.ts +69 -0
  311. package/src/orchestration/workflow-script-registry-impl.ts +31 -9
  312. package/src/shared/__tests__/agent-ref.test.ts +209 -2
  313. package/src/shared/__tests__/atomic-write.test.ts +267 -0
  314. package/src/shared/__tests__/bounded-serialize.test.ts +236 -0
  315. package/src/shared/__tests__/injection-render.test.ts +518 -0
  316. package/src/shared/__tests__/meta-parser.test.ts +151 -0
  317. package/src/shared/__tests__/resource-discovery-host-roots.test.ts +474 -0
  318. package/src/shared/__tests__/resource-discovery.test.ts +261 -217
  319. package/src/shared/agent-ref.ts +143 -2
  320. package/src/shared/atomic-write.ts +323 -0
  321. package/src/shared/bounded-serialize.ts +154 -0
  322. package/src/shared/injection-render.ts +279 -0
  323. package/src/shared/meta-parser.ts +182 -68
  324. package/src/shared/model-ref.ts +15 -2
  325. package/src/shared/resource-discovery.ts +97 -204
  326. package/src/shared/resource-meta.ts +14 -0
  327. package/src/shared/schema-jsonify.ts +1 -1
  328. package/src/shared/xml-injection.ts +9 -9
  329. package/workflows/README.md +9 -9
  330. package/workflows/chain.js +4 -2
  331. package/workflows/map-reduce.js +5 -3
  332. package/workflows/parallel.js +5 -3
  333. package/workflows/review-fix-loop-utils.cjs +165 -92
  334. package/workflows/review-fix-loop-utils.d.cts +287 -0
  335. package/workflows/review-fix-loop.js +18 -7
  336. package/workflows/scatter-gather.js +4 -2
  337. package/dist/chunk-3VOERJPJ.js +0 -22
  338. package/src/execution/__tests__/execute-options-mapper.test.ts +0 -200
  339. package/src/execution/engine/engines/pi/__tests__/task-spec-mapper.test.ts +0 -164
  340. package/src/execution/engine/engines/pi/task-spec-mapper.ts +0 -100
  341. package/src/execution/engine/engines/zcode/__tests__/__fixtures__/zcode-golden-spawn.json +0 -39
  342. package/src/execution/engine/engines/zcode/__tests__/launcher.test.ts +0 -150
  343. package/src/execution/engine/engines/zcode/__tests__/zcode-engine.test.ts +0 -580
  344. package/src/execution/engine/engines/zcode/launcher.ts +0 -161
  345. package/src/execution/execute-options-mapper.ts +0 -115
  346. package/src/execution/session-runner.ts +0 -1789
  347. package/src/shared/__tests__/resource-discovery-manifest-cache.test.ts +0 -288
@@ -8,7 +8,8 @@
8
8
  // 适用于"任务太大需要先拆分再并行处理"的场景。
9
9
  //
10
10
  // 用法:
11
- // workflow run scatter-gather --args task="重构认证模块,涉及 session/jwt/oauth 三块"
11
+ // workflow run scatter-gather --args task="重构认证模块,涉及 session/jwt/oauth 三块"(pi 宿主语法)
12
+ // zsw workflow --workflow scatter-gather --task "<大任务描述>" --workdir <绝对路径>(zsw 宿主直参语法;`zsw` 为 CLI 简写,实际执行以 SessionStart 注入段的 node "<绝对路径>/bin/zsw.js" 形态为准;per-workflow 参数用 zsw 专属 flag,语义见 @pi-meta parameters)
12
13
  //
13
14
  // ⚠️ lintScript 约束(本脚本已遵守):含 parallel() 入口(兼 agent 嵌套),禁止 bare IIFE
14
15
 
@@ -26,7 +27,8 @@ usage: |
26
27
  ## 使用说明
27
28
  - scatter 拆解大任务 → process 并行处理 → gather 聚合结果
28
29
  - agents:逗号分隔的 agent .md 绝对路径,按顺序对应 scatter/process/gather 三段
29
- - 示例:workflow run scatter-gather --args task="<大任务描述>" agents="/path/splitter.md,/path/processor.md"
30
+ - 示例(pi 宿主语法):workflow run scatter-gather --args task="<大任务描述>" agents="/path/splitter.md,/path/processor.md"
31
+ - 示例(zsw 宿主直参语法;`zsw` 为 CLI 简写,实际以注入段 node "<绝对路径>/bin/zsw.js" 形态为准):zsw workflow --workflow scatter-gather --task "<大任务描述>" --workdir <绝对路径>(per-workflow 参数用 zsw 专属 flag,语义见 @pi-meta parameters)
30
32
  */
31
33
 
32
34
  // ── 入参($ARGS)──────────────────────────────────────────────────
@@ -1,22 +0,0 @@
1
- // src/execution/engine/engines/zcode/constants.ts
2
- var ZCODE_ENGINE_ID = "zcode";
3
- var ZCODE_ADAPTER_VERSION = "1.0.0";
4
- var ZCODE_CLI_DEFAULT_PATH = "/Applications/ZCode.app/Contents/Resources/glm/zcode.cjs";
5
- var ZCODE_V2_CONFIG_PATH_SUFFIX = [".zcode", "v2", "config.json"];
6
- var ZCODE_POOL_CONFIG_SUFFIX = [".zcode", "cli", "config.json"];
7
- var ZCODE_POOL_DB_RELATIVE_PATH = ".zcode/cli/db/db.sqlite";
8
- var ZCODE_FALLBACK_DEFAULT_MODEL = "builtin:bigmodel-coding-plan/GLM-5.3";
9
- var ZCODE_KILL_GRACE_MS = 5e3;
10
- var ZCODE_ERROR_TAIL_CHARS = 2e3;
11
-
12
- export {
13
- ZCODE_ENGINE_ID,
14
- ZCODE_ADAPTER_VERSION,
15
- ZCODE_CLI_DEFAULT_PATH,
16
- ZCODE_V2_CONFIG_PATH_SUFFIX,
17
- ZCODE_POOL_CONFIG_SUFFIX,
18
- ZCODE_POOL_DB_RELATIVE_PATH,
19
- ZCODE_FALLBACK_DEFAULT_MODEL,
20
- ZCODE_KILL_GRACE_MS,
21
- ZCODE_ERROR_TAIL_CHARS
22
- };
@@ -1,200 +0,0 @@
1
- // src/execution/__tests__/execute-options-mapper.test.ts
2
- //
3
- // T3.4 (边界): cwd 透传(非 git worktree)
4
- // T3.5 (边界): model 填底——opts.model 空 → ctxModel(D-008)
5
- // T3.9 (边界): schemaEnv 透传——opts.schemaEnv → ExecuteOptions.schemaEnv
6
- // T3.6 (异常): timeoutMs 超时 → 合并 signal abort → T3.17 listener 清理
7
- //
8
- // 测试范围: mapToExecuteOptions 全字段映射 + mergeTimeoutSignal 行为
9
-
10
- import { describe, expect, it, vi } from "vitest";
11
-
12
- import type { AgentCallOpts } from "../../orchestration/models/types.ts";
13
- import { mapToExecuteOptions, mergeTimeoutSignal } from "../execute-options-mapper.ts";
14
- import type { ModelInfo } from "../model-resolver.ts";
15
-
16
- describe("mapToExecuteOptions (D-A2)", () => {
17
- const baseOpts: AgentCallOpts = {
18
- prompt: "test task",
19
- agent: "worker",
20
- schema: { type: "object" },
21
- cwd: "/tmp/work",
22
- skillPath: "/path/to/skill.md",
23
- };
24
-
25
- it("T3.10 slug 截断: description > SLUG_MAX_LENGTH(35) → 截断到 35", () => {
26
- const opts: AgentCallOpts = { ...baseOpts, description: "a".repeat(36) };
27
- const result = mapToExecuteOptions(opts);
28
- expect(result.slug).toHaveLength(35);
29
- expect(result.slug).toBe("a".repeat(35));
30
- });
31
-
32
- it("T3.10 slug 边界: description = 35 → 不截断", () => {
33
- const opts: AgentCallOpts = { ...baseOpts, description: "a".repeat(35) };
34
- const result = mapToExecuteOptions(opts);
35
- expect(result.slug).toHaveLength(35);
36
- expect(result.slug).toBe("a".repeat(35));
37
- });
38
-
39
- it("T3.10 slug 回落: 无 description → agentName", () => {
40
- const result = mapToExecuteOptions(baseOpts);
41
- expect(result.slug).toBe("worker");
42
- });
43
-
44
- it("T3.4 基本映射: prompt→task, agent→agent, cwd→cwd", () => {
45
- const result = mapToExecuteOptions(baseOpts);
46
- expect(result.task).toBe("test task");
47
- expect(result.agent).toBe("worker");
48
- expect(result.cwd).toBe("/tmp/work");
49
- });
50
-
51
- it("T3.4 schema 透传", () => {
52
- const result = mapToExecuteOptions(baseOpts);
53
- expect(result.schema).toEqual({ type: "object" });
54
- });
55
-
56
- it("T3.9 schemaEnv 透传 (D-A6 bridge)", () => {
57
- const opts: AgentCallOpts = { ...baseOpts, schemaEnv: '{"type":"object"}' };
58
- const result = mapToExecuteOptions(opts);
59
- expect(result.schemaEnv).toBe('{"type":"object"}');
60
- });
61
-
62
- it("T3.9 schemaEnv 不传 → schemaEnv undefined", () => {
63
- const result = mapToExecuteOptions(baseOpts);
64
- expect(result.schemaEnv).toBeUndefined();
65
- });
66
-
67
- it("T3.5 model: opts.model 优先(显式 override 透传,不与 ctxModel 混合)", () => {
68
- const opts: AgentCallOpts = { ...baseOpts, model: "explicit-model" };
69
- const ctxModel: ModelInfo = { id: "ctx-model", provider: "test", input: [] } as ModelInfo;
70
- const result = mapToExecuteOptions(opts, ctxModel);
71
- expect(result.model).toBe("explicit-model");
72
- });
73
-
74
- it("T3.5 model: opts.model 空 → model undefined(不再从 ctxModel.id 填底)", () => {
75
- const ctxModel: ModelInfo = { id: "ctx-model", provider: "test", input: [] } as ModelInfo;
76
- const result = mapToExecuteOptions(baseOpts, ctxModel);
77
- expect(result.model).toBeUndefined();
78
- });
79
-
80
- it("T3.5 ctxModel 透传: opts.model 空时 ctxModel 作为完整 ModelInfo 对象传入 ExecuteOptions.ctxModel", () => {
81
- const ctxModel: ModelInfo = { id: "mimo-v2.5-pro", provider: "router-openai", input: [] } as ModelInfo;
82
- const result = mapToExecuteOptions(baseOpts, ctxModel);
83
- expect(result.ctxModel).toBe(ctxModel);
84
- expect(result.ctxModel?.id).toBe("mimo-v2.5-pro");
85
- expect(result.ctxModel?.provider).toBe("router-openai");
86
- });
87
-
88
- it("T3.5 ctxModel 透传: opts.model 有值时 ctxModel 仍透传(双层可用)", () => {
89
- const opts: AgentCallOpts = { ...baseOpts, model: "explicit-model" };
90
- const ctxModel: ModelInfo = { id: "ctx-model", provider: "test", input: [] } as ModelInfo;
91
- const result = mapToExecuteOptions(opts, ctxModel);
92
- expect(result.model).toBe("explicit-model");
93
- expect(result.ctxModel).toBe(ctxModel);
94
- });
95
-
96
- it("T3.5 ctxModel: 两层均空 → model/ctxModel 都 undefined", () => {
97
- const result = mapToExecuteOptions(baseOpts);
98
- expect(result.model).toBeUndefined();
99
- expect(result.ctxModel).toBeUndefined();
100
- });
101
-
102
- it("skillPath 透传", () => {
103
- const result = mapToExecuteOptions(baseOpts);
104
- expect(result.skillPath).toBe("/path/to/skill.md");
105
- });
106
-
107
- it("thinkingLevel 透传 (M1)", () => {
108
- const opts: AgentCallOpts = { ...baseOpts, thinkingLevel: "high" };
109
- const result = mapToExecuteOptions(opts);
110
- expect(result.thinkingLevel).toBe("high");
111
- });
112
-
113
- it("thinkingLevel 不传 → thinkingLevel undefined", () => {
114
- const result = mapToExecuteOptions(baseOpts);
115
- expect(result.thinkingLevel).toBeUndefined();
116
- });
117
-
118
- it("appendSystemPrompt → appendSystemPrompt 透传", () => {
119
- const opts: AgentCallOpts = { ...baseOpts, appendSystemPrompt: ["SO instruction content"] };
120
- const result = mapToExecuteOptions(opts);
121
- expect(result.appendSystemPrompt).toEqual(["SO instruction content"]);
122
- });
123
-
124
- it("appendSystemPrompt 不传 → appendSystemPrompt undefined", () => {
125
- const result = mapToExecuteOptions(baseOpts);
126
- expect(result.appendSystemPrompt).toBeUndefined();
127
- });
128
-
129
- it("maxTurns 透传(预算语义对齐:workflow agent() 可显式传 turn 上限)", () => {
130
- const opts: AgentCallOpts = { ...baseOpts, maxTurns: 20 };
131
- const result = mapToExecuteOptions(opts);
132
- expect(result.maxTurns).toBe(20);
133
- });
134
-
135
- it("maxTurns 不传 → undefined(不限 turn,不挂 turns 估算 watchdog)", () => {
136
- const result = mapToExecuteOptions(baseOpts);
137
- expect(result.maxTurns).toBeUndefined();
138
- });
139
- });
140
-
141
- describe("mergeTimeoutSignal (D-A9)", () => {
142
- it("T3.6 timeoutMs===undefined → 原样返回 external signal", () => {
143
- const ctrl = new AbortController();
144
- const result = mergeTimeoutSignal(ctrl.signal, undefined);
145
- expect(result).toBe(ctrl.signal);
146
- });
147
-
148
- it("T3.6 timeoutMs<=0 → 原样返回 external signal", () => {
149
- const ctrl = new AbortController();
150
- const result = mergeTimeoutSignal(ctrl.signal, 0);
151
- expect(result).toBe(ctrl.signal);
152
- });
153
-
154
- it("T3.6 timeoutMs>0 → 返回新 signal(合并外部+超时两路)", () => {
155
- const ctrl = new AbortController();
156
- const result = mergeTimeoutSignal(ctrl.signal, 50);
157
- expect(result).not.toBe(ctrl.signal);
158
- expect(result.aborted).toBe(false);
159
- });
160
-
161
- it("T3.6 timeoutMs 到期 → merged signal abort", async () => {
162
- vi.useFakeTimers();
163
- const ctrl = new AbortController();
164
- const merged = mergeTimeoutSignal(ctrl.signal, 50);
165
-
166
- expect(merged.aborted).toBe(false);
167
- vi.advanceTimersByTime(51);
168
- expect(merged.aborted).toBe(true);
169
- vi.useRealTimers();
170
- });
171
-
172
- it("T3.6 外部 signal abort → merged signal abort", () => {
173
- const ctrl = new AbortController();
174
- const merged = mergeTimeoutSignal(ctrl.signal, 5000);
175
- ctrl.abort();
176
- expect(merged.aborted).toBe(true);
177
- });
178
-
179
- it("T3.6 外部 signal 已 abort → 返回已 abort 的 signal", () => {
180
- const ctrl = new AbortController();
181
- ctrl.abort();
182
- const merged = mergeTimeoutSignal(ctrl.signal, 5000);
183
- expect(merged.aborted).toBe(true);
184
- });
185
-
186
- it("T3.17 NFR: merged signal abort → timeout timer 清理", () => {
187
- vi.useFakeTimers();
188
- const ctrl = new AbortController();
189
- const merged = mergeTimeoutSignal(ctrl.signal, 50);
190
-
191
- ctrl.abort(); // 外部 abort → merged 也 abort
192
- expect(merged.aborted).toBe(true);
193
-
194
- // 推进时间,不应再有副作用
195
- vi.advanceTimersByTime(100);
196
- // timer 应被清理(通过 abort event listener)
197
- // 无异常 = timer 已正确清理
198
- vi.useRealTimers();
199
- });
200
- });
@@ -1,164 +0,0 @@
1
- // src/execution/engine/engines/pi/__tests__/task-spec-mapper.test.ts
2
- //
3
- // AgentTaskSpec ↔ ExecuteOptions 映射测试(P1 验收 3:往返保真)。
4
- // 覆盖:effort/thinkingLevel 双向映射、persona/skillPath 归并还原、
5
- // conversation/idleTimeoutMs 透传、schemaEnv 派生逐字节等值(D-A6 bridge)、
6
- // 运行期字段(signal/ctxModel/onComplete)不入任务声明。
7
-
8
- import { describe, expect, it } from "vitest";
9
-
10
- import type { ExecuteOptions } from "../../../../types.ts";
11
- import type { AgentTaskSpec } from "../../../types.ts";
12
- import { executeOptionsToTaskSpec, taskSpecToExecuteOptions } from "../task-spec-mapper.ts";
13
-
14
- describe("task-spec-mapper(ExecuteOptions ↔ AgentTaskSpec 往返保真)", () => {
15
- /** 全字段样例(含全部泛化点)。 */
16
- function makeFullOpts(): ExecuteOptions {
17
- return {
18
- task: "review the diff",
19
- slug: "review-diff",
20
- agent: "/agents/reviewer.md",
21
- model: "zai-coding-cn/glm-5.2",
22
- thinkingLevel: "high",
23
- skillPath: "/skills/code-review/SKILL.md",
24
- appendSystemPrompt: ["extra system prompt line"],
25
- schema: { type: "object", properties: { verdict: { type: "string" } }, required: ["verdict"] },
26
- maxTurns: 20,
27
- graceTurns: 3,
28
- fork: true,
29
- worktree: true,
30
- cwd: "/repo/worktree-x",
31
- conversation: true,
32
- idleTimeoutMs: 600_000,
33
- };
34
- }
35
-
36
- it("全字段往返恒等(P1 行为零变化的映射层证据)", () => {
37
- const opts = makeFullOpts();
38
- const round = taskSpecToExecuteOptions(executeOptionsToTaskSpec(opts));
39
- // schemaEnv 是派生字段(派生正确性单独断言),其余逐字段恒等
40
- const { schemaEnv, ...rest } = round;
41
- expect(rest).toEqual(opts);
42
- expect(schemaEnv).toBe(JSON.stringify(opts.schema));
43
- });
44
-
45
- it("effort ↔ thinkingLevel 双向映射(pi 恒等透传,含 7 档外的缺省)", () => {
46
- for (const level of ["off", "low", "medium", "high", "max", undefined]) {
47
- const opts: ExecuteOptions = { task: "t", slug: "s", thinkingLevel: level };
48
- const spec = executeOptionsToTaskSpec(opts);
49
- expect(spec.effort).toBe(level);
50
- expect(taskSpecToExecuteOptions(spec).thinkingLevel).toBe(level);
51
- }
52
- });
53
-
54
- it("persona 归并:skillPath + appendSystemPrompt 收拢进 persona", () => {
55
- const spec = executeOptionsToTaskSpec({
56
- task: "t",
57
- slug: "s",
58
- skillPath: "/skills/x/SKILL.md",
59
- appendSystemPrompt: ["line1", "line2"],
60
- });
61
- expect(spec.persona).toEqual({ skillPath: "/skills/x/SKILL.md", appendSystemPrompt: ["line1", "line2"] });
62
- // 还原
63
- const back = taskSpecToExecuteOptions(spec);
64
- expect(back.skillPath).toBe("/skills/x/SKILL.md");
65
- expect(back.appendSystemPrompt).toEqual(["line1", "line2"]);
66
- });
67
-
68
- it("persona 缺省:无 skillPath/appendSystemPrompt 时 persona 不存在(无空对象噪声)", () => {
69
- const spec = executeOptionsToTaskSpec({ task: "t", slug: "s" });
70
- expect(spec.persona).toBeUndefined();
71
- expect(taskSpecToExecuteOptions(spec).skillPath).toBeUndefined();
72
- expect(taskSpecToExecuteOptions(spec).appendSystemPrompt).toBeUndefined();
73
- });
74
-
75
- it("persona 单字段归并:仅 skillPath(appendSystemPrompt 保持 undefined)", () => {
76
- const spec = executeOptionsToTaskSpec({ task: "t", slug: "s", skillPath: "/s" });
77
- expect(spec.persona).toEqual({ skillPath: "/s" });
78
- const back = taskSpecToExecuteOptions(spec);
79
- expect(back.skillPath).toBe("/s");
80
- expect(back.appendSystemPrompt).toBeUndefined();
81
- });
82
-
83
- it("conversation / idleTimeoutMs 原名透传(interact 控制面的 task 标志)", () => {
84
- const opts: ExecuteOptions = { task: "t", slug: "s", conversation: true, idleTimeoutMs: 12345 };
85
- const spec = executeOptionsToTaskSpec(opts);
86
- expect(spec.conversation).toBe(true);
87
- expect(spec.idleTimeoutMs).toBe(12345);
88
- const back = taskSpecToExecuteOptions(spec);
89
- expect(back.conversation).toBe(true);
90
- expect(back.idleTimeoutMs).toBe(12345);
91
- });
92
-
93
- it("schemaEnv 派生:与 agent-opts-resolver 同函数(stringifySchemaCached compact),逐字节等值", () => {
94
- const schema = { type: "object", properties: { a: { type: "number" } } };
95
- const spec = executeOptionsToTaskSpec({ task: "t", slug: "s", schema });
96
- // 无 schema 时 schemaEnv 不设(BC-6:childEnv 不注入)
97
- expect(taskSpecToExecuteOptions({ task: "t", slug: "s" }).schemaEnv).toBeUndefined();
98
- // 有 schema 时派生 = JSON.stringify(schema)(resolver 的 compact 形态)
99
- expect(taskSpecToExecuteOptions(spec).schemaEnv).toBe(JSON.stringify(schema));
100
- // 原 schemaEnv(resolver 产物)经往返后逐字节保持
101
- const optsWithEnv: ExecuteOptions = {
102
- task: "t",
103
- slug: "s",
104
- schema,
105
- schemaEnv: JSON.stringify(schema),
106
- };
107
- const round = taskSpecToExecuteOptions(executeOptionsToTaskSpec(optsWithEnv));
108
- expect(round.schemaEnv).toBe(optsWithEnv.schemaEnv);
109
- });
110
-
111
- it("解耦形态(有 schemaEnv 无 schema,生产不可达):经 RunContext 兜底透传,派生优先", () => {
112
- const spec = executeOptionsToTaskSpec({ task: "t", slug: "s", schemaEnv: '{"type":"object"}' });
113
- // 声明侧无 schema(schemaEnv 不入任务声明,§3.3.5 删字段去向)
114
- expect(spec.schema).toBeUndefined();
115
- // 兜底通道(RunContext.schemaEnv → mapper schemaEnvFallback)
116
- const back = taskSpecToExecuteOptions(spec, { schemaEnvFallback: '{"type":"object"}' });
117
- expect(back.schemaEnv).toBe('{"type":"object"}');
118
- // 派生优先:schema 存在时 fallback 被忽略(派生值 = JSON.stringify(schema))
119
- const coupled = { ...spec, schema: { type: "object" } };
120
- expect(taskSpecToExecuteOptions(coupled, { schemaEnvFallback: "STALE" }).schemaEnv).toBe('{"type":"object"}');
121
- });
122
-
123
- it("运行期字段不入任务声明:signal/ctxModel/onComplete 从 ExecuteOptions 剥离(移入 RunContext)", () => {
124
- const ctxModel = { id: "m", name: "Test Model", provider: "p", reasoning: false };
125
- const opts: ExecuteOptions = {
126
- task: "t",
127
- slug: "s",
128
- ctxModel,
129
- onComplete: () => {},
130
- };
131
- const spec = executeOptionsToTaskSpec(opts);
132
- expect("ctxModel" in spec).toBe(false);
133
- expect("onComplete" in spec).toBe(false);
134
- expect("signal" in spec).toBe(false);
135
- // ctxModel 从 RunContext 回填(SAR 接线的 D-008 兼底链路)
136
- expect(taskSpecToExecuteOptions(spec, { ctxModel }).ctxModel).toBe(ctxModel);
137
- expect(taskSpecToExecuteOptions(spec).ctxModel).toBeUndefined();
138
- });
139
-
140
- it("中立新字段 denyTools/permissionMode:pi 侧映射回 ExecuteOptions 时忽略(无对应面)", () => {
141
- const spec: AgentTaskSpec = { task: "t", slug: "s", denyTools: ["bash"], permissionMode: "yolo" };
142
- const opts = taskSpecToExecuteOptions(spec);
143
- expect("denyTools" in opts).toBe(false);
144
- expect("permissionMode" in opts).toBe(false);
145
- // 声明侧字段保真(不因 pi 不支持而丢弃——P2 公共层消费)
146
- expect(spec.denyTools).toEqual(["bash"]);
147
- expect(spec.permissionMode).toBe("yolo");
148
- });
149
-
150
- it("归一化:appendSystemPrompt: [] 与 undefined 往返后等价(下游 spread 空数组为 no-op)", () => {
151
- const spec = executeOptionsToTaskSpec({ task: "t", slug: "s", appendSystemPrompt: [] });
152
- expect(spec.persona).toEqual({ appendSystemPrompt: [] });
153
- const back = taskSpecToExecuteOptions(spec);
154
- expect(back.appendSystemPrompt).toEqual([]);
155
- });
156
-
157
- it("worktree 三态(true/false/handle)往返保持", () => {
158
- const handle = { path: "/wt", branch: "b", baseCommit: "c", mainCwd: "/repo" };
159
- for (const wt of [true, false, handle] as const) {
160
- const opts: ExecuteOptions = { task: "t", slug: "s", worktree: wt };
161
- expect(taskSpecToExecuteOptions(executeOptionsToTaskSpec(opts)).worktree).toBe(wt);
162
- }
163
- });
164
- });
@@ -1,100 +0,0 @@
1
- // src/execution/engine/engines/pi/task-spec-mapper.ts
2
- //
3
- // AgentTaskSpec ↔ ExecuteOptions 映射(P1 回填)。pi 专有语义的隔离点(设计 §3.3.5
4
- // 删字段去向 + P1 行「ExecuteOptions→AgentTaskSpec 映射层」):
5
- // - effort ↔ thinkingLevel:pi 的 7 档枚举是引擎私有语义,中立层只透传字符串——
6
- // pi 侧恒等映射(不识别的档位与现状一致:交 resolveModel 层处理);
7
- // - persona ↔ skillPath + appendSystemPrompt:skillPath 并入 persona 语义(D2),
8
- // pi 侧原样还原(pi 的 persona 注入通道 = --skill/--append-system-prompt flag);
9
- // - schemaEnv 内化:中立层无此字段,PiEngine 从 task.schema 派生(stringifySchemaCached
10
- // compact——与 agent-opts-resolver 同一函数同一缓存,逐字节等值,D-A6 bridge 保真);
11
- // - conversation/idleTimeoutMs:interact 控制面的 task 标志,原名透传。
12
- //
13
- // 往返保真(验收 A1 的映射层证据):executeOptionsToTaskSpec ∘ taskSpecToExecuteOptions
14
- // 对全部 ExecuteOptions 字段恒等(schemaEnv 由 schema 派生后逐字节等于原值——resolver
15
- // 与本 mapper 共用 WeakMap 缓存的同一 compact 串)。唯一归一化:appendSystemPrompt: []
16
- // 归一为 persona 缺省(下游 spread 空数组与 undefined 均为 no-op,行为等价)。
17
-
18
- import type { ModelInfo } from "../../../model-resolver.ts";
19
- import type { ExecuteOptions } from "../../../types.ts";
20
- import { stringifySchemaCached } from "../../../../shared/schema-jsonify.ts";
21
- import type { AgentTaskSpec, PersonaSpec } from "../../types.ts";
22
-
23
- /**
24
- * ExecuteOptions → AgentTaskSpec(宿主侧声明 → 引擎中立声明)。
25
- * 纯函数、无副作用——同一 opts 可重复转换(幂等)。
26
- */
27
- export function executeOptionsToTaskSpec(opts: ExecuteOptions): AgentTaskSpec {
28
- // persona 归并:skillPath / appendSystemPrompt 有其一即建 persona,避免空对象噪声。
29
- const persona: PersonaSpec | undefined =
30
- opts.skillPath !== undefined || opts.appendSystemPrompt !== undefined
31
- ? {
32
- ...(opts.skillPath !== undefined ? { skillPath: opts.skillPath } : {}),
33
- ...(opts.appendSystemPrompt !== undefined ? { appendSystemPrompt: opts.appendSystemPrompt } : {}),
34
- }
35
- : undefined;
36
- return {
37
- task: opts.task,
38
- slug: opts.slug,
39
- agent: opts.agent,
40
- model: opts.model,
41
- // pi 7 档枚举 → 引擎无关 effort(恒等:档位集合是 pi 私有语义,中立层透传)
42
- effort: opts.thinkingLevel,
43
- ...(persona !== undefined ? { persona } : {}),
44
- schema: opts.schema,
45
- maxTurns: opts.maxTurns,
46
- graceTurns: opts.graceTurns,
47
- fork: opts.fork,
48
- worktree: opts.worktree,
49
- cwd: opts.cwd,
50
- conversation: opts.conversation,
51
- idleTimeoutMs: opts.idleTimeoutMs,
52
- // ExecuteOptions 不携带的运行期字段(signal/ctxModel/onComplete)归 RunContext;
53
- // schemaEnv 由 taskSpecToExecuteOptions 从 schema 派生。
54
- };
55
- }
56
-
57
- /**
58
- * AgentTaskSpec → ExecuteOptions(pi 引擎侧还原)。
59
- *
60
- * @param spec 中立任务声明
61
- * @param runCtx 运行期上下文:ctxModel 是 ExecuteOptions 的运行期字段(从 RunContext
62
- * 回填);schemaEnvFallback 是解耦形态(有 schemaEnv 无 schema,生产
63
- * 不可达)的兜底透传——schema 可派生时派生优先(逐字节等值)
64
- */
65
- export function taskSpecToExecuteOptions(
66
- spec: AgentTaskSpec,
67
- runCtx?: { ctxModel?: ModelInfo; schemaEnvFallback?: string },
68
- ): ExecuteOptions {
69
- return {
70
- task: spec.task,
71
- slug: spec.slug,
72
- // 身份解析键:spec.agent 优先;persona.agentRef 是 persona 注入通道的定位符,
73
- // 仅在 spec.agent 缺失时兜底(flag/file 通道引擎的主路径;pi 恒走 spec.agent)
74
- agent: spec.agent ?? spec.persona?.agentRef,
75
- model: spec.model,
76
- // effort → pi thinkingLevel(恒等映射)
77
- thinkingLevel: spec.effort,
78
- // persona 还原:pi 的注入通道是 --skill / --append-system-prompt flag
79
- skillPath: spec.persona?.skillPath,
80
- appendSystemPrompt: spec.persona?.appendSystemPrompt,
81
- schema: spec.schema,
82
- // schemaEnv 内化派生(D-A6 bridge):与 agent-opts-resolver 共用 stringifySchemaCached
83
- // compact 缓存,输出逐字节等值。schema 缺失(无法派生)且调用方持有预编码值时兜底
84
- // 透传(解耦形态,生产不可达);无 schema 亦无兜底时不设(BC-6:childEnv 不注入)。
85
- schemaEnv: spec.schema !== undefined
86
- ? stringifySchemaCached(spec.schema, "compact")
87
- : runCtx?.schemaEnvFallback,
88
- maxTurns: spec.maxTurns,
89
- graceTurns: spec.graceTurns,
90
- ctxModel: runCtx?.ctxModel,
91
- fork: spec.fork,
92
- worktree: spec.worktree,
93
- cwd: spec.cwd,
94
- conversation: spec.conversation,
95
- idleTimeoutMs: spec.idleTimeoutMs,
96
- // signal 不入 opts(PiEngine 直接传给 executeAndAwait 第 2 参,与 SAR 现行为一致);
97
- // onComplete 不经引擎(workflow 路径从不设置;background 完成通知走 service 内部 notifier)。
98
- // denyTools/permissionMode:中立新字段,pi 链路暂无对应面(P2 公共层接 denylist 映射)。
99
- };
100
- }
@@ -1,39 +0,0 @@
1
- {
2
- "_meta": {
3
- "description": "zcode CLI spawn 单轮模式 golden 实录(2026-08-25 验收前置门)",
4
- "engineVersion": "0.16.5",
5
- "recordedAt": "2026-08-25T01:41:43Z",
6
- "recordedOn": "macOS arm64, node v24.11.1",
7
- "argv": [
8
- "node",
9
- "/Applications/ZCode.app/Contents/Resources/glm/zcode.cjs",
10
- "--json",
11
- "--cwd",
12
- "<临时目录>",
13
- "--mode",
14
- "yolo",
15
- "--prompt",
16
- "Reply with the single word: ok"
17
- ],
18
- "envSummary": {
19
- "HOME": "<隔离池目录>(config.json = model.main + 目标 provider 条目,无 plugins 块)",
20
- "stdin": "/dev/null(stdio ignore——CLI 不读 stdin,否则挂起)",
21
- "XYZ_AGENT_SUBAGENT": "实录未注入;引擎实现注入 =1"
22
- },
23
- "exitCode": 0,
24
- "durationMs": 4914,
25
- "fieldStructure": {
26
- "sessionId": "string,sess_<uuid>",
27
- "traceId": "string(诊断用)",
28
- "turnId": "string,turn_<uuid>",
29
- "response": "string——assistant 全文",
30
- "usage": "object:source/modelRequestCount/inputTokens/outputTokens/totalTokens/cacheReadTokens/cacheWriteTokens/reasoningTokens/webFetchRequests/webSearchRequests",
31
- "eventCount": "number",
32
- "projection": "object:status/turnCount/totalTokenCount/contextUsed/contextWindow"
33
- },
34
- "usageMapping": "inputTokens→input、outputTokens→output、cacheReadTokens→cacheRead、cacheWriteTokens→cacheWrite;cost 无来源(cost 回传 ❌ 与调研一致)",
35
- "credentialNote": "stdout 不含凭据;凭据只存在于池内 config.json(此处不收录)。隔离 HOME 的凭据源用 ~/.zcode/v2/config.json(桌面登录态)——本机 ~/.zcode/cli/config.json 的 router provider 指向局域网网关 192.168.1.202:9981,实录时不可达",
36
- "sigtermTiming": "SIGTERM → exit 实测 103ms(exit code 143,stderr \"Turn was cancelled\");引擎杀链 grace 取 5000ms(zsub 同构,保守)"
37
- },
38
- "stdoutRaw": "{\n \"sessionId\": \"sess_35852a0f-1302-4e20-9e48-87f47527abe3\",\n \"traceId\": \"9fffaebd-749e-468b-af3f-2a89e3347785\",\n \"turnId\": \"turn_99879260-1c9b-4e97-afe1-c2e7abeaf5b9\",\n \"response\": \"ok\",\n \"usage\": {\n \"source\": \"provider\",\n \"modelRequestCount\": 1,\n \"inputTokens\": 12599,\n \"outputTokens\": 17,\n \"totalTokens\": 12616,\n \"cacheReadTokens\": 512,\n \"cacheWriteTokens\": 0,\n \"reasoningTokens\": 0,\n \"webFetchRequests\": 0,\n \"webSearchRequests\": 0\n },\n \"eventCount\": 17,\n \"projection\": {\n \"status\": \"idle\",\n \"turnCount\": 1,\n \"totalTokenCount\": 12616,\n \"contextUsed\": 12616,\n \"contextWindow\": 1000000\n }\n}\n"
39
- }