@north-light/crouter 0.3.173 → 0.3.175

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 (674) hide show
  1. package/bin/runtime-selector.mjs +8 -1
  2. package/dist/api/__tests__/{client.test.js → serial/client.test.js} +2 -135
  3. package/dist/api/client.d.ts +12 -21
  4. package/dist/api/client.js +22 -31
  5. package/dist/api/dto/broker-ops.d.ts +158 -0
  6. package/dist/api/dto/broker-ops.js +6 -0
  7. package/dist/api/dto/crons.d.ts +6 -0
  8. package/dist/api/dto/human.d.ts +7 -1
  9. package/dist/api/dto/inbox.d.ts +1 -71
  10. package/dist/api/dto/inbox.js +1 -9
  11. package/dist/api/dto/nodes.d.ts +6 -7
  12. package/dist/api/dto/reviews.d.ts +1 -11
  13. package/dist/api/routes.d.ts +7 -4
  14. package/dist/api/routes.js +8 -5
  15. package/dist/build-root.js +3 -3
  16. package/dist/builtin-memory/04-base-worker.md +1 -4
  17. package/dist/builtin-memory/05-kinds/advisor/00-base.md +1 -5
  18. package/dist/builtin-memory/05-kinds/advisor/01-orchestrator.md +2 -7
  19. package/dist/builtin-memory/05-kinds/design/00-base.md +1 -6
  20. package/dist/builtin-memory/05-kinds/developer/00-base.md +1 -6
  21. package/dist/builtin-memory/05-kinds/explore/00-base.md +1 -4
  22. package/dist/builtin-memory/05-kinds/explore/01-orchestrator.md +1 -2
  23. package/dist/builtin-memory/05-kinds/general/00-base.md +1 -3
  24. package/dist/builtin-memory/05-kinds/plan/00-base.md +1 -6
  25. package/dist/builtin-memory/05-kinds/plan/reviewers/00-base.md +1 -2
  26. package/dist/builtin-memory/05-kinds/plan/reviewers/architecture-fit.md +1 -3
  27. package/dist/builtin-memory/05-kinds/plan/reviewers/code-smells.md +1 -3
  28. package/dist/builtin-memory/05-kinds/plan/reviewers/pattern-consistency.md +1 -3
  29. package/dist/builtin-memory/05-kinds/plan/reviewers/requirements-coverage.md +1 -3
  30. package/dist/builtin-memory/05-kinds/plan/reviewers/security.md +1 -4
  31. package/dist/builtin-memory/05-kinds/review/companion/00-base.md +2 -3
  32. package/dist/builtin-memory/05-kinds/spec/00-base.md +1 -2
  33. package/dist/builtin-memory/advisor/council.md +1 -6
  34. package/dist/builtin-memory/design.md +2 -7
  35. package/dist/builtin-memory/development.md +9 -14
  36. package/dist/builtin-memory/internal/marketplaces.md +2 -6
  37. package/dist/builtin-memory/internal/nodes-and-canvas.md +1 -1
  38. package/dist/builtin-memory/internal/plugins.md +2 -8
  39. package/dist/builtin-memory/internal/storage-tiers.md +1 -2
  40. package/dist/builtin-memory/testing.md +41 -0
  41. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/__tests__/{provider-rotation.test.ts → serial/provider-rotation.test.ts} +27 -179
  42. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/claude-plugin-commands.ts +5 -15
  43. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/frontmatter-rules/index.ts +1 -28
  44. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/memory-slash-commands.ts +43 -88
  45. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/provider-rotation.js +7 -1
  46. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/provider-rotation.ts +9 -1
  47. package/dist/cli.js +2 -2
  48. package/dist/clients/attach/__tests__/attach-remote-readonly.test.js +37 -131
  49. package/dist/clients/attach/__tests__/chat-view-snapshot-ordering.test.js +71 -152
  50. package/dist/clients/attach/__tests__/context-message.test.js +16 -174
  51. package/dist/clients/attach/__tests__/crtr-output.test.js +36 -2069
  52. package/dist/clients/attach/__tests__/diagram.test.js +2 -2
  53. package/dist/clients/attach/__tests__/edit-diff.test.js +0 -4
  54. package/dist/clients/attach/__tests__/file-review-focus.test.js +2 -1
  55. package/dist/clients/attach/__tests__/group-activity.test.js +40 -229
  56. package/dist/clients/attach/__tests__/oauth-dialog-lifecycle.test.js +26 -76
  57. package/dist/clients/attach/__tests__/prompt-preview.test.js +4 -70
  58. package/dist/clients/attach/__tests__/ref-autocomplete.test.js +11 -125
  59. package/dist/clients/attach/__tests__/titled-editor-preview.test.js +14 -205
  60. package/dist/clients/attach/command.d.ts +2 -1
  61. package/dist/clients/attach/command.js +81 -76
  62. package/dist/clients/attach/input/capabilities.d.ts +27 -0
  63. package/dist/clients/attach/input/capabilities.js +96 -0
  64. package/dist/clients/attach/input/controller.d.ts +20 -182
  65. package/dist/clients/attach/input/controller.js +128 -537
  66. package/dist/clients/attach/input/overlay-owner.d.ts +41 -0
  67. package/dist/clients/attach/input/overlay-owner.js +199 -0
  68. package/dist/clients/attach/overlays/file-review.d.ts +0 -4
  69. package/dist/clients/attach/overlays/file-review.js +13 -5
  70. package/dist/clients/attach/overlays/graph.js +2 -10
  71. package/dist/clients/attach/render/chat-view.d.ts +4 -3
  72. package/dist/clients/attach/render/chat-view.js +39 -33
  73. package/dist/clients/attach/render/group-activity.d.ts +1 -0
  74. package/dist/clients/attach/render/group-activity.js +20 -13
  75. package/dist/clients/attach/render/group-recap.js +12 -3
  76. package/dist/clients/attach/session/connection.js +9 -15
  77. package/dist/clients/attach/session/editor-inventory.d.ts +6 -5
  78. package/dist/clients/attach/session/editor-inventory.js +7 -8
  79. package/dist/clients/attach/session/file-links.d.ts +13 -0
  80. package/dist/clients/attach/session/file-links.js +107 -0
  81. package/dist/clients/attach/session/frame.d.ts +3 -0
  82. package/dist/clients/attach/session/frame.js +10 -1
  83. package/dist/clients/attach/session/frames.js +2 -3
  84. package/dist/clients/attach/session/input-wiring.d.ts +4 -1
  85. package/dist/clients/attach/session/input-wiring.js +15 -14
  86. package/dist/clients/attach/session/mouse.d.ts +6 -1
  87. package/dist/clients/attach/session/mouse.js +8 -5
  88. package/dist/clients/attach/session/profile-files.js +18 -12
  89. package/dist/clients/attach/session/reconnect.js +1 -1
  90. package/dist/clients/attach/session/state-sync.js +1 -2
  91. package/dist/clients/attach/session/surface-host.d.ts +3 -2
  92. package/dist/clients/attach/session/surface-host.js +4 -4
  93. package/dist/clients/attach/slash/dispatch.d.ts +8 -31
  94. package/dist/clients/attach/slash/dispatch.js +34 -81
  95. package/dist/clients/attach/viewer.js +820 -860
  96. package/dist/clients/conversation/projection.d.ts +79 -0
  97. package/dist/clients/conversation/projection.js +341 -0
  98. package/dist/clients/inbox/__tests__/serial/inbox-controller.test.js +159 -0
  99. package/dist/clients/inbox/__tests__/serial/mount-panel.test.js +151 -0
  100. package/dist/clients/inbox/controller.d.ts +0 -4
  101. package/dist/clients/inbox/controller.js +0 -2
  102. package/dist/clients/inbox/review/__tests__/review-core.test.js +4 -293
  103. package/dist/clients/inbox/review/__tests__/teardown-notice.test.js +100 -0
  104. package/dist/clients/inbox/review/comments-client.d.ts +3 -2
  105. package/dist/clients/inbox/review/comments-client.js +12 -12
  106. package/dist/clients/inbox/review/companion-pane.d.ts +30 -0
  107. package/dist/clients/inbox/review/companion-pane.js +86 -0
  108. package/dist/clients/inbox/review/document-surface.d.ts +182 -0
  109. package/dist/clients/inbox/review/{document-region.js → document-surface.js} +252 -48
  110. package/dist/clients/inbox/review/frame.js +5 -4
  111. package/dist/clients/inbox/review/launch.d.ts +8 -8
  112. package/dist/clients/inbox/review/launch.js +52 -92
  113. package/dist/clients/inbox/review/nvim.d.ts +2 -0
  114. package/dist/clients/inbox/review/nvim.js +14 -12
  115. package/dist/clients/inbox/review/review-client.d.ts +12 -8
  116. package/dist/clients/inbox/review/review-client.js +46 -35
  117. package/dist/clients/inbox/review-adapter.d.ts +3 -10
  118. package/dist/clients/inbox/review-adapter.js +27 -19
  119. package/dist/clients/inbox/surface.d.ts +0 -4
  120. package/dist/clients/inbox/surface.js +0 -2
  121. package/dist/clients/surfaces/host.d.ts +11 -3
  122. package/dist/commands/__tests__/api-client-cold-start-diagnostic.test.js +7 -34
  123. package/dist/commands/__tests__/human.test.js +11 -322
  124. package/dist/commands/api-client.d.ts +5 -5
  125. package/dist/commands/api-client.js +6 -85
  126. package/dist/commands/canvas-browse.js +3 -29
  127. package/dist/commands/canvas-config.js +1 -1
  128. package/dist/commands/canvas-use.js +3 -3
  129. package/dist/commands/canvas.js +1 -1
  130. package/dist/commands/cron.js +5 -1
  131. package/dist/commands/human/queue.d.ts +0 -4
  132. package/dist/commands/human/queue.js +7 -40
  133. package/dist/commands/memory/list.d.ts +14 -0
  134. package/dist/commands/memory/list.js +35 -31
  135. package/dist/commands/memory/read.d.ts +7 -0
  136. package/dist/commands/memory/read.js +14 -8
  137. package/dist/commands/memory/write.js +13 -12
  138. package/dist/commands/node/bash.d.ts +1 -0
  139. package/dist/commands/node/bash.js +198 -0
  140. package/dist/commands/node/create.d.ts +23 -0
  141. package/dist/commands/node/create.js +207 -0
  142. package/dist/commands/node/inspect.d.ts +2 -0
  143. package/dist/commands/node/inspect.js +302 -0
  144. package/dist/commands/node/lifecycle.d.ts +4 -0
  145. package/dist/commands/node/lifecycle.js +415 -0
  146. package/dist/commands/node/message.d.ts +1 -0
  147. package/dist/commands/node/message.js +164 -0
  148. package/dist/commands/node/pyramid.d.ts +2 -0
  149. package/dist/commands/node/pyramid.js +79 -0
  150. package/dist/commands/node/subscription.d.ts +1 -0
  151. package/dist/commands/node/subscription.js +82 -0
  152. package/dist/commands/node/wait.d.ts +1 -0
  153. package/dist/commands/node/wait.js +159 -0
  154. package/dist/commands/node-lifecycle-revive.js +10 -57
  155. package/dist/commands/node.d.ts +0 -42
  156. package/dist/commands/node.js +11 -2065
  157. package/dist/commands/search.js +1 -1
  158. package/dist/commands/surface/node/cycle.d.ts +1 -0
  159. package/dist/commands/surface/node/cycle.js +83 -0
  160. package/dist/commands/surface/node/focus.d.ts +1 -0
  161. package/dist/commands/surface/node/focus.js +67 -0
  162. package/dist/commands/surface/node/id.d.ts +1 -0
  163. package/dist/commands/surface/node/id.js +38 -0
  164. package/dist/commands/surface/node/pin.d.ts +1 -0
  165. package/dist/commands/surface/node/pin.js +42 -0
  166. package/dist/commands/surface/node/placement.d.ts +46 -0
  167. package/dist/commands/surface/node/placement.js +124 -0
  168. package/dist/commands/surface-node.js +4 -1
  169. package/dist/commands/surface-reload.js +1 -2
  170. package/dist/commands/surface-tmux-spread.js +1 -1
  171. package/dist/commands/surface.js +5 -20
  172. package/dist/commands/sys/__tests__/setup-core.test.js +18 -271
  173. package/dist/commands/sys/config.js +6 -6
  174. package/dist/commands/sys/logs.js +1 -1
  175. package/dist/commands/sys/panels/broker-limits-panel.d.ts +17 -0
  176. package/dist/commands/sys/panels/broker-limits-panel.js +104 -0
  177. package/dist/commands/sys/panels/dependencies-panel.d.ts +14 -0
  178. package/dist/commands/sys/panels/dependencies-panel.js +80 -0
  179. package/dist/commands/sys/panels/keybindings-panel.d.ts +56 -0
  180. package/dist/commands/sys/panels/keybindings-panel.js +703 -0
  181. package/dist/commands/sys/panels/keys-panel.d.ts +16 -0
  182. package/dist/commands/sys/panels/keys-panel.js +60 -0
  183. package/dist/commands/sys/panels/models-panel.d.ts +77 -0
  184. package/dist/commands/sys/panels/models-panel.js +647 -0
  185. package/dist/commands/sys/panels/panel.d.ts +45 -0
  186. package/dist/commands/sys/panels/panel.js +137 -0
  187. package/dist/commands/sys/panels/plugins-panel.d.ts +16 -0
  188. package/dist/commands/sys/panels/plugins-panel.js +80 -0
  189. package/dist/commands/sys/panels/prefs-panel.d.ts +21 -0
  190. package/dist/commands/sys/panels/prefs-panel.js +85 -0
  191. package/dist/commands/sys/panels/provider-panel.d.ts +62 -0
  192. package/dist/commands/sys/panels/provider-panel.js +538 -0
  193. package/dist/commands/sys/settings-shell.d.ts +55 -0
  194. package/dist/commands/sys/settings-shell.js +400 -0
  195. package/dist/commands/sys/settings.d.ts +2 -0
  196. package/dist/commands/sys/settings.js +31 -0
  197. package/dist/commands/sys/setup-core.d.ts +3 -33
  198. package/dist/commands/sys/setup-core.js +27 -78
  199. package/dist/commands/sys/setup-settings-runner.d.ts +24 -0
  200. package/dist/commands/sys/setup-settings-runner.js +63 -0
  201. package/dist/commands/sys/setup-wizard.d.ts +26 -125
  202. package/dist/commands/sys/setup-wizard.js +209 -2473
  203. package/dist/commands/sys/setup.js +5 -7
  204. package/dist/commands/sys.js +3 -2
  205. package/dist/core/__tests__/broker-extension-canvas-db-boundary.test.js +50 -0
  206. package/dist/core/__tests__/broker-launch-candidates.test.js +20 -9
  207. package/dist/core/__tests__/broker-preflight.test.js +1 -1
  208. package/dist/core/__tests__/canvas-inbox-watcher-hold.test.js +108 -27
  209. package/dist/core/__tests__/canvas-inbox-watcher.test.js +14 -0
  210. package/dist/core/__tests__/canvas.test.js +2 -36
  211. package/dist/core/__tests__/close.test.js +14 -3
  212. package/dist/core/__tests__/context-intro.test.js +32 -143
  213. package/dist/core/__tests__/cron-broker-capacity.test.js +22 -3
  214. package/dist/core/__tests__/daemon-boot.test.js +2 -20
  215. package/dist/core/__tests__/daemon-wedge.test.js +1 -1
  216. package/dist/core/__tests__/dead-node-policy-table.test.js +1 -18
  217. package/dist/core/__tests__/fixtures/fake-engine.d.ts +1 -1
  218. package/dist/core/__tests__/fixtures/fake-engine.js +2 -2
  219. package/dist/core/__tests__/fixtures/fake-pi-host.js +2 -2
  220. package/dist/core/__tests__/focuses.test.js +4 -98
  221. package/dist/core/__tests__/helpers/broker-clients.d.ts +0 -3
  222. package/dist/core/__tests__/helpers/broker-clients.js +0 -14
  223. package/dist/core/__tests__/helpers/harness.d.ts +0 -8
  224. package/dist/core/__tests__/helpers/harness.js +7 -87
  225. package/dist/core/__tests__/helpers/viewer-panes.js +1 -1
  226. package/dist/core/__tests__/inline-memory-refs.test.js +5 -134
  227. package/dist/core/__tests__/kickoff.test.js +1 -1
  228. package/dist/core/__tests__/memory-resolver-precedence.test.js +29 -1
  229. package/dist/core/__tests__/migration.test.js +35 -48
  230. package/dist/core/__tests__/on-read-dedup-resume.test.js +22 -12
  231. package/dist/core/__tests__/passive-subscription.test.js +26 -49
  232. package/dist/core/__tests__/preview-registry-sync.test.js +1 -2
  233. package/dist/core/__tests__/prune.test.js +94 -1
  234. package/dist/core/__tests__/review-model-floor.test.js +0 -32
  235. package/dist/core/__tests__/seam/broker-attach-multiclient.test.js +255 -0
  236. package/dist/core/__tests__/{full → seam}/broker-attach-stream.test.js +39 -7
  237. package/dist/core/__tests__/{full → seam}/broker-crash-teardown.test.js +30 -29
  238. package/dist/core/__tests__/{full → seam}/broker-pane-resolution.test.js +54 -5
  239. package/dist/core/__tests__/{full → seam}/broker-provider-retry.test.js +134 -82
  240. package/dist/core/__tests__/{full → seam}/broker-whip-interrupt.test.js +15 -4
  241. package/dist/core/__tests__/{full/idle-release-settlement.test.js → seam/dormancy-release.test.js} +69 -17
  242. package/dist/core/__tests__/{full/yield-message-transaction.test.js → seam/yield-refresh-transaction.test.js} +31 -9
  243. package/dist/core/__tests__/secrets.test.js +1 -7
  244. package/dist/core/__tests__/{broker-fork-seam.test.js → serial/broker-fork-seam.test.js} +58 -7
  245. package/dist/core/__tests__/{broker-sdk-wiring.test.js → serial/broker-sdk-wiring.test.js} +18 -162
  246. package/dist/core/__tests__/{broker-snapshot-history.test.js → serial/broker-snapshot-history.test.js} +9 -9
  247. package/dist/core/__tests__/{command-plugins.test.js → serial/command-plugins.test.js} +105 -15
  248. package/dist/core/__tests__/{deferred-no-wake.test.js → serial/deferred-no-wake.test.js} +23 -20
  249. package/dist/core/__tests__/{flagship-lifecycle.test.js → serial/flagship-lifecycle.test.js} +7 -7
  250. package/dist/core/__tests__/{host-teardown-process-group.test.js → serial/host-teardown-process-group.test.js} +6 -6
  251. package/dist/core/__tests__/{human-deliver-e2e.test.js → serial/human-deliver-e2e.test.js} +12 -12
  252. package/dist/core/__tests__/{live-mutation.test.js → serial/live-mutation.test.js} +5 -5
  253. package/dist/core/__tests__/{refresh-stall-recycle.test.js → serial/refresh-stall-recycle.test.js} +5 -14
  254. package/dist/core/__tests__/{revive.test.js → serial/revive.test.js} +15 -100
  255. package/dist/core/__tests__/{spawn-root.test.js → serial/spawn-root.test.js} +32 -15
  256. package/dist/core/__tests__/serial/subscription-delivery.test.js +126 -0
  257. package/dist/core/__tests__/serial/tmux-surface.test.js +256 -0
  258. package/dist/core/__tests__/{worktree.test.js → serial/worktree.test.js} +15 -15
  259. package/dist/core/__tests__/session-model.test.js +0 -18
  260. package/dist/core/__tests__/spawn-worktree-id-conflict.test.js +9 -0
  261. package/dist/core/__tests__/watchdog-abort-arms-retry.test.js +50 -0
  262. package/dist/core/broker-client/__tests__/transport-relay.test.js +15 -16
  263. package/dist/core/broker-client/__tests__/transport-socket.test.js +28 -0
  264. package/dist/core/broker-client/client.d.ts +2 -2
  265. package/dist/core/broker-client/client.js +4 -7
  266. package/dist/core/broker-client/transport-relay.d.ts +13 -19
  267. package/dist/core/broker-client/transport-relay.js +19 -34
  268. package/dist/core/broker-client/transport-socket.d.ts +2 -2
  269. package/dist/core/broker-client/transport-socket.js +9 -2
  270. package/dist/core/broker-client/transport.d.ts +7 -3
  271. package/dist/core/broker-client/transport.js +4 -4
  272. package/dist/core/canvas/__tests__/attention.test.js +1 -18
  273. package/dist/core/canvas/__tests__/remote-canvas-source.test.js +7 -64
  274. package/dist/core/canvas/__tests__/remote-transport.test.js +2 -3
  275. package/dist/core/canvas/__tests__/render-remote.test.js +7 -52
  276. package/dist/core/canvas/browse/app.d.ts +2 -17
  277. package/dist/core/canvas/browse/app.js +16 -88
  278. package/dist/core/canvas/browse/model.d.ts +0 -4
  279. package/dist/core/canvas/browse/model.js +1 -12
  280. package/dist/core/canvas/browse/render.js +6 -3
  281. package/dist/core/canvas/crons.d.ts +8 -5
  282. package/dist/core/canvas/crons.js +7 -6
  283. package/dist/core/canvas/extensions.d.ts +7 -3
  284. package/dist/core/canvas/extensions.js +16 -4
  285. package/dist/core/canvas/nav-model.d.ts +0 -4
  286. package/dist/core/canvas/nav-model.js +2 -14
  287. package/dist/core/canvas/node-order.d.ts +3 -0
  288. package/dist/core/canvas/node-order.js +12 -0
  289. package/dist/core/canvas/remote-canvas-source.d.ts +3 -6
  290. package/dist/core/canvas/remote-canvas-source.js +8 -15
  291. package/dist/core/command.js +11 -4
  292. package/dist/core/config.js +3 -1
  293. package/dist/core/events/envelope.js +1 -1
  294. package/dist/core/events/read.js +7 -21
  295. package/dist/core/events/source.d.ts +0 -2
  296. package/dist/core/events/source.js +0 -16
  297. package/dist/core/events/types.d.ts +1 -1
  298. package/dist/core/fault-classifier.d.ts +1 -1
  299. package/dist/core/feed/passive.d.ts +0 -11
  300. package/dist/core/feed/passive.js +1 -62
  301. package/dist/core/human/__tests__/{inbox-core.test.js → serial/inbox-core.test.js} +6 -6
  302. package/dist/core/keybindings/__tests__/resolve.test.js +1 -96
  303. package/dist/core/keybindings/background-bash.js +3 -4
  304. package/dist/core/keybindings/catalog.js +1 -1
  305. package/dist/core/memory/inline-ref-grammar.js +3 -3
  306. package/dist/core/memory-resolver.d.ts +11 -25
  307. package/dist/core/memory-resolver.js +51 -33
  308. package/dist/core/model-routes.d.ts +15 -0
  309. package/dist/core/model-routes.js +12 -0
  310. package/dist/core/pool-credential-store.js +1 -1
  311. package/dist/core/preview-registry.js +8 -9
  312. package/dist/core/profiles/__tests__/root-profile.test.js +4 -14
  313. package/dist/core/review/realize.d.ts +0 -13
  314. package/dist/core/review/realize.js +0 -40
  315. package/dist/core/review/types.d.ts +1 -1
  316. package/dist/core/runtime/__tests__/engine-route.test.js +2 -2
  317. package/dist/core/runtime/bearings.js +1 -11
  318. package/dist/core/runtime/broker/client-registry.d.ts +33 -0
  319. package/dist/core/runtime/broker/client-registry.js +164 -0
  320. package/dist/core/runtime/broker/daemon-ops.d.ts +19 -0
  321. package/dist/core/runtime/broker/daemon-ops.js +49 -0
  322. package/dist/core/runtime/broker/event-projection.d.ts +42 -0
  323. package/dist/core/runtime/broker/event-projection.js +178 -0
  324. package/dist/core/runtime/broker/fault-retry.d.ts +39 -0
  325. package/dist/core/runtime/broker/fault-retry.js +277 -0
  326. package/dist/core/runtime/broker/frame-dispatch.d.ts +238 -0
  327. package/dist/core/runtime/broker/frame-dispatch.js +1537 -0
  328. package/dist/core/runtime/broker/inbox.d.ts +22 -0
  329. package/dist/core/runtime/broker/inbox.js +167 -0
  330. package/dist/core/runtime/broker/passive.d.ts +16 -0
  331. package/dist/core/runtime/broker/passive.js +44 -0
  332. package/dist/core/runtime/broker/read-ops.d.ts +23 -0
  333. package/dist/core/runtime/broker/read-ops.js +150 -0
  334. package/dist/core/runtime/broker/rebind.d.ts +74 -0
  335. package/dist/core/runtime/broker/rebind.js +211 -0
  336. package/dist/core/runtime/broker/tool-groups.d.ts +39 -0
  337. package/dist/core/runtime/broker/tool-groups.js +244 -0
  338. package/dist/core/runtime/broker-extension-render.d.ts +11 -0
  339. package/dist/core/runtime/broker-extension-render.js +181 -0
  340. package/dist/core/runtime/broker-persona-guidance.d.ts +13 -0
  341. package/dist/core/runtime/broker-persona-guidance.js +58 -0
  342. package/dist/core/runtime/broker-protocol.d.ts +1 -1
  343. package/dist/core/runtime/broker-protocol.js +1 -1
  344. package/dist/core/runtime/broker.d.ts +5 -196
  345. package/dist/core/runtime/broker.js +276 -3059
  346. package/dist/core/runtime/canvas-extensions.js +11 -2
  347. package/dist/core/runtime/fault.js +1 -1
  348. package/dist/core/runtime/model-selection.d.ts +9 -0
  349. package/dist/core/runtime/model-selection.js +12 -0
  350. package/dist/core/runtime/model-swap.d.ts +3 -3
  351. package/dist/core/runtime/model-swap.js +33 -25
  352. package/dist/core/runtime/placement-tmux.d.ts +3 -14
  353. package/dist/core/runtime/placement-tmux.js +11 -80
  354. package/dist/core/runtime/placement.d.ts +4 -2
  355. package/dist/core/runtime/placement.js +7 -12
  356. package/dist/core/runtime/promote.d.ts +14 -1
  357. package/dist/core/runtime/promote.js +1 -1
  358. package/dist/core/runtime/reset.d.ts +1 -1
  359. package/dist/core/runtime/roadmap.js +1 -1
  360. package/dist/core/runtime/spawn.d.ts +8 -0
  361. package/dist/core/runtime/spawn.js +36 -6
  362. package/dist/core/runtime/stop-guard.d.ts +4 -3
  363. package/dist/core/runtime/stop-guard.js +36 -18
  364. package/dist/core/runtime/stop-signals.d.ts +4 -1
  365. package/dist/core/runtime/stream-watchdog.js +4 -5
  366. package/dist/core/runtime/structured-output.d.ts +15 -2
  367. package/dist/core/runtime/structured-output.js +35 -12
  368. package/dist/core/runtime/tmux-bindings.d.ts +25 -0
  369. package/dist/core/runtime/tmux-bindings.js +682 -0
  370. package/dist/core/runtime/tmux-chrome.d.ts +2 -1
  371. package/dist/core/runtime/tmux-chrome.js +3 -2
  372. package/dist/core/runtime/{tmux.d.ts → tmux-driver.d.ts} +18 -26
  373. package/dist/core/runtime/tmux-driver.js +598 -0
  374. package/dist/core/runtime/view-socket.d.ts +14 -0
  375. package/dist/core/runtime/view-socket.js +83 -0
  376. package/dist/core/session-model/session-state.d.ts +1 -2
  377. package/dist/core/session-model/session-state.js +5 -8
  378. package/dist/core/spawn.d.ts +1 -1
  379. package/dist/core/spawn.js +2 -2
  380. package/dist/core/substrate/gate.d.ts +1 -1
  381. package/dist/core/substrate/on-read-pure.d.ts +7 -0
  382. package/dist/core/substrate/on-read-pure.js +272 -0
  383. package/dist/core/termrender/termrender.js +32 -2
  384. package/dist/core/user-settings.d.ts +23 -1
  385. package/dist/core/user-settings.js +18 -1
  386. package/dist/daemon/api/__tests__/node-model-validation.test.js +134 -0
  387. package/dist/daemon/api/__tests__/review-terminal-conflict.test.js +98 -0
  388. package/dist/daemon/api/__tests__/{full → seam}/api-server.test.js +6 -48
  389. package/dist/daemon/api/__tests__/{full → seam}/b10-attach-modelauth.test.js +17 -44
  390. package/dist/daemon/api/__tests__/{full/push-parity.test.js → seam/leaf-api-parity.test.js} +61 -42
  391. package/dist/daemon/api/bridge.js +40 -81
  392. package/dist/daemon/api/handlers/broker-ops.d.ts +2 -0
  393. package/dist/daemon/api/handlers/broker-ops.js +383 -0
  394. package/dist/daemon/api/handlers/crons.js +9 -4
  395. package/dist/daemon/api/handlers/files.js +6 -7
  396. package/dist/daemon/api/handlers/inbox.js +2 -340
  397. package/dist/daemon/api/handlers/nodes.d.ts +10 -1
  398. package/dist/daemon/api/handlers/nodes.js +74 -39
  399. package/dist/daemon/api/handlers/review-comments.js +5 -1
  400. package/dist/daemon/api/handlers/reviews.js +0 -19
  401. package/dist/daemon/api/map.js +25 -4
  402. package/dist/daemon/api/router.js +2 -3
  403. package/dist/daemon/api/server.js +5 -7
  404. package/dist/daemon/cron-run.d.ts +4 -0
  405. package/dist/daemon/cron-run.js +30 -13
  406. package/dist/daemon/crtrd.d.ts +3 -58
  407. package/dist/daemon/crtrd.js +28 -1244
  408. package/dist/daemon/manage.js +0 -1
  409. package/dist/daemon/reconcilers/broker-supervision.d.ts +50 -0
  410. package/dist/daemon/reconcilers/broker-supervision.js +549 -0
  411. package/dist/daemon/reconcilers/cron-lane.d.ts +10 -0
  412. package/dist/daemon/reconcilers/cron-lane.js +32 -0
  413. package/dist/daemon/reconcilers/dormant-inbox.d.ts +18 -0
  414. package/dist/daemon/reconcilers/dormant-inbox.js +143 -0
  415. package/dist/daemon/reconcilers/storage-maintenance.d.ts +22 -0
  416. package/dist/daemon/reconcilers/storage-maintenance.js +213 -0
  417. package/dist/daemon/review/finish.js +2 -5
  418. package/dist/pi-extensions/__tests__/canvas-context-intro.test.js +34 -53
  419. package/dist/pi-extensions/__tests__/canvas-recap.test.js +16 -113
  420. package/dist/pi-extensions/__tests__/canvas-stophook-agentend.test.js +72 -99
  421. package/dist/pi-extensions/__tests__/canvas-stophook-context-nudge.test.js +29 -12
  422. package/dist/pi-extensions/broker-local.d.ts +20 -0
  423. package/dist/pi-extensions/broker-local.js +89 -0
  424. package/dist/pi-extensions/canvas-context-intro.d.ts +3 -3
  425. package/dist/pi-extensions/canvas-context-intro.js +22 -11
  426. package/dist/pi-extensions/canvas-doc-substrate.js +17 -34
  427. package/dist/pi-extensions/canvas-goal-capture.js +7 -12
  428. package/dist/pi-extensions/canvas-inbox-watcher.js +124 -139
  429. package/dist/pi-extensions/canvas-passive-context.d.ts +3 -3
  430. package/dist/pi-extensions/canvas-passive-context.js +22 -18
  431. package/dist/pi-extensions/canvas-recap.d.ts +2 -2
  432. package/dist/pi-extensions/canvas-recap.js +48 -21
  433. package/dist/pi-extensions/canvas-review-boundary.js +10 -4
  434. package/dist/pi-extensions/canvas-stophook.d.ts +0 -5
  435. package/dist/pi-extensions/canvas-stophook.js +149 -431
  436. package/dist/pi-extensions/canvas-structured-output.js +52 -30
  437. package/dist/pi-extensions/envelope-merge.d.ts +13 -0
  438. package/dist/pi-extensions/envelope-merge.js +29 -0
  439. package/dist/shared/working-activity.d.ts +3 -2
  440. package/dist/shared/working-activity.js +3 -2
  441. package/dist/types.d.ts +6 -5
  442. package/dist/types.js +2 -2
  443. package/docs/compat/hearth-crtr-v1.md +4 -12
  444. package/docs/compat/hearth-crtr-v2.md +3 -11
  445. package/docs/compat/hearth-crtr-v3.md +4 -12
  446. package/docs/compat/hearth-crtr-v4.md +3 -11
  447. package/docs/compat/hearth-crtr-v5.md +3 -11
  448. package/docs/public-api.md +3 -7
  449. package/package.json +7 -49
  450. package/runtime.lock.json +2766 -14533
  451. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/__tests__/claude-plugin-commands.test.ts +0 -49
  452. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/__tests__/memory-slash-commands.test.ts +0 -194
  453. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/__tests__/statusline.test.ts +0 -68
  454. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/frontmatter-rules/test.ts +0 -119
  455. package/dist/clients/attach/__tests__/attach-chrome-remote.test.js +0 -439
  456. package/dist/clients/attach/__tests__/attach-keybindings.test.js +0 -170
  457. package/dist/clients/attach/__tests__/crtr-output-coverage.test.js +0 -57
  458. package/dist/clients/attach/__tests__/editor-frame-title.test.js +0 -19
  459. package/dist/clients/attach/__tests__/input-controller-extension-command.test.js +0 -32
  460. package/dist/clients/attach/__tests__/markdown-headings.test.js +0 -35
  461. package/dist/clients/attach/__tests__/session-identity-refresh.test.js +0 -32
  462. package/dist/clients/conversation/conversation.d.ts +0 -65
  463. package/dist/clients/conversation/conversation.js +0 -318
  464. package/dist/clients/conversation/frames.d.ts +0 -30
  465. package/dist/clients/conversation/frames.js +0 -52
  466. package/dist/clients/conversation/region.d.ts +0 -51
  467. package/dist/clients/conversation/region.js +0 -265
  468. package/dist/clients/inbox/__tests__/inbox-controller.test.js +0 -247
  469. package/dist/clients/inbox/__tests__/mount-panel.test.js +0 -776
  470. package/dist/clients/inbox/review/__tests__/remap.test.js +0 -196
  471. package/dist/clients/inbox/review/columns.d.ts +0 -22
  472. package/dist/clients/inbox/review/columns.js +0 -40
  473. package/dist/clients/inbox/review/composition.d.ts +0 -60
  474. package/dist/clients/inbox/review/composition.js +0 -278
  475. package/dist/clients/inbox/review/document-region.d.ts +0 -120
  476. package/dist/clients/surfaces/region.d.ts +0 -16
  477. package/dist/clients/web/__tests__/push-engine.test.js +0 -158
  478. package/dist/clients/web/__tests__/push-registry.test.d.ts +0 -1
  479. package/dist/clients/web/__tests__/push-registry.test.js +0 -177
  480. package/dist/clients/web/dev-server.d.ts +0 -7
  481. package/dist/clients/web/dev-server.js +0 -46
  482. package/dist/clients/web/events.d.ts +0 -19
  483. package/dist/clients/web/events.js +0 -163
  484. package/dist/clients/web/push-engine.d.ts +0 -44
  485. package/dist/clients/web/push-engine.js +0 -125
  486. package/dist/clients/web/push-registry.d.ts +0 -85
  487. package/dist/clients/web/push-registry.js +0 -373
  488. package/dist/clients/web/server.d.ts +0 -19
  489. package/dist/clients/web/server.js +0 -661
  490. package/dist/clients/web/web-client/shared/protocol.d.ts +0 -214
  491. package/dist/clients/web/web-client/shared/protocol.js +0 -8
  492. package/dist/clients/web/web-cmd.d.ts +0 -2
  493. package/dist/clients/web/web-cmd.js +0 -141
  494. package/dist/commands/__tests__/api-canvas-source.test.d.ts +0 -1
  495. package/dist/commands/__tests__/api-canvas-source.test.js +0 -37
  496. package/dist/commands/__tests__/canvas-config.test.d.ts +0 -1
  497. package/dist/commands/__tests__/canvas-config.test.js +0 -107
  498. package/dist/commands/__tests__/node-no-kickoff-flag.test.d.ts +0 -1
  499. package/dist/commands/__tests__/node-no-kickoff-flag.test.js +0 -73
  500. package/dist/commands/__tests__/node-worktree-flag.test.d.ts +0 -1
  501. package/dist/commands/__tests__/node-worktree-flag.test.js +0 -49
  502. package/dist/commands/__tests__/search-contents.test.d.ts +0 -1
  503. package/dist/commands/__tests__/search-contents.test.js +0 -52
  504. package/dist/commands/memory/__tests__/lint.test.d.ts +0 -1
  505. package/dist/commands/memory/__tests__/lint.test.js +0 -15
  506. package/dist/commands/sys/__tests__/config-broker-thresholds.test.d.ts +0 -1
  507. package/dist/commands/sys/__tests__/config-broker-thresholds.test.js +0 -95
  508. package/dist/commands/sys/__tests__/config-keybindings.test.d.ts +0 -1
  509. package/dist/commands/sys/__tests__/config-keybindings.test.js +0 -55
  510. package/dist/commands/sys/__tests__/helpers/setup-runtime.d.ts +0 -5
  511. package/dist/commands/sys/__tests__/helpers/setup-runtime.js +0 -19
  512. package/dist/commands/sys/__tests__/setup-front-door.test.d.ts +0 -1
  513. package/dist/commands/sys/__tests__/setup-front-door.test.js +0 -102
  514. package/dist/commands/sys/__tests__/setup-models.test.d.ts +0 -1
  515. package/dist/commands/sys/__tests__/setup-models.test.js +0 -205
  516. package/dist/commands/sys/__tests__/setup-providers-viewport.test.d.ts +0 -1
  517. package/dist/commands/sys/__tests__/setup-providers-viewport.test.js +0 -155
  518. package/dist/commands/sys/__tests__/sync-deps.test.d.ts +0 -1
  519. package/dist/commands/sys/__tests__/sync-deps.test.js +0 -179
  520. package/dist/commands/sys/__tests__/sync-import.test.d.ts +0 -1
  521. package/dist/commands/sys/__tests__/sync-import.test.js +0 -315
  522. package/dist/core/__tests__/base-worker-prompt.test.d.ts +0 -1
  523. package/dist/core/__tests__/base-worker-prompt.test.js +0 -57
  524. package/dist/core/__tests__/command-plugins-surfaces.test.d.ts +0 -1
  525. package/dist/core/__tests__/command-plugins-surfaces.test.js +0 -359
  526. package/dist/core/__tests__/connection-reconnect-resume.test.d.ts +0 -1
  527. package/dist/core/__tests__/connection-reconnect-resume.test.js +0 -36
  528. package/dist/core/__tests__/finalization-migration.test.d.ts +0 -1
  529. package/dist/core/__tests__/finalization-migration.test.js +0 -38
  530. package/dist/core/__tests__/fixtures/extra-extension.d.ts +0 -1
  531. package/dist/core/__tests__/fixtures/extra-extension.js +0 -3
  532. package/dist/core/__tests__/fixtures/spawn-proof-target.test.d.ts +0 -1
  533. package/dist/core/__tests__/fixtures/spawn-proof-target.test.js +0 -15
  534. package/dist/core/__tests__/fork.test.d.ts +0 -1
  535. package/dist/core/__tests__/fork.test.js +0 -108
  536. package/dist/core/__tests__/full/broker-attach-limits.test.d.ts +0 -1
  537. package/dist/core/__tests__/full/broker-attach-limits.test.js +0 -147
  538. package/dist/core/__tests__/full/broker-deliver-ack.test.d.ts +0 -1
  539. package/dist/core/__tests__/full/broker-deliver-ack.test.js +0 -73
  540. package/dist/core/__tests__/full/broker-dialogs.test.d.ts +0 -1
  541. package/dist/core/__tests__/full/broker-dialogs.test.js +0 -180
  542. package/dist/core/__tests__/full/broker-display-snapshot.test.d.ts +0 -1
  543. package/dist/core/__tests__/full/broker-display-snapshot.test.js +0 -75
  544. package/dist/core/__tests__/full/broker-dormant-wake.test.d.ts +0 -1
  545. package/dist/core/__tests__/full/broker-dormant-wake.test.js +0 -130
  546. package/dist/core/__tests__/full/broker-model-changed-broadcast.test.d.ts +0 -1
  547. package/dist/core/__tests__/full/broker-model-changed-broadcast.test.js +0 -57
  548. package/dist/core/__tests__/full/broker-navigate-tree-rewelcome.test.d.ts +0 -1
  549. package/dist/core/__tests__/full/broker-navigate-tree-rewelcome.test.js +0 -80
  550. package/dist/core/__tests__/full/cascade-close.test.d.ts +0 -1
  551. package/dist/core/__tests__/full/cascade-close.test.js +0 -240
  552. package/dist/core/__tests__/full/detach-focus.test.d.ts +0 -1
  553. package/dist/core/__tests__/full/detach-focus.test.js +0 -126
  554. package/dist/core/__tests__/full/idle-release-settlement.test.d.ts +0 -1
  555. package/dist/core/__tests__/full/issue-146-yield-spawn-focus.test.d.ts +0 -1
  556. package/dist/core/__tests__/full/issue-146-yield-spawn-focus.test.js +0 -107
  557. package/dist/core/__tests__/full/park-clock-release.test.d.ts +0 -1
  558. package/dist/core/__tests__/full/park-clock-release.test.js +0 -56
  559. package/dist/core/__tests__/full/yield-message-transaction.test.d.ts +0 -1
  560. package/dist/core/__tests__/memory-index-render.test.d.ts +0 -1
  561. package/dist/core/__tests__/memory-index-render.test.js +0 -60
  562. package/dist/core/__tests__/model-routes.test.d.ts +0 -1
  563. package/dist/core/__tests__/model-routes.test.js +0 -41
  564. package/dist/core/__tests__/on-read-identity.test.d.ts +0 -1
  565. package/dist/core/__tests__/on-read-identity.test.js +0 -61
  566. package/dist/core/__tests__/phase4-review-migration.test.d.ts +0 -1
  567. package/dist/core/__tests__/phase4-review-migration.test.js +0 -100
  568. package/dist/core/__tests__/prune-to-limit.test.d.ts +0 -1
  569. package/dist/core/__tests__/prune-to-limit.test.js +0 -126
  570. package/dist/core/__tests__/reset.test.d.ts +0 -1
  571. package/dist/core/__tests__/reset.test.js +0 -69
  572. package/dist/core/__tests__/spawn-no-kickoff.test.d.ts +0 -1
  573. package/dist/core/__tests__/spawn-no-kickoff.test.js +0 -115
  574. package/dist/core/__tests__/steer-note.test.d.ts +0 -1
  575. package/dist/core/__tests__/steer-note.test.js +0 -41
  576. package/dist/core/__tests__/subcommand-tier.test.d.ts +0 -1
  577. package/dist/core/__tests__/subcommand-tier.test.js +0 -99
  578. package/dist/core/__tests__/subscription-delivery.test.js +0 -211
  579. package/dist/core/__tests__/test-runner-cheap-sharding.test.d.ts +0 -1
  580. package/dist/core/__tests__/test-runner-cheap-sharding.test.js +0 -97
  581. package/dist/core/__tests__/tmux-surface.test.js +0 -484
  582. package/dist/core/__tests__/wake-bearings.test.d.ts +0 -1
  583. package/dist/core/__tests__/wake-bearings.test.js +0 -102
  584. package/dist/core/canvas/__tests__/remote-event-stream.test.d.ts +0 -1
  585. package/dist/core/canvas/__tests__/remote-event-stream.test.js +0 -146
  586. package/dist/core/canvas/__tests__/source-resolve.test.d.ts +0 -1
  587. package/dist/core/canvas/__tests__/source-resolve.test.js +0 -77
  588. package/dist/core/canvas/browse/__tests__/model.test.d.ts +0 -1
  589. package/dist/core/canvas/browse/__tests__/model.test.js +0 -290
  590. package/dist/core/canvas/browse/__tests__/rebuild-coalescer.test.d.ts +0 -1
  591. package/dist/core/canvas/browse/__tests__/rebuild-coalescer.test.js +0 -134
  592. package/dist/core/canvas/browse/__tests__/render.test.d.ts +0 -1
  593. package/dist/core/canvas/browse/__tests__/render.test.js +0 -111
  594. package/dist/core/canvas/browse/rebuild-coalescer.d.ts +0 -7
  595. package/dist/core/canvas/browse/rebuild-coalescer.js +0 -61
  596. package/dist/core/canvas/remote-event-stream.d.ts +0 -24
  597. package/dist/core/canvas/remote-event-stream.js +0 -94
  598. package/dist/core/feed/__tests__/coalesce-human.test.d.ts +0 -1
  599. package/dist/core/feed/__tests__/coalesce-human.test.js +0 -36
  600. package/dist/core/feed/__tests__/empty-node-guard.test.d.ts +0 -1
  601. package/dist/core/feed/__tests__/empty-node-guard.test.js +0 -45
  602. package/dist/core/host-exports/__tests__/export-prunes-boot-skill.test.d.ts +0 -1
  603. package/dist/core/host-exports/__tests__/export-prunes-boot-skill.test.js +0 -84
  604. package/dist/core/human/__tests__/visible-paths.test.d.ts +0 -1
  605. package/dist/core/human/__tests__/visible-paths.test.js +0 -28
  606. package/dist/core/keybindings/__tests__/inbox-affordance.test.d.ts +0 -1
  607. package/dist/core/keybindings/__tests__/inbox-affordance.test.js +0 -38
  608. package/dist/core/review/__tests__/project.test.d.ts +0 -1
  609. package/dist/core/review/__tests__/project.test.js +0 -71
  610. package/dist/core/runtime/__tests__/command-expansion.test.d.ts +0 -1
  611. package/dist/core/runtime/__tests__/command-expansion.test.js +0 -25
  612. package/dist/core/runtime/__tests__/session-visibility.test.d.ts +0 -1
  613. package/dist/core/runtime/__tests__/session-visibility.test.js +0 -119
  614. package/dist/core/runtime/__tests__/spawn-at-given-id.test.d.ts +0 -1
  615. package/dist/core/runtime/__tests__/spawn-at-given-id.test.js +0 -34
  616. package/dist/core/runtime/tmux.js +0 -1314
  617. package/dist/daemon/api/__tests__/full/push-parity.test.d.ts +0 -1
  618. package/dist/daemon/api/__tests__/full/worktree-parity.test.d.ts +0 -1
  619. package/dist/daemon/api/__tests__/full/worktree-parity.test.js +0 -160
  620. package/dist/daemon/api/__tests__/inbox.test.d.ts +0 -1
  621. package/dist/daemon/api/__tests__/inbox.test.js +0 -489
  622. package/dist/web-client/apple-touch-icon.png +0 -0
  623. package/dist/web-client/assets/fragment-mono-latin-400-normal-BYwT3kSJ.woff +0 -0
  624. package/dist/web-client/assets/fragment-mono-latin-400-normal-yxdJ5AmL.woff2 +0 -0
  625. package/dist/web-client/assets/fragment-mono-latin-ext-400-normal-BbKYyvR9.woff2 +0 -0
  626. package/dist/web-client/assets/fragment-mono-latin-ext-400-normal-CT4YFKeK.woff +0 -0
  627. package/dist/web-client/assets/index-CCPaLeW7.css +0 -2
  628. package/dist/web-client/assets/index-kyOWsnZK.js +0 -86
  629. package/dist/web-client/assets/martian-mono-cyrillic-wght-normal-B84CD5C_.woff2 +0 -0
  630. package/dist/web-client/assets/martian-mono-latin-ext-wght-normal-DlL6xMw5.woff2 +0 -0
  631. package/dist/web-client/assets/martian-mono-latin-wght-normal-5W32yIyr.woff2 +0 -0
  632. package/dist/web-client/assets/workbox-window.prod.es5-Bd17z0YL.js +0 -2
  633. package/dist/web-client/icon-192.png +0 -0
  634. package/dist/web-client/icon-512.png +0 -0
  635. package/dist/web-client/icon-maskable-512.png +0 -0
  636. package/dist/web-client/index.html +0 -17
  637. package/dist/web-client/manifest.webmanifest +0 -1
  638. package/dist/web-client/sw.js +0 -1
  639. /package/dist/api/__tests__/{client.test.d.ts → serial/client.test.d.ts} +0 -0
  640. /package/dist/clients/inbox/__tests__/{inbox-controller.test.d.ts → serial/inbox-controller.test.d.ts} +0 -0
  641. /package/dist/clients/inbox/__tests__/{mount-panel.test.d.ts → serial/mount-panel.test.d.ts} +0 -0
  642. /package/dist/clients/{attach/__tests__/attach-chrome-remote.test.d.ts → inbox/review/__tests__/teardown-notice.test.d.ts} +0 -0
  643. /package/dist/{clients/attach/__tests__/attach-keybindings.test.d.ts → core/__tests__/broker-extension-canvas-db-boundary.test.d.ts} +0 -0
  644. /package/dist/{clients/attach/__tests__/crtr-output-coverage.test.d.ts → core/__tests__/seam/broker-attach-multiclient.test.d.ts} +0 -0
  645. /package/dist/core/__tests__/{full → seam}/broker-attach-stream.test.d.ts +0 -0
  646. /package/dist/core/__tests__/{full → seam}/broker-crash-teardown.test.d.ts +0 -0
  647. /package/dist/core/__tests__/{full → seam}/broker-pane-resolution.test.d.ts +0 -0
  648. /package/dist/core/__tests__/{full → seam}/broker-provider-retry.test.d.ts +0 -0
  649. /package/dist/core/__tests__/{full → seam}/broker-whip-interrupt.test.d.ts +0 -0
  650. /package/dist/{clients/attach/__tests__/editor-frame-title.test.d.ts → core/__tests__/seam/dormancy-release.test.d.ts} +0 -0
  651. /package/dist/{clients/attach/__tests__/input-controller-extension-command.test.d.ts → core/__tests__/seam/yield-refresh-transaction.test.d.ts} +0 -0
  652. /package/dist/core/__tests__/{broker-fork-seam.test.d.ts → serial/broker-fork-seam.test.d.ts} +0 -0
  653. /package/dist/core/__tests__/{broker-sdk-wiring.test.d.ts → serial/broker-sdk-wiring.test.d.ts} +0 -0
  654. /package/dist/core/__tests__/{broker-snapshot-history.test.d.ts → serial/broker-snapshot-history.test.d.ts} +0 -0
  655. /package/dist/core/__tests__/{command-plugins.test.d.ts → serial/command-plugins.test.d.ts} +0 -0
  656. /package/dist/core/__tests__/{deferred-no-wake.test.d.ts → serial/deferred-no-wake.test.d.ts} +0 -0
  657. /package/dist/core/__tests__/{flagship-lifecycle.test.d.ts → serial/flagship-lifecycle.test.d.ts} +0 -0
  658. /package/dist/core/__tests__/{host-teardown-process-group.test.d.ts → serial/host-teardown-process-group.test.d.ts} +0 -0
  659. /package/dist/core/__tests__/{human-deliver-e2e.test.d.ts → serial/human-deliver-e2e.test.d.ts} +0 -0
  660. /package/dist/core/__tests__/{live-mutation.test.d.ts → serial/live-mutation.test.d.ts} +0 -0
  661. /package/dist/core/__tests__/{refresh-stall-recycle.test.d.ts → serial/refresh-stall-recycle.test.d.ts} +0 -0
  662. /package/dist/core/__tests__/{revive.test.d.ts → serial/revive.test.d.ts} +0 -0
  663. /package/dist/core/__tests__/{spawn-root.test.d.ts → serial/spawn-root.test.d.ts} +0 -0
  664. /package/dist/core/__tests__/{subscription-delivery.test.d.ts → serial/subscription-delivery.test.d.ts} +0 -0
  665. /package/dist/core/__tests__/{tmux-surface.test.d.ts → serial/tmux-surface.test.d.ts} +0 -0
  666. /package/dist/core/__tests__/{worktree.test.d.ts → serial/worktree.test.d.ts} +0 -0
  667. /package/dist/{clients/attach/__tests__/markdown-headings.test.d.ts → core/__tests__/watchdog-abort-arms-retry.test.d.ts} +0 -0
  668. /package/dist/{clients/attach/__tests__/session-identity-refresh.test.d.ts → core/broker-client/__tests__/transport-socket.test.d.ts} +0 -0
  669. /package/dist/core/human/__tests__/{inbox-core.test.d.ts → serial/inbox-core.test.d.ts} +0 -0
  670. /package/dist/{clients/inbox/review/__tests__/remap.test.d.ts → daemon/api/__tests__/node-model-validation.test.d.ts} +0 -0
  671. /package/dist/{clients/surfaces/region.js → daemon/api/__tests__/review-terminal-conflict.test.d.ts} +0 -0
  672. /package/dist/daemon/api/__tests__/{full → seam}/api-server.test.d.ts +0 -0
  673. /package/dist/daemon/api/__tests__/{full → seam}/b10-attach-modelauth.test.d.ts +0 -0
  674. /package/dist/{clients/web/__tests__/push-engine.test.d.ts → daemon/api/__tests__/seam/leaf-api-parity.test.d.ts} +0 -0
