@north-light/crouter 0.3.173 → 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} +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/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
@@ -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;