@north-light/crouter 0.3.173 → 0.3.175

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (674) hide show
  1. package/bin/runtime-selector.mjs +8 -1
  2. package/dist/api/__tests__/{client.test.js → serial/client.test.js} +2 -135
  3. package/dist/api/client.d.ts +12 -21
  4. package/dist/api/client.js +22 -31
  5. package/dist/api/dto/broker-ops.d.ts +158 -0
  6. package/dist/api/dto/broker-ops.js +6 -0
  7. package/dist/api/dto/crons.d.ts +6 -0
  8. package/dist/api/dto/human.d.ts +7 -1
  9. package/dist/api/dto/inbox.d.ts +1 -71
  10. package/dist/api/dto/inbox.js +1 -9
  11. package/dist/api/dto/nodes.d.ts +6 -7
  12. package/dist/api/dto/reviews.d.ts +1 -11
  13. package/dist/api/routes.d.ts +7 -4
  14. package/dist/api/routes.js +8 -5
  15. package/dist/build-root.js +3 -3
  16. package/dist/builtin-memory/04-base-worker.md +1 -4
  17. package/dist/builtin-memory/05-kinds/advisor/00-base.md +1 -5
  18. package/dist/builtin-memory/05-kinds/advisor/01-orchestrator.md +2 -7
  19. package/dist/builtin-memory/05-kinds/design/00-base.md +1 -6
  20. package/dist/builtin-memory/05-kinds/developer/00-base.md +1 -6
  21. package/dist/builtin-memory/05-kinds/explore/00-base.md +1 -4
  22. package/dist/builtin-memory/05-kinds/explore/01-orchestrator.md +1 -2
  23. package/dist/builtin-memory/05-kinds/general/00-base.md +1 -3
  24. package/dist/builtin-memory/05-kinds/plan/00-base.md +1 -6
  25. package/dist/builtin-memory/05-kinds/plan/reviewers/00-base.md +1 -2
  26. package/dist/builtin-memory/05-kinds/plan/reviewers/architecture-fit.md +1 -3
  27. package/dist/builtin-memory/05-kinds/plan/reviewers/code-smells.md +1 -3
  28. package/dist/builtin-memory/05-kinds/plan/reviewers/pattern-consistency.md +1 -3
  29. package/dist/builtin-memory/05-kinds/plan/reviewers/requirements-coverage.md +1 -3
  30. package/dist/builtin-memory/05-kinds/plan/reviewers/security.md +1 -4
  31. package/dist/builtin-memory/05-kinds/review/companion/00-base.md +2 -3
  32. package/dist/builtin-memory/05-kinds/spec/00-base.md +1 -2
  33. package/dist/builtin-memory/advisor/council.md +1 -6
  34. package/dist/builtin-memory/design.md +2 -7
  35. package/dist/builtin-memory/development.md +9 -14
  36. package/dist/builtin-memory/internal/marketplaces.md +2 -6
  37. package/dist/builtin-memory/internal/nodes-and-canvas.md +1 -1
  38. package/dist/builtin-memory/internal/plugins.md +2 -8
  39. package/dist/builtin-memory/internal/storage-tiers.md +1 -2
  40. package/dist/builtin-memory/testing.md +41 -0
  41. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/__tests__/{provider-rotation.test.ts → serial/provider-rotation.test.ts} +27 -179
  42. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/claude-plugin-commands.ts +5 -15
  43. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/frontmatter-rules/index.ts +1 -28
  44. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/memory-slash-commands.ts +43 -88
  45. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/provider-rotation.js +7 -1
  46. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/provider-rotation.ts +9 -1
  47. package/dist/cli.js +2 -2
  48. package/dist/clients/attach/__tests__/attach-remote-readonly.test.js +37 -131
  49. package/dist/clients/attach/__tests__/chat-view-snapshot-ordering.test.js +71 -152
  50. package/dist/clients/attach/__tests__/context-message.test.js +16 -174
  51. package/dist/clients/attach/__tests__/crtr-output.test.js +36 -2069
  52. package/dist/clients/attach/__tests__/diagram.test.js +2 -2
  53. package/dist/clients/attach/__tests__/edit-diff.test.js +0 -4
  54. package/dist/clients/attach/__tests__/file-review-focus.test.js +2 -1
  55. package/dist/clients/attach/__tests__/group-activity.test.js +40 -229
  56. package/dist/clients/attach/__tests__/oauth-dialog-lifecycle.test.js +26 -76
  57. package/dist/clients/attach/__tests__/prompt-preview.test.js +4 -70
  58. package/dist/clients/attach/__tests__/ref-autocomplete.test.js +11 -125
  59. package/dist/clients/attach/__tests__/titled-editor-preview.test.js +14 -205
  60. package/dist/clients/attach/command.d.ts +2 -1
  61. package/dist/clients/attach/command.js +81 -76
  62. package/dist/clients/attach/input/capabilities.d.ts +27 -0
  63. package/dist/clients/attach/input/capabilities.js +96 -0
  64. package/dist/clients/attach/input/controller.d.ts +20 -182
  65. package/dist/clients/attach/input/controller.js +128 -537
  66. package/dist/clients/attach/input/overlay-owner.d.ts +41 -0
  67. package/dist/clients/attach/input/overlay-owner.js +199 -0
  68. package/dist/clients/attach/overlays/file-review.d.ts +0 -4
  69. package/dist/clients/attach/overlays/file-review.js +13 -5
  70. package/dist/clients/attach/overlays/graph.js +2 -10
  71. package/dist/clients/attach/render/chat-view.d.ts +4 -3
  72. package/dist/clients/attach/render/chat-view.js +39 -33
  73. package/dist/clients/attach/render/group-activity.d.ts +1 -0
  74. package/dist/clients/attach/render/group-activity.js +20 -13
  75. package/dist/clients/attach/render/group-recap.js +12 -3
  76. package/dist/clients/attach/session/connection.js +9 -15
  77. package/dist/clients/attach/session/editor-inventory.d.ts +6 -5
  78. package/dist/clients/attach/session/editor-inventory.js +7 -8
  79. package/dist/clients/attach/session/file-links.d.ts +13 -0
  80. package/dist/clients/attach/session/file-links.js +107 -0
  81. package/dist/clients/attach/session/frame.d.ts +3 -0
  82. package/dist/clients/attach/session/frame.js +10 -1
  83. package/dist/clients/attach/session/frames.js +2 -3
  84. package/dist/clients/attach/session/input-wiring.d.ts +4 -1
  85. package/dist/clients/attach/session/input-wiring.js +15 -14
  86. package/dist/clients/attach/session/mouse.d.ts +6 -1
  87. package/dist/clients/attach/session/mouse.js +8 -5
  88. package/dist/clients/attach/session/profile-files.js +18 -12
  89. package/dist/clients/attach/session/reconnect.js +1 -1
  90. package/dist/clients/attach/session/state-sync.js +1 -2
  91. package/dist/clients/attach/session/surface-host.d.ts +3 -2
  92. package/dist/clients/attach/session/surface-host.js +4 -4
  93. package/dist/clients/attach/slash/dispatch.d.ts +8 -31
  94. package/dist/clients/attach/slash/dispatch.js +34 -81
  95. package/dist/clients/attach/viewer.js +820 -860
  96. package/dist/clients/conversation/projection.d.ts +79 -0
  97. package/dist/clients/conversation/projection.js +341 -0
  98. package/dist/clients/inbox/__tests__/serial/inbox-controller.test.js +159 -0
  99. package/dist/clients/inbox/__tests__/serial/mount-panel.test.js +151 -0
  100. package/dist/clients/inbox/controller.d.ts +0 -4
  101. package/dist/clients/inbox/controller.js +0 -2
  102. package/dist/clients/inbox/review/__tests__/review-core.test.js +4 -293
  103. package/dist/clients/inbox/review/__tests__/teardown-notice.test.js +100 -0
  104. package/dist/clients/inbox/review/comments-client.d.ts +3 -2
  105. package/dist/clients/inbox/review/comments-client.js +12 -12
  106. package/dist/clients/inbox/review/companion-pane.d.ts +30 -0
  107. package/dist/clients/inbox/review/companion-pane.js +86 -0
  108. package/dist/clients/inbox/review/document-surface.d.ts +182 -0
  109. package/dist/clients/inbox/review/{document-region.js → document-surface.js} +252 -48
  110. package/dist/clients/inbox/review/frame.js +5 -4
  111. package/dist/clients/inbox/review/launch.d.ts +8 -8
  112. package/dist/clients/inbox/review/launch.js +52 -92
  113. package/dist/clients/inbox/review/nvim.d.ts +2 -0
  114. package/dist/clients/inbox/review/nvim.js +14 -12
  115. package/dist/clients/inbox/review/review-client.d.ts +12 -8
  116. package/dist/clients/inbox/review/review-client.js +46 -35
  117. package/dist/clients/inbox/review-adapter.d.ts +3 -10
  118. package/dist/clients/inbox/review-adapter.js +27 -19
  119. package/dist/clients/inbox/surface.d.ts +0 -4
  120. package/dist/clients/inbox/surface.js +0 -2
  121. package/dist/clients/surfaces/host.d.ts +11 -3
  122. package/dist/commands/__tests__/api-client-cold-start-diagnostic.test.js +7 -34
  123. package/dist/commands/__tests__/human.test.js +11 -322
  124. package/dist/commands/api-client.d.ts +5 -5
  125. package/dist/commands/api-client.js +6 -85
  126. package/dist/commands/canvas-browse.js +3 -29
  127. package/dist/commands/canvas-config.js +1 -1
  128. package/dist/commands/canvas-use.js +3 -3
  129. package/dist/commands/canvas.js +1 -1
  130. package/dist/commands/cron.js +5 -1
  131. package/dist/commands/human/queue.d.ts +0 -4
  132. package/dist/commands/human/queue.js +7 -40
  133. package/dist/commands/memory/list.d.ts +14 -0
  134. package/dist/commands/memory/list.js +35 -31
  135. package/dist/commands/memory/read.d.ts +7 -0
  136. package/dist/commands/memory/read.js +14 -8
  137. package/dist/commands/memory/write.js +13 -12
  138. package/dist/commands/node/bash.d.ts +1 -0
  139. package/dist/commands/node/bash.js +198 -0
  140. package/dist/commands/node/create.d.ts +23 -0
  141. package/dist/commands/node/create.js +207 -0
  142. package/dist/commands/node/inspect.d.ts +2 -0
  143. package/dist/commands/node/inspect.js +302 -0
  144. package/dist/commands/node/lifecycle.d.ts +4 -0
  145. package/dist/commands/node/lifecycle.js +415 -0
  146. package/dist/commands/node/message.d.ts +1 -0
  147. package/dist/commands/node/message.js +164 -0
  148. package/dist/commands/node/pyramid.d.ts +2 -0
  149. package/dist/commands/node/pyramid.js +79 -0
  150. package/dist/commands/node/subscription.d.ts +1 -0
  151. package/dist/commands/node/subscription.js +82 -0
  152. package/dist/commands/node/wait.d.ts +1 -0
  153. package/dist/commands/node/wait.js +159 -0
  154. package/dist/commands/node-lifecycle-revive.js +10 -57
  155. package/dist/commands/node.d.ts +0 -42
  156. package/dist/commands/node.js +11 -2065
  157. package/dist/commands/search.js +1 -1
  158. package/dist/commands/surface/node/cycle.d.ts +1 -0
  159. package/dist/commands/surface/node/cycle.js +83 -0
  160. package/dist/commands/surface/node/focus.d.ts +1 -0
  161. package/dist/commands/surface/node/focus.js +67 -0
  162. package/dist/commands/surface/node/id.d.ts +1 -0
  163. package/dist/commands/surface/node/id.js +38 -0
  164. package/dist/commands/surface/node/pin.d.ts +1 -0
  165. package/dist/commands/surface/node/pin.js +42 -0
  166. package/dist/commands/surface/node/placement.d.ts +46 -0
  167. package/dist/commands/surface/node/placement.js +124 -0
  168. package/dist/commands/surface-node.js +4 -1
  169. package/dist/commands/surface-reload.js +1 -2
  170. package/dist/commands/surface-tmux-spread.js +1 -1
  171. package/dist/commands/surface.js +5 -20
  172. package/dist/commands/sys/__tests__/setup-core.test.js +18 -271
  173. package/dist/commands/sys/config.js +6 -6
  174. package/dist/commands/sys/logs.js +1 -1
  175. package/dist/commands/sys/panels/broker-limits-panel.d.ts +17 -0
  176. package/dist/commands/sys/panels/broker-limits-panel.js +104 -0
  177. package/dist/commands/sys/panels/dependencies-panel.d.ts +14 -0
  178. package/dist/commands/sys/panels/dependencies-panel.js +80 -0
  179. package/dist/commands/sys/panels/keybindings-panel.d.ts +56 -0
  180. package/dist/commands/sys/panels/keybindings-panel.js +703 -0
  181. package/dist/commands/sys/panels/keys-panel.d.ts +16 -0
  182. package/dist/commands/sys/panels/keys-panel.js +60 -0
  183. package/dist/commands/sys/panels/models-panel.d.ts +77 -0
  184. package/dist/commands/sys/panels/models-panel.js +647 -0
  185. package/dist/commands/sys/panels/panel.d.ts +45 -0
  186. package/dist/commands/sys/panels/panel.js +137 -0
  187. package/dist/commands/sys/panels/plugins-panel.d.ts +16 -0
  188. package/dist/commands/sys/panels/plugins-panel.js +80 -0
  189. package/dist/commands/sys/panels/prefs-panel.d.ts +21 -0
  190. package/dist/commands/sys/panels/prefs-panel.js +85 -0
  191. package/dist/commands/sys/panels/provider-panel.d.ts +62 -0
  192. package/dist/commands/sys/panels/provider-panel.js +538 -0
  193. package/dist/commands/sys/settings-shell.d.ts +55 -0
  194. package/dist/commands/sys/settings-shell.js +400 -0
  195. package/dist/commands/sys/settings.d.ts +2 -0
  196. package/dist/commands/sys/settings.js +31 -0
  197. package/dist/commands/sys/setup-core.d.ts +3 -33
  198. package/dist/commands/sys/setup-core.js +27 -78
  199. package/dist/commands/sys/setup-settings-runner.d.ts +24 -0
  200. package/dist/commands/sys/setup-settings-runner.js +63 -0
  201. package/dist/commands/sys/setup-wizard.d.ts +26 -125
  202. package/dist/commands/sys/setup-wizard.js +209 -2473
  203. package/dist/commands/sys/setup.js +5 -7
  204. package/dist/commands/sys.js +3 -2
  205. package/dist/core/__tests__/broker-extension-canvas-db-boundary.test.js +50 -0
  206. package/dist/core/__tests__/broker-launch-candidates.test.js +20 -9
  207. package/dist/core/__tests__/broker-preflight.test.js +1 -1
  208. package/dist/core/__tests__/canvas-inbox-watcher-hold.test.js +108 -27
  209. package/dist/core/__tests__/canvas-inbox-watcher.test.js +14 -0
  210. package/dist/core/__tests__/canvas.test.js +2 -36
  211. package/dist/core/__tests__/close.test.js +14 -3
  212. package/dist/core/__tests__/context-intro.test.js +32 -143
  213. package/dist/core/__tests__/cron-broker-capacity.test.js +22 -3
  214. package/dist/core/__tests__/daemon-boot.test.js +2 -20
  215. package/dist/core/__tests__/daemon-wedge.test.js +1 -1
  216. package/dist/core/__tests__/dead-node-policy-table.test.js +1 -18
  217. package/dist/core/__tests__/fixtures/fake-engine.d.ts +1 -1
  218. package/dist/core/__tests__/fixtures/fake-engine.js +2 -2
  219. package/dist/core/__tests__/fixtures/fake-pi-host.js +2 -2
  220. package/dist/core/__tests__/focuses.test.js +4 -98
  221. package/dist/core/__tests__/helpers/broker-clients.d.ts +0 -3
  222. package/dist/core/__tests__/helpers/broker-clients.js +0 -14
  223. package/dist/core/__tests__/helpers/harness.d.ts +0 -8
  224. package/dist/core/__tests__/helpers/harness.js +7 -87
  225. package/dist/core/__tests__/helpers/viewer-panes.js +1 -1
  226. package/dist/core/__tests__/inline-memory-refs.test.js +5 -134
  227. package/dist/core/__tests__/kickoff.test.js +1 -1
  228. package/dist/core/__tests__/memory-resolver-precedence.test.js +29 -1
  229. package/dist/core/__tests__/migration.test.js +35 -48
  230. package/dist/core/__tests__/on-read-dedup-resume.test.js +22 -12
  231. package/dist/core/__tests__/passive-subscription.test.js +26 -49
  232. package/dist/core/__tests__/preview-registry-sync.test.js +1 -2
  233. package/dist/core/__tests__/prune.test.js +94 -1
  234. package/dist/core/__tests__/review-model-floor.test.js +0 -32
  235. package/dist/core/__tests__/seam/broker-attach-multiclient.test.js +255 -0
  236. package/dist/core/__tests__/{full → seam}/broker-attach-stream.test.js +39 -7
  237. package/dist/core/__tests__/{full → seam}/broker-crash-teardown.test.js +30 -29
  238. package/dist/core/__tests__/{full → seam}/broker-pane-resolution.test.js +54 -5
  239. package/dist/core/__tests__/{full → seam}/broker-provider-retry.test.js +134 -82
  240. package/dist/core/__tests__/{full → seam}/broker-whip-interrupt.test.js +15 -4
  241. package/dist/core/__tests__/{full/idle-release-settlement.test.js → seam/dormancy-release.test.js} +69 -17
  242. package/dist/core/__tests__/{full/yield-message-transaction.test.js → seam/yield-refresh-transaction.test.js} +31 -9
  243. package/dist/core/__tests__/secrets.test.js +1 -7
  244. package/dist/core/__tests__/{broker-fork-seam.test.js → serial/broker-fork-seam.test.js} +58 -7
  245. package/dist/core/__tests__/{broker-sdk-wiring.test.js → serial/broker-sdk-wiring.test.js} +18 -162
  246. package/dist/core/__tests__/{broker-snapshot-history.test.js → serial/broker-snapshot-history.test.js} +9 -9
  247. package/dist/core/__tests__/{command-plugins.test.js → serial/command-plugins.test.js} +105 -15
  248. package/dist/core/__tests__/{deferred-no-wake.test.js → serial/deferred-no-wake.test.js} +23 -20
  249. package/dist/core/__tests__/{flagship-lifecycle.test.js → serial/flagship-lifecycle.test.js} +7 -7
  250. package/dist/core/__tests__/{host-teardown-process-group.test.js → serial/host-teardown-process-group.test.js} +6 -6
  251. package/dist/core/__tests__/{human-deliver-e2e.test.js → serial/human-deliver-e2e.test.js} +12 -12
  252. package/dist/core/__tests__/{live-mutation.test.js → serial/live-mutation.test.js} +5 -5
  253. package/dist/core/__tests__/{refresh-stall-recycle.test.js → serial/refresh-stall-recycle.test.js} +5 -14
  254. package/dist/core/__tests__/{revive.test.js → serial/revive.test.js} +15 -100
  255. package/dist/core/__tests__/{spawn-root.test.js → serial/spawn-root.test.js} +32 -15
  256. package/dist/core/__tests__/serial/subscription-delivery.test.js +126 -0
  257. package/dist/core/__tests__/serial/tmux-surface.test.js +256 -0
  258. package/dist/core/__tests__/{worktree.test.js → serial/worktree.test.js} +15 -15
  259. package/dist/core/__tests__/session-model.test.js +0 -18
  260. package/dist/core/__tests__/spawn-worktree-id-conflict.test.js +9 -0
  261. package/dist/core/__tests__/watchdog-abort-arms-retry.test.js +50 -0
  262. package/dist/core/broker-client/__tests__/transport-relay.test.js +15 -16
  263. package/dist/core/broker-client/__tests__/transport-socket.test.js +28 -0
  264. package/dist/core/broker-client/client.d.ts +2 -2
  265. package/dist/core/broker-client/client.js +4 -7
  266. package/dist/core/broker-client/transport-relay.d.ts +13 -19
  267. package/dist/core/broker-client/transport-relay.js +19 -34
  268. package/dist/core/broker-client/transport-socket.d.ts +2 -2
  269. package/dist/core/broker-client/transport-socket.js +9 -2
  270. package/dist/core/broker-client/transport.d.ts +7 -3
  271. package/dist/core/broker-client/transport.js +4 -4
  272. package/dist/core/canvas/__tests__/attention.test.js +1 -18
  273. package/dist/core/canvas/__tests__/remote-canvas-source.test.js +7 -64
  274. package/dist/core/canvas/__tests__/remote-transport.test.js +2 -3
  275. package/dist/core/canvas/__tests__/render-remote.test.js +7 -52
  276. package/dist/core/canvas/browse/app.d.ts +2 -17
  277. package/dist/core/canvas/browse/app.js +16 -88
  278. package/dist/core/canvas/browse/model.d.ts +0 -4
  279. package/dist/core/canvas/browse/model.js +1 -12
  280. package/dist/core/canvas/browse/render.js +6 -3
  281. package/dist/core/canvas/crons.d.ts +8 -5
  282. package/dist/core/canvas/crons.js +7 -6
  283. package/dist/core/canvas/extensions.d.ts +7 -3
  284. package/dist/core/canvas/extensions.js +16 -4
  285. package/dist/core/canvas/nav-model.d.ts +0 -4
  286. package/dist/core/canvas/nav-model.js +2 -14
  287. package/dist/core/canvas/node-order.d.ts +3 -0
  288. package/dist/core/canvas/node-order.js +12 -0
  289. package/dist/core/canvas/remote-canvas-source.d.ts +3 -6
  290. package/dist/core/canvas/remote-canvas-source.js +8 -15
  291. package/dist/core/command.js +11 -4
  292. package/dist/core/config.js +3 -1
  293. package/dist/core/events/envelope.js +1 -1
  294. package/dist/core/events/read.js +7 -21
  295. package/dist/core/events/source.d.ts +0 -2
  296. package/dist/core/events/source.js +0 -16
  297. package/dist/core/events/types.d.ts +1 -1
  298. package/dist/core/fault-classifier.d.ts +1 -1
  299. package/dist/core/feed/passive.d.ts +0 -11
  300. package/dist/core/feed/passive.js +1 -62
  301. package/dist/core/human/__tests__/{inbox-core.test.js → serial/inbox-core.test.js} +6 -6
  302. package/dist/core/keybindings/__tests__/resolve.test.js +1 -96
  303. package/dist/core/keybindings/background-bash.js +3 -4
  304. package/dist/core/keybindings/catalog.js +1 -1
  305. package/dist/core/memory/inline-ref-grammar.js +3 -3
  306. package/dist/core/memory-resolver.d.ts +11 -25
  307. package/dist/core/memory-resolver.js +51 -33
  308. package/dist/core/model-routes.d.ts +15 -0
  309. package/dist/core/model-routes.js +12 -0
  310. package/dist/core/pool-credential-store.js +1 -1
  311. package/dist/core/preview-registry.js +8 -9
  312. package/dist/core/profiles/__tests__/root-profile.test.js +4 -14
  313. package/dist/core/review/realize.d.ts +0 -13
  314. package/dist/core/review/realize.js +0 -40
  315. package/dist/core/review/types.d.ts +1 -1
  316. package/dist/core/runtime/__tests__/engine-route.test.js +2 -2
  317. package/dist/core/runtime/bearings.js +1 -11
  318. package/dist/core/runtime/broker/client-registry.d.ts +33 -0
  319. package/dist/core/runtime/broker/client-registry.js +164 -0
  320. package/dist/core/runtime/broker/daemon-ops.d.ts +19 -0
  321. package/dist/core/runtime/broker/daemon-ops.js +49 -0
  322. package/dist/core/runtime/broker/event-projection.d.ts +42 -0
  323. package/dist/core/runtime/broker/event-projection.js +178 -0
  324. package/dist/core/runtime/broker/fault-retry.d.ts +39 -0
  325. package/dist/core/runtime/broker/fault-retry.js +277 -0
  326. package/dist/core/runtime/broker/frame-dispatch.d.ts +238 -0
  327. package/dist/core/runtime/broker/frame-dispatch.js +1537 -0
  328. package/dist/core/runtime/broker/inbox.d.ts +22 -0
  329. package/dist/core/runtime/broker/inbox.js +167 -0
  330. package/dist/core/runtime/broker/passive.d.ts +16 -0
  331. package/dist/core/runtime/broker/passive.js +44 -0
  332. package/dist/core/runtime/broker/read-ops.d.ts +23 -0
  333. package/dist/core/runtime/broker/read-ops.js +150 -0
  334. package/dist/core/runtime/broker/rebind.d.ts +74 -0
  335. package/dist/core/runtime/broker/rebind.js +211 -0
  336. package/dist/core/runtime/broker/tool-groups.d.ts +39 -0
  337. package/dist/core/runtime/broker/tool-groups.js +244 -0
  338. package/dist/core/runtime/broker-extension-render.d.ts +11 -0
  339. package/dist/core/runtime/broker-extension-render.js +181 -0
  340. package/dist/core/runtime/broker-persona-guidance.d.ts +13 -0
  341. package/dist/core/runtime/broker-persona-guidance.js +58 -0
  342. package/dist/core/runtime/broker-protocol.d.ts +1 -1
  343. package/dist/core/runtime/broker-protocol.js +1 -1
  344. package/dist/core/runtime/broker.d.ts +5 -196
  345. package/dist/core/runtime/broker.js +276 -3059
  346. package/dist/core/runtime/canvas-extensions.js +11 -2
  347. package/dist/core/runtime/fault.js +1 -1
  348. package/dist/core/runtime/model-selection.d.ts +9 -0
  349. package/dist/core/runtime/model-selection.js +12 -0
  350. package/dist/core/runtime/model-swap.d.ts +3 -3
  351. package/dist/core/runtime/model-swap.js +33 -25
  352. package/dist/core/runtime/placement-tmux.d.ts +3 -14
  353. package/dist/core/runtime/placement-tmux.js +11 -80
  354. package/dist/core/runtime/placement.d.ts +4 -2
  355. package/dist/core/runtime/placement.js +7 -12
  356. package/dist/core/runtime/promote.d.ts +14 -1
  357. package/dist/core/runtime/promote.js +1 -1
  358. package/dist/core/runtime/reset.d.ts +1 -1
  359. package/dist/core/runtime/roadmap.js +1 -1
  360. package/dist/core/runtime/spawn.d.ts +8 -0
  361. package/dist/core/runtime/spawn.js +36 -6
  362. package/dist/core/runtime/stop-guard.d.ts +4 -3
  363. package/dist/core/runtime/stop-guard.js +36 -18
  364. package/dist/core/runtime/stop-signals.d.ts +4 -1
  365. package/dist/core/runtime/stream-watchdog.js +4 -5
  366. package/dist/core/runtime/structured-output.d.ts +15 -2
  367. package/dist/core/runtime/structured-output.js +35 -12
  368. package/dist/core/runtime/tmux-bindings.d.ts +25 -0
  369. package/dist/core/runtime/tmux-bindings.js +682 -0
  370. package/dist/core/runtime/tmux-chrome.d.ts +2 -1
  371. package/dist/core/runtime/tmux-chrome.js +3 -2
  372. package/dist/core/runtime/{tmux.d.ts → tmux-driver.d.ts} +18 -26
  373. package/dist/core/runtime/tmux-driver.js +598 -0
  374. package/dist/core/runtime/view-socket.d.ts +14 -0
  375. package/dist/core/runtime/view-socket.js +83 -0
  376. package/dist/core/session-model/session-state.d.ts +1 -2
  377. package/dist/core/session-model/session-state.js +5 -8
  378. package/dist/core/spawn.d.ts +1 -1
  379. package/dist/core/spawn.js +2 -2
  380. package/dist/core/substrate/gate.d.ts +1 -1
  381. package/dist/core/substrate/on-read-pure.d.ts +7 -0
  382. package/dist/core/substrate/on-read-pure.js +272 -0
  383. package/dist/core/termrender/termrender.js +32 -2
  384. package/dist/core/user-settings.d.ts +23 -1
  385. package/dist/core/user-settings.js +18 -1
  386. package/dist/daemon/api/__tests__/node-model-validation.test.js +134 -0
  387. package/dist/daemon/api/__tests__/review-terminal-conflict.test.js +98 -0
  388. package/dist/daemon/api/__tests__/{full → seam}/api-server.test.js +6 -48
  389. package/dist/daemon/api/__tests__/{full → seam}/b10-attach-modelauth.test.js +17 -44
  390. package/dist/daemon/api/__tests__/{full/push-parity.test.js → seam/leaf-api-parity.test.js} +61 -42
  391. package/dist/daemon/api/bridge.js +40 -81
  392. package/dist/daemon/api/handlers/broker-ops.d.ts +2 -0
  393. package/dist/daemon/api/handlers/broker-ops.js +383 -0
  394. package/dist/daemon/api/handlers/crons.js +9 -4
  395. package/dist/daemon/api/handlers/files.js +6 -7
  396. package/dist/daemon/api/handlers/inbox.js +2 -340
  397. package/dist/daemon/api/handlers/nodes.d.ts +10 -1
  398. package/dist/daemon/api/handlers/nodes.js +74 -39
  399. package/dist/daemon/api/handlers/review-comments.js +5 -1
  400. package/dist/daemon/api/handlers/reviews.js +0 -19
  401. package/dist/daemon/api/map.js +25 -4
  402. package/dist/daemon/api/router.js +2 -3
  403. package/dist/daemon/api/server.js +5 -7
  404. package/dist/daemon/cron-run.d.ts +4 -0
  405. package/dist/daemon/cron-run.js +30 -13
  406. package/dist/daemon/crtrd.d.ts +3 -58
  407. package/dist/daemon/crtrd.js +28 -1244
  408. package/dist/daemon/manage.js +0 -1
  409. package/dist/daemon/reconcilers/broker-supervision.d.ts +50 -0
  410. package/dist/daemon/reconcilers/broker-supervision.js +549 -0
  411. package/dist/daemon/reconcilers/cron-lane.d.ts +10 -0
  412. package/dist/daemon/reconcilers/cron-lane.js +32 -0
  413. package/dist/daemon/reconcilers/dormant-inbox.d.ts +18 -0
  414. package/dist/daemon/reconcilers/dormant-inbox.js +143 -0
  415. package/dist/daemon/reconcilers/storage-maintenance.d.ts +22 -0
  416. package/dist/daemon/reconcilers/storage-maintenance.js +213 -0
  417. package/dist/daemon/review/finish.js +2 -5
  418. package/dist/pi-extensions/__tests__/canvas-context-intro.test.js +34 -53
  419. package/dist/pi-extensions/__tests__/canvas-recap.test.js +16 -113
  420. package/dist/pi-extensions/__tests__/canvas-stophook-agentend.test.js +72 -99
  421. package/dist/pi-extensions/__tests__/canvas-stophook-context-nudge.test.js +29 -12
  422. package/dist/pi-extensions/broker-local.d.ts +20 -0
  423. package/dist/pi-extensions/broker-local.js +89 -0
  424. package/dist/pi-extensions/canvas-context-intro.d.ts +3 -3
  425. package/dist/pi-extensions/canvas-context-intro.js +22 -11
  426. package/dist/pi-extensions/canvas-doc-substrate.js +17 -34
  427. package/dist/pi-extensions/canvas-goal-capture.js +7 -12
  428. package/dist/pi-extensions/canvas-inbox-watcher.js +124 -139
  429. package/dist/pi-extensions/canvas-passive-context.d.ts +3 -3
  430. package/dist/pi-extensions/canvas-passive-context.js +22 -18
  431. package/dist/pi-extensions/canvas-recap.d.ts +2 -2
  432. package/dist/pi-extensions/canvas-recap.js +48 -21
  433. package/dist/pi-extensions/canvas-review-boundary.js +10 -4
  434. package/dist/pi-extensions/canvas-stophook.d.ts +0 -5
  435. package/dist/pi-extensions/canvas-stophook.js +149 -431
  436. package/dist/pi-extensions/canvas-structured-output.js +52 -30
  437. package/dist/pi-extensions/envelope-merge.d.ts +13 -0
  438. package/dist/pi-extensions/envelope-merge.js +29 -0
  439. package/dist/shared/working-activity.d.ts +3 -2
  440. package/dist/shared/working-activity.js +3 -2
  441. package/dist/types.d.ts +6 -5
  442. package/dist/types.js +2 -2
  443. package/docs/compat/hearth-crtr-v1.md +4 -12
  444. package/docs/compat/hearth-crtr-v2.md +3 -11
  445. package/docs/compat/hearth-crtr-v3.md +4 -12
  446. package/docs/compat/hearth-crtr-v4.md +3 -11
  447. package/docs/compat/hearth-crtr-v5.md +3 -11
  448. package/docs/public-api.md +3 -7
  449. package/package.json +7 -49
  450. package/runtime.lock.json +2766 -14533
  451. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/__tests__/claude-plugin-commands.test.ts +0 -49
  452. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/__tests__/memory-slash-commands.test.ts +0 -194
  453. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/__tests__/statusline.test.ts +0 -68
  454. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/frontmatter-rules/test.ts +0 -119
  455. package/dist/clients/attach/__tests__/attach-chrome-remote.test.js +0 -439
  456. package/dist/clients/attach/__tests__/attach-keybindings.test.js +0 -170
  457. package/dist/clients/attach/__tests__/crtr-output-coverage.test.js +0 -57
  458. package/dist/clients/attach/__tests__/editor-frame-title.test.js +0 -19
  459. package/dist/clients/attach/__tests__/input-controller-extension-command.test.js +0 -32
  460. package/dist/clients/attach/__tests__/markdown-headings.test.js +0 -35
  461. package/dist/clients/attach/__tests__/session-identity-refresh.test.js +0 -32
  462. package/dist/clients/conversation/conversation.d.ts +0 -65
  463. package/dist/clients/conversation/conversation.js +0 -318
  464. package/dist/clients/conversation/frames.d.ts +0 -30
  465. package/dist/clients/conversation/frames.js +0 -52
  466. package/dist/clients/conversation/region.d.ts +0 -51
  467. package/dist/clients/conversation/region.js +0 -265
  468. package/dist/clients/inbox/__tests__/inbox-controller.test.js +0 -247
  469. package/dist/clients/inbox/__tests__/mount-panel.test.js +0 -776
  470. package/dist/clients/inbox/review/__tests__/remap.test.js +0 -196
  471. package/dist/clients/inbox/review/columns.d.ts +0 -22
  472. package/dist/clients/inbox/review/columns.js +0 -40
  473. package/dist/clients/inbox/review/composition.d.ts +0 -60
  474. package/dist/clients/inbox/review/composition.js +0 -278
  475. package/dist/clients/inbox/review/document-region.d.ts +0 -120
  476. package/dist/clients/surfaces/region.d.ts +0 -16
  477. package/dist/clients/web/__tests__/push-engine.test.js +0 -158
  478. package/dist/clients/web/__tests__/push-registry.test.d.ts +0 -1
  479. package/dist/clients/web/__tests__/push-registry.test.js +0 -177
  480. package/dist/clients/web/dev-server.d.ts +0 -7
  481. package/dist/clients/web/dev-server.js +0 -46
  482. package/dist/clients/web/events.d.ts +0 -19
  483. package/dist/clients/web/events.js +0 -163
  484. package/dist/clients/web/push-engine.d.ts +0 -44
  485. package/dist/clients/web/push-engine.js +0 -125
  486. package/dist/clients/web/push-registry.d.ts +0 -85
  487. package/dist/clients/web/push-registry.js +0 -373
  488. package/dist/clients/web/server.d.ts +0 -19
  489. package/dist/clients/web/server.js +0 -661
  490. package/dist/clients/web/web-client/shared/protocol.d.ts +0 -214
  491. package/dist/clients/web/web-client/shared/protocol.js +0 -8
  492. package/dist/clients/web/web-cmd.d.ts +0 -2
  493. package/dist/clients/web/web-cmd.js +0 -141
  494. package/dist/commands/__tests__/api-canvas-source.test.d.ts +0 -1
  495. package/dist/commands/__tests__/api-canvas-source.test.js +0 -37
  496. package/dist/commands/__tests__/canvas-config.test.d.ts +0 -1
  497. package/dist/commands/__tests__/canvas-config.test.js +0 -107
  498. package/dist/commands/__tests__/node-no-kickoff-flag.test.d.ts +0 -1
  499. package/dist/commands/__tests__/node-no-kickoff-flag.test.js +0 -73
  500. package/dist/commands/__tests__/node-worktree-flag.test.d.ts +0 -1
  501. package/dist/commands/__tests__/node-worktree-flag.test.js +0 -49
  502. package/dist/commands/__tests__/search-contents.test.d.ts +0 -1
  503. package/dist/commands/__tests__/search-contents.test.js +0 -52
  504. package/dist/commands/memory/__tests__/lint.test.d.ts +0 -1
  505. package/dist/commands/memory/__tests__/lint.test.js +0 -15
  506. package/dist/commands/sys/__tests__/config-broker-thresholds.test.d.ts +0 -1
  507. package/dist/commands/sys/__tests__/config-broker-thresholds.test.js +0 -95
  508. package/dist/commands/sys/__tests__/config-keybindings.test.d.ts +0 -1
  509. package/dist/commands/sys/__tests__/config-keybindings.test.js +0 -55
  510. package/dist/commands/sys/__tests__/helpers/setup-runtime.d.ts +0 -5
  511. package/dist/commands/sys/__tests__/helpers/setup-runtime.js +0 -19
  512. package/dist/commands/sys/__tests__/setup-front-door.test.d.ts +0 -1
  513. package/dist/commands/sys/__tests__/setup-front-door.test.js +0 -102
  514. package/dist/commands/sys/__tests__/setup-models.test.d.ts +0 -1
  515. package/dist/commands/sys/__tests__/setup-models.test.js +0 -205
  516. package/dist/commands/sys/__tests__/setup-providers-viewport.test.d.ts +0 -1
  517. package/dist/commands/sys/__tests__/setup-providers-viewport.test.js +0 -155
  518. package/dist/commands/sys/__tests__/sync-deps.test.d.ts +0 -1
  519. package/dist/commands/sys/__tests__/sync-deps.test.js +0 -179
  520. package/dist/commands/sys/__tests__/sync-import.test.d.ts +0 -1
  521. package/dist/commands/sys/__tests__/sync-import.test.js +0 -315
  522. package/dist/core/__tests__/base-worker-prompt.test.d.ts +0 -1
  523. package/dist/core/__tests__/base-worker-prompt.test.js +0 -57
  524. package/dist/core/__tests__/command-plugins-surfaces.test.d.ts +0 -1
  525. package/dist/core/__tests__/command-plugins-surfaces.test.js +0 -359
  526. package/dist/core/__tests__/connection-reconnect-resume.test.d.ts +0 -1
  527. package/dist/core/__tests__/connection-reconnect-resume.test.js +0 -36
  528. package/dist/core/__tests__/finalization-migration.test.d.ts +0 -1
  529. package/dist/core/__tests__/finalization-migration.test.js +0 -38
  530. package/dist/core/__tests__/fixtures/extra-extension.d.ts +0 -1
  531. package/dist/core/__tests__/fixtures/extra-extension.js +0 -3
  532. package/dist/core/__tests__/fixtures/spawn-proof-target.test.d.ts +0 -1
  533. package/dist/core/__tests__/fixtures/spawn-proof-target.test.js +0 -15
  534. package/dist/core/__tests__/fork.test.d.ts +0 -1
  535. package/dist/core/__tests__/fork.test.js +0 -108
  536. package/dist/core/__tests__/full/broker-attach-limits.test.d.ts +0 -1
  537. package/dist/core/__tests__/full/broker-attach-limits.test.js +0 -147
  538. package/dist/core/__tests__/full/broker-deliver-ack.test.d.ts +0 -1
  539. package/dist/core/__tests__/full/broker-deliver-ack.test.js +0 -73
  540. package/dist/core/__tests__/full/broker-dialogs.test.d.ts +0 -1
  541. package/dist/core/__tests__/full/broker-dialogs.test.js +0 -180
  542. package/dist/core/__tests__/full/broker-display-snapshot.test.d.ts +0 -1
  543. package/dist/core/__tests__/full/broker-display-snapshot.test.js +0 -75
  544. package/dist/core/__tests__/full/broker-dormant-wake.test.d.ts +0 -1
  545. package/dist/core/__tests__/full/broker-dormant-wake.test.js +0 -130
  546. package/dist/core/__tests__/full/broker-model-changed-broadcast.test.d.ts +0 -1
  547. package/dist/core/__tests__/full/broker-model-changed-broadcast.test.js +0 -57
  548. package/dist/core/__tests__/full/broker-navigate-tree-rewelcome.test.d.ts +0 -1
  549. package/dist/core/__tests__/full/broker-navigate-tree-rewelcome.test.js +0 -80
  550. package/dist/core/__tests__/full/cascade-close.test.d.ts +0 -1
  551. package/dist/core/__tests__/full/cascade-close.test.js +0 -240
  552. package/dist/core/__tests__/full/detach-focus.test.d.ts +0 -1
  553. package/dist/core/__tests__/full/detach-focus.test.js +0 -126
  554. package/dist/core/__tests__/full/idle-release-settlement.test.d.ts +0 -1
  555. package/dist/core/__tests__/full/issue-146-yield-spawn-focus.test.d.ts +0 -1
  556. package/dist/core/__tests__/full/issue-146-yield-spawn-focus.test.js +0 -107
  557. package/dist/core/__tests__/full/park-clock-release.test.d.ts +0 -1
  558. package/dist/core/__tests__/full/park-clock-release.test.js +0 -56
  559. package/dist/core/__tests__/full/yield-message-transaction.test.d.ts +0 -1
  560. package/dist/core/__tests__/memory-index-render.test.d.ts +0 -1
  561. package/dist/core/__tests__/memory-index-render.test.js +0 -60
  562. package/dist/core/__tests__/model-routes.test.d.ts +0 -1
  563. package/dist/core/__tests__/model-routes.test.js +0 -41
  564. package/dist/core/__tests__/on-read-identity.test.d.ts +0 -1
  565. package/dist/core/__tests__/on-read-identity.test.js +0 -61
  566. package/dist/core/__tests__/phase4-review-migration.test.d.ts +0 -1
  567. package/dist/core/__tests__/phase4-review-migration.test.js +0 -100
  568. package/dist/core/__tests__/prune-to-limit.test.d.ts +0 -1
  569. package/dist/core/__tests__/prune-to-limit.test.js +0 -126
  570. package/dist/core/__tests__/reset.test.d.ts +0 -1
  571. package/dist/core/__tests__/reset.test.js +0 -69
  572. package/dist/core/__tests__/spawn-no-kickoff.test.d.ts +0 -1
  573. package/dist/core/__tests__/spawn-no-kickoff.test.js +0 -115
  574. package/dist/core/__tests__/steer-note.test.d.ts +0 -1
  575. package/dist/core/__tests__/steer-note.test.js +0 -41
  576. package/dist/core/__tests__/subcommand-tier.test.d.ts +0 -1
  577. package/dist/core/__tests__/subcommand-tier.test.js +0 -99
  578. package/dist/core/__tests__/subscription-delivery.test.js +0 -211
  579. package/dist/core/__tests__/test-runner-cheap-sharding.test.d.ts +0 -1
  580. package/dist/core/__tests__/test-runner-cheap-sharding.test.js +0 -97
  581. package/dist/core/__tests__/tmux-surface.test.js +0 -484
  582. package/dist/core/__tests__/wake-bearings.test.d.ts +0 -1
  583. package/dist/core/__tests__/wake-bearings.test.js +0 -102
  584. package/dist/core/canvas/__tests__/remote-event-stream.test.d.ts +0 -1
  585. package/dist/core/canvas/__tests__/remote-event-stream.test.js +0 -146
  586. package/dist/core/canvas/__tests__/source-resolve.test.d.ts +0 -1
  587. package/dist/core/canvas/__tests__/source-resolve.test.js +0 -77
  588. package/dist/core/canvas/browse/__tests__/model.test.d.ts +0 -1
  589. package/dist/core/canvas/browse/__tests__/model.test.js +0 -290
  590. package/dist/core/canvas/browse/__tests__/rebuild-coalescer.test.d.ts +0 -1
  591. package/dist/core/canvas/browse/__tests__/rebuild-coalescer.test.js +0 -134
  592. package/dist/core/canvas/browse/__tests__/render.test.d.ts +0 -1
  593. package/dist/core/canvas/browse/__tests__/render.test.js +0 -111
  594. package/dist/core/canvas/browse/rebuild-coalescer.d.ts +0 -7
  595. package/dist/core/canvas/browse/rebuild-coalescer.js +0 -61
  596. package/dist/core/canvas/remote-event-stream.d.ts +0 -24
  597. package/dist/core/canvas/remote-event-stream.js +0 -94
  598. package/dist/core/feed/__tests__/coalesce-human.test.d.ts +0 -1
  599. package/dist/core/feed/__tests__/coalesce-human.test.js +0 -36
  600. package/dist/core/feed/__tests__/empty-node-guard.test.d.ts +0 -1
  601. package/dist/core/feed/__tests__/empty-node-guard.test.js +0 -45
  602. package/dist/core/host-exports/__tests__/export-prunes-boot-skill.test.d.ts +0 -1
  603. package/dist/core/host-exports/__tests__/export-prunes-boot-skill.test.js +0 -84
  604. package/dist/core/human/__tests__/visible-paths.test.d.ts +0 -1
  605. package/dist/core/human/__tests__/visible-paths.test.js +0 -28
  606. package/dist/core/keybindings/__tests__/inbox-affordance.test.d.ts +0 -1
  607. package/dist/core/keybindings/__tests__/inbox-affordance.test.js +0 -38
  608. package/dist/core/review/__tests__/project.test.d.ts +0 -1
  609. package/dist/core/review/__tests__/project.test.js +0 -71
  610. package/dist/core/runtime/__tests__/command-expansion.test.d.ts +0 -1
  611. package/dist/core/runtime/__tests__/command-expansion.test.js +0 -25
  612. package/dist/core/runtime/__tests__/session-visibility.test.d.ts +0 -1
  613. package/dist/core/runtime/__tests__/session-visibility.test.js +0 -119
  614. package/dist/core/runtime/__tests__/spawn-at-given-id.test.d.ts +0 -1
  615. package/dist/core/runtime/__tests__/spawn-at-given-id.test.js +0 -34
  616. package/dist/core/runtime/tmux.js +0 -1314
  617. package/dist/daemon/api/__tests__/full/push-parity.test.d.ts +0 -1
  618. package/dist/daemon/api/__tests__/full/worktree-parity.test.d.ts +0 -1
  619. package/dist/daemon/api/__tests__/full/worktree-parity.test.js +0 -160
  620. package/dist/daemon/api/__tests__/inbox.test.d.ts +0 -1
  621. package/dist/daemon/api/__tests__/inbox.test.js +0 -489
  622. package/dist/web-client/apple-touch-icon.png +0 -0
  623. package/dist/web-client/assets/fragment-mono-latin-400-normal-BYwT3kSJ.woff +0 -0
  624. package/dist/web-client/assets/fragment-mono-latin-400-normal-yxdJ5AmL.woff2 +0 -0
  625. package/dist/web-client/assets/fragment-mono-latin-ext-400-normal-BbKYyvR9.woff2 +0 -0
  626. package/dist/web-client/assets/fragment-mono-latin-ext-400-normal-CT4YFKeK.woff +0 -0
  627. package/dist/web-client/assets/index-CCPaLeW7.css +0 -2
  628. package/dist/web-client/assets/index-kyOWsnZK.js +0 -86
  629. package/dist/web-client/assets/martian-mono-cyrillic-wght-normal-B84CD5C_.woff2 +0 -0
  630. package/dist/web-client/assets/martian-mono-latin-ext-wght-normal-DlL6xMw5.woff2 +0 -0
  631. package/dist/web-client/assets/martian-mono-latin-wght-normal-5W32yIyr.woff2 +0 -0
  632. package/dist/web-client/assets/workbox-window.prod.es5-Bd17z0YL.js +0 -2
  633. package/dist/web-client/icon-192.png +0 -0
  634. package/dist/web-client/icon-512.png +0 -0
  635. package/dist/web-client/icon-maskable-512.png +0 -0
  636. package/dist/web-client/index.html +0 -17
  637. package/dist/web-client/manifest.webmanifest +0 -1
  638. package/dist/web-client/sw.js +0 -1
  639. /package/dist/api/__tests__/{client.test.d.ts → serial/client.test.d.ts} +0 -0
  640. /package/dist/clients/inbox/__tests__/{inbox-controller.test.d.ts → serial/inbox-controller.test.d.ts} +0 -0
  641. /package/dist/clients/inbox/__tests__/{mount-panel.test.d.ts → serial/mount-panel.test.d.ts} +0 -0
  642. /package/dist/clients/{attach/__tests__/attach-chrome-remote.test.d.ts → inbox/review/__tests__/teardown-notice.test.d.ts} +0 -0
  643. /package/dist/{clients/attach/__tests__/attach-keybindings.test.d.ts → core/__tests__/broker-extension-canvas-db-boundary.test.d.ts} +0 -0
  644. /package/dist/{clients/attach/__tests__/crtr-output-coverage.test.d.ts → core/__tests__/seam/broker-attach-multiclient.test.d.ts} +0 -0
  645. /package/dist/core/__tests__/{full → seam}/broker-attach-stream.test.d.ts +0 -0
  646. /package/dist/core/__tests__/{full → seam}/broker-crash-teardown.test.d.ts +0 -0
  647. /package/dist/core/__tests__/{full → seam}/broker-pane-resolution.test.d.ts +0 -0
  648. /package/dist/core/__tests__/{full → seam}/broker-provider-retry.test.d.ts +0 -0
  649. /package/dist/core/__tests__/{full → seam}/broker-whip-interrupt.test.d.ts +0 -0
  650. /package/dist/{clients/attach/__tests__/editor-frame-title.test.d.ts → core/__tests__/seam/dormancy-release.test.d.ts} +0 -0
  651. /package/dist/{clients/attach/__tests__/input-controller-extension-command.test.d.ts → core/__tests__/seam/yield-refresh-transaction.test.d.ts} +0 -0
  652. /package/dist/core/__tests__/{broker-fork-seam.test.d.ts → serial/broker-fork-seam.test.d.ts} +0 -0
  653. /package/dist/core/__tests__/{broker-sdk-wiring.test.d.ts → serial/broker-sdk-wiring.test.d.ts} +0 -0
  654. /package/dist/core/__tests__/{broker-snapshot-history.test.d.ts → serial/broker-snapshot-history.test.d.ts} +0 -0
  655. /package/dist/core/__tests__/{command-plugins.test.d.ts → serial/command-plugins.test.d.ts} +0 -0
  656. /package/dist/core/__tests__/{deferred-no-wake.test.d.ts → serial/deferred-no-wake.test.d.ts} +0 -0
  657. /package/dist/core/__tests__/{flagship-lifecycle.test.d.ts → serial/flagship-lifecycle.test.d.ts} +0 -0
  658. /package/dist/core/__tests__/{host-teardown-process-group.test.d.ts → serial/host-teardown-process-group.test.d.ts} +0 -0
  659. /package/dist/core/__tests__/{human-deliver-e2e.test.d.ts → serial/human-deliver-e2e.test.d.ts} +0 -0
  660. /package/dist/core/__tests__/{live-mutation.test.d.ts → serial/live-mutation.test.d.ts} +0 -0
  661. /package/dist/core/__tests__/{refresh-stall-recycle.test.d.ts → serial/refresh-stall-recycle.test.d.ts} +0 -0
  662. /package/dist/core/__tests__/{revive.test.d.ts → serial/revive.test.d.ts} +0 -0
  663. /package/dist/core/__tests__/{spawn-root.test.d.ts → serial/spawn-root.test.d.ts} +0 -0
  664. /package/dist/core/__tests__/{subscription-delivery.test.d.ts → serial/subscription-delivery.test.d.ts} +0 -0
  665. /package/dist/core/__tests__/{tmux-surface.test.d.ts → serial/tmux-surface.test.d.ts} +0 -0
  666. /package/dist/core/__tests__/{worktree.test.d.ts → serial/worktree.test.d.ts} +0 -0
  667. /package/dist/{clients/attach/__tests__/markdown-headings.test.d.ts → core/__tests__/watchdog-abort-arms-retry.test.d.ts} +0 -0
  668. /package/dist/{clients/attach/__tests__/session-identity-refresh.test.d.ts → core/broker-client/__tests__/transport-socket.test.d.ts} +0 -0
  669. /package/dist/core/human/__tests__/{inbox-core.test.d.ts → serial/inbox-core.test.d.ts} +0 -0
  670. /package/dist/{clients/inbox/review/__tests__/remap.test.d.ts → daemon/api/__tests__/node-model-validation.test.d.ts} +0 -0
  671. /package/dist/{clients/surfaces/region.js → daemon/api/__tests__/review-terminal-conflict.test.d.ts} +0 -0
  672. /package/dist/daemon/api/__tests__/{full → seam}/api-server.test.d.ts +0 -0
  673. /package/dist/daemon/api/__tests__/{full → seam}/b10-attach-modelauth.test.d.ts +0 -0
  674. /package/dist/{clients/web/__tests__/push-engine.test.d.ts → daemon/api/__tests__/seam/leaf-api-parity.test.d.ts} +0 -0