@@ -2,22 +2,22 @@ import { before, after, test } from "node:test";
2
2
  import assert from "node:assert/strict";
3
3
  import { spawn } from "node:child_process";
4
4
  import { existsSync, mkdirSync, mkdtempSync, readFileSync, rmSync, writeFileSync } from "node:fs";
5
- import { LockedJsonFile } from "../../../../core/locked-file.ts";
6
- import { expandModelCandidates } from "../../../../core/model-routes.ts";
7
- import type { SubscriptionCredential } from "../../lib/subscription-state.ts";
5
+ import { LockedJsonFile } from "../../../../../core/locked-file.ts";
6
+ import { expandModelCandidates } from "../../../../../core/model-routes.ts";
7
+ import type { SubscriptionCredential } from "../../../lib/subscription-state.ts";
8
8
  import { dirname, join } from "node:path";
9
9
  import { tmpdir } from "node:os";
10
10
 
11
11
  // Child processes reach crouter's locked-file primitive by absolute URL: they run under
12
12
  // tsx with `--input-type=module`, so a bare relative specifier has no base to resolve from.
13
- const lockedFileUrl = new URL("../../../../core/locked-file.ts", import.meta.url).href;
13
+ const lockedFileUrl = new URL("../../../../../core/locked-file.ts", import.meta.url).href;
14
14
 
