@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
package/src/index.ts CHANGED
@@ -20,37 +20,50 @@ import type { BeforeAgentStartEvent, ExtensionAPI, ExtensionContext, SessionComp
20
20
  import { getAgentDir } from "@earendil-works/pi-coding-agent";
21
21
  import { getLogger, setPiHandle } from "@zhushanwen/pi-extension-logger";
22
22
 
23
- import { bestEffort } from "./execution/best-effort.ts";
23
+ // ═══ core 宿主端口接线(subagent-core 包抽离 u0-wire;实现见 src/host/pi-host.ts) ═══
24
+ import { configureCore } from "@zhushanwen/subagent-core/core/host-services.ts";
25
+ import { configureNotifyDomain } from "@zhushanwen/subagent-core/core/notify-ports.ts";
26
+ import { createPiHostServices, createPiNotifyDomainPorts } from "./host/pi-host.ts";
27
+
28
+ import { oncePerProcess } from "@zhushanwen/pi-ext-guards";
29
+ import { bestEffort } from "@zhushanwen/subagent-core/execution/best-effort.ts";
24
30
  // ═══ execution/ 层(subagents 核心 + 运行时) ═══
25
- import { getOrCreateChannelRegistry } from "./execution/channel-registry-access.ts";
26
- import { DialogGlobalQueue } from "./execution/dialog-queue.ts";
31
+ import { getOrCreateChannelRegistry } from "@zhushanwen/subagent-core/execution/channel-registry-access.ts";
32
+ import { DialogGlobalQueue } from "@zhushanwen/subagent-core/execution/dialog-queue.ts";
33
+ // [engine-awareness U3] 全局 config 三态读取(检测 poll 与 session_start 基线共用)
34
+ import { readGlobalConfig } from "@zhushanwen/subagent-core/execution/config.ts";
27
35
  // [U7] 引擎列表状态文件(registry → engines.json,GUI 引擎选择器数据源)
28
- import { syncEnginesFile } from "./execution/engine/engine-discovery.ts";
36
+ import { syncEnginesFile } from "@zhushanwen/subagent-core/execution/engine/engine-discovery.ts";
29
37
  // [U7] 引擎模型段注入(defaultEngine 非 pi 时 system prompt 补 <available_<engine>_models>)
30
- import { buildEngineModelsPromptAppend } from "./execution/engine/model-prompt.ts";
38
+ // [engine-awareness U3] 补恒在状态段 <current_subagent_engine>(D6,pi 引擎也声明)
39
+ import { buildEngineModelsPromptAppend, buildSubagentEngineSection } from "@zhushanwen/subagent-core/execution/engine/model-prompt.ts";
31
40
  // [P1 引擎接线] 组合根登记 'pi' 引擎进 registry(引擎获取统一经 getEngine,缺省 id 'pi')
32
- import { registerPiEngine } from "./execution/engine/engines/pi/registration.ts";
41
+ import { registerPiEngine } from "@zhushanwen/subagent-core/execution/engine/engines/pi/registration.ts";
33
42
  // [P3 引擎接线] 组合根登记 'zcode' 引擎(spawn 单轮模式;engineDataDir 默认走
34
43
  // common/data-dir SSOT,见 engines/zcode/registration.ts)
35
- import { registerZcodeEngine } from "./execution/engine/engines/zcode/registration.ts";
36
- import { createUiRequestHandlerForMode } from "./execution/ui-request-handler-factory.ts";
44
+ import { registerZcodeEngine } from "@zhushanwen/subagent-core/execution/engine/engines/zcode/registration.ts";
45
+ import { createUiRequestHandlerForMode } from "@zhushanwen/subagent-core/execution/ui-request-handler-factory.ts";
37
46
  import {
38
47
  getModelConfigService,
39
48
  ModelConfigService,
40
49
  setModelConfigService,
41
- } from "./execution/model-config-service.ts";
42
- import { bindNotifyLedgerHost, getBoundNotifyLedger, type NotifyLedgerHost } from "./execution/notify-ledger.ts";
43
- import { IDENTITY_CUSTOM_TYPE, type SubagentIdentityData } from "./execution/session-reconstructor.ts";
44
- import type { ExecutionMode, SubagentRecord } from "./execution/types.ts";
45
- import { maybeCleanupExpiredSessionFiles } from "./execution/session-file-gc.ts";
50
+ } from "@zhushanwen/subagent-core/execution/model-config-service.ts";
51
+ import { bindNotifyLedgerHost, getBoundNotifyLedger, type NotifyLedgerHost } from "@zhushanwen/subagent-core/execution/notify-ledger.ts";
52
+ import { IDENTITY_CUSTOM_TYPE, type SubagentIdentityData } from "@zhushanwen/subagent-core/execution/session-reconstructor.ts";
53
+ import type { ExecutionMode } from "@zhushanwen/subagent-core/execution/types.ts";
54
+ import { maybeCleanupExpiredSessionFiles } from "@zhushanwen/subagent-core/execution/session-file-gc.ts";
46
55
  import {
47
56
  getSubagentService,
48
57
  setSubagentService,
49
58
  SubagentService,
50
- } from "./execution/subagent-service.ts";
51
- import { killAllSpawnedChildren } from "./execution/session-runner.ts";
52
- import { SubprocessAgentRunner } from "./execution/subprocess-agent-runner.ts";
53
- import { WorktreeManager } from "./execution/worktree-manager.ts";
59
+ } from "@zhushanwen/subagent-core/execution/subagent-service.ts";
60
+ import { killAllSpawnedChildren } from "@zhushanwen/subagent-core/execution/session-runner.ts";
61
+ import { SubprocessAgentRunner } from "@zhushanwen/subagent-core/execution/subprocess-agent-runner.ts";
62
+ import { WorktreeManager } from "@zhushanwen/subagent-core/execution/worktree-manager.ts";
63
+ // [engine-awareness U3] per-turn 引擎检测编排(D1/D1b/D2/D3/D5);normalizeEngineId
64
+ // 单一权威源在 core registry(原经 engine-awareness 再导出,导入面已折叠直连)
65
+ import { normalizeEngineId } from "@zhushanwen/subagent-core/execution/engine/registry.ts";
66
+ import { runEngineAwarenessTurn } from "./injectors/engine-awareness.ts";
54
67
  import { setupModelListInjector } from "./injectors/model-list-injector.ts";
