@zhushanwen/pi-subagent-workflow 8.6.0 → 8.8.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 (364) hide show
  1. package/README.md +5 -11
  2. package/package.json +13 -20
  3. package/relay/relay.mjs +1 -1
  4. package/skills/workflow-script-format/SKILL.md +32 -13
  5. package/src/host/__tests__/pi-host.test.ts +235 -0
  6. package/src/host/pi-host.ts +163 -0
  7. package/src/index.ts +141 -138
  8. package/src/injectors/__tests__/engine-awareness.test.ts +292 -0
  9. package/src/injectors/__tests__/engine-section-stability.test.ts +343 -0
  10. package/src/injectors/__tests__/model-list-injector.test.ts +18 -21
  11. package/src/injectors/__tests__/subagent-list-injector.test.ts +59 -19
  12. package/src/injectors/__tests__/workflow-list-injector.test.ts +31 -17
  13. package/src/injectors/engine-awareness.ts +119 -0
  14. package/src/injectors/model-list-injector.ts +15 -58
  15. package/src/injectors/subagent-list-injector.ts +56 -114
  16. package/src/injectors/workflow-list-injector.ts +37 -70
  17. package/src/interface/__tests__/detectors.test.ts +48 -37
  18. package/src/interface/__tests__/subagent-tool-path-guard.test.ts +2 -2
  19. package/src/interface/__tests__/subagent-tool-prompt.test.ts +6 -3
  20. package/src/interface/__tests__/tool-workflow-run-builtin-name.test.ts +216 -0
  21. package/src/interface/__tests__/tool-workflow-script-generate.test.ts +17 -6
  22. package/src/interface/__tests__/tool-workflow-throw-paths.test.ts +38 -2
  23. package/src/interface/bg-notify-render.ts +7 -17
  24. package/src/interface/command-actions.ts +5 -15
  25. package/src/interface/commands.ts +4 -4
  26. package/src/interface/format.ts +17 -6
  27. package/src/interface/gui-mappers.ts +18 -22
  28. package/src/interface/helpers.ts +9 -130
  29. package/src/interface/list-component.ts +5 -5
  30. package/src/interface/list-shared.ts +3 -3
  31. package/src/interface/list-view.ts +3 -3
  32. package/src/interface/subagent-actions.ts +66 -439
  33. package/src/interface/subagent-tool-schema.ts +21 -17
  34. package/src/interface/subagent-tool.ts +12 -7
  35. package/src/interface/subagents.ts +4 -4
  36. package/src/interface/tool-render.ts +37 -15
  37. package/src/interface/tool-workflow-script.ts +34 -76
  38. package/src/interface/tool-workflow.ts +57 -94
  39. package/src/interface/views/WorkflowsView.ts +8 -16
  40. package/src/interface/views/__tests__/WorkflowsView-signature.test.ts +3 -3
  41. package/src/interface/views/__tests__/detail-content-session-file.test.ts +2 -2
  42. package/src/interface/views/detail-content.ts +4 -4
  43. package/src/interface/views/format.ts +23 -62
  44. package/src/{orchestration/jsonl-run-store.ts → jsonl-run-store.ts} +137 -225
  45. package/agents/analyst.md +0 -61
  46. package/agents/coder.md +0 -70
  47. package/agents/debugger.md +0 -67
  48. package/agents/doc-reviewer.md +0 -50
  49. package/agents/explorer.md +0 -64
  50. package/agents/general-purpose.md +0 -32
  51. package/agents/orchestrator.md +0 -63
  52. package/agents/planner.md +0 -54
  53. package/agents/researcher.md +0 -65
  54. package/agents/reviewer.md +0 -74
  55. package/src/execution/__tests__/__fixtures__/notifier-golden-snapshots.json +0 -53
  56. package/src/execution/__tests__/__fixtures__/truncline.snapshot.json +0 -1
  57. package/src/execution/__tests__/agent-registry.test.ts +0 -363
  58. package/src/execution/__tests__/agent-result-mapper.test.ts +0 -150
  59. package/src/execution/__tests__/alive-store.test.ts +0 -147
  60. package/src/execution/__tests__/ask-user-transit-e2e.test.ts +0 -490
  61. package/src/execution/__tests__/before-agent-start-injection.test.ts +0 -132
  62. package/src/execution/__tests__/bg-notify-render.test.ts +0 -329
  63. package/src/execution/__tests__/channel-registry-handshake.test.ts +0 -243
  64. package/src/execution/__tests__/chat-engine-routing.test.ts +0 -601
  65. package/src/execution/__tests__/chatmode-first-round-closure-service.test.ts +0 -365
  66. package/src/execution/__tests__/chatmode-first-round-closure-spawn.test.ts +0 -190
  67. package/src/execution/__tests__/chatmode-round-notify-real-chain.test.ts +0 -215
  68. package/src/execution/__tests__/concurrency-pool.test.ts +0 -250
  69. package/src/execution/__tests__/config.test.ts +0 -110
  70. package/src/execution/__tests__/conversation-wiring.test.ts +0 -198
  71. package/src/execution/__tests__/crash-recovery.test.ts +0 -320
  72. package/src/execution/__tests__/delivery-methods.test.ts +0 -422
  73. package/src/execution/__tests__/dialog-queue.test.ts +0 -299
  74. package/src/execution/__tests__/epipe-fallback.test.ts +0 -241
  75. package/src/execution/__tests__/execute-and-await-worktree.test.ts +0 -243
  76. package/src/execution/__tests__/execute-nesting.test.ts +0 -323
  77. package/src/execution/__tests__/execute-options-mapper.test.ts +0 -200
  78. package/src/execution/__tests__/execution-record.test.ts +0 -1394
  79. package/src/execution/__tests__/explicit-agent-ref-guard.test.ts +0 -171
  80. package/src/execution/__tests__/finalize-record.test.ts +0 -368
  81. package/src/execution/__tests__/finalized-marker.test.ts +0 -82
  82. package/src/execution/__tests__/format-schema-instruction.test.ts +0 -169
  83. package/src/execution/__tests__/format.test.ts +0 -458
  84. package/src/execution/__tests__/gc-timer.test.ts +0 -184
  85. package/src/execution/__tests__/get-record-for-action-restart.test.ts +0 -254
  86. package/src/execution/__tests__/gui-mode-dispatch.test.ts +0 -59
  87. package/src/execution/__tests__/helpers/mock-extension-api.ts +0 -30
  88. package/src/execution/__tests__/helpers/spawn-mock.ts +0 -242
  89. package/src/execution/__tests__/host-mode.test.ts +0 -87
  90. package/src/execution/__tests__/index-session-start-identity.test.ts +0 -371
  91. package/src/execution/__tests__/index-session-start.test.ts +0 -672
  92. package/src/execution/__tests__/lifecycle-manager-lock.test.ts +0 -211
  93. package/src/execution/__tests__/lifecycle-manager.test.ts +0 -383
  94. package/src/execution/__tests__/lifecycle-predicates.test.ts +0 -116
  95. package/src/execution/__tests__/list-component.test.ts +0 -401
  96. package/src/execution/__tests__/list-fields.test.ts +0 -140
  97. package/src/execution/__tests__/manifest-parentid.test.ts +0 -117
  98. package/src/execution/__tests__/model-resolver.test.ts +0 -465
  99. package/src/execution/__tests__/nested-visibility-env-propagation.test.ts +0 -287
  100. package/src/execution/__tests__/nested-visibility.test.ts +0 -325
  101. package/src/execution/__tests__/notifier-flush.test.ts +0 -612
  102. package/src/execution/__tests__/notifier-golden-snapshot.test.ts +0 -261
  103. package/src/execution/__tests__/notify-ledger.test.ts +0 -826
  104. package/src/execution/__tests__/one-shot-upgrade.test.ts +0 -205
  105. package/src/execution/__tests__/output-collector.test.ts +0 -358
  106. package/src/execution/__tests__/parent-child-matrix.test.ts +0 -336
  107. package/src/execution/__tests__/path-encoding.test.ts +0 -104
  108. package/src/execution/__tests__/pi-invocation.test.ts +0 -134
  109. package/src/execution/__tests__/record-store.test.ts +0 -1057
  110. package/src/execution/__tests__/records-cwd-isolation.test.ts +0 -91
  111. package/src/execution/__tests__/recursive-visibility-baseline.test.ts +0 -339
  112. package/src/execution/__tests__/recursive-visibility-env.test.ts +0 -273
  113. package/src/execution/__tests__/relay-agent.test.ts +0 -448
  114. package/src/execution/__tests__/relay-env.test.ts +0 -42
  115. package/src/execution/__tests__/resource-policy.test.ts +0 -109
  116. package/src/execution/__tests__/rpc-mode.test.ts +0 -89
  117. package/src/execution/__tests__/run-and-finalize-chatmode.test.ts +0 -267
  118. package/src/execution/__tests__/run-spawn-chatmode-settled.test.ts +0 -253
  119. package/src/execution/__tests__/run-spawn-edges.test.ts +0 -687
  120. package/src/execution/__tests__/run-spawn-integration.test.ts +0 -933
  121. package/src/execution/__tests__/run-spawn-resume.test.ts +0 -322
  122. package/src/execution/__tests__/run-spawn-rpc-mode.test.ts +0 -196
  123. package/src/execution/__tests__/run-spawn-stdout-callback-throw.test.ts +0 -199
  124. package/src/execution/__tests__/sdk-contract.test.ts +0 -273
  125. package/src/execution/__tests__/session-context-resolver.test.ts +0 -167
  126. package/src/execution/__tests__/session-file-gc.test.ts +0 -293
  127. package/src/execution/__tests__/session-pending.test.ts +0 -197
  128. package/src/execution/__tests__/session-reconstructor.test.ts +0 -379
  129. package/src/execution/__tests__/session-runner-epipe.test.ts +0 -178
  130. package/src/execution/__tests__/session-runner-schema-env.test.ts +0 -350
  131. package/src/execution/__tests__/session-start-reaper.test.ts +0 -233
  132. package/src/execution/__tests__/spawn-args.test.ts +0 -445
  133. package/src/execution/__tests__/spawn-event-adapter-rpc.test.ts +0 -189
  134. package/src/execution/__tests__/spawn-event-adapter.test.ts +0 -167
  135. package/src/execution/__tests__/spawn-worktree-guidance.test.ts +0 -207
  136. package/src/execution/__tests__/spawned-children.test.ts +0 -92
  137. package/src/execution/__tests__/start-sync-model-guard.test.ts +0 -150
  138. package/src/execution/__tests__/startup-config-declaration.test.ts +0 -35
  139. package/src/execution/__tests__/status-refactor.test.ts +0 -345
  140. package/src/execution/__tests__/stdin-writer.test.ts +0 -463
  141. package/src/execution/__tests__/stream-sink-retirement.test.ts +0 -261
  142. package/src/execution/__tests__/subagent-service-abort.test.ts +0 -60
  143. package/src/execution/__tests__/subagent-service-message-close.test.ts +0 -629
  144. package/src/execution/__tests__/subagent-service-parent-guard.test.ts +0 -180
  145. package/src/execution/__tests__/subagent-service.test.ts +0 -788
  146. package/src/execution/__tests__/subprocess-agent-runner-routing.test.ts +0 -310
  147. package/src/execution/__tests__/subprocess-agent-runner.test.ts +0 -599
  148. package/src/execution/__tests__/temp-prompt.test.ts +0 -53
  149. package/src/execution/__tests__/timeout-integration.test.ts +0 -615
  150. package/src/execution/__tests__/tombstone-store.test.ts +0 -73
  151. package/src/execution/__tests__/tool-action.test.ts +0 -476
  152. package/src/execution/__tests__/truncline-snapshot.test.ts +0 -81
  153. package/src/execution/__tests__/turn-limiter-semantics.test.ts +0 -194
  154. package/src/execution/__tests__/turn-limiter.test.ts +0 -65
  155. package/src/execution/__tests__/ui-channels.test.ts +0 -187
  156. package/src/execution/__tests__/ui-interaction-model.test.ts +0 -67
  157. package/src/execution/__tests__/ui-request-handler-factory.test.ts +0 -370
  158. package/src/execution/__tests__/ui-request-handler.test.ts +0 -204
  159. package/src/execution/__tests__/ui-request-observability.test.ts +0 -114
  160. package/src/execution/__tests__/ui-request-queue.test.ts +0 -133
  161. package/src/execution/__tests__/worktree-manager.test.ts +0 -633
  162. package/src/execution/__tests__/worktree-pid-registration.integration.test.ts +0 -229
  163. package/src/execution/__tests__/worktree-reconcile.integration.test.ts +0 -181
  164. package/src/execution/__tests__/worktree-registry.test.ts +0 -199
  165. package/src/execution/agent-registry.ts +0 -199
  166. package/src/execution/agent-result-mapper.ts +0 -90
  167. package/src/execution/alive-store.ts +0 -92
  168. package/src/execution/argv-mirror.ts +0 -113
  169. package/src/execution/best-effort.ts +0 -38
  170. package/src/execution/channel-registry-access.ts +0 -144
  171. package/src/execution/concurrency-pool.ts +0 -116
  172. package/src/execution/config.ts +0 -96
  173. package/src/execution/dialog-queue.ts +0 -330
  174. package/src/execution/engine/__tests__/common/data-dir.test.ts +0 -53
  175. package/src/execution/engine/__tests__/common/errors.test.ts +0 -132
  176. package/src/execution/engine/__tests__/common/event-journal.test.ts +0 -177
  177. package/src/execution/engine/__tests__/common/kill-chain.test.ts +0 -192
  178. package/src/execution/engine/__tests__/common/nesting-guard.test.ts +0 -81
  179. package/src/execution/engine/__tests__/common/persona-router.test.ts +0 -123
  180. package/src/execution/engine/__tests__/common/pool-manager.test.ts +0 -154
  181. package/src/execution/engine/__tests__/common/schema-emulation.test.ts +0 -128
  182. package/src/execution/engine/__tests__/conformance/__fixtures__/pi-golden-events.json +0 -28
  183. package/src/execution/engine/__tests__/conformance/agent-event-invariants.ts +0 -141
  184. package/src/execution/engine/__tests__/conformance/contract.abort.test.ts +0 -109
  185. package/src/execution/engine/__tests__/conformance/contract.agent-events.test.ts +0 -101
  186. package/src/execution/engine/__tests__/conformance/contract.probe.test.ts +0 -77
  187. package/src/execution/engine/__tests__/conformance/contract.read-degradation.test.ts +0 -104
  188. package/src/execution/engine/__tests__/conformance/contract.relay.test.ts +0 -342
  189. package/src/execution/engine/__tests__/conformance/engine-conformance.live.test.ts +0 -201
  190. package/src/execution/engine/__tests__/conformance/golden-replay.pi.test.ts +0 -76
  191. package/src/execution/engine/__tests__/conformance/golden-replay.zcode.test.ts +0 -79
  192. package/src/execution/engine/__tests__/engine-discovery.test.ts +0 -87
  193. package/src/execution/engine/__tests__/engines-declaration.test.ts +0 -36
  194. package/src/execution/engine/__tests__/model-prompt.test.ts +0 -85
  195. package/src/execution/engine/__tests__/paths.test.ts +0 -39
  196. package/src/execution/engine/__tests__/registry.test.ts +0 -120
  197. package/src/execution/engine/__tests__/routing.test.ts +0 -231
  198. package/src/execution/engine/common/data-dir.ts +0 -62
  199. package/src/execution/engine/common/errors.ts +0 -183
  200. package/src/execution/engine/common/event-journal.ts +0 -254
  201. package/src/execution/engine/common/journal-replay.ts +0 -62
  202. package/src/execution/engine/common/kill-chain.ts +0 -221
  203. package/src/execution/engine/common/nesting-guard.ts +0 -50
  204. package/src/execution/engine/common/persona-router.ts +0 -108
  205. package/src/execution/engine/common/pool-manager.ts +0 -226
  206. package/src/execution/engine/common/schema-emulation.ts +0 -189
  207. package/src/execution/engine/common/session-view-projection.ts +0 -51
  208. package/src/execution/engine/engine-discovery.ts +0 -65
  209. package/src/execution/engine/engines/pi/__tests__/pi-engine.test.ts +0 -469
  210. package/src/execution/engine/engines/pi/__tests__/reader.test.ts +0 -155
  211. package/src/execution/engine/engines/pi/__tests__/task-spec-mapper.test.ts +0 -164
  212. package/src/execution/engine/engines/pi/pi-engine.ts +0 -415
  213. package/src/execution/engine/engines/pi/reader.ts +0 -48
  214. package/src/execution/engine/engines/pi/registration.ts +0 -35
  215. package/src/execution/engine/engines/pi/task-spec-mapper.ts +0 -100
  216. package/src/execution/engine/engines/zcode/__tests__/__fixtures__/zcode-golden-spawn.json +0 -39
  217. package/src/execution/engine/engines/zcode/__tests__/launcher.test.ts +0 -150
  218. package/src/execution/engine/engines/zcode/__tests__/parser.test.ts +0 -246
  219. package/src/execution/engine/engines/zcode/__tests__/preparer.test.ts +0 -228
  220. package/src/execution/engine/engines/zcode/__tests__/reader.test.ts +0 -210
  221. package/src/execution/engine/engines/zcode/__tests__/registration.test.ts +0 -64
  222. package/src/execution/engine/engines/zcode/__tests__/zcode-engine.live.test.ts +0 -127
  223. package/src/execution/engine/engines/zcode/__tests__/zcode-engine.test.ts +0 -580
  224. package/src/execution/engine/engines/zcode/constants.ts +0 -43
  225. package/src/execution/engine/engines/zcode/golden-sample.ts +0 -39
  226. package/src/execution/engine/engines/zcode/launcher.ts +0 -161
  227. package/src/execution/engine/engines/zcode/parser.ts +0 -436
  228. package/src/execution/engine/engines/zcode/preparer.ts +0 -363
  229. package/src/execution/engine/engines/zcode/reader.ts +0 -381
  230. package/src/execution/engine/engines/zcode/registration.ts +0 -37
  231. package/src/execution/engine/engines/zcode/zcode-engine.ts +0 -658
  232. package/src/execution/engine/host-task-spec.ts +0 -47
  233. package/src/execution/engine/model-prompt.ts +0 -59
  234. package/src/execution/engine/paths.ts +0 -42
  235. package/src/execution/engine/port.ts +0 -153
  236. package/src/execution/engine/registry.ts +0 -123
  237. package/src/execution/engine/routing.ts +0 -218
  238. package/src/execution/engine/types.ts +0 -309
  239. package/src/execution/execute-options-mapper.ts +0 -112
  240. package/src/execution/execution-record.ts +0 -965
  241. package/src/execution/finalize-record.ts +0 -251
  242. package/src/execution/finalized-marker.ts +0 -51
  243. package/src/execution/get-state-handshake.ts +0 -104
  244. package/src/execution/host-mode.ts +0 -56
  245. package/src/execution/idle-gc.ts +0 -47
  246. package/src/execution/lifecycle-manager.ts +0 -513
  247. package/src/execution/lifecycle-predicates.ts +0 -65
  248. package/src/execution/manifest-store.ts +0 -256
  249. package/src/execution/model-config-service.ts +0 -219
  250. package/src/execution/model-resolver.ts +0 -248
  251. package/src/execution/notifier.ts +0 -330
  252. package/src/execution/notify-ledger.ts +0 -580
  253. package/src/execution/output-collector.ts +0 -228
  254. package/src/execution/path-encoding.ts +0 -60
  255. package/src/execution/pi-invocation.ts +0 -120
  256. package/src/execution/record-entry.ts +0 -132
  257. package/src/execution/record-store.ts +0 -1234
  258. package/src/execution/relay-env.ts +0 -37
  259. package/src/execution/session-context-resolver.ts +0 -64
  260. package/src/execution/session-file-gc.ts +0 -120
  261. package/src/execution/session-pending.ts +0 -164
  262. package/src/execution/session-reconstructor.ts +0 -678
  263. package/src/execution/session-runner.ts +0 -1781
  264. package/src/execution/sessions-index.ts +0 -304
  265. package/src/execution/spawn-event-adapter.ts +0 -363
  266. package/src/execution/stdin-writer.ts +0 -198
  267. package/src/execution/stream-sink.ts +0 -126
  268. package/src/execution/subagent-service.ts +0 -2141
  269. package/src/execution/subprocess-agent-runner.ts +0 -317
  270. package/src/execution/temp-prompt.ts +0 -62
  271. package/src/execution/tombstone-store.ts +0 -72
  272. package/src/execution/turn-limiter.ts +0 -102
  273. package/src/execution/types.ts +0 -973
  274. package/src/execution/ui-channels.ts +0 -216
  275. package/src/execution/ui-interaction-model.ts +0 -48
  276. package/src/execution/ui-request-handler-factory.ts +0 -212
  277. package/src/execution/ui-request-observability.ts +0 -81
  278. package/src/execution/ui-request-queue.ts +0 -184
  279. package/src/execution/worktree-manager.ts +0 -688
  280. package/src/execution/worktree-registry.ts +0 -222
  281. package/src/orchestration/__tests__/__fixtures__/worker-template.snapshot.txt +0 -349
  282. package/src/orchestration/__tests__/agent-call-catch-fallback.test.ts +0 -202
  283. package/src/orchestration/__tests__/agent-call-stream.test.ts +0 -152
  284. package/src/orchestration/__tests__/args-validator.test.ts +0 -143
  285. package/src/orchestration/__tests__/config-loader.test.ts +0 -503
  286. package/src/orchestration/__tests__/error-recovery-handlers.test.ts +0 -809
  287. package/src/orchestration/__tests__/error-recovery-postmessage-defense.test.ts +0 -405
  288. package/src/orchestration/__tests__/error-recovery-serialize-failed-result.test.ts +0 -56
  289. package/src/orchestration/__tests__/error-recovery-workflow-call.test.ts +0 -166
  290. package/src/orchestration/__tests__/execute-agent-call.test.ts +0 -451
  291. package/src/orchestration/__tests__/jsonl-run-store-corrupt-entry.test.ts +0 -150
  292. package/src/orchestration/__tests__/jsonl-run-store-loadall-sources.test.ts +0 -171
  293. package/src/orchestration/__tests__/jsonl-run-store-retention.test.ts +0 -202
  294. package/src/orchestration/__tests__/jsonl-run-store-session-file.test.ts +0 -1030
  295. package/src/orchestration/__tests__/launcher-nested-workflow.test.ts +0 -600
  296. package/src/orchestration/__tests__/lifecycle-runid-injection.test.ts +0 -96
  297. package/src/orchestration/__tests__/lifecycle.test.ts +0 -659
  298. package/src/orchestration/__tests__/non-cloneable-return-e2e.test.ts +0 -95
  299. package/src/orchestration/__tests__/review-fix-loop-e2e.test.ts +0 -2025
  300. package/src/orchestration/__tests__/script-lint.test.ts +0 -831
  301. package/src/orchestration/__tests__/skill-discovery.test.ts +0 -201
  302. package/src/orchestration/__tests__/test-mocks.ts +0 -197
  303. package/src/orchestration/__tests__/worker-exit-without-result.test.ts +0 -368
  304. package/src/orchestration/__tests__/worker-host.test.ts +0 -120
  305. package/src/orchestration/__tests__/worker-returnmeta-passthrough.test.ts +0 -164
  306. package/src/orchestration/__tests__/worker-script-builder-runtime.test.ts +0 -563
  307. package/src/orchestration/__tests__/worker-script-builder.test.ts +0 -309
  308. package/src/orchestration/__tests__/worker-script-template-snapshot.test.ts +0 -129
  309. package/src/orchestration/__tests__/workflow-nesting-e2e.test.ts +0 -317
  310. package/src/orchestration/__tests__/workflow-script-lint-memo.test.ts +0 -110
  311. package/src/orchestration/__tests__/workflows-e2e.test.ts +0 -537
  312. package/src/orchestration/agent-opts-resolver.ts +0 -174
  313. package/src/orchestration/args-validator.ts +0 -127
  314. package/src/orchestration/config-loader.ts +0 -315
  315. package/src/orchestration/error-recovery.ts +0 -1018
  316. package/src/orchestration/execute-agent-call.ts +0 -256
  317. package/src/orchestration/launcher.ts +0 -455
  318. package/src/orchestration/lifecycle.ts +0 -399
  319. package/src/orchestration/models/__tests__/budget.test.ts +0 -307
  320. package/src/orchestration/models/__tests__/trace.test.ts +0 -408
  321. package/src/orchestration/models/agent-call.ts +0 -83
  322. package/src/orchestration/models/budget.ts +0 -118
  323. package/src/orchestration/models/ports.ts +0 -164
  324. package/src/orchestration/models/run-runtime.ts +0 -104
  325. package/src/orchestration/models/run-spec.ts +0 -83
  326. package/src/orchestration/models/run-state.ts +0 -44
  327. package/src/orchestration/models/trace.ts +0 -183
  328. package/src/orchestration/models/types.ts +0 -301
  329. package/src/orchestration/models/workflow-run.ts +0 -254
  330. package/src/orchestration/models/workflow-script-registry.ts +0 -35
  331. package/src/orchestration/models/workflow-script.ts +0 -117
  332. package/src/orchestration/script-lint.ts +0 -766
  333. package/src/orchestration/skill-discovery.ts +0 -115
  334. package/src/orchestration/worker-handle.ts +0 -115
  335. package/src/orchestration/worker-host.ts +0 -98
  336. package/src/orchestration/worker-script-builder.ts +0 -421
  337. package/src/orchestration/workflow-files.ts +0 -85
  338. package/src/orchestration/workflow-script-registry-impl.ts +0 -133
  339. package/src/shared/__tests__/agent-ref.test.ts +0 -34
  340. package/src/shared/__tests__/meta-parser.test.ts +0 -304
  341. package/src/shared/__tests__/model-ref.test.ts +0 -306
  342. package/src/shared/__tests__/resource-discovery-manifest-cache.test.ts +0 -280
  343. package/src/shared/__tests__/resource-discovery.test.ts +0 -736
  344. package/src/shared/__tests__/resource-meta.test.ts +0 -51
  345. package/src/shared/__tests__/schema-jsonify.test.ts +0 -81
  346. package/src/shared/__tests__/timer-delay.test.ts +0 -61
  347. package/src/shared/agent-event.ts +0 -13
  348. package/src/shared/agent-ref.ts +0 -57
  349. package/src/shared/meta-parser.ts +0 -261
  350. package/src/shared/model-ref.ts +0 -286
  351. package/src/shared/resource-discovery.ts +0 -811
  352. package/src/shared/resource-meta.ts +0 -65
  353. package/src/shared/schema-env.ts +0 -44
  354. package/src/shared/schema-jsonify.ts +0 -58
  355. package/src/shared/timer-delay.ts +0 -54
  356. package/src/shared/xml-injection.ts +0 -35
  357. package/workflows/README.md +0 -81
  358. package/workflows/_shared/agent-refs.cjs +0 -40
  359. package/workflows/chain.js +0 -131
  360. package/workflows/map-reduce.js +0 -174
  361. package/workflows/parallel.js +0 -148
  362. package/workflows/review-fix-loop-utils.cjs +0 -1309
  363. package/workflows/review-fix-loop.js +0 -1404
  364. package/workflows/scatter-gather.js +0 -178