15
15
  let home: string;
16
16
  let nodeCwd: string;
17
- let helpers: typeof import("../../lib/subscription-state.ts");
18
- let providerManagement: typeof import("../../../../core/provider-management.ts");
19
- let rotationModule: typeof import("../provider-rotation.ts");
20
- let providerRotationExtension: typeof import("../provider-rotation.ts").default;
17
+ let helpers: typeof import("../../../lib/subscription-state.ts");
18
+ let providerManagement: typeof import("../../../../../core/provider-management.ts");
19
+ let rotationModule: typeof import("../../provider-rotation.ts");
20
+ let providerRotationExtension: typeof import("../../provider-rotation.ts").default;
21
21
  const previousHome = process.env.HOME;
22
22
  const previousAgentDir = process.env.PI_CODING_AGENT_DIR;
23
23
  const previousModelIntent = process.env.CRTR_MODEL_INTENT;
@@ -109,9 +109,9 @@ before(async () => {
109
109
  process.env.HOME = home;
110
110
  process.env.PI_CODING_AGENT_DIR = join(home, ".pi", "agent");
111
111
  process.env.CRTR_NODE_CWD = nodeCwd;
112
- helpers = await import("../../lib/subscription-state.ts");
113
- providerManagement = await import("../../../../core/provider-management.ts");
114
- rotationModule = await import("../provider-rotation.ts");
112
+ helpers = await import("../../../lib/subscription-state.ts");
113
+ providerManagement = await import("../../../../../core/provider-management.ts");
114
+ rotationModule = await import("../../provider-rotation.ts");
115
115
  providerRotationExtension = rotationModule.default;
116
116
  });