55
68
  import { setupSubagentListInjector } from "./injectors/subagent-list-injector.ts";
56
69
  import { setupWorkflowListInjector } from "./injectors/workflow-list-injector.ts";
@@ -63,20 +76,21 @@ import { registerSubagentTool } from "./interface/subagent-tool.ts";
63
76
  import { registerSubagentsCommand } from "./interface/subagents.ts";
64
77
  import { registerWorkflowTool } from "./interface/tool-workflow.ts";
65
78
  import { registerWorkflowScriptTool } from "./interface/tool-workflow-script.ts";
66
- import { JsonlRunStore } from "./orchestration/jsonl-run-store.ts";
67
- import { clearSkillPathCache } from "./orchestration/skill-discovery.ts";
79
+ import { JsonlRunStore } from "./jsonl-run-store.ts";
80
+ import { clearSkillPathCache } from "@zhushanwen/subagent-core/orchestration/skill-discovery.ts";
68
81
  // ═══ orchestration/ 层(workflow engine + infra) ═══
69
- import type { LauncherDeps } from "./orchestration/launcher.ts";
70
- import { executeNestedWorkflow, runAndWait, type WorkflowRunResult } from "./orchestration/launcher.ts";
82
+ import type { LauncherDeps } from "@zhushanwen/subagent-core/orchestration/launcher.ts";
83
+ import { executeNestedWorkflow, runAndWait, type WorkflowRunResult } from "@zhushanwen/subagent-core/orchestration/launcher.ts";
71
84
  import {
72
85
  evictDoneRunsBeyondCap,
73
86
  MAX_RETAINED_DONE_RUNS,
87
+ recoverCrashedRuns,
74
88
  scheduleTimeBudget,
75
89
  terminateRunningRuns,
76
- } from "./orchestration/lifecycle.ts";
77
- import type { WorkflowRun } from "./orchestration/models/workflow-run.ts";
78
- import { WorkerHostImpl } from "./orchestration/worker-host.ts";
79
- import { WorkflowScriptRegistryImpl } from "./orchestration/workflow-script-registry-impl.ts";
90
+ } from "@zhushanwen/subagent-core/orchestration/lifecycle.ts";
91
+ import type { WorkflowRun } from "@zhushanwen/subagent-core/orchestration/models/workflow-run.ts";
92
+ import { WorkerHostImpl } from "@zhushanwen/subagent-core/orchestration/worker-host.ts";
93
+ import { WorkflowScriptRegistryImpl } from "@zhushanwen/subagent-core/orchestration/workflow-script-registry-impl.ts";
80
94
 
