@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,277 +1,13 @@
1
+ // Pure boundaries behind `crtr sys setup`: which pi CLI crouter launches, how a
2
+ // failed provider login is classified, and how a concrete model reference maps
3
+ // back onto a portable provider/strength selection.
1
4
  import { test } from 'node:test';
2
5
  import assert from 'node:assert/strict';
3
- import { existsSync, mkdirSync, mkdtempSync, readFileSync, writeFileSync } from 'node:fs';
4
- import { tmpdir } from 'node:os';
5
- import { join } from 'node:path';
6
+ import { existsSync } from 'node:fs';
6
7
  import { resolveBundledPiCliPath } from '../../../core/runtime/pi-cli.js';
7
- import { BINDING_CATALOG, resolveKeybindings } from '../../../core/keybindings/index.js';
8
- import { SetupKeybindingsDraft, buildSetupManifest } from '../setup-core.js';
9
- import { SetupWizard, classifyLoginFailure } from '../setup-wizard.js';
10
- import { applyTheme } from '../../../clients/attach/config.js';
11
- import { createSetupRuntime } from './helpers/setup-runtime.js';
12
- import { stripVTControlCharacters } from 'node:util';
13
- // The provider panel only touches the TUI on async OAuth transitions (never in
14
- // these keybindings-tab render/input tests) and reads auth from `agentDir`; a
15
- // no-op TUI stub and an empty temp agent dir keep the wizard headless.
16
- const stubTui = { requestRender() { } };
17
- const agentDir = mkdtempSync(join(tmpdir(), 'setup-wizard-test-'));
18
- const { runtime, registry } = await createSetupRuntime(agentDir);
19
- test('setup keybinding draft edits, disables, resets, and discards transactionally', () => {
20
- const draft = new SetupKeybindingsDraft({ 'crtr.attach.graph.toggle': ['alt+x'] });
21
- assert.equal(draft.expression('crtr.attach.graph.toggle'), 'alt+x');
22
- assert.equal(draft.dirty, false);
23
- // M-U (not M-Y): alt+shift+y is now the crtr.attach.copy.message default, so
24
- // the uppercase-normalization probe must use a gesture no catalog entry owns.
25
- assert.equal(draft.edit('crtr.attach.graph.toggle', 'M-U, ctrl+g').ok, true);
26
- assert.deepEqual(draft.overrides()['crtr.attach.graph.toggle'], ['alt+shift+u', 'ctrl+g']);
27
- assert.equal(draft.dirty, true);
28
- assert.equal(draft.unbind('crtr.attach.graph.toggle').ok, true);
29
- assert.deepEqual(draft.overrides()['crtr.attach.graph.toggle'], []);
30
- draft.resetRow('crtr.attach.graph.toggle');
31
- assert.equal(Object.hasOwn(draft.overrides(), 'crtr.attach.graph.toggle'), false);
32
- draft.edit('crtr.attach.graph.toggle', 'alt+y');
33
- draft.discard();
34
- assert.deepEqual(draft.overrides(), { 'crtr.attach.graph.toggle': ['alt+x'] });
35
- assert.equal(draft.dirty, false);
36
- });
37
- test('setup keybinding draft binds the comma key, which doubles as the gesture separator', () => {
38
- const draft = new SetupKeybindingsDraft(undefined);
39
- // A comma with nothing on one side is the comma KEY, not a separator. Bound
40
- // onto a menu selector whose default is NOT the comma (settings already
41
- // defaults to it), so the draft records a real override.
42
- assert.equal(draft.edit('crtr.tmux.menu.attach.whip', ',').ok, true);
43
- assert.deepEqual(draft.overrides()['crtr.tmux.menu.attach.whip'], [',']);
44
- // A list containing the comma key round-trips through the rendered expression.
45
- assert.equal(draft.edit('crtr.attach.graph.toggle', ', , ctrl+g').ok, true);
46
- assert.deepEqual(draft.overrides()['crtr.attach.graph.toggle'], [',', 'ctrl+g']);
47
- assert.equal(draft.expression('crtr.attach.graph.toggle'), ',, ctrl+g');
48
- assert.equal(draft.edit('crtr.attach.graph.toggle', ',, ctrl+g').ok, true);
49
- assert.deepEqual(draft.overrides()['crtr.attach.graph.toggle'], [',', 'ctrl+g']);
50
- });
51
- test('setup keybinding draft drops a member when the committed value equals the catalog default (N2 sparseness)', () => {
52
- const draft = new SetupKeybindingsDraft(undefined);
53
- const definition = BINDING_CATALOG.find((entry) => entry.id === 'crtr.attach.graph.toggle');
54
- const defaultExpression = draft.expression(definition.id);
55
- // Committing the seeded default verbatim must NOT record an override: the row
56
- // stays sparse (no member) and the draft stays clean — no spurious unsaved/dot.
57
- const result = draft.edit(definition.id, defaultExpression);
58
- assert.equal(result.ok, true);
59
- assert.equal(Object.hasOwn(draft.overrides(), definition.id), false);
60
- assert.equal(draft.dirty, false);
61
- // Editing to a real value records the member; re-committing the default drops it.
62
- assert.equal(draft.edit(definition.id, 'ctrl+g').ok, true);
63
- assert.deepEqual(draft.overrides()[definition.id], ['ctrl+g']);
64
- assert.equal(draft.dirty, true);
65
- assert.equal(draft.edit(definition.id, defaultExpression).ok, true);
66
- assert.equal(Object.hasOwn(draft.overrides(), definition.id), false);
67
- assert.equal(draft.dirty, false);
68
- });
69
- test('setup keybinding draft keeps the last valid cell value on syntax, collision, and safety errors', () => {
70
- const draft = new SetupKeybindingsDraft(undefined);
71
- const syntax = draft.edit('crtr.attach.graph.toggle', 'ctrl+not-a-key');
72
- assert.equal(syntax.ok, false);
73
- assert.deepEqual(draft.overrides(), {});
74
- const collision = draft.edit('crtr.attach.graph.toggle', 'alt+m');
75
- assert.equal(collision.ok, false);
76
- assert.match(collision.diagnostics[0].message, /crtr\.attach\.model-ladder\.next/);
77
- assert.deepEqual(draft.overrides(), {});
78
- const unsafe = draft.unbind('crtr.setup.keybindings.save');
79
- assert.equal(unsafe.ok, false);
80
- assert.match(unsafe.diagnostics[0].message, /save-keybindings/);
81
- assert.deepEqual(draft.overrides(), {});
82
- });
83
- test('setup reset-all removes invalid and unknown raw members without cataloging pi bindings', () => {
84
- const invalidRoot = new SetupKeybindingsDraft('alt+x');
85
- assert.equal(invalidRoot.resolution().diagnostics[0]?.code, 'invalid-keybindings');
86
- invalidRoot.resetAll();
87
- assert.equal(invalidRoot.dirty, true);
88
- assert.equal(invalidRoot.resolution().diagnostics.length, 0);
89
- const draft = new SetupKeybindingsDraft({
90
- 'crtr.unknown': ['x'],
91
- 'crtr.attach.graph.toggle': 'alt+x',
92
- });
93
- assert.equal(draft.resolution().diagnostics.length, 2);
94
- draft.resetAll();
95
- assert.deepEqual(draft.overrides(), {});
96
- assert.equal(draft.resolution().diagnostics.length, 0);
97
- assert.equal(BINDING_CATALOG.some((entry) => entry.id.includes('app.') || entry.id.includes('tui.')), false);
98
- });
99
- test('setup keybinding draft memoizes resolution() and only recomputes after a state change', () => {
100
- const draft = new SetupKeybindingsDraft({ 'crtr.attach.graph.toggle': ['alt+x'] });
101
- // Repeated reads of unchanged state must reuse the same resolution instance
102
- // (this is the m4 navigation path: reads never mutate the draft).
103
- const first = draft.resolution();
104
- const second = draft.resolution();
105
- assert.equal(first, second);
106
- // A state-changing operation must invalidate the cache and recompute.
107
- draft.edit('crtr.attach.graph.toggle', 'ctrl+g');
108
- const afterEdit = draft.resolution();
109
- assert.notEqual(afterEdit, first);
110
- assert.equal(draft.resolution(), afterEdit);
111
- draft.resetRow('crtr.attach.graph.toggle');
112
- const afterReset = draft.resolution();
113
- assert.notEqual(afterReset, afterEdit);
114
- draft.discard();
115
- const afterDiscard = draft.resolution();
116
- assert.notEqual(afterDiscard, afterReset);
117
- draft.resetAll();
118
- const afterResetAll = draft.resolution();
119
- assert.notEqual(afterResetAll, afterDiscard);
120
- draft.markSaved({});
121
- const afterMarkSaved = draft.resolution();
122
- assert.notEqual(afterMarkSaved, afterResetAll);
123
- });
124
- test('setup keybinding draft refuses edits while the raw root is invalid until reset-all', () => {
125
- const draft = new SetupKeybindingsDraft('alt+x');
126
- assert.equal(draft.hasInvalidRoot(), true);
127
- // An edit against an invalid root must NOT commit (the prior bug: it returned
128
- // ok:true against an empty `current` while the row kept showing the default).
129
- const rejected = draft.edit('crtr.attach.graph.toggle', 'ctrl+g');
130
- assert.equal(rejected.ok, false);
131
- assert.equal(rejected.diagnostics[0].code, 'invalid-keybindings');
132
- assert.deepEqual(draft.overrides(), {});
133
- // reset-all clears the invalid root; edits then succeed and display.
134
- draft.resetAll();
135
- assert.equal(draft.hasInvalidRoot(), false);
136
- const accepted = draft.edit('crtr.attach.graph.toggle', 'ctrl+g');
137
- assert.equal(accepted.ok, true);
138
- assert.deepEqual(draft.overrides()['crtr.attach.graph.toggle'], ['ctrl+g']);
139
- });
140
- test('setup keybindings editor stays visible while paging moves the selection (m3)', () => {
141
- applyTheme({ cwd: process.cwd() });
142
- const openingBindings = resolveKeybindings(undefined);
143
- // A short terminal forces a small scroll window so paging past the edit row
144
- // is the reproducible m3 scenario (editor was blind-typing off-screen before).
145
- const wizard = new SetupWizard(buildSetupManifest(), new Set(), [], stubTui, agentDir, runtime, registry, openingBindings, undefined, () => 14);
146
- wizard.focused = true;
147
- const render = () => stripVTControlCharacters(wizard.render(100).join('\n'));
148
- // Drive to the Keybindings tab (tab-next = Tab), open the editor on row 0 (Enter).
149
- for (let i = 0; i < 4; i += 1)
150
- wizard.handleInput('\t');
151
- assert.match(render(), /Keybindings/);
152
- wizard.handleInput('\r');
153
- // Type a distinctive marker into the live editor buffer.
154
- wizard.handleInput('zzz');
155
- assert.match(render(), /zzz/, 'editor should echo typed input before paging');
156
- // PageDown twice: selection moves off, but the editor row must remain on screen.
157
- wizard.handleInput('\x1b[6~');
158
- wizard.handleInput('\x1b[6~');
159
- assert.match(render(), /zzz/, 'editor must stay visible (and keep capturing) after paging');
160
- });
161
- test('setup keybindings q-cancel with a dirty draft routes through discard-confirm, not a silent exit (N3)', () => {
162
- applyTheme({ cwd: process.cwd() });
163
- const wizard = new SetupWizard(buildSetupManifest(), new Set(), [], stubTui, agentDir, runtime, registry, resolveKeybindings(undefined), undefined, () => 40);
164
- wizard.focused = true;
165
- let cancelled = false;
166
- wizard.onCancel = () => { cancelled = true; };
167
- const render = () => stripVTControlCharacters(wizard.render(100).join('\n'));
168
- for (let i = 0; i < 4; i += 1)
169
- wizard.handleInput('\t');
170
- // Make the draft dirty: unbind the selected row (delete key) so it has a real
171
- // pending override.
172
- wizard.handleInput('\x1b[3~');
173
- assert.match(render(), /unsaved/, 'draft should be dirty after unbind');
174
- // q (crtr.setup.cancel) in list mode must NOT drop the edits: it opens the same
175
- // discard-confirm the Escape path uses.
176
- wizard.handleInput('q');
177
- assert.equal(cancelled, false, 'dirty draft must not silently exit on q');
178
- assert.match(render(), /Discard every unsaved keybinding change\?/);
179
- // A clean draft still exits on q (cancel elsewhere is unchanged).
180
- const clean = new SetupWizard(buildSetupManifest(), new Set(), [], stubTui, agentDir, runtime, registry, resolveKeybindings(undefined), undefined, () => 40);
181
- let cleanCancelled = false;
182
- clean.onCancel = () => { cleanCancelled = true; };
183
- clean.focused = true;
184
- for (let i = 0; i < 4; i += 1)
185
- clean.handleInput('\t');
186
- clean.handleInput('q');
187
- assert.equal(cleanCancelled, true, 'clean draft still exits on q');
188
- });
189
- test('setup keybindings selection always renders across group boundaries in a short window (m4 residual)', () => {
190
- applyTheme({ cwd: process.cwd() });
191
- // Small viewport so a window spans several group headings + a diagnostic line —
192
- // the fixed-reserve page math used to let the selected row fail to render here.
193
- const wizard = new SetupWizard(buildSetupManifest(), new Set(), [], stubTui, agentDir, runtime, registry, resolveKeybindings(undefined), undefined, () => 13);
194
- wizard.focused = true;
195
- const render = () => stripVTControlCharacters(wizard.render(100).join('\n'));
196
- for (let i = 0; i < 4; i += 1)
197
- wizard.handleInput('\t');
198
- // Render only at the first/final rows and around each group transition. Every
199
- // intermediate row still goes through production navigation, but does not pay
200
- // for a redundant full viewport render.
201
- const groupStarts = BINDING_CATALOG.flatMap((entry, index) => (index === 0 || entry.group !== BINDING_CATALOG[index - 1]?.group ? [index] : []));
202
- const samples = [...new Set([
203
- 0,
204
- BINDING_CATALOG.length - 1,
205
- ...groupStarts.flatMap((start) => [start - 1, start, start + 1]),
206
- ].filter((index) => index >= 0 && index < BINDING_CATALOG.length))].sort((a, b) => a - b);
207
- let current = 0;
208
- for (const sample of samples) {
209
- while (current < sample) {
210
- wizard.handleInput('j');
211
- current += 1;
212
- }
213
- assert.match(render(), /\u25b6/, `selection marker must render at sample ${sample}`);
214
- }
215
- });
216
- test('setup Broker limits tab persists positive user-scope thresholds and rejects invalid values', () => {
217
- applyTheme({ cwd: process.cwd() });
218
- const home = mkdtempSync(join(tmpdir(), 'setup-broker-limits-home-'));
219
- const previousHome = process.env.HOME;
220
- process.env.HOME = home;
221
- try {
222
- // Setup must show the same fallback the daemon receives: an inverted pair
223
- // is invalid as a whole even though each individual number is positive.
224
- mkdirSync(join(home, '.crouter'), { recursive: true });
225
- writeFileSync(join(home, '.crouter', 'config.json'), JSON.stringify({
226
- brokerThresholds: { warning: 300, automaticReviveCap: 200 },
227
- }));
228
- const wizard = new SetupWizard(buildSetupManifest(), new Set(), [], stubTui, agentDir, runtime, registry, resolveKeybindings(undefined), undefined, () => 40);
229
- wizard.focused = true;
230
- const render = () => stripVTControlCharacters(wizard.render(200).join('\n'));
231
- const overridePrecedence = 'Valid CRTR_WARN_LIVE_BROKERS and CRTR_MAX_LIVE_BROKERS environment overrides take precedence over their corresponding configured limits.';
232
- // Walk to the Broker limits tab by content rather than a fixed press count:
233
- // the tab strip itself always contains the label, so the loop keys off the
234
- // tab body and stays correct however many tabs precede it.
235
- for (let i = 0; i < 20 && !render().includes('Warning threshold'); i += 1)
236
- wizard.handleInput('\t');
237
- assert.match(render(), /Warning threshold/);
238
- assert.match(render(), /defaults 128 \/ 256/);
239
- assert.match(render(), /> 128/);
240
- assert.match(render(), /> 256/);
241
- assert.ok(render().includes(`Configured limits apply next tick. ${overridePrecedence}`));
242
- // Seeded values behave like the other setup editors: a new digit appends
243
- // rather than prepending before the displayed default.
244
- wizard.handleInput('9');
245
- assert.match(render(), /1289/);
246
- const remapped = new SetupWizard(buildSetupManifest(), new Set(), [], stubTui, agentDir, runtime, registry, resolveKeybindings({ 'crtr.setup.tab-next': ['1'] }), undefined, () => 40);
247
- remapped.focused = true;
248
- remapped.setTab(6);
249
- remapped.handleInput('1');
250
- assert.match(stripVTControlCharacters(remapped.render(120).join('\n')), /1281/, 'a digit must not trigger a remapped tab binding');
251
- const inputs = wizard;
252
- inputs.brokerWarningInput.setValue('192');
253
- inputs.brokerHardCapInput.setValue('384');
254
- wizard.handleInput('\r');
255
- assert.deepEqual(JSON.parse(readFileSync(join(home, '.crouter', 'config.json'), 'utf8')).brokerThresholds, {
256
- warning: 192,
257
- automaticReviveCap: 384,
258
- });
259
- assert.ok(render().includes(`Saved to user config. Applies next tick. ${overridePrecedence}`));
260
- inputs.brokerWarningInput.setValue('0');
261
- wizard.handleInput('\r');
262
- assert.match(render(), /Both broker limits must be positive integers/);
263
- assert.deepEqual(JSON.parse(readFileSync(join(home, '.crouter', 'config.json'), 'utf8')).brokerThresholds, {
264
- warning: 192,
265
- automaticReviveCap: 384,
266
- });
267
- }
268
- finally {
269
- if (previousHome === undefined)
270
- delete process.env.HOME;
271
- else
272
- process.env.HOME = previousHome;
273
- }
274
- });
8
+ import { inferPortableModelSelection } from '../../../core/runtime/launch.js';
9
+ import { defaultModelLaddersConfig } from '../../../types.js';
10
+ import { classifyLoginFailure } from '../panels/provider-panel.js';
275
11
  test('resolveBundledPiCliPath uses crouter bundled pi instead of a standalone pi on PATH', () => {
276
12
  const prevPath = process.env.PATH;
277
13
  process.env.PATH = '';
@@ -293,3 +29,14 @@ test('classifyLoginFailure treats an abort as authoritative', () => {
293
29
  assert.equal(classifyLoginFailure(new Error('network exploded'), false), 'Login error: network exploded');
294
30
  assert.equal(classifyLoginFailure('not an Error object', false), 'Login error: not an Error object');
295
31
  });
32
+ test('portable kind selection preserves provider across tokens and concrete ladder refs', () => {
33
+ const ladders = defaultModelLaddersConfig();
34
+ ladders.defaultProvider = 'openai';
35
+ ladders.openai.strong = 'openai-codex/gpt-shared:high';
36
+ assert.deepEqual(inferPortableModelSelection('anthropic/strong', ladders), { provider: 'anthropic', strength: 'strong' });
37
+ assert.deepEqual(inferPortableModelSelection('strong', ladders), { provider: 'openai', strength: 'strong' });
38
+ assert.deepEqual(inferPortableModelSelection('openai-codex/gpt-shared:high', ladders), { provider: 'openai', strength: 'strong' });
39
+ assert.deepEqual(inferPortableModelSelection('openai-codex/gpt-shared:medium', ladders), { provider: 'openai', strength: 'strong' });
40
+ assert.deepEqual(inferPortableModelSelection('openai-codex/off-ladder:high', ladders), { provider: 'openai', strength: 'ultra' });
41
+ assert.deepEqual(inferPortableModelSelection('unknown-provider/off-ladder', ladders), { provider: 'openai', strength: 'ultra' });
42
+ });
@@ -105,7 +105,7 @@ function setNestedValue(cfg, key, rawValue, value) {
105
105
  return;
106
106
  }
107
107
  if (topKey === 'keybindings') {
108
- throw usage('keybindings are edited only through `crtr sys setup`');
108
+ throw usage('keybindings are edited only through `crtr sys settings`');
109
109
  }
110
110
  if (topKey === 'modelLadders') {
111
111
  throw usage('modelLadders keys are written through persistModelLadders, not this path');
@@ -142,12 +142,12 @@ function setNestedValue(cfg, key, rawValue, value) {
142
142
  const configGet = defineLeaf({
143
143
  name: 'get',
144
144
  description: 'read a config value by key',
145
- whenToUse: 'you want to inspect one config value — including the whole user keybindings object — optionally from a specific scope. Use sys setup to edit keybindings and sys config set for supported scalar settings.',
145
+ whenToUse: 'you want to inspect one config value — including the whole user keybindings object — optionally from a specific scope. Use sys settings to edit keybindings and sys config set for supported scalar settings.',
146
146
  help: {
147
147
  name: 'sys config get',
148
148
  summary: 'read a config value by dotted key',
149
149
  params: [
150
- { kind: 'positional', name: 'key', type: 'string', required: true, constraint: `Dotted key path. Top-level keys: ${CONFIG_TOP_LEVEL_HELP}. brokerThresholds is user-only; keybindings is readable only as the whole user-scope object and editable only through sys setup.` },
150
+ { kind: 'positional', name: 'key', type: 'string', required: true, constraint: `Dotted key path. Top-level keys: ${CONFIG_TOP_LEVEL_HELP}. brokerThresholds is user-only; keybindings is readable only as the whole user-scope object and editable only through sys settings.` },
151
151
  { kind: 'flag', name: 'scope', type: 'enum', choices: ['user', 'project'], required: false, constraint: 'Scope to read from. Default: user.' },
152
152
  ],
153
153
  output: [
@@ -176,12 +176,12 @@ const configGet = defineLeaf({
176
176
  const configSet = defineLeaf({
177
177
  name: 'set',
178
178
  description: 'write a config value by key',
179
- whenToUse: 'you want to change a supported crtr setting in user or project scope. Use sys setup instead for keybindings, and sys config get to inspect values.',
179
+ whenToUse: 'you want to change a supported crtr setting in user or project scope. Use sys settings instead for keybindings, and sys config get to inspect values.',
180
180
  help: {
181
181
  name: 'sys config set',
182
182
  summary: 'write a config value by dotted key',
183
183
  params: [
184
- { kind: 'positional', name: 'key', type: 'string', required: true, constraint: `Dotted key path. User-scope scalar settings: ${SCALAR_SETTING_HELP}. Also supported: working_gerunds and whip_messages (non-empty JSON string arrays), brokerThresholds.warning and brokerThresholds.automaticReviveCap (user scope; integer >= 1), modelLadders.defaultProvider, and modelLadders.<anthropic|openai>.<ultra|strong|medium|light>. Keybindings are edited only through sys setup.` },
184
+ { kind: 'positional', name: 'key', type: 'string', required: true, constraint: `Dotted key path. User-scope scalar settings: ${SCALAR_SETTING_HELP}. Also supported: working_gerunds and whip_messages (non-empty JSON string arrays), brokerThresholds.warning and brokerThresholds.automaticReviveCap (user scope; integer >= 1), modelLadders.defaultProvider, and modelLadders.<anthropic|openai>.<ultra|strong|medium|light>. Keybindings are edited only through sys settings.` },
185
185
  { kind: 'flag', name: 'value', type: 'string', required: true, constraint: 'value VALUE — string, required. working_gerunds and whip_messages accept JSON arrays; other values are stored as-is if quoted and coerced to number or boolean when unambiguous.' },
186
186
  { kind: 'flag', name: 'scope', type: 'enum', choices: ['user', 'project'], required: false, constraint: 'Scope to write to. Default: user. Project scope is supported only for modelLadders.' },
187
187
  ],
@@ -258,7 +258,7 @@ const configPath = defineLeaf({
258
258
  export const configBranch = defineBranch({
259
259
  name: 'config',
260
260
  description: 'read and write configuration',
261
- whenToUse: 'inspecting crtr settings, changing supported scalar values, or locating config.json. Keybinding changes belong in sys setup.',
261
+ whenToUse: 'inspecting crtr settings, changing supported scalar values, or locating config.json. Keybinding changes belong in sys settings.',
262
262
  help: {
263
263
  name: 'sys config',
264
264
  summary: 'read and write crtr configuration, including model ladders',
@@ -76,7 +76,7 @@ export const sysLogsLeaf = defineLeaf({
76
76
  summary: 'show the latest 200 matching local event and raw-residue records, oldest first',
77
77
  params: [
78
78
  { kind: 'flag', name: 'node', type: 'string', required: false, constraint: 'Safe node ID; the node need not still be active.' },
79
- { kind: 'flag', name: 'component', type: 'enum', choices: ['daemon', 'broker', 'web'], required: false, constraint: 'Owning runtime component.' },
79
+ { kind: 'flag', name: 'component', type: 'enum', choices: ['daemon', 'broker'], required: false, constraint: 'Owning runtime component.' },
80
80
  { kind: 'flag', name: 'operation', type: 'string', required: false, constraint: 'Exact 32-character lowercase non-zero hexadecimal operation ID.' },
81
81
  { kind: 'flag', name: 'since', type: 'string', required: false, constraint: 'Inclusive ISO 8601 lower bound with a timezone.' },
82
82
  { kind: 'flag', name: 'until', type: 'string', required: false, constraint: 'Inclusive ISO 8601 upper bound with a timezone; cannot precede --since.' },
@@ -0,0 +1,17 @@
1
+ import { Input } from "@earendil-works/pi-tui";
2
+ import { type SetupPanel } from "./panel.js";
3
+ export declare class BrokerLimitsPanel implements SetupPanel {
4
+ private readonly onChange;
5
+ readonly warningInput: Input;
6
+ readonly hardCapInput: Input;
7
+ private index;
8
+ private notice;
9
+ private _focused;
10
+ constructor(onChange: () => void);
11
+ set focused(value: boolean);
12
+ private selected;
13
+ private move;
14
+ private save;
15
+ handleInput(data: string, matches?: (id: string, input: string) => boolean): boolean;
16
+ render(width: number): string[];
17
+ }
@@ -0,0 +1,104 @@
1
+ import { Input, truncateToWidth } from "@earendil-works/pi-tui";
2
+ import { readConfig, updateRawConfigAtomically } from "../../../core/config.js";
3
+ import { BROKER_LIMIT_OVERRIDE_PRECEDENCE } from "../setup.js";
4
+ import { padAnsi, theme, wrapText } from "./panel.js";
5
+ function positive(value) {
6
+ return /^\d+$/.test(value) &&
7
+ Number.isSafeInteger(Number(value)) &&
8
+ Number(value) >= 1
9
+ ? Number(value)
10
+ : undefined;
11
+ }
12
+ export class BrokerLimitsPanel {
13
+ onChange;
14
+ warningInput = new Input();
15
+ hardCapInput = new Input();
16
+ index = 0;
17
+ notice;
18
+ _focused = false;
19
+ constructor(onChange) {
20
+ this.onChange = onChange;
21
+ const thresholds = readConfig("user").brokerThresholds;
22
+ this.warningInput.setValue(String(thresholds.warning));
23
+ this.warningInput.handleInput("\x05");
24
+ this.hardCapInput.setValue(String(thresholds.automaticReviveCap));
25
+ this.hardCapInput.handleInput("\x05");
26
+ this.warningInput.onSubmit = () => this.save();
27
+ this.hardCapInput.onSubmit = () => this.save();
28
+ }
29
+ set focused(value) {
30
+ this._focused = value;
31
+ this.warningInput.focused = value && this.index === 0;
32
+ this.hardCapInput.focused = value && this.index === 1;
33
+ }
34
+ selected() {
35
+ return this.index === 0 ? this.warningInput : this.hardCapInput;
36
+ }
37
+ move(delta) {
38
+ this.index = ((this.index + delta + 2) % 2);
39
+ this.focused = this._focused;
40
+ this.notice = undefined;
41
+ }
42
+ save() {
43
+ const warning = positive(this.warningInput.getValue());
44
+ const cap = positive(this.hardCapInput.getValue());
45
+ if (warning === undefined || cap === undefined)
46
+ this.notice = "Both broker limits must be positive integers.";
47
+ else if (warning > cap)
48
+ this.notice =
49
+ "Warning threshold cannot exceed the automatic-revive hard cap.";
50
+ else {
51
+ updateRawConfigAtomically("user", (latest) => ({
52
+ ...latest,
53
+ brokerThresholds: { warning, automaticReviveCap: cap },
54
+ }));
55
+ this.notice = `Saved to user config. Applies next tick. ${BROKER_LIMIT_OVERRIDE_PRECEDENCE}`;
56
+ }
57
+ this.onChange();
58
+ }
59
+ handleInput(data, matches) {
60
+ if (/^\d+$/.test(data)) {
61
+ this.selected().handleInput(data);
62
+ this.notice = undefined;
63
+ this.onChange();
64
+ return true;
65
+ }
66
+ if (!matches)
67
+ return false;
68
+ if (matches("crtr.setup.list-down", data))
69
+ this.move(1);
70
+ else if (matches("crtr.setup.list-up", data))
71
+ this.move(-1);
72
+ else if (data.length > 0 &&
73
+ [...data].every((char) => char.codePointAt(0) >= 32))
74
+ this.notice = "Broker limits accept digits only.";
75
+ else {
76
+ this.selected().handleInput(data);
77
+ if (data !== "\r" && data !== "\n")
78
+ this.notice = undefined;
79
+ }
80
+ this.onChange();
81
+ return true;
82
+ }
83
+ render(width) {
84
+ const out = [
85
+ truncateToWidth(`${theme.fg("accent", theme.bold("Broker limits"))}${theme.fg("dim", " user scope · defaults 128 / 256")}`, width),
86
+ truncateToWidth(theme.fg("dim", "These bounds govern daemon automatic revive; explicit node revives remain available."), width),
87
+ "",
88
+ ];
89
+ const line = (index, label, description, input) => {
90
+ const selected = index === this.index;
91
+ out.push(truncateToWidth(`${selected ? theme.fg("accent", "▶") : " "} ${padAnsi(selected ? theme.fg("accent", label) : label, 24)} ${input.render(Math.max(8, width - 28))[0] ?? ""}`, width));
92
+ out.push(truncateToWidth(theme.fg("dim", ` ${description}`), width));
93
+ };
94
+ line(0, "Warning threshold", "Warn when live brokers reach this count. Default: 128.", this.warningInput);
95
+ line(1, "Automatic-revive hard cap", "Defer automatic revives at this count. Default: 256.", this.hardCapInput);
96
+ out.push("");
97
+ for (const text of wrapText(`Configured limits apply next tick. ${BROKER_LIMIT_OVERRIDE_PRECEDENCE}`, width))
98
+ out.push(theme.fg("dim", text));
99
+ if (this.notice)
100
+ for (const text of wrapText(this.notice, width))
101
+ out.push(theme.fg(this.notice.startsWith("Saved") ? "success" : "warning", text));
102
+ return out;
103
+ }
104
+ }
@@ -0,0 +1,14 @@
1
+ import type { SetupSystemInstallPlan } from "../setup-core.js";
2
+ import { type SetupPanel } from "./panel.js";
3
+ export declare class DependenciesPanel implements SetupPanel {
4
+ private readonly plans;
5
+ private readonly onChange;
6
+ private readonly selectedTools;
7
+ private index;
8
+ constructor(plans: SetupSystemInstallPlan[], onChange: () => void);
9
+ badge(): string;
10
+ get selected(): readonly SetupSystemInstallPlan[];
11
+ private current;
12
+ handleInput(data: string, matches?: (id: string, input: string) => boolean): boolean;
13
+ render(width: number): string[];
14
+ }
@@ -0,0 +1,80 @@
1
+ import { truncateToWidth } from "@earendil-works/pi-tui";
2
+ import { theme } from "./panel.js";
3
+ function toolLabel(tool) {
4
+ return tool === "nvim" ? "nvim" : tool === "nerd-font" ? "Nerd Font" : "tmux";
5
+ }
6
+ export class DependenciesPanel {
7
+ plans;
8
+ onChange;
9
+ selectedTools = new Set();
10
+ index = 0;
11
+ constructor(plans, onChange) {
12
+ this.plans = plans;
13
+ this.onChange = onChange;
14
+ for (const plan of plans)
15
+ if (!plan.installed && plan.autoInstall)
16
+ this.selectedTools.add(plan.tool);
17
+ const firstMissing = plans.findIndex((plan) => !plan.installed);
18
+ this.index = firstMissing >= 0 ? firstMissing : 0;
19
+ }
20
+ badge() {
21
+ const missing = this.plans.filter((plan) => !plan.installed).length;
22
+ return missing === 0 ? "\u2713" : `${missing} missing`;
23
+ }
24
+ get selected() {
25
+ return this.plans.filter((tool) => !tool.installed && this.selectedTools.has(tool.tool));
26
+ }
27
+ current() {
28
+ return this.plans[this.index];
29
+ }
30
+ handleInput(data, matches) {
31
+ if (!matches)
32
+ return false;
33
+ if (matches("crtr.setup.list-down", data) ||
34
+ matches("crtr.setup.list-up", data)) {
35
+ const entries = this.plans
36
+ .map((tool, index) => ({ tool, index }))
37
+ .filter(({ tool }) => !tool.installed);
38
+ if (entries.length === 0)
39
+ return true;
40
+ const current = entries.findIndex(({ index }) => index === this.index);
41
+ const delta = matches("crtr.setup.list-down", data) ? 1 : -1;
42
+ this.index =
43
+ entries[((current >= 0 ? current : 0) + delta + entries.length) %
44
+ entries.length].index;
45
+ }
46
+ else if (matches("crtr.setup.toggle", data)) {
47
+ const tool = this.current();
48
+ if (tool && !tool.installed)
49
+ this.selectedTools.has(tool.tool)
50
+ ? this.selectedTools.delete(tool.tool)
51
+ : this.selectedTools.add(tool.tool);
52
+ }
53
+ else
54
+ return false;
55
+ this.onChange();
56
+ return true;
57
+ }
58
+ render(width) {
59
+ const out = [
60
+ truncateToWidth(`${theme.fg("accent", theme.bold("System deps"))}${theme.fg("dim", " tmux + nvim + Nerd Font check")}`, width),
61
+ ];
62
+ for (const [index, tool] of this.plans.entries()) {
63
+ const selected = index === this.index;
64
+ const marker = selected ? theme.fg("accent", "▶") : theme.fg("dim", " ");
65
+ if (tool.installed) {
66
+ out.push(truncateToWidth(`${marker} ${theme.fg("success", "✓ installed")} ${theme.fg("muted", toolLabel(tool.tool))}`, width));
67
+ continue;
68
+ }
69
+ const checked = this.selectedTools.has(tool.tool)
70
+ ? theme.fg("success", "[x]")
71
+ : theme.fg("dim", "[ ]");
72
+ const label = tool.command ?? tool.hint;
73
+ const name = selected
74
+ ? theme.fg("accent", `Install ${toolLabel(tool.tool)}`)
75
+ : `Install ${toolLabel(tool.tool)}`;
76
+ out.push(truncateToWidth(`${marker} ${checked} ${name} ${theme.fg("dim", "—")} ${theme.fg("muted", label)} ${theme.fg("warning", "not installed")}`, width));
77
+ }
78
+ return out;
79
+ }
80
+ }
@@ -0,0 +1,56 @@
1
+ import { type BindingId, type BindingResolution } from "../../../core/keybindings/index.js";
2
+ export declare class KeybindingsPanel {
3
+ private readonly openingBindings;
4
+ private readonly terminalRows;
5
+ private readonly onChange;
6
+ private readonly keyInput;
7
+ private readonly keyDraft;
8
+ private keyIndex;
9
+ private keyFieldIndex;
10
+ private keyScroll;
11
+ private keyFilter;
12
+ private filteringKeys;
13
+ private editingKey;
14
+ private keyEditError;
15
+ private keyDiagnostics;
16
+ private keyConfirm;
17
+ private keyNotice;
18
+ private keyTmuxOccupancy;
19
+ private _focused;
20
+ constructor(openingBindings: BindingResolution<BindingId>, rawKeybindings: unknown, rawTmuxPassthrough: unknown, terminalRows: () => number, onChange: () => void);
21
+ set focused(value: boolean);
22
+ get focused(): boolean;
23
+ get dirty(): boolean;
24
+ badge(): string;
25
+ get takesPriorityInput(): boolean;
26
+ requestDiscard(): void;
27
+ private invalidate;
28
+ private matches;
29
+ private label;
30
+ private filteredKeybindings;
31
+ private selectedKeyRow;
32
+ private selectedKeybinding;
33
+ private tmuxPassthroughOffer;
34
+ private toggleTmuxPassthrough;
35
+ private moveKey;
36
+ private moveKeyField;
37
+ private keyViewportLines;
38
+ private keyPageSize;
39
+ private beginKeyEdit;
40
+ private commitKeyEdit;
41
+ private cancelKeyEdit;
42
+ private saveKeybindings;
43
+ private refreshTmuxBindingsAfterSave;
44
+ private confirmKeyAction;
45
+ private handleKeybindingsInput;
46
+ private keyRowMessage;
47
+ /** Number of lines needed to keep the active paired field legible. A narrow
48
+ * row stacks the action and field instead of sacrificing the action name,
49
+ * selected-field identity, or value to fixed columns. */
50
+ private keyRowBodyLineCount;
51
+ private keyLineCost;
52
+ private renderKeybindings;
53
+ handleInput(data: string): boolean;
54
+ render(width: number, _height?: number): string[];
55
+ footerHint(): string;
56
+ }