117
117
 
@@ -128,33 +128,6 @@ after(() => {
128
128
  rmSync(nodeCwd, { recursive: true, force: true });
129
129
  });
130
130
 
131
- test("normalizes provider subscription pool files", async () => {
132
- await resetRotationState();
133
- await helpers.writeSubscriptionPool("anthropic", [
134
- {
135
- label: " personal ",
136
- refresh: " refresh-token ",
137
- access: " access-token ",
138
- expires: 123,
139
- rateLimitedUntil: Number.NaN,
140
- lastAttemptAt: Number.NaN,
141
- lastRateLimitedAt: Number.NaN,
142
- },
143
- ]);
144
-
145
- assert.deepEqual(helpers.readSubscriptionPool("anthropic"), [
146
- {
147
- label: "personal",
148
- refresh: "refresh-token",
149
- access: "access-token",
150
- expires: 123,
151
- rateLimitedUntil: 0,
152
- lastAttemptAt: 0,
153
- lastRateLimitedAt: 0,
154
- },
155
- ]);
156
- });
157
-
158
131
  // Concurrent refreshes of the same expired pool credential serialize read, token exchange,
159
132
  // and write under one lock. The injected refresh runs once; the second caller observes the
160
133
  // winner's fresh token and does not make a second single-use refresh request.