@@ -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
- }
@@ -1,150 +0,0 @@
1
- // launcher.test.ts —— argv 组装 / 字节估算超限 / env 构造 / 真实子进程杀链(用 node -e
2
- // 代替 zcode CLI,验证 SIGTERM→grace→SIGKILL 与 exited 标志机制本身)。
3
-
4
- import { execFileSync } from "node:child_process";
5
-
6
- import { describe, expect, it } from "vitest";
7
-
8
- import { DEFAULT_ARGV_BUDGET_BYTES, estimateArgvBytes } from "../../../common/persona-router.ts";
9
- import {
10
- assertZcodeArgvBudget,
11
- buildZcodeArgv,
12
- buildZcodeEnv,
13
- launchZcodeProcess,
14
- } from "../launcher.ts";
15
-
16
- describe("buildZcodeArgv", () => {
17
- it("基础形态:--json --cwd --mode yolo --prompt 尾置", () => {
18
- const args = buildZcodeArgv({ cwd: "/tmp/w", prompt: "do it" });
19
- expect(args).toEqual(["--json", "--cwd", "/tmp/w", "--mode", "yolo", "--prompt", "do it"]);
20
- });
21
-
22
- it("denyTools 逗号连接进 --disallowed-tools", () => {
23
- const args = buildZcodeArgv({ cwd: "/w", prompt: "p", denyTools: ["bash", "edit"] });
24
- expect(args).toContain("--disallowed-tools");
25
- expect(args[args.indexOf("--disallowed-tools") + 1]).toBe("bash,edit");
26
- });
27
-
28
- it("denyTools 空/空白项过滤,全空不加 flag", () => {
29
- expect(buildZcodeArgv({ cwd: "/w", prompt: "p", denyTools: [] })).not.toContain("--disallowed-tools");
30
- expect(buildZcodeArgv({ cwd: "/w", prompt: "p", denyTools: [" ", ""] })).not.toContain("--disallowed-tools");
31
- });
32
-
33
- it("resumeSessionId 落 --resume(prompt 之前)", () => {
34
- const args = buildZcodeArgv({ cwd: "/w", prompt: "p", resumeSessionId: "sess_x" });
35
- expect(args.indexOf("--resume")).toBeLessThan(args.indexOf("--prompt"));
36
- expect(args[args.indexOf("--resume") + 1]).toBe("sess_x");
37
- });
38
- });
39
-
40
- describe("assertZcodeArgvBudget(对齐点②:公共 persona-router 权威预算的引擎侧消费)", () => {
41
- it("估算含 node 与 cliPath 前导(NUL 分隔近似),中文 prompt 按字节计", () => {
42
- // 公共 estimateArgvBytes 的口径回归:前导两元素计入 + 多字节按 UTF-8 字节
43
- const est = estimateArgvBytes(["n", "c", "--prompt", "中文"]);
44
- expect(est).toBe(2 + 2 + ("--prompt".length + 1) + Buffer.byteLength("中文") + 1);
45
- });
46
-
47
- it("超 128KB 阈值抛 prompt_too_large(含恢复指引;阈值 = DEFAULT_ARGV_BUDGET_BYTES)", () => {
48
- const bigPrompt = "x".repeat(DEFAULT_ARGV_BUDGET_BYTES);
49
- expect(() => assertZcodeArgvBudget("node", "/cli.cjs", ["--prompt", bigPrompt])).toThrowError(
50
- /prompt_too_large/,
51
- );
52
- try {
53
- assertZcodeArgvBudget("node", "/cli.cjs", ["--prompt", bigPrompt]);
54
- } catch (err) {
55
- // 公共 EngineError 形态:message 是 code 前缀 detail,恢复指引在 recovery 字段
56
- expect((err as { code: string }).code).toBe("prompt_too_large");
57
- expect((err as { recovery: string }).recovery).toContain("Shorten the task text");
58
- }
59
- });
60
-
61
- it("阈值内不抛", () => {
62
- expect(() => assertZcodeArgvBudget("node", "/cli.cjs", ["--prompt", "x".repeat(1024)])).not.toThrow();
63
- });
64
- });
65
-
66
- describe("buildZcodeEnv", () => {
67
- it("HOME 强制覆盖(同名键不许覆盖隔离值)+ 统一嵌套标记(经公共 nesting-guard)", () => {
68
- const env = buildZcodeEnv("/pool/home", { HOME: "/real/home", PATH: "/usr/bin" });
69
- expect(env["HOME"]).toBe("/pool/home");
70
- expect(env["XYZ_AGENT_SUBAGENT"]).toBe("1");
71
- expect(env["PATH"]).toBe("/usr/bin");
72
- });
73
-
74
- it("剥离引擎原生嵌套标记(D8:防孙代理误判已在嵌套层)", () => {
75
- const env = buildZcodeEnv("/pool/home", {
76
- ZSW_NESTED: "1",
77
- CLAUDECODE: "1",
78
- PI_SUBAGENT_SELF_RECORD_ID: "sa-x",
79
- PI_SUBAGENT_DEPTH: "2",
80
- });
81
- expect(env["ZSW_NESTED"]).toBeUndefined();
82
- expect(env["CLAUDECODE"]).toBeUndefined();
83
- expect(env["PI_SUBAGENT_SELF_RECORD_ID"]).toBeUndefined();
84
- expect(env["PI_SUBAGENT_DEPTH"]).toBeUndefined();
85
- expect(env["XYZ_AGENT_SUBAGENT"]).toBe("1");
86
- });
87
- });
88
-
89
- describe("launchZcodeProcess:真实子进程杀链(node -e 代替 CLI)", () => {
90
- // 杀链/exited 机制与 CLI 无关(对子进程发信号 + close 事件),用 `node -e <script>`
91
- // 验证机制本身:launchZcodeProcess 的 spawn 形态是 `node <cliPath> <args...>`,
92
- // 测试借 cliPath 槽位传 -e、args 传脚本内容。
93
- it("child 句柄暴露(D10 记账数据源):proc.child 即 spawn 出的进程,退出码可读", async () => {
94
- const proc = launchZcodeProcess({
95
- cliPath: "-e",
96
- args: ["process.stdout.write('hi'); process.exit(0)"],
97
- env: process.env,
98
- });
99
- // 句柄与 pid 同源(宿主经 RunContext.onChildSpawned 注册进 spawnedChildren)
100
- expect(proc.child.pid).toBe(proc.pid);
101
- expect(proc.child.killed).toBe(false);
102
- const exited = await proc.exited;
103
- expect(exited.code).toBe(0);
104
- expect(proc.child.exitCode).toBe(0); // close 后 exitCode 可读(close 事件先于 exited resolve)
105
- });
106
-
107
- it("正常退出:exited 带退出码,stdout 可收集", async () => {
108
- const proc = launchZcodeProcess({
109
- cliPath: "-e",
110
- args: ["process.stdout.write('hello'); process.exit(0)"],
111
- env: process.env,
112
- });
113
- let out = "";
114
- proc.stdout.on("data", (d: Buffer) => {
115
- out += d.toString();
116
- });
117
- const exited = await proc.exited;
118
- expect(out).toBe("hello");
119
- expect(exited.code).toBe(0);
120
- expect(proc.killedByUs()).toBe(false);
121
- });
122
-
123
- it("abort 触发杀链:SIGTERM 后进程退出,killedByUs 标记", async () => {
124
- const proc = launchZcodeProcess({
125
- cliPath: "-e",
126
- args: ["setInterval(() => {}, 1000)"],
127
- env: process.env,
128
- });
129
- expect(proc.pid).toBeGreaterThan(0);
130
- // 实测 zcode 对 SIGTERM ~103ms 退出;普通 node 进程无 handler 直接终止
131
- const abortPromise = proc.abort(3000);
132
- const exited = await proc.exited;
133
- await abortPromise;
134
- expect(exited.code === null || exited.code === 143 || exited.code === 1).toBe(true);
135
- expect(proc.killedByUs()).toBe(true);
136
- // 无僵尸:进程已从系统进程表消失
137
- expect(() => execFileSync("ps", ["-p", String(proc.pid)])).toThrow();
138
- });
139
-
140
- it("abort 幂等:重复调用不再触发第二条杀链", async () => {
141
- const proc = launchZcodeProcess({
142
- cliPath: "-e",
143
- args: ["setInterval(() => {}, 1000)"],
144
- env: process.env,
145
- });
146
- await proc.abort(2000);
147
- await proc.abort(2000); // 不应抛
148
- await proc.exited;
149
- });
150
- });
@@ -1,246 +0,0 @@
1
- // parser.test.ts —— golden 样本回归(验收 2)+ 损坏 stdout 错误路径 + 缓冲有界性。
2
- // golden 原文来自 2026-08-25 真机实录(zcode 0.16.5),采集元数据见 fixture _meta。
3
-
4
- import { readFileSync } from "node:fs";
5
- import { fileURLToPath } from "node:url";
6
-
7
- import { describe, expect, it } from "vitest";
8
-
9
- import {
10
- buildRunFailedMessage,
11
- createBoundedLineBuffer,
12
- mapZcodeUsage,
13
- parseZcodeStdoutJson,
14
- parseZcodeTerminal,
15
- synthesizeCoarseEvents,
16
- } from "../parser.ts";
17
-
18
- interface GoldenFixture {
19
- stdoutRaw: string;
20
- _meta: { engineVersion: string; exitCode: number; usageMapping: string };
21
- }
22
-
23
- const golden: GoldenFixture = JSON.parse(
24
- readFileSync(fileURLToPath(new URL("./__fixtures__/zcode-golden-spawn.json", import.meta.url)), "utf8"),
25
- );
26
-
27
- describe("parseZcodeTerminal:golden 回归", () => {
28
- it("实录样本解析出完整终态(sessionId/response/usage/turnCount)", () => {
29
- const r = parseZcodeTerminal(golden.stdoutRaw);
30
- expect(r.ok).toBe(true);
31
- if (!r.ok) return;
32
- expect(r.payload.sessionId).toBe("sess_35852a0f-1302-4e20-9e48-87f47527abe3");
33
- expect(r.payload.response).toBe("ok");
34
- expect(r.payload.usage).toEqual({ input: 12599, output: 17, cacheRead: 512, cacheWrite: 0 });
35
- expect(r.payload.turnCount).toBe(1);
36
- // 终态层 usage(orchestration 版):cost 显式 0(zcode 不回传)、contextTokens=
37
- // projection.contextUsed、turns=projection.turnCount
38
- expect(r.payload.outcomeUsage).toEqual({
39
- input: 12599,
40
- output: 17,
41
- cacheRead: 512,
42
- cacheWrite: 0,
43
- cost: 0,
44
- contextTokens: 12616,
45
- turns: 1,
46
- });
47
- });
48
-
49
- it("usage 字段名映射:inputTokens→input 等四项(cost 无来源不出现)", () => {
50
- const u = mapZcodeUsage({
51
- inputTokens: 10,
52
- outputTokens: 20,
53
- cacheReadTokens: 5,
54
- cacheWriteTokens: 0,
55
- });
56
- expect(u).toEqual({ input: 10, output: 20, cacheRead: 5, cacheWrite: 0 });
57
- expect(u !== undefined && "cost" in u).toBe(false);
58
- });
59
-
60
- it("usage 形状不完整时显式 undefined(不给残缺对象)", () => {
61
- expect(mapZcodeUsage(undefined)).toBeUndefined();
62
- expect(mapZcodeUsage("nope")).toBeUndefined();
63
- expect(mapZcodeUsage({})).toBeUndefined();
64
- });
65
- });
66
-
67
- describe("parseZcodeTerminal:损坏 stdout → ok:false(engine_run_failed 输入)", () => {
68
- it("非 JSON 文本", () => {
69
- const r = parseZcodeTerminal("Error: something broke\n");
70
- expect(r.ok).toBe(false);
71
- if (r.ok) return;
72
- expect(r.reason).toContain("不是 JSON");
73
- });
74
-
75
- it("JSON 但缺 string 型 response(格式漂移形态)", () => {
76
- const r = parseZcodeTerminal('{"sessionId": "sess_x", "usage": {}}');
77
- expect(r.ok).toBe(false);
78
- if (r.ok) return;
79
- expect(r.reason).toContain("response");
80
- });
81
-
82
- it("数组/标量 JSON 拒收", () => {
83
- expect(parseZcodeTerminal("[1,2,3]").ok).toBe(false);
84
- expect(parseZcodeTerminal("42").ok).toBe(false);
85
- });
86
-
87
- it("混入日志行时首尾大括号容错提取", () => {
88
- const mixed = '[info] boot\n{"sessionId":"sess_a","response":"done"}\n[info] exit';
89
- const r = parseZcodeTerminal(mixed);
90
- expect(r.ok).toBe(true);
91
- if (!r.ok) return;
92
- expect(r.payload.sessionId).toBe("sess_a");
93
- expect(r.payload.response).toBe("done");
94
- });
95
- });
96
-
97
- describe("parseZcodeStdoutJson:空对象形态防御", () => {
98
- it("无大括号文本返回 null", () => {
99
- expect(parseZcodeStdoutJson("plain text")).toBeNull();
100
- });
101
- });
102
-
103
- describe("synthesizeCoarseEvents:coarse 不变量", () => {
104
- it("message_end(含 usage)在前、turn_end 最后", () => {
105
- const usage = { input: 1, output: 2, cacheRead: 0, cacheWrite: 0 };
106
- const evs = synthesizeCoarseEvents("ok", usage);
107
- expect(evs).toEqual([{ type: "message_end", usage }, { type: "turn_end" }]);
108
- });
109
-
110
- it("无 usage 时 message_end 不带残缺字段", () => {
111
- const evs = synthesizeCoarseEvents("ok");
112
- expect(evs[0]).toEqual({ type: "message_end" });
113
- expect("usage" in evs[0]!).toBe(false);
114
- expect(evs[evs.length - 1]).toEqual({ type: "turn_end" });
115
- });
116
- });
117
-
118
- describe("buildRunFailedMessage:错误规格(stdout 尾部 + exit code + 恢复指引)", () => {
119
- it("含 exit code、尾部内容与三段恢复动作", () => {
120
- const msg = buildRunFailedMessage({
121
- exitCode: 3,
122
- stdoutTail: "x".repeat(5000),
123
- stderrTail: "boom",
124
- parseReason: "stdout 不是 JSON 对象",
125
- });
126
- expect(msg).toContain("engine_run_failed");
127
- expect(msg).toContain("exit code: 3");
128
- expect(msg).toContain("解析失败");
129
- expect(msg).toContain("stderr 尾部: boom");
130
- // stdout 尾部截断到 2000 字
131
- expect(msg).toContain("x".repeat(2000));
132
- expect(msg).not.toContain("x".repeat(2001));
133
- expect(msg).toContain("--version");
134
- expect(msg).toContain("golden");
135
- expect(msg).toContain("engine: pi");
136
- });
137
-
138
- it("null exit code 标注被信号杀死", () => {
139
- const msg = buildRunFailedMessage({ exitCode: null, stdoutTail: "" });
140
- expect(msg).toContain("null(被信号杀死)");
141
- });
142
-
143
- it("空 stdout 不产生空 part(防「stdout 尾部: <指引段>」视觉嵌套误读)", () => {
144
- const msg = buildRunFailedMessage({ exitCode: 1, stdoutTail: " " });
145
- expect(msg).not.toContain("stdout 尾部");
146
- });
147
-
148
- it("LLM API 失败(AI_APICallError)归因到端点/凭据指引,不再给 probe 指引", () => {
149
- const msg = buildRunFailedMessage({
150
- cliPath: "/fake/zcode.cjs",
151
- exitCode: 1,
152
- stdoutTail: "",
153
- stderrTail: "AI_APICallError: 500 Internal Server Error\nError: Turn execution failed",
154
- modelRef: "router/mimo-v2.5-pro",
155
- configPath: "/pool/.zcode/cli/config.json",
156
- });
157
- expect(msg).toContain("模型 API 调用失败");
158
- expect(msg).toContain("router/mimo-v2.5-pro");
159
- expect(msg).toContain("/pool/.zcode/cli/config.json");
160
- expect(msg).toContain("baseURL");
161
- expect(msg).toContain("engine: pi");
162
- // probe/golden 指引不出现(误导排查方向——2026-08-25 真机教训)
163
- expect(msg).not.toContain("--version");
164
- expect(msg).not.toContain("golden");
165
- expect(msg).not.toContain("stdout 尾部");
166
- });
167
-
168
- it("401 有响应形态(无 AI_APICallError 类名)也归因,且带 HTTP 状态与凭据定向", () => {
169
- const stderr401 = [
170
- " 'x-mife-upstream-status': '401'",
171
- " },",
172
- " responseStatus: 401,",
173
- " statusCode: 401",
174
- "}",
175
- "Error: Turn execution failed (traceId: a487a9b3)",
176
- ].join("\n");
177
- const msg = buildRunFailedMessage({
178
- cliPath: "/fake/zcode.cjs",
179
- exitCode: 1,
180
- stdoutTail: "",
181
- stderrTail: stderr401,
182
- modelRef: "router/mimo-v2.5-pro",
183
- configPath: "/pool/.zcode/cli/config.json",
184
- });
185
- expect(msg).toContain("模型 API 调用失败");
186
- expect(msg).toContain("HTTP 401");
187
- expect(msg).toContain("凭据无效或过期");
188
- expect(msg).toContain("apiKey 大概率无效或过期");
189
- expect(msg).not.toContain("--version");
190
- expect(msg).not.toContain("golden");
191
- });
192
-
193
- it("LLM 归因在缺省 modelRef/configPath 时兜底可读", () => {
194
- const msg = buildRunFailedMessage({
195
- cliPath: "/fake/zcode.cjs",
196
- exitCode: 1,
197
- stdoutTail: "ok",
198
- stderrTail: "Symbol(vercel.ai.error.AI_APICallError): true",
199
- });
200
- expect(msg).toContain("模型 API 调用失败");
201
- expect(msg).toContain("provider 的 baseURL 可达性");
202
- expect(msg).not.toContain("undefined");
203
- });
204
-
205
- it("stderr 的 [Object] 噪音行折叠为计数", () => {
206
- const noisy = [
207
- "AIError: fail",
208
- ...Array.from({ length: 12 }, () => " [Object], [Object],"),
209
- " statusCode: undefined,",
210
- ].join("\n");
211
- const msg = buildRunFailedMessage({ cliPath: "/c", exitCode: 1, stdoutTail: "", stderrTail: noisy });
212
- expect(msg).toContain("[Object]×12");
213
- expect(msg).not.toContain("[Object], [Object]");
214
- });
215
- });
216
-
217
- describe("createBoundedLineBuffer:有界双缓冲", () => {
218
- it("头 4K + 尾 64K 保留,中间丢弃并标记", () => {
219
- const buf = createBoundedLineBuffer();
220
- const line = "a".repeat(100) + "\n"; // 每行 101 字节
221
- for (let i = 0; i < 2000; i++) buf.push(line); // ~202KB,远超 4K+64K
222
- const text = buf.text();
223
- expect(text.startsWith("a".repeat(100))).toBe(true); // 头部保留
224
- expect(text).toContain("已丢弃"); // 中间丢弃标记
225
- expect(text.endsWith("\n")).toBe(true);
226
- // 尾部窗口 ≈ 64K:总长有界
227
- expect(text.length).toBeLessThan(4 * 1024 + 64 * 1024 + 200);
228
- });
229
-
230
- it("单行超整个尾部窗口时保留行尾(错误信息在末尾)", () => {
231
- const buf = createBoundedLineBuffer({ headLimit: 0, tailLimit: 1000 });
232
- buf.push("B".repeat(5000) + "\n");
233
- const text = buf.text();
234
- // 有效载荷 ≤ 1000(text 里另有「已丢弃 N 字节」标记行)
235
- expect(text.match(/B/g)?.length ?? 0).toBeLessThanOrEqual(1000);
236
- expect(text.endsWith("\n")).toBe(true);
237
- expect(text).toContain("已丢弃");
238
- });
239
-
240
- it("未超限时原文完整(golden 646 字节场景)", () => {
241
- const buf = createBoundedLineBuffer();
242
- buf.push(golden.stdoutRaw);
243
- expect(buf.text()).toBe(golden.stdoutRaw);
244
- expect(buf.tail(10)).toBe(golden.stdoutRaw.slice(-10));
245
- });
246
- });