81
95
  // ── pi.__workflowRun 类型扩展(D-8 签名) ─────────────────
82
96
 
@@ -96,42 +110,6 @@ declare module "@earendil-works/pi-coding-agent" {
96
110
  // 模块级 logger(setPiHandle 注入后自动走 appendEntry)
97
111
  const logger = getLogger("subagents");
98
112
 
99
- // ── subagent 状态快照格式化 ──
100
- //
101
- // [v4 A-6] before_agent_start 注入 hook 已删(活跃 subagent 清单改由 agent 按需调
102
- // action:'list' 拉取,消除每 loop 注入的上下文税与盲点)。本函数保留为纯格式化工具:
103
- // before-agent-start-injection / parent-child-matrix 测试覆盖其正确性,未来 list
104
- // 视图或其他注入点可复用。
105
-
106
- /** 活跃 subagent 数量上限(超过截断显示)。 */
107
- const MAX_STATUS_INJECTION = 10;
108
-
109
- /**
110
- * 将活跃 subagent record 格式化为一行一条的快照文本。
111
- *
112
- * 格式:
113
- * [subagent-status] N active subagents:
114
- * - sa-xxx (slug): running, rounds 0
115
- * - sa-yyy (slug): idle, rounds 3
116
- * +2 more, use action:'list'
117
- *
118
- * @param records 已筛选的活跃 record(running + idle)
119
- */
120
- export function formatSubagentStatusSnapshot(records: SubagentRecord[]): string {
121
- const lines = [`[subagent-status] ${records.length} active subagent${records.length === 1 ? "" : "s"}:`];
122
- const shown = records.slice(0, MAX_STATUS_INJECTION);
123
- for (const r of shown) {
124
- const slug = r.slug || r.agent;
125
- const roundPart = r.round !== undefined && r.round > 0 ? `, rounds ${r.round}` : "";
126
- lines.push(`- ${r.id} (${slug}): ${r.status}${roundPart}`);
127
- }
128
- const remaining = records.length - MAX_STATUS_INJECTION;
129
- if (remaining > 0) {
130
- lines.push(`+${remaining} more, use action:'list'`);
131
- }
132
- return lines.join("\n");
133
- }
134
-
135
113
  // ═══ [V2 决策 7 防线 i] process 级 shutdown hook ═══
136
114
  //
137
115
  // session_shutdown 是 pi 的 async hook,进程被 SIGTERM/SIGINT 强杀或崩溃时来不及
@@ -170,6 +148,14 @@ export default function subagentsWorkflowExtension(pi: ExtensionAPI): void {
170
148
  // 的 getLogger("subagents") 也能走 appendEntry。
171
149
  setPiHandle(pi);
172
150
 
151
+ // [u0-wire] core 宿主端口接线:本波端口尚无 core 消费方(消费切换在 u0-log /
152
+ // u0-data-discovery / u0-notify 波次),接线本身零行为变化。紧随 setPiHandle——
153
+ // core log 桥接走 pi-extension-logger,其 pi handle 先注入则配置完成即桥接链路
154
+ // 完整;且先于任何可能消费 core 端口的初始化逻辑(引擎登记等)。缺省态若被消费,
155
+ // dataRoot 抛 core_host_not_configured(§3.4),接线后不再可达。
156
+ configureCore(createPiHostServices());
157
+ configureNotifyDomain(createPiNotifyDomainPorts());
158
+
173
159
  // [P1 引擎接线] 组合根登记缺省引擎:进程级 SubagentService 单例(session_start 注入)
174
160
  // 经 registry 以 'pi' 暴露——引擎获取从此统一走 getEngine(DEFAULT_ENGINE_ID),上层
175
161
  // 不再硬编码「spawn pi」。幂等(registerEngine 覆盖语义),工厂惰性解析服务单例。
@@ -230,12 +216,10 @@ export default function subagentsWorkflowExtension(pi: ExtensionAPI): void {
230
216
  }
231
217
  }
232
218
 
233
- // resources_discover:不再注入额外 skill 目录(ADR-031 废弃 discovery.json)。
234
- // pi 核心 auto-discovery 已覆盖 .agents/skills 等标准目录,子 session 的
235
- // --skill 由 agent({skill}) 调用方显式传入,无需 extension 额外补充。
236
- pi.on("resources_discover", (_event, _ctx: ExtensionContext) => {
237
- return {};
238
- });
219
+ // resources_discover:不再注册 handler(v4 决策:不再注入额外 skill 目录,
220
+ // ADR-031 废弃 discovery.json)。pi 核心 auto-discovery 已覆盖 .agents/skills
221
+ // 等标准目录,子 session 的 --skill 由 agent({skill}) 调用方显式传入,无需
222
+ // extension 额外补充。
239
223
 
240
224
  // ════════════════════════════════════════════════════════════
241
225
  // workflow 域:tools + command + pi.__workflowRun + state
@@ -267,6 +251,10 @@ export default function subagentsWorkflowExtension(pi: ExtensionAPI): void {
267
251
  * workflow 域启动时 fail-fast,避免后续 store.save 再次失败导致 run 状态不落地。
268
252
  * subagent 域不依赖 store,不受此标志影响。 */
269
253
  storeHealthy: boolean;
254
+ /** [engine-awareness D1b] 上一次已知默认引擎(session_start 初始化,per-turn 检测
255
+ * diff 基准)。undefined = 初始化时 config 读失败——首 turn 检测遇 undefined
256
+ * 静默基线化,不算变更、不发通知(防首 turn 伪通知)。 */
257
+ lastEngine?: string;
270
258
  }
271
259
  >();
272
260
 
@@ -359,8 +347,9 @@ export default function subagentsWorkflowExtension(pi: ExtensionAPI): void {
359
347
  lsRef.lastSessionId = sessionId;
360
348
 
361
349
  // [U7] 引擎列表同步 engines.json(幂等零写 + fail-safe;组合根注册已在
362
- // extension 工厂体完成,此处 registry 已含全部引擎)
363
- syncEnginesFile(agentDir);
350
+ // extension 工厂体完成,此处 registry 已含全部引擎)。写 agentDir 全局文件属
351
+ // 跨 session 副作用——oncePerProcess 守卫防 factory 二调/handler 累积双跑(u-audit-fix)。
352
+ oncePerProcess("subagent-workflow:sync-engines-file", () => syncEnginesFile(agentDir));
364
353
 
365
354
  // skill 路径两级缓存 session 级失效:pi 同进程可能有多个 session(TUI /new、/fork),
366
355
  // 运行中安装的 skill 需对新 session 可见(含曾 miss 缓存的 undefined 条目与 npm 新装
@@ -505,21 +494,27 @@ export default function subagentsWorkflowExtension(pi: ExtensionAPI): void {
505
494
  setSubagentService(service);
506
495
  }
507
496
 
508
- // S-2: 启动 idle record GC 定时器(30 天 TTL,每小时检查一次)
509
- service.startGcTimer();
497
+ // S-2: 启动 idle record GC 定时器(30 天 TTL,每小时检查一次)。
498
+ // 注册 setInterval 属进程级副作用——oncePerProcess 守卫防双跑(u-audit-fix)。
499
+ oncePerProcess("subagent-workflow:start-gc-timer", () => service.startGcTimer());
510
500
 
511
501
  try {
512
- maybeCleanupExpiredSessionFiles(agentDir, cwd);
502
+ // 递归扫描 <agentDir>/subagents + unlink 超 TTL 跨 session 文件属进程级维护
503
+ // ——oncePerProcess 守卫防双跑(u-audit-fix)。
504
+ oncePerProcess("subagent-workflow:cleanup-expired-session-files", () =>
505
+ maybeCleanupExpiredSessionFiles(agentDir, cwd));
513
506
  } catch (err) {
514
507
  logger.warn("[subagents] expired session file cleanup failed", {
515
508
  reason: err instanceof Error ? err.message : String(err),
516
509
  });
517
510
  }
518
511
 
519
- // ADR-035 启动恢复:扫描 manifest tmp 残留(崩溃打断的 writeManifest 留下),
520
- // 每次 session_start 都调(与上方 maybeCleanupExpiredSessionFiles 一致)。
512
+ // ADR-035 启动恢复:扫描 manifest tmp 残留(崩溃打断的 writeManifest 留下,promote/unlink)。
513
+ // 扫描属进程级维护——oncePerProcess 守卫防双跑(u-audit-fix);第二派发重放首次
514
+ // Promise(结果缓存语义),recovered 计数日志可能重打,无文件副作用。
521
515
  try {
522
- const recovered = await service.recoverManifestTmpFiles();
516
+ const recovered = await oncePerProcess("subagent-workflow:recover-manifest-tmp-files", () =>
517
+ service.recoverManifestTmpFiles());
523
518
  if (recovered.recovered > 0 || recovered.deleted > 0) {
524
519
  logger.warn(`[subagents] manifest tmp recovery: ${recovered.recovered} promoted, ${recovered.deleted} deleted`);
525
520
  }
@@ -530,8 +525,9 @@ export default function subagentsWorkflowExtension(pi: ExtensionAPI): void {
530
525
  }
531
526
 
532
527
  try {
533
- const wtm = new WorktreeManager(agentDir);
534
- await wtm.scan();
528
+ // 孤儿 worktree 清理(git/rm 进程操作 + 注册表/目录扫描)属进程级维护
529
+ // ——oncePerProcess 守卫防双跑(u-audit-fix)。
530
+ await oncePerProcess("subagent-workflow:worktree-scan", () => new WorktreeManager(agentDir).scan());
535
531
  } catch (err) {
536
532
  logger.warn("[subagents] worktree reaper scan failed", {
537
533
  reason: err instanceof Error ? err.message : String(err),
@@ -553,49 +549,30 @@ export default function subagentsWorkflowExtension(pi: ExtensionAPI): void {
553
549
  // resolveIdentity),无需经 state 透传——modelService 是唯一 registry 源。
554
550
 
555
551
  // MF-1: store 健康度跟踪。loadAll 失败 → storeHealthy=false,workflow 域启动时 fail-fast。
552
+ // 崩溃恢复四步(loadAll → failed → save → evict)收口到 core recoverCrashedRuns(D8:
553
+ // 宿主各写一遍正是 failure-mode-B);pending:unregister 经 hooks 外置发射(位置在
554
+ // transition 后、save 前,对齐原内联实现);save 走 store 冷路径(done 绕过去抖)——
555
+ // 冷路径语义在 JsonlRunStore.save 内,不随循环归属转移。loadAll 失败的 fail-fast
556
+ // (storeHealthy=false 停初始化)是宿主职责,core 原样上抛、这里 catch 兜住。
556
557
  let storeHealthy = true;
557
558
  try {
558
- const loaded = await store.loadAll();
559
- for (const run of loaded) {
560
- if (run.state.status === "running") {
561
- run.state.error = "Process killed (kill-9 or crash recovery)";
562
- run.transition("done", "failed");
563
- pi.events.emit("pending:unregister", {
564
- id: run.runId,
565
- reason: "failed",
566
- });
567
- // 恢复终态必须落盘:save 走冷路径(done 绕过去抖)同步写 state 文件 +
568
- // append 终态 workflow-record entry——entry_appended 事件驱动 runtime 派生
569
- // 缓存失效重拉(无 triggerTurn 副作用)。不 save 则 entry/state 双双停留
570
- // running,侧栏永久卡 running。失败仅记日志不阻断其余 run 的恢复(下次
571
- // session_start 重开重试,恢复循环天然幂等)。
572
- try {
573
- await store.save(run);
574
- } catch (err) {
575
- logger.error("[subagent-workflow] kill-9 recovery store.save failed", {
576
- runId: run.runId,
577
- reason: err instanceof Error ? err.message : String(err),
578
- });
579
- }
580
- }
581
- runs.set(run.runId, run);
582
- }
583
- // done run 内存有界性:loadAll 全量重水合后立即裁剪到 K。kill-9 恢复(上方
584
- // running → transition("done","failed"))的 run completedAt 为 transition 时刻
585
- // (当前时间=全局最新)参与排序且必在保留端;多条恢复 run 同 ms completedAt →
586
- // tie 稳定排序。淘汰只 delete runs Map 条目——磁盘 state 文件与
587
- // workflow-state-link 指针条目均不动(历史审计保留);下次 session_start loadAll
588
- // 从指针全量重水合后再次裁剪,该循环每次 session 启动重复且可接受:内存峰值只在
589
- // 启动期,常驻 O(K + 活跃 run)。消除启动峰值需指针 compaction,属 append+replay
590
- // 长期方案问题域,非本范围。
591
- const evicted = evictDoneRunsBeyondCap(runs, MAX_RETAINED_DONE_RUNS);
592
- if (evicted > 0) {
593
- logger.debug("[subagent-workflow] evicted done runs beyond cap after loadAll", {
594
- evicted,
595
- keep: MAX_RETAINED_DONE_RUNS,
596
- sessionId,
597
- });
598
- }
559
+ // 崩溃恢复 loadAll cwd 共享 sessionDir(同 cwd 跨 session 共享)并把 running run
560
+ // failed 落盘——写非本 session 的 run state 文件属跨 session 副作用,oncePerProcess
561
+ // 守卫防双跑(u-audit-fix)。第二派发重放首次 Promise:不再落盘、不再 emit。
562
+ await oncePerProcess(
563
+ "subagent-workflow:recover-crashed-runs",
564
+ () =>
565
+ recoverCrashedRuns(
566
+ store,
567
+ runs,
568
+ "Process killed (kill-9 or crash recovery)",
569
+ {
570
+ onRunRecovered: (payload) => {
571
+ pi.events.emit("pending:unregister", payload);
572
+ },
573
+ },
574
+ ),
575
+ );
599
576
  } catch (err) {
600
577
  // QMF-4 fix: store.loadAll 失败是关键路径错误,workflow 域将未初始化
601
578
  logger.error("[subagent-workflow] store.loadAll failed, workflow domain uninitialized", {
@@ -612,6 +589,13 @@ export default function subagentsWorkflowExtension(pi: ExtensionAPI): void {
612
589
  ctxModel: ctx.model ?? undefined,
613
590
  });
614
591
 
592
+ // [engine-awareness D1b] lastEngine 初始化:构造性同源——单次 reloadGlobalConfig
593
+ // 读取同时刷新 Service 路由缓存与 lastEngine 基准,消灭 initModel 与本处两次独立
594
+ // 读取间的分叉窗口(两读值不一致时检测走 unchanged 分支不 reload,状态段/路由
595
+ // 永停旧值且永不通知)。ok/absent → 归一后的当前引擎;failed → undefined(首 turn
596
+ // 检测静默基线化兜底,此时缓存亦保持不动)。/resume、/fork 同样走 session_start
597
+ // (SR-3),基线天然覆盖。
598
+ const engineRead = modelService.reloadGlobalConfig();
615
599
  sessionState.set(sessionId, {
616
600
  store,
617
601
  runs,
@@ -619,6 +603,8 @@ export default function subagentsWorkflowExtension(pi: ExtensionAPI): void {
619
603
  runner,
620
604
  ctx,
621
605
  storeHealthy,
606
+ lastEngine:
607
+ engineRead.status === "failed" ? undefined : normalizeEngineId(engineRead.config.defaultEngine),
622
608
  });
623
609
  });
624
610
 
@@ -642,15 +628,41 @@ export default function subagentsWorkflowExtension(pi: ExtensionAPI): void {
642
628
  });
643
629
 
644
630
  // ════════════════════════════════════════════════════════════
645
- // [U7] before_agent_start:引擎模型段注入(defaultEngine pi 且引擎实现
646
- // listModels 时追加 <available_<engine>_models>——每 turn 重判 config,改配置
647
- // 后下一 turn 即生效;fail-safe 任何异常不注入不阻塞 agent loop)
631
+ // [U7 + engine-awareness U3] before_agent_start:引擎感知注入(链尾注册,D7——
632
+ // 段内容变化只断 system prompt 尾部 cache 前缀)。
633
+ // per-turn 检测编排(§2.3 数据流):三态 poll config → lastEngine diff →
634
+ // 变更时读取结果先行提交缓存(D2,applyGlobalConfig 纯赋值,本 turn 路由生效)
635
+ // → sendMessage 通知
636
+ // (D3,不设 triggerTurn——P1 探针已证此形态消息进入本 turn LLM 上下文,
637
+ // 证据:真机 pi rpc payload dump + 0.84.4 dist sendMessage→_appendCustomMessage
638
+ // →agent.state.messages.push→createContextSnapshot 调用链)→ 更新 lastEngine。
639
+ // ② 恒在状态段 <current_subagent_engine>(D6)+ 引擎清单段 <available_<engine>_models>。
640
+ // apply 后 getGlobalConfig() 即新值——通知、状态段、路由三处同 turn 对齐(G2)。
641
+ // 段序:状态段在前(文案声明 "listed ... below"),清单段在后;provider models 段
642
+ // 由更早注册的 handler 注入、位于上方。fail-safe 任何异常不注入不阻塞 agent loop。
648
643
  // ════════════════════════════════════════════════════════════
649
- pi.on("before_agent_start", (event: BeforeAgentStartEvent) => {
644
+ pi.on("before_agent_start", (event: BeforeAgentStartEvent, ctx: ExtensionContext) => {
650
645
  try {
651
646
  const service = getModelConfigService();
652
- const append = service === null ? "" : buildEngineModelsPromptAppend(service.getGlobalConfig().defaultEngine);
653
- if (append === "" || typeof event.systemPrompt !== "string") return undefined;
647
+ if (service === null || typeof event.systemPrompt !== "string") return undefined;
648
+ const sid = ctx.sessionManager.getSessionId();
649
+ runEngineAwarenessTurn({
650
+ readConfig: () => readGlobalConfig(getAgentDir()),
651
+ applyRead: (read) => service.applyGlobalConfig(read),
652
+ sendMessage: (message) => {
653
+ // D3:不设 triggerTurn——切换是用户主动行为,无需唤醒 AI 立即行动
654
+ pi.sendMessage(message, {});
655
+ },
656
+ getLastEngine: () => sessionState.get(sid)?.lastEngine,
657
+ setLastEngine: (engine) => {
658
+ const state = sessionState.get(sid);
659
+ if (state) state.lastEngine = engine;
660
+ },
661
+ });
662
+ const defaultEngine = service.getGlobalConfig().defaultEngine;
663
+ const append = [buildSubagentEngineSection(defaultEngine), buildEngineModelsPromptAppend(defaultEngine)]
664
+ .filter((part) => part !== "")
665
+ .join("\n\n");
654
666
  return { systemPrompt: `${event.systemPrompt}\n\n${append}` };
655
667
  } catch {
656
668
  return undefined;
@@ -940,17 +952,8 @@ function getOrCreateDialogQueue(): DialogGlobalQueue {
940
952
  return queue;
941
953
  }
942
954
 
943
- // ============================================================
944
- // Public cross-extension API(channel handler 注册入口)
945
- // ============================================================
946
- //
947
- // 跨扩展消费者(ask-user 等)通过包根 import 注册 channel handler,
948
- // 让 subagent 子进程的 UI 请求(ask_user 等)透传到主进程渲染。
949
- // 重新导出 channel-registry-access 的公开 API——稳定 surface,
950
- // 内部存储实现演进不影响消费者。
951
-
952
- export {
953
- getOrCreateChannelRegistry,
954
- type UiChannelRegistry,
955
- type ChannelHandler,
956
- } from "./execution/channel-registry-access.ts";
955
+ // 跨扩展 channel handler 注册入口已收口到 core 深路径
956
+ // `@zhushanwen/subagent-core/execution/channel-registry-access.ts`
957
+ // (getOrCreateChannelRegistry / UiChannelRegistry / ChannelHandler)。
958
+ // 历史上的包根 re-export 已删:ask-user 等跨扩展消费者经 globalThis 握手
959
+ // (DIALOG_QUEUE_KEY 同款进程级单例),不再经包根 import 消费本模块。