@@ -364,144 +337,6 @@ test("a genuine invalid_grant through the pool account's lock with no UI reaches
364
337
  }
365
338
  });
366
339
 
367
- test("/provider-sub add still adds an explicit additional subscription alongside the pool account", async () => {
368
- await resetRotationState();
369
- await helpers.writeSubscriptionPool("anthropic", [credential("anthropic", { refresh: "refresh-first", access: "access-first" })]);
370
-
371
- await helpers.upsertSubscription("anthropic", credential("work", { refresh: "refresh-work", access: "access-work" }));
372
-
373
- assert.deepEqual(helpers.readSubscriptionPool("anthropic").map((entry) => entry.label), ["anthropic", "work"]);
374
- });
375
-
376
- // /provider-sub <provider> add accepts the default label as the login-backed slot: the
377
- // registered command handler must store that login on the default pool entry rather than
378
- // discard it, because the pool is the only credential store a managed provider has.
379
- test("/provider-sub add with the default label persists the login credential to the default pool entry", async () => {
380
- await resetRotationState();
381
-
382
- const { ctx, commands, pi } = makeRotationCtx();
383
- ctx.hasUI = true;
384
- ctx.ui.notify = () => {};
385
- ctx.ui.input = async () => "personal";
386
- rotationModule.__setLoginForProviderForTest(async () => ({ refresh: "refresh-login", access: "access-login", expires: Date.now() + 60_000 }));
387
-
388
- try {
389
- await providerRotationExtension(pi);
390
- await commands["provider-sub"].handler("anthropic add", ctx);
391
-
392
- // The default pool entry carries the login's value with the cooldown cleared -- not a
393
- // broken "authenticated but valueless" slot.
394
- const [entry] = helpers.readSubscriptionPool("anthropic");
395
- assert.equal(entry.label, "personal");
396
- assert.equal(entry.refresh, "refresh-login");
397
- assert.equal(entry.access, "access-login");
398
- assert.equal(entry.rateLimitedUntil, 0);
399
- } finally {
400
- rotationModule.__setLoginForProviderForTest(undefined);
401
- }
402
- });
403
-
404
- // The retained agent command must use the same coordinated removal as the Providers panel: the
405
- // pool account leaves the pool exactly like any explicit account.
406
- test("/provider-sub rm removes the pool account", async () => {
407
- await resetRotationState();
408
- await helpers.writeSubscriptionPool("anthropic", [credential("anthropic")]);
409
- assert.equal(helpers.readSubscriptionPool("anthropic")[0]?.label, "anthropic");
410
-
411
- const { ctx, commands, pi } = makeRotationCtx();
412
- ctx.ui.notify = () => {};
413
- await providerRotationExtension(pi);
414
- await commands["provider-sub"].handler("anthropic rm anthropic", ctx);
415
-
416
- assert.equal(helpers.readSubscriptionPool("anthropic").some((entry) => entry.label === "anthropic"), false);
417
- });
418
-
419
- // The manual-code-paste dialog races pi-ai's loopback callback server. These tests exercise
420
- // the wrapper directly with a run function that can leave manual input pending. Aborting the
421
- // dialog signal removes its broker entry and emits a request-scoped dismissal frame, so the
422
- // assertions verify the signal rather than an unrelated notification.
423
-
424
- test("loginWithManualInputCleanup aborts the still-open manual dialog's signal once the OAuth call settles without it (loopback-wins parity)", async () => {
425
- let capturedSignal: AbortSignal | undefined;
426
- const notifications: Array<{ message: string; type?: string }> = [];
427
- const ctx = {
428
- ui: {
429
- notify: (message: string, type?: string) => notifications.push({ message, type }),
430
- input: (_title: string, _placeholder: string, opts?: { signal?: AbortSignal }) => {
431
- capturedSignal = opts?.signal;
432
- // Never resolves on its own -- mirrors pi-ai abandoning the manual-input
433
- // promise once the loopback callback server wins the race.
434
- return new Promise<string | undefined>(() => {});
435
- },
436
- },
437
- } as any;
438
-
439
- const result = await rotationModule.loginWithManualInputCleanup(ctx, async (readCode: any) => {
440
- // Start the manual-code prompt (as onManualCodeInput would) but -- like the real
441
- // pi-ai race -- never await its outcome; the loopback callback "wins" instead.
442
- void readCode("Open this URL...", "placeholder").catch(() => {});
443
- return "loopback-code";
444
- });
445
-
446
- assert.equal(result, "loopback-code");
447
- assert.equal(capturedSignal?.aborted, true, "the abandoned manual-input dialog's signal must be aborted once the OAuth call settles -- the broker turns that abort into a correlated extension_ui_dismiss");
448
- assert.equal(notifications.length, 0, "no broad dismiss notify -- an unrelated notify must never be used as a dialog-dismissal signal");
449
- });
450
-
451
- test("loginWithManualInputCleanup dismisses the manual dialog at callback-win (onProgress), NOT after a delayed token exchange", async () => {
452
- // Once the loopback callback supplies a code, progress starts token exchange. The manual
453
- // dialog is aborted at that boundary, before the exchange resolves, so a slow exchange does
454
- // not leave its overlay open.
455
- let order = 0;
456
- let abortedAt: number | undefined;
457
- let runResolvedAt: number | undefined;
458
- const ctx = {
459
- ui: {
460
- notify: () => {},
461
- input: (_title: string, _placeholder: string, opts?: { signal?: AbortSignal }) =>
462
- // Mirror the broker: resolve to undefined on abort (which readCode turns
463
- // into a throw, inert on the abandoned promise like pi-ai's own .catch).
464
- new Promise<string | undefined>((resolve) => {
465
- opts?.signal?.addEventListener("abort", () => { abortedAt = order++; resolve(undefined); }, { once: true });
466
- }),
467
- },
468
- } as any;
469
-
470
- const result = await rotationModule.loginWithManualInputCleanup(ctx, async (readCode: any, dismissManual: () => void) => {
471
- void readCode("Open this URL...", "placeholder").catch(() => {});
472
- dismissManual(); // pi-ai's onProgress fires here -- it already has the code
473
- await new Promise((r) => setTimeout(r, 25)); // the (possibly slow) token exchange
474
- runResolvedAt = order++;
475
- return "exchanged-token";
476
- });
477
-
478
- assert.equal(result, "exchanged-token");
479
- assert.notEqual(abortedAt, undefined, "the manual dialog's signal must have been aborted");
480
- assert.notEqual(runResolvedAt, undefined);
481
- assert.ok(abortedAt! < runResolvedAt!, "the manual dialog must be dismissed at callback-win (onProgress), BEFORE the delayed token exchange completes");
482
- });
483
-
484
- test("loginWithManualInputCleanup's readCode rejects (rather than resolving to \"\") when the manual dialog is cancelled or times out", async () => {
485
- const ctx = {
486
- ui: {
487
- notify: () => {},
488
- // ctx.ui.input resolving to undefined is exactly what a Cancel button or the
489
- // dialog's own timeout produces (dialogPromise's cancelled/timeout default).
490
- input: async () => undefined,
491
- },
492
- } as any;
493
-
494
- // pi-ai only calls its onPrompt paste-only fallback when onManualCodeInput
495
- // RESOLVES (even to a falsy value) -- never when it rejects. Asserting
496
- // loginWithManualInputCleanup itself rejects (instead of resolving to "", the
497
- // pre-fix behavior) proves readCode ends the OAuth attempt directly and pi-ai
498
- // never gets the chance to fall through to that second, URL-less dialog.
499
- await assert.rejects(
500
- () => rotationModule.loginWithManualInputCleanup(ctx, (readCode) => readCode("Open this URL...", "placeholder")),
501
- /OAuth login cancelled/,
502
- );
503
- });
504
-
505
340
  test("the synthesized ladder registry preserves family preference before configured strength fallback", async () => {
506
341
  await resetRotationState();
507
342
  writeLadderConfig();
@@ -877,7 +712,7 @@ test("addSubscription normalizes labels and enforces Codex account uniqueness in
877
712
  test("cross-process explicit adds admit exactly one duplicate Codex account", { timeout: 60_000 }, async () => {
878
713
  await resetRotationState();
879
714
  const poolPath = join(home, ".pi", "agent", "openai-codex-subscriptions.json");
880
- const subscriptionStateUrl = new URL("../../lib/subscription-state.ts", import.meta.url).href;
715
+ const subscriptionStateUrl = new URL("../../../lib/subscription-state.ts", import.meta.url).href;
881
716
  const spawnContender = (label: string) => {
882
717
  const child = spawn(
883
718
  process.execPath,
@@ -1006,8 +841,8 @@ test("managed Anthropic requests opt into server-side fallback without changing
1006
841
  writeLadderConfig();
1007
842
  await helpers.writeSubscriptionPool("anthropic", [credential("anthropic")]);
1008
843
 
1009
- const anthropicModel = { provider: "anthropic", id: "claude-opus-4-8", api: "anthropic-messages" };
1010
- const { ctx, providers, events, pi } = makeRotationCtx("anthropic/strong");
844
+ const anthropicModel = { provider: "anthropic", id: "claude-opus-5", api: "anthropic-messages" };
845
+ const { ctx, providers, events, pi } = makeRotationCtx("anthropic/ultra");
1011
846
  ctx.model = anthropicModel;
1012
847
  const streamOptions: any[] = [];
1013
848
  const fetchCalls: Array<[RequestInfo | URL, RequestInit | undefined]> = [];
@@ -1059,6 +894,19 @@ test("managed Anthropic requests opt into server-side fallback without changing
1059
894
  assert.ok(headers.get("x-keep"));
1060
895
  }
1061
896
 
897
+ const haikuModel = { provider: "anthropic", id: "claude-haiku-4-5", api: "anthropic-messages" };
898
+ const haikuOnPayload = (payload: unknown) => payload;
899
+ const haikuFetch = async () => new Response();
900
+ for await (const _event of providers["anthropic"].streamSimple(haikuModel, ctx, {
901
+ onPayload: haikuOnPayload,
902
+ fetch: haikuFetch,
903
+ })) {
904
+ // Drain the managed Haiku request.
905
+ }
906
+ assert.equal(streamOptions[1].onPayload, haikuOnPayload);
907
+ assert.equal(streamOptions[1].fetch, haikuFetch);
908
+ assert.deepEqual(await streamOptions[1].onPayload({ request: true }, haikuModel), { request: true });
909
+
1062
910
  await resetRotationState();
1063
911
  await helpers.writeSubscriptionPool("openai-codex", [credential("codex")]);
1064
912
  const codexModel = { provider: "openai-codex", id: "gpt-5.6-sol", api: "openai-codex-responses" };
@@ -11,7 +11,7 @@ import {
11
11
  realpathSync,
12
12
  } from "node:fs";
13
13
  import { homedir } from "node:os";
14
- import { join, resolve, sep, dirname } from "node:path";
14
+ import { join, resolve, dirname } from "node:path";
15
15
  import { loadProfileManifest } from "../../../core/profiles/manifest.js";
16
16
  import { stripMarkdownComments } from "../../../core/runtime/command-expansion.js";
17
17
 
@@ -53,7 +53,6 @@ const SHIM_DIR = join(HOME, ".pi", "agent", ".plugin-command-shims");
53
53
  const PI_PROMPTS = join(HOME, ".pi", "agent", "prompts");
54
54
  const PROJECT_PI_PROMPTS = ".pi/prompts";
55
55
 
56
- const INCLUDE_ALL_SCOPES = true;
57
56
  const EXCLUDE_NAMES = new Set(["claude.md", "agents.md", "readme.md", "index.md"]);
58
57
 
59
58
  type Kind = "command" | "skill";
@@ -63,7 +62,7 @@ type IndexRecord = { file: string; kind: Kind; baseDir: string };
63
62
  // hook to find the file to expand+execute (and how to frame it).
64
63
  const commandIndex = new Map<string, IndexRecord>();
65
64
 
66
- type InstallRecord = { scope?: string; installPath?: string; projectPath?: string };
65
+ type InstallRecord = { installPath?: string };
67
66
  type InstalledPlugins = { plugins?: Record<string, InstallRecord[]> };
68
67
  type Shim = { name: string; target: string; kind: Kind; baseDir: string };
69
68
 
@@ -171,14 +170,8 @@ function selectedProfileProjects(): string[] {
171
170
  }
172
171
  }
173
172
 
174
- function cwdInProject(cwd: string, projectPath: string): boolean {
175
- const a = resolve(cwd);
176
- const b = resolve(projectPath);
177
- return a === b || a.startsWith(b + sep);
178
- }
179
-
180
- // Installed plugins as { name, installPath } pairs (scope-filtered).
181
- function pluginDirs(cwd: string): { name: string; installPath: string }[] {
173
+ // Installed plugins as { name, installPath } pairs.
174
+ function pluginDirs(): { name: string; installPath: string }[] {
182
175
  if (!existsSync(INSTALLED)) return [];
183
176
  let data: InstalledPlugins;
184
177
  try {
@@ -191,9 +184,6 @@ function pluginDirs(cwd: string): { name: string; installPath: string }[] {
191
184
  const name = key.split("@")[0];
192
185
  for (const rec of records ?? []) {
193
186
  if (!rec.installPath) continue;
194
- if (!INCLUDE_ALL_SCOPES && rec.scope === "project") {
195
- if (!rec.projectPath || !cwdInProject(cwd, rec.projectPath)) continue;
196
- }
197
187
  out.push({ name, installPath: rec.installPath });
198
188
  }
199
189
  }
@@ -254,7 +244,7 @@ function buildShims(cwd: string): string {
254
244
  const shims: Shim[] = [];
255
245
  const nativeStems = nativePiPromptStems();
256
246
  const projectDirs = projectClaudeDirs(cwd, selectedProfileProjects());
257
- const plugins = pluginDirs(cwd);
247
+ const plugins = pluginDirs();
258
248
 
259
249
  // Commands: user, project ancestors, then plugins.
260
250
  collectCommands(USER_COMMANDS, [], [], shims);
@@ -70,6 +70,7 @@ import * as fs from "node:fs";
70
70
  import * as os from "node:os";
71
71
  import * as path from "node:path";
72
72
  import { parse as parseYaml } from "yaml";
73
+ import { mergeAutoLoadedContext } from "../../../../pi-extensions/envelope-merge.js";
73
74
 
74
75
  const MARKDOWN_EXTS = new Set([".md", ".mdx", ".markdown"]);
75
76
 
@@ -138,34 +139,6 @@ function attr(s: string): string {
138
139
  .replace(/>/g, "&gt;");
139
140
  }
140
141
 
141
- const AUTO_CONTEXT_RE = /<auto-loaded-context(?:\s[^>]*)?>\n([\s\S]*?)\n<\/auto-loaded-context>/;
142
-
143
- function isTextContent(block: ToolResultEvent["content"][number]): block is Extract<ToolResultEvent["content"][number], { type: "text" }> {
144
- return block.type === "text";
145
- }
146
-
147
- function mergeAutoLoadedContext(items: string[], content: ToolResultEvent["content"]): ToolResultEvent["content"] {
148
- const existingText = content.map((block) => isTextContent(block) ? block.text : "").join("\n");
149
- const fresh = items.map((item) => item.trim()).filter((item) => item !== "" && !existingText.includes(item));
150
- if (fresh.length === 0) return content;
151
- const inner = fresh.join("\n");
152
-
153
- const existingIdx = content.findIndex((block) => isTextContent(block) && AUTO_CONTEXT_RE.test(block.text));
154
- if (existingIdx !== -1) {
155
- return content.map((block, idx) => {
156
- if (idx !== existingIdx || !isTextContent(block)) return block;
157
- return {
158
- ...block,
159
- text: block.text.replace(AUTO_CONTEXT_RE, (_whole: string, current: string) => {
160
- const trimmed = String(current).trim();
161
- return `<auto-loaded-context>\n${inner}${trimmed === "" ? "" : `\n${trimmed}`}\n</auto-loaded-context>`;
162
- }),
163
- };
164
- });
165
- }
166
-
167
- return [{ type: "text" as const, text: `<auto-loaded-context>\n${inner}\n</auto-loaded-context>` }, ...content];
168
- }
169
142
 
170
143
  // Pull the leading `--- ... ---` YAML block out of a markdown file.
171
144
  function extractFrontmatter(raw: string): Frontmatter | null {
@@ -1,16 +1,11 @@
1
1
  import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
2
- import { execFile } from "node:child_process";
3
- import { promisify } from "node:util";
4
- import { readFileSync } from "node:fs";
5
- import { parse as parseYaml } from "yaml";
2
+ import { listMemoryDocs } from "../../../commands/memory/list.js";
3
+ import { createMemoryDocSnapshot, readMemoryDocContent } from "../../../commands/memory/read.js";
6
4
  import {
7
5
  expandDeterministicCommand,
8
6
  type DeterministicCommandExpansion,
9
7
  } from "../../../core/runtime/command-expansion.js";
10
8
 
11
- const exec = promisify(execFile);
12
- const CRTR = "crtr";
13
-
14
9
  // ---------------------------------------------------------------------------
15
10
  // memory-slash-commands: any memory doc frontmatter-flagged `slash: true`
16
11
  // becomes an invocable slash command (`/<name>`). This mirrors Hermes Agent's
@@ -18,24 +13,22 @@ const CRTR = "crtr";
18
13
  // the doc body (plus the user's free-text args) as a normal turn instead of
19
14
  // requiring a separate skill-invocation mechanism.
20
15
  //
21
- // Discovery shells out to `crtr memory list --json --paths`, which already
22
- // resolves the substrate's scope precedence (project stack > profile > user >
23
- // builtin) — this file does not walk memory/ directories or reimplement scope
24
- // resolution. `list`'s JSON items are already scope-precedence sorted (see
25
- // `scopeRank` in crouter's memory/shared.ts), so first-occurrence-wins per doc
26
- // name reproduces the resolver's identity precedence for free. `list` is
27
- // bounded/paginated, so discovery pages through the full corpus via
28
- // `next_cursor` until exhausted, and passes `--paths` because `path` is
29
- // load-bearing here (isSlashFlagged reads the file at each item's path).
16
+ // Discovery uses the in-process `memory list` inventory and its source
17
+ // snapshot, which already resolve the substrate's scope precedence (project
18
+ // stack > profile > user > builtin). This file does not walk memory/
19
+ // directories or reimplement scope resolution. `list`'s items are
20
+ // scope-precedence sorted (see `scopeRank` in crouter's memory/shared.ts), so
21
+ // first-occurrence-wins per doc name reproduces the resolver's identity
22
+ // precedence for free. The inventory carries parsed `slash` flags and resolved
23
+ // paths for command bodies.
30
24
  // ---------------------------------------------------------------------------
31
25
 
32
- const FRONTMATTER_RE = /^---\s*\r?\n([\s\S]*?)\r?\n---\s*\r?\n?/;
33
-
34
26
  interface MemoryListItem {
35
27
  name: string;
36
28
  path: string;
37
29
  short_form: string;
38
30
  is_dir: boolean;
31
+ slash: boolean;
39
32
  }
40
33
 
41
34
  export interface SlashDoc {
@@ -49,65 +42,40 @@ export interface SlashDoc {
49
42
  description: string;
50
43
  }
51
44
 
52
- interface MemoryListPage {
53
- items: MemoryListItem[];
54
- next_cursor: string | null;
55
- }
45
+ // `memory list` already chose the winning path for each identity. Keep that
46
+ // path for registration-body reads so every slash document does not re-walk the
47
+ // full corpus through `memory read`.
48
+ const resolvedMemoryPaths = new Map<string, string>();
56
49
 
57
50
  async function defaultListMemoryDocs(): Promise<MemoryListItem[]> {
58
- const items: MemoryListItem[] = [];
59
- let cursor: string | undefined;
60
- for (;;) {
61
- const args = ["memory", "list", "--json", "--paths", "--limit", "200"];
62
- if (cursor !== undefined) args.push("--cursor", cursor);
63
- const { stdout } = await exec(CRTR, args, { maxBuffer: 8 * 1024 * 1024 });
64
- const parsed = JSON.parse(stdout) as MemoryListPage;
65
- items.push(...parsed.items);
66
- if (parsed.next_cursor === null) break;
67
- cursor = parsed.next_cursor;
68
- }
51
+ const snapshot = createMemoryDocSnapshot();
52
+ const items = listMemoryDocs(undefined, undefined, true, snapshot.docs).map((doc) => ({
53
+ name: doc.name,
54
+ path: doc.path,
55
+ short_form: doc.shortForm,
56
+ is_dir: doc.isDir,
57
+ slash: doc.slash,
58
+ }));
59
+
60
+ // Slash eligibility follows the list identity, while the body follows the
61
+ // separate `memory read <name>` resolver contract (including direct-path
62
+ // precedence). Resolve all eligible names against one source snapshot.
63
+ const seen = new Set<string>();
64
+ const names = items.flatMap((item) => {
65
+ if (item.is_dir || seen.has(item.name)) return [];
66
+ seen.add(item.name);
67
+ return item.slash === true ? [item.name] : [];
68
+ });
69
+ const resolved = snapshot.resolve(names);
70
+ resolvedMemoryPaths.clear();
71
+ for (const [name, doc] of resolved) resolvedMemoryPaths.set(name, doc.path);
69
72
  return items;
70
73
  }
71
74
 
72
- async function defaultReadMemoryDoc(name: string): Promise<string> {
73
- const { stdout } = await exec(CRTR, ["memory", "read", name, "--json"], { maxBuffer: 8 * 1024 * 1024 });
74
- const parsed = JSON.parse(stdout) as { content: string };
75
- return parsed.content;
76
- }
77
-
78
- let listMemoryDocsImpl = defaultListMemoryDocs;
79
- let readMemoryDocImpl = defaultReadMemoryDoc;
80
-
81
- /** Test seam: override doc discovery so tests never shell out to `crtr`. */
82
- export function __setListMemoryDocsForTest(fn?: typeof listMemoryDocsImpl): void {
83
- listMemoryDocsImpl = fn ?? defaultListMemoryDocs;
84
- }
85
-
86
- /** Test seam: override doc-body reads so tests never shell out to `crtr`. */
87
- export function __setReadMemoryDocForTest(fn?: typeof readMemoryDocImpl): void {
88
- readMemoryDocImpl = fn ?? defaultReadMemoryDoc;
89
- }
90
-
91
- /** Read a memory doc's raw frontmatter directly off its already-resolved
92
- * `path` (from `crtr memory list`) and report whether `slash` is `true`.
93
- * No directory walk, no scope reasoning — the path is already resolved. */
94
- function isSlashFlagged(path: string): boolean {
95
- let raw: string;
96
- try {
97
- raw = readFileSync(path, "utf8");
98
- } catch {
99
- return false;
100
- }
101
- const match = raw.match(FRONTMATTER_RE);
102
- if (!match) return false;
103
- let data: unknown;
104
- try {
105
- data = parseYaml(match[1]);
106
- } catch {
107
- return false;
108
- }
109
- if (data === null || typeof data !== "object" || Array.isArray(data)) return false;
110
- return (data as Record<string, unknown>).slash === true;
75
+ function defaultReadMemoryDoc(name: string): string {
76
+ const path = resolvedMemoryPaths.get(name);
77
+ if (path === undefined) throw new Error(`memory slash document was not resolved: ${name}`);
78
+ return readMemoryDocContent(path);
111
79
  }
112
80
 
113
81
  /** `/`-joined path-derived doc name -> the registered slash-command name. */
@@ -121,7 +89,7 @@ export function slashCommandName(docName: string): string {
121
89
  export async function discoverSlashDocs(): Promise<SlashDoc[]> {
122
90
  let items: MemoryListItem[];
123
91
  try {
124
- items = await listMemoryDocsImpl();
92
+ items = await defaultListMemoryDocs();
125
93
  } catch {
126
94
  return [];
127
95
  }
@@ -131,26 +99,13 @@ export async function discoverSlashDocs(): Promise<SlashDoc[]> {
131
99
  if (item.is_dir) continue;
132
100
  if (seen.has(item.name)) continue;
133
101
  seen.add(item.name);
134
- if (isSlashFlagged(item.path)) {
102
+ if (item.slash) {
135
103
  out.push({ name: item.name, commandName: slashCommandName(item.name), description: item.short_form });
136
104
  }
137
105
  }
138
106
  return out;
139
107
  }
140
108
 
141
- /** Compose the invocation prompt from the freshly-read doc body plus the
142
- * user's raw invocation args, following Claude Code's `$ARGUMENTS`
143
- * convention. When the body contains `$ARGUMENTS`, every occurrence is
144
- * replaced with the trimmed args (empty string when none were given) and the
145
- * substituted body is injected AS-IS — the doc placed its own args, so no
146
- * extra header is added. Otherwise: a short invocation header naming the
147
- * command and the raw args (both the given-args and no-args cases are
148
- * load-bearing, per the Hermes /learn prompt pattern this mirrors), followed
149
- * by the full doc body as the instructions to follow. */
150
- export function composeSlashPrompt(commandName: string, rawArgs: string, body: string): string {
151
- return expandDeterministicCommand({ kind: "memory-slash", commandName, body }, rawArgs);
152
- }
153
-
154
109
  export default async function (pi: ExtensionAPI) {
155
110
  const docs = await discoverSlashDocs();
156
111
  for (const doc of docs) {
@@ -160,7 +115,7 @@ export default async function (pi: ExtensionAPI) {
160
115
  expansion = {
161
116
  kind: "memory-slash",
162
117
  commandName: doc.commandName,
163
- body: await readMemoryDocImpl(doc.name),
118
+ body: defaultReadMemoryDoc(doc.name),
164
119
  };
165
120
  } catch (err) {
166
121
  loadError = err;
@@ -281,6 +281,10 @@ function streamForProvider(model, context, options) {
281
281
  return activeStreamForProvider(model, context, options);
282
282
  }
283
283
  const ANTHROPIC_SERVER_SIDE_FALLBACK_BETA = "server-side-fallback-2026-07-01";
284
+ const ANTHROPIC_SERVER_SIDE_FALLBACK_PRIMARY_MODELS = new Set(["claude-fable-5", "claude-opus-5"]);
285
+ function supportsAnthropicServerSideFallback(model) {
286
+ return ANTHROPIC_SERVER_SIDE_FALLBACK_PRIMARY_MODELS.has(model.id);
287
+ }
284
288
  function includesAnthropicBetaToken(value) {
285
289
  return value.split(",").some((token) => token.trim() === ANTHROPIC_SERVER_SIDE_FALLBACK_BETA);
286
290
  }
@@ -331,7 +335,9 @@ async function streamProviderAttempt(state, providerId, model, context, options,
331
335
  const attemptAt = Date.now();
332
336
  let observedStatus;
333
337
  let requestedRetryAfterMs;
334
- const useAnthropicServerSideFallback = credential !== undefined && providerId === ANTHROPIC_PROVIDER_ID;
338
+ const useAnthropicServerSideFallback = credential !== undefined
339
+ && providerId === ANTHROPIC_PROVIDER_ID
340
+ && supportsAnthropicServerSideFallback(model);
335
341
  const streamOptions = {
336
342
  ...options,
337
343
  ...(credential ? { apiKey: credential.access } : {}),
@@ -399,6 +399,11 @@ function streamForProvider(model: Model<any>, context: Context, options: SimpleS
399
399
  }
400
400
 
401
401
  const ANTHROPIC_SERVER_SIDE_FALLBACK_BETA = "server-side-fallback-2026-07-01";
402
+ const ANTHROPIC_SERVER_SIDE_FALLBACK_PRIMARY_MODELS = new Set(["claude-fable-5", "claude-opus-5"]);
403
+
404
+ function supportsAnthropicServerSideFallback(model: Model<any>): boolean {
405
+ return ANTHROPIC_SERVER_SIDE_FALLBACK_PRIMARY_MODELS.has(model.id);
406
+ }
402
407
 
403
408
  function includesAnthropicBetaToken(value: string): boolean {
404
409
  return value.split(",").some((token) => token.trim() === ANTHROPIC_SERVER_SIDE_FALLBACK_BETA);
@@ -460,7 +465,10 @@ async function streamProviderAttempt(
460
465
  const attemptAt = Date.now();
461
466
  let observedStatus: number | undefined;
462
467
  let requestedRetryAfterMs: number | undefined;
463
- const useAnthropicServerSideFallback = credential !== undefined && providerId === ANTHROPIC_PROVIDER_ID;
468
+ const useAnthropicServerSideFallback =
469
+ credential !== undefined
470
+ && providerId === ANTHROPIC_PROVIDER_ID
471
+ && supportsAnthropicServerSideFallback(model);
464
472
  const streamOptions = {
465
473
  ...options,
466
474
  ...(credential ? { apiKey: credential.access } : {}),
package/dist/cli.js CHANGED
@@ -49,8 +49,8 @@ async function main() {
49
49
  // Lazy command tree: load only the subtree this invocation dispatches into.
50
50
  // resolveRoot returns the full tree only for help/version/unknown, where
51
51
  // every subtree is genuinely needed (root -h, the unknown-path error). The
52
- // hot leaf-dispatch path loads one subtree, keeping the other 11 (and their
53
- // heavy deps — the attach TUI, web/vite) off cold-start.
52
+ // hot leaf-dispatch path loads one subtree, keeping the other 11 and their
53
+ // heavy dependencies — including the attach TUI — off cold-start.
54
54
  const root = await resolveRoot(process.argv[2]);
55
55
  mark('cli.root_resolved');
56
56
  provisionExports(root, process.argv);