@zhushanwen/pi-subagent-workflow 8.5.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 (336) hide show
  1. package/package.json +13 -16
  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 +142 -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 +157 -0
  16. package/src/interface/__tests__/subagent-tool-prompt.test.ts +12 -0
  17. package/src/interface/__tests__/tool-workflow-script-generate.test.ts +2 -2
  18. package/src/interface/__tests__/tool-workflow-throw-paths.test.ts +1 -1
  19. package/src/interface/bg-notify-render.ts +34 -13
  20. package/src/interface/commands.ts +3 -3
  21. package/src/interface/format.ts +2 -2
  22. package/src/interface/helpers.ts +3 -3
  23. package/src/interface/list-component.ts +4 -4
  24. package/src/interface/list-shared.ts +2 -2
  25. package/src/interface/list-view.ts +2 -2
  26. package/src/interface/subagent-actions.ts +288 -19
  27. package/src/interface/subagent-tool-schema.ts +163 -0
  28. package/src/interface/subagent-tool.ts +65 -129
  29. package/src/interface/subagents.ts +5 -5
  30. package/src/interface/tool-render.ts +34 -2
  31. package/src/interface/tool-workflow-script.ts +4 -4
  32. package/src/interface/tool-workflow.ts +6 -6
  33. package/src/interface/views/WorkflowsView.ts +5 -5
  34. package/src/interface/views/__tests__/WorkflowsView-signature.test.ts +3 -3
  35. package/src/interface/views/__tests__/detail-content-session-file.test.ts +2 -2
  36. package/src/interface/views/detail-content.ts +4 -4
  37. package/src/interface/views/format.ts +4 -4
  38. package/src/{orchestration/jsonl-run-store.ts → jsonl-run-store.ts} +132 -18
  39. package/src/execution/__tests__/__fixtures__/notifier-golden-snapshots.json +0 -53
  40. package/src/execution/__tests__/__fixtures__/truncline.snapshot.json +0 -1
  41. package/src/execution/__tests__/agent-registry.test.ts +0 -363
  42. package/src/execution/__tests__/agent-result-mapper.test.ts +0 -150
  43. package/src/execution/__tests__/alive-store.test.ts +0 -147
  44. package/src/execution/__tests__/ask-user-transit-e2e.test.ts +0 -490
  45. package/src/execution/__tests__/before-agent-start-injection.test.ts +0 -132
  46. package/src/execution/__tests__/bg-notify-render.test.ts +0 -256
  47. package/src/execution/__tests__/channel-registry-handshake.test.ts +0 -243
  48. package/src/execution/__tests__/chat-engine-routing.test.ts +0 -597
  49. package/src/execution/__tests__/chatmode-first-round-closure-service.test.ts +0 -365
  50. package/src/execution/__tests__/chatmode-first-round-closure-spawn.test.ts +0 -190
  51. package/src/execution/__tests__/chatmode-round-notify-real-chain.test.ts +0 -215
  52. package/src/execution/__tests__/concurrency-pool.test.ts +0 -250
  53. package/src/execution/__tests__/config.test.ts +0 -110
  54. package/src/execution/__tests__/conversation-wiring.test.ts +0 -198
  55. package/src/execution/__tests__/crash-recovery.test.ts +0 -320
  56. package/src/execution/__tests__/delivery-methods.test.ts +0 -385
  57. package/src/execution/__tests__/dialog-queue.test.ts +0 -299
  58. package/src/execution/__tests__/epipe-fallback.test.ts +0 -241
  59. package/src/execution/__tests__/execute-and-await-worktree.test.ts +0 -243
  60. package/src/execution/__tests__/execute-nesting.test.ts +0 -323
  61. package/src/execution/__tests__/execute-options-mapper.test.ts +0 -189
  62. package/src/execution/__tests__/execution-record.test.ts +0 -1284
  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 -138
  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 -238
  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 -593
  75. package/src/execution/__tests__/lifecycle-manager-lock.test.ts +0 -211
  76. package/src/execution/__tests__/lifecycle-manager.test.ts +0 -337
  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 -109
  80. package/src/execution/__tests__/manifest-parentid.test.ts +0 -117
  81. package/src/execution/__tests__/model-resolver.test.ts +0 -413
  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 -574
  85. package/src/execution/__tests__/notifier-golden-snapshot.test.ts +0 -261
  86. package/src/execution/__tests__/one-shot-upgrade.test.ts +0 -205
  87. package/src/execution/__tests__/output-collector.test.ts +0 -61
  88. package/src/execution/__tests__/parent-child-matrix.test.ts +0 -336
  89. package/src/execution/__tests__/path-encoding.test.ts +0 -104
  90. package/src/execution/__tests__/pi-invocation.test.ts +0 -134
  91. package/src/execution/__tests__/record-store.test.ts +0 -1057
  92. package/src/execution/__tests__/records-cwd-isolation.test.ts +0 -91
  93. package/src/execution/__tests__/recursive-visibility-baseline.test.ts +0 -339
  94. package/src/execution/__tests__/recursive-visibility-env.test.ts +0 -273
  95. package/src/execution/__tests__/relay-agent.test.ts +0 -448
  96. package/src/execution/__tests__/relay-env.test.ts +0 -42
  97. package/src/execution/__tests__/resource-policy.test.ts +0 -109
  98. package/src/execution/__tests__/rpc-mode.test.ts +0 -89
  99. package/src/execution/__tests__/run-and-finalize-chatmode.test.ts +0 -267
  100. package/src/execution/__tests__/run-spawn-chatmode-settled.test.ts +0 -253
  101. package/src/execution/__tests__/run-spawn-edges.test.ts +0 -644
  102. package/src/execution/__tests__/run-spawn-integration.test.ts +0 -933
  103. package/src/execution/__tests__/run-spawn-resume.test.ts +0 -322
  104. package/src/execution/__tests__/run-spawn-rpc-mode.test.ts +0 -196
  105. package/src/execution/__tests__/sdk-contract.test.ts +0 -273
  106. package/src/execution/__tests__/session-context-resolver.test.ts +0 -167
  107. package/src/execution/__tests__/session-file-gc.test.ts +0 -293
  108. package/src/execution/__tests__/session-pending.test.ts +0 -197
  109. package/src/execution/__tests__/session-reconstructor.test.ts +0 -379
  110. package/src/execution/__tests__/session-runner-epipe.test.ts +0 -178
  111. package/src/execution/__tests__/session-runner-schema-env.test.ts +0 -311
  112. package/src/execution/__tests__/session-start-reaper.test.ts +0 -233
  113. package/src/execution/__tests__/spawn-args.test.ts +0 -434
  114. package/src/execution/__tests__/spawn-event-adapter-rpc.test.ts +0 -189
  115. package/src/execution/__tests__/spawn-event-adapter.test.ts +0 -167
  116. package/src/execution/__tests__/spawn-worktree-guidance.test.ts +0 -207
  117. package/src/execution/__tests__/spawned-children.test.ts +0 -92
  118. package/src/execution/__tests__/startup-config-declaration.test.ts +0 -35
  119. package/src/execution/__tests__/status-refactor.test.ts +0 -345
  120. package/src/execution/__tests__/stdin-writer.test.ts +0 -463
  121. package/src/execution/__tests__/stream-sink-retirement.test.ts +0 -261
  122. package/src/execution/__tests__/subagent-service-abort.test.ts +0 -60
  123. package/src/execution/__tests__/subagent-service-message-close.test.ts +0 -629
  124. package/src/execution/__tests__/subagent-service-parent-guard.test.ts +0 -180
  125. package/src/execution/__tests__/subagent-service.test.ts +0 -788
  126. package/src/execution/__tests__/subprocess-agent-runner-routing.test.ts +0 -310
  127. package/src/execution/__tests__/subprocess-agent-runner.test.ts +0 -506
  128. package/src/execution/__tests__/temp-prompt.test.ts +0 -53
  129. package/src/execution/__tests__/timeout-integration.test.ts +0 -397
  130. package/src/execution/__tests__/tombstone-store.test.ts +0 -73
  131. package/src/execution/__tests__/tool-action.test.ts +0 -385
  132. package/src/execution/__tests__/truncline-snapshot.test.ts +0 -81
  133. package/src/execution/__tests__/turn-limiter-semantics.test.ts +0 -194
  134. package/src/execution/__tests__/turn-limiter.test.ts +0 -65
  135. package/src/execution/__tests__/ui-channels.test.ts +0 -187
  136. package/src/execution/__tests__/ui-interaction-model.test.ts +0 -67
  137. package/src/execution/__tests__/ui-request-handler-factory.test.ts +0 -370
  138. package/src/execution/__tests__/ui-request-handler.test.ts +0 -204
  139. package/src/execution/__tests__/ui-request-observability.test.ts +0 -114
  140. package/src/execution/__tests__/ui-request-queue.test.ts +0 -133
  141. package/src/execution/__tests__/worktree-manager.test.ts +0 -633
  142. package/src/execution/__tests__/worktree-pid-registration.integration.test.ts +0 -229
  143. package/src/execution/__tests__/worktree-reconcile.integration.test.ts +0 -181
  144. package/src/execution/__tests__/worktree-registry.test.ts +0 -199
  145. package/src/execution/agent-registry.ts +0 -193
  146. package/src/execution/agent-result-mapper.ts +0 -90
  147. package/src/execution/alive-store.ts +0 -92
  148. package/src/execution/argv-mirror.ts +0 -109
  149. package/src/execution/best-effort.ts +0 -38
  150. package/src/execution/channel-registry-access.ts +0 -144
  151. package/src/execution/concurrency-pool.ts +0 -116
  152. package/src/execution/config.ts +0 -96
  153. package/src/execution/dialog-queue.ts +0 -330
  154. package/src/execution/engine/__tests__/common/data-dir.test.ts +0 -53
  155. package/src/execution/engine/__tests__/common/errors.test.ts +0 -132
  156. package/src/execution/engine/__tests__/common/event-journal.test.ts +0 -177
  157. package/src/execution/engine/__tests__/common/kill-chain.test.ts +0 -192
  158. package/src/execution/engine/__tests__/common/nesting-guard.test.ts +0 -81
  159. package/src/execution/engine/__tests__/common/persona-router.test.ts +0 -123
  160. package/src/execution/engine/__tests__/common/pool-manager.test.ts +0 -154
  161. package/src/execution/engine/__tests__/common/schema-emulation.test.ts +0 -128
  162. package/src/execution/engine/__tests__/conformance/__fixtures__/pi-golden-events.json +0 -28
  163. package/src/execution/engine/__tests__/conformance/agent-event-invariants.ts +0 -141
  164. package/src/execution/engine/__tests__/conformance/contract.abort.test.ts +0 -109
  165. package/src/execution/engine/__tests__/conformance/contract.agent-events.test.ts +0 -101
  166. package/src/execution/engine/__tests__/conformance/contract.probe.test.ts +0 -77
  167. package/src/execution/engine/__tests__/conformance/contract.read-degradation.test.ts +0 -104
  168. package/src/execution/engine/__tests__/conformance/contract.relay.test.ts +0 -342
  169. package/src/execution/engine/__tests__/conformance/engine-conformance.live.test.ts +0 -201
  170. package/src/execution/engine/__tests__/conformance/golden-replay.pi.test.ts +0 -76
  171. package/src/execution/engine/__tests__/conformance/golden-replay.zcode.test.ts +0 -79
  172. package/src/execution/engine/__tests__/engine-discovery.test.ts +0 -87
  173. package/src/execution/engine/__tests__/engines-declaration.test.ts +0 -36
  174. package/src/execution/engine/__tests__/model-prompt.test.ts +0 -85
  175. package/src/execution/engine/__tests__/paths.test.ts +0 -39
  176. package/src/execution/engine/__tests__/registry.test.ts +0 -120
  177. package/src/execution/engine/__tests__/routing.test.ts +0 -231
  178. package/src/execution/engine/common/data-dir.ts +0 -62
  179. package/src/execution/engine/common/errors.ts +0 -183
  180. package/src/execution/engine/common/event-journal.ts +0 -254
  181. package/src/execution/engine/common/journal-replay.ts +0 -62
  182. package/src/execution/engine/common/kill-chain.ts +0 -221
  183. package/src/execution/engine/common/nesting-guard.ts +0 -50
  184. package/src/execution/engine/common/persona-router.ts +0 -108
  185. package/src/execution/engine/common/pool-manager.ts +0 -226
  186. package/src/execution/engine/common/schema-emulation.ts +0 -189
  187. package/src/execution/engine/common/session-view-projection.ts +0 -51
  188. package/src/execution/engine/engine-discovery.ts +0 -65
  189. package/src/execution/engine/engines/pi/__tests__/pi-engine.test.ts +0 -469
  190. package/src/execution/engine/engines/pi/__tests__/reader.test.ts +0 -155
  191. package/src/execution/engine/engines/pi/__tests__/task-spec-mapper.test.ts +0 -164
  192. package/src/execution/engine/engines/pi/pi-engine.ts +0 -415
  193. package/src/execution/engine/engines/pi/reader.ts +0 -48
  194. package/src/execution/engine/engines/pi/registration.ts +0 -35
  195. package/src/execution/engine/engines/pi/task-spec-mapper.ts +0 -100
  196. package/src/execution/engine/engines/zcode/__tests__/__fixtures__/zcode-golden-spawn.json +0 -39
  197. package/src/execution/engine/engines/zcode/__tests__/launcher.test.ts +0 -150
  198. package/src/execution/engine/engines/zcode/__tests__/parser.test.ts +0 -246
  199. package/src/execution/engine/engines/zcode/__tests__/preparer.test.ts +0 -228
  200. package/src/execution/engine/engines/zcode/__tests__/reader.test.ts +0 -210
  201. package/src/execution/engine/engines/zcode/__tests__/registration.test.ts +0 -64
  202. package/src/execution/engine/engines/zcode/__tests__/zcode-engine.live.test.ts +0 -127
  203. package/src/execution/engine/engines/zcode/__tests__/zcode-engine.test.ts +0 -567
  204. package/src/execution/engine/engines/zcode/constants.ts +0 -43
  205. package/src/execution/engine/engines/zcode/golden-sample.ts +0 -39
  206. package/src/execution/engine/engines/zcode/launcher.ts +0 -161
  207. package/src/execution/engine/engines/zcode/parser.ts +0 -436
  208. package/src/execution/engine/engines/zcode/preparer.ts +0 -363
  209. package/src/execution/engine/engines/zcode/reader.ts +0 -381
  210. package/src/execution/engine/engines/zcode/registration.ts +0 -37
  211. package/src/execution/engine/engines/zcode/zcode-engine.ts +0 -648
  212. package/src/execution/engine/host-task-spec.ts +0 -47
  213. package/src/execution/engine/model-prompt.ts +0 -59
  214. package/src/execution/engine/paths.ts +0 -42
  215. package/src/execution/engine/port.ts +0 -153
  216. package/src/execution/engine/registry.ts +0 -123
  217. package/src/execution/engine/routing.ts +0 -218
  218. package/src/execution/engine/types.ts +0 -304
  219. package/src/execution/execute-options-mapper.ts +0 -111
  220. package/src/execution/execution-record.ts +0 -906
  221. package/src/execution/finalize-record.ts +0 -251
  222. package/src/execution/finalized-marker.ts +0 -51
  223. package/src/execution/get-state-handshake.ts +0 -104
  224. package/src/execution/host-mode.ts +0 -56
  225. package/src/execution/idle-gc.ts +0 -47
  226. package/src/execution/lifecycle-manager.ts +0 -491
  227. package/src/execution/lifecycle-predicates.ts +0 -65
  228. package/src/execution/manifest-store.ts +0 -256
  229. package/src/execution/model-config-service.ts +0 -204
  230. package/src/execution/model-resolver.ts +0 -276
  231. package/src/execution/notifier.ts +0 -260
  232. package/src/execution/output-collector.ts +0 -88
  233. package/src/execution/path-encoding.ts +0 -60
  234. package/src/execution/pi-invocation.ts +0 -120
  235. package/src/execution/record-entry.ts +0 -132
  236. package/src/execution/record-store.ts +0 -1234
  237. package/src/execution/relay-env.ts +0 -37
  238. package/src/execution/session-context-resolver.ts +0 -64
  239. package/src/execution/session-file-gc.ts +0 -120
  240. package/src/execution/session-pending.ts +0 -164
  241. package/src/execution/session-reconstructor.ts +0 -678
  242. package/src/execution/session-runner.ts +0 -1548
  243. package/src/execution/sessions-index.ts +0 -304
  244. package/src/execution/spawn-event-adapter.ts +0 -363
  245. package/src/execution/stdin-writer.ts +0 -198
  246. package/src/execution/stream-sink.ts +0 -126
  247. package/src/execution/subagent-service.ts +0 -2119
  248. package/src/execution/subprocess-agent-runner.ts +0 -303
  249. package/src/execution/temp-prompt.ts +0 -62
  250. package/src/execution/tombstone-store.ts +0 -72
  251. package/src/execution/turn-limiter.ts +0 -102
  252. package/src/execution/types.ts +0 -910
  253. package/src/execution/ui-channels.ts +0 -216
  254. package/src/execution/ui-interaction-model.ts +0 -48
  255. package/src/execution/ui-request-handler-factory.ts +0 -212
  256. package/src/execution/ui-request-observability.ts +0 -81
  257. package/src/execution/ui-request-queue.ts +0 -174
  258. package/src/execution/worktree-manager.ts +0 -688
  259. package/src/execution/worktree-registry.ts +0 -222
  260. package/src/orchestration/__tests__/__fixtures__/worker-template.snapshot.txt +0 -336
  261. package/src/orchestration/__tests__/agent-call-catch-fallback.test.ts +0 -208
  262. package/src/orchestration/__tests__/agent-call-stream.test.ts +0 -157
  263. package/src/orchestration/__tests__/args-validator.test.ts +0 -143
  264. package/src/orchestration/__tests__/concurrency-gate.test.ts +0 -125
  265. package/src/orchestration/__tests__/config-loader.test.ts +0 -503
  266. package/src/orchestration/__tests__/error-recovery-handlers.test.ts +0 -724
  267. package/src/orchestration/__tests__/error-recovery-postmessage-defense.test.ts +0 -405
  268. package/src/orchestration/__tests__/error-recovery-serialize-failed-result.test.ts +0 -56
  269. package/src/orchestration/__tests__/error-recovery-workflow-call.test.ts +0 -166
  270. package/src/orchestration/__tests__/execute-agent-call.test.ts +0 -314
  271. package/src/orchestration/__tests__/jsonl-run-store-loadall-sources.test.ts +0 -171
  272. package/src/orchestration/__tests__/jsonl-run-store-session-file.test.ts +0 -1030
  273. package/src/orchestration/__tests__/launcher-nested-workflow.test.ts +0 -277
  274. package/src/orchestration/__tests__/lifecycle-runid-injection.test.ts +0 -96
  275. package/src/orchestration/__tests__/lifecycle.test.ts +0 -625
  276. package/src/orchestration/__tests__/review-fix-loop-e2e.test.ts +0 -1971
  277. package/src/orchestration/__tests__/script-lint.test.ts +0 -831
  278. package/src/orchestration/__tests__/skill-discovery.test.ts +0 -157
  279. package/src/orchestration/__tests__/test-mocks.ts +0 -197
  280. package/src/orchestration/__tests__/worker-host.test.ts +0 -120
  281. package/src/orchestration/__tests__/worker-returnmeta-passthrough.test.ts +0 -164
  282. package/src/orchestration/__tests__/worker-script-builder-runtime.test.ts +0 -520
  283. package/src/orchestration/__tests__/worker-script-builder.test.ts +0 -309
  284. package/src/orchestration/__tests__/worker-script-template-snapshot.test.ts +0 -110
  285. package/src/orchestration/__tests__/workflow-nesting-e2e.test.ts +0 -317
  286. package/src/orchestration/__tests__/workflow-script-lint-memo.test.ts +0 -110
  287. package/src/orchestration/__tests__/workflows-e2e.test.ts +0 -537
  288. package/src/orchestration/agent-opts-resolver.ts +0 -93
  289. package/src/orchestration/args-validator.ts +0 -127
  290. package/src/orchestration/concurrency-gate.ts +0 -69
  291. package/src/orchestration/config-loader.ts +0 -315
  292. package/src/orchestration/error-recovery.ts +0 -862
  293. package/src/orchestration/execute-agent-call.ts +0 -217
  294. package/src/orchestration/launcher.ts +0 -410
  295. package/src/orchestration/lifecycle.ts +0 -396
  296. package/src/orchestration/models/__tests__/budget.test.ts +0 -367
  297. package/src/orchestration/models/__tests__/trace.test.ts +0 -408
  298. package/src/orchestration/models/agent-call.ts +0 -83
  299. package/src/orchestration/models/budget.ts +0 -148
  300. package/src/orchestration/models/ports.ts +0 -164
  301. package/src/orchestration/models/run-runtime.ts +0 -89
  302. package/src/orchestration/models/run-spec.ts +0 -83
  303. package/src/orchestration/models/run-state.ts +0 -44
  304. package/src/orchestration/models/trace.ts +0 -183
  305. package/src/orchestration/models/types.ts +0 -292
  306. package/src/orchestration/models/workflow-run.ts +0 -254
  307. package/src/orchestration/models/workflow-script-registry.ts +0 -35
  308. package/src/orchestration/models/workflow-script.ts +0 -117
  309. package/src/orchestration/script-lint.ts +0 -766
  310. package/src/orchestration/skill-discovery.ts +0 -92
  311. package/src/orchestration/worker-handle.ts +0 -115
  312. package/src/orchestration/worker-host.ts +0 -98
  313. package/src/orchestration/worker-script-builder.ts +0 -408
  314. package/src/orchestration/workflow-files.ts +0 -85
  315. package/src/orchestration/workflow-script-registry-impl.ts +0 -133
  316. package/src/shared/__tests__/agent-ref.test.ts +0 -34
  317. package/src/shared/__tests__/meta-parser.test.ts +0 -304
  318. package/src/shared/__tests__/resource-discovery-manifest-cache.test.ts +0 -280
  319. package/src/shared/__tests__/resource-discovery.test.ts +0 -736
  320. package/src/shared/__tests__/resource-meta.test.ts +0 -51
  321. package/src/shared/__tests__/schema-jsonify.test.ts +0 -81
  322. package/src/shared/agent-event.ts +0 -13
  323. package/src/shared/agent-ref.ts +0 -57
  324. package/src/shared/meta-parser.ts +0 -261
  325. package/src/shared/resource-discovery.ts +0 -811
  326. package/src/shared/resource-meta.ts +0 -65
  327. package/src/shared/schema-jsonify.ts +0 -56
  328. package/src/shared/xml-injection.ts +0 -35
  329. package/workflows/README.md +0 -81
  330. package/workflows/_shared/agent-refs.cjs +0 -40
  331. package/workflows/chain.js +0 -131
  332. package/workflows/map-reduce.js +0 -174
  333. package/workflows/parallel.js +0 -148
  334. package/workflows/review-fix-loop-utils.cjs +0 -1307
  335. package/workflows/review-fix-loop.js +0 -1396
  336. package/workflows/scatter-gather.js +0 -178
