@north-light/crouter 0.3.173 → 0.3.175

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (674) hide show
  1. package/bin/runtime-selector.mjs +8 -1
  2. package/dist/api/__tests__/{client.test.js → serial/client.test.js} +2 -135
  3. package/dist/api/client.d.ts +12 -21
  4. package/dist/api/client.js +22 -31
  5. package/dist/api/dto/broker-ops.d.ts +158 -0
  6. package/dist/api/dto/broker-ops.js +6 -0
  7. package/dist/api/dto/crons.d.ts +6 -0
  8. package/dist/api/dto/human.d.ts +7 -1
  9. package/dist/api/dto/inbox.d.ts +1 -71
  10. package/dist/api/dto/inbox.js +1 -9
  11. package/dist/api/dto/nodes.d.ts +6 -7
  12. package/dist/api/dto/reviews.d.ts +1 -11
  13. package/dist/api/routes.d.ts +7 -4
  14. package/dist/api/routes.js +8 -5
  15. package/dist/build-root.js +3 -3
  16. package/dist/builtin-memory/04-base-worker.md +1 -4
  17. package/dist/builtin-memory/05-kinds/advisor/00-base.md +1 -5
  18. package/dist/builtin-memory/05-kinds/advisor/01-orchestrator.md +2 -7
  19. package/dist/builtin-memory/05-kinds/design/00-base.md +1 -6
  20. package/dist/builtin-memory/05-kinds/developer/00-base.md +1 -6
  21. package/dist/builtin-memory/05-kinds/explore/00-base.md +1 -4
  22. package/dist/builtin-memory/05-kinds/explore/01-orchestrator.md +1 -2
  23. package/dist/builtin-memory/05-kinds/general/00-base.md +1 -3
  24. package/dist/builtin-memory/05-kinds/plan/00-base.md +1 -6
  25. package/dist/builtin-memory/05-kinds/plan/reviewers/00-base.md +1 -2
  26. package/dist/builtin-memory/05-kinds/plan/reviewers/architecture-fit.md +1 -3
  27. package/dist/builtin-memory/05-kinds/plan/reviewers/code-smells.md +1 -3
  28. package/dist/builtin-memory/05-kinds/plan/reviewers/pattern-consistency.md +1 -3
  29. package/dist/builtin-memory/05-kinds/plan/reviewers/requirements-coverage.md +1 -3
  30. package/dist/builtin-memory/05-kinds/plan/reviewers/security.md +1 -4
  31. package/dist/builtin-memory/05-kinds/review/companion/00-base.md +2 -3
  32. package/dist/builtin-memory/05-kinds/spec/00-base.md +1 -2
  33. package/dist/builtin-memory/advisor/council.md +1 -6
  34. package/dist/builtin-memory/design.md +2 -7
  35. package/dist/builtin-memory/development.md +9 -14
  36. package/dist/builtin-memory/internal/marketplaces.md +2 -6
  37. package/dist/builtin-memory/internal/nodes-and-canvas.md +1 -1
  38. package/dist/builtin-memory/internal/plugins.md +2 -8
  39. package/dist/builtin-memory/internal/storage-tiers.md +1 -2
  40. package/dist/builtin-memory/testing.md +41 -0
  41. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/__tests__/{provider-rotation.test.ts → serial/provider-rotation.test.ts} +27 -179
  42. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/claude-plugin-commands.ts +5 -15
  43. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/frontmatter-rules/index.ts +1 -28
  44. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/memory-slash-commands.ts +43 -88
  45. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/provider-rotation.js +7 -1
  46. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/provider-rotation.ts +9 -1
  47. package/dist/cli.js +2 -2
  48. package/dist/clients/attach/__tests__/attach-remote-readonly.test.js +37 -131
  49. package/dist/clients/attach/__tests__/chat-view-snapshot-ordering.test.js +71 -152
  50. package/dist/clients/attach/__tests__/context-message.test.js +16 -174
  51. package/dist/clients/attach/__tests__/crtr-output.test.js +36 -2069
  52. package/dist/clients/attach/__tests__/diagram.test.js +2 -2
  53. package/dist/clients/attach/__tests__/edit-diff.test.js +0 -4
  54. package/dist/clients/attach/__tests__/file-review-focus.test.js +2 -1
  55. package/dist/clients/attach/__tests__/group-activity.test.js +40 -229
  56. package/dist/clients/attach/__tests__/oauth-dialog-lifecycle.test.js +26 -76
  57. package/dist/clients/attach/__tests__/prompt-preview.test.js +4 -70
  58. package/dist/clients/attach/__tests__/ref-autocomplete.test.js +11 -125
  59. package/dist/clients/attach/__tests__/titled-editor-preview.test.js +14 -205
  60. package/dist/clients/attach/command.d.ts +2 -1
  61. package/dist/clients/attach/command.js +81 -76
  62. package/dist/clients/attach/input/capabilities.d.ts +27 -0
  63. package/dist/clients/attach/input/capabilities.js +96 -0
  64. package/dist/clients/attach/input/controller.d.ts +20 -182
  65. package/dist/clients/attach/input/controller.js +128 -537
  66. package/dist/clients/attach/input/overlay-owner.d.ts +41 -0
  67. package/dist/clients/attach/input/overlay-owner.js +199 -0
  68. package/dist/clients/attach/overlays/file-review.d.ts +0 -4
  69. package/dist/clients/attach/overlays/file-review.js +13 -5
  70. package/dist/clients/attach/overlays/graph.js +2 -10
  71. package/dist/clients/attach/render/chat-view.d.ts +4 -3
  72. package/dist/clients/attach/render/chat-view.js +39 -33
  73. package/dist/clients/attach/render/group-activity.d.ts +1 -0
  74. package/dist/clients/attach/render/group-activity.js +20 -13
  75. package/dist/clients/attach/render/group-recap.js +12 -3
  76. package/dist/clients/attach/session/connection.js +9 -15
  77. package/dist/clients/attach/session/editor-inventory.d.ts +6 -5
  78. package/dist/clients/attach/session/editor-inventory.js +7 -8
  79. package/dist/clients/attach/session/file-links.d.ts +13 -0
  80. package/dist/clients/attach/session/file-links.js +107 -0
  81. package/dist/clients/attach/session/frame.d.ts +3 -0
  82. package/dist/clients/attach/session/frame.js +10 -1
  83. package/dist/clients/attach/session/frames.js +2 -3
  84. package/dist/clients/attach/session/input-wiring.d.ts +4 -1
  85. package/dist/clients/attach/session/input-wiring.js +15 -14
  86. package/dist/clients/attach/session/mouse.d.ts +6 -1
  87. package/dist/clients/attach/session/mouse.js +8 -5
  88. package/dist/clients/attach/session/profile-files.js +18 -12
  89. package/dist/clients/attach/session/reconnect.js +1 -1
  90. package/dist/clients/attach/session/state-sync.js +1 -2
  91. package/dist/clients/attach/session/surface-host.d.ts +3 -2
  92. package/dist/clients/attach/session/surface-host.js +4 -4
  93. package/dist/clients/attach/slash/dispatch.d.ts +8 -31
  94. package/dist/clients/attach/slash/dispatch.js +34 -81
  95. package/dist/clients/attach/viewer.js +820 -860
  96. package/dist/clients/conversation/projection.d.ts +79 -0
  97. package/dist/clients/conversation/projection.js +341 -0
  98. package/dist/clients/inbox/__tests__/serial/inbox-controller.test.js +159 -0
  99. package/dist/clients/inbox/__tests__/serial/mount-panel.test.js +151 -0
  100. package/dist/clients/inbox/controller.d.ts +0 -4
  101. package/dist/clients/inbox/controller.js +0 -2
  102. package/dist/clients/inbox/review/__tests__/review-core.test.js +4 -293
  103. package/dist/clients/inbox/review/__tests__/teardown-notice.test.js +100 -0
  104. package/dist/clients/inbox/review/comments-client.d.ts +3 -2
  105. package/dist/clients/inbox/review/comments-client.js +12 -12
  106. package/dist/clients/inbox/review/companion-pane.d.ts +30 -0
  107. package/dist/clients/inbox/review/companion-pane.js +86 -0
  108. package/dist/clients/inbox/review/document-surface.d.ts +182 -0
  109. package/dist/clients/inbox/review/{document-region.js → document-surface.js} +252 -48
  110. package/dist/clients/inbox/review/frame.js +5 -4
  111. package/dist/clients/inbox/review/launch.d.ts +8 -8
  112. package/dist/clients/inbox/review/launch.js +52 -92
  113. package/dist/clients/inbox/review/nvim.d.ts +2 -0
  114. package/dist/clients/inbox/review/nvim.js +14 -12
  115. package/dist/clients/inbox/review/review-client.d.ts +12 -8
  116. package/dist/clients/inbox/review/review-client.js +46 -35
  117. package/dist/clients/inbox/review-adapter.d.ts +3 -10
  118. package/dist/clients/inbox/review-adapter.js +27 -19
  119. package/dist/clients/inbox/surface.d.ts +0 -4
  120. package/dist/clients/inbox/surface.js +0 -2
  121. package/dist/clients/surfaces/host.d.ts +11 -3
  122. package/dist/commands/__tests__/api-client-cold-start-diagnostic.test.js +7 -34
  123. package/dist/commands/__tests__/human.test.js +11 -322
  124. package/dist/commands/api-client.d.ts +5 -5
  125. package/dist/commands/api-client.js +6 -85
  126. package/dist/commands/canvas-browse.js +3 -29
  127. package/dist/commands/canvas-config.js +1 -1
  128. package/dist/commands/canvas-use.js +3 -3
  129. package/dist/commands/canvas.js +1 -1
  130. package/dist/commands/cron.js +5 -1
  131. package/dist/commands/human/queue.d.ts +0 -4
  132. package/dist/commands/human/queue.js +7 -40
  133. package/dist/commands/memory/list.d.ts +14 -0
  134. package/dist/commands/memory/list.js +35 -31
  135. package/dist/commands/memory/read.d.ts +7 -0
  136. package/dist/commands/memory/read.js +14 -8
  137. package/dist/commands/memory/write.js +13 -12
  138. package/dist/commands/node/bash.d.ts +1 -0
  139. package/dist/commands/node/bash.js +198 -0
  140. package/dist/commands/node/create.d.ts +23 -0
  141. package/dist/commands/node/create.js +207 -0
  142. package/dist/commands/node/inspect.d.ts +2 -0
  143. package/dist/commands/node/inspect.js +302 -0
  144. package/dist/commands/node/lifecycle.d.ts +4 -0
  145. package/dist/commands/node/lifecycle.js +415 -0
  146. package/dist/commands/node/message.d.ts +1 -0
  147. package/dist/commands/node/message.js +164 -0
  148. package/dist/commands/node/pyramid.d.ts +2 -0
  149. package/dist/commands/node/pyramid.js +79 -0
  150. package/dist/commands/node/subscription.d.ts +1 -0
  151. package/dist/commands/node/subscription.js +82 -0
  152. package/dist/commands/node/wait.d.ts +1 -0
  153. package/dist/commands/node/wait.js +159 -0
  154. package/dist/commands/node-lifecycle-revive.js +10 -57
  155. package/dist/commands/node.d.ts +0 -42
  156. package/dist/commands/node.js +11 -2065
  157. package/dist/commands/search.js +1 -1
  158. package/dist/commands/surface/node/cycle.d.ts +1 -0
  159. package/dist/commands/surface/node/cycle.js +83 -0
  160. package/dist/commands/surface/node/focus.d.ts +1 -0
  161. package/dist/commands/surface/node/focus.js +67 -0
  162. package/dist/commands/surface/node/id.d.ts +1 -0
  163. package/dist/commands/surface/node/id.js +38 -0
  164. package/dist/commands/surface/node/pin.d.ts +1 -0
  165. package/dist/commands/surface/node/pin.js +42 -0
  166. package/dist/commands/surface/node/placement.d.ts +46 -0
  167. package/dist/commands/surface/node/placement.js +124 -0
  168. package/dist/commands/surface-node.js +4 -1
  169. package/dist/commands/surface-reload.js +1 -2
  170. package/dist/commands/surface-tmux-spread.js +1 -1
  171. package/dist/commands/surface.js +5 -20
  172. package/dist/commands/sys/__tests__/setup-core.test.js +18 -271
  173. package/dist/commands/sys/config.js +6 -6
  174. package/dist/commands/sys/logs.js +1 -1
  175. package/dist/commands/sys/panels/broker-limits-panel.d.ts +17 -0
  176. package/dist/commands/sys/panels/broker-limits-panel.js +104 -0
  177. package/dist/commands/sys/panels/dependencies-panel.d.ts +14 -0
  178. package/dist/commands/sys/panels/dependencies-panel.js +80 -0
  179. package/dist/commands/sys/panels/keybindings-panel.d.ts +56 -0
  180. package/dist/commands/sys/panels/keybindings-panel.js +703 -0
  181. package/dist/commands/sys/panels/keys-panel.d.ts +16 -0
  182. package/dist/commands/sys/panels/keys-panel.js +60 -0
  183. package/dist/commands/sys/panels/models-panel.d.ts +77 -0
  184. package/dist/commands/sys/panels/models-panel.js +647 -0
  185. package/dist/commands/sys/panels/panel.d.ts +45 -0
  186. package/dist/commands/sys/panels/panel.js +137 -0
  187. package/dist/commands/sys/panels/plugins-panel.d.ts +16 -0
  188. package/dist/commands/sys/panels/plugins-panel.js +80 -0
  189. package/dist/commands/sys/panels/prefs-panel.d.ts +21 -0
  190. package/dist/commands/sys/panels/prefs-panel.js +85 -0
  191. package/dist/commands/sys/panels/provider-panel.d.ts +62 -0
  192. package/dist/commands/sys/panels/provider-panel.js +538 -0
  193. package/dist/commands/sys/settings-shell.d.ts +55 -0
  194. package/dist/commands/sys/settings-shell.js +400 -0
  195. package/dist/commands/sys/settings.d.ts +2 -0
  196. package/dist/commands/sys/settings.js +31 -0
  197. package/dist/commands/sys/setup-core.d.ts +3 -33
  198. package/dist/commands/sys/setup-core.js +27 -78
  199. package/dist/commands/sys/setup-settings-runner.d.ts +24 -0
  200. package/dist/commands/sys/setup-settings-runner.js +63 -0
  201. package/dist/commands/sys/setup-wizard.d.ts +26 -125
  202. package/dist/commands/sys/setup-wizard.js +209 -2473
  203. package/dist/commands/sys/setup.js +5 -7
  204. package/dist/commands/sys.js +3 -2
  205. package/dist/core/__tests__/broker-extension-canvas-db-boundary.test.js +50 -0
  206. package/dist/core/__tests__/broker-launch-candidates.test.js +20 -9
  207. package/dist/core/__tests__/broker-preflight.test.js +1 -1
  208. package/dist/core/__tests__/canvas-inbox-watcher-hold.test.js +108 -27
  209. package/dist/core/__tests__/canvas-inbox-watcher.test.js +14 -0
  210. package/dist/core/__tests__/canvas.test.js +2 -36
  211. package/dist/core/__tests__/close.test.js +14 -3
  212. package/dist/core/__tests__/context-intro.test.js +32 -143
  213. package/dist/core/__tests__/cron-broker-capacity.test.js +22 -3
  214. package/dist/core/__tests__/daemon-boot.test.js +2 -20
  215. package/dist/core/__tests__/daemon-wedge.test.js +1 -1
  216. package/dist/core/__tests__/dead-node-policy-table.test.js +1 -18
  217. package/dist/core/__tests__/fixtures/fake-engine.d.ts +1 -1
  218. package/dist/core/__tests__/fixtures/fake-engine.js +2 -2
  219. package/dist/core/__tests__/fixtures/fake-pi-host.js +2 -2
  220. package/dist/core/__tests__/focuses.test.js +4 -98
  221. package/dist/core/__tests__/helpers/broker-clients.d.ts +0 -3
  222. package/dist/core/__tests__/helpers/broker-clients.js +0 -14
  223. package/dist/core/__tests__/helpers/harness.d.ts +0 -8
  224. package/dist/core/__tests__/helpers/harness.js +7 -87
  225. package/dist/core/__tests__/helpers/viewer-panes.js +1 -1
  226. package/dist/core/__tests__/inline-memory-refs.test.js +5 -134
  227. package/dist/core/__tests__/kickoff.test.js +1 -1
  228. package/dist/core/__tests__/memory-resolver-precedence.test.js +29 -1
  229. package/dist/core/__tests__/migration.test.js +35 -48
  230. package/dist/core/__tests__/on-read-dedup-resume.test.js +22 -12
  231. package/dist/core/__tests__/passive-subscription.test.js +26 -49
  232. package/dist/core/__tests__/preview-registry-sync.test.js +1 -2
  233. package/dist/core/__tests__/prune.test.js +94 -1
  234. package/dist/core/__tests__/review-model-floor.test.js +0 -32
  235. package/dist/core/__tests__/seam/broker-attach-multiclient.test.js +255 -0
  236. package/dist/core/__tests__/{full → seam}/broker-attach-stream.test.js +39 -7
  237. package/dist/core/__tests__/{full → seam}/broker-crash-teardown.test.js +30 -29
  238. package/dist/core/__tests__/{full → seam}/broker-pane-resolution.test.js +54 -5
  239. package/dist/core/__tests__/{full → seam}/broker-provider-retry.test.js +134 -82
  240. package/dist/core/__tests__/{full → seam}/broker-whip-interrupt.test.js +15 -4
  241. package/dist/core/__tests__/{full/idle-release-settlement.test.js → seam/dormancy-release.test.js} +69 -17
  242. package/dist/core/__tests__/{full/yield-message-transaction.test.js → seam/yield-refresh-transaction.test.js} +31 -9
  243. package/dist/core/__tests__/secrets.test.js +1 -7
  244. package/dist/core/__tests__/{broker-fork-seam.test.js → serial/broker-fork-seam.test.js} +58 -7
  245. package/dist/core/__tests__/{broker-sdk-wiring.test.js → serial/broker-sdk-wiring.test.js} +18 -162
  246. package/dist/core/__tests__/{broker-snapshot-history.test.js → serial/broker-snapshot-history.test.js} +9 -9
  247. package/dist/core/__tests__/{command-plugins.test.js → serial/command-plugins.test.js} +105 -15
  248. package/dist/core/__tests__/{deferred-no-wake.test.js → serial/deferred-no-wake.test.js} +23 -20
  249. package/dist/core/__tests__/{flagship-lifecycle.test.js → serial/flagship-lifecycle.test.js} +7 -7
  250. package/dist/core/__tests__/{host-teardown-process-group.test.js → serial/host-teardown-process-group.test.js} +6 -6
  251. package/dist/core/__tests__/{human-deliver-e2e.test.js → serial/human-deliver-e2e.test.js} +12 -12
  252. package/dist/core/__tests__/{live-mutation.test.js → serial/live-mutation.test.js} +5 -5
  253. package/dist/core/__tests__/{refresh-stall-recycle.test.js → serial/refresh-stall-recycle.test.js} +5 -14
  254. package/dist/core/__tests__/{revive.test.js → serial/revive.test.js} +15 -100
  255. package/dist/core/__tests__/{spawn-root.test.js → serial/spawn-root.test.js} +32 -15
  256. package/dist/core/__tests__/serial/subscription-delivery.test.js +126 -0
  257. package/dist/core/__tests__/serial/tmux-surface.test.js +256 -0
  258. package/dist/core/__tests__/{worktree.test.js → serial/worktree.test.js} +15 -15
  259. package/dist/core/__tests__/session-model.test.js +0 -18
  260. package/dist/core/__tests__/spawn-worktree-id-conflict.test.js +9 -0
  261. package/dist/core/__tests__/watchdog-abort-arms-retry.test.js +50 -0
  262. package/dist/core/broker-client/__tests__/transport-relay.test.js +15 -16
  263. package/dist/core/broker-client/__tests__/transport-socket.test.js +28 -0
  264. package/dist/core/broker-client/client.d.ts +2 -2
  265. package/dist/core/broker-client/client.js +4 -7
  266. package/dist/core/broker-client/transport-relay.d.ts +13 -19
  267. package/dist/core/broker-client/transport-relay.js +19 -34
  268. package/dist/core/broker-client/transport-socket.d.ts +2 -2
  269. package/dist/core/broker-client/transport-socket.js +9 -2
  270. package/dist/core/broker-client/transport.d.ts +7 -3
  271. package/dist/core/broker-client/transport.js +4 -4
  272. package/dist/core/canvas/__tests__/attention.test.js +1 -18
  273. package/dist/core/canvas/__tests__/remote-canvas-source.test.js +7 -64
  274. package/dist/core/canvas/__tests__/remote-transport.test.js +2 -3
  275. package/dist/core/canvas/__tests__/render-remote.test.js +7 -52
  276. package/dist/core/canvas/browse/app.d.ts +2 -17
  277. package/dist/core/canvas/browse/app.js +16 -88
  278. package/dist/core/canvas/browse/model.d.ts +0 -4
  279. package/dist/core/canvas/browse/model.js +1 -12
  280. package/dist/core/canvas/browse/render.js +6 -3
  281. package/dist/core/canvas/crons.d.ts +8 -5
  282. package/dist/core/canvas/crons.js +7 -6
  283. package/dist/core/canvas/extensions.d.ts +7 -3
  284. package/dist/core/canvas/extensions.js +16 -4
  285. package/dist/core/canvas/nav-model.d.ts +0 -4
  286. package/dist/core/canvas/nav-model.js +2 -14
  287. package/dist/core/canvas/node-order.d.ts +3 -0
  288. package/dist/core/canvas/node-order.js +12 -0
  289. package/dist/core/canvas/remote-canvas-source.d.ts +3 -6
  290. package/dist/core/canvas/remote-canvas-source.js +8 -15
  291. package/dist/core/command.js +11 -4
  292. package/dist/core/config.js +3 -1
  293. package/dist/core/events/envelope.js +1 -1
  294. package/dist/core/events/read.js +7 -21
  295. package/dist/core/events/source.d.ts +0 -2
  296. package/dist/core/events/source.js +0 -16
  297. package/dist/core/events/types.d.ts +1 -1
  298. package/dist/core/fault-classifier.d.ts +1 -1
  299. package/dist/core/feed/passive.d.ts +0 -11
  300. package/dist/core/feed/passive.js +1 -62
  301. package/dist/core/human/__tests__/{inbox-core.test.js → serial/inbox-core.test.js} +6 -6
  302. package/dist/core/keybindings/__tests__/resolve.test.js +1 -96
  303. package/dist/core/keybindings/background-bash.js +3 -4
  304. package/dist/core/keybindings/catalog.js +1 -1
  305. package/dist/core/memory/inline-ref-grammar.js +3 -3
  306. package/dist/core/memory-resolver.d.ts +11 -25
  307. package/dist/core/memory-resolver.js +51 -33
  308. package/dist/core/model-routes.d.ts +15 -0
  309. package/dist/core/model-routes.js +12 -0
  310. package/dist/core/pool-credential-store.js +1 -1
  311. package/dist/core/preview-registry.js +8 -9
  312. package/dist/core/profiles/__tests__/root-profile.test.js +4 -14
  313. package/dist/core/review/realize.d.ts +0 -13
  314. package/dist/core/review/realize.js +0 -40
  315. package/dist/core/review/types.d.ts +1 -1
  316. package/dist/core/runtime/__tests__/engine-route.test.js +2 -2
  317. package/dist/core/runtime/bearings.js +1 -11
  318. package/dist/core/runtime/broker/client-registry.d.ts +33 -0
  319. package/dist/core/runtime/broker/client-registry.js +164 -0
  320. package/dist/core/runtime/broker/daemon-ops.d.ts +19 -0
  321. package/dist/core/runtime/broker/daemon-ops.js +49 -0
  322. package/dist/core/runtime/broker/event-projection.d.ts +42 -0
  323. package/dist/core/runtime/broker/event-projection.js +178 -0
  324. package/dist/core/runtime/broker/fault-retry.d.ts +39 -0
  325. package/dist/core/runtime/broker/fault-retry.js +277 -0
  326. package/dist/core/runtime/broker/frame-dispatch.d.ts +238 -0
  327. package/dist/core/runtime/broker/frame-dispatch.js +1537 -0
  328. package/dist/core/runtime/broker/inbox.d.ts +22 -0
  329. package/dist/core/runtime/broker/inbox.js +167 -0
  330. package/dist/core/runtime/broker/passive.d.ts +16 -0
  331. package/dist/core/runtime/broker/passive.js +44 -0
  332. package/dist/core/runtime/broker/read-ops.d.ts +23 -0
  333. package/dist/core/runtime/broker/read-ops.js +150 -0
  334. package/dist/core/runtime/broker/rebind.d.ts +74 -0
  335. package/dist/core/runtime/broker/rebind.js +211 -0
  336. package/dist/core/runtime/broker/tool-groups.d.ts +39 -0
  337. package/dist/core/runtime/broker/tool-groups.js +244 -0
  338. package/dist/core/runtime/broker-extension-render.d.ts +11 -0
  339. package/dist/core/runtime/broker-extension-render.js +181 -0
  340. package/dist/core/runtime/broker-persona-guidance.d.ts +13 -0
  341. package/dist/core/runtime/broker-persona-guidance.js +58 -0
  342. package/dist/core/runtime/broker-protocol.d.ts +1 -1
  343. package/dist/core/runtime/broker-protocol.js +1 -1
  344. package/dist/core/runtime/broker.d.ts +5 -196
  345. package/dist/core/runtime/broker.js +276 -3059
  346. package/dist/core/runtime/canvas-extensions.js +11 -2
  347. package/dist/core/runtime/fault.js +1 -1
  348. package/dist/core/runtime/model-selection.d.ts +9 -0
  349. package/dist/core/runtime/model-selection.js +12 -0
  350. package/dist/core/runtime/model-swap.d.ts +3 -3
  351. package/dist/core/runtime/model-swap.js +33 -25
  352. package/dist/core/runtime/placement-tmux.d.ts +3 -14
  353. package/dist/core/runtime/placement-tmux.js +11 -80
  354. package/dist/core/runtime/placement.d.ts +4 -2
  355. package/dist/core/runtime/placement.js +7 -12
  356. package/dist/core/runtime/promote.d.ts +14 -1
  357. package/dist/core/runtime/promote.js +1 -1
  358. package/dist/core/runtime/reset.d.ts +1 -1
  359. package/dist/core/runtime/roadmap.js +1 -1
  360. package/dist/core/runtime/spawn.d.ts +8 -0
  361. package/dist/core/runtime/spawn.js +36 -6
  362. package/dist/core/runtime/stop-guard.d.ts +4 -3
  363. package/dist/core/runtime/stop-guard.js +36 -18
  364. package/dist/core/runtime/stop-signals.d.ts +4 -1
  365. package/dist/core/runtime/stream-watchdog.js +4 -5
  366. package/dist/core/runtime/structured-output.d.ts +15 -2
  367. package/dist/core/runtime/structured-output.js +35 -12
  368. package/dist/core/runtime/tmux-bindings.d.ts +25 -0
  369. package/dist/core/runtime/tmux-bindings.js +682 -0
  370. package/dist/core/runtime/tmux-chrome.d.ts +2 -1
  371. package/dist/core/runtime/tmux-chrome.js +3 -2
  372. package/dist/core/runtime/{tmux.d.ts → tmux-driver.d.ts} +18 -26
  373. package/dist/core/runtime/tmux-driver.js +598 -0
  374. package/dist/core/runtime/view-socket.d.ts +14 -0
  375. package/dist/core/runtime/view-socket.js +83 -0
  376. package/dist/core/session-model/session-state.d.ts +1 -2
  377. package/dist/core/session-model/session-state.js +5 -8
  378. package/dist/core/spawn.d.ts +1 -1
  379. package/dist/core/spawn.js +2 -2
  380. package/dist/core/substrate/gate.d.ts +1 -1
  381. package/dist/core/substrate/on-read-pure.d.ts +7 -0
  382. package/dist/core/substrate/on-read-pure.js +272 -0
  383. package/dist/core/termrender/termrender.js +32 -2
  384. package/dist/core/user-settings.d.ts +23 -1
  385. package/dist/core/user-settings.js +18 -1
  386. package/dist/daemon/api/__tests__/node-model-validation.test.js +134 -0
  387. package/dist/daemon/api/__tests__/review-terminal-conflict.test.js +98 -0
  388. package/dist/daemon/api/__tests__/{full → seam}/api-server.test.js +6 -48
  389. package/dist/daemon/api/__tests__/{full → seam}/b10-attach-modelauth.test.js +17 -44
  390. package/dist/daemon/api/__tests__/{full/push-parity.test.js → seam/leaf-api-parity.test.js} +61 -42
  391. package/dist/daemon/api/bridge.js +40 -81
  392. package/dist/daemon/api/handlers/broker-ops.d.ts +2 -0
  393. package/dist/daemon/api/handlers/broker-ops.js +383 -0
  394. package/dist/daemon/api/handlers/crons.js +9 -4
  395. package/dist/daemon/api/handlers/files.js +6 -7
  396. package/dist/daemon/api/handlers/inbox.js +2 -340
  397. package/dist/daemon/api/handlers/nodes.d.ts +10 -1
  398. package/dist/daemon/api/handlers/nodes.js +74 -39
  399. package/dist/daemon/api/handlers/review-comments.js +5 -1
  400. package/dist/daemon/api/handlers/reviews.js +0 -19
  401. package/dist/daemon/api/map.js +25 -4
  402. package/dist/daemon/api/router.js +2 -3
  403. package/dist/daemon/api/server.js +5 -7
  404. package/dist/daemon/cron-run.d.ts +4 -0
  405. package/dist/daemon/cron-run.js +30 -13
  406. package/dist/daemon/crtrd.d.ts +3 -58
  407. package/dist/daemon/crtrd.js +28 -1244
  408. package/dist/daemon/manage.js +0 -1
  409. package/dist/daemon/reconcilers/broker-supervision.d.ts +50 -0
  410. package/dist/daemon/reconcilers/broker-supervision.js +549 -0
  411. package/dist/daemon/reconcilers/cron-lane.d.ts +10 -0
  412. package/dist/daemon/reconcilers/cron-lane.js +32 -0
  413. package/dist/daemon/reconcilers/dormant-inbox.d.ts +18 -0
  414. package/dist/daemon/reconcilers/dormant-inbox.js +143 -0
  415. package/dist/daemon/reconcilers/storage-maintenance.d.ts +22 -0
  416. package/dist/daemon/reconcilers/storage-maintenance.js +213 -0
  417. package/dist/daemon/review/finish.js +2 -5
  418. package/dist/pi-extensions/__tests__/canvas-context-intro.test.js +34 -53
  419. package/dist/pi-extensions/__tests__/canvas-recap.test.js +16 -113
  420. package/dist/pi-extensions/__tests__/canvas-stophook-agentend.test.js +72 -99
  421. package/dist/pi-extensions/__tests__/canvas-stophook-context-nudge.test.js +29 -12
  422. package/dist/pi-extensions/broker-local.d.ts +20 -0
  423. package/dist/pi-extensions/broker-local.js +89 -0
  424. package/dist/pi-extensions/canvas-context-intro.d.ts +3 -3
  425. package/dist/pi-extensions/canvas-context-intro.js +22 -11
  426. package/dist/pi-extensions/canvas-doc-substrate.js +17 -34
  427. package/dist/pi-extensions/canvas-goal-capture.js +7 -12
  428. package/dist/pi-extensions/canvas-inbox-watcher.js +124 -139
  429. package/dist/pi-extensions/canvas-passive-context.d.ts +3 -3
  430. package/dist/pi-extensions/canvas-passive-context.js +22 -18
  431. package/dist/pi-extensions/canvas-recap.d.ts +2 -2
  432. package/dist/pi-extensions/canvas-recap.js +48 -21
  433. package/dist/pi-extensions/canvas-review-boundary.js +10 -4
  434. package/dist/pi-extensions/canvas-stophook.d.ts +0 -5
  435. package/dist/pi-extensions/canvas-stophook.js +149 -431
  436. package/dist/pi-extensions/canvas-structured-output.js +52 -30
  437. package/dist/pi-extensions/envelope-merge.d.ts +13 -0
  438. package/dist/pi-extensions/envelope-merge.js +29 -0
  439. package/dist/shared/working-activity.d.ts +3 -2
  440. package/dist/shared/working-activity.js +3 -2
  441. package/dist/types.d.ts +6 -5
  442. package/dist/types.js +2 -2
  443. package/docs/compat/hearth-crtr-v1.md +4 -12
  444. package/docs/compat/hearth-crtr-v2.md +3 -11
  445. package/docs/compat/hearth-crtr-v3.md +4 -12
  446. package/docs/compat/hearth-crtr-v4.md +3 -11
  447. package/docs/compat/hearth-crtr-v5.md +3 -11
  448. package/docs/public-api.md +3 -7
  449. package/package.json +7 -49
  450. package/runtime.lock.json +2766 -14533
  451. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/__tests__/claude-plugin-commands.test.ts +0 -49
  452. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/__tests__/memory-slash-commands.test.ts +0 -194
  453. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/__tests__/statusline.test.ts +0 -68
  454. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/frontmatter-rules/test.ts +0 -119
  455. package/dist/clients/attach/__tests__/attach-chrome-remote.test.js +0 -439
  456. package/dist/clients/attach/__tests__/attach-keybindings.test.js +0 -170
  457. package/dist/clients/attach/__tests__/crtr-output-coverage.test.js +0 -57
  458. package/dist/clients/attach/__tests__/editor-frame-title.test.js +0 -19
  459. package/dist/clients/attach/__tests__/input-controller-extension-command.test.js +0 -32
  460. package/dist/clients/attach/__tests__/markdown-headings.test.js +0 -35
  461. package/dist/clients/attach/__tests__/session-identity-refresh.test.js +0 -32
  462. package/dist/clients/conversation/conversation.d.ts +0 -65
  463. package/dist/clients/conversation/conversation.js +0 -318
  464. package/dist/clients/conversation/frames.d.ts +0 -30
  465. package/dist/clients/conversation/frames.js +0 -52
  466. package/dist/clients/conversation/region.d.ts +0 -51
  467. package/dist/clients/conversation/region.js +0 -265
  468. package/dist/clients/inbox/__tests__/inbox-controller.test.js +0 -247
  469. package/dist/clients/inbox/__tests__/mount-panel.test.js +0 -776
  470. package/dist/clients/inbox/review/__tests__/remap.test.js +0 -196
  471. package/dist/clients/inbox/review/columns.d.ts +0 -22
  472. package/dist/clients/inbox/review/columns.js +0 -40
  473. package/dist/clients/inbox/review/composition.d.ts +0 -60
  474. package/dist/clients/inbox/review/composition.js +0 -278
  475. package/dist/clients/inbox/review/document-region.d.ts +0 -120
  476. package/dist/clients/surfaces/region.d.ts +0 -16
  477. package/dist/clients/web/__tests__/push-engine.test.js +0 -158
  478. package/dist/clients/web/__tests__/push-registry.test.d.ts +0 -1
  479. package/dist/clients/web/__tests__/push-registry.test.js +0 -177
  480. package/dist/clients/web/dev-server.d.ts +0 -7
  481. package/dist/clients/web/dev-server.js +0 -46
  482. package/dist/clients/web/events.d.ts +0 -19
  483. package/dist/clients/web/events.js +0 -163
  484. package/dist/clients/web/push-engine.d.ts +0 -44
  485. package/dist/clients/web/push-engine.js +0 -125
  486. package/dist/clients/web/push-registry.d.ts +0 -85
  487. package/dist/clients/web/push-registry.js +0 -373
  488. package/dist/clients/web/server.d.ts +0 -19
  489. package/dist/clients/web/server.js +0 -661
  490. package/dist/clients/web/web-client/shared/protocol.d.ts +0 -214
  491. package/dist/clients/web/web-client/shared/protocol.js +0 -8
  492. package/dist/clients/web/web-cmd.d.ts +0 -2
  493. package/dist/clients/web/web-cmd.js +0 -141
  494. package/dist/commands/__tests__/api-canvas-source.test.d.ts +0 -1
  495. package/dist/commands/__tests__/api-canvas-source.test.js +0 -37
  496. package/dist/commands/__tests__/canvas-config.test.d.ts +0 -1
  497. package/dist/commands/__tests__/canvas-config.test.js +0 -107
  498. package/dist/commands/__tests__/node-no-kickoff-flag.test.d.ts +0 -1
  499. package/dist/commands/__tests__/node-no-kickoff-flag.test.js +0 -73
  500. package/dist/commands/__tests__/node-worktree-flag.test.d.ts +0 -1
  501. package/dist/commands/__tests__/node-worktree-flag.test.js +0 -49
  502. package/dist/commands/__tests__/search-contents.test.d.ts +0 -1
  503. package/dist/commands/__tests__/search-contents.test.js +0 -52
  504. package/dist/commands/memory/__tests__/lint.test.d.ts +0 -1
  505. package/dist/commands/memory/__tests__/lint.test.js +0 -15
  506. package/dist/commands/sys/__tests__/config-broker-thresholds.test.d.ts +0 -1
  507. package/dist/commands/sys/__tests__/config-broker-thresholds.test.js +0 -95
  508. package/dist/commands/sys/__tests__/config-keybindings.test.d.ts +0 -1
  509. package/dist/commands/sys/__tests__/config-keybindings.test.js +0 -55
  510. package/dist/commands/sys/__tests__/helpers/setup-runtime.d.ts +0 -5
  511. package/dist/commands/sys/__tests__/helpers/setup-runtime.js +0 -19
  512. package/dist/commands/sys/__tests__/setup-front-door.test.d.ts +0 -1
  513. package/dist/commands/sys/__tests__/setup-front-door.test.js +0 -102
  514. package/dist/commands/sys/__tests__/setup-models.test.d.ts +0 -1
  515. package/dist/commands/sys/__tests__/setup-models.test.js +0 -205
  516. package/dist/commands/sys/__tests__/setup-providers-viewport.test.d.ts +0 -1
  517. package/dist/commands/sys/__tests__/setup-providers-viewport.test.js +0 -155
  518. package/dist/commands/sys/__tests__/sync-deps.test.d.ts +0 -1
  519. package/dist/commands/sys/__tests__/sync-deps.test.js +0 -179
  520. package/dist/commands/sys/__tests__/sync-import.test.d.ts +0 -1
  521. package/dist/commands/sys/__tests__/sync-import.test.js +0 -315
  522. package/dist/core/__tests__/base-worker-prompt.test.d.ts +0 -1
  523. package/dist/core/__tests__/base-worker-prompt.test.js +0 -57
  524. package/dist/core/__tests__/command-plugins-surfaces.test.d.ts +0 -1
  525. package/dist/core/__tests__/command-plugins-surfaces.test.js +0 -359
  526. package/dist/core/__tests__/connection-reconnect-resume.test.d.ts +0 -1
  527. package/dist/core/__tests__/connection-reconnect-resume.test.js +0 -36
  528. package/dist/core/__tests__/finalization-migration.test.d.ts +0 -1
  529. package/dist/core/__tests__/finalization-migration.test.js +0 -38
  530. package/dist/core/__tests__/fixtures/extra-extension.d.ts +0 -1
  531. package/dist/core/__tests__/fixtures/extra-extension.js +0 -3
  532. package/dist/core/__tests__/fixtures/spawn-proof-target.test.d.ts +0 -1
  533. package/dist/core/__tests__/fixtures/spawn-proof-target.test.js +0 -15
  534. package/dist/core/__tests__/fork.test.d.ts +0 -1
  535. package/dist/core/__tests__/fork.test.js +0 -108
  536. package/dist/core/__tests__/full/broker-attach-limits.test.d.ts +0 -1
  537. package/dist/core/__tests__/full/broker-attach-limits.test.js +0 -147
  538. package/dist/core/__tests__/full/broker-deliver-ack.test.d.ts +0 -1
  539. package/dist/core/__tests__/full/broker-deliver-ack.test.js +0 -73
  540. package/dist/core/__tests__/full/broker-dialogs.test.d.ts +0 -1
  541. package/dist/core/__tests__/full/broker-dialogs.test.js +0 -180
  542. package/dist/core/__tests__/full/broker-display-snapshot.test.d.ts +0 -1
  543. package/dist/core/__tests__/full/broker-display-snapshot.test.js +0 -75
  544. package/dist/core/__tests__/full/broker-dormant-wake.test.d.ts +0 -1
  545. package/dist/core/__tests__/full/broker-dormant-wake.test.js +0 -130
  546. package/dist/core/__tests__/full/broker-model-changed-broadcast.test.d.ts +0 -1
  547. package/dist/core/__tests__/full/broker-model-changed-broadcast.test.js +0 -57
  548. package/dist/core/__tests__/full/broker-navigate-tree-rewelcome.test.d.ts +0 -1
  549. package/dist/core/__tests__/full/broker-navigate-tree-rewelcome.test.js +0 -80
  550. package/dist/core/__tests__/full/cascade-close.test.d.ts +0 -1
  551. package/dist/core/__tests__/full/cascade-close.test.js +0 -240
  552. package/dist/core/__tests__/full/detach-focus.test.d.ts +0 -1
  553. package/dist/core/__tests__/full/detach-focus.test.js +0 -126
  554. package/dist/core/__tests__/full/idle-release-settlement.test.d.ts +0 -1
  555. package/dist/core/__tests__/full/issue-146-yield-spawn-focus.test.d.ts +0 -1
  556. package/dist/core/__tests__/full/issue-146-yield-spawn-focus.test.js +0 -107
  557. package/dist/core/__tests__/full/park-clock-release.test.d.ts +0 -1
  558. package/dist/core/__tests__/full/park-clock-release.test.js +0 -56
  559. package/dist/core/__tests__/full/yield-message-transaction.test.d.ts +0 -1
  560. package/dist/core/__tests__/memory-index-render.test.d.ts +0 -1
  561. package/dist/core/__tests__/memory-index-render.test.js +0 -60
  562. package/dist/core/__tests__/model-routes.test.d.ts +0 -1
  563. package/dist/core/__tests__/model-routes.test.js +0 -41
  564. package/dist/core/__tests__/on-read-identity.test.d.ts +0 -1
  565. package/dist/core/__tests__/on-read-identity.test.js +0 -61
  566. package/dist/core/__tests__/phase4-review-migration.test.d.ts +0 -1
  567. package/dist/core/__tests__/phase4-review-migration.test.js +0 -100
  568. package/dist/core/__tests__/prune-to-limit.test.d.ts +0 -1
  569. package/dist/core/__tests__/prune-to-limit.test.js +0 -126
  570. package/dist/core/__tests__/reset.test.d.ts +0 -1
  571. package/dist/core/__tests__/reset.test.js +0 -69
  572. package/dist/core/__tests__/spawn-no-kickoff.test.d.ts +0 -1
  573. package/dist/core/__tests__/spawn-no-kickoff.test.js +0 -115
  574. package/dist/core/__tests__/steer-note.test.d.ts +0 -1
  575. package/dist/core/__tests__/steer-note.test.js +0 -41
  576. package/dist/core/__tests__/subcommand-tier.test.d.ts +0 -1
  577. package/dist/core/__tests__/subcommand-tier.test.js +0 -99
  578. package/dist/core/__tests__/subscription-delivery.test.js +0 -211
  579. package/dist/core/__tests__/test-runner-cheap-sharding.test.d.ts +0 -1
  580. package/dist/core/__tests__/test-runner-cheap-sharding.test.js +0 -97
  581. package/dist/core/__tests__/tmux-surface.test.js +0 -484
  582. package/dist/core/__tests__/wake-bearings.test.d.ts +0 -1
  583. package/dist/core/__tests__/wake-bearings.test.js +0 -102
  584. package/dist/core/canvas/__tests__/remote-event-stream.test.d.ts +0 -1
  585. package/dist/core/canvas/__tests__/remote-event-stream.test.js +0 -146
  586. package/dist/core/canvas/__tests__/source-resolve.test.d.ts +0 -1
  587. package/dist/core/canvas/__tests__/source-resolve.test.js +0 -77
  588. package/dist/core/canvas/browse/__tests__/model.test.d.ts +0 -1
  589. package/dist/core/canvas/browse/__tests__/model.test.js +0 -290
  590. package/dist/core/canvas/browse/__tests__/rebuild-coalescer.test.d.ts +0 -1
  591. package/dist/core/canvas/browse/__tests__/rebuild-coalescer.test.js +0 -134
  592. package/dist/core/canvas/browse/__tests__/render.test.d.ts +0 -1
  593. package/dist/core/canvas/browse/__tests__/render.test.js +0 -111
  594. package/dist/core/canvas/browse/rebuild-coalescer.d.ts +0 -7
  595. package/dist/core/canvas/browse/rebuild-coalescer.js +0 -61
  596. package/dist/core/canvas/remote-event-stream.d.ts +0 -24
  597. package/dist/core/canvas/remote-event-stream.js +0 -94
  598. package/dist/core/feed/__tests__/coalesce-human.test.d.ts +0 -1
  599. package/dist/core/feed/__tests__/coalesce-human.test.js +0 -36
  600. package/dist/core/feed/__tests__/empty-node-guard.test.d.ts +0 -1
  601. package/dist/core/feed/__tests__/empty-node-guard.test.js +0 -45
  602. package/dist/core/host-exports/__tests__/export-prunes-boot-skill.test.d.ts +0 -1
  603. package/dist/core/host-exports/__tests__/export-prunes-boot-skill.test.js +0 -84
  604. package/dist/core/human/__tests__/visible-paths.test.d.ts +0 -1
  605. package/dist/core/human/__tests__/visible-paths.test.js +0 -28
  606. package/dist/core/keybindings/__tests__/inbox-affordance.test.d.ts +0 -1
  607. package/dist/core/keybindings/__tests__/inbox-affordance.test.js +0 -38
  608. package/dist/core/review/__tests__/project.test.d.ts +0 -1
  609. package/dist/core/review/__tests__/project.test.js +0 -71
  610. package/dist/core/runtime/__tests__/command-expansion.test.d.ts +0 -1
  611. package/dist/core/runtime/__tests__/command-expansion.test.js +0 -25
  612. package/dist/core/runtime/__tests__/session-visibility.test.d.ts +0 -1
  613. package/dist/core/runtime/__tests__/session-visibility.test.js +0 -119
  614. package/dist/core/runtime/__tests__/spawn-at-given-id.test.d.ts +0 -1
  615. package/dist/core/runtime/__tests__/spawn-at-given-id.test.js +0 -34
  616. package/dist/core/runtime/tmux.js +0 -1314
  617. package/dist/daemon/api/__tests__/full/push-parity.test.d.ts +0 -1
  618. package/dist/daemon/api/__tests__/full/worktree-parity.test.d.ts +0 -1
  619. package/dist/daemon/api/__tests__/full/worktree-parity.test.js +0 -160
  620. package/dist/daemon/api/__tests__/inbox.test.d.ts +0 -1
  621. package/dist/daemon/api/__tests__/inbox.test.js +0 -489
  622. package/dist/web-client/apple-touch-icon.png +0 -0
  623. package/dist/web-client/assets/fragment-mono-latin-400-normal-BYwT3kSJ.woff +0 -0
  624. package/dist/web-client/assets/fragment-mono-latin-400-normal-yxdJ5AmL.woff2 +0 -0
  625. package/dist/web-client/assets/fragment-mono-latin-ext-400-normal-BbKYyvR9.woff2 +0 -0
  626. package/dist/web-client/assets/fragment-mono-latin-ext-400-normal-CT4YFKeK.woff +0 -0
  627. package/dist/web-client/assets/index-CCPaLeW7.css +0 -2
  628. package/dist/web-client/assets/index-kyOWsnZK.js +0 -86
  629. package/dist/web-client/assets/martian-mono-cyrillic-wght-normal-B84CD5C_.woff2 +0 -0
  630. package/dist/web-client/assets/martian-mono-latin-ext-wght-normal-DlL6xMw5.woff2 +0 -0
  631. package/dist/web-client/assets/martian-mono-latin-wght-normal-5W32yIyr.woff2 +0 -0
  632. package/dist/web-client/assets/workbox-window.prod.es5-Bd17z0YL.js +0 -2
  633. package/dist/web-client/icon-192.png +0 -0
  634. package/dist/web-client/icon-512.png +0 -0
  635. package/dist/web-client/icon-maskable-512.png +0 -0
  636. package/dist/web-client/index.html +0 -17
  637. package/dist/web-client/manifest.webmanifest +0 -1
  638. package/dist/web-client/sw.js +0 -1
  639. /package/dist/api/__tests__/{client.test.d.ts → serial/client.test.d.ts} +0 -0
  640. /package/dist/clients/inbox/__tests__/{inbox-controller.test.d.ts → serial/inbox-controller.test.d.ts} +0 -0
  641. /package/dist/clients/inbox/__tests__/{mount-panel.test.d.ts → serial/mount-panel.test.d.ts} +0 -0
  642. /package/dist/clients/{attach/__tests__/attach-chrome-remote.test.d.ts → inbox/review/__tests__/teardown-notice.test.d.ts} +0 -0
  643. /package/dist/{clients/attach/__tests__/attach-keybindings.test.d.ts → core/__tests__/broker-extension-canvas-db-boundary.test.d.ts} +0 -0
  644. /package/dist/{clients/attach/__tests__/crtr-output-coverage.test.d.ts → core/__tests__/seam/broker-attach-multiclient.test.d.ts} +0 -0
  645. /package/dist/core/__tests__/{full → seam}/broker-attach-stream.test.d.ts +0 -0
  646. /package/dist/core/__tests__/{full → seam}/broker-crash-teardown.test.d.ts +0 -0
  647. /package/dist/core/__tests__/{full → seam}/broker-pane-resolution.test.d.ts +0 -0
  648. /package/dist/core/__tests__/{full → seam}/broker-provider-retry.test.d.ts +0 -0
  649. /package/dist/core/__tests__/{full → seam}/broker-whip-interrupt.test.d.ts +0 -0
  650. /package/dist/{clients/attach/__tests__/editor-frame-title.test.d.ts → core/__tests__/seam/dormancy-release.test.d.ts} +0 -0
  651. /package/dist/{clients/attach/__tests__/input-controller-extension-command.test.d.ts → core/__tests__/seam/yield-refresh-transaction.test.d.ts} +0 -0
  652. /package/dist/core/__tests__/{broker-fork-seam.test.d.ts → serial/broker-fork-seam.test.d.ts} +0 -0
  653. /package/dist/core/__tests__/{broker-sdk-wiring.test.d.ts → serial/broker-sdk-wiring.test.d.ts} +0 -0
  654. /package/dist/core/__tests__/{broker-snapshot-history.test.d.ts → serial/broker-snapshot-history.test.d.ts} +0 -0
  655. /package/dist/core/__tests__/{command-plugins.test.d.ts → serial/command-plugins.test.d.ts} +0 -0
  656. /package/dist/core/__tests__/{deferred-no-wake.test.d.ts → serial/deferred-no-wake.test.d.ts} +0 -0
  657. /package/dist/core/__tests__/{flagship-lifecycle.test.d.ts → serial/flagship-lifecycle.test.d.ts} +0 -0
  658. /package/dist/core/__tests__/{host-teardown-process-group.test.d.ts → serial/host-teardown-process-group.test.d.ts} +0 -0
  659. /package/dist/core/__tests__/{human-deliver-e2e.test.d.ts → serial/human-deliver-e2e.test.d.ts} +0 -0
  660. /package/dist/core/__tests__/{live-mutation.test.d.ts → serial/live-mutation.test.d.ts} +0 -0
  661. /package/dist/core/__tests__/{refresh-stall-recycle.test.d.ts → serial/refresh-stall-recycle.test.d.ts} +0 -0
  662. /package/dist/core/__tests__/{revive.test.d.ts → serial/revive.test.d.ts} +0 -0
  663. /package/dist/core/__tests__/{spawn-root.test.d.ts → serial/spawn-root.test.d.ts} +0 -0
  664. /package/dist/core/__tests__/{subscription-delivery.test.d.ts → serial/subscription-delivery.test.d.ts} +0 -0
  665. /package/dist/core/__tests__/{tmux-surface.test.d.ts → serial/tmux-surface.test.d.ts} +0 -0
  666. /package/dist/core/__tests__/{worktree.test.d.ts → serial/worktree.test.d.ts} +0 -0
  667. /package/dist/{clients/attach/__tests__/markdown-headings.test.d.ts → core/__tests__/watchdog-abort-arms-retry.test.d.ts} +0 -0
  668. /package/dist/{clients/attach/__tests__/session-identity-refresh.test.d.ts → core/broker-client/__tests__/transport-socket.test.d.ts} +0 -0
  669. /package/dist/core/human/__tests__/{inbox-core.test.d.ts → serial/inbox-core.test.d.ts} +0 -0
  670. /package/dist/{clients/inbox/review/__tests__/remap.test.d.ts → daemon/api/__tests__/node-model-validation.test.d.ts} +0 -0
  671. /package/dist/{clients/surfaces/region.js → daemon/api/__tests__/review-terminal-conflict.test.d.ts} +0 -0
  672. /package/dist/daemon/api/__tests__/{full → seam}/api-server.test.d.ts +0 -0
  673. /package/dist/daemon/api/__tests__/{full → seam}/b10-attach-modelauth.test.d.ts +0 -0
  674. /package/dist/{clients/web/__tests__/push-engine.test.d.ts → daemon/api/__tests__/seam/leaf-api-parity.test.d.ts} +0 -0
@@ -1,52 +0,0 @@
1
- import assert from 'node:assert/strict';
2
- import test from 'node:test';
3
- import { parseArgv } from '../../core/command.js';
4
- import { contentsLeaf } from '../search/contents.js';
5
- async function requestBody(argv) {
6
- const previousKey = process.env['EXA_API_KEY'];
7
- const previousFetch = globalThis.fetch;
8
- let body;
9
- let requestCount = 0;
10
- process.env['EXA_API_KEY'] = 'test-key';
11
- globalThis.fetch = (async (_input, init) => {
12
- requestCount++;
13
- body = JSON.parse(String(init?.body));
14
- return new Response(JSON.stringify({ results: [], statuses: [] }), {
15
- status: 200,
16
- headers: { 'content-type': 'application/json' },
17
- });
18
- });
19
- try {
20
- const input = await parseArgv(contentsLeaf.help.params ?? [], argv);
21
- await contentsLeaf.run(input);
22
- assert.equal(requestCount, 1);
23
- assert.ok(body !== undefined);
24
- return body;
25
- }
26
- finally {
27
- globalThis.fetch = previousFetch;
28
- if (previousKey === undefined)
29
- delete process.env['EXA_API_KEY'];
30
- else
31
- process.env['EXA_API_KEY'] = previousKey;
32
- }
33
- }
34
- test('search contents accepts separate URL positional argv tokens in one request', async () => {
35
- const body = await requestBody(['https://example.com/one', 'https://example.com/two']);
36
- assert.deepEqual(body['urls'], ['https://example.com/one', 'https://example.com/two']);
37
- });
38
- test('search contents flattens comma and whitespace-separated URLs across positional tokens', async () => {
39
- const body = await requestBody([
40
- 'https://example.com/one,https://example.com/two',
41
- 'https://example.com/three https://example.com/four',
42
- ]);
43
- assert.deepEqual(body['urls'], [
44
- 'https://example.com/one',
45
- 'https://example.com/two',
46
- 'https://example.com/three',
47
- 'https://example.com/four',
48
- ]);
49
- });
50
- test('search contents still rejects zero URL positional tokens', async () => {
51
- await assert.rejects(() => parseArgv(contentsLeaf.help.params ?? [], []), (error) => error instanceof Error && error.message.includes('required parameter is missing'));
52
- });
@@ -1 +0,0 @@
1
- export {};
@@ -1,15 +0,0 @@
1
- import assert from 'node:assert/strict';
2
- import test from 'node:test';
3
- import { lintShortPreviewBody } from '../lint.js';
4
- const previewMemory = {
5
- 'system-prompt-visibility': 'preview',
6
- 'file-read-visibility': 'none',
7
- };
8
- test('memory lint warns when a preview body is short enough to inline', () => {
9
- const shortBody = Array.from({ length: 29 }, (_, index) => `word${index}`).join(' ');
10
- assert.match(lintShortPreviewBody(previewMemory, shortBody) ?? '', /body is 29 words but system-prompt-visibility is `preview`; use `content`/);
11
- const contentMemory = { ...previewMemory, 'system-prompt-visibility': 'content' };
12
- assert.equal(lintShortPreviewBody(contentMemory, shortBody), null);
13
- const thresholdBody = Array.from({ length: 30 }, (_, index) => `word${index}`).join(' ');
14
- assert.equal(lintShortPreviewBody(previewMemory, thresholdBody), null);
15
- });
@@ -1,95 +0,0 @@
1
- import { after, afterEach, before, beforeEach, test } from 'node:test';
2
- import assert from 'node:assert/strict';
3
- import { mkdtempSync, readFileSync, rmSync, writeFileSync } from 'node:fs';
4
- import { tmpdir } from 'node:os';
5
- import { join } from 'node:path';
6
- import { ensureScopeInitialized, readConfig, updateConfig } from '../../../core/config.js';
7
- import { brokerThresholdsForDaemon } from '../../../daemon/crtrd.js';
8
- import { configBranch } from '../config.js';
9
- function leaf(name) {
10
- const found = (configBranch.children ?? []).find((child) => child.name === name);
11
- if (found === undefined || found.kind !== 'leaf')
12
- throw new Error(`no leaf '${name}' under sys config`);
13
- return found;
14
- }
15
- let home;
16
- let realHome;
17
- let realMaxLiveBrokers;
18
- let realWarnLiveBrokers;
19
- before(() => {
20
- realHome = process.env['HOME'];
21
- realMaxLiveBrokers = process.env['CRTR_MAX_LIVE_BROKERS'];
22
- realWarnLiveBrokers = process.env['CRTR_WARN_LIVE_BROKERS'];
23
- });
24
- beforeEach(() => {
25
- home = mkdtempSync(join(tmpdir(), 'crtr-broker-thresholds-'));
26
- process.env['HOME'] = home;
27
- delete process.env['CRTR_MAX_LIVE_BROKERS'];
28
- delete process.env['CRTR_WARN_LIVE_BROKERS'];
29
- });
30
- afterEach(() => {
31
- rmSync(home, { recursive: true, force: true });
32
- });
33
- after(() => {
34
- if (realHome === undefined)
35
- delete process.env['HOME'];
36
- else
37
- process.env['HOME'] = realHome;
38
- if (realMaxLiveBrokers === undefined)
39
- delete process.env['CRTR_MAX_LIVE_BROKERS'];
40
- else
41
- process.env['CRTR_MAX_LIVE_BROKERS'] = realMaxLiveBrokers;
42
- if (realWarnLiveBrokers === undefined)
43
- delete process.env['CRTR_WARN_LIVE_BROKERS'];
44
- else
45
- process.env['CRTR_WARN_LIVE_BROKERS'] = realWarnLiveBrokers;
46
- });
47
- test('broker thresholds default-merge valid positive integers and reject invalid raw values', () => {
48
- const root = join(home, '.crouter');
49
- ensureScopeInitialized('user', root);
50
- assert.deepEqual(readConfig('user').brokerThresholds, { warning: 128, automaticReviveCap: 256 });
51
- writeFileSync(join(root, 'config.json'), JSON.stringify({
52
- brokerThresholds: { warning: 0, automaticReviveCap: 'not-a-number' },
53
- }));
54
- assert.deepEqual(readConfig('user').brokerThresholds, { warning: 128, automaticReviveCap: 256 });
55
- writeFileSync(join(root, 'config.json'), JSON.stringify({
56
- brokerThresholds: { warning: 1.5, automaticReviveCap: 200 },
57
- }));
58
- assert.deepEqual(readConfig('user').brokerThresholds, { warning: 128, automaticReviveCap: 200 });
59
- writeFileSync(join(root, 'config.json'), JSON.stringify({
60
- brokerThresholds: { warning: 300, automaticReviveCap: 200 },
61
- }));
62
- assert.deepEqual(readConfig('user').brokerThresholds, { warning: 128, automaticReviveCap: 256 });
63
- });
64
- test('project initialization omits host-wide broker thresholds', () => {
65
- const root = join(home, 'project', '.crouter');
66
- ensureScopeInitialized('project', root);
67
- const raw = JSON.parse(readFileSync(join(root, 'config.json'), 'utf8'));
68
- assert.equal(raw.brokerThresholds, undefined);
69
- });
70
- test('sys config get/set exposes only positive user-scope broker threshold values', async () => {
71
- const root = join(home, '.crouter');
72
- ensureScopeInitialized('user', root);
73
- await leaf('set').run({ key: 'brokerThresholds.warning', value: '144' });
74
- const got = await leaf('get').run({ key: 'brokerThresholds.warning' });
75
- assert.deepEqual(got, { key: 'brokerThresholds.warning', value: 144, scope: 'user' });
76
- await assert.rejects(leaf('set').run({ key: 'brokerThresholds.automaticReviveCap', value: '0' }), /brokerThresholds\.automaticReviveCap must be an integer >= 1/);
77
- await assert.rejects(leaf('set').run({ key: 'brokerThresholds.automaticReviveCap', value: '100' }), /brokerThresholds\.automaticReviveCap must be >= brokerThresholds\.warning/);
78
- await assert.rejects(leaf('set').run({ key: 'brokerThresholds.warning', value: '144', scope: 'project' }), /brokerThresholds are available only in user scope/);
79
- });
80
- test('crtrd reads user broker thresholds unless environment overrides them', () => {
81
- const root = join(home, '.crouter');
82
- ensureScopeInitialized('user', root);
83
- updateConfig('user', (config) => {
84
- config.brokerThresholds = { warning: 140, automaticReviveCap: 280 };
85
- });
86
- assert.deepEqual(brokerThresholdsForDaemon(), { warning: 140, automaticReviveCap: 280 });
87
- process.env['CRTR_WARN_LIVE_BROKERS'] = '150';
88
- process.env['CRTR_MAX_LIVE_BROKERS'] = '300';
89
- assert.deepEqual(brokerThresholdsForDaemon(), { warning: 150, automaticReviveCap: 300 });
90
- process.env['CRTR_WARN_LIVE_BROKERS'] = '400';
91
- assert.deepEqual(brokerThresholdsForDaemon(), { warning: 300, automaticReviveCap: 300 });
92
- process.env['CRTR_WARN_LIVE_BROKERS'] = '150.5';
93
- process.env['CRTR_MAX_LIVE_BROKERS'] = '300.5';
94
- assert.deepEqual(brokerThresholdsForDaemon(), { warning: 140, automaticReviveCap: 280 });
95
- });
@@ -1,55 +0,0 @@
1
- import { after, before, beforeEach, test } from 'node:test';
2
- import assert from 'node:assert/strict';
3
- import { mkdtempSync, mkdirSync, readFileSync, rmSync, writeFileSync } from 'node:fs';
4
- import { tmpdir } from 'node:os';
5
- import { join } from 'node:path';
6
- import { configBranch } from '../config.js';
7
- import { ensureScopeInitialized } from '../../../core/config.js';
8
- import { resetScopeCache } from '../../../core/scope.js';
9
- function leaf(name) {
10
- const found = (configBranch.children ?? []).find((child) => child.name === name);
11
- if (found === undefined || found.kind !== 'leaf')
12
- throw new Error(`no leaf '${name}' under sys config`);
13
- return found;
14
- }
15
- let home;
16
- let realHome;
17
- before(() => { realHome = process.env['HOME']; });
18
- beforeEach(() => {
19
- home = mkdtempSync(join(tmpdir(), 'crtr-config-keybindings-'));
20
- process.env['HOME'] = home;
21
- });
22
- after(() => {
23
- if (realHome === undefined)
24
- delete process.env['HOME'];
25
- else
26
- process.env['HOME'] = realHome;
27
- });
28
- test.afterEach(() => rmSync(home, { recursive: true, force: true }));
29
- test('a new project scope initializes through the config lock', () => {
30
- const project = mkdtempSync(join(tmpdir(), 'crtr-config-project-'));
31
- const previous = process.cwd();
32
- try {
33
- process.chdir(project);
34
- resetScopeCache();
35
- const root = join(project, '.crouter');
36
- ensureScopeInitialized('project', root);
37
- assert.equal(JSON.parse(readFileSync(join(root, 'config.json'), 'utf8')).keybindings, undefined);
38
- }
39
- finally {
40
- process.chdir(previous);
41
- resetScopeCache();
42
- rmSync(project, { recursive: true, force: true });
43
- }
44
- });
45
- test('sys config exposes whole user keybindings read-only and routes edits to setup', async () => {
46
- mkdirSync(join(home, '.crouter'), { recursive: true });
47
- writeFileSync(join(home, '.crouter', 'config.json'), JSON.stringify({
48
- keybindings: { 'crtr.graph.down': ['down'] },
49
- }));
50
- const result = await leaf('get').run({ key: 'keybindings', scope: 'user' });
51
- assert.deepEqual(result['value'], { 'crtr.graph.down': ['down'] });
52
- await assert.rejects(() => leaf('get').run({ key: 'keybindings.crtr.graph.down', scope: 'user' }), /whole user-scope object/);
53
- await assert.rejects(() => leaf('set').run({ key: 'keybindings', value: '{}' }), /crtr sys setup/);
54
- assert.doesNotMatch(JSON.stringify(configBranch), /canvasNav/);
55
- });
@@ -1,5 +0,0 @@
1
- import { ModelRegistry, ModelRuntime } from '@earendil-works/pi-coding-agent';
2
- export declare function createSetupRuntime(agentDir: string): Promise<{
3
- runtime: ModelRuntime;
4
- registry: ModelRegistry;
5
- }>;
@@ -1,19 +0,0 @@
1
- // Test helper: the ModelRuntime + ModelRegistry pair `SetupWizard` takes.
2
- //
3
- // pi 0.82 dropped `AuthStorage`/`ModelRegistry.create`; credentials are app-owned and the
4
- // runtime is composed asynchronously. These tests point it at a temp agent dir through
5
- // crouter's own credential store, exactly as `crtr sys setup` does.
6
- import { join } from 'node:path';
7
- import { ModelRegistry, ModelRuntime } from '@earendil-works/pi-coding-agent';
8
- import { PoolCredentialStore } from '../../../../core/pool-credential-store.js';
9
- export async function createSetupRuntime(agentDir) {
10
- // The managed providers are served from the subscription pool files, which are located from
11
- // the agent dir rather than from the auth path -- without this the wizard under test would
12
- // read the developer's REAL accounts and behave differently here than on a clean machine.
13
- process.env.PI_CODING_AGENT_DIR = agentDir;
14
- const runtime = await ModelRuntime.create({
15
- credentials: new PoolCredentialStore(join(agentDir, 'auth.json')),
16
- modelsPath: join(agentDir, 'models.json'),
17
- });
18
- return { runtime, registry: new ModelRegistry(runtime) };
19
- }
@@ -1,102 +0,0 @@
1
- // Run with: node --import tsx/esm --test src/commands/sys/__tests__/setup-front-door.test.ts
2
- //
3
- // M1 — `crtr sys setup` front-door reconciliation refreshes crouter's tmux
4
- // bindings, including the inbox toggle, as a best-effort operation. The fixture
5
- // isolates its canvas with a temporary CRTR_HOME + HOME and legacy binding state
6
- // with a temporary XDG_STATE_HOME.
7
- import { test, before, beforeEach, afterEach, after } from 'node:test';
8
- import assert from 'node:assert/strict';
9
- import { spawnSync } from 'node:child_process';
10
- import { existsSync, mkdtempSync } from 'node:fs';
11
- import { tmpdir } from 'node:os';
12
- import { join } from 'node:path';
13
- import { spawnNode } from '../../../core/runtime/nodes.js';
14
- import { closeDb } from '../../../core/canvas/index.js';
15
- import { apiSocketPath } from '../../../core/canvas/paths.js';
16
- import { createApiServer } from '../../../daemon/api/server.js';
17
- import { reconcileInboxFrontDoor } from '../setup-core.js';
18
- import { sysSetupLeaf } from '../setup.js';
19
- let home;
20
- let stateHome;
21
- let priorHome;
22
- let server;
23
- async function waitForSocket(path) {
24
- for (let i = 0; i < 200; i++) {
25
- if (existsSync(path))
26
- return;
27
- await new Promise((r) => setTimeout(r, 25));
28
- }
29
- throw new Error(`api socket never bound at ${path}`);
30
- }
31
- before(() => {
32
- priorHome = process.env['HOME'];
33
- });
34
- beforeEach(async () => {
35
- closeDb();
36
- home = mkdtempSync(join(tmpdir(), 'crtr-setup-home-'));
37
- stateHome = mkdtempSync(join(tmpdir(), 'crtr-setup-state-'));
38
- process.env['CRTR_HOME'] = home;
39
- process.env['HOME'] = home;
40
- process.env['XDG_STATE_HOME'] = stateHome;
41
- delete process.env['CRTR_NODE_ID'];
42
- // Stand up crtrd's API server on this home's socket so `cliClient()` reaches
43
- // an in-process daemon (never spawns a real one).
44
- server = createApiServer();
45
- await waitForSocket(apiSocketPath());
46
- });
47
- afterEach(async () => {
48
- await server?.close();
49
- });
50
- after(() => {
51
- closeDb();
52
- if (priorHome !== undefined)
53
- process.env['HOME'] = priorHome;
54
- else
55
- delete process.env['HOME'];
56
- delete process.env['CRTR_HOME'];
57
- delete process.env['XDG_STATE_HOME'];
58
- });
59
- test('invoking `crtr sys setup` (non-TTY leaf run) reconciles the front door', async () => {
60
- // Exercise the real control flow — sysSetupLeaf.run() → runSetup() →
61
- // reconcileInboxFrontDoor — not the helper directly. With no TTY the leaf
62
- // prints static instructions and returns, but reconciliation must still have
63
- // happened on the way through.
64
- spawnNode({ kind: 'general', parent: null, cwd: home, name: 'a' });
65
- const originalIsTTY = process.stdout.isTTY;
66
- const originalWrite = process.stdout.write.bind(process.stdout);
67
- // Force the non-TTY (instructions-print) branch and swallow its output.
68
- Object.defineProperty(process.stdout, 'isTTY', { value: false, configurable: true });
69
- process.stdout.write = () => true;
70
- try {
71
- await sysSetupLeaf.run({});
72
- }
73
- finally {
74
- process.stdout.write = originalWrite;
75
- Object.defineProperty(process.stdout, 'isTTY', { value: originalIsTTY, configurable: true });
76
- }
77
- });
78
- test('reconcile refreshes the inbox tmux binding', async (t) => {
79
- if (spawnSync('tmux', ['-V']).status !== 0) {
80
- t.skip('tmux is unavailable');
81
- return;
82
- }
83
- const name = `crtr-setup-inbox-${process.pid}-${Date.now()}`;
84
- const boot = spawnSync('tmux', ['-L', name, 'new-session', '-d', '-s', 'test'], { encoding: 'utf8' });
85
- assert.equal(boot.status, 0, boot.stderr);
86
- const socket = spawnSync('tmux', ['-L', name, 'display-message', '-p', '#{socket_path}'], { encoding: 'utf8' }).stdout.trim();
87
- assert.notEqual(socket, '');
88
- const priorTmux = process.env['TMUX'];
89
- process.env['TMUX'] = `${socket},1,0`;
90
- try {
91
- await reconcileInboxFrontDoor();
92
- const binding = spawnSync('tmux', ['-S', socket, 'list-keys', '-T', 'root'], { encoding: 'utf8' }).stdout;
93
- assert.match(binding, /bind-key\s+-T root M-i\s+run-shell.*crtr human inbox toggle/);
94
- }
95
- finally {
96
- if (priorTmux === undefined)
97
- delete process.env['TMUX'];
98
- else
99
- process.env['TMUX'] = priorTmux;
100
- spawnSync('tmux', ['-S', socket, 'kill-server'], { encoding: 'utf8' });
101
- }
102
- });
@@ -1 +0,0 @@
1
- export {};
@@ -1,205 +0,0 @@
1
- import { test } from 'node:test';
2
- import assert from 'node:assert/strict';
3
- import { mkdirSync, mkdtempSync, readFileSync, rmSync, writeFileSync } from 'node:fs';
4
- import { tmpdir } from 'node:os';
5
- import { join } from 'node:path';
6
- import { stripVTControlCharacters } from 'node:util';
7
- import { applyTheme } from '../../../clients/attach/config.js';
8
- import { createSetupRuntime } from './helpers/setup-runtime.js';
9
- import { resolveKeybindings } from '../../../core/keybindings/index.js';
10
- import { inferPortableModelSelection, buildLaunchSpec } from '../../../core/runtime/launch.js';
11
- import { resetScopeCache } from '../../../core/scope.js';
12
- import { defaultModelLaddersConfig } from '../../../types.js';
13
- import { SetupWizard } from '../setup-wizard.js';
14
- import { buildSetupManifest } from '../setup-core.js';
15
- const stubTui = { requestRender() { } };
16
- test('portable kind selection preserves provider across tokens and concrete ladder refs', () => {
17
- const ladders = defaultModelLaddersConfig();
18
- ladders.defaultProvider = 'openai';
19
- ladders.openai.strong = 'openai-codex/gpt-shared:high';
20
- assert.deepEqual(inferPortableModelSelection('anthropic/strong', ladders), { provider: 'anthropic', strength: 'strong' });
21
- assert.deepEqual(inferPortableModelSelection('strong', ladders), { provider: 'openai', strength: 'strong' });
22
- assert.deepEqual(inferPortableModelSelection('openai-codex/gpt-shared:high', ladders), { provider: 'openai', strength: 'strong' });
23
- assert.deepEqual(inferPortableModelSelection('openai-codex/gpt-shared:medium', ladders), { provider: 'openai', strength: 'strong' });
24
- assert.deepEqual(inferPortableModelSelection('openai-codex/off-ladder:high', ladders), { provider: 'openai', strength: 'ultra' });
25
- assert.deepEqual(inferPortableModelSelection('unknown-provider/off-ladder', ladders), { provider: 'openai', strength: 'ultra' });
26
- });
27
- test('Models keybinding contexts reject navigation collisions that would trap a picker', () => {
28
- const open = resolveKeybindings({ 'crtr.setup.models.open': ['j'] });
29
- assert.ok(open.diagnostics.some((diagnostic) => diagnostic.code === 'collision'));
30
- assert.deepEqual(open.gestures('crtr.setup.models.open'), ['enter']);
31
- const commit = resolveKeybindings({ 'crtr.setup.models.commit': ['j'] });
32
- assert.ok(commit.diagnostics.some((diagnostic) => diagnostic.code === 'collision'));
33
- assert.deepEqual(commit.gestures('crtr.setup.models.commit'), ['enter']);
34
- });
35
- test('Models matrix edits base and orchestrator provider/strength independently without touching pi settings', async () => {
36
- const home = mkdtempSync(join(tmpdir(), 'crtr-setup-models-'));
37
- const agentDir = join(home, 'agent');
38
- const projectDir = join(home, 'project');
39
- const projectConfigDir = join(projectDir, '.crouter');
40
- const settingsPath = join(home, '.pi', 'agent', 'settings.json');
41
- const settingsSentinel = '{"packages":["keep-me"]}\n';
42
- mkdirSync(agentDir, { recursive: true });
43
- mkdirSync(projectConfigDir, { recursive: true });
44
- mkdirSync(join(home, '.pi', 'agent'), { recursive: true });
45
- writeFileSync(settingsPath, settingsSentinel, 'utf8');
46
- const priorHome = process.env['HOME'];
47
- const priorProvider = process.env['CRTR_MODEL_PROVIDER'];
48
- const priorCwd = process.cwd();
49
- process.env['HOME'] = home;
50
- delete process.env['CRTR_MODEL_PROVIDER'];
51
- process.chdir(projectDir);
52
- resetScopeCache();
53
- let wizard;
54
- try {
55
- applyTheme({ cwd: priorCwd });
56
- const { runtime, registry } = await createSetupRuntime(agentDir);
57
- wizard = new SetupWizard(buildSetupManifest(), new Set(), [], stubTui, agentDir, runtime, registry, resolveKeybindings(undefined), undefined, () => 40);
58
- wizard.focused = true;
59
- const render = () => stripVTControlCharacters(wizard.render(140).join('\n'));
60
- for (let index = 0; index < 5; index += 1)
61
- wizard.handleInput('\t');
62
- // Four explicit columns under grouped Base/Orchestrator headers.
63
- assert.match(render(), /Base\s+Orchestrator/);
64
- assert.match(render(), /Kind\s+Provider\s+Strength\s+Provider\s+Strength/);
65
- assert.match(render(), /h\/l column.*s scope.*Enter edit/i);
66
- // A kind with no orchestrator override renders its inherited base values.
67
- assert.match(render(), /general\s+Anthropic\s+strong\s+Anthropic\s+strong/, 'general inherits base into the orchestrator columns');
68
- // The strength-ladder OpenAI column still opens the OpenAI-scoped model picker.
69
- wizard.handleInput('j'); // ultra ladder row
70
- wizard.handleInput('l'); // OpenAI column
71
- wizard.handleInput('\r');
72
- assert.match(render(), /No openai models available .* sign in first\./, 'OpenAI column must open the OpenAI-scoped picker path');
73
- wizard.handleInput('h'); // back to column 0 before entering the kind matrix
74
- for (let index = 0; index < 4; index += 1)
75
- wizard.handleInput('j'); // general (row 5), column 0 = base provider
76
- // Edit ONLY the base provider — the base strength (strong) must survive.
77
- wizard.handleInput('\r');
78
- assert.match(render(), /Choose base provider/);
79
- assert.match(render(), /keeps base strength strong/);
80
- wizard.handleInput('j'); // OpenAI
81
- wizard.handleInput('\r');
82
- assert.match(render(), /general.*OpenAI.*strong/, 'base strength preserved when only the provider changed');
83
- // Edit ONLY the base strength — the base provider (OpenAI) must survive.
84
- wizard.handleInput('l'); // column 1 = base strength
85
- wizard.handleInput('\r');
86
- assert.match(render(), /Choose base strength/);
87
- assert.match(render(), /keeps base provider OpenAI/);
88
- wizard.handleInput('k'); // strong -> ultra
89
- wizard.handleInput('\r');
90
- // Create an explicit orchestrator override on this previously-inherited kind
91
- // by editing an orchestrator dimension; base must be left untouched.
92
- wizard.handleInput('l'); // column 2 = orch provider
93
- wizard.handleInput('l'); // column 3 = orch strength
94
- wizard.handleInput('\r');
95
- assert.match(render(), /Choose orchestrator strength/);
96
- assert.match(render(), /keeps orchestrator provider OpenAI/, 'orchestrator inherits the base provider until set');
97
- wizard.handleInput('j'); // ultra -> strong
98
- wizard.handleInput('\r');
99
- // A kind whose ONLY edit is an orchestrator dimension writes ONLY orchestratorModel.
100
- wizard.handleInput('j'); // explore (row 6), column 3
101
- wizard.handleInput('h'); // column 2 = orch provider
102
- wizard.handleInput('\r');
103
- assert.match(render(), /Choose orchestrator provider/);
104
- assert.match(render(), /keeps orchestrator strength strong/);
105
- wizard.handleInput('j'); // OpenAI
106
- wizard.handleInput('\r');
107
- // Editing an orchestrator dimension on a kind with an EXPLICIT built-in
108
- // orchestratorModel reads that override (not base) and preserves its provider.
109
- wizard.handleInput('j'); // developer (row 7), column 2
110
- wizard.handleInput('l'); // column 3 = orch strength
111
- wizard.handleInput('\r');
112
- assert.match(render(), /Choose orchestrator strength/);
113
- assert.match(render(), /keeps orchestrator provider Anthropic/, 'reads the explicit orchestrator override, not the base provider');
114
- wizard.handleInput('j'); // strong -> medium
115
- wizard.handleInput('\r');
116
- const raw = JSON.parse(readFileSync(join(home, '.crouter', 'config.json'), 'utf8'));
117
- assert.deepEqual(raw, {
118
- kinds: {
119
- general: { model: 'openai/ultra', orchestratorModel: 'openai/strong' },
120
- explore: { orchestratorModel: 'openai/strong' },
121
- developer: { orchestratorModel: 'anthropic/medium' },
122
- },
123
- });
124
- const launchOpts = { lifecycle: 'terminal', hasManager: true, cwd: home, profileId: null };
125
- const ladders = defaultModelLaddersConfig();
126
- assert.equal(buildLaunchSpec('general', 'base', launchOpts).launch.model, ladders.openai.ultra);
127
- assert.equal(buildLaunchSpec('general', 'orchestrator', launchOpts).launch.model, ladders.openai.strong);
128
- // explore's base was never written — it must still resolve to the built-in default.
129
- assert.equal(buildLaunchSpec('explore', 'base', launchOpts).launch.model, ladders.openai.light, 'orchestrator-only edit must not touch base');
130
- assert.equal(buildLaunchSpec('explore', 'orchestrator', launchOpts).launch.model, ladders.openai.strong);
131
- // developer's base was never written — still the built-in default; orch is the new override.
132
- assert.equal(buildLaunchSpec('developer', 'base', launchOpts).launch.model, ladders.openai.medium, 'editing developer orch must not touch its base');
133
- assert.equal(buildLaunchSpec('developer', 'orchestrator', launchOpts).launch.model, ladders.anthropic.medium);
134
- assert.equal(readFileSync(settingsPath, 'utf8'), settingsSentinel);
135
- // Scope selection is explicit and writes the chosen project config rather
136
- // than always falling back to user scope while displaying merged values.
137
- wizard.handleInput('s');
138
- assert.match(render(), /\[Project: project\]/);
139
- assert.match(render(), new RegExp(projectConfigDir.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')));
140
- wizard.handleInput('k'); // developer -> explore
141
- wizard.handleInput('h');
142
- wizard.handleInput('h');
143
- wizard.handleInput('h'); // base provider
144
- wizard.handleInput('\r');
145
- wizard.handleInput('k'); // OpenAI -> Anthropic
146
- wizard.handleInput('\r');
147
- assert.doesNotMatch(render(), /overridden by/);
148
- const projectRaw = JSON.parse(readFileSync(join(projectConfigDir, 'config.json'), 'utf8'));
149
- assert.deepEqual(projectRaw, { kinds: { explore: { model: 'anthropic/light' } } });
150
- }
151
- finally {
152
- wizard?.dispose();
153
- process.chdir(priorCwd);
154
- if (priorHome === undefined)
155
- delete process.env['HOME'];
156
- else
157
- process.env['HOME'] = priorHome;
158
- if (priorProvider === undefined)
159
- delete process.env['CRTR_MODEL_PROVIDER'];
160
- else
161
- process.env['CRTR_MODEL_PROVIDER'] = priorProvider;
162
- resetScopeCache();
163
- rmSync(home, { recursive: true, force: true });
164
- }
165
- });
166
- test('Models panel windows itself so a short terminal keeps the tab strip on screen', async () => {
167
- const home = mkdtempSync(join(tmpdir(), 'crtr-setup-models-short-'));
168
- const agentDir = join(home, 'agent');
169
- mkdirSync(agentDir, { recursive: true });
170
- mkdirSync(join(home, '.pi', 'agent'), { recursive: true });
171
- const priorHome = process.env['HOME'];
172
- const priorCwd = process.cwd();
173
- process.env['HOME'] = home;
174
- process.chdir(home);
175
- resetScopeCache();
176
- const rows = 24;
177
- let wizard;
178
- try {
179
- applyTheme({ cwd: priorCwd });
180
- const { runtime, registry } = await createSetupRuntime(agentDir);
181
- wizard = new SetupWizard(buildSetupManifest(), new Set(), [], stubTui, agentDir, runtime, registry, resolveKeybindings(undefined), undefined, () => rows);
182
- wizard.focused = true;
183
- for (let index = 0; index < 5; index += 1)
184
- wizard.handleInput('\t');
185
- const lines = wizard.render(140).map((line) => stripVTControlCharacters(line));
186
- assert.ok(lines.length <= rows, `models tab rendered ${lines.length} lines into a ${rows}-row terminal`);
187
- assert.match(lines[1] ?? '', /Models/, 'the tab strip must survive on a short terminal');
188
- // The selection must stay inside the window as it walks to the last kind row.
189
- for (let index = 0; index < 24; index += 1)
190
- wizard.handleInput('j');
191
- const scrolled = wizard.render(140).map((line) => stripVTControlCharacters(line));
192
- assert.ok(scrolled.length <= rows, `scrolled models tab rendered ${scrolled.length} lines`);
193
- assert.ok(scrolled.some((line) => line.includes('▶')), 'the selected row must stay within the viewport');
194
- }
195
- finally {
196
- wizard?.dispose();
197
- process.chdir(priorCwd);
198
- if (priorHome === undefined)
199
- delete process.env['HOME'];
200
- else
201
- process.env['HOME'] = priorHome;
202
- resetScopeCache();
203
- rmSync(home, { recursive: true, force: true });
204
- }
205
- });