@north-light/crouter 0.3.172 → 0.3.174

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (673) hide show
  1. package/bin/runtime-selector.mjs +8 -1
  2. package/dist/api/__tests__/{client.test.js → serial/client.test.js} +2 -135
  3. package/dist/api/client.d.ts +12 -21
  4. package/dist/api/client.js +22 -31
  5. package/dist/api/dto/broker-ops.d.ts +158 -0
  6. package/dist/api/dto/broker-ops.js +6 -0
  7. package/dist/api/dto/crons.d.ts +6 -0
  8. package/dist/api/dto/human.d.ts +7 -1
  9. package/dist/api/dto/inbox.d.ts +1 -71
  10. package/dist/api/dto/inbox.js +1 -9
  11. package/dist/api/dto/nodes.d.ts +6 -7
  12. package/dist/api/dto/reviews.d.ts +1 -11
  13. package/dist/api/routes.d.ts +7 -4
  14. package/dist/api/routes.js +8 -5
  15. package/dist/build-root.js +3 -3
  16. package/dist/builtin-memory/04-base-worker.md +1 -4
  17. package/dist/builtin-memory/05-kinds/advisor/00-base.md +1 -5
  18. package/dist/builtin-memory/05-kinds/advisor/01-orchestrator.md +2 -7
  19. package/dist/builtin-memory/05-kinds/design/00-base.md +1 -6
  20. package/dist/builtin-memory/05-kinds/developer/00-base.md +1 -6
  21. package/dist/builtin-memory/05-kinds/explore/00-base.md +1 -4
  22. package/dist/builtin-memory/05-kinds/explore/01-orchestrator.md +1 -2
  23. package/dist/builtin-memory/05-kinds/general/00-base.md +1 -3
  24. package/dist/builtin-memory/05-kinds/plan/00-base.md +1 -6
  25. package/dist/builtin-memory/05-kinds/plan/reviewers/00-base.md +1 -2
  26. package/dist/builtin-memory/05-kinds/plan/reviewers/architecture-fit.md +1 -3
  27. package/dist/builtin-memory/05-kinds/plan/reviewers/code-smells.md +1 -3
  28. package/dist/builtin-memory/05-kinds/plan/reviewers/pattern-consistency.md +1 -3
  29. package/dist/builtin-memory/05-kinds/plan/reviewers/requirements-coverage.md +1 -3
  30. package/dist/builtin-memory/05-kinds/plan/reviewers/security.md +1 -4
  31. package/dist/builtin-memory/05-kinds/review/companion/00-base.md +2 -3
  32. package/dist/builtin-memory/05-kinds/spec/00-base.md +1 -2
  33. package/dist/builtin-memory/advisor/council.md +1 -6
  34. package/dist/builtin-memory/design.md +2 -7
  35. package/dist/builtin-memory/development.md +9 -14
  36. package/dist/builtin-memory/internal/marketplaces.md +2 -6
  37. package/dist/builtin-memory/internal/nodes-and-canvas.md +1 -1
  38. package/dist/builtin-memory/internal/plugins.md +2 -8
  39. package/dist/builtin-memory/internal/storage-tiers.md +1 -2
  40. package/dist/builtin-memory/testing.md +41 -0
  41. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/__tests__/{provider-rotation.test.ts → serial/provider-rotation.test.ts} +106 -177
  42. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/claude-plugin-commands.ts +5 -15
  43. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/frontmatter-rules/index.ts +1 -28
  44. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/memory-slash-commands.ts +43 -88
  45. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/provider-rotation.js +55 -0
  46. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/provider-rotation.ts +60 -0
  47. package/dist/cli.js +2 -2
  48. package/dist/clients/attach/__tests__/attach-remote-readonly.test.js +37 -131
  49. package/dist/clients/attach/__tests__/chat-view-snapshot-ordering.test.js +71 -152
  50. package/dist/clients/attach/__tests__/context-message.test.js +16 -174
  51. package/dist/clients/attach/__tests__/crtr-output.test.js +36 -2069
  52. package/dist/clients/attach/__tests__/diagram.test.js +2 -2
  53. package/dist/clients/attach/__tests__/edit-diff.test.js +0 -4
  54. package/dist/clients/attach/__tests__/file-review-focus.test.js +2 -1
  55. package/dist/clients/attach/__tests__/group-activity.test.js +40 -229
  56. package/dist/clients/attach/__tests__/oauth-dialog-lifecycle.test.js +26 -76
  57. package/dist/clients/attach/__tests__/prompt-preview.test.js +4 -70
  58. package/dist/clients/attach/__tests__/ref-autocomplete.test.js +11 -125
  59. package/dist/clients/attach/__tests__/titled-editor-preview.test.js +14 -205
  60. package/dist/clients/attach/command.d.ts +2 -1
  61. package/dist/clients/attach/command.js +81 -76
  62. package/dist/clients/attach/input/capabilities.d.ts +27 -0
  63. package/dist/clients/attach/input/capabilities.js +96 -0
  64. package/dist/clients/attach/input/controller.d.ts +20 -182
  65. package/dist/clients/attach/input/controller.js +128 -537
  66. package/dist/clients/attach/input/overlay-owner.d.ts +41 -0
  67. package/dist/clients/attach/input/overlay-owner.js +199 -0
  68. package/dist/clients/attach/overlays/file-review.d.ts +0 -4
  69. package/dist/clients/attach/overlays/file-review.js +13 -5
  70. package/dist/clients/attach/overlays/graph.js +2 -10
  71. package/dist/clients/attach/render/chat-view.d.ts +4 -3
  72. package/dist/clients/attach/render/chat-view.js +39 -33
  73. package/dist/clients/attach/render/group-activity.d.ts +1 -0
  74. package/dist/clients/attach/render/group-activity.js +20 -13
  75. package/dist/clients/attach/render/group-recap.js +12 -3
  76. package/dist/clients/attach/session/connection.js +9 -15
  77. package/dist/clients/attach/session/editor-inventory.d.ts +6 -5
  78. package/dist/clients/attach/session/editor-inventory.js +7 -8
  79. package/dist/clients/attach/session/file-links.d.ts +13 -0
  80. package/dist/clients/attach/session/file-links.js +107 -0
  81. package/dist/clients/attach/session/frame.d.ts +3 -0
  82. package/dist/clients/attach/session/frame.js +10 -1
  83. package/dist/clients/attach/session/frames.js +2 -3
  84. package/dist/clients/attach/session/input-wiring.d.ts +4 -1
  85. package/dist/clients/attach/session/input-wiring.js +15 -14
  86. package/dist/clients/attach/session/mouse.d.ts +6 -1
  87. package/dist/clients/attach/session/mouse.js +8 -5
  88. package/dist/clients/attach/session/profile-files.js +18 -12
  89. package/dist/clients/attach/session/reconnect.js +1 -1
  90. package/dist/clients/attach/session/state-sync.js +1 -2
  91. package/dist/clients/attach/session/surface-host.d.ts +3 -2
  92. package/dist/clients/attach/session/surface-host.js +4 -4
  93. package/dist/clients/attach/slash/dispatch.d.ts +8 -31
  94. package/dist/clients/attach/slash/dispatch.js +34 -81
  95. package/dist/clients/attach/viewer.js +820 -860
  96. package/dist/clients/conversation/projection.d.ts +79 -0
  97. package/dist/clients/conversation/projection.js +341 -0
  98. package/dist/clients/inbox/__tests__/serial/inbox-controller.test.js +159 -0
  99. package/dist/clients/inbox/__tests__/serial/mount-panel.test.js +151 -0
  100. package/dist/clients/inbox/controller.d.ts +0 -4
  101. package/dist/clients/inbox/controller.js +0 -2
  102. package/dist/clients/inbox/review/__tests__/review-core.test.js +4 -293
  103. package/dist/clients/inbox/review/__tests__/teardown-notice.test.js +100 -0
  104. package/dist/clients/inbox/review/comments-client.d.ts +3 -2
  105. package/dist/clients/inbox/review/comments-client.js +12 -12
  106. package/dist/clients/inbox/review/companion-pane.d.ts +30 -0
  107. package/dist/clients/inbox/review/companion-pane.js +86 -0
  108. package/dist/clients/inbox/review/document-surface.d.ts +182 -0
  109. package/dist/clients/inbox/review/{document-region.js → document-surface.js} +252 -48
  110. package/dist/clients/inbox/review/frame.js +5 -4
  111. package/dist/clients/inbox/review/launch.d.ts +8 -8
  112. package/dist/clients/inbox/review/launch.js +52 -92
  113. package/dist/clients/inbox/review/nvim.d.ts +2 -0
  114. package/dist/clients/inbox/review/nvim.js +14 -12
  115. package/dist/clients/inbox/review/review-client.d.ts +12 -8
  116. package/dist/clients/inbox/review/review-client.js +46 -35
  117. package/dist/clients/inbox/review-adapter.d.ts +3 -10
  118. package/dist/clients/inbox/review-adapter.js +27 -19
  119. package/dist/clients/inbox/surface.d.ts +0 -4
  120. package/dist/clients/inbox/surface.js +0 -2
  121. package/dist/clients/surfaces/host.d.ts +11 -3
  122. package/dist/commands/__tests__/api-client-cold-start-diagnostic.test.js +7 -34
  123. package/dist/commands/__tests__/human.test.js +11 -322
  124. package/dist/commands/api-client.d.ts +5 -5
  125. package/dist/commands/api-client.js +6 -85
  126. package/dist/commands/canvas-browse.js +3 -29
  127. package/dist/commands/canvas-config.js +1 -1
  128. package/dist/commands/canvas-use.js +3 -3
  129. package/dist/commands/canvas.js +1 -1
  130. package/dist/commands/cron.js +5 -1
  131. package/dist/commands/human/queue.d.ts +0 -4
  132. package/dist/commands/human/queue.js +7 -40
  133. package/dist/commands/memory/list.d.ts +14 -0
  134. package/dist/commands/memory/list.js +35 -31
  135. package/dist/commands/memory/read.d.ts +7 -0
  136. package/dist/commands/memory/read.js +14 -8
  137. package/dist/commands/node/bash.d.ts +1 -0
  138. package/dist/commands/node/bash.js +198 -0
  139. package/dist/commands/node/create.d.ts +23 -0
  140. package/dist/commands/node/create.js +207 -0
  141. package/dist/commands/node/inspect.d.ts +2 -0
  142. package/dist/commands/node/inspect.js +302 -0
  143. package/dist/commands/node/lifecycle.d.ts +4 -0
  144. package/dist/commands/node/lifecycle.js +415 -0
  145. package/dist/commands/node/message.d.ts +1 -0
  146. package/dist/commands/node/message.js +164 -0
  147. package/dist/commands/node/pyramid.d.ts +2 -0
  148. package/dist/commands/node/pyramid.js +79 -0
  149. package/dist/commands/node/subscription.d.ts +1 -0
  150. package/dist/commands/node/subscription.js +82 -0
  151. package/dist/commands/node/wait.d.ts +1 -0
  152. package/dist/commands/node/wait.js +159 -0
  153. package/dist/commands/node-lifecycle-revive.js +10 -57
  154. package/dist/commands/node.d.ts +0 -42
  155. package/dist/commands/node.js +11 -2065
  156. package/dist/commands/search.js +1 -1
  157. package/dist/commands/surface/node/cycle.d.ts +1 -0
  158. package/dist/commands/surface/node/cycle.js +83 -0
  159. package/dist/commands/surface/node/focus.d.ts +1 -0
  160. package/dist/commands/surface/node/focus.js +67 -0
  161. package/dist/commands/surface/node/id.d.ts +1 -0
  162. package/dist/commands/surface/node/id.js +38 -0
  163. package/dist/commands/surface/node/pin.d.ts +1 -0
  164. package/dist/commands/surface/node/pin.js +42 -0
  165. package/dist/commands/surface/node/placement.d.ts +46 -0
  166. package/dist/commands/surface/node/placement.js +124 -0
  167. package/dist/commands/surface-node.js +4 -1
  168. package/dist/commands/surface-reload.js +1 -2
  169. package/dist/commands/surface-tmux-spread.js +1 -1
  170. package/dist/commands/surface.js +5 -20
  171. package/dist/commands/sys/__tests__/setup-core.test.js +18 -271
  172. package/dist/commands/sys/config.js +6 -6
  173. package/dist/commands/sys/logs.js +1 -1
  174. package/dist/commands/sys/panels/broker-limits-panel.d.ts +17 -0
  175. package/dist/commands/sys/panels/broker-limits-panel.js +104 -0
  176. package/dist/commands/sys/panels/dependencies-panel.d.ts +14 -0
  177. package/dist/commands/sys/panels/dependencies-panel.js +80 -0
  178. package/dist/commands/sys/panels/keybindings-panel.d.ts +56 -0
  179. package/dist/commands/sys/panels/keybindings-panel.js +703 -0
  180. package/dist/commands/sys/panels/keys-panel.d.ts +16 -0
  181. package/dist/commands/sys/panels/keys-panel.js +60 -0
  182. package/dist/commands/sys/panels/models-panel.d.ts +77 -0
  183. package/dist/commands/sys/panels/models-panel.js +647 -0
  184. package/dist/commands/sys/panels/panel.d.ts +45 -0
  185. package/dist/commands/sys/panels/panel.js +137 -0
  186. package/dist/commands/sys/panels/plugins-panel.d.ts +16 -0
  187. package/dist/commands/sys/panels/plugins-panel.js +80 -0
  188. package/dist/commands/sys/panels/prefs-panel.d.ts +21 -0
  189. package/dist/commands/sys/panels/prefs-panel.js +85 -0
  190. package/dist/commands/sys/panels/provider-panel.d.ts +62 -0
  191. package/dist/commands/sys/panels/provider-panel.js +538 -0
  192. package/dist/commands/sys/settings-shell.d.ts +55 -0
  193. package/dist/commands/sys/settings-shell.js +400 -0
  194. package/dist/commands/sys/settings.d.ts +2 -0
  195. package/dist/commands/sys/settings.js +31 -0
  196. package/dist/commands/sys/setup-core.d.ts +3 -33
  197. package/dist/commands/sys/setup-core.js +27 -78
  198. package/dist/commands/sys/setup-settings-runner.d.ts +24 -0
  199. package/dist/commands/sys/setup-settings-runner.js +63 -0
  200. package/dist/commands/sys/setup-wizard.d.ts +26 -125
  201. package/dist/commands/sys/setup-wizard.js +209 -2473
  202. package/dist/commands/sys/setup.js +5 -7
  203. package/dist/commands/sys.js +3 -2
  204. package/dist/core/__tests__/broker-extension-canvas-db-boundary.test.js +50 -0
  205. package/dist/core/__tests__/broker-launch-candidates.test.js +20 -9
  206. package/dist/core/__tests__/broker-preflight.test.js +1 -1
  207. package/dist/core/__tests__/canvas-inbox-watcher-hold.test.js +108 -27
  208. package/dist/core/__tests__/canvas-inbox-watcher.test.js +14 -0
  209. package/dist/core/__tests__/canvas.test.js +2 -36
  210. package/dist/core/__tests__/close.test.js +14 -3
  211. package/dist/core/__tests__/context-intro.test.js +32 -143
  212. package/dist/core/__tests__/cron-broker-capacity.test.js +22 -3
  213. package/dist/core/__tests__/daemon-boot.test.js +2 -20
  214. package/dist/core/__tests__/daemon-wedge.test.js +1 -1
  215. package/dist/core/__tests__/dead-node-policy-table.test.js +1 -18
  216. package/dist/core/__tests__/fixtures/fake-engine.d.ts +1 -1
  217. package/dist/core/__tests__/fixtures/fake-engine.js +2 -2
  218. package/dist/core/__tests__/fixtures/fake-pi-host.js +2 -2
  219. package/dist/core/__tests__/focuses.test.js +4 -98
  220. package/dist/core/__tests__/helpers/broker-clients.d.ts +0 -3
  221. package/dist/core/__tests__/helpers/broker-clients.js +0 -14
  222. package/dist/core/__tests__/helpers/harness.d.ts +0 -8
  223. package/dist/core/__tests__/helpers/harness.js +7 -87
  224. package/dist/core/__tests__/helpers/viewer-panes.js +1 -1
  225. package/dist/core/__tests__/inline-memory-refs.test.js +5 -134
  226. package/dist/core/__tests__/kickoff.test.js +1 -1
  227. package/dist/core/__tests__/memory-resolver-precedence.test.js +29 -1
  228. package/dist/core/__tests__/migration.test.js +35 -48
  229. package/dist/core/__tests__/on-read-dedup-resume.test.js +22 -12
  230. package/dist/core/__tests__/passive-subscription.test.js +26 -49
  231. package/dist/core/__tests__/preview-registry-sync.test.js +1 -2
  232. package/dist/core/__tests__/prune.test.js +94 -1
  233. package/dist/core/__tests__/review-model-floor.test.js +0 -32
  234. package/dist/core/__tests__/seam/broker-attach-multiclient.test.js +255 -0
  235. package/dist/core/__tests__/{full → seam}/broker-attach-stream.test.js +39 -7
  236. package/dist/core/__tests__/{full → seam}/broker-crash-teardown.test.js +30 -29
  237. package/dist/core/__tests__/{full → seam}/broker-pane-resolution.test.js +54 -5
  238. package/dist/core/__tests__/{full → seam}/broker-provider-retry.test.js +134 -82
  239. package/dist/core/__tests__/{full → seam}/broker-whip-interrupt.test.js +15 -4
  240. package/dist/core/__tests__/{full/idle-release-settlement.test.js → seam/dormancy-release.test.js} +69 -17
  241. package/dist/core/__tests__/{full/yield-message-transaction.test.js → seam/yield-refresh-transaction.test.js} +31 -9
  242. package/dist/core/__tests__/secrets.test.js +1 -7
  243. package/dist/core/__tests__/{broker-fork-seam.test.js → serial/broker-fork-seam.test.js} +58 -7
  244. package/dist/core/__tests__/{broker-sdk-wiring.test.js → serial/broker-sdk-wiring.test.js} +18 -162
  245. package/dist/core/__tests__/{broker-snapshot-history.test.js → serial/broker-snapshot-history.test.js} +9 -9
  246. package/dist/core/__tests__/{command-plugins.test.js → serial/command-plugins.test.js} +105 -15
  247. package/dist/core/__tests__/{deferred-no-wake.test.js → serial/deferred-no-wake.test.js} +23 -20
  248. package/dist/core/__tests__/{flagship-lifecycle.test.js → serial/flagship-lifecycle.test.js} +7 -7
  249. package/dist/core/__tests__/{host-teardown-process-group.test.js → serial/host-teardown-process-group.test.js} +6 -6
  250. package/dist/core/__tests__/{human-deliver-e2e.test.js → serial/human-deliver-e2e.test.js} +12 -12
  251. package/dist/core/__tests__/{live-mutation.test.js → serial/live-mutation.test.js} +5 -5
  252. package/dist/core/__tests__/{refresh-stall-recycle.test.js → serial/refresh-stall-recycle.test.js} +5 -14
  253. package/dist/core/__tests__/{revive.test.js → serial/revive.test.js} +15 -100
  254. package/dist/core/__tests__/{spawn-root.test.js → serial/spawn-root.test.js} +32 -15
  255. package/dist/core/__tests__/serial/subscription-delivery.test.js +126 -0
  256. package/dist/core/__tests__/serial/tmux-surface.test.js +256 -0
  257. package/dist/core/__tests__/{worktree.test.js → serial/worktree.test.js} +15 -15
  258. package/dist/core/__tests__/session-model.test.js +0 -18
  259. package/dist/core/__tests__/spawn-worktree-id-conflict.test.js +9 -0
  260. package/dist/core/__tests__/watchdog-abort-arms-retry.test.js +50 -0
  261. package/dist/core/broker-client/__tests__/transport-relay.test.js +15 -16
  262. package/dist/core/broker-client/__tests__/transport-socket.test.js +28 -0
  263. package/dist/core/broker-client/client.d.ts +2 -2
  264. package/dist/core/broker-client/client.js +4 -7
  265. package/dist/core/broker-client/transport-relay.d.ts +13 -19
  266. package/dist/core/broker-client/transport-relay.js +19 -34
  267. package/dist/core/broker-client/transport-socket.d.ts +2 -2
  268. package/dist/core/broker-client/transport-socket.js +9 -2
  269. package/dist/core/broker-client/transport.d.ts +7 -3
  270. package/dist/core/broker-client/transport.js +4 -4
  271. package/dist/core/canvas/__tests__/attention.test.js +1 -18
  272. package/dist/core/canvas/__tests__/remote-canvas-source.test.js +7 -64
  273. package/dist/core/canvas/__tests__/remote-transport.test.js +2 -3
  274. package/dist/core/canvas/__tests__/render-remote.test.js +7 -52
  275. package/dist/core/canvas/browse/app.d.ts +2 -17
  276. package/dist/core/canvas/browse/app.js +16 -88
  277. package/dist/core/canvas/browse/model.d.ts +0 -4
  278. package/dist/core/canvas/browse/model.js +1 -12
  279. package/dist/core/canvas/browse/render.js +6 -3
  280. package/dist/core/canvas/crons.d.ts +8 -5
  281. package/dist/core/canvas/crons.js +7 -6
  282. package/dist/core/canvas/extensions.d.ts +7 -3
  283. package/dist/core/canvas/extensions.js +16 -4
  284. package/dist/core/canvas/nav-model.d.ts +0 -4
  285. package/dist/core/canvas/nav-model.js +2 -14
  286. package/dist/core/canvas/node-order.d.ts +3 -0
  287. package/dist/core/canvas/node-order.js +12 -0
  288. package/dist/core/canvas/remote-canvas-source.d.ts +3 -6
  289. package/dist/core/canvas/remote-canvas-source.js +8 -15
  290. package/dist/core/command.js +11 -4
  291. package/dist/core/config.js +3 -1
  292. package/dist/core/events/envelope.js +1 -1
  293. package/dist/core/events/read.js +7 -21
  294. package/dist/core/events/source.d.ts +0 -2
  295. package/dist/core/events/source.js +0 -16
  296. package/dist/core/events/types.d.ts +1 -1
  297. package/dist/core/fault-classifier.d.ts +1 -1
  298. package/dist/core/feed/passive.d.ts +0 -11
  299. package/dist/core/feed/passive.js +1 -62
  300. package/dist/core/human/__tests__/{inbox-core.test.js → serial/inbox-core.test.js} +6 -6
  301. package/dist/core/keybindings/__tests__/resolve.test.js +1 -96
  302. package/dist/core/keybindings/background-bash.js +3 -4
  303. package/dist/core/keybindings/catalog.js +1 -1
  304. package/dist/core/memory/inline-ref-grammar.js +3 -3
  305. package/dist/core/memory-resolver.d.ts +11 -25
  306. package/dist/core/memory-resolver.js +51 -33
  307. package/dist/core/model-routes.d.ts +15 -0
  308. package/dist/core/model-routes.js +12 -0
  309. package/dist/core/pool-credential-store.js +1 -1
  310. package/dist/core/preview-registry.js +8 -9
  311. package/dist/core/profiles/__tests__/root-profile.test.js +4 -14
  312. package/dist/core/review/realize.d.ts +0 -13
  313. package/dist/core/review/realize.js +0 -40
  314. package/dist/core/review/types.d.ts +1 -1
  315. package/dist/core/runtime/__tests__/engine-route.test.js +2 -2
  316. package/dist/core/runtime/bearings.js +1 -11
  317. package/dist/core/runtime/broker/client-registry.d.ts +33 -0
  318. package/dist/core/runtime/broker/client-registry.js +164 -0
  319. package/dist/core/runtime/broker/daemon-ops.d.ts +19 -0
  320. package/dist/core/runtime/broker/daemon-ops.js +49 -0
  321. package/dist/core/runtime/broker/event-projection.d.ts +42 -0
  322. package/dist/core/runtime/broker/event-projection.js +178 -0
  323. package/dist/core/runtime/broker/fault-retry.d.ts +39 -0
  324. package/dist/core/runtime/broker/fault-retry.js +277 -0
  325. package/dist/core/runtime/broker/frame-dispatch.d.ts +238 -0
  326. package/dist/core/runtime/broker/frame-dispatch.js +1537 -0
  327. package/dist/core/runtime/broker/inbox.d.ts +22 -0
  328. package/dist/core/runtime/broker/inbox.js +167 -0
  329. package/dist/core/runtime/broker/passive.d.ts +16 -0
  330. package/dist/core/runtime/broker/passive.js +44 -0
  331. package/dist/core/runtime/broker/read-ops.d.ts +23 -0
  332. package/dist/core/runtime/broker/read-ops.js +150 -0
  333. package/dist/core/runtime/broker/rebind.d.ts +74 -0
  334. package/dist/core/runtime/broker/rebind.js +211 -0
  335. package/dist/core/runtime/broker/tool-groups.d.ts +39 -0
  336. package/dist/core/runtime/broker/tool-groups.js +244 -0
  337. package/dist/core/runtime/broker-extension-render.d.ts +11 -0
  338. package/dist/core/runtime/broker-extension-render.js +181 -0
  339. package/dist/core/runtime/broker-persona-guidance.d.ts +13 -0
  340. package/dist/core/runtime/broker-persona-guidance.js +58 -0
  341. package/dist/core/runtime/broker-protocol.d.ts +1 -1
  342. package/dist/core/runtime/broker-protocol.js +1 -1
  343. package/dist/core/runtime/broker.d.ts +5 -196
  344. package/dist/core/runtime/broker.js +276 -3059
  345. package/dist/core/runtime/canvas-extensions.js +11 -2
  346. package/dist/core/runtime/fault.js +1 -1
  347. package/dist/core/runtime/model-selection.d.ts +9 -0
  348. package/dist/core/runtime/model-selection.js +12 -0
  349. package/dist/core/runtime/model-swap.d.ts +3 -3
  350. package/dist/core/runtime/model-swap.js +33 -25
  351. package/dist/core/runtime/placement-tmux.d.ts +3 -14
  352. package/dist/core/runtime/placement-tmux.js +11 -80
  353. package/dist/core/runtime/placement.d.ts +4 -2
  354. package/dist/core/runtime/placement.js +7 -12
  355. package/dist/core/runtime/promote.d.ts +14 -1
  356. package/dist/core/runtime/promote.js +1 -1
  357. package/dist/core/runtime/reset.d.ts +1 -1
  358. package/dist/core/runtime/roadmap.js +1 -1
  359. package/dist/core/runtime/spawn.d.ts +8 -0
  360. package/dist/core/runtime/spawn.js +36 -6
  361. package/dist/core/runtime/stop-guard.d.ts +4 -3
  362. package/dist/core/runtime/stop-guard.js +36 -18
  363. package/dist/core/runtime/stop-signals.d.ts +4 -1
  364. package/dist/core/runtime/stream-watchdog.js +4 -5
  365. package/dist/core/runtime/structured-output.d.ts +15 -2
  366. package/dist/core/runtime/structured-output.js +35 -12
  367. package/dist/core/runtime/tmux-bindings.d.ts +25 -0
  368. package/dist/core/runtime/tmux-bindings.js +682 -0
  369. package/dist/core/runtime/tmux-chrome.d.ts +2 -1
  370. package/dist/core/runtime/tmux-chrome.js +3 -2
  371. package/dist/core/runtime/{tmux.d.ts → tmux-driver.d.ts} +18 -26
  372. package/dist/core/runtime/tmux-driver.js +598 -0
  373. package/dist/core/runtime/view-socket.d.ts +14 -0
  374. package/dist/core/runtime/view-socket.js +83 -0
  375. package/dist/core/session-model/session-state.d.ts +1 -2
  376. package/dist/core/session-model/session-state.js +5 -8
  377. package/dist/core/spawn.d.ts +1 -1
  378. package/dist/core/spawn.js +2 -2
  379. package/dist/core/substrate/gate.d.ts +1 -1
  380. package/dist/core/substrate/on-read-pure.d.ts +7 -0
  381. package/dist/core/substrate/on-read-pure.js +272 -0
  382. package/dist/core/termrender/termrender.js +32 -2
  383. package/dist/core/user-settings.d.ts +23 -1
  384. package/dist/core/user-settings.js +18 -1
  385. package/dist/daemon/api/__tests__/node-model-validation.test.js +134 -0
  386. package/dist/daemon/api/__tests__/review-terminal-conflict.test.js +98 -0
  387. package/dist/daemon/api/__tests__/{full → seam}/api-server.test.js +6 -48
  388. package/dist/daemon/api/__tests__/{full → seam}/b10-attach-modelauth.test.js +17 -44
  389. package/dist/daemon/api/__tests__/{full/push-parity.test.js → seam/leaf-api-parity.test.js} +61 -42
  390. package/dist/daemon/api/bridge.js +40 -81
  391. package/dist/daemon/api/handlers/broker-ops.d.ts +2 -0
  392. package/dist/daemon/api/handlers/broker-ops.js +383 -0
  393. package/dist/daemon/api/handlers/crons.js +9 -4
  394. package/dist/daemon/api/handlers/files.js +6 -7
  395. package/dist/daemon/api/handlers/inbox.js +2 -340
  396. package/dist/daemon/api/handlers/nodes.d.ts +10 -1
  397. package/dist/daemon/api/handlers/nodes.js +74 -39
  398. package/dist/daemon/api/handlers/review-comments.js +5 -1
  399. package/dist/daemon/api/handlers/reviews.js +0 -19
  400. package/dist/daemon/api/map.js +25 -4
  401. package/dist/daemon/api/router.js +2 -3
  402. package/dist/daemon/api/server.js +5 -7
  403. package/dist/daemon/cron-run.d.ts +4 -0
  404. package/dist/daemon/cron-run.js +30 -13
  405. package/dist/daemon/crtrd.d.ts +3 -58
  406. package/dist/daemon/crtrd.js +28 -1244
  407. package/dist/daemon/manage.js +0 -1
  408. package/dist/daemon/reconcilers/broker-supervision.d.ts +50 -0
  409. package/dist/daemon/reconcilers/broker-supervision.js +549 -0
  410. package/dist/daemon/reconcilers/cron-lane.d.ts +10 -0
  411. package/dist/daemon/reconcilers/cron-lane.js +32 -0
  412. package/dist/daemon/reconcilers/dormant-inbox.d.ts +18 -0
  413. package/dist/daemon/reconcilers/dormant-inbox.js +143 -0
  414. package/dist/daemon/reconcilers/storage-maintenance.d.ts +22 -0
  415. package/dist/daemon/reconcilers/storage-maintenance.js +213 -0
  416. package/dist/daemon/review/finish.js +2 -5
  417. package/dist/pi-extensions/__tests__/canvas-context-intro.test.js +34 -53
  418. package/dist/pi-extensions/__tests__/canvas-recap.test.js +16 -113
  419. package/dist/pi-extensions/__tests__/canvas-stophook-agentend.test.js +72 -99
  420. package/dist/pi-extensions/__tests__/canvas-stophook-context-nudge.test.js +29 -12
  421. package/dist/pi-extensions/broker-local.d.ts +20 -0
  422. package/dist/pi-extensions/broker-local.js +89 -0
  423. package/dist/pi-extensions/canvas-context-intro.d.ts +3 -3
  424. package/dist/pi-extensions/canvas-context-intro.js +22 -11
  425. package/dist/pi-extensions/canvas-doc-substrate.js +17 -34
  426. package/dist/pi-extensions/canvas-goal-capture.js +7 -12
  427. package/dist/pi-extensions/canvas-inbox-watcher.js +124 -139
  428. package/dist/pi-extensions/canvas-passive-context.d.ts +3 -3
  429. package/dist/pi-extensions/canvas-passive-context.js +22 -18
  430. package/dist/pi-extensions/canvas-recap.d.ts +2 -2
  431. package/dist/pi-extensions/canvas-recap.js +48 -21
  432. package/dist/pi-extensions/canvas-review-boundary.js +10 -4
  433. package/dist/pi-extensions/canvas-stophook.d.ts +0 -5
  434. package/dist/pi-extensions/canvas-stophook.js +149 -431
  435. package/dist/pi-extensions/canvas-structured-output.js +52 -30
  436. package/dist/pi-extensions/envelope-merge.d.ts +13 -0
  437. package/dist/pi-extensions/envelope-merge.js +29 -0
  438. package/dist/shared/working-activity.d.ts +3 -2
  439. package/dist/shared/working-activity.js +3 -2
  440. package/dist/types.d.ts +6 -5
  441. package/dist/types.js +2 -2
  442. package/docs/compat/hearth-crtr-v1.md +4 -12
  443. package/docs/compat/hearth-crtr-v2.md +3 -11
  444. package/docs/compat/hearth-crtr-v3.md +4 -12
  445. package/docs/compat/hearth-crtr-v4.md +3 -11
  446. package/docs/compat/hearth-crtr-v5.md +3 -11
  447. package/docs/public-api.md +3 -7
  448. package/package.json +7 -49
  449. package/runtime.lock.json +2766 -14533
  450. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/__tests__/claude-plugin-commands.test.ts +0 -49
  451. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/__tests__/memory-slash-commands.test.ts +0 -194
  452. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/__tests__/statusline.test.ts +0 -68
  453. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/frontmatter-rules/test.ts +0 -119
  454. package/dist/clients/attach/__tests__/attach-chrome-remote.test.js +0 -439
  455. package/dist/clients/attach/__tests__/attach-keybindings.test.js +0 -170
  456. package/dist/clients/attach/__tests__/crtr-output-coverage.test.js +0 -57
  457. package/dist/clients/attach/__tests__/editor-frame-title.test.js +0 -19
  458. package/dist/clients/attach/__tests__/input-controller-extension-command.test.js +0 -32
  459. package/dist/clients/attach/__tests__/markdown-headings.test.js +0 -35
  460. package/dist/clients/attach/__tests__/session-identity-refresh.test.js +0 -32
  461. package/dist/clients/conversation/conversation.d.ts +0 -65
  462. package/dist/clients/conversation/conversation.js +0 -318
  463. package/dist/clients/conversation/frames.d.ts +0 -30
  464. package/dist/clients/conversation/frames.js +0 -52
  465. package/dist/clients/conversation/region.d.ts +0 -51
  466. package/dist/clients/conversation/region.js +0 -265
  467. package/dist/clients/inbox/__tests__/inbox-controller.test.js +0 -247
  468. package/dist/clients/inbox/__tests__/mount-panel.test.js +0 -776
  469. package/dist/clients/inbox/review/__tests__/remap.test.js +0 -196
  470. package/dist/clients/inbox/review/columns.d.ts +0 -22
  471. package/dist/clients/inbox/review/columns.js +0 -40
  472. package/dist/clients/inbox/review/composition.d.ts +0 -60
  473. package/dist/clients/inbox/review/composition.js +0 -278
  474. package/dist/clients/inbox/review/document-region.d.ts +0 -120
  475. package/dist/clients/surfaces/region.d.ts +0 -16
  476. package/dist/clients/web/__tests__/push-engine.test.js +0 -158
  477. package/dist/clients/web/__tests__/push-registry.test.d.ts +0 -1
  478. package/dist/clients/web/__tests__/push-registry.test.js +0 -177
  479. package/dist/clients/web/dev-server.d.ts +0 -7
  480. package/dist/clients/web/dev-server.js +0 -46
  481. package/dist/clients/web/events.d.ts +0 -19
  482. package/dist/clients/web/events.js +0 -163
  483. package/dist/clients/web/push-engine.d.ts +0 -44
  484. package/dist/clients/web/push-engine.js +0 -125
  485. package/dist/clients/web/push-registry.d.ts +0 -85
  486. package/dist/clients/web/push-registry.js +0 -373
  487. package/dist/clients/web/server.d.ts +0 -19
  488. package/dist/clients/web/server.js +0 -661
  489. package/dist/clients/web/web-client/shared/protocol.d.ts +0 -214
  490. package/dist/clients/web/web-client/shared/protocol.js +0 -8
  491. package/dist/clients/web/web-cmd.d.ts +0 -2
  492. package/dist/clients/web/web-cmd.js +0 -141
  493. package/dist/commands/__tests__/api-canvas-source.test.d.ts +0 -1
  494. package/dist/commands/__tests__/api-canvas-source.test.js +0 -37
  495. package/dist/commands/__tests__/canvas-config.test.d.ts +0 -1
  496. package/dist/commands/__tests__/canvas-config.test.js +0 -107
  497. package/dist/commands/__tests__/node-no-kickoff-flag.test.d.ts +0 -1
  498. package/dist/commands/__tests__/node-no-kickoff-flag.test.js +0 -73
  499. package/dist/commands/__tests__/node-worktree-flag.test.d.ts +0 -1
  500. package/dist/commands/__tests__/node-worktree-flag.test.js +0 -49
  501. package/dist/commands/__tests__/search-contents.test.d.ts +0 -1
  502. package/dist/commands/__tests__/search-contents.test.js +0 -52
  503. package/dist/commands/memory/__tests__/lint.test.d.ts +0 -1
  504. package/dist/commands/memory/__tests__/lint.test.js +0 -15
  505. package/dist/commands/sys/__tests__/config-broker-thresholds.test.d.ts +0 -1
  506. package/dist/commands/sys/__tests__/config-broker-thresholds.test.js +0 -95
  507. package/dist/commands/sys/__tests__/config-keybindings.test.d.ts +0 -1
  508. package/dist/commands/sys/__tests__/config-keybindings.test.js +0 -55
  509. package/dist/commands/sys/__tests__/helpers/setup-runtime.d.ts +0 -5
  510. package/dist/commands/sys/__tests__/helpers/setup-runtime.js +0 -19
  511. package/dist/commands/sys/__tests__/setup-front-door.test.d.ts +0 -1
  512. package/dist/commands/sys/__tests__/setup-front-door.test.js +0 -102
  513. package/dist/commands/sys/__tests__/setup-models.test.d.ts +0 -1
  514. package/dist/commands/sys/__tests__/setup-models.test.js +0 -205
  515. package/dist/commands/sys/__tests__/setup-providers-viewport.test.d.ts +0 -1
  516. package/dist/commands/sys/__tests__/setup-providers-viewport.test.js +0 -155
  517. package/dist/commands/sys/__tests__/sync-deps.test.d.ts +0 -1
  518. package/dist/commands/sys/__tests__/sync-deps.test.js +0 -179
  519. package/dist/commands/sys/__tests__/sync-import.test.d.ts +0 -1
  520. package/dist/commands/sys/__tests__/sync-import.test.js +0 -315
  521. package/dist/core/__tests__/base-worker-prompt.test.d.ts +0 -1
  522. package/dist/core/__tests__/base-worker-prompt.test.js +0 -57
  523. package/dist/core/__tests__/command-plugins-surfaces.test.d.ts +0 -1
  524. package/dist/core/__tests__/command-plugins-surfaces.test.js +0 -359
  525. package/dist/core/__tests__/connection-reconnect-resume.test.d.ts +0 -1
  526. package/dist/core/__tests__/connection-reconnect-resume.test.js +0 -36
  527. package/dist/core/__tests__/finalization-migration.test.d.ts +0 -1
  528. package/dist/core/__tests__/finalization-migration.test.js +0 -38
  529. package/dist/core/__tests__/fixtures/extra-extension.d.ts +0 -1
  530. package/dist/core/__tests__/fixtures/extra-extension.js +0 -3
  531. package/dist/core/__tests__/fixtures/spawn-proof-target.test.d.ts +0 -1
  532. package/dist/core/__tests__/fixtures/spawn-proof-target.test.js +0 -15
  533. package/dist/core/__tests__/fork.test.d.ts +0 -1
  534. package/dist/core/__tests__/fork.test.js +0 -108
  535. package/dist/core/__tests__/full/broker-attach-limits.test.d.ts +0 -1
  536. package/dist/core/__tests__/full/broker-attach-limits.test.js +0 -147
  537. package/dist/core/__tests__/full/broker-deliver-ack.test.d.ts +0 -1
  538. package/dist/core/__tests__/full/broker-deliver-ack.test.js +0 -73
  539. package/dist/core/__tests__/full/broker-dialogs.test.d.ts +0 -1
  540. package/dist/core/__tests__/full/broker-dialogs.test.js +0 -180
  541. package/dist/core/__tests__/full/broker-display-snapshot.test.d.ts +0 -1
  542. package/dist/core/__tests__/full/broker-display-snapshot.test.js +0 -75
  543. package/dist/core/__tests__/full/broker-dormant-wake.test.d.ts +0 -1
  544. package/dist/core/__tests__/full/broker-dormant-wake.test.js +0 -130
  545. package/dist/core/__tests__/full/broker-model-changed-broadcast.test.d.ts +0 -1
  546. package/dist/core/__tests__/full/broker-model-changed-broadcast.test.js +0 -57
  547. package/dist/core/__tests__/full/broker-navigate-tree-rewelcome.test.d.ts +0 -1
  548. package/dist/core/__tests__/full/broker-navigate-tree-rewelcome.test.js +0 -80
  549. package/dist/core/__tests__/full/cascade-close.test.d.ts +0 -1
  550. package/dist/core/__tests__/full/cascade-close.test.js +0 -240
  551. package/dist/core/__tests__/full/detach-focus.test.d.ts +0 -1
  552. package/dist/core/__tests__/full/detach-focus.test.js +0 -126
  553. package/dist/core/__tests__/full/idle-release-settlement.test.d.ts +0 -1
  554. package/dist/core/__tests__/full/issue-146-yield-spawn-focus.test.d.ts +0 -1
  555. package/dist/core/__tests__/full/issue-146-yield-spawn-focus.test.js +0 -107
  556. package/dist/core/__tests__/full/park-clock-release.test.d.ts +0 -1
  557. package/dist/core/__tests__/full/park-clock-release.test.js +0 -56
  558. package/dist/core/__tests__/full/yield-message-transaction.test.d.ts +0 -1
  559. package/dist/core/__tests__/memory-index-render.test.d.ts +0 -1
  560. package/dist/core/__tests__/memory-index-render.test.js +0 -60
  561. package/dist/core/__tests__/model-routes.test.d.ts +0 -1
  562. package/dist/core/__tests__/model-routes.test.js +0 -41
  563. package/dist/core/__tests__/on-read-identity.test.d.ts +0 -1
  564. package/dist/core/__tests__/on-read-identity.test.js +0 -61
  565. package/dist/core/__tests__/phase4-review-migration.test.d.ts +0 -1
  566. package/dist/core/__tests__/phase4-review-migration.test.js +0 -100
  567. package/dist/core/__tests__/prune-to-limit.test.d.ts +0 -1
  568. package/dist/core/__tests__/prune-to-limit.test.js +0 -126
  569. package/dist/core/__tests__/reset.test.d.ts +0 -1
  570. package/dist/core/__tests__/reset.test.js +0 -69
  571. package/dist/core/__tests__/spawn-no-kickoff.test.d.ts +0 -1
  572. package/dist/core/__tests__/spawn-no-kickoff.test.js +0 -115
  573. package/dist/core/__tests__/steer-note.test.d.ts +0 -1
  574. package/dist/core/__tests__/steer-note.test.js +0 -41
  575. package/dist/core/__tests__/subcommand-tier.test.d.ts +0 -1
  576. package/dist/core/__tests__/subcommand-tier.test.js +0 -99
  577. package/dist/core/__tests__/subscription-delivery.test.js +0 -211
  578. package/dist/core/__tests__/test-runner-cheap-sharding.test.d.ts +0 -1
  579. package/dist/core/__tests__/test-runner-cheap-sharding.test.js +0 -97
  580. package/dist/core/__tests__/tmux-surface.test.js +0 -484
  581. package/dist/core/__tests__/wake-bearings.test.d.ts +0 -1
  582. package/dist/core/__tests__/wake-bearings.test.js +0 -102
  583. package/dist/core/canvas/__tests__/remote-event-stream.test.d.ts +0 -1
  584. package/dist/core/canvas/__tests__/remote-event-stream.test.js +0 -146
  585. package/dist/core/canvas/__tests__/source-resolve.test.d.ts +0 -1
  586. package/dist/core/canvas/__tests__/source-resolve.test.js +0 -77
  587. package/dist/core/canvas/browse/__tests__/model.test.d.ts +0 -1
  588. package/dist/core/canvas/browse/__tests__/model.test.js +0 -290
  589. package/dist/core/canvas/browse/__tests__/rebuild-coalescer.test.d.ts +0 -1
  590. package/dist/core/canvas/browse/__tests__/rebuild-coalescer.test.js +0 -134
  591. package/dist/core/canvas/browse/__tests__/render.test.d.ts +0 -1
  592. package/dist/core/canvas/browse/__tests__/render.test.js +0 -111
  593. package/dist/core/canvas/browse/rebuild-coalescer.d.ts +0 -7
  594. package/dist/core/canvas/browse/rebuild-coalescer.js +0 -61
  595. package/dist/core/canvas/remote-event-stream.d.ts +0 -24
  596. package/dist/core/canvas/remote-event-stream.js +0 -94
  597. package/dist/core/feed/__tests__/coalesce-human.test.d.ts +0 -1
  598. package/dist/core/feed/__tests__/coalesce-human.test.js +0 -36
  599. package/dist/core/feed/__tests__/empty-node-guard.test.d.ts +0 -1
  600. package/dist/core/feed/__tests__/empty-node-guard.test.js +0 -45
  601. package/dist/core/host-exports/__tests__/export-prunes-boot-skill.test.d.ts +0 -1
  602. package/dist/core/host-exports/__tests__/export-prunes-boot-skill.test.js +0 -84
  603. package/dist/core/human/__tests__/visible-paths.test.d.ts +0 -1
  604. package/dist/core/human/__tests__/visible-paths.test.js +0 -28
  605. package/dist/core/keybindings/__tests__/inbox-affordance.test.d.ts +0 -1
  606. package/dist/core/keybindings/__tests__/inbox-affordance.test.js +0 -38
  607. package/dist/core/review/__tests__/project.test.d.ts +0 -1
  608. package/dist/core/review/__tests__/project.test.js +0 -71
  609. package/dist/core/runtime/__tests__/command-expansion.test.d.ts +0 -1
  610. package/dist/core/runtime/__tests__/command-expansion.test.js +0 -25
  611. package/dist/core/runtime/__tests__/session-visibility.test.d.ts +0 -1
  612. package/dist/core/runtime/__tests__/session-visibility.test.js +0 -119
  613. package/dist/core/runtime/__tests__/spawn-at-given-id.test.d.ts +0 -1
  614. package/dist/core/runtime/__tests__/spawn-at-given-id.test.js +0 -34
  615. package/dist/core/runtime/tmux.js +0 -1314
  616. package/dist/daemon/api/__tests__/full/push-parity.test.d.ts +0 -1
  617. package/dist/daemon/api/__tests__/full/worktree-parity.test.d.ts +0 -1
  618. package/dist/daemon/api/__tests__/full/worktree-parity.test.js +0 -160
  619. package/dist/daemon/api/__tests__/inbox.test.d.ts +0 -1
  620. package/dist/daemon/api/__tests__/inbox.test.js +0 -489
  621. package/dist/web-client/apple-touch-icon.png +0 -0
  622. package/dist/web-client/assets/fragment-mono-latin-400-normal-BYwT3kSJ.woff +0 -0
  623. package/dist/web-client/assets/fragment-mono-latin-400-normal-yxdJ5AmL.woff2 +0 -0
  624. package/dist/web-client/assets/fragment-mono-latin-ext-400-normal-BbKYyvR9.woff2 +0 -0
  625. package/dist/web-client/assets/fragment-mono-latin-ext-400-normal-CT4YFKeK.woff +0 -0
  626. package/dist/web-client/assets/index-CCPaLeW7.css +0 -2
  627. package/dist/web-client/assets/index-kyOWsnZK.js +0 -86
  628. package/dist/web-client/assets/martian-mono-cyrillic-wght-normal-B84CD5C_.woff2 +0 -0
  629. package/dist/web-client/assets/martian-mono-latin-ext-wght-normal-DlL6xMw5.woff2 +0 -0
  630. package/dist/web-client/assets/martian-mono-latin-wght-normal-5W32yIyr.woff2 +0 -0
  631. package/dist/web-client/assets/workbox-window.prod.es5-Bd17z0YL.js +0 -2
  632. package/dist/web-client/icon-192.png +0 -0
  633. package/dist/web-client/icon-512.png +0 -0
  634. package/dist/web-client/icon-maskable-512.png +0 -0
  635. package/dist/web-client/index.html +0 -17
  636. package/dist/web-client/manifest.webmanifest +0 -1
  637. package/dist/web-client/sw.js +0 -1
  638. /package/dist/api/__tests__/{client.test.d.ts → serial/client.test.d.ts} +0 -0
  639. /package/dist/clients/inbox/__tests__/{inbox-controller.test.d.ts → serial/inbox-controller.test.d.ts} +0 -0
  640. /package/dist/clients/inbox/__tests__/{mount-panel.test.d.ts → serial/mount-panel.test.d.ts} +0 -0
  641. /package/dist/clients/{attach/__tests__/attach-chrome-remote.test.d.ts → inbox/review/__tests__/teardown-notice.test.d.ts} +0 -0
  642. /package/dist/{clients/attach/__tests__/attach-keybindings.test.d.ts → core/__tests__/broker-extension-canvas-db-boundary.test.d.ts} +0 -0
  643. /package/dist/{clients/attach/__tests__/crtr-output-coverage.test.d.ts → core/__tests__/seam/broker-attach-multiclient.test.d.ts} +0 -0
  644. /package/dist/core/__tests__/{full → seam}/broker-attach-stream.test.d.ts +0 -0
  645. /package/dist/core/__tests__/{full → seam}/broker-crash-teardown.test.d.ts +0 -0
  646. /package/dist/core/__tests__/{full → seam}/broker-pane-resolution.test.d.ts +0 -0
  647. /package/dist/core/__tests__/{full → seam}/broker-provider-retry.test.d.ts +0 -0
  648. /package/dist/core/__tests__/{full → seam}/broker-whip-interrupt.test.d.ts +0 -0
  649. /package/dist/{clients/attach/__tests__/editor-frame-title.test.d.ts → core/__tests__/seam/dormancy-release.test.d.ts} +0 -0
  650. /package/dist/{clients/attach/__tests__/input-controller-extension-command.test.d.ts → core/__tests__/seam/yield-refresh-transaction.test.d.ts} +0 -0
  651. /package/dist/core/__tests__/{broker-fork-seam.test.d.ts → serial/broker-fork-seam.test.d.ts} +0 -0
  652. /package/dist/core/__tests__/{broker-sdk-wiring.test.d.ts → serial/broker-sdk-wiring.test.d.ts} +0 -0
  653. /package/dist/core/__tests__/{broker-snapshot-history.test.d.ts → serial/broker-snapshot-history.test.d.ts} +0 -0
  654. /package/dist/core/__tests__/{command-plugins.test.d.ts → serial/command-plugins.test.d.ts} +0 -0
  655. /package/dist/core/__tests__/{deferred-no-wake.test.d.ts → serial/deferred-no-wake.test.d.ts} +0 -0
  656. /package/dist/core/__tests__/{flagship-lifecycle.test.d.ts → serial/flagship-lifecycle.test.d.ts} +0 -0
  657. /package/dist/core/__tests__/{host-teardown-process-group.test.d.ts → serial/host-teardown-process-group.test.d.ts} +0 -0
  658. /package/dist/core/__tests__/{human-deliver-e2e.test.d.ts → serial/human-deliver-e2e.test.d.ts} +0 -0
  659. /package/dist/core/__tests__/{live-mutation.test.d.ts → serial/live-mutation.test.d.ts} +0 -0
  660. /package/dist/core/__tests__/{refresh-stall-recycle.test.d.ts → serial/refresh-stall-recycle.test.d.ts} +0 -0
  661. /package/dist/core/__tests__/{revive.test.d.ts → serial/revive.test.d.ts} +0 -0
  662. /package/dist/core/__tests__/{spawn-root.test.d.ts → serial/spawn-root.test.d.ts} +0 -0
  663. /package/dist/core/__tests__/{subscription-delivery.test.d.ts → serial/subscription-delivery.test.d.ts} +0 -0
  664. /package/dist/core/__tests__/{tmux-surface.test.d.ts → serial/tmux-surface.test.d.ts} +0 -0
  665. /package/dist/core/__tests__/{worktree.test.d.ts → serial/worktree.test.d.ts} +0 -0
  666. /package/dist/{clients/attach/__tests__/markdown-headings.test.d.ts → core/__tests__/watchdog-abort-arms-retry.test.d.ts} +0 -0
  667. /package/dist/{clients/attach/__tests__/session-identity-refresh.test.d.ts → core/broker-client/__tests__/transport-socket.test.d.ts} +0 -0
  668. /package/dist/core/human/__tests__/{inbox-core.test.d.ts → serial/inbox-core.test.d.ts} +0 -0
  669. /package/dist/{clients/inbox/review/__tests__/remap.test.d.ts → daemon/api/__tests__/node-model-validation.test.d.ts} +0 -0
  670. /package/dist/{clients/surfaces/region.js → daemon/api/__tests__/review-terminal-conflict.test.d.ts} +0 -0
  671. /package/dist/daemon/api/__tests__/{full → seam}/api-server.test.d.ts +0 -0
  672. /package/dist/daemon/api/__tests__/{full → seam}/b10-attach-modelauth.test.d.ts +0 -0
  673. /package/dist/{clients/web/__tests__/push-engine.test.d.ts → daemon/api/__tests__/seam/leaf-api-parity.test.d.ts} +0 -0
@@ -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
- });