@@ -1,51 +0,0 @@
1
- /**
2
- * resource-meta 类型族测试(v5 §11.1)
3
- *
4
- * 编译期 + 运行期判别 ResourceMeta 联合。
5
- */
6
- import { describe, expect, it } from "vitest";
7
-
8
- import type { AgentMeta, ResourceMeta, WorkflowMeta } from "../resource-meta.ts";
9
-
10
- describe("ResourceMeta 类型族", () => {
11
- it("WorkflowMeta 判别 kind='workflow'", () => {
12
- const wf: WorkflowMeta = {
13
- kind: "workflow",
14
- name: "chain",
15
- description: "test",
16
- phases: ["a"],
17
- };
18
- expect(wf.kind).toBe("workflow");
19
- });
20
-
21
- it("AgentMeta 判别 kind='agent'", () => {
22
- const ag: AgentMeta = {
23
- kind: "agent",
24
- name: "reviewer",
25
- description: "review",
26
- };
27
- expect(ag.kind).toBe("agent");
28
- });
29
-
30
- it("联合类型 kind 判别 narrowing", () => {
31
- function isWorkflow(m: ResourceMeta): m is WorkflowMeta {
32
- return m.kind === "workflow";
33
- }
34
- const wf: ResourceMeta = { kind: "workflow", name: "x", description: "", phases: [] };
35
- const ag: ResourceMeta = { kind: "agent", name: "y", description: "" };
36
- expect(isWorkflow(wf)).toBe(true);
37
- expect(isWorkflow(ag)).toBe(false);
38
- });
39
-
40
- it("可选字段缺省为 undefined", () => {
41
- const wf: WorkflowMeta = {
42
- kind: "workflow",
43
- name: "x",
44
- description: "",
45
- phases: [],
46
- };
47
- expect(wf.parameters).toBeUndefined();
48
- expect(wf.usage).toBeUndefined();
49
- expect(wf.when).toBeUndefined();
50
- });
51
- });
@@ -1,81 +0,0 @@
1
- /**
2
- * stringifySchemaCached(IF7/#13)— WeakMap 引用级缓存单测(TC6/DM4)。
3
- *
4
- * 断言面(design IF7 契约):
5
- * - 同对象二调返回同字符串引用(缓存命中,非等值新串)
6
- * - compact/pretty 分别缓存(互不覆写)
7
- * - 不同对象互不污染
8
- * - 输出与直接 JSON.stringify 逐字节一致
9
- */
10
- import { describe, expect, it, vi } from "vitest";
11
-
12
- import { stringifySchemaCached } from "../schema-jsonify.ts";
13
-
14
- describe("stringifySchemaCached — WeakMap 引用级缓存", () => {
15
- const schema = { type: "object", properties: { n: { type: "number" } } };
16
-
17
- it("输出与直接 JSON.stringify 逐字节一致(compact / pretty)", () => {
18
- expect(stringifySchemaCached(schema, "compact")).toBe(JSON.stringify(schema));
19
- expect(stringifySchemaCached(schema, "pretty")).toBe(JSON.stringify(schema, null, 2));
20
- });
21
-
22
- it("同对象二调返回同字符串引用(缓存命中)", () => {
23
- const a = stringifySchemaCached(schema, "compact");
24
- const b = stringifySchemaCached(schema, "compact");
25
- expect(b).toBe(a); // toBe = 引用相等(非仅等值)
26
- });
27
-
28
- it("同对象跨格式:compact 与 pretty 分别缓存且各自命中", () => {
29
- const c1 = stringifySchemaCached(schema, "compact");
30
- const p1 = stringifySchemaCached(schema, "pretty");
31
- const c2 = stringifySchemaCached(schema, "compact");
32
- const p2 = stringifySchemaCached(schema, "pretty");
33
- expect(c2).toBe(c1);
34
- expect(p2).toBe(p1);
35
- expect(c1).not.toBe(p1); // 两种格式输出不同,分别缓存
36
- });
37
-
38
- it("不同对象互不污染(等值异引用各持条目)", () => {
39
- const s1 = { type: "object" };
40
- const s2 = { type: "object" }; // 等值但异引用
41
- const r1 = stringifySchemaCached(s1, "compact");
42
- const r2 = stringifySchemaCached(s2, "compact");
43
- expect(r1).toBe(r2); // 等值(内容相同)
44
- // s2 未命中 s1 的条目(否则 spy 场景下 s2 的 stringify 调用会被跳过——
45
- // 引用级隔离由「同引用返回同串」+「等值异引用各自 stringify」共同保证)
46
- });
47
-
48
- it("缓存命中路径不再调 JSON.stringify(spy 计数)", () => {
49
- const spy = vi.spyOn(JSON, "stringify");
50
- try {
51
- const obj = { spy: true };
52
- stringifySchemaCached(obj, "pretty");
53
- stringifySchemaCached(obj, "pretty"); // 第二次应命中缓存
54
- const calls = spy.mock.calls.filter((c) => c[0] === obj);
55
- expect(calls).toHaveLength(1);
56
- } finally {
57
- spy.mockRestore();
58
- }
59
- });
60
-
61
- it("pretty 缩进锚定:indent=2 与 formatSchemaInstruction 渲染同源", () => {
62
- const out = stringifySchemaCached({ type: "object" }, "pretty");
63
- expect(out).toBe('{\n "type": "object"\n}');
64
- });
65
-
66
- // [review 修复] TS lib 盲区回归:schema 含 toJSON: () => undefined 钩子时
67
- // JSON.stringify 运行时返回 undefined,违反声明的 string 返回类型——现 fail-loud
68
- // 抛含恢复指引的错误,不静默返回 undefined / 垃圾串。
69
- it("[review 修复] schema 含 toJSON: () => undefined → 抛含恢复指引的错误(compact / pretty)", () => {
70
- const bad = { type: "object", toJSON: () => undefined };
71
- expect(() => stringifySchemaCached(bad, "compact")).toThrowError(
72
- /stringifySchemaCached: JSON\.stringify returned undefined.*Recovery:/s,
73
- );
74
- expect(() => stringifySchemaCached(bad, "pretty")).toThrowError(
75
- /toJSON hook returning undefined.*Recovery:/s,
76
- );
77
- // 正常 schema 不受影响(toJSON 返回合法值时按其返回值序列化)
78
- const good = { type: "object", toJSON: () => ({ type: "string" }) };
79
- expect(stringifySchemaCached(good, "compact")).toBe('{"type":"string"}');
80
- });
81
- });
@@ -1,13 +0,0 @@
1
- // src/shared/agent-event.ts
2
- //
3
- // AgentEvent 类型唯一出口(两包合并后 import 收口)。
4
- //
5
- // 合并前 AgentEvent 分别定义在 execution/types.ts(subagents 侧)和
6
- // orchestration/live/types.ts(workflow 侧)——两份定义完全一致但独立维护。
7
- // 合并后本文件是单一 source of truth——re-export execution/types.ts 的 AgentEvent,
8
- // orchestration 层通过本文件引用(替代 orchestration/live/types.ts 的旧副本)。
9
- //
10
- // wave-3 删 orchestration/live/types.ts 后,AgentEvent 的唯一定义在 execution/types.ts。
11
- // 本 re-export 保持「shared/ 是类型共享层」的架构约定。
12
-
13
- export type { AgentEvent } from "../execution/types.ts";
@@ -1,57 +0,0 @@
1
- /**
2
- * agentRef / workflowRef 统一路径解析(S2)。
3
- *
4
- * 设计(agent-ref-path-redesign D1):资源引用唯一形态 = 绝对路径。
5
- * - agentRef → .md 文件绝对路径(注入段 <available_subagents> 的 <location>)
6
- * - workflowRef → .js 文件绝对路径(注入段 <available_workflows> 的 <location>)
7
- * - 支持 `~/` 前缀展开(homedir);相对路径不认(注入段给绝对路径,模型照抄零歧义)
8
- *
9
- * 名字不再是引用——只是注入段展示标签。执行侧拿到引用后一律 normalizeRef →
10
- * 文件加载(AgentRegistry.loadByPath / WorkflowScriptRegistry.getPath)。
11
- */
12
- import { homedir } from "node:os";
13
- import { isAbsolute, join } from "node:path";
14
-
15
- /** home 目录简写前缀(`~/`),展开为 homedir 绝对路径。 */
16
- const HOME_DIR_PREFIX = "~/";
17
-
18
- /**
19
- * 归一化资源引用:~ 展开 + 绝对路径校验。
20
- *
21
- * @param ref 原始引用(注入段 location / 工具参数值)
22
- * @param ext 期望扩展名(如 ".md" / ".js"),不匹配返回 null
23
- * @returns 归一化绝对路径;非法(空/相对路径/扩展名不符)返回 null
24
- */
25
- export function normalizeRef(ref: string, ext?: string): string | null {
26
- const trimmed = ref.trim();
27
- if (!trimmed) return null;
28
-
29
- const expanded = trimmed.startsWith(HOME_DIR_PREFIX)
30
- ? join(homedir(), trimmed.slice(HOME_DIR_PREFIX.length))
31
- : trimmed;
32
- if (!isAbsolute(expanded)) return null; // 相对路径无基准(注入段给绝对路径)
33
-
34
- if (ext !== undefined && !expanded.endsWith(ext)) return null;
35
- return expanded;
36
- }
37
-
38
- /** agentRef 扩展名。 */
39
- export const AGENT_REF_EXT = ".md";
40
- /** workflowRef 扩展名。 */
41
- export const WORKFLOW_REF_EXT = ".js";
42
-
43
- /**
44
- * agent ref 的显示名:basename + 去 .md 扩展名(`/a/b/worker.md` → `worker`)。
45
- *
46
- * agentRef 是绝对路径,UI 显示层(TUI tool block 标题 / list / 完成通知、GUI list item /
47
- * pending 通知 name)统一经本函数取短名,避免长路径挤占显示宽度。数据层不动——
48
- * record.agent / env 注入(PI_SUBAGENT_AGENT)/ 持久化 / LLM 通知文本保持完整路径。
49
- *
50
- * 非路径值(DEFAULT_AGENT_NAME "general-purpose")与无 .md 后缀的值原样返回。
51
- * 手动 split(/[\\/]) 而非 path.basename:跨平台统一(macOS 的 path.basename
52
- * 不切 Windows `\` 分隔符,反之类推),且本模块避免引入平台分支。
53
- */
54
- export function displayAgentName(ref: string): string {
55
- const base = ref.split(/[\\/]/).pop() ?? ref;
56
- return base.endsWith(AGENT_REF_EXT) ? base.slice(0, -AGENT_REF_EXT.length) : base;
57
- }
@@ -1,261 +0,0 @@
1
- /**
2
- * Meta Parser — 资源元数据统一解析器(v5 §4.2 / IF1 + IF2)
3
- *
4
- * 两个变体,职责分离(R8-F1:discovery 的 fail-safe null 与 generate 的 linePos 需求互斥,
5
- * 单一函数无法兼顾):
6
- * - parseResourceMeta(IF1,discovery 用):fail-safe,任何失败返 null,不抛。
7
- * 供 config-loader / registry / 两 injector / agent-registry 调用(4 parser 收敛为 1)。
8
- * - parseResourceMetaDetailed(IF2,generate 闭环用):失败返 {ok:false, error, linePos},
9
- * linePos 取自 eemeli/yaml YAMLParseError.linePos[0]([P-yaml] 探针实测:
10
- * e.linePos 是 [start,end] 数组,取 [0] 作起止点),供 actionGenerate 报行列给 LLM 自纠正。
11
- *
12
- * 格式(v5 §7 / DM4):
13
- * - workflow (.js):块注释 `/* @pi-meta <YAML> * /`(单星,非 JSDoc),WORKFLOW_META_RE 提取。
14
- * - agent (.md):frontmatter `--- <YAML> ---`,FRONTMATTER_RE 提取。
15
- * - 无 legacy fallback(D1):const meta 旧格式 → extractBlock 取不到块 → null。
16
- *
17
- * [P-yaml] 探针已验证:eemeli/yaml 2.9.0 的 YAMLParseError.linePos = [{line,col},{line,col}]。
18
- *
19
- * exec-review 修复(major-1 + minor-2..8):
20
- * - 正则闭合符(星斜杠)必须独占行首,防止 YAML 正文里中途出现的星斜杠(如 usage 块标量
21
- * 或 patternProperties 正则)截断块致 parameters 等字段静默丢失(§2.3 failure-A 同形态)。
22
- * - typecheckMeta 严格化:kind 专属字段不可串类(workflow 不许 examples、agent 不许 phases),
23
- * description 必填,phase detail 非字符串/parameters 非对象均 reject(消除「静默丢弃非法字段」)。
24
- * - 区分「未找到块」(undefined) 与「块为空」(""),IF2 给可操作错误。
25
- * - FRONTMATTER_RE 兼容 CRLF。
26
- *
27
- * 层归属:shared(L2 统一解析器)。
28
- */
29
-
30
- import { parse as parseYaml } from "yaml";
31
-
32
- import type {
33
- AgentMeta,
34
- ResourceKind,
35
- ResourceMeta,
36
- RoutingExample,
37
- WorkflowMeta,
38
- } from "./resource-meta.ts";
39
-
40
- // ── 格式提取正则 ──────────────────────────────────────────────
41
-
42
- /**
43
- * workflow @pi-meta 块注释:单星块注释(非 JSDoc `/**`),内容为 YAML。
44
- * 闭合符(星斜杠)必须独占行首、列 0——防止 YAML 正文里中途出现的星斜杠(如 usage 块标量
45
- * 内的 see-星斜杠-for、或 patternProperties 正则含星后接斜杠)截断块致后续字段静默丢失(major-1)。
46
- * 格式规范要求闭合符在列 0(v5 §7),故列 0 闭合不损失合法用例。
47
- */
48
- const WORKFLOW_META_RE = /\/\*\s*@pi-meta\s*\n([\s\S]*?)\n\*\//;
49
-
50
- /** agent frontmatter:标准 YAML frontmatter,兼容 CRLF(minor-7)。 */
51
- const FRONTMATTER_RE = /---\r?\n([\s\S]*?)\r?\n---/;
52
-
53
- /**
54
- * 按资源种类取 meta 块文本(YAML 体)。
55
- * @returns 未匹配返 undefined;匹配返字符串(可能为空 "")——调用方据 undefined 区分「未找到」。
56
- */
57
- function extractBlock(content: string, kind: ResourceKind): string | undefined {
58
- const re = kind === "workflow" ? WORKFLOW_META_RE : FRONTMATTER_RE;
59
- return re.exec(content)?.[1];
60
- }
61
-
62
- // ── 类型校验(手写,非 ajv;meta 结构简单)──────────────────
63
-
64
- function isNonEmptyString(v: unknown): v is string {
65
- return typeof v === "string" && v.length > 0;
66
- }
67
- function isString(v: unknown): v is string {
68
- return typeof v === "string";
69
- }
70
- function isPlainObject(v: unknown): v is Record<string, unknown> {
71
- return typeof v === "object" && v !== null && !Array.isArray(v);
72
- }
73
-
74
- /**
75
- * 把 parseYaml 结果(unknown)校验为类型化 ResourceMeta,失败返 null(语义非法,非语法错)。
76
- * 严格化(exec-review minor-2..5):kind 专属字段不可串类、description 必填、
77
- * phase detail 非字符串/parameters 非对象均 reject(消除「静默丢弃非法字段」)。
78
- */
79
- function typecheckMeta(raw: unknown, kind: ResourceKind): ResourceMeta | null {
80
- if (!isPlainObject(raw)) return null;
81
- const o = raw;
82
-
83
- // 公共必填:name 非空字符串、description 必须是字符串(minor-3:缺 description reject)
84
- if (!isNonEmptyString(o.name)) return null;
85
- if (!isString(o.description)) return null;
86
- const when = isString(o.when) ? o.when : undefined;
87
- const notFor = isString(o.notFor) ? o.notFor : undefined;
88
-
89
- if (kind === "workflow") {
90
- // minor-2:agent 专属字段不可出现在 workflow(串类 reject)
91
- if (o.examples !== undefined || o.tools !== undefined || o.model !== undefined || o.engine !== undefined) {
92
- return null;
93
- }
94
- // phases 必填数组,元素为 string | {title:string, detail?:string}
95
- if (!Array.isArray(o.phases)) return null;
96
- const phases: WorkflowMeta["phases"] = [];
97
- for (const p of o.phases) {
98
- if (isString(p)) {
99
- phases.push(p);
100
- } else if (isPlainObject(p) && isNonEmptyString(p.title)) {
101
- // minor-4:detail 存在但非字符串 → reject(不再静默丢弃)
102
- if (p.detail !== undefined && !isString(p.detail)) return null;
103
- phases.push(isString(p.detail) ? { title: p.title, detail: p.detail } : { title: p.title });
104
- } else {
105
- return null;
106
- }
107
- }
108
- // minor-5:parameters 存在但非 plain object → reject(不再静默当 undefined)
109
- const parameters = o.parameters;
110
- if (parameters !== undefined && !isPlainObject(parameters)) return null;
111
- const usage = isString(o.usage) ? o.usage : undefined;
112
-
113
- const meta: WorkflowMeta = {
114
- kind: "workflow",
115
- name: o.name,
116
- description: o.description,
117
- phases,
118
- ...(parameters !== undefined ? { parameters: parameters as Record<string, unknown> } : {}),
119
- ...(usage !== undefined ? { usage } : {}),
120
- ...(when !== undefined ? { when } : {}),
121
- ...(notFor !== undefined ? { notFor } : {}),
122
- };
123
- return meta;
124
- }
125
-
126
- // kind === "agent"
127
- // minor-2:workflow 专属字段不可出现在 agent(串类 reject)
128
- if (o.phases !== undefined || o.parameters !== undefined || o.usage !== undefined) return null;
129
- let examples: RoutingExample[] | undefined;
130
- if (o.examples !== undefined) {
131
- if (!Array.isArray(o.examples)) return null;
132
- const exs: RoutingExample[] = [];
133
- for (const e of o.examples) {
134
- if (
135
- isPlainObject(e) &&
136
- isString(e.match) &&
137
- isString(e.action) &&
138
- typeof e.positive === "boolean"
139
- ) {
140
- exs.push({ match: e.match, action: e.action, positive: e.positive });
141
- } else {
142
- return null;
143
- }
144
- }
145
- examples = exs;
146
- }
147
- let tools: string[] | undefined;
148
- if (o.tools !== undefined) {
149
- if (Array.isArray(o.tools)) {
150
- if (!o.tools.every(isString)) return null;
151
- tools = o.tools as string[];
152
- } else if (isString(o.tools)) {
153
- // 兼容 agent .md 的逗号分隔字符串约定(如 `tools: read, bash, grep`)
154
- const parts = o.tools.split(",").map((s) => s.trim()).filter(Boolean);
155
- tools = parts.length > 0 ? parts : undefined;
156
- } else {
157
- return null;
158
- }
159
- }
160
- const model = isString(o.model) ? o.model : undefined;
161
- const engine = isString(o.engine) ? o.engine : undefined;
162
-
163
- const meta: AgentMeta = {
164
- kind: "agent",
165
- name: o.name,
166
- description: o.description,
167
- ...(examples !== undefined ? { examples } : {}),
168
- ...(tools !== undefined ? { tools } : {}),
169
- ...(model !== undefined ? { model } : {}),
170
- ...(engine !== undefined ? { engine } : {}),
171
- ...(when !== undefined ? { when } : {}),
172
- ...(notFor !== undefined ? { notFor } : {}),
173
- };
174
- return meta;
175
- }
176
-
177
- // ── IF1: parseResourceMeta(discovery,fail-safe null)─────────────────
178
-
179
- /**
180
- * 统一 meta 解析入口(discovery 用)。仅认新格式,无 legacy fallback。
181
- * 任何失败(缺块 / YAML 语法错 / 类型校验失败)→ return null(不抛)。
182
- * discovery fail-safe:单文件解析失败仅让该资源 available=false,不阻塞其他资源。
183
- */
184
- export function parseResourceMeta(
185
- content: string,
186
- kind: ResourceKind,
187
- ): ResourceMeta | null {
188
- const block = extractBlock(content, kind);
189
- if (block === undefined) return null;
190
- try {
191
- const raw = parseYaml(block);
192
- return typecheckMeta(raw, kind);
193
- } catch {
194
- return null;
195
- }
196
- }
197
-
198
- /** 从 eemeli/yaml 拋错提取 linePos 起点(类型守卫,避免 unsafe cast)。[P-yaml] 实测 e.linePos = [{line,col},{line,col}]。*/
199
- function getYamlLinePos(e: unknown): { line: number; col: number } | undefined {
200
- if (e !== null && typeof e === "object" && "linePos" in e) {
201
- const lp = (e as Record<string, unknown>).linePos;
202
- if (Array.isArray(lp) && lp.length > 0) {
203
- const first = lp[0];
204
- if (first !== null && first !== undefined && typeof first === "object"
205
- && "line" in first && "col" in first) {
206
- const f = first as Record<string, unknown>;
207
- if (typeof f["line"] === "number" && typeof f["col"] === "number") {
208
- return { line: f["line"], col: f["col"] };
209
- }
210
- }
211
- }
212
- }
213
- return undefined;
214
- }
215
-
216
- // ── IF2: parseResourceMetaDetailed(generate 闭环,返 linePos)─────────
217
-
218
- export type DetailedResult =
219
- | { ok: true; meta: ResourceMeta }
220
- | { ok: false; error: string; linePos?: { line: number; col: number } };
221
-
222
- /**
223
- * generate 闭环专用。失败时返回 error + linePos(取自 eemeli/yaml YAMLParseError.linePos[0]),
224
- * 供 actionGenerate 报「生成 YAML 错在 line X col Y」给 LLM 自纠正(ERR4)。
225
- * discovery 不用此(保持 fail-safe null)。
226
- *
227
- * [P-yaml] 探针实测:e.linePos 是 [{line,col},{line,col}](start+end),取 [0] 作起点。
228
- *
229
- * minor-6:区分「未找到块」(undefined) 与「块为空/非法」(""),给可操作错误。
230
- * minor-8:typecheckMeta 包进 try(与 IF1 对称,防御 typecheck 未来抛错)。
231
- */
232
- export function parseResourceMetaDetailed(
233
- content: string,
234
- kind: ResourceKind,
235
- ): DetailedResult {
236
- const block = extractBlock(content, kind);
237
- if (block === undefined) {
238
- return { ok: false, error: "未找到 meta 块(缺少 /* @pi-meta */ 或 frontmatter,或闭合 */ 不在行首)" };
239
- }
240
- let raw: unknown;
241
- try {
242
- raw = parseYaml(block);
243
- } catch (e) {
244
- // eemeli/yaml YAMLParseError:e.linePos = [{line,col},{line,col}]([P-yaml] 实测)
245
- const linePos = getYamlLinePos(e);
246
- return {
247
- ok: false,
248
- error: e instanceof Error ? e.message.split("\n")[0] : String(e),
249
- ...(linePos !== undefined ? { linePos } : {}),
250
- };
251
- }
252
- try {
253
- const meta = typecheckMeta(raw, kind);
254
- if (!meta) {
255
- return { ok: false, error: "meta 类型校验失败(缺 name/description、phases 非法、kind 字段串类或可选字段类型错)" };
256
- }
257
- return { ok: true, meta };
258
- } catch (e) {
259
- return { ok: false, error: `meta 类型校验异常: ${e instanceof Error ? e.message : String(e)}` };
260
- }
261
- }