@north-light/crouter 0.3.172 → 0.3.174

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 (673) 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} +106 -177
  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 +55 -0
  46. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/provider-rotation.ts +60 -0
  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/node/bash.d.ts +1 -0
  138. package/dist/commands/node/bash.js +198 -0
  139. package/dist/commands/node/create.d.ts +23 -0
  140. package/dist/commands/node/create.js +207 -0
  141. package/dist/commands/node/inspect.d.ts +2 -0
  142. package/dist/commands/node/inspect.js +302 -0
  143. package/dist/commands/node/lifecycle.d.ts +4 -0
  144. package/dist/commands/node/lifecycle.js +415 -0
  145. package/dist/commands/node/message.d.ts +1 -0
  146. package/dist/commands/node/message.js +164 -0
  147. package/dist/commands/node/pyramid.d.ts +2 -0
  148. package/dist/commands/node/pyramid.js +79 -0
  149. package/dist/commands/node/subscription.d.ts +1 -0
  150. package/dist/commands/node/subscription.js +82 -0
  151. package/dist/commands/node/wait.d.ts +1 -0
  152. package/dist/commands/node/wait.js +159 -0
  153. package/dist/commands/node-lifecycle-revive.js +10 -57
  154. package/dist/commands/node.d.ts +0 -42
  155. package/dist/commands/node.js +11 -2065
  156. package/dist/commands/search.js +1 -1
  157. package/dist/commands/surface/node/cycle.d.ts +1 -0
  158. package/dist/commands/surface/node/cycle.js +83 -0
  159. package/dist/commands/surface/node/focus.d.ts +1 -0
  160. package/dist/commands/surface/node/focus.js +67 -0
  161. package/dist/commands/surface/node/id.d.ts +1 -0
  162. package/dist/commands/surface/node/id.js +38 -0
  163. package/dist/commands/surface/node/pin.d.ts +1 -0
  164. package/dist/commands/surface/node/pin.js +42 -0
  165. package/dist/commands/surface/node/placement.d.ts +46 -0
  166. package/dist/commands/surface/node/placement.js +124 -0
  167. package/dist/commands/surface-node.js +4 -1
  168. package/dist/commands/surface-reload.js +1 -2
  169. package/dist/commands/surface-tmux-spread.js +1 -1
  170. package/dist/commands/surface.js +5 -20
  171. package/dist/commands/sys/__tests__/setup-core.test.js +18 -271
  172. package/dist/commands/sys/config.js +6 -6
  173. package/dist/commands/sys/logs.js +1 -1
  174. package/dist/commands/sys/panels/broker-limits-panel.d.ts +17 -0
  175. package/dist/commands/sys/panels/broker-limits-panel.js +104 -0
  176. package/dist/commands/sys/panels/dependencies-panel.d.ts +14 -0
  177. package/dist/commands/sys/panels/dependencies-panel.js +80 -0
  178. package/dist/commands/sys/panels/keybindings-panel.d.ts +56 -0
  179. package/dist/commands/sys/panels/keybindings-panel.js +703 -0
  180. package/dist/commands/sys/panels/keys-panel.d.ts +16 -0
  181. package/dist/commands/sys/panels/keys-panel.js +60 -0
  182. package/dist/commands/sys/panels/models-panel.d.ts +77 -0
  183. package/dist/commands/sys/panels/models-panel.js +647 -0
  184. package/dist/commands/sys/panels/panel.d.ts +45 -0
  185. package/dist/commands/sys/panels/panel.js +137 -0
  186. package/dist/commands/sys/panels/plugins-panel.d.ts +16 -0
  187. package/dist/commands/sys/panels/plugins-panel.js +80 -0
  188. package/dist/commands/sys/panels/prefs-panel.d.ts +21 -0
  189. package/dist/commands/sys/panels/prefs-panel.js +85 -0
  190. package/dist/commands/sys/panels/provider-panel.d.ts +62 -0
  191. package/dist/commands/sys/panels/provider-panel.js +538 -0
  192. package/dist/commands/sys/settings-shell.d.ts +55 -0
  193. package/dist/commands/sys/settings-shell.js +400 -0
  194. package/dist/commands/sys/settings.d.ts +2 -0
  195. package/dist/commands/sys/settings.js +31 -0
  196. package/dist/commands/sys/setup-core.d.ts +3 -33
  197. package/dist/commands/sys/setup-core.js +27 -78
  198. package/dist/commands/sys/setup-settings-runner.d.ts +24 -0
  199. package/dist/commands/sys/setup-settings-runner.js +63 -0
  200. package/dist/commands/sys/setup-wizard.d.ts +26 -125
  201. package/dist/commands/sys/setup-wizard.js +209 -2473
  202. package/dist/commands/sys/setup.js +5 -7
  203. package/dist/commands/sys.js +3 -2
  204. package/dist/core/__tests__/broker-extension-canvas-db-boundary.test.js +50 -0
  205. package/dist/core/__tests__/broker-launch-candidates.test.js +20 -9
  206. package/dist/core/__tests__/broker-preflight.test.js +1 -1
  207. package/dist/core/__tests__/canvas-inbox-watcher-hold.test.js +108 -27
  208. package/dist/core/__tests__/canvas-inbox-watcher.test.js +14 -0
  209. package/dist/core/__tests__/canvas.test.js +2 -36
  210. package/dist/core/__tests__/close.test.js +14 -3
  211. package/dist/core/__tests__/context-intro.test.js +32 -143
  212. package/dist/core/__tests__/cron-broker-capacity.test.js +22 -3
  213. package/dist/core/__tests__/daemon-boot.test.js +2 -20
  214. package/dist/core/__tests__/daemon-wedge.test.js +1 -1
  215. package/dist/core/__tests__/dead-node-policy-table.test.js +1 -18
  216. package/dist/core/__tests__/fixtures/fake-engine.d.ts +1 -1
  217. package/dist/core/__tests__/fixtures/fake-engine.js +2 -2
  218. package/dist/core/__tests__/fixtures/fake-pi-host.js +2 -2
  219. package/dist/core/__tests__/focuses.test.js +4 -98
  220. package/dist/core/__tests__/helpers/broker-clients.d.ts +0 -3
  221. package/dist/core/__tests__/helpers/broker-clients.js +0 -14
  222. package/dist/core/__tests__/helpers/harness.d.ts +0 -8
  223. package/dist/core/__tests__/helpers/harness.js +7 -87
  224. package/dist/core/__tests__/helpers/viewer-panes.js +1 -1
  225. package/dist/core/__tests__/inline-memory-refs.test.js +5 -134
  226. package/dist/core/__tests__/kickoff.test.js +1 -1
  227. package/dist/core/__tests__/memory-resolver-precedence.test.js +29 -1
  228. package/dist/core/__tests__/migration.test.js +35 -48
  229. package/dist/core/__tests__/on-read-dedup-resume.test.js +22 -12
  230. package/dist/core/__tests__/passive-subscription.test.js +26 -49
  231. package/dist/core/__tests__/preview-registry-sync.test.js +1 -2
  232. package/dist/core/__tests__/prune.test.js +94 -1
  233. package/dist/core/__tests__/review-model-floor.test.js +0 -32
  234. package/dist/core/__tests__/seam/broker-attach-multiclient.test.js +255 -0
  235. package/dist/core/__tests__/{full → seam}/broker-attach-stream.test.js +39 -7
  236. package/dist/core/__tests__/{full → seam}/broker-crash-teardown.test.js +30 -29
  237. package/dist/core/__tests__/{full → seam}/broker-pane-resolution.test.js +54 -5
  238. package/dist/core/__tests__/{full → seam}/broker-provider-retry.test.js +134 -82
  239. package/dist/core/__tests__/{full → seam}/broker-whip-interrupt.test.js +15 -4
  240. package/dist/core/__tests__/{full/idle-release-settlement.test.js → seam/dormancy-release.test.js} +69 -17
  241. package/dist/core/__tests__/{full/yield-message-transaction.test.js → seam/yield-refresh-transaction.test.js} +31 -9
  242. package/dist/core/__tests__/secrets.test.js +1 -7
  243. package/dist/core/__tests__/{broker-fork-seam.test.js → serial/broker-fork-seam.test.js} +58 -7
  244. package/dist/core/__tests__/{broker-sdk-wiring.test.js → serial/broker-sdk-wiring.test.js} +18 -162
  245. package/dist/core/__tests__/{broker-snapshot-history.test.js → serial/broker-snapshot-history.test.js} +9 -9
  246. package/dist/core/__tests__/{command-plugins.test.js → serial/command-plugins.test.js} +105 -15
  247. package/dist/core/__tests__/{deferred-no-wake.test.js → serial/deferred-no-wake.test.js} +23 -20
  248. package/dist/core/__tests__/{flagship-lifecycle.test.js → serial/flagship-lifecycle.test.js} +7 -7
  249. package/dist/core/__tests__/{host-teardown-process-group.test.js → serial/host-teardown-process-group.test.js} +6 -6
  250. package/dist/core/__tests__/{human-deliver-e2e.test.js → serial/human-deliver-e2e.test.js} +12 -12
  251. package/dist/core/__tests__/{live-mutation.test.js → serial/live-mutation.test.js} +5 -5
  252. package/dist/core/__tests__/{refresh-stall-recycle.test.js → serial/refresh-stall-recycle.test.js} +5 -14
  253. package/dist/core/__tests__/{revive.test.js → serial/revive.test.js} +15 -100
  254. package/dist/core/__tests__/{spawn-root.test.js → serial/spawn-root.test.js} +32 -15
  255. package/dist/core/__tests__/serial/subscription-delivery.test.js +126 -0
  256. package/dist/core/__tests__/serial/tmux-surface.test.js +256 -0
  257. package/dist/core/__tests__/{worktree.test.js → serial/worktree.test.js} +15 -15
  258. package/dist/core/__tests__/session-model.test.js +0 -18
  259. package/dist/core/__tests__/spawn-worktree-id-conflict.test.js +9 -0
  260. package/dist/core/__tests__/watchdog-abort-arms-retry.test.js +50 -0
  261. package/dist/core/broker-client/__tests__/transport-relay.test.js +15 -16
  262. package/dist/core/broker-client/__tests__/transport-socket.test.js +28 -0
  263. package/dist/core/broker-client/client.d.ts +2 -2
  264. package/dist/core/broker-client/client.js +4 -7
  265. package/dist/core/broker-client/transport-relay.d.ts +13 -19
  266. package/dist/core/broker-client/transport-relay.js +19 -34
  267. package/dist/core/broker-client/transport-socket.d.ts +2 -2
  268. package/dist/core/broker-client/transport-socket.js +9 -2
  269. package/dist/core/broker-client/transport.d.ts +7 -3
  270. package/dist/core/broker-client/transport.js +4 -4
  271. package/dist/core/canvas/__tests__/attention.test.js +1 -18
  272. package/dist/core/canvas/__tests__/remote-canvas-source.test.js +7 -64
  273. package/dist/core/canvas/__tests__/remote-transport.test.js +2 -3
  274. package/dist/core/canvas/__tests__/render-remote.test.js +7 -52
  275. package/dist/core/canvas/browse/app.d.ts +2 -17
  276. package/dist/core/canvas/browse/app.js +16 -88
  277. package/dist/core/canvas/browse/model.d.ts +0 -4
  278. package/dist/core/canvas/browse/model.js +1 -12
  279. package/dist/core/canvas/browse/render.js +6 -3
  280. package/dist/core/canvas/crons.d.ts +8 -5
  281. package/dist/core/canvas/crons.js +7 -6
  282. package/dist/core/canvas/extensions.d.ts +7 -3
  283. package/dist/core/canvas/extensions.js +16 -4
  284. package/dist/core/canvas/nav-model.d.ts +0 -4
  285. package/dist/core/canvas/nav-model.js +2 -14
  286. package/dist/core/canvas/node-order.d.ts +3 -0
  287. package/dist/core/canvas/node-order.js +12 -0
  288. package/dist/core/canvas/remote-canvas-source.d.ts +3 -6
  289. package/dist/core/canvas/remote-canvas-source.js +8 -15
  290. package/dist/core/command.js +11 -4
  291. package/dist/core/config.js +3 -1
  292. package/dist/core/events/envelope.js +1 -1
  293. package/dist/core/events/read.js +7 -21
  294. package/dist/core/events/source.d.ts +0 -2
  295. package/dist/core/events/source.js +0 -16
  296. package/dist/core/events/types.d.ts +1 -1
  297. package/dist/core/fault-classifier.d.ts +1 -1
  298. package/dist/core/feed/passive.d.ts +0 -11
  299. package/dist/core/feed/passive.js +1 -62
  300. package/dist/core/human/__tests__/{inbox-core.test.js → serial/inbox-core.test.js} +6 -6
  301. package/dist/core/keybindings/__tests__/resolve.test.js +1 -96
  302. package/dist/core/keybindings/background-bash.js +3 -4
  303. package/dist/core/keybindings/catalog.js +1 -1
  304. package/dist/core/memory/inline-ref-grammar.js +3 -3
  305. package/dist/core/memory-resolver.d.ts +11 -25
  306. package/dist/core/memory-resolver.js +51 -33
  307. package/dist/core/model-routes.d.ts +15 -0
  308. package/dist/core/model-routes.js +12 -0
  309. package/dist/core/pool-credential-store.js +1 -1
  310. package/dist/core/preview-registry.js +8 -9
  311. package/dist/core/profiles/__tests__/root-profile.test.js +4 -14
  312. package/dist/core/review/realize.d.ts +0 -13
  313. package/dist/core/review/realize.js +0 -40
  314. package/dist/core/review/types.d.ts +1 -1
  315. package/dist/core/runtime/__tests__/engine-route.test.js +2 -2
  316. package/dist/core/runtime/bearings.js +1 -11
  317. package/dist/core/runtime/broker/client-registry.d.ts +33 -0
  318. package/dist/core/runtime/broker/client-registry.js +164 -0
  319. package/dist/core/runtime/broker/daemon-ops.d.ts +19 -0
  320. package/dist/core/runtime/broker/daemon-ops.js +49 -0
  321. package/dist/core/runtime/broker/event-projection.d.ts +42 -0
  322. package/dist/core/runtime/broker/event-projection.js +178 -0
  323. package/dist/core/runtime/broker/fault-retry.d.ts +39 -0
  324. package/dist/core/runtime/broker/fault-retry.js +277 -0
  325. package/dist/core/runtime/broker/frame-dispatch.d.ts +238 -0
  326. package/dist/core/runtime/broker/frame-dispatch.js +1537 -0
  327. package/dist/core/runtime/broker/inbox.d.ts +22 -0
  328. package/dist/core/runtime/broker/inbox.js +167 -0
  329. package/dist/core/runtime/broker/passive.d.ts +16 -0
  330. package/dist/core/runtime/broker/passive.js +44 -0
  331. package/dist/core/runtime/broker/read-ops.d.ts +23 -0
  332. package/dist/core/runtime/broker/read-ops.js +150 -0
  333. package/dist/core/runtime/broker/rebind.d.ts +74 -0
  334. package/dist/core/runtime/broker/rebind.js +211 -0
  335. package/dist/core/runtime/broker/tool-groups.d.ts +39 -0
  336. package/dist/core/runtime/broker/tool-groups.js +244 -0
  337. package/dist/core/runtime/broker-extension-render.d.ts +11 -0
  338. package/dist/core/runtime/broker-extension-render.js +181 -0
  339. package/dist/core/runtime/broker-persona-guidance.d.ts +13 -0
  340. package/dist/core/runtime/broker-persona-guidance.js +58 -0
  341. package/dist/core/runtime/broker-protocol.d.ts +1 -1
  342. package/dist/core/runtime/broker-protocol.js +1 -1
  343. package/dist/core/runtime/broker.d.ts +5 -196
  344. package/dist/core/runtime/broker.js +276 -3059
  345. package/dist/core/runtime/canvas-extensions.js +11 -2
  346. package/dist/core/runtime/fault.js +1 -1
  347. package/dist/core/runtime/model-selection.d.ts +9 -0
  348. package/dist/core/runtime/model-selection.js +12 -0
  349. package/dist/core/runtime/model-swap.d.ts +3 -3
  350. package/dist/core/runtime/model-swap.js +33 -25
  351. package/dist/core/runtime/placement-tmux.d.ts +3 -14
  352. package/dist/core/runtime/placement-tmux.js +11 -80
  353. package/dist/core/runtime/placement.d.ts +4 -2
  354. package/dist/core/runtime/placement.js +7 -12
  355. package/dist/core/runtime/promote.d.ts +14 -1
  356. package/dist/core/runtime/promote.js +1 -1
  357. package/dist/core/runtime/reset.d.ts +1 -1
  358. package/dist/core/runtime/roadmap.js +1 -1
  359. package/dist/core/runtime/spawn.d.ts +8 -0
  360. package/dist/core/runtime/spawn.js +36 -6
  361. package/dist/core/runtime/stop-guard.d.ts +4 -3
  362. package/dist/core/runtime/stop-guard.js +36 -18
  363. package/dist/core/runtime/stop-signals.d.ts +4 -1
  364. package/dist/core/runtime/stream-watchdog.js +4 -5
  365. package/dist/core/runtime/structured-output.d.ts +15 -2
  366. package/dist/core/runtime/structured-output.js +35 -12
  367. package/dist/core/runtime/tmux-bindings.d.ts +25 -0
  368. package/dist/core/runtime/tmux-bindings.js +682 -0
  369. package/dist/core/runtime/tmux-chrome.d.ts +2 -1
  370. package/dist/core/runtime/tmux-chrome.js +3 -2
  371. package/dist/core/runtime/{tmux.d.ts → tmux-driver.d.ts} +18 -26
  372. package/dist/core/runtime/tmux-driver.js +598 -0
  373. package/dist/core/runtime/view-socket.d.ts +14 -0
  374. package/dist/core/runtime/view-socket.js +83 -0
  375. package/dist/core/session-model/session-state.d.ts +1 -2
  376. package/dist/core/session-model/session-state.js +5 -8
  377. package/dist/core/spawn.d.ts +1 -1
  378. package/dist/core/spawn.js +2 -2
  379. package/dist/core/substrate/gate.d.ts +1 -1
  380. package/dist/core/substrate/on-read-pure.d.ts +7 -0
  381. package/dist/core/substrate/on-read-pure.js +272 -0
  382. package/dist/core/termrender/termrender.js +32 -2
  383. package/dist/core/user-settings.d.ts +23 -1
  384. package/dist/core/user-settings.js +18 -1
  385. package/dist/daemon/api/__tests__/node-model-validation.test.js +134 -0
  386. package/dist/daemon/api/__tests__/review-terminal-conflict.test.js +98 -0
  387. package/dist/daemon/api/__tests__/{full → seam}/api-server.test.js +6 -48
  388. package/dist/daemon/api/__tests__/{full → seam}/b10-attach-modelauth.test.js +17 -44
  389. package/dist/daemon/api/__tests__/{full/push-parity.test.js → seam/leaf-api-parity.test.js} +61 -42
  390. package/dist/daemon/api/bridge.js +40 -81
  391. package/dist/daemon/api/handlers/broker-ops.d.ts +2 -0
  392. package/dist/daemon/api/handlers/broker-ops.js +383 -0
  393. package/dist/daemon/api/handlers/crons.js +9 -4
  394. package/dist/daemon/api/handlers/files.js +6 -7
  395. package/dist/daemon/api/handlers/inbox.js +2 -340
  396. package/dist/daemon/api/handlers/nodes.d.ts +10 -1
  397. package/dist/daemon/api/handlers/nodes.js +74 -39
  398. package/dist/daemon/api/handlers/review-comments.js +5 -1
  399. package/dist/daemon/api/handlers/reviews.js +0 -19
  400. package/dist/daemon/api/map.js +25 -4
  401. package/dist/daemon/api/router.js +2 -3
  402. package/dist/daemon/api/server.js +5 -7
  403. package/dist/daemon/cron-run.d.ts +4 -0
  404. package/dist/daemon/cron-run.js +30 -13
  405. package/dist/daemon/crtrd.d.ts +3 -58
  406. package/dist/daemon/crtrd.js +28 -1244
  407. package/dist/daemon/manage.js +0 -1
  408. package/dist/daemon/reconcilers/broker-supervision.d.ts +50 -0
  409. package/dist/daemon/reconcilers/broker-supervision.js +549 -0
  410. package/dist/daemon/reconcilers/cron-lane.d.ts +10 -0
  411. package/dist/daemon/reconcilers/cron-lane.js +32 -0
  412. package/dist/daemon/reconcilers/dormant-inbox.d.ts +18 -0
  413. package/dist/daemon/reconcilers/dormant-inbox.js +143 -0
  414. package/dist/daemon/reconcilers/storage-maintenance.d.ts +22 -0
  415. package/dist/daemon/reconcilers/storage-maintenance.js +213 -0
  416. package/dist/daemon/review/finish.js +2 -5
  417. package/dist/pi-extensions/__tests__/canvas-context-intro.test.js +34 -53
  418. package/dist/pi-extensions/__tests__/canvas-recap.test.js +16 -113
  419. package/dist/pi-extensions/__tests__/canvas-stophook-agentend.test.js +72 -99
  420. package/dist/pi-extensions/__tests__/canvas-stophook-context-nudge.test.js +29 -12
  421. package/dist/pi-extensions/broker-local.d.ts +20 -0
  422. package/dist/pi-extensions/broker-local.js +89 -0
  423. package/dist/pi-extensions/canvas-context-intro.d.ts +3 -3
  424. package/dist/pi-extensions/canvas-context-intro.js +22 -11
  425. package/dist/pi-extensions/canvas-doc-substrate.js +17 -34
  426. package/dist/pi-extensions/canvas-goal-capture.js +7 -12
  427. package/dist/pi-extensions/canvas-inbox-watcher.js +124 -139
  428. package/dist/pi-extensions/canvas-passive-context.d.ts +3 -3
  429. package/dist/pi-extensions/canvas-passive-context.js +22 -18
  430. package/dist/pi-extensions/canvas-recap.d.ts +2 -2
  431. package/dist/pi-extensions/canvas-recap.js +48 -21
  432. package/dist/pi-extensions/canvas-review-boundary.js +10 -4
  433. package/dist/pi-extensions/canvas-stophook.d.ts +0 -5
  434. package/dist/pi-extensions/canvas-stophook.js +149 -431
  435. package/dist/pi-extensions/canvas-structured-output.js +52 -30
  436. package/dist/pi-extensions/envelope-merge.d.ts +13 -0
  437. package/dist/pi-extensions/envelope-merge.js +29 -0
  438. package/dist/shared/working-activity.d.ts +3 -2
  439. package/dist/shared/working-activity.js +3 -2
  440. package/dist/types.d.ts +6 -5
  441. package/dist/types.js +2 -2
  442. package/docs/compat/hearth-crtr-v1.md +4 -12
  443. package/docs/compat/hearth-crtr-v2.md +3 -11
  444. package/docs/compat/hearth-crtr-v3.md +4 -12
  445. package/docs/compat/hearth-crtr-v4.md +3 -11
  446. package/docs/compat/hearth-crtr-v5.md +3 -11
  447. package/docs/public-api.md +3 -7
  448. package/package.json +7 -49
  449. package/runtime.lock.json +2766 -14533
  450. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/__tests__/claude-plugin-commands.test.ts +0 -49
  451. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/__tests__/memory-slash-commands.test.ts +0 -194
  452. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/__tests__/statusline.test.ts +0 -68
  453. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/frontmatter-rules/test.ts +0 -119
  454. package/dist/clients/attach/__tests__/attach-chrome-remote.test.js +0 -439
  455. package/dist/clients/attach/__tests__/attach-keybindings.test.js +0 -170
  456. package/dist/clients/attach/__tests__/crtr-output-coverage.test.js +0 -57
  457. package/dist/clients/attach/__tests__/editor-frame-title.test.js +0 -19
  458. package/dist/clients/attach/__tests__/input-controller-extension-command.test.js +0 -32
  459. package/dist/clients/attach/__tests__/markdown-headings.test.js +0 -35
  460. package/dist/clients/attach/__tests__/session-identity-refresh.test.js +0 -32
  461. package/dist/clients/conversation/conversation.d.ts +0 -65
  462. package/dist/clients/conversation/conversation.js +0 -318
  463. package/dist/clients/conversation/frames.d.ts +0 -30
  464. package/dist/clients/conversation/frames.js +0 -52
  465. package/dist/clients/conversation/region.d.ts +0 -51
  466. package/dist/clients/conversation/region.js +0 -265
  467. package/dist/clients/inbox/__tests__/inbox-controller.test.js +0 -247
  468. package/dist/clients/inbox/__tests__/mount-panel.test.js +0 -776
  469. package/dist/clients/inbox/review/__tests__/remap.test.js +0 -196
  470. package/dist/clients/inbox/review/columns.d.ts +0 -22
  471. package/dist/clients/inbox/review/columns.js +0 -40
  472. package/dist/clients/inbox/review/composition.d.ts +0 -60
  473. package/dist/clients/inbox/review/composition.js +0 -278
  474. package/dist/clients/inbox/review/document-region.d.ts +0 -120
  475. package/dist/clients/surfaces/region.d.ts +0 -16
  476. package/dist/clients/web/__tests__/push-engine.test.js +0 -158
  477. package/dist/clients/web/__tests__/push-registry.test.d.ts +0 -1
  478. package/dist/clients/web/__tests__/push-registry.test.js +0 -177
  479. package/dist/clients/web/dev-server.d.ts +0 -7
  480. package/dist/clients/web/dev-server.js +0 -46
  481. package/dist/clients/web/events.d.ts +0 -19
  482. package/dist/clients/web/events.js +0 -163
  483. package/dist/clients/web/push-engine.d.ts +0 -44
  484. package/dist/clients/web/push-engine.js +0 -125
  485. package/dist/clients/web/push-registry.d.ts +0 -85
  486. package/dist/clients/web/push-registry.js +0 -373
  487. package/dist/clients/web/server.d.ts +0 -19
  488. package/dist/clients/web/server.js +0 -661
  489. package/dist/clients/web/web-client/shared/protocol.d.ts +0 -214
  490. package/dist/clients/web/web-client/shared/protocol.js +0 -8
  491. package/dist/clients/web/web-cmd.d.ts +0 -2
  492. package/dist/clients/web/web-cmd.js +0 -141
  493. package/dist/commands/__tests__/api-canvas-source.test.d.ts +0 -1
  494. package/dist/commands/__tests__/api-canvas-source.test.js +0 -37
  495. package/dist/commands/__tests__/canvas-config.test.d.ts +0 -1
  496. package/dist/commands/__tests__/canvas-config.test.js +0 -107
  497. package/dist/commands/__tests__/node-no-kickoff-flag.test.d.ts +0 -1
  498. package/dist/commands/__tests__/node-no-kickoff-flag.test.js +0 -73
  499. package/dist/commands/__tests__/node-worktree-flag.test.d.ts +0 -1
  500. package/dist/commands/__tests__/node-worktree-flag.test.js +0 -49
  501. package/dist/commands/__tests__/search-contents.test.d.ts +0 -1
  502. package/dist/commands/__tests__/search-contents.test.js +0 -52
  503. package/dist/commands/memory/__tests__/lint.test.d.ts +0 -1
  504. package/dist/commands/memory/__tests__/lint.test.js +0 -15
  505. package/dist/commands/sys/__tests__/config-broker-thresholds.test.d.ts +0 -1
  506. package/dist/commands/sys/__tests__/config-broker-thresholds.test.js +0 -95
  507. package/dist/commands/sys/__tests__/config-keybindings.test.d.ts +0 -1
  508. package/dist/commands/sys/__tests__/config-keybindings.test.js +0 -55
  509. package/dist/commands/sys/__tests__/helpers/setup-runtime.d.ts +0 -5
  510. package/dist/commands/sys/__tests__/helpers/setup-runtime.js +0 -19
  511. package/dist/commands/sys/__tests__/setup-front-door.test.d.ts +0 -1
  512. package/dist/commands/sys/__tests__/setup-front-door.test.js +0 -102
  513. package/dist/commands/sys/__tests__/setup-models.test.d.ts +0 -1
  514. package/dist/commands/sys/__tests__/setup-models.test.js +0 -205
  515. package/dist/commands/sys/__tests__/setup-providers-viewport.test.d.ts +0 -1
  516. package/dist/commands/sys/__tests__/setup-providers-viewport.test.js +0 -155
  517. package/dist/commands/sys/__tests__/sync-deps.test.d.ts +0 -1
  518. package/dist/commands/sys/__tests__/sync-deps.test.js +0 -179
  519. package/dist/commands/sys/__tests__/sync-import.test.d.ts +0 -1
  520. package/dist/commands/sys/__tests__/sync-import.test.js +0 -315
  521. package/dist/core/__tests__/base-worker-prompt.test.d.ts +0 -1
  522. package/dist/core/__tests__/base-worker-prompt.test.js +0 -57
  523. package/dist/core/__tests__/command-plugins-surfaces.test.d.ts +0 -1
  524. package/dist/core/__tests__/command-plugins-surfaces.test.js +0 -359
  525. package/dist/core/__tests__/connection-reconnect-resume.test.d.ts +0 -1
  526. package/dist/core/__tests__/connection-reconnect-resume.test.js +0 -36
  527. package/dist/core/__tests__/finalization-migration.test.d.ts +0 -1
  528. package/dist/core/__tests__/finalization-migration.test.js +0 -38
  529. package/dist/core/__tests__/fixtures/extra-extension.d.ts +0 -1
  530. package/dist/core/__tests__/fixtures/extra-extension.js +0 -3
  531. package/dist/core/__tests__/fixtures/spawn-proof-target.test.d.ts +0 -1
  532. package/dist/core/__tests__/fixtures/spawn-proof-target.test.js +0 -15
  533. package/dist/core/__tests__/fork.test.d.ts +0 -1
  534. package/dist/core/__tests__/fork.test.js +0 -108
  535. package/dist/core/__tests__/full/broker-attach-limits.test.d.ts +0 -1
  536. package/dist/core/__tests__/full/broker-attach-limits.test.js +0 -147
  537. package/dist/core/__tests__/full/broker-deliver-ack.test.d.ts +0 -1
  538. package/dist/core/__tests__/full/broker-deliver-ack.test.js +0 -73
  539. package/dist/core/__tests__/full/broker-dialogs.test.d.ts +0 -1
  540. package/dist/core/__tests__/full/broker-dialogs.test.js +0 -180
  541. package/dist/core/__tests__/full/broker-display-snapshot.test.d.ts +0 -1
  542. package/dist/core/__tests__/full/broker-display-snapshot.test.js +0 -75
  543. package/dist/core/__tests__/full/broker-dormant-wake.test.d.ts +0 -1
  544. package/dist/core/__tests__/full/broker-dormant-wake.test.js +0 -130
  545. package/dist/core/__tests__/full/broker-model-changed-broadcast.test.d.ts +0 -1
  546. package/dist/core/__tests__/full/broker-model-changed-broadcast.test.js +0 -57
  547. package/dist/core/__tests__/full/broker-navigate-tree-rewelcome.test.d.ts +0 -1
  548. package/dist/core/__tests__/full/broker-navigate-tree-rewelcome.test.js +0 -80
  549. package/dist/core/__tests__/full/cascade-close.test.d.ts +0 -1
  550. package/dist/core/__tests__/full/cascade-close.test.js +0 -240
  551. package/dist/core/__tests__/full/detach-focus.test.d.ts +0 -1
  552. package/dist/core/__tests__/full/detach-focus.test.js +0 -126
  553. package/dist/core/__tests__/full/idle-release-settlement.test.d.ts +0 -1
  554. package/dist/core/__tests__/full/issue-146-yield-spawn-focus.test.d.ts +0 -1
  555. package/dist/core/__tests__/full/issue-146-yield-spawn-focus.test.js +0 -107
  556. package/dist/core/__tests__/full/park-clock-release.test.d.ts +0 -1
  557. package/dist/core/__tests__/full/park-clock-release.test.js +0 -56
  558. package/dist/core/__tests__/full/yield-message-transaction.test.d.ts +0 -1
  559. package/dist/core/__tests__/memory-index-render.test.d.ts +0 -1
  560. package/dist/core/__tests__/memory-index-render.test.js +0 -60
  561. package/dist/core/__tests__/model-routes.test.d.ts +0 -1
  562. package/dist/core/__tests__/model-routes.test.js +0 -41
  563. package/dist/core/__tests__/on-read-identity.test.d.ts +0 -1
  564. package/dist/core/__tests__/on-read-identity.test.js +0 -61
  565. package/dist/core/__tests__/phase4-review-migration.test.d.ts +0 -1
  566. package/dist/core/__tests__/phase4-review-migration.test.js +0 -100
  567. package/dist/core/__tests__/prune-to-limit.test.d.ts +0 -1
  568. package/dist/core/__tests__/prune-to-limit.test.js +0 -126
  569. package/dist/core/__tests__/reset.test.d.ts +0 -1
  570. package/dist/core/__tests__/reset.test.js +0 -69
  571. package/dist/core/__tests__/spawn-no-kickoff.test.d.ts +0 -1
  572. package/dist/core/__tests__/spawn-no-kickoff.test.js +0 -115
  573. package/dist/core/__tests__/steer-note.test.d.ts +0 -1
  574. package/dist/core/__tests__/steer-note.test.js +0 -41
  575. package/dist/core/__tests__/subcommand-tier.test.d.ts +0 -1
  576. package/dist/core/__tests__/subcommand-tier.test.js +0 -99
  577. package/dist/core/__tests__/subscription-delivery.test.js +0 -211
  578. package/dist/core/__tests__/test-runner-cheap-sharding.test.d.ts +0 -1
  579. package/dist/core/__tests__/test-runner-cheap-sharding.test.js +0 -97
  580. package/dist/core/__tests__/tmux-surface.test.js +0 -484
  581. package/dist/core/__tests__/wake-bearings.test.d.ts +0 -1
  582. package/dist/core/__tests__/wake-bearings.test.js +0 -102
  583. package/dist/core/canvas/__tests__/remote-event-stream.test.d.ts +0 -1
  584. package/dist/core/canvas/__tests__/remote-event-stream.test.js +0 -146
  585. package/dist/core/canvas/__tests__/source-resolve.test.d.ts +0 -1
  586. package/dist/core/canvas/__tests__/source-resolve.test.js +0 -77
  587. package/dist/core/canvas/browse/__tests__/model.test.d.ts +0 -1
  588. package/dist/core/canvas/browse/__tests__/model.test.js +0 -290
  589. package/dist/core/canvas/browse/__tests__/rebuild-coalescer.test.d.ts +0 -1
  590. package/dist/core/canvas/browse/__tests__/rebuild-coalescer.test.js +0 -134
  591. package/dist/core/canvas/browse/__tests__/render.test.d.ts +0 -1
  592. package/dist/core/canvas/browse/__tests__/render.test.js +0 -111
  593. package/dist/core/canvas/browse/rebuild-coalescer.d.ts +0 -7
  594. package/dist/core/canvas/browse/rebuild-coalescer.js +0 -61
  595. package/dist/core/canvas/remote-event-stream.d.ts +0 -24
  596. package/dist/core/canvas/remote-event-stream.js +0 -94
  597. package/dist/core/feed/__tests__/coalesce-human.test.d.ts +0 -1
  598. package/dist/core/feed/__tests__/coalesce-human.test.js +0 -36
  599. package/dist/core/feed/__tests__/empty-node-guard.test.d.ts +0 -1
  600. package/dist/core/feed/__tests__/empty-node-guard.test.js +0 -45
  601. package/dist/core/host-exports/__tests__/export-prunes-boot-skill.test.d.ts +0 -1
  602. package/dist/core/host-exports/__tests__/export-prunes-boot-skill.test.js +0 -84
  603. package/dist/core/human/__tests__/visible-paths.test.d.ts +0 -1
  604. package/dist/core/human/__tests__/visible-paths.test.js +0 -28
  605. package/dist/core/keybindings/__tests__/inbox-affordance.test.d.ts +0 -1
  606. package/dist/core/keybindings/__tests__/inbox-affordance.test.js +0 -38
  607. package/dist/core/review/__tests__/project.test.d.ts +0 -1
  608. package/dist/core/review/__tests__/project.test.js +0 -71
  609. package/dist/core/runtime/__tests__/command-expansion.test.d.ts +0 -1
  610. package/dist/core/runtime/__tests__/command-expansion.test.js +0 -25
  611. package/dist/core/runtime/__tests__/session-visibility.test.d.ts +0 -1
  612. package/dist/core/runtime/__tests__/session-visibility.test.js +0 -119
  613. package/dist/core/runtime/__tests__/spawn-at-given-id.test.d.ts +0 -1
  614. package/dist/core/runtime/__tests__/spawn-at-given-id.test.js +0 -34
  615. package/dist/core/runtime/tmux.js +0 -1314
  616. package/dist/daemon/api/__tests__/full/push-parity.test.d.ts +0 -1
  617. package/dist/daemon/api/__tests__/full/worktree-parity.test.d.ts +0 -1
  618. package/dist/daemon/api/__tests__/full/worktree-parity.test.js +0 -160
  619. package/dist/daemon/api/__tests__/inbox.test.d.ts +0 -1
  620. package/dist/daemon/api/__tests__/inbox.test.js +0 -489
  621. package/dist/web-client/apple-touch-icon.png +0 -0
  622. package/dist/web-client/assets/fragment-mono-latin-400-normal-BYwT3kSJ.woff +0 -0
  623. package/dist/web-client/assets/fragment-mono-latin-400-normal-yxdJ5AmL.woff2 +0 -0
  624. package/dist/web-client/assets/fragment-mono-latin-ext-400-normal-BbKYyvR9.woff2 +0 -0
  625. package/dist/web-client/assets/fragment-mono-latin-ext-400-normal-CT4YFKeK.woff +0 -0
  626. package/dist/web-client/assets/index-CCPaLeW7.css +0 -2
  627. package/dist/web-client/assets/index-kyOWsnZK.js +0 -86
  628. package/dist/web-client/assets/martian-mono-cyrillic-wght-normal-B84CD5C_.woff2 +0 -0
  629. package/dist/web-client/assets/martian-mono-latin-ext-wght-normal-DlL6xMw5.woff2 +0 -0
  630. package/dist/web-client/assets/martian-mono-latin-wght-normal-5W32yIyr.woff2 +0 -0
  631. package/dist/web-client/assets/workbox-window.prod.es5-Bd17z0YL.js +0 -2
  632. package/dist/web-client/icon-192.png +0 -0
  633. package/dist/web-client/icon-512.png +0 -0
  634. package/dist/web-client/icon-maskable-512.png +0 -0
  635. package/dist/web-client/index.html +0 -17
  636. package/dist/web-client/manifest.webmanifest +0 -1
  637. package/dist/web-client/sw.js +0 -1
  638. /package/dist/api/__tests__/{client.test.d.ts → serial/client.test.d.ts} +0 -0
  639. /package/dist/clients/inbox/__tests__/{inbox-controller.test.d.ts → serial/inbox-controller.test.d.ts} +0 -0
  640. /package/dist/clients/inbox/__tests__/{mount-panel.test.d.ts → serial/mount-panel.test.d.ts} +0 -0
  641. /package/dist/clients/{attach/__tests__/attach-chrome-remote.test.d.ts → inbox/review/__tests__/teardown-notice.test.d.ts} +0 -0
  642. /package/dist/{clients/attach/__tests__/attach-keybindings.test.d.ts → core/__tests__/broker-extension-canvas-db-boundary.test.d.ts} +0 -0
  643. /package/dist/{clients/attach/__tests__/crtr-output-coverage.test.d.ts → core/__tests__/seam/broker-attach-multiclient.test.d.ts} +0 -0
  644. /package/dist/core/__tests__/{full → seam}/broker-attach-stream.test.d.ts +0 -0
  645. /package/dist/core/__tests__/{full → seam}/broker-crash-teardown.test.d.ts +0 -0
  646. /package/dist/core/__tests__/{full → seam}/broker-pane-resolution.test.d.ts +0 -0
  647. /package/dist/core/__tests__/{full → seam}/broker-provider-retry.test.d.ts +0 -0
  648. /package/dist/core/__tests__/{full → seam}/broker-whip-interrupt.test.d.ts +0 -0
  649. /package/dist/{clients/attach/__tests__/editor-frame-title.test.d.ts → core/__tests__/seam/dormancy-release.test.d.ts} +0 -0
  650. /package/dist/{clients/attach/__tests__/input-controller-extension-command.test.d.ts → core/__tests__/seam/yield-refresh-transaction.test.d.ts} +0 -0
  651. /package/dist/core/__tests__/{broker-fork-seam.test.d.ts → serial/broker-fork-seam.test.d.ts} +0 -0
  652. /package/dist/core/__tests__/{broker-sdk-wiring.test.d.ts → serial/broker-sdk-wiring.test.d.ts} +0 -0
  653. /package/dist/core/__tests__/{broker-snapshot-history.test.d.ts → serial/broker-snapshot-history.test.d.ts} +0 -0
  654. /package/dist/core/__tests__/{command-plugins.test.d.ts → serial/command-plugins.test.d.ts} +0 -0
  655. /package/dist/core/__tests__/{deferred-no-wake.test.d.ts → serial/deferred-no-wake.test.d.ts} +0 -0
  656. /package/dist/core/__tests__/{flagship-lifecycle.test.d.ts → serial/flagship-lifecycle.test.d.ts} +0 -0
  657. /package/dist/core/__tests__/{host-teardown-process-group.test.d.ts → serial/host-teardown-process-group.test.d.ts} +0 -0
  658. /package/dist/core/__tests__/{human-deliver-e2e.test.d.ts → serial/human-deliver-e2e.test.d.ts} +0 -0
  659. /package/dist/core/__tests__/{live-mutation.test.d.ts → serial/live-mutation.test.d.ts} +0 -0
  660. /package/dist/core/__tests__/{refresh-stall-recycle.test.d.ts → serial/refresh-stall-recycle.test.d.ts} +0 -0
  661. /package/dist/core/__tests__/{revive.test.d.ts → serial/revive.test.d.ts} +0 -0
  662. /package/dist/core/__tests__/{spawn-root.test.d.ts → serial/spawn-root.test.d.ts} +0 -0
  663. /package/dist/core/__tests__/{subscription-delivery.test.d.ts → serial/subscription-delivery.test.d.ts} +0 -0
  664. /package/dist/core/__tests__/{tmux-surface.test.d.ts → serial/tmux-surface.test.d.ts} +0 -0
  665. /package/dist/core/__tests__/{worktree.test.d.ts → serial/worktree.test.d.ts} +0 -0
  666. /package/dist/{clients/attach/__tests__/markdown-headings.test.d.ts → core/__tests__/watchdog-abort-arms-retry.test.d.ts} +0 -0
  667. /package/dist/{clients/attach/__tests__/session-identity-refresh.test.d.ts → core/broker-client/__tests__/transport-socket.test.d.ts} +0 -0
  668. /package/dist/core/human/__tests__/{inbox-core.test.d.ts → serial/inbox-core.test.d.ts} +0 -0
  669. /package/dist/{clients/inbox/review/__tests__/remap.test.d.ts → daemon/api/__tests__/node-model-validation.test.d.ts} +0 -0
  670. /package/dist/{clients/surfaces/region.js → daemon/api/__tests__/review-terminal-conflict.test.d.ts} +0 -0
  671. /package/dist/daemon/api/__tests__/{full → seam}/api-server.test.d.ts +0 -0
  672. /package/dist/daemon/api/__tests__/{full → seam}/b10-attach-modelauth.test.d.ts +0 -0
  673. /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,
@@ -1001,6 +836,100 @@ function makeRotationCtx(modelIntent?: string) {
1001
836
  return { ctx, setModelCalls, thinkingLevelCalls, providers, events, commands, pi };
1002
837
  }
1003
838
 
839
+ test("managed Anthropic requests opt into server-side fallback without changing other managed routes", async () => {
840
+ await resetRotationState();
841
+ writeLadderConfig();
842
+ await helpers.writeSubscriptionPool("anthropic", [credential("anthropic")]);
843
+
844
+ const anthropicModel = { provider: "anthropic", id: "claude-opus-5", api: "anthropic-messages" };
845
+ const { ctx, providers, events, pi } = makeRotationCtx("anthropic/ultra");
846
+ ctx.model = anthropicModel;
847
+ const streamOptions: any[] = [];
848
+ const fetchCalls: Array<[RequestInfo | URL, RequestInit | undefined]> = [];
849
+ const callerPayloads: unknown[] = [];
850
+ rotationModule.__setStreamForProviderForTest((_model, _context, options) => {
851
+ streamOptions.push(options);
852
+ return (async function* () {
853
+ yield { type: "text_delta", text: "served" };
854
+ })() as any;
855
+ });
856
+
857
+ try {
858
+ await providerRotationExtension(pi);
859
+ await events.session_start?.({}, ctx);
860
+ const stream = providers["anthropic"].streamSimple(anthropicModel, ctx, {
861
+ onPayload(payload: unknown) {
862
+ callerPayloads.push(payload);
863
+ if ((payload as { replaceWithNull?: boolean })?.replaceWithNull) return null;
864
+ return { ...(payload as object), callerPayload: true };
865
+ },
866
+ fetch: async (input: RequestInfo | URL, init?: RequestInit) => {
867
+ fetchCalls.push([input, init]);
868
+ return new Response();
869
+ },
870
+ });
871
+ for await (const _event of stream) {
872
+ // Drain the managed request so the injected stream options are captured.
873
+ }
874
+
875
+ const [anthropicOptions] = streamOptions;
876
+ assert.deepEqual(await anthropicOptions.onPayload({ request: true }, anthropicModel), {
877
+ request: true,
878
+ callerPayload: true,
879
+ fallbacks: "default",
880
+ });
881
+ assert.deepEqual(await anthropicOptions.onPayload({ replaceWithNull: true }, anthropicModel), { fallbacks: "default" });
882
+ assert.deepEqual(callerPayloads, [{ request: true }, { replaceWithNull: true }]);
883
+
884
+ for (const headers of [
885
+ new Headers({ "anthropic-beta": "claude-code-20250219,oauth-2025-04-20", "x-keep": "headers" }),
886
+ { "anthropic-beta": "claude-code-20250219,oauth-2025-04-20", "x-keep": "object" },
887
+ [["anthropic-beta", "claude-code-20250219,oauth-2025-04-20"], ["x-keep", "pairs"]],
888
+ ]) {
889
+ await anthropicOptions.fetch("https://example.test/messages", { headers });
890
+ }
891
+ for (const [_input, init] of fetchCalls) {
892
+ const headers = new Headers(init?.headers);
893
+ assert.equal(headers.get("anthropic-beta"), "claude-code-20250219,oauth-2025-04-20,server-side-fallback-2026-07-01");
894
+ assert.ok(headers.get("x-keep"));
895
+ }
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
+
910
+ await resetRotationState();
911
+ await helpers.writeSubscriptionPool("openai-codex", [credential("codex")]);
912
+ const codexModel = { provider: "openai-codex", id: "gpt-5.6-sol", api: "openai-codex-responses" };
913
+ const codex = makeRotationCtx("openai/strong");
914
+ const codexOptions: any[] = [];
915
+ rotationModule.__setStreamForProviderForTest((_model, _context, options) => {
916
+ codexOptions.push(options);
917
+ return (async function* () {
918
+ yield { type: "text_delta", text: "served" };
919
+ })() as any;
920
+ });
921
+ await providerRotationExtension(codex.pi);
922
+ await codex.events.session_start?.({}, codex.ctx);
923
+ for await (const _event of codex.providers["openai-codex"].streamSimple(codexModel, codex.ctx)) {
924
+ // Drain the managed Codex route.
925
+ }
926
+ assert.equal(codexOptions[0].onPayload, undefined);
927
+ assert.equal(codexOptions[0].fetch, undefined);
928
+ } finally {
929
+ rotationModule.__setStreamForProviderForTest(undefined);
930
+ }
931
+ });
932
+
1004
933
  // A live route carries the session's exact thinking level through every provider
1005
934
  // request, including the requests that continue a turn after tool results.
1006
935
  test("preserves a manually selected thinking level across provider requests", async () => {
@@ -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;