@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
@@ -356,48 +356,53 @@ function formatLeafAmbiguous(leaf, matches) {
356
356
  const ids = matches.map(memoryDocId).join(', ');
357
357
  return `ambiguous memory document: ${leaf} matches multiple documents: ${ids}`;
358
358
  }
359
- /**
360
- * Resolve a memory document name to a single memory document.
361
- *
362
- * Accepted identifier forms:
363
- * <name> — bare name; resolved by scope precedence project>user>builtin
364
- * <scope>/<name> — pinned to one scope (user|project)
365
- * `<name>` may carry topical subdirs (`taste/foo`); a bare leaf (`foo`) falls
366
- * back to a last-segment match within the resolved scopes.
367
- *
368
- * Strong matches resolve before fallback matches. The first pass visits every
369
- * source nearest-first and checks, within each source: (1) exact substrate
370
- * identity (`doc.name === query` — the explicit frontmatter `name`, else its
371
- * normalized path-derived fallback, the SAME identity `listAllMemoryDocs`
372
- * reports); then (2) direct `memory/<name>.md` physical-path lookup (the
373
- * bare-dir → INDEX.md and bare-plugin-name → plugin root INDEX.md conveniences
374
- * neither identity nor a literal path expresses). Only if that pass finds
375
- * nothing does a second nearest-first pass try bare leaf-name fallback (final
376
- * path segment), ambiguous when two DIFFERENT identities in the SAME source
377
- * share a leaf. A farther canonical identity therefore beats a nearer leaf,
378
- * while scope precedence still decides between equally strong matches.
379
- *
380
- * `opts.kind`, when given, is a resolution CONSTRAINT, not a post-filter: in
381
- * both passes a candidate whose `effectiveDocKind` doesn't match is skipped,
382
- * so resolution keeps looking for a matching-kind document.
383
- */
384
- export function resolveMemoryDoc(rawName, opts = {}) {
359
+ function loadMemorySources(scope) {
360
+ // Quiet: a targeted read must not spew other docs' frontmatter warnings
361
+ // before its own result (esp. a not_found) — corpus health is `lint`'s job.
362
+ return memorySourcesInPrecedence(scope).map((source) => ({
363
+ source,
364
+ docs: sourceMemoryDocs(source, true),
365
+ }));
366
+ }
367
+ export function createMemoryDocSnapshot() {
368
+ const defaultSources = loadMemorySources();
369
+ const sourcesByScope = new Map([[undefined, defaultSources]]);
370
+ const sourceFor = (scope) => {
371
+ let sources = sourcesByScope.get(scope);
372
+ if (sources === undefined) {
373
+ sources = loadMemorySources(scope);
374
+ sourcesByScope.set(scope, sources);
375
+ }
376
+ return sources;
377
+ };
378
+ return {
379
+ docs: defaultSources.flatMap(({ docs }) => docs),
380
+ resolve: (names) => {
381
+ const resolved = new Map();
382
+ for (const rawName of names) {
383
+ try {
384
+ const parsed = parseSkillQualifier(rawName);
385
+ resolved.set(rawName, resolveMemoryDocFromSources(rawName, {}, sourceFor(parsed.scope)));
386
+ }
387
+ catch {
388
+ // A command registration reports its own body-read failure below; one
389
+ // malformed/stale identity must not suppress every other slash command.
390
+ }
391
+ }
392
+ return resolved;
393
+ },
394
+ };
395
+ }
396
+ function resolveMemoryDocFromSources(rawName, opts, sources) {
385
397
  const parsed = parseSkillQualifier(rawName);
386
398
  if (parsed.scope && opts.scope && parsed.scope !== opts.scope) {
387
399
  throw usage(`scope conflict: identifier "${rawName}" uses scope "${parsed.scope}" but --scope is "${opts.scope}"`);
388
400
  }
389
- const effectiveScope = opts.scope ?? parsed.scope;
390
401
  const name = parsed.segments.join('/');
391
402
  if (name === '')
392
403
  throw usage(`memory document name required`);
393
404
  const segments = name.split('/');
394
405
  const isLeafQuery = !name.includes('/');
395
- // Quiet: a targeted read must not spew other docs' frontmatter warnings
396
- // before its own result (esp. a not_found) — corpus health is `lint`'s job.
397
- const sources = memorySourcesInPrecedence(effectiveScope).map((source) => ({
398
- source,
399
- docs: sourceMemoryDocs(source, true),
400
- }));
401
406
  const kindOk = (d) => opts.kind === undefined || effectiveDocKind(d) === opts.kind;
402
407
  // Strong matches across the full scope stack come first. This preserves
403
408
  // nearest-scope shadowing for canonical/direct collisions without allowing a
@@ -437,3 +442,16 @@ export function resolveMemoryDoc(rawName, opts = {}) {
437
442
  scope: parsed.scope,
438
443
  });
439
444
  }
445
+ /** Resolve several unqualified names over one memory-source snapshot. Failed
446
+ * names are omitted so callers can preserve their per-document error behavior. */
447
+ export function resolveMemoryDocs(names) {
448
+ return createMemoryDocSnapshot().resolve(names);
449
+ }
450
+ export function resolveMemoryDoc(rawName, opts = {}) {
451
+ const parsed = parseSkillQualifier(rawName);
452
+ if (parsed.scope && opts.scope && parsed.scope !== opts.scope) {
453
+ throw usage(`scope conflict: identifier "${rawName}" uses scope "${parsed.scope}" but --scope is "${opts.scope}"`);
454
+ }
455
+ const effectiveScope = opts.scope ?? parsed.scope;
456
+ return resolveMemoryDocFromSources(rawName, opts, loadMemorySources(effectiveScope));
457
+ }
@@ -52,8 +52,23 @@ export interface InitialModelRouteSelection<Model extends {
52
52
  reason: ProviderCandidateRejection;
53
53
  }>;
54
54
  }
55
+ export interface UnregisteredConcreteModel {
56
+ request: Extract<ModelRequest, {
57
+ kind: 'concrete' | 'exact';
58
+ }>;
59
+ candidate: RoutedCandidate;
60
+ reason: 'unregistered';
61
+ }
55
62
  /** Expand config-derived route order only. Availability never affects rank. */
56
63
  export declare function expandModelCandidates(request: ModelRequest, cwd?: string, profileId?: string | null): RoutedCandidate[];
64
+ /** Identify the one permanently invalid recipe shape: a concrete/exact request
65
+ * whose requested provider/model is absent from the serving registry. Auth and
66
+ * cooldown are deliberately outside this discriminator so callers retain their
67
+ * existing policy for those transient states. */
68
+ export declare function unregisteredConcreteModel(request: ModelRequest | undefined, registry: ModelRegistryLike, options?: {
69
+ cwd?: string;
70
+ profileId?: string | null;
71
+ }): UnregisteredConcreteModel | undefined;
57
72
  /** Probe the common availability facts consumed unchanged by resolveProviderCandidates. */
58
73
  export declare function probeRouteAvailability(candidate: RoutedCandidate, registry: ModelRegistryLike, now?: number): RouteAvailability;
59
74
  /** Select the first viable route for a new SDK session. Route declarations own
@@ -110,6 +110,18 @@ export function expandModelCandidates(request, cwd, profileId) {
110
110
  }
111
111
  return emitted.map((candidate, rank) => ({ ...candidate, rank }));
112
112
  }
113
+ /** Identify the one permanently invalid recipe shape: a concrete/exact request
114
+ * whose requested provider/model is absent from the serving registry. Auth and
115
+ * cooldown are deliberately outside this discriminator so callers retain their
116
+ * existing policy for those transient states. */
117
+ export function unregisteredConcreteModel(request, registry, options = {}) {
118
+ if (request === undefined || request.kind === 'logical')
119
+ return undefined;
120
+ const candidate = expandModelCandidates(request, options.cwd, options.profileId)[0];
121
+ if (candidate === undefined || registry.find(candidate.providerId, candidate.modelId) !== undefined)
122
+ return undefined;
123
+ return { request, candidate, reason: 'unregistered' };
124
+ }
113
125
  /** Probe the common availability facts consumed unchanged by resolveProviderCandidates. */
114
126
  export function probeRouteAvailability(candidate, registry, now = Date.now()) {
115
127
  const model = registry.find(candidate.providerId, candidate.modelId);
@@ -89,7 +89,7 @@ export class PoolCredentialStore {
89
89
  const existing = await this.read(providerId);
90
90
  if (existing !== undefined)
91
91
  return this.auth.modify(providerId, fn);
92
- throw new Error(`${getProviderLabel(providerId)} has no account to update — add one with \`crtr sys setup\` or \`/provider-sub ${providerId} add\`.`);
92
+ throw new Error(`${getProviderLabel(providerId)} has no account to update — add one with \`crtr sys settings\` or \`/provider-sub ${providerId} add\`.`);
93
93
  }
94
94
  const committed = await modifyElectedSubscription(providerId, (pool) => electFrom(pool), async (entry) => {
95
95
  const next = await fn(toCredential(entry));
@@ -5,9 +5,8 @@
5
5
  // This file has NO imports. The attach viewer is bundled as a separate
6
6
  // esbuild process from the one that runs a leaf, so it cannot read a leaf's
7
7
  // command-owned `preview` field directly — walking the live command tree
8
- // to find it would pull every subtree's module graph (including `surface`
9
- // -> the web client -> Tailwind's native oxide binary) into the attach
10
- // bundle. A flat, zero-dependency static map avoids that entirely.
8
+ // to find it would pull every subtree's module graph into the attach bundle.
9
+ // A flat, zero-dependency static map avoids that entirely.
11
10
  //
12
11
  // Source of truth: this Set must mirror every leaf that declares
13
12
  // `help.preview.suppressOutput: true` in its own command file (currently
@@ -157,10 +156,10 @@ const LEAF_ICON_CP = {
157
156
  'search answer': 0xf075,
158
157
  'search contents': 0xf0f6,
159
158
  'surface attach to': 0xf1e6,
160
- 'surface web serve': 0xf0ac,
161
159
  'sys config get': 0xf019,
162
160
  'sys config set': 0xf040,
163
161
  'sys config path': 0xf07b,
162
+ 'sys settings': 0xf013,
164
163
  'sys setup': 0xf0ad,
165
164
  'sys doctor': 0xf0f1,
166
165
  'sys sysprompt': 0xf15c,
@@ -1142,7 +1141,7 @@ function summarizeNodeWaitDeadline(text) {
1142
1141
  { text: id, tone: 'muted' },
1143
1142
  ];
1144
1143
  }
1145
- /** `crtr node yield` (src/commands/node.ts:1513) has no custom `render`;
1144
+ /** `crtr node yield` (`src/commands/node/lifecycle.ts`) has no custom `render`;
1146
1145
  * the generic renderer bullets `{node_id, promoted, model?, will_refresh}`
1147
1146
  * — none of these names are PROSE_FIELDS. `will_refresh` is documented
1148
1147
  * "Always true" (the command has no path that returns false), so
@@ -1167,7 +1166,7 @@ function summarizeNodeYield(text) {
1167
1166
  lines.push({ text: extras.join(' · '), tone: 'muted' });
1168
1167
  return lines;
1169
1168
  }
1170
- /** `crtr node lifecycle close` (nodeClose.render, src/commands/node.ts:650):
1169
+ /** `crtr node lifecycle close` (`nodeClose.render` in `src/commands/node/lifecycle.ts`):
1171
1170
  * `Closed ${id} and its exclusive subtree — ${count} node(s)
1172
1171
  * closed${spared>0 ? ", ${spared} spared..." : ''}.` on success, or a
1173
1172
  * short failure line — left as null there, the generic fallback is fine for
@@ -2235,7 +2234,7 @@ function summarizeSearchContents(text) {
2235
2234
  * raw ANSI curses frames never match any marker below, so this summarizer
2236
2235
  * safely returns null in that case). In the headless/agent path
2237
2236
  * (src/commands/sys/setup.ts's `!process.stdout.isTTY` branch,
2238
- * `buildSetupStaticInstructions` in setup-core.ts:328 — the shape every
2237
+ * `renderSetupStaticInstructions` in setup-core.ts — the shape every
2239
2238
  * bash-tool call to this leaf actually produces) it instead prints a
2240
2239
  * static inventory: the headline `crtr sys setup (non-interactive)`, a
2241
2240
  * `Packages:` section (`- <name> — <description> (installed|not
@@ -2589,7 +2588,7 @@ function summarizeSysLogs(text) {
2589
2588
  if (lines.length === 0 || lines.some((line) => line === ''))
2590
2589
  return null;
2591
2590
  for (const line of lines) {
2592
- const event = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d{1,9})?(?:Z|[+-]\d{2}:\d{2}) (DEBUG|INFO|WARN|ERROR) (daemon|broker|web) \S+ op=[0-9a-f]{32}(?: \{.*\})?$/.exec(line);
2591
+ const event = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d{1,9})?(?:Z|[+-]\d{2}:\d{2}) (DEBUG|INFO|WARN|ERROR) (daemon|broker) \S+ op=[0-9a-f]{32}(?: \{.*\})?$/.exec(line);
2593
2592
  if (event !== null) {
2594
2593
  componentCounts.set(event[2], (componentCounts.get(event[2]) ?? 0) + 1);
2595
2594
  if (event[1] === 'ERROR')
@@ -2609,7 +2608,7 @@ function summarizeSysLogs(text) {
2609
2608
  }
2610
2609
  raw++;
2611
2610
  }
2612
- const componentDigest = summarizeOrderedCounts(componentCounts, ['daemon', 'broker', 'web']);
2611
+ const componentDigest = summarizeOrderedCounts(componentCounts, ['daemon', 'broker']);
2613
2612
  const aside = [componentDigest, raw > 0 ? `${raw} raw` : ''].filter((part) => part !== '').join(' · ');
2614
2613
  return summarizeHealthStatus(lines.length, errors, warnings, aside === '' ? 'no component detail' : aside);
2615
2614
  }
@@ -3,7 +3,7 @@ import assert from 'node:assert/strict';
3
3
  import { existsSync, mkdtempSync, rmSync } from 'node:fs';
4
4
  import { tmpdir } from 'node:os';
5
5
  import { join } from 'node:path';
6
- import { ensureRootProfile, listProfiles, loadProfileManifest, profileManifestPath, profileMemoryDir, profileRoot, ROOT_PROFILE_ID, } from '../manifest.js';
6
+ import { loadProfileManifest, profileRoot, ROOT_PROFILE_ID } from '../manifest.js';
7
7
  import { selectProfileForCwd } from '../select.js';
8
8
  import { resetScopeCache } from '../../scope.js';
9
9
  let home;
@@ -45,19 +45,9 @@ after(() => {
45
45
  process.env.HOME = previousHome;
46
46
  resetScopeCache();
47
47
  });
48
- test('ensureRootProfile creates the stable root profile and is idempotent', () => {
49
- const first = ensureRootProfile();
50
- const second = ensureRootProfile();
51
- assert.equal(first.profileId, ROOT_PROFILE_ID);
52
- assert.equal(second.profileId, ROOT_PROFILE_ID);
53
- assert.deepEqual(second, first);
54
- assert.equal(first.manifest.name, 'root');
55
- assert.deepEqual(first.manifest.projects, []);
56
- assert.equal(existsSync(profileRoot(ROOT_PROFILE_ID)), true);
57
- assert.equal(existsSync(profileManifestPath(ROOT_PROFILE_ID)), true);
58
- assert.equal(existsSync(profileMemoryDir(ROOT_PROFILE_ID)), true);
59
- assert.deepEqual(listProfiles().map(({ profileId }) => profileId), [ROOT_PROFILE_ID]);
60
- });
48
+ // A headless node spawn in an uncovered cwd must never prompt: `isTTY` is
49
+ // forced false above, so a regression that reached for the interactive picker
50
+ // would hang this test the same way it would hang the spawn.
61
51
  test('selectProfileForCwd falls back to the stable root profile when nothing covers cwd', async () => {
62
52
  const profileId = await selectProfileForCwd(cwd);
63
53
  assert.equal(profileId, ROOT_PROFILE_ID);
@@ -1,19 +1,6 @@
1
- import type { NodeStatus } from '../canvas/types.js';
2
1
  import { type ReviewRecord } from './types.js';
3
2
  /**
4
3
  * Finish a committed binding without ever recapturing its origin. Each step is
5
4
  * safe to repeat after a crash; review.json is the final visibility switch.
6
5
  */
7
6
  export declare function realizeReview(reviewId: string): Promise<ReviewRecord>;
8
- /**
9
- * Reopen one already-open companion when needed. The surface only attaches to
10
- * the returned node; it never owns a second revive path.
11
- */
12
- export declare function openExistingReview(reviewId: string): Promise<{
13
- review: ReviewRecord;
14
- disposition: 'terminal';
15
- } | {
16
- review: ReviewRecord;
17
- companion_status: NodeStatus;
18
- disposition: 'open';
19
- }>;
@@ -5,7 +5,6 @@ import { withCanvasWrite } from '../canvas/db.js';
5
5
  import { atomicWriteJson } from '../human/convention.js';
6
6
  import { ticketDir } from '../human/root.js';
7
7
  import { submitReview } from '../human/tickets.js';
8
- import { isBrokerLive } from '../runtime/model-swap.js';
9
8
  import { NodeIdConflictError, spawnNode } from '../runtime/nodes.js';
10
9
  import { transition } from '../runtime/lifecycle.js';
11
10
  import { reviveNode } from '../runtime/revive.js';
@@ -122,18 +121,6 @@ function realizeBridge(review) {
122
121
  ensureBridgeSubscription(current, current.bridge_node_id);
123
122
  return current;
124
123
  }
125
- async function awaitAttachableCompanion(nodeId, deadlineMs) {
126
- const deadline = Date.now() + deadlineMs;
127
- for (;;) {
128
- const companion = getNode(nodeId);
129
- if (companion !== null && isBrokerLive(companion))
130
- return true;
131
- const remaining = deadline - Date.now();
132
- if (remaining <= 0)
133
- return false;
134
- await new Promise((resolveWait) => setTimeout(resolveWait, Math.min(100, remaining)));
135
- }
136
- }
137
124
  function publishTicket(review) {
138
125
  if (review.bridge_node_id === null)
139
126
  throw bridgeUnsubscribed(review, '');
@@ -188,30 +175,3 @@ export async function realizeReview(reviewId) {
188
175
  }
189
176
  return requireReview(reviewId);
190
177
  }
191
- /**
192
- * Reopen one already-open companion when needed. The surface only attaches to
193
- * the returned node; it never owns a second revive path.
194
- */
195
- export async function openExistingReview(reviewId) {
196
- const review = requireReview(reviewId);
197
- if (review.state === 'binding')
198
- throw unknownReview(reviewId);
199
- if (review.state !== 'open')
200
- return { review, disposition: 'terminal' };
201
- const companion = getNode(review.companion_node_id);
202
- if (companion === null)
203
- throw companionUnbound(review.review_id, 0);
204
- if (!isBrokerLive(companion))
205
- reviveNode(companion.node_id, { resume: true });
206
- if (!await awaitAttachableCompanion(review.companion_node_id, COMPANION_BIND_DEADLINE_MS)) {
207
- throw companionUnbound(review.review_id, COMPANION_BIND_DEADLINE_MS);
208
- }
209
- const attachable = getNode(review.companion_node_id);
210
- if (attachable === null)
211
- throw companionUnbound(review.review_id, 0);
212
- return {
213
- review: requireReview(reviewId),
214
- companion_status: attachable.status,
215
- disposition: 'open',
216
- };
217
- }
@@ -9,7 +9,7 @@ export type ReviewOriginKind = 'ticket' | 'inline';
9
9
  export type CommentStatus = 'open' | 'resolved' | 'deleted';
10
10
  export type CommentAuthorKind = 'human' | 'node';
11
11
  export type CommentEventKind = 'created' | 'edited' | 'resolved' | 'reopened' | 'deleted' | 'reanchored' | 'notified' | 'notify_failed';
12
- export type ReviewErrorCode = 'review_origin_missing' | 'review_origin_unforkable' | 'review_origin_unstable' | 'review_branch_unavailable' | 'branch_lost' | 'review_companion_unbound' | 'review_bridge_unsubscribed' | 'review_target_unreviewable' | 'source_unreadable' | 'delivery_unroutable' | 'unknown_review' | 'review_not_open' | 'review_terminal' | 'review_required' | 'stale_document' | 'unknown_comment' | 'comment_deleted' | 'invalid_anchor' | 'anchor_out_of_range' | 'text_too_long' | 'comment_limit_reached' | 'stale_comment' | 'range_batch_incomplete' | 'range_batch_stale';
12
+ export type ReviewErrorCode = 'review_origin_missing' | 'review_origin_unforkable' | 'review_origin_unstable' | 'review_branch_unavailable' | 'branch_lost' | 'review_companion_unbound' | 'review_bridge_unsubscribed' | 'review_target_unreviewable' | 'source_unreadable' | 'delivery_unroutable' | 'unknown_review' | 'review_terminal' | 'review_required' | 'stale_document' | 'unknown_comment' | 'comment_deleted' | 'invalid_anchor' | 'anchor_out_of_range' | 'text_too_long' | 'comment_limit_reached' | 'stale_comment' | 'range_batch_incomplete' | 'range_batch_stale';
13
13
  /** Limits */
14
14
  export declare const COMMENT_TEXT_MAX = 8000;
15
15
  export declare const COMMENT_QUOTE_MAX = 4000;
@@ -1,6 +1,6 @@
1
1
  // Run with: node --import tsx/esm --test src/core/runtime/__tests__/engine-route.test.ts
2
2
  //
3
- // Regression lock for resolveEngineRoute (broker.ts): the broker is
3
+ // Regression lock for resolveEngineRoute (broker/frame-dispatch.ts): the broker is
4
4
  // authoritative over prompt/follow_up routing against the LIVE session state.
5
5
  // m-C is the load-bearing case — a `follow_up` delivered to an IDLE session
6
6
  // used to be handed to pi's followUp(), whose queue only drains inside a
@@ -9,7 +9,7 @@
9
9
  // session). An idle follow_up must run as a prompt.
10
10
  import { test } from 'node:test';
11
11
  import assert from 'node:assert/strict';
12
- import { resolveEngineRoute } from '../broker.js';
12
+ import { resolveEngineRoute } from '../broker/frame-dispatch.js';
13
13
  const IMAGES = [{ type: 'image', data: 'aGk=', mimeType: 'image/png' }];
14
14
  test('m-C: follow_up on an IDLE session escalates to prompt (no streamingBehavior)', () => {
15
15
  const route = resolveEngineRoute({ type: 'follow_up' }, false);
@@ -18,6 +18,7 @@ import { cadenceDisplay } from '../wake.js';
18
18
  import { renderKnowledgeBlock, renderWorkspaceOpenDocs } from '../substrate/index.js';
19
19
  import { loadProfileManifest } from '../profiles/manifest.js';
20
20
  import { situationalContextBlock } from './situational-context.js';
21
+ import { statusRank } from '../canvas/node-order.js';
21
22
  /** The bearings custom type is shared with every attached renderer. */
22
23
  export { CONTEXT_INTRO_CUSTOM_TYPE } from '../../shared/generated-context.js';
23
24
  function escapeAttribute(value) {
@@ -183,17 +184,6 @@ export function orchestratorContextNote(nodeId) {
183
184
  // first) and who is directly below it (its immediate children + their statuses).
184
185
  // Not the full subtree — just the load-bearing spine up and one level down.
185
186
  // ---------------------------------------------------------------------------
186
- /** Live-first sibling ordering, so running children surface above finished ones. */
187
- function statusRank(status) {
188
- switch (status) {
189
- case 'active': return 0;
190
- case 'idle': return 1;
191
- case 'done': return 2;
192
- case 'canceled': return 3;
193
- case 'dead': return 4;
194
- default: return 5;
195
- }
196
- }
197
187
  /** One relative's line in the map: `<id> — <kind> · <status>`, plus the node's
198
188
  * task description when it carries one (orientation: what that relative is for). */
199
189
  function relativeLabel(meta) {
@@ -0,0 +1,33 @@
1
+ import type { Socket } from 'node:net';
2
+ import { FrameDecoder, type BrokerSnapshot, type BrokerToClient, type ClientRole } from '../broker-protocol.js';
3
+ export interface BrokerClient {
4
+ id: string;
5
+ role: ClientRole;
6
+ socket: Socket;
7
+ decoder: FrameDecoder;
8
+ helloed: boolean;
9
+ pendingBytes: number;
10
+ queuedFrames: number;
11
+ }
12
+ /** Owns connected viewers, their outbound backpressure, and durable attach presence. */
13
+ export declare class BrokerClientRegistry {
14
+ private readonly nodeId;
15
+ private readonly attachPath;
16
+ private readonly clients;
17
+ private readonly displayStatuses;
18
+ private readonly displayWidgets;
19
+ private displayTitle;
20
+ constructor(nodeId: string);
21
+ create(socket: Socket): BrokerClient;
22
+ writableClients(): BrokerClient[];
23
+ persistAttachState(): void;
24
+ dropClient(client: BrokerClient, reason: string): void;
25
+ removeClient(client: BrokerClient): void;
26
+ sendFrame(client: BrokerClient, frame: BrokerToClient, bypassHwm?: boolean): void;
27
+ broadcast(frame: BrokerToClient): void;
28
+ broadcastUi(frame: BrokerToClient): void;
29
+ displaySnapshot(): BrokerSnapshot['display'];
30
+ forEachHelloed(fn: (client: BrokerClient) => void): void;
31
+ dispose(): void;
32
+ clearAttachState(): void;
33
+ }
@@ -0,0 +1,164 @@
1
+ import { existsSync, mkdirSync, unlinkSync, writeFileSync } from 'node:fs';
2
+ import { jobDir } from '../../canvas/paths.js';
3
+ import { emitEvent } from '../../events/emit.js';
4
+ import { encodeFrame, FrameDecoder, BROKER_READ_CAPS, } from '../broker-protocol.js';
5
+ /** Per-viewer outbound high-water mark. Slow viewers are shed rather than allowed to backpressure the shared engine indefinitely. */
6
+ const MAX_QUEUED_FRAMES = 1000;
7
+ const MAX_PENDING_BYTES = 32 * 1024 * 1024;
8
+ /** Owns connected viewers, their outbound backpressure, and durable attach presence. */
9
+ export class BrokerClientRegistry {
10
+ nodeId;
11
+ attachPath;
12
+ clients = new Set();
13
+ displayStatuses = new Map();
14
+ displayWidgets = new Map();
15
+ displayTitle;
16
+ constructor(nodeId) {
17
+ this.nodeId = nodeId;
18
+ this.attachPath = `${jobDir(nodeId)}/attach.json`;
19
+ }
20
+ create(socket) {
21
+ const client = {
22
+ id: '',
23
+ role: 'observer',
24
+ socket,
25
+ decoder: new FrameDecoder(BROKER_READ_CAPS),
26
+ helloed: false,
27
+ pendingBytes: 0,
28
+ queuedFrames: 0,
29
+ };
30
+ this.clients.add(client);
31
+ return client;
32
+ }
33
+ writableClients() {
34
+ const out = [];
35
+ for (const client of this.clients) {
36
+ if (!client.helloed || client.role !== 'controller')
37
+ continue;
38
+ if (client.socket.destroyed || client.socket.readableEnded || !client.socket.writable)
39
+ continue;
40
+ out.push(client);
41
+ }
42
+ return out;
43
+ }
44
+ persistAttachState() {
45
+ try {
46
+ let viewers = 0;
47
+ for (const client of this.clients)
48
+ if (client.helloed)
49
+ viewers += 1;
50
+ const dir = jobDir(this.nodeId);
51
+ if (!existsSync(dir))
52
+ mkdirSync(dir, { recursive: true });
53
+ writeFileSync(this.attachPath, JSON.stringify({ viewers, updated: new Date().toISOString() }, null, 2), 'utf8');
54
+ }
55
+ catch {
56
+ /* presence is best-effort; never crash the broker */
57
+ }
58
+ }
59
+ dropClient(client, reason) {
60
+ if (!this.clients.has(client))
61
+ return;
62
+ emitEvent({
63
+ level: 'info',
64
+ event: 'broker.runtime.diagnostic',
65
+ fields: { message: `dropping viewer ${client.id || '(pre-hello)'} — ${reason}` },
66
+ });
67
+ this.removeClient(client);
68
+ try {
69
+ client.socket.destroy();
70
+ }
71
+ catch {
72
+ /* ignore */
73
+ }
74
+ }
75
+ removeClient(client) {
76
+ this.clients.delete(client);
77
+ this.persistAttachState();
78
+ }
79
+ sendFrame(client, frame, bypassHwm = false) {
80
+ let data;
81
+ try {
82
+ data = encodeFrame(frame);
83
+ }
84
+ catch {
85
+ return;
86
+ }
87
+ const bytes = Buffer.byteLength(data);
88
+ if (!bypassHwm && (client.queuedFrames + 1 > MAX_QUEUED_FRAMES || client.pendingBytes + bytes > MAX_PENDING_BYTES)) {
89
+ this.dropClient(client, `backpressure high-water mark exceeded (queued=${client.queuedFrames}, pending=${client.pendingBytes}B)`);
90
+ return;
91
+ }
92
+ client.queuedFrames += 1;
93
+ client.pendingBytes += bytes;
94
+ try {
95
+ client.socket.write(data, () => {
96
+ client.queuedFrames -= 1;
97
+ client.pendingBytes -= bytes;
98
+ });
99
+ }
100
+ catch {
101
+ client.queuedFrames -= 1;
102
+ client.pendingBytes -= bytes;
103
+ }
104
+ }
105
+ broadcast(frame) {
106
+ for (const client of this.clients)
107
+ if (client.helloed)
108
+ this.sendFrame(client, frame);
109
+ }
110
+ broadcastUi(frame) {
111
+ if (frame.type === 'extension_ui_request') {
112
+ if (frame.method === 'setStatus') {
113
+ this.displayStatuses.delete(frame.statusKey);
114
+ if (frame.statusText !== undefined)
115
+ this.displayStatuses.set(frame.statusKey, frame.statusText);
116
+ }
117
+ else if (frame.method === 'setWidget') {
118
+ this.displayWidgets.delete(frame.widgetKey);
119
+ if (frame.widgetLines !== undefined) {
120
+ this.displayWidgets.set(frame.widgetKey, {
121
+ lines: [...frame.widgetLines],
122
+ placement: frame.widgetPlacement ?? 'aboveEditor',
123
+ });
124
+ }
125
+ }
126
+ else if (frame.method === 'setTitle') {
127
+ this.displayTitle = frame.title;
128
+ }
129
+ }
130
+ this.broadcast(frame);
131
+ }
132
+ displaySnapshot() {
133
+ return {
134
+ statuses: Object.fromEntries(this.displayStatuses),
135
+ widgets: Object.fromEntries([...this.displayWidgets].map(([key, widget]) => [key, { lines: [...widget.lines], placement: widget.placement }])),
136
+ title: this.displayTitle,
137
+ };
138
+ }
139
+ forEachHelloed(fn) {
140
+ for (const client of this.clients)
141
+ if (client.helloed)
142
+ fn(client);
143
+ }
144
+ dispose() {
145
+ for (const client of this.clients) {
146
+ try {
147
+ client.socket.destroy();
148
+ }
149
+ catch {
150
+ /* ignore */
151
+ }
152
+ }
153
+ this.clients.clear();
154
+ }
155
+ clearAttachState() {
156
+ try {
157
+ if (existsSync(this.attachPath))
158
+ unlinkSync(this.attachPath);
159
+ }
160
+ catch {
161
+ /* ignore */
162
+ }
163
+ }
164
+ }
@@ -0,0 +1,19 @@
1
+ import type { BrokerExtensionStateDTO, BrokerGeneratedNameRequest, BrokerGeneratedNameResultDTO, BrokerInboxCursorDirective, BrokerInboxCursorRequest, BrokerModelCommitRequest, BrokerModelCommitResultDTO, BrokerPersonaAckRequest, BrokerSessionBoundRequest, BrokerSessionBoundResultDTO, BrokerSettleDirective, BrokerSettleRequest } from '../../../api/dto/broker-ops.js';
2
+ import type { RelaunchRootResultDTO } from '../../../api/dto/lifecycle.js';
3
+ import type { PushReportRequest } from '../../../api/dto/reports.js';
4
+ export declare function bindBrokerSession(nodeId: string, request: BrokerSessionBoundRequest): Promise<BrokerSessionBoundResultDTO>;
5
+ export declare function settleBroker(nodeId: string, request: BrokerSettleRequest): Promise<BrokerSettleDirective>;
6
+ export declare function advanceBrokerInboxCursor(nodeId: string, request: BrokerInboxCursorRequest): Promise<BrokerInboxCursorDirective>;
7
+ /** Fixed canvas projection for broker extension rendering. It deliberately
8
+ * exposes no generic node/database facade. */
9
+ export declare function commitBrokerModel(nodeId: string, request: BrokerModelCommitRequest): Promise<BrokerModelCommitResultDTO>;
10
+ export declare function brokerExtensionState(nodeId: string): Promise<BrokerExtensionStateDTO>;
11
+ export declare function commitBrokerGeneratedName(nodeId: string, request: BrokerGeneratedNameRequest): Promise<BrokerGeneratedNameResultDTO>;
12
+ export declare function commitBrokerPersonaAck(nodeId: string, request: BrokerPersonaAckRequest): Promise<void>;
13
+ /** Reports still use the canonical daemon report handler; this broker adapter
14
+ * only preserves terminal structured output's idempotent finalization result. */
15
+ export declare function publishBrokerReport(nodeId: string, request: PushReportRequest): Promise<void>;
16
+ /** Root `/new` remains on the dedicated relaunch operation because it launches
17
+ * a replacement broker and tears down this broker. Callers must not await it
18
+ * from Pi's session-start dispatch. */
19
+ export declare function relaunchBrokerRoot(nodeId: string): Promise<RelaunchRootResultDTO>;