@zhushanwen/pi-subagent-workflow 8.6.0 → 8.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (347) hide show
  1. package/package.json +9 -13
  2. package/relay/relay.mjs +1 -1
  3. package/src/host/__tests__/pi-host.test.ts +214 -0
  4. package/src/host/pi-host.ts +109 -0
  5. package/src/index.ts +89 -32
  6. package/src/injectors/__tests__/engine-awareness.test.ts +292 -0
  7. package/src/injectors/__tests__/engine-section-stability.test.ts +341 -0
  8. package/src/injectors/__tests__/subagent-list-injector.test.ts +5 -5
  9. package/src/injectors/__tests__/workflow-list-injector.test.ts +5 -5
  10. package/src/injectors/engine-awareness.ts +123 -0
  11. package/src/injectors/model-list-injector.ts +1 -1
  12. package/src/injectors/subagent-list-injector.ts +8 -8
  13. package/src/injectors/workflow-list-injector.ts +8 -8
  14. package/src/interface/__tests__/detectors.test.ts +3 -3
  15. package/src/interface/__tests__/subagent-tool-path-guard.test.ts +2 -2
  16. package/src/interface/__tests__/tool-workflow-script-generate.test.ts +2 -2
  17. package/src/interface/__tests__/tool-workflow-throw-paths.test.ts +1 -1
  18. package/src/interface/bg-notify-render.ts +4 -4
  19. package/src/interface/commands.ts +3 -3
  20. package/src/interface/format.ts +2 -2
  21. package/src/interface/helpers.ts +1 -1
  22. package/src/interface/list-component.ts +4 -4
  23. package/src/interface/list-shared.ts +2 -2
  24. package/src/interface/list-view.ts +2 -2
  25. package/src/interface/subagent-actions.ts +263 -11
  26. package/src/interface/subagent-tool-schema.ts +20 -13
  27. package/src/interface/subagent-tool.ts +11 -6
  28. package/src/interface/subagents.ts +3 -3
  29. package/src/interface/tool-render.ts +34 -2
  30. package/src/interface/tool-workflow-script.ts +4 -4
  31. package/src/interface/tool-workflow.ts +6 -6
  32. package/src/interface/views/WorkflowsView.ts +5 -5
  33. package/src/interface/views/__tests__/WorkflowsView-signature.test.ts +3 -3
  34. package/src/interface/views/__tests__/detail-content-session-file.test.ts +2 -2
  35. package/src/interface/views/detail-content.ts +4 -4
  36. package/src/interface/views/format.ts +4 -4
  37. package/src/{orchestration/jsonl-run-store.ts → jsonl-run-store.ts} +11 -11
  38. package/src/execution/__tests__/__fixtures__/notifier-golden-snapshots.json +0 -53
  39. package/src/execution/__tests__/__fixtures__/truncline.snapshot.json +0 -1
  40. package/src/execution/__tests__/agent-registry.test.ts +0 -363
  41. package/src/execution/__tests__/agent-result-mapper.test.ts +0 -150
  42. package/src/execution/__tests__/alive-store.test.ts +0 -147
  43. package/src/execution/__tests__/ask-user-transit-e2e.test.ts +0 -490
  44. package/src/execution/__tests__/before-agent-start-injection.test.ts +0 -132
  45. package/src/execution/__tests__/bg-notify-render.test.ts +0 -329
  46. package/src/execution/__tests__/channel-registry-handshake.test.ts +0 -243
  47. package/src/execution/__tests__/chat-engine-routing.test.ts +0 -601
  48. package/src/execution/__tests__/chatmode-first-round-closure-service.test.ts +0 -365
  49. package/src/execution/__tests__/chatmode-first-round-closure-spawn.test.ts +0 -190
  50. package/src/execution/__tests__/chatmode-round-notify-real-chain.test.ts +0 -215
  51. package/src/execution/__tests__/concurrency-pool.test.ts +0 -250
  52. package/src/execution/__tests__/config.test.ts +0 -110
  53. package/src/execution/__tests__/conversation-wiring.test.ts +0 -198
  54. package/src/execution/__tests__/crash-recovery.test.ts +0 -320
  55. package/src/execution/__tests__/delivery-methods.test.ts +0 -422
  56. package/src/execution/__tests__/dialog-queue.test.ts +0 -299
  57. package/src/execution/__tests__/epipe-fallback.test.ts +0 -241
  58. package/src/execution/__tests__/execute-and-await-worktree.test.ts +0 -243
  59. package/src/execution/__tests__/execute-nesting.test.ts +0 -323
  60. package/src/execution/__tests__/execute-options-mapper.test.ts +0 -200
  61. package/src/execution/__tests__/execution-record.test.ts +0 -1394
  62. package/src/execution/__tests__/explicit-agent-ref-guard.test.ts +0 -171
  63. package/src/execution/__tests__/finalize-record.test.ts +0 -368
  64. package/src/execution/__tests__/finalized-marker.test.ts +0 -82
  65. package/src/execution/__tests__/format-schema-instruction.test.ts +0 -169
  66. package/src/execution/__tests__/format.test.ts +0 -458
  67. package/src/execution/__tests__/gc-timer.test.ts +0 -184
  68. package/src/execution/__tests__/get-record-for-action-restart.test.ts +0 -254
  69. package/src/execution/__tests__/gui-mode-dispatch.test.ts +0 -59
  70. package/src/execution/__tests__/helpers/mock-extension-api.ts +0 -30
  71. package/src/execution/__tests__/helpers/spawn-mock.ts +0 -242
  72. package/src/execution/__tests__/host-mode.test.ts +0 -87
  73. package/src/execution/__tests__/index-session-start-identity.test.ts +0 -371
  74. package/src/execution/__tests__/index-session-start.test.ts +0 -672
  75. package/src/execution/__tests__/lifecycle-manager-lock.test.ts +0 -211
  76. package/src/execution/__tests__/lifecycle-manager.test.ts +0 -383
  77. package/src/execution/__tests__/lifecycle-predicates.test.ts +0 -116
  78. package/src/execution/__tests__/list-component.test.ts +0 -401
  79. package/src/execution/__tests__/list-fields.test.ts +0 -140
  80. package/src/execution/__tests__/manifest-parentid.test.ts +0 -117
  81. package/src/execution/__tests__/model-resolver.test.ts +0 -465
  82. package/src/execution/__tests__/nested-visibility-env-propagation.test.ts +0 -287
  83. package/src/execution/__tests__/nested-visibility.test.ts +0 -325
  84. package/src/execution/__tests__/notifier-flush.test.ts +0 -612
  85. package/src/execution/__tests__/notifier-golden-snapshot.test.ts +0 -261
  86. package/src/execution/__tests__/notify-ledger.test.ts +0 -826
  87. package/src/execution/__tests__/one-shot-upgrade.test.ts +0 -205
  88. package/src/execution/__tests__/output-collector.test.ts +0 -358
  89. package/src/execution/__tests__/parent-child-matrix.test.ts +0 -336
  90. package/src/execution/__tests__/path-encoding.test.ts +0 -104
  91. package/src/execution/__tests__/pi-invocation.test.ts +0 -134
  92. package/src/execution/__tests__/record-store.test.ts +0 -1057
  93. package/src/execution/__tests__/records-cwd-isolation.test.ts +0 -91
  94. package/src/execution/__tests__/recursive-visibility-baseline.test.ts +0 -339
  95. package/src/execution/__tests__/recursive-visibility-env.test.ts +0 -273
  96. package/src/execution/__tests__/relay-agent.test.ts +0 -448
  97. package/src/execution/__tests__/relay-env.test.ts +0 -42
  98. package/src/execution/__tests__/resource-policy.test.ts +0 -109
  99. package/src/execution/__tests__/rpc-mode.test.ts +0 -89
  100. package/src/execution/__tests__/run-and-finalize-chatmode.test.ts +0 -267
  101. package/src/execution/__tests__/run-spawn-chatmode-settled.test.ts +0 -253
  102. package/src/execution/__tests__/run-spawn-edges.test.ts +0 -687
  103. package/src/execution/__tests__/run-spawn-integration.test.ts +0 -933
  104. package/src/execution/__tests__/run-spawn-resume.test.ts +0 -322
  105. package/src/execution/__tests__/run-spawn-rpc-mode.test.ts +0 -196
  106. package/src/execution/__tests__/run-spawn-stdout-callback-throw.test.ts +0 -199
  107. package/src/execution/__tests__/sdk-contract.test.ts +0 -273
  108. package/src/execution/__tests__/session-context-resolver.test.ts +0 -167
  109. package/src/execution/__tests__/session-file-gc.test.ts +0 -293
  110. package/src/execution/__tests__/session-pending.test.ts +0 -197
  111. package/src/execution/__tests__/session-reconstructor.test.ts +0 -379
  112. package/src/execution/__tests__/session-runner-epipe.test.ts +0 -178
  113. package/src/execution/__tests__/session-runner-schema-env.test.ts +0 -350
  114. package/src/execution/__tests__/session-start-reaper.test.ts +0 -233
  115. package/src/execution/__tests__/spawn-args.test.ts +0 -445
  116. package/src/execution/__tests__/spawn-event-adapter-rpc.test.ts +0 -189
  117. package/src/execution/__tests__/spawn-event-adapter.test.ts +0 -167
  118. package/src/execution/__tests__/spawn-worktree-guidance.test.ts +0 -207
  119. package/src/execution/__tests__/spawned-children.test.ts +0 -92
  120. package/src/execution/__tests__/start-sync-model-guard.test.ts +0 -150
  121. package/src/execution/__tests__/startup-config-declaration.test.ts +0 -35
  122. package/src/execution/__tests__/status-refactor.test.ts +0 -345
  123. package/src/execution/__tests__/stdin-writer.test.ts +0 -463
  124. package/src/execution/__tests__/stream-sink-retirement.test.ts +0 -261
  125. package/src/execution/__tests__/subagent-service-abort.test.ts +0 -60
  126. package/src/execution/__tests__/subagent-service-message-close.test.ts +0 -629
  127. package/src/execution/__tests__/subagent-service-parent-guard.test.ts +0 -180
  128. package/src/execution/__tests__/subagent-service.test.ts +0 -788
  129. package/src/execution/__tests__/subprocess-agent-runner-routing.test.ts +0 -310
  130. package/src/execution/__tests__/subprocess-agent-runner.test.ts +0 -599
  131. package/src/execution/__tests__/temp-prompt.test.ts +0 -53
  132. package/src/execution/__tests__/timeout-integration.test.ts +0 -615
  133. package/src/execution/__tests__/tombstone-store.test.ts +0 -73
  134. package/src/execution/__tests__/tool-action.test.ts +0 -476
  135. package/src/execution/__tests__/truncline-snapshot.test.ts +0 -81
  136. package/src/execution/__tests__/turn-limiter-semantics.test.ts +0 -194
  137. package/src/execution/__tests__/turn-limiter.test.ts +0 -65
  138. package/src/execution/__tests__/ui-channels.test.ts +0 -187
  139. package/src/execution/__tests__/ui-interaction-model.test.ts +0 -67
  140. package/src/execution/__tests__/ui-request-handler-factory.test.ts +0 -370
  141. package/src/execution/__tests__/ui-request-handler.test.ts +0 -204
  142. package/src/execution/__tests__/ui-request-observability.test.ts +0 -114
  143. package/src/execution/__tests__/ui-request-queue.test.ts +0 -133
  144. package/src/execution/__tests__/worktree-manager.test.ts +0 -633
  145. package/src/execution/__tests__/worktree-pid-registration.integration.test.ts +0 -229
  146. package/src/execution/__tests__/worktree-reconcile.integration.test.ts +0 -181
  147. package/src/execution/__tests__/worktree-registry.test.ts +0 -199
  148. package/src/execution/agent-registry.ts +0 -199
  149. package/src/execution/agent-result-mapper.ts +0 -90
  150. package/src/execution/alive-store.ts +0 -92
  151. package/src/execution/argv-mirror.ts +0 -113
  152. package/src/execution/best-effort.ts +0 -38
  153. package/src/execution/channel-registry-access.ts +0 -144
  154. package/src/execution/concurrency-pool.ts +0 -116
  155. package/src/execution/config.ts +0 -96
  156. package/src/execution/dialog-queue.ts +0 -330
  157. package/src/execution/engine/__tests__/common/data-dir.test.ts +0 -53
  158. package/src/execution/engine/__tests__/common/errors.test.ts +0 -132
  159. package/src/execution/engine/__tests__/common/event-journal.test.ts +0 -177
  160. package/src/execution/engine/__tests__/common/kill-chain.test.ts +0 -192
  161. package/src/execution/engine/__tests__/common/nesting-guard.test.ts +0 -81
  162. package/src/execution/engine/__tests__/common/persona-router.test.ts +0 -123
  163. package/src/execution/engine/__tests__/common/pool-manager.test.ts +0 -154
  164. package/src/execution/engine/__tests__/common/schema-emulation.test.ts +0 -128
  165. package/src/execution/engine/__tests__/conformance/__fixtures__/pi-golden-events.json +0 -28
  166. package/src/execution/engine/__tests__/conformance/agent-event-invariants.ts +0 -141
  167. package/src/execution/engine/__tests__/conformance/contract.abort.test.ts +0 -109
  168. package/src/execution/engine/__tests__/conformance/contract.agent-events.test.ts +0 -101
  169. package/src/execution/engine/__tests__/conformance/contract.probe.test.ts +0 -77
  170. package/src/execution/engine/__tests__/conformance/contract.read-degradation.test.ts +0 -104
  171. package/src/execution/engine/__tests__/conformance/contract.relay.test.ts +0 -342
  172. package/src/execution/engine/__tests__/conformance/engine-conformance.live.test.ts +0 -201
  173. package/src/execution/engine/__tests__/conformance/golden-replay.pi.test.ts +0 -76
  174. package/src/execution/engine/__tests__/conformance/golden-replay.zcode.test.ts +0 -79
  175. package/src/execution/engine/__tests__/engine-discovery.test.ts +0 -87
  176. package/src/execution/engine/__tests__/engines-declaration.test.ts +0 -36
  177. package/src/execution/engine/__tests__/model-prompt.test.ts +0 -85
  178. package/src/execution/engine/__tests__/paths.test.ts +0 -39
  179. package/src/execution/engine/__tests__/registry.test.ts +0 -120
  180. package/src/execution/engine/__tests__/routing.test.ts +0 -231
  181. package/src/execution/engine/common/data-dir.ts +0 -62
  182. package/src/execution/engine/common/errors.ts +0 -183
  183. package/src/execution/engine/common/event-journal.ts +0 -254
  184. package/src/execution/engine/common/journal-replay.ts +0 -62
  185. package/src/execution/engine/common/kill-chain.ts +0 -221
  186. package/src/execution/engine/common/nesting-guard.ts +0 -50
  187. package/src/execution/engine/common/persona-router.ts +0 -108
  188. package/src/execution/engine/common/pool-manager.ts +0 -226
  189. package/src/execution/engine/common/schema-emulation.ts +0 -189
  190. package/src/execution/engine/common/session-view-projection.ts +0 -51
  191. package/src/execution/engine/engine-discovery.ts +0 -65
  192. package/src/execution/engine/engines/pi/__tests__/pi-engine.test.ts +0 -469
  193. package/src/execution/engine/engines/pi/__tests__/reader.test.ts +0 -155
  194. package/src/execution/engine/engines/pi/__tests__/task-spec-mapper.test.ts +0 -164
  195. package/src/execution/engine/engines/pi/pi-engine.ts +0 -415
  196. package/src/execution/engine/engines/pi/reader.ts +0 -48
  197. package/src/execution/engine/engines/pi/registration.ts +0 -35
  198. package/src/execution/engine/engines/pi/task-spec-mapper.ts +0 -100
  199. package/src/execution/engine/engines/zcode/__tests__/__fixtures__/zcode-golden-spawn.json +0 -39
  200. package/src/execution/engine/engines/zcode/__tests__/launcher.test.ts +0 -150
  201. package/src/execution/engine/engines/zcode/__tests__/parser.test.ts +0 -246
  202. package/src/execution/engine/engines/zcode/__tests__/preparer.test.ts +0 -228
  203. package/src/execution/engine/engines/zcode/__tests__/reader.test.ts +0 -210
  204. package/src/execution/engine/engines/zcode/__tests__/registration.test.ts +0 -64
  205. package/src/execution/engine/engines/zcode/__tests__/zcode-engine.live.test.ts +0 -127
  206. package/src/execution/engine/engines/zcode/__tests__/zcode-engine.test.ts +0 -580
  207. package/src/execution/engine/engines/zcode/constants.ts +0 -43
  208. package/src/execution/engine/engines/zcode/golden-sample.ts +0 -39
  209. package/src/execution/engine/engines/zcode/launcher.ts +0 -161
  210. package/src/execution/engine/engines/zcode/parser.ts +0 -436
  211. package/src/execution/engine/engines/zcode/preparer.ts +0 -363
  212. package/src/execution/engine/engines/zcode/reader.ts +0 -381
  213. package/src/execution/engine/engines/zcode/registration.ts +0 -37
  214. package/src/execution/engine/engines/zcode/zcode-engine.ts +0 -658
  215. package/src/execution/engine/host-task-spec.ts +0 -47
  216. package/src/execution/engine/model-prompt.ts +0 -59
  217. package/src/execution/engine/paths.ts +0 -42
  218. package/src/execution/engine/port.ts +0 -153
  219. package/src/execution/engine/registry.ts +0 -123
  220. package/src/execution/engine/routing.ts +0 -218
  221. package/src/execution/engine/types.ts +0 -309
  222. package/src/execution/execute-options-mapper.ts +0 -112
  223. package/src/execution/execution-record.ts +0 -965
  224. package/src/execution/finalize-record.ts +0 -251
  225. package/src/execution/finalized-marker.ts +0 -51
  226. package/src/execution/get-state-handshake.ts +0 -104
  227. package/src/execution/host-mode.ts +0 -56
  228. package/src/execution/idle-gc.ts +0 -47
  229. package/src/execution/lifecycle-manager.ts +0 -513
  230. package/src/execution/lifecycle-predicates.ts +0 -65
  231. package/src/execution/manifest-store.ts +0 -256
  232. package/src/execution/model-config-service.ts +0 -219
  233. package/src/execution/model-resolver.ts +0 -248
  234. package/src/execution/notifier.ts +0 -330
  235. package/src/execution/notify-ledger.ts +0 -580
  236. package/src/execution/output-collector.ts +0 -228
  237. package/src/execution/path-encoding.ts +0 -60
  238. package/src/execution/pi-invocation.ts +0 -120
  239. package/src/execution/record-entry.ts +0 -132
  240. package/src/execution/record-store.ts +0 -1234
  241. package/src/execution/relay-env.ts +0 -37
  242. package/src/execution/session-context-resolver.ts +0 -64
  243. package/src/execution/session-file-gc.ts +0 -120
  244. package/src/execution/session-pending.ts +0 -164
  245. package/src/execution/session-reconstructor.ts +0 -678
  246. package/src/execution/session-runner.ts +0 -1781
  247. package/src/execution/sessions-index.ts +0 -304
  248. package/src/execution/spawn-event-adapter.ts +0 -363
  249. package/src/execution/stdin-writer.ts +0 -198
  250. package/src/execution/stream-sink.ts +0 -126
  251. package/src/execution/subagent-service.ts +0 -2141
  252. package/src/execution/subprocess-agent-runner.ts +0 -317
  253. package/src/execution/temp-prompt.ts +0 -62
  254. package/src/execution/tombstone-store.ts +0 -72
  255. package/src/execution/turn-limiter.ts +0 -102
  256. package/src/execution/types.ts +0 -973
  257. package/src/execution/ui-channels.ts +0 -216
  258. package/src/execution/ui-interaction-model.ts +0 -48
  259. package/src/execution/ui-request-handler-factory.ts +0 -212
  260. package/src/execution/ui-request-observability.ts +0 -81
  261. package/src/execution/ui-request-queue.ts +0 -184
  262. package/src/execution/worktree-manager.ts +0 -688
  263. package/src/execution/worktree-registry.ts +0 -222
  264. package/src/orchestration/__tests__/__fixtures__/worker-template.snapshot.txt +0 -349
  265. package/src/orchestration/__tests__/agent-call-catch-fallback.test.ts +0 -202
  266. package/src/orchestration/__tests__/agent-call-stream.test.ts +0 -152
  267. package/src/orchestration/__tests__/args-validator.test.ts +0 -143
  268. package/src/orchestration/__tests__/config-loader.test.ts +0 -503
  269. package/src/orchestration/__tests__/error-recovery-handlers.test.ts +0 -809
  270. package/src/orchestration/__tests__/error-recovery-postmessage-defense.test.ts +0 -405
  271. package/src/orchestration/__tests__/error-recovery-serialize-failed-result.test.ts +0 -56
  272. package/src/orchestration/__tests__/error-recovery-workflow-call.test.ts +0 -166
  273. package/src/orchestration/__tests__/execute-agent-call.test.ts +0 -451
  274. package/src/orchestration/__tests__/jsonl-run-store-corrupt-entry.test.ts +0 -150
  275. package/src/orchestration/__tests__/jsonl-run-store-loadall-sources.test.ts +0 -171
  276. package/src/orchestration/__tests__/jsonl-run-store-retention.test.ts +0 -202
  277. package/src/orchestration/__tests__/jsonl-run-store-session-file.test.ts +0 -1030
  278. package/src/orchestration/__tests__/launcher-nested-workflow.test.ts +0 -600
  279. package/src/orchestration/__tests__/lifecycle-runid-injection.test.ts +0 -96
  280. package/src/orchestration/__tests__/lifecycle.test.ts +0 -659
  281. package/src/orchestration/__tests__/non-cloneable-return-e2e.test.ts +0 -95
  282. package/src/orchestration/__tests__/review-fix-loop-e2e.test.ts +0 -2025
  283. package/src/orchestration/__tests__/script-lint.test.ts +0 -831
  284. package/src/orchestration/__tests__/skill-discovery.test.ts +0 -201
  285. package/src/orchestration/__tests__/test-mocks.ts +0 -197
  286. package/src/orchestration/__tests__/worker-exit-without-result.test.ts +0 -368
  287. package/src/orchestration/__tests__/worker-host.test.ts +0 -120
  288. package/src/orchestration/__tests__/worker-returnmeta-passthrough.test.ts +0 -164
  289. package/src/orchestration/__tests__/worker-script-builder-runtime.test.ts +0 -563
  290. package/src/orchestration/__tests__/worker-script-builder.test.ts +0 -309
  291. package/src/orchestration/__tests__/worker-script-template-snapshot.test.ts +0 -129
  292. package/src/orchestration/__tests__/workflow-nesting-e2e.test.ts +0 -317
  293. package/src/orchestration/__tests__/workflow-script-lint-memo.test.ts +0 -110
  294. package/src/orchestration/__tests__/workflows-e2e.test.ts +0 -537
  295. package/src/orchestration/agent-opts-resolver.ts +0 -174
  296. package/src/orchestration/args-validator.ts +0 -127
  297. package/src/orchestration/config-loader.ts +0 -315
  298. package/src/orchestration/error-recovery.ts +0 -1018
  299. package/src/orchestration/execute-agent-call.ts +0 -256
  300. package/src/orchestration/launcher.ts +0 -455
  301. package/src/orchestration/lifecycle.ts +0 -399
  302. package/src/orchestration/models/__tests__/budget.test.ts +0 -307
  303. package/src/orchestration/models/__tests__/trace.test.ts +0 -408
  304. package/src/orchestration/models/agent-call.ts +0 -83
  305. package/src/orchestration/models/budget.ts +0 -118
  306. package/src/orchestration/models/ports.ts +0 -164
  307. package/src/orchestration/models/run-runtime.ts +0 -104
  308. package/src/orchestration/models/run-spec.ts +0 -83
  309. package/src/orchestration/models/run-state.ts +0 -44
  310. package/src/orchestration/models/trace.ts +0 -183
  311. package/src/orchestration/models/types.ts +0 -301
  312. package/src/orchestration/models/workflow-run.ts +0 -254
  313. package/src/orchestration/models/workflow-script-registry.ts +0 -35
  314. package/src/orchestration/models/workflow-script.ts +0 -117
  315. package/src/orchestration/script-lint.ts +0 -766
  316. package/src/orchestration/skill-discovery.ts +0 -115
  317. package/src/orchestration/worker-handle.ts +0 -115
  318. package/src/orchestration/worker-host.ts +0 -98
  319. package/src/orchestration/worker-script-builder.ts +0 -421
  320. package/src/orchestration/workflow-files.ts +0 -85
  321. package/src/orchestration/workflow-script-registry-impl.ts +0 -133
  322. package/src/shared/__tests__/agent-ref.test.ts +0 -34
  323. package/src/shared/__tests__/meta-parser.test.ts +0 -304
  324. package/src/shared/__tests__/model-ref.test.ts +0 -306
  325. package/src/shared/__tests__/resource-discovery-manifest-cache.test.ts +0 -280
  326. package/src/shared/__tests__/resource-discovery.test.ts +0 -736
  327. package/src/shared/__tests__/resource-meta.test.ts +0 -51
  328. package/src/shared/__tests__/schema-jsonify.test.ts +0 -81
  329. package/src/shared/__tests__/timer-delay.test.ts +0 -61
  330. package/src/shared/agent-event.ts +0 -13
  331. package/src/shared/agent-ref.ts +0 -57
  332. package/src/shared/meta-parser.ts +0 -261
  333. package/src/shared/model-ref.ts +0 -286
  334. package/src/shared/resource-discovery.ts +0 -811
  335. package/src/shared/resource-meta.ts +0 -65
  336. package/src/shared/schema-env.ts +0 -44
  337. package/src/shared/schema-jsonify.ts +0 -58
  338. package/src/shared/timer-delay.ts +0 -54
  339. package/src/shared/xml-injection.ts +0 -35
  340. package/workflows/README.md +0 -81
  341. package/workflows/_shared/agent-refs.cjs +0 -40
  342. package/workflows/chain.js +0 -131
  343. package/workflows/map-reduce.js +0 -174
  344. package/workflows/parallel.js +0 -148
  345. package/workflows/review-fix-loop-utils.cjs +0 -1309
  346. package/workflows/review-fix-loop.js +0 -1404
  347. 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
- });