@@ -1,7 +1,7 @@
1
1
  import { existsSync } from 'node:fs';
2
- import { dirname, join } from 'node:path';
2
+ import { basename, dirname, extname, join } from 'node:path';
3
3
  import { fileURLToPath } from 'node:url';
4
- import { customExtensionPaths } from '../canvas/extensions.js';
4
+ import { customExtensionPaths, isShippedCanvasExtension } from '../canvas/extensions.js';
5
5
  function resolveExtension(name) {
6
6
  const here = dirname(fileURLToPath(import.meta.url)); // dist/core/runtime or src/core/runtime
7
7
  const candidates = [
@@ -63,7 +63,16 @@ export function mergeCanvasExtensions(persisted) {
63
63
  export function assertMandatoryCanvasExtensions(extensions) {
64
64
  const required = new Set(CANVAS_EXTENSIONS);
65
65
  const seen = new Map();
66
+ const canvasBasenames = new Set();
66
67
  for (const ext of extensions) {
68
+ if (isShippedCanvasExtension(ext)) {
69
+ const filename = basename(ext.replaceAll('\\', '/'));
70
+ const name = filename.slice(0, filename.length - extname(filename).length);
71
+ if (canvasBasenames.has(name)) {
72
+ throw new Error(`duplicate mandatory canvas extension basename ${name}`);
73
+ }
74
+ canvasBasenames.add(name);
75
+ }
67
76
  if (!required.has(ext))
68
77
  continue;
69
78
  seen.set(ext, (seen.get(ext) ?? 0) + 1);
@@ -19,7 +19,7 @@ function faultPriority(fault) {
19
19
  return 2;
20
20
  return 1;
21
21
  }
22
- const faultLinks = ['pi→provider', 'viewer↔broker', 'relay↔broker', 'browser↔relay', 'cli→exa', 'daemon→node', 'crtr→pi'];
22
+ const faultLinks = ['pi→provider', 'viewer↔broker', 'relay↔broker', 'viewer↔crtrd', 'cli→exa', 'daemon→node', 'crtr→pi'];
23
23
  const faultKinds = ['rate-limit', 'overloaded', 'connection', 'auth', 'protocol', 'context-overflow', 'other', 'wedged', 'model-not-found'];
24
24
  function parseFault(raw) {
25
25
  try {
@@ -27,6 +27,15 @@ export declare const MODEL_STRENGTHS: ModelStrength[];
27
27
  * and then fails/falls back through the normal auth-aware launch policy. */
28
28
  export declare function configuredLadderProviders(isConfigured: (runtimeProviderId: string) => boolean, ladders?: ScopeConfig['modelLadders']): ModelProvider[];
29
29
  export declare const THINKING_SUFFIXES: Set<string>;
30
+ export declare function parseModelSpec<T extends string = string>(spec: string): {
31
+ modelSpec: string;
32
+ thinkingLevel?: T;
33
+ };
34
+ export declare function isUnknownModel(model: {
35
+ provider?: string;
36
+ id?: string;
37
+ api?: string;
38
+ } | null | undefined): boolean;
30
39
  export declare function stripThinkingSuffix(spec: string): string;
31
40
  export interface PortableModelSelection {
32
41
  provider: ModelProvider;
@@ -61,6 +61,18 @@ export function configuredLadderProviders(isConfigured, ladders = modelLadders()
61
61
  return kept.length > 0 ? kept : [...MODEL_PROVIDER_KEYS];
62
62
  }
63
63
  export const THINKING_SUFFIXES = new Set(['off', 'minimal', 'low', 'medium', 'high', 'xhigh', 'max']);
64
+ export function parseModelSpec(spec) {
65
+ const i = spec.lastIndexOf(':');
66
+ if (i <= 0)
67
+ return { modelSpec: spec };
68
+ const suffix = spec.slice(i + 1);
69
+ if (!THINKING_SUFFIXES.has(suffix))
70
+ return { modelSpec: spec };
71
+ return { modelSpec: spec.slice(0, i), thinkingLevel: suffix };
72
+ }
73
+ export function isUnknownModel(model) {
74
+ return model?.provider === 'unknown' && model.id === 'unknown' && model.api === 'unknown';
75
+ }
64
76
  export function stripThinkingSuffix(spec) {
65
77
  const i = spec.lastIndexOf(':');
66
78
  if (i <= 0)
@@ -4,9 +4,8 @@ import { type NodeMeta } from '../canvas/index.js';
4
4
  * or a live pid mid-boot before it binds the socket, is NOT a live broker. */
5
5
  export declare function isBrokerLive(meta: NodeMeta): boolean;
6
6
  /** Swap a LIVE node's model over its view.sock. Connects as a controller,
7
- * sends `set_model`, and resolves with the broker-resolved `provider/id` on its ack —
8
- * read back from the row the broker just persisted (model_changed.model carries
9
- * only the bare id). Rejects with the broker's message on an `error` frame (e.g.
7
+ * sends `set_model`, and resolves with the broker-resolved durable spec from its
8
+ * `model_changed` frame. Rejects with the broker's message on an `error` frame (e.g.
10
9
  * `no model matching '<spec>' in the registry`), on connect failure, or timeout.
11
10
  * `pinned` is the durable-pin decision for this change, made by the CALLER from
12
11
  * the RAW pre-normalize token (`spec` here is already normalizeModel-resolved,
@@ -24,4 +23,5 @@ export declare function setModelLive(nodeId: string, spec: string, pinned: boole
24
23
  * from the RAW pre-normalize token, never re-derived here from `spec`'s shape
25
24
  * (a concrete `spec` always reads as "pinned", which would wrongly re-pin a
26
25
  * deliberately chosen bare tier that happens to byte-equal a ladder cell). */
26
+ export declare function updateModelRecipe(meta: NodeMeta, spec: string, pinnedOverride: boolean | undefined, userSelected: boolean): NodeMeta;
27
27
  export declare function persistDormantModel(nodeId: string, spec: string, pinned: boolean): void;
@@ -4,12 +4,11 @@
4
4
  //
5
5
  // LIVE — the node's broker is up (recorded pi_pid alive AND view.sock
6
6
  // present): connect to view.sock as a controller, send `set_model`,
7
- // await the ack. The broker's broadcastModelChanged already persists
8
- // the choice via persistModelChoice (model_override + launch.model), so
9
- // this path NEVER writes the recipe itself — it reads back the resolved
10
- // provider/id from the freshly-updated row.
7
+ // await the ack. The broker commits model_override + launch.model
8
+ // through crtrd before broadcasting the resolved durable spec, so this
9
+ // path never writes or rereads the canvas row itself.
11
10
  // DORMANT — no live broker: write the durable recipe directly (mirroring exactly
12
- // what persistModelChoice writes) so the next revive picks it up.
11
+ // the canonical recipe update) so the next revive picks it up.
13
12
  //
14
13
  // This complements the in-viewer `/model` slash command for the headless case.
15
14
  import { existsSync } from 'node:fs';
@@ -24,9 +23,8 @@ export function isBrokerLive(meta) {
24
23
  return isPidAlive(meta.pi_pid) && existsSync(viewSocketPath(meta.node_id));
25
24
  }
26
25
  /** Swap a LIVE node's model over its view.sock. Connects as a controller,
27
- * sends `set_model`, and resolves with the broker-resolved `provider/id` on its ack —
28
- * read back from the row the broker just persisted (model_changed.model carries
29
- * only the bare id). Rejects with the broker's message on an `error` frame (e.g.
26
+ * sends `set_model`, and resolves with the broker-resolved durable spec from its
27
+ * `model_changed` frame. Rejects with the broker's message on an `error` frame (e.g.
30
28
  * `no model matching '<spec>' in the registry`), on connect failure, or timeout.
31
29
  * `pinned` is the durable-pin decision for this change, made by the CALLER from
32
30
  * the RAW pre-normalize token (`spec` here is already normalizeModel-resolved,
@@ -36,20 +34,17 @@ export function isBrokerLive(meta) {
36
34
  * from the resolved spec. */
37
35
  export function setModelLive(nodeId, spec, pinned) {
38
36
  // `set_model` carries no frame id, so the ack is matched on `for` alone.
39
- let resolvedId;
37
+ let resolvedSpec;
40
38
  return oneShotControllerRequest({
41
39
  nodeId,
42
40
  what: 'the model switch',
43
41
  ackFor: 'set_model',
44
42
  frame: () => ({ type: 'set_model', model: spec, pinned }),
45
43
  observe: (frame) => {
46
- if (frame.type === 'model_changed')
47
- resolvedId = frame.model?.id;
44
+ if (frame.type === 'model_changed' && frame.spec !== null)
45
+ resolvedSpec = frame.spec;
48
46
  },
49
- // The broker persisted model_override (full provider/id) in
50
- // broadcastModelChanged BEFORE flushing these frames, so the row is
51
- // authoritative; fall back to the bare id, then the raw spec.
52
- result: () => getNode(nodeId)?.model_override ?? resolvedId ?? spec,
47
+ result: () => resolvedSpec ?? spec,
53
48
  });
54
49
  }
55
50
  /** Persist a model choice into a DORMANT node's durable recipe — mirrors exactly
@@ -61,16 +56,29 @@ export function setModelLive(nodeId, spec, pinned) {
61
56
  * from the RAW pre-normalize token, never re-derived here from `spec`'s shape
62
57
  * (a concrete `spec` always reads as "pinned", which would wrongly re-pin a
63
58
  * deliberately chosen bare tier that happens to byte-equal a ladder cell). */
64
- export function persistDormantModel(nodeId, spec, pinned) {
65
- const meta = getNode(nodeId);
66
- if (meta === null)
67
- return;
59
+ export function updateModelRecipe(meta, spec, pinnedOverride, userSelected) {
68
60
  const launch = meta.launch === undefined
69
61
  ? undefined
70
- : (() => {
71
- const { modelIntent: _modelIntent, env, ...rest } = meta.launch;
72
- const { CRTR_MODEL_INTENT: _intentEnv, ...remainingEnv } = env;
73
- return { ...rest, model: spec, modelProviderPinned: pinned, env: remainingEnv };
74
- })();
75
- updateNode(nodeId, { model_override: spec, ...(launch !== undefined ? { launch } : {}) });
62
+ : userSelected
63
+ ? (() => {
64
+ const { modelIntent: _modelIntent, env, ...rest } = meta.launch;
65
+ const { CRTR_MODEL_INTENT: _intentEnv, ...remainingEnv } = env;
66
+ return {
67
+ ...rest,
68
+ model: spec,
69
+ ...(pinnedOverride !== undefined ? { modelProviderPinned: pinnedOverride } : {}),
70
+ env: remainingEnv,
71
+ };
72
+ })()
73
+ : {
74
+ ...meta.launch,
75
+ model: spec,
76
+ ...(pinnedOverride !== undefined ? { modelProviderPinned: pinnedOverride } : {}),
77
+ };
78
+ return updateNode(meta.node_id, { model_override: spec, ...(launch !== undefined ? { launch } : {}) });
79
+ }
80
+ export function persistDormantModel(nodeId, spec, pinned) {
81
+ const meta = getNode(nodeId);
82
+ if (meta !== null)
83
+ updateModelRecipe(meta, spec, pinned, true);
76
84
  }
@@ -1,17 +1,6 @@
1
- export { paneExists, paneLocation, paneOfNode, paneCurrentPath, ensureSession, openNodeWindow, splitWindow, closePane, currentTmux, switchClient, selectWindow, selectLayout, selectPane, getPaneOption, setPaneOption, breakPane, inTmux, piCommand, shellQuote, installTmuxBindings, renameWindow, displayPopup, windowOfPane, respawnPaneSync, respawnPaneInPlace, paneStartCommand, panePid, windowAlive, listLivePanes, VIEWER_STAMP_OPTION, stampViewerPaneAsync, liveViewerPanes, sendAttachControl, displayClientMessage, } from './tmux.js';
2
- /** The shared cold-start deadline (ms) a freshly-opened viewer waits for its
3
- * broker's view.sock — one source of truth for the CRTR_ATTACH_WAIT_MS a viewer
4
- * pane is handed. */
5
- export declare const BROKER_VIEW_SOCKET_WAIT_MS = 30000;
6
- /** Wait until a broker's view.sock accepts a connection. The launching caller
7
- * stays async, so the broker's real exit signal can fail fast the wait instead
8
- * of being masked by a zombie pid. Success proves more than file existence: it
9
- * is robust to a stale leftover socket the broker has not unlinked yet,
10
- * because only an accepting listener yields a `connect`. */
11
- export declare function waitForBrokerViewSocket(nodeId: string, exited?: Promise<{
12
- code: number | null;
13
- signal: NodeJS.Signals | null;
14
- }>): Promise<boolean>;
1
+ export { paneExists, paneLocation, paneOfNode, paneCurrentPath, paneSize, paneRunning, ensureSession, openNodeWindow, splitWindow, closePane, currentTmux, switchClient, selectWindow, selectLayout, selectPane, getPaneOption, setPaneOption, breakPane, inTmux, piCommand, shellQuote, renameWindow, displayPopup, windowOfPane, respawnPaneSync, respawnPaneInBackground, respawnPaneInPlace, paneStartCommand, panePid, windowAlive, listLivePanes, VIEWER_STAMP_OPTION, stampViewerPaneAsync, liveViewerPanes, sendAttachControl, displayClientMessage, } from './tmux-driver.js';
2
+ export { installTmuxBindings } from './tmux-bindings.js';
3
+ export { BROKER_VIEW_SOCKET_WAIT_MS, waitForBrokerViewSocket } from './view-socket.js';
15
4
  /** Env for a `crtr surface attach` VIEWER pane (the focus split, the spawn viewer
16
5
  * window, AND recycle's re-attach respawn): propagate CRTR_HOME so the viewer
17
6
  * resolves the SAME canvas home — and thus the right view.sock — under a
@@ -12,88 +12,19 @@
12
12
  // openViewerWindow composes openViewerPane (here) + registerViewerFocus (the db
13
13
  // write, which stays in placement.ts).
14
14
  //
15
- // §5.1 import-lint: placement-tmux.ts is an ALLOWED direct importer of tmux.ts —
16
- // it is the sanctioned pure-tmux seam, re-exporting the driver verbs other
17
- // modules need so they never import tmux.ts directly.
18
- import { createConnection } from 'node:net';
19
- import { paneLocation, ensureSession, openNodeWindow, splitWindow, selectLayout, } from './tmux.js';
20
- import { viewSocketPath } from '../canvas/paths.js';
21
- // Re-export the pure tmux driver verbs the CLI/viewer consumers need, so the
22
- // §5.1 lint's "only placement / tmux-chrome import tmux.ts" holds while these
23
- // modules never reach the canvas focuses table.
24
- export { paneExists, paneLocation, paneOfNode, paneCurrentPath, ensureSession, openNodeWindow, splitWindow, closePane, currentTmux, switchClient, selectWindow, selectLayout, selectPane, getPaneOption, setPaneOption, breakPane, inTmux, piCommand, shellQuote, installTmuxBindings, renameWindow, displayPopup, windowOfPane, respawnPaneSync, respawnPaneInPlace, paneStartCommand, panePid, windowAlive, listLivePanes, VIEWER_STAMP_OPTION, stampViewerPaneAsync, liveViewerPanes, sendAttachControl, displayClientMessage, } from './tmux.js';
15
+ // §5.1 import-lint: placement-tmux.ts is an allowed direct importer of
16
+ // tmux-driver.ts — it is the sanctioned pure-tmux seam, re-exporting the driver
17
+ // verbs other modules need so they never import the driver directly.
18
+ import { paneLocation, ensureSession, openNodeWindow, splitWindow, selectLayout, } from './tmux-driver.js';
19
+ import { BROKER_VIEW_SOCKET_WAIT_MS } from './view-socket.js';
20
+ // Re-export the pure tmux driver verbs the CLI/viewer consumers need without
21
+ // exposing the canvas focuses table or sending command modules to the raw driver.
22
+ export { paneExists, paneLocation, paneOfNode, paneCurrentPath, paneSize, paneRunning, ensureSession, openNodeWindow, splitWindow, closePane, currentTmux, switchClient, selectWindow, selectLayout, selectPane, getPaneOption, setPaneOption, breakPane, inTmux, piCommand, shellQuote, renameWindow, displayPopup, windowOfPane, respawnPaneSync, respawnPaneInBackground, respawnPaneInPlace, paneStartCommand, panePid, windowAlive, listLivePanes, VIEWER_STAMP_OPTION, stampViewerPaneAsync, liveViewerPanes, sendAttachControl, displayClientMessage, } from './tmux-driver.js';
23
+ export { installTmuxBindings } from './tmux-bindings.js';
25
24
  // ---------------------------------------------------------------------------
26
25
  // view.sock readiness — the one shared broker-cold-start primitive
27
26
  // ---------------------------------------------------------------------------
28
- const BROKER_FOCUS_SOCKET_WAIT_MS = 30_000;
29
- const BROKER_FOCUS_SOCKET_RETRY_MS = 100;
30
- /** The shared cold-start deadline (ms) a freshly-opened viewer waits for its
31
- * broker's view.sock — one source of truth for the CRTR_ATTACH_WAIT_MS a viewer
32
- * pane is handed. */
33
- export const BROKER_VIEW_SOCKET_WAIT_MS = BROKER_FOCUS_SOCKET_WAIT_MS;
34
- function sleep(ms) {
35
- return new Promise((resolve) => {
36
- setTimeout(resolve, ms);
37
- });
38
- }
39
- function probeBrokerViewSocket(sockPath, timeoutMs) {
40
- return new Promise((resolve) => {
41
- let settled = false;
42
- let socket = null;
43
- const finish = (ok) => {
44
- if (settled)
45
- return;
46
- settled = true;
47
- if (socket !== null)
48
- socket.destroy();
49
- resolve(ok);
50
- };
51
- try {
52
- socket = createConnection(sockPath);
53
- }
54
- catch {
55
- finish(false);
56
- return;
57
- }
58
- socket.once('connect', () => finish(true));
59
- socket.once('error', () => finish(false));
60
- socket.setTimeout(timeoutMs, () => finish(false));
61
- });
62
- }
63
- /** Wait until a broker's view.sock accepts a connection. The launching caller
64
- * stays async, so the broker's real exit signal can fail fast the wait instead
65
- * of being masked by a zombie pid. Success proves more than file existence: it
66
- * is robust to a stale leftover socket the broker has not unlinked yet,
67
- * because only an accepting listener yields a `connect`. */
68
- export async function waitForBrokerViewSocket(nodeId, exited) {
69
- const sockPath = viewSocketPath(nodeId);
70
- const deadline = Date.now() + BROKER_FOCUS_SOCKET_WAIT_MS;
71
- const exitSeen = exited?.then(() => 'exit');
72
- while (Date.now() <= deadline) {
73
- const remaining = Math.max(0, deadline - Date.now());
74
- const probe = probeBrokerViewSocket(sockPath, Math.min(BROKER_FOCUS_SOCKET_RETRY_MS, remaining)).then((ok) => (ok ? 'ready' : 'retry'));
75
- // Race the probe against the broker's real exit ONLY when we have one. With
76
- // no exit promise, an `?? Promise.resolve('retry')` would settle instantly
77
- // and always beat the probe, so readiness could never observe a `connect`.
78
- const outcome = exitSeen === undefined ? await probe : await Promise.race([probe, exitSeen]);
79
- if (outcome === 'ready')
80
- return true;
81
- if (outcome === 'exit')
82
- return false;
83
- if (exitSeen !== undefined) {
84
- const sleptOrExit = await Promise.race([
85
- sleep(BROKER_FOCUS_SOCKET_RETRY_MS).then(() => 'sleep'),
86
- exitSeen,
87
- ]);
88
- if (sleptOrExit === 'exit')
89
- return false;
90
- }
91
- else {
92
- await sleep(BROKER_FOCUS_SOCKET_RETRY_MS);
93
- }
94
- }
95
- return false;
96
- }
27
+ export { BROKER_VIEW_SOCKET_WAIT_MS, waitForBrokerViewSocket } from './view-socket.js';
97
28
  // ---------------------------------------------------------------------------
98
29
  // Viewer pane opener (tmux half, NO focus-row write)
99
30
  // ---------------------------------------------------------------------------
@@ -126,7 +57,7 @@ export function openViewerPane(nodeId, session, opts = {}) {
126
57
  // a literal duplicated at the call site.
127
58
  const env = {
128
59
  ...viewerSplitEnv(),
129
- ...(opts.waitForBroker === true ? { CRTR_ATTACH_WAIT_MS: String(BROKER_FOCUS_SOCKET_WAIT_MS) } : {}),
60
+ ...(opts.waitForBroker === true ? { CRTR_ATTACH_WAIT_MS: String(BROKER_VIEW_SOCKET_WAIT_MS) } : {}),
130
61
  ...(opts.initialWhip === true ? { CRTR_ATTACH_INITIAL_WHIP: '1' } : {}),
131
62
  };
132
63
  const cwd = opts.cwd ?? process.cwd();
@@ -1,7 +1,9 @@
1
1
  import { type FocusRow } from '../canvas/index.js';
2
2
  export type { FocusRow };
3
- export { splitWindow, breakPane, selectLayout, selectPane, focusWindow, selectWindow, switchClient, openNodeWindow, ensureSession, paneLocation, paneExists, paneRunning, paneCurrentPath, currentTmux, inTmux, paneOfNode, installTmuxBindings, installTmuxBindings as installMenuBinding, setPaneOption, getPaneOption, piCommand, shellQuote, respawnPaneSync, closePane, displayPopup, windowOfPane, renameWindow, paneOfWindow, windowAlive, listLivePanes, } from './tmux.js';
4
- export type { RespawnPaneOpts, TmuxInstalledPair, TmuxInstallDiagnostic, TmuxInstallResult } from './tmux.js';
3
+ export { splitWindow, breakPane, selectLayout, selectPane, focusWindow, selectWindow, switchClient, openNodeWindow, ensureSession, paneLocation, paneExists, paneRunning, paneCurrentPath, currentTmux, inTmux, paneOfNode, setPaneOption, getPaneOption, piCommand, shellQuote, respawnPaneSync, closePane, displayPopup, windowOfPane, renameWindow, paneOfWindow, windowAlive, listLivePanes, } from './tmux-driver.js';
4
+ export type { RespawnPaneOpts } from './tmux-driver.js';
5
+ export { installTmuxBindings } from './tmux-bindings.js';
6
+ export type { TmuxInstalledPair, TmuxInstallDiagnostic, TmuxInstallResult } from './tmux-bindings.js';
5
7
  /** The viewer a node has on screen, or null. UNIQUE(node_id) ⇒ at most one. */
6
8
  export declare function focusOf(nodeId: string): FocusRow | null;
7
9
  /** Does this node have a live viewer on screen? */
@@ -20,13 +20,12 @@
20
20
  // row registrar used by BOTH spawn (a background viewer window) and focus.
21
21
  // • tearDownNode / detachToBackground — close a node's viewer pane + row.
22
22
  // • The chrome/viewer tmux re-exports (§2.1): placement stays the sanctioned
23
- // model-over-driver so the §5.1 import-lint ("only placement.ts /
24
- // tmux-chrome.ts import tmux.ts") holds — every other module reaches the
25
- // driver verbs through here.
23
+ // model-over-driver. Raw driver access is confined to placement, its pure
24
+ // tmux half, the bindings owner, and tmux chrome.
26
25
  import { getNode, fullName, deleteNode, listNodes, openFocusRow, closeFocusRow, getFocusByNode, getFocusByPane, getFocusById, listFocuses as listFocusRows, } from '../canvas/index.js';
27
26
  import { nodeHasAssistantMessage, isNodeStreaming } from '../canvas/render.js';
28
27
  import { headlessBrokerHost } from './host.js';
29
- import { paneExists, paneLocation, closePane, currentTmux, switchClient, selectWindow, selectLayout, selectPane, getPaneOption, setPaneOption, respawnPaneSync, windowOfPane, renameWindow, } from './tmux.js';
28
+ import { paneExists, paneLocation, closePane, currentTmux, switchClient, selectWindow, selectLayout, selectPane, getPaneOption, setPaneOption, respawnPaneSync, windowOfPane, renameWindow, } from './tmux-driver.js';
30
29
  // The PURE tmux + broker-socket half now lives in placement-tmux.ts. placement
31
30
  // composes the viewer OPENER over openViewerPane (tmux) + registerViewerFocus
32
31
  // (the db write). viewerSplitEnv + waitForBrokerViewSocket are re-exported here
@@ -36,8 +35,7 @@ import { openViewerPane, viewerSplitEnv, waitForBrokerViewSocket } from './place
36
35
  import { newJobId } from './nodes.js';
37
36
  import { isPidAlive } from '../canvas/pid.js';
38
37
  // Placement is the sanctioned model-over-driver (§2.1): non-placement runtime /
39
- // command modules that legitimately need a raw driver verb get it from here, so
40
- // the §5.1 lint can hold "only placement.ts / tmux-chrome.ts import tmux.ts".
38
+ // command modules that legitimately need a raw driver verb get it from here.
41
39
  // These are the chrome + viewer verbs that survive the cut (the engine-in-pane
42
40
  // verbs — respawnPane, respawnPaneDetached, swapPaneInPlace, breakPaneToSession,
43
41
  // joinPane, setWindowOption, setRemainOnExit — are deleted). `breakPane` +
@@ -46,12 +44,9 @@ import { isPidAlive } from '../canvas/pid.js';
46
44
  // viewer pane into its own window and tiles sibling viewers beside it.
47
45
  // `piCommand`, `paneCurrentPath`, and `shellQuote` remain available to command
48
46
  // modules that need to build or inspect tmux pane commands without importing
49
- // tmux.ts directly; the §5.1 lint keeps the raw driver behind this placement
50
- // boundary.
51
- export { splitWindow, breakPane, selectLayout, selectPane, focusWindow, selectWindow, switchClient, openNodeWindow, ensureSession, paneLocation, paneExists, paneRunning, paneCurrentPath, currentTmux, inTmux, paneOfNode, installTmuxBindings,
52
- // Compile seam for viewer.ts, which still calls installMenuBinding();
53
- // deleted when the attach unit imports installTmuxBindings directly.
54
- installTmuxBindings as installMenuBinding, setPaneOption, getPaneOption, piCommand, shellQuote, respawnPaneSync, closePane, displayPopup, windowOfPane, renameWindow, paneOfWindow, windowAlive, listLivePanes, } from './tmux.js';
47
+ // tmux-driver.ts directly.
48
+ export { splitWindow, breakPane, selectLayout, selectPane, focusWindow, selectWindow, switchClient, openNodeWindow, ensureSession, paneLocation, paneExists, paneRunning, paneCurrentPath, currentTmux, inTmux, paneOfNode, setPaneOption, getPaneOption, piCommand, shellQuote, respawnPaneSync, closePane, displayPopup, windowOfPane, renameWindow, paneOfWindow, windowAlive, listLivePanes, } from './tmux-driver.js';
49
+ export { installTmuxBindings } from './tmux-bindings.js';
55
50
  // ---------------------------------------------------------------------------
56
51
  // Viewer registry reads — COMPOSE over the canvas focuses table (§2.3/§4).
57
52
  //
@@ -1,4 +1,4 @@
1
- import { type NodeMeta } from '../canvas/index.js';
1
+ import { type NodeMeta, type Mode, type Lifecycle } from '../canvas/index.js';
2
2
  export interface PromoteResult {
3
3
  meta: NodeMeta;
4
4
  roadmapWritten: boolean;
@@ -7,6 +7,19 @@ export interface PromoteResult {
7
7
  /** Absolute path to the node's goal doc (context/initial-prompt.md). */
8
8
  goalPath: string;
9
9
  }
10
+ /** Shared reshape machinery: rewrite kind and/or model tier — and, when the
11
+ * caller supplies them, mode/lifecycle — by rebuilding the launch spec so the
12
+ * change is durable across a future revive. MODE-PRESERVING by default (omit
13
+ * `mode`/`lifecycle` and the node's own current values carry through) — this
14
+ * is what a plain `crtr node yield --kind/--model` reshape rides, with no
15
+ * mode flip and no roadmap seeding. `promote()` below is a thin wrapper that
16
+ * also forces mode→orchestrator and seeds the roadmap. */
17
+ export declare function reshapeNode(nodeId: string, opts?: {
18
+ kind?: string;
19
+ model?: string;
20
+ mode?: Mode;
21
+ lifecycle?: Lifecycle;
22
+ }, beforePersist?: () => void): NodeMeta;
10
23
  /** Promote a node to an orchestrator (mode→orchestrator), optionally
11
24
  * specializing its kind (e.g. a `general` worker becoming a
12
25
  * `developer.orchestrator`) and optionally also making it resident. Idempotent:
@@ -31,7 +31,7 @@ import { readGoal, goalPath } from './kickoff.js';
31
31
  * is what a plain `crtr node yield --kind/--model` reshape rides, with no
32
32
  * mode flip and no roadmap seeding. `promote()` below is a thin wrapper that
33
33
  * also forces mode→orchestrator and seeds the roadmap. */
34
- function reshapeNode(nodeId, opts = {}, beforePersist) {
34
+ export function reshapeNode(nodeId, opts = {}, beforePersist) {
35
35
  const node = getNode(nodeId);
36
36
  if (node === null)
37
37
  throw new Error(`unknown node: ${nodeId}`);
@@ -12,7 +12,7 @@ import { respawnPaneSync } from './placement.js';
12
12
  * general quit→done rule does NOT auto-resolve a force-killed descendant — we
13
13
  * mark it `canceled` here via the same `cancel` event the close cascade uses. */
14
14
  export declare function reapDescendants(rootId: string): string[];
15
- /** Injectable host/viewer seam, so the fast-tier test drives relaunchRoot's pure
15
+ /** Injectable host/viewer seam, so the ordinary source test drives relaunchRoot's pure
16
16
  * DB transitions without a real broker or tmux. Each field defaults to its
17
17
  * production verb. */
18
18
  export interface RelaunchDeps {
@@ -9,7 +9,7 @@
9
9
  // first refresh-with-open-work). Leaf/terminal workers write nothing.
10
10
  import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'node:fs';
11
11
  import { join } from 'node:path';
12
- import { contextDir } from '../canvas/index.js';
12
+ import { contextDir } from '../canvas/paths.js';
13
13
  export function roadmapPath(nodeId) {
14
14
  return join(contextDir(nodeId), 'roadmap.md');
15
15
  }
@@ -1,5 +1,6 @@
1
1
  import { type WakeOrigin } from './bearings.js';
2
2
  import { type NodeMeta, type Mode, type Lifecycle } from '../canvas/index.js';
3
+ import { type ModelRegistryLike, type ModelRequest } from '../model-routes.js';
3
4
  export interface SpawnChildOpts {
4
5
  kind: string;
5
6
  mode?: Mode;
@@ -88,6 +89,13 @@ export declare function resolveForkSource(value: string): string;
88
89
  * the same startup selector the front door uses (MRU covering `cwd`, else the
89
90
  * root-profile prompt/default). */
90
91
  export declare function resolveProfileId(explicit: string | null | undefined, spawner: string | null, cwd: string): Promise<string | null>;
92
+ /** Reject a permanently invalid launch recipe against the registry that will
93
+ * serve it. Registered-but-unauthenticated/cooling requests intentionally pass
94
+ * this authoring check so broker policy for transient availability is unchanged. */
95
+ export declare function assertLaunchModelRegistered(request: ModelRequest | undefined, options: {
96
+ cwd: string;
97
+ profileId: string | null;
98
+ }, registry?: ModelRegistryLike): Promise<void>;
91
99
  export interface SpawnChildResult {
92
100
  node: NodeMeta;
93
101
  /** The viewer window opened for a --root in tmux; null otherwise (a managed
@@ -31,6 +31,8 @@ import { piSessionsRoot } from './pi-vendored.js';
31
31
  import { headlessBrokerHost } from './host.js';
32
32
  import { ensureDaemon } from '../../daemon/manage.js';
33
33
  import { readConfig } from '../config.js';
34
+ import { modelRequestFromConfig, unregisteredConcreteModel } from '../model-routes.js';
35
+ import { openModelRegistry } from './model-registry.js';
34
36
  // ---------------------------------------------------------------------------
35
37
  // Shared broker-launch wrapper — catch launch/preflight failures at the call
36
38
  // site, mark the node crashed, then rethrow a clear error.
@@ -161,6 +163,26 @@ export async function resolveProfileId(explicit, spawner, cwd) {
161
163
  return getNode(spawner)?.profile_id ?? null;
162
164
  return selectProfileForCwd(cwd);
163
165
  }
166
+ function requestFromLaunch(launch) {
167
+ const intent = launch.modelIntent === undefined
168
+ ? undefined
169
+ : `${launch.modelIntent.family}/${launch.modelIntent.strength}`;
170
+ return modelRequestFromConfig(launch.model, intent, launch.modelExact === true);
171
+ }
172
+ /** Reject a permanently invalid launch recipe against the registry that will
173
+ * serve it. Registered-but-unauthenticated/cooling requests intentionally pass
174
+ * this authoring check so broker policy for transient availability is unchanged. */
175
+ export async function assertLaunchModelRegistered(request, options, registry) {
176
+ if (request === undefined || request.kind === 'logical')
177
+ return;
178
+ const unknown = unregisteredConcreteModel(request, registry ?? await openModelRegistry(), options);
179
+ if (unknown === undefined)
180
+ return;
181
+ throw usage(`model '${unknown.request.spec}' is not registered in this daemon.`, {
182
+ received: unknown.request.spec,
183
+ next: 'Pass a registered provider/id, provider/tier where provider is anthropic|openai and tier is ultra|strong|medium|light, a bare tier (ultra|strong|medium|light), or a family alias (opus|sonnet|haiku).',
184
+ });
185
+ }
164
186
  /** Resolve who a spawn is attributed to. A managed child needs a spine parent
165
187
  * (explicit `--parent` or the calling node's CRTR_NODE_ID). A --root spawn
166
188
  * does not: it is top-level by definition and the spawner identity is
@@ -200,8 +222,9 @@ export async function spawnChildPrepared(opts, beforeBrokerLaunch) {
200
222
  const wantsWorktree = opts.worktree === true;
201
223
  const nodeId = wantsWorktree ? (opts.nodeId ?? newNodeId()) : opts.nodeId;
202
224
  // Preflight: resolve every fallible input BEFORE creating the worktree or the
203
- // node. `--fork-from <bad>` (resolveForkSource) and an invalid `--profile`
204
- // (resolveProfileId) must fail HERE, before anything exists to clean up or
225
+ // node. `--fork-from <bad>` (resolveForkSource), an invalid `--profile`
226
+ // (resolveProfileId), and an unregistered concrete `--model` must fail HERE,
227
+ // before anything exists to clean up or
205
228
  // strand — catching them later (after the worktree/node are created) is what
206
229
  // let `--worktree --fork-from <bad>` leave an active node pinned to a deleted
207
230
  // cwd with an open managed_worktree. A caller-supplied `--node-id` joins this
@@ -215,6 +238,8 @@ export async function spawnChildPrepared(opts, beforeBrokerLaunch) {
215
238
  if (opts.nodeId !== undefined)
216
239
  preflightNodeId(opts.nodeId);
217
240
  const profileId = await resolveProfileId(opts.profile, spawner, opts.cwd);
241
+ const preflightLaunch = buildLaunchSpec(opts.kind, mode, { lifecycle, hasManager: !root, model: opts.model, cwd: opts.cwd, profileId }).launch;
242
+ await assertLaunchModelRegistered(requestFromLaunch(preflightLaunch), { cwd: opts.cwd, profileId });
218
243
  const forkFrom = opts.forkFrom !== undefined ? resolveForkSource(opts.forkFrom) : undefined;
219
244
  let managedWorktree;
220
245
  let spawnCwd = opts.cwd;
@@ -230,7 +255,12 @@ export async function spawnChildPrepared(opts, beforeBrokerLaunch) {
230
255
  // model/tools resolve against the CHILD's own profile + project stack, not
231
256
  // this process's ambient scope (a front-door shell has no CRTR_PROFILE_ID,
232
257
  // which silently hid every profile-scope kind override).
233
- const { launch } = buildLaunchSpec(opts.kind, mode, { lifecycle, hasManager: !root, model: opts.model, cwd: spawnCwd, profileId });
258
+ const launch = wantsWorktree
259
+ ? buildLaunchSpec(opts.kind, mode, { lifecycle, hasManager: !root, model: opts.model, cwd: spawnCwd, profileId }).launch
260
+ : preflightLaunch;
261
+ if (wantsWorktree) {
262
+ await assertLaunchModelRegistered(requestFromLaunch(launch), { cwd: spawnCwd, profileId });
263
+ }
234
264
  const meta = spawnNode({
235
265
  kind: opts.kind,
236
266
  mode,
@@ -319,9 +349,9 @@ export async function spawnChildPrepared(opts, beforeBrokerLaunch) {
319
349
  throw brokerLaunchFailed(`failed to launch the broker engine for ${meta.node_id} (${meta.name}) — the node was not started.`, `Inspect the broker log for the underlying cause (${jobDir(meta.node_id)}/broker.log) and verify the pi engine can start in this environment.`);
320
350
  }
321
351
  recordPid(meta.node_id, placed.pid);
322
- // Directly driven roots are not useful until their broker accepts viewers:
323
- // the web composer navigates as soon as `node new --root` returns. Only a
324
- // directly driven ROOT waits — a managed child (and every cron-launched
352
+ // A root created through `node new --root` must accept viewers before the
353
+ // command returns because its caller may attach immediately. Only that root
354
+ // waits — a managed child (and every cron-launched
325
355
  // birth) stays launch-immediate so the daemon never blocks its serialized
326
356
  // supervision loop on a birth, no matter what forwards the readiness field.
327
357
  if (attendedRoot && opts.readiness === 'await' && !await waitForBrokerViewSocket(meta.node_id, placed.exited)) {
@@ -13,6 +13,7 @@ export type StopAction = {
13
13
  reason: 'stalled';
14
14
  message: string;
15
15
  };
16
- /** Decide what to do when a node stops. Pure given the canvas + this turn's
17
- * signals — the stophook supplies the signals and enacts the action. */
18
- export declare function evaluateStop(nodeId: string, signals: StopSignals): StopAction;
16
+ /** Decide what to do when a node stops. crtrd supplies every current-canvas
17
+ * fact; the broker contributes only whether its Pi-owned background job registry
18
+ * is still running work. */
19
+ export declare function evaluateStop(nodeId: string, signals: StopSignals, backgroundJobsRunning?: boolean): StopAction;