@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
@@ -0,0 +1,538 @@
1
+ import { LoginDialogComponent, } from "@earendil-works/pi-coding-agent";
2
+ import { Input, matchesKey, truncateToWidth, } from "@earendil-works/pi-tui";
3
+ import { execFile } from "node:child_process";
4
+ import { dialogAuthInteraction } from "../../../core/auth-interaction.js";
5
+ import { isManagedProvider, promoteSubscription, readSubscriptionPool, renameSubscription, } from "../../../core/subscription-state.js";
6
+ import { removeProviderRow } from "../../../core/provider-management.js";
7
+ import { cliClient } from "../../api-client.js";
8
+ import { fitTail, theme, visibleRange, } from "./panel.js";
9
+ /** Curated setup-catalog view over pi's OAuth providers + the model registry. */
10
+ export function buildProviderCatalog(runtime, registry) {
11
+ const oauth = runtime
12
+ .getProviders()
13
+ .filter((provider) => provider.auth.oauth !== undefined);
14
+ const oauthIds = new Set(oauth.map((provider) => provider.id));
15
+ const seen = new Set();
16
+ return [
17
+ ...oauth.map((provider) => ({
18
+ providerId: provider.id,
19
+ name: provider.name,
20
+ managed: isManagedProvider(provider.id),
21
+ authType: "oauth",
22
+ })),
23
+ ...registry.getAll().map((model) => ({
24
+ providerId: model.provider,
25
+ name: registry.getProviderDisplayName(model.provider),
26
+ managed: isManagedProvider(model.provider),
27
+ authType: oauthIds.has(model.provider)
28
+ ? "oauth"
29
+ : "api_key",
30
+ })),
31
+ ].filter((provider) => !seen.has(provider.providerId) && Boolean(seen.add(provider.providerId)));
32
+ }
33
+ /** Classifies a `startLogin` failure into a user-facing status line. */
34
+ export function classifyLoginFailure(error, aborted) {
35
+ if (aborted)
36
+ return "Login cancelled";
37
+ if (error instanceof Error && error.name === "AbortError")
38
+ return "Login cancelled";
39
+ return `Login error: ${error instanceof Error ? error.message : String(error)}`;
40
+ }
41
+ export class ProviderPanel {
42
+ tui;
43
+ agentDir;
44
+ runtime;
45
+ registry;
46
+ renameInput = new Input();
47
+ rows = [];
48
+ selected = 0;
49
+ mode = "list";
50
+ notice = "";
51
+ catalog = [];
52
+ catalogIndex = 0;
53
+ loginProvider;
54
+ loginFlow;
55
+ mutationInFlight = false;
56
+ // Wired by the host wizard to bust its render-line cache. The panel proxies pi's
57
+ // LoginDialogComponent (it is not a real pi TUI child), so the host only repaints on
58
+ // synchronous input. startLogin drives OAuth through async promise chains whose state
59
+ // transitions land between keystrokes; notifyChange() lets each one force a fresh frame.
60
+ onChange;
61
+ constructor(tui, agentDir, runtime, registry) {
62
+ this.tui = tui;
63
+ this.agentDir = agentDir;
64
+ this.runtime = runtime;
65
+ this.registry = registry;
66
+ this.renameInput.onSubmit = () => this.rename();
67
+ this.renameInput.onEscape = () => {
68
+ this.mode = "list";
69
+ };
70
+ this.reload();
71
+ }
72
+ // Repaint the host after an async login transition: bust the wizard's cached lines
73
+ // (onChange) so render() recomputes the NEW state, then ask pi's loop to draw a frame.
74
+ notifyChange() {
75
+ this.onChange?.();
76
+ this.tui.requestRender();
77
+ }
78
+ /** auth.json changed under us (a login landed, a provider was removed). pi 0.82
79
+ * serves provider auth status from the runtime's SNAPSHOT rather than a live file
80
+ * read, so the snapshot has to be re-taken before the roster can see the change.
81
+ * `refresh()` is local-only here (the runtime is composed with model network access
82
+ * off), so this is a credential re-list, not a catalog fetch. */
83
+ reloadAfterAuthChange() {
84
+ this.reload();
85
+ void this.registry.refresh().then(() => {
86
+ this.reload();
87
+ this.notifyChange();
88
+ });
89
+ }
90
+ reload() {
91
+ const registry = this.registry;
92
+ const rows = [];
93
+ for (const provider of buildProviderCatalog(this.runtime, registry)) {
94
+ const status = registry.getProviderAuthStatus(provider.providerId);
95
+ if (provider.managed) {
96
+ const pool = readSubscriptionPool(provider.providerId);
97
+ if (pool.length === 0 && !status.source)
98
+ continue;
99
+ // Every stored account carries a credential, so pool occupancy is what makes the
100
+ // provider configured.
101
+ rows.push({
102
+ ...provider,
103
+ configured: pool.length > 0 || status.configured,
104
+ source: status.source,
105
+ sourceLabel: status.label,
106
+ });
107
+ pool.forEach((account, index) => rows.push({
108
+ ...provider,
109
+ label: account.label,
110
+ preferred: index === 0,
111
+ cooldownUntil: account.rateLimitedUntil,
112
+ accountId: account.accountId,
113
+ }));
114
+ continue;
115
+ }
116
+ if (!status.source)
117
+ continue;
118
+ rows.push({
119
+ ...provider,
120
+ configured: status.configured,
121
+ source: status.source,
122
+ sourceLabel: status.label,
123
+ });
124
+ }
125
+ this.rows = rows;
126
+ this.selected = Math.min(this.selected, Math.max(0, rows.length));
127
+ }
128
+ selectedRow() {
129
+ return this.rows[this.selected];
130
+ }
131
+ openBrowser(url) {
132
+ const command = process.platform === "darwin"
133
+ ? "open"
134
+ : process.platform === "win32"
135
+ ? "cmd"
136
+ : "xdg-open";
137
+ const args = process.platform === "win32" ? ["/c", "start", "", url] : [url];
138
+ execFile(command, args, { timeout: 5_000 }, () => { });
139
+ }
140
+ openCatalog() {
141
+ this.catalog = buildProviderCatalog(this.runtime, this.registry);
142
+ this.catalogIndex = 0;
143
+ this.mode = "catalog";
144
+ }
145
+ startLogin(provider, label) {
146
+ this.loginProvider = provider;
147
+ let flow;
148
+ const complete = (message) => {
149
+ if (!flow.active || this.loginFlow !== flow)
150
+ return;
151
+ flow.active = false;
152
+ this.loginFlow = undefined;
153
+ this.mode = "list";
154
+ this.notice = message;
155
+ this.reloadAfterAuthChange();
156
+ this.notifyChange();
157
+ };
158
+ const dialog = new LoginDialogComponent(this.tui, provider.providerId, (success, message) => {
159
+ if (!success)
160
+ complete(message ? `Login failed: ${message}` : "Login cancelled");
161
+ }, provider.name);
162
+ flow = { dialog, active: true, committing: false };
163
+ this.loginFlow = flow;
164
+ this.mode = "login";
165
+ const handleDialogInput = dialog.handleInput.bind(dialog);
166
+ dialog.handleInput = (data) => {
167
+ if (!flow.committing)
168
+ handleDialogInput(data);
169
+ };
170
+ const isActive = () => flow.active && this.loginFlow === flow && !dialog.signal.aborted;
171
+ const beginCommit = () => {
172
+ if (!isActive())
173
+ return false;
174
+ flow.committing = true;
175
+ dialog.showDetails(["Saving credentials…"]);
176
+ return true;
177
+ };
178
+ const fail = (error) => {
179
+ complete(classifyLoginFailure(error, dialog.signal.aborted));
180
+ };
181
+ if (provider.authType === "api_key") {
182
+ void dialog
183
+ .showPrompt(`Enter API key for ${provider.name}:`, "sk-...")
184
+ .then(async (key) => {
185
+ if (!isActive())
186
+ return;
187
+ if (!key.trim()) {
188
+ complete("No key entered — login cancelled");
189
+ return;
190
+ }
191
+ // Interactive collection stays client-side (TTY); the WRITE moves to the
192
+ // API (PUT /model-auth/{provider}) so this process never touches auth.json.
193
+ if (!beginCommit())
194
+ return;
195
+ await cliClient().installCredential(provider.providerId, {
196
+ kind: "api_key",
197
+ api_key: key.trim(),
198
+ });
199
+ complete(`API key saved for ${provider.name}`);
200
+ })
201
+ .catch(fail);
202
+ return;
203
+ }
204
+ // pi 0.82 collapsed the six login callbacks into one AuthInteraction; the adapter
205
+ // onto LoginDialogComponent is shared with the attach viewer's /login overlay.
206
+ const interaction = dialogAuthInteraction(dialog, {
207
+ openBrowser: (url) => this.openBrowser(url),
208
+ onChange: () => this.notifyChange(),
209
+ isActive,
210
+ });
211
+ const oauth = this.runtime.getProvider(provider.providerId)?.auth.oauth;
212
+ if (!oauth) {
213
+ complete(`Unknown OAuth provider: ${provider.providerId}`);
214
+ return;
215
+ }
216
+ if (!provider.managed) {
217
+ // Collect tokens client-side (browser/TTY), then WRITE via the API so this
218
+ // process never touches auth.json. In 0.82 `provider.auth.oauth.login()`
219
+ // RETURNS the credential without persisting it (persistence is app-owned),
220
+ // which is exactly the collect-without-persist half this needs.
221
+ void oauth
222
+ .login(interaction)
223
+ .then(async (credentials) => {
224
+ if (!isActive())
225
+ return;
226
+ if (!beginCommit())
227
+ return;
228
+ // Forward non-standard credential keys (e.g. github-copilot's `enterpriseUrl`)
229
+ // so enterprise routing and token refresh retain the provider data they require.
230
+ // The named tokens and store `type` are handled separately; all other keys travel
231
+ // through `extra` and the handler writes them into auth.json.
232
+ const { type: _type, access, refresh, expires, ...extra } = credentials;
233
+ await cliClient().installCredential(provider.providerId, {
234
+ kind: "oauth",
235
+ access_token: access,
236
+ refresh_token: refresh,
237
+ expires_at: new Date(expires).toISOString(),
238
+ ...(Object.keys(extra).length > 0 ? { extra } : {}),
239
+ });
240
+ if (isActive())
241
+ complete(`Logged in to ${provider.name}`);
242
+ })
243
+ .catch(fail);
244
+ return;
245
+ }
246
+ // Snapshot the newest pool cooldown before OAuth so a later 429 remains authoritative.
247
+ const lastRateLimitedAt = Math.max(0, ...readSubscriptionPool(provider.providerId).map((entry) => entry.lastRateLimitedAt));
248
+ void oauth
249
+ .login(interaction)
250
+ .then(async (credential) => {
251
+ if (!isActive())
252
+ return;
253
+ if (!beginCommit())
254
+ return;
255
+ const accountId = typeof credential.accountId === "string" &&
256
+ credential.accountId.trim()
257
+ ? credential.accountId.trim()
258
+ : undefined;
259
+ // Collected via pi's managed login (client); the API persists it into the pool, where
260
+ // account identity selects an existing row or labels a newly seen account.
261
+ await cliClient().installCredential(provider.providerId, {
262
+ kind: "managed_account",
263
+ ...(label ? { label } : {}),
264
+ ...(label ? {} : { auto_label: true }),
265
+ ...(accountId ? { account_id: accountId } : {}),
266
+ access_token: credential.access,
267
+ refresh_token: credential.refresh,
268
+ expires_at: new Date(credential.expires).toISOString(),
269
+ last_rate_limited_at: lastRateLimitedAt,
270
+ });
271
+ if (isActive())
272
+ complete(`Logged in to ${provider.name}`);
273
+ })
274
+ .catch(fail);
275
+ }
276
+ isNestedFlowActive() {
277
+ return this.mode === "login";
278
+ }
279
+ dispose() {
280
+ const flow = this.loginFlow;
281
+ if (!flow)
282
+ return;
283
+ flow.active = false;
284
+ this.loginFlow = undefined;
285
+ flow.dialog.handleInput("\u001b");
286
+ }
287
+ runMutation(operation) {
288
+ if (this.mutationInFlight)
289
+ return;
290
+ this.mutationInFlight = true;
291
+ void operation()
292
+ .catch((error) => {
293
+ this.notice = error instanceof Error ? error.message : String(error);
294
+ })
295
+ .finally(() => {
296
+ this.mutationInFlight = false;
297
+ this.notifyChange();
298
+ });
299
+ }
300
+ rename() {
301
+ const row = this.selectedRow();
302
+ if (!row?.managed || !row.label)
303
+ return;
304
+ this.mode = "list";
305
+ this.runMutation(async () => {
306
+ await renameSubscription(row.providerId, row.label, this.renameInput.getValue());
307
+ this.notice = `Renamed ${row.name} account`;
308
+ this.reload();
309
+ });
310
+ }
311
+ remove(row) {
312
+ this.runMutation(async () => {
313
+ this.notice = await removeProviderRow(this.agentDir, row);
314
+ this.reloadAfterAuthChange();
315
+ });
316
+ }
317
+ promote(row) {
318
+ this.runMutation(async () => {
319
+ await promoteSubscription(row.providerId, row.label);
320
+ this.notice = `Preferred ${row.name} account`;
321
+ this.reload();
322
+ });
323
+ }
324
+ handleInput(data) {
325
+ if (this.mode === "login") {
326
+ this.loginFlow?.dialog.handleInput(data);
327
+ return true;
328
+ }
329
+ if (this.mutationInFlight)
330
+ return true;
331
+ if (this.mode === "rename" || this.mode === "label") {
332
+ this.renameInput.handleInput(data);
333
+ return true;
334
+ }
335
+ if (this.mode === "catalog") {
336
+ if (matchesKey(data, "escape")) {
337
+ this.mode = "list";
338
+ return true;
339
+ }
340
+ if (matchesKey(data, "j") || matchesKey(data, "down")) {
341
+ this.catalogIndex = Math.min(this.catalog.length - 1, this.catalogIndex + 1);
342
+ return true;
343
+ }
344
+ if (matchesKey(data, "k") || matchesKey(data, "up")) {
345
+ this.catalogIndex = Math.max(0, this.catalogIndex - 1);
346
+ return true;
347
+ }
348
+ if (matchesKey(data, "enter")) {
349
+ const provider = this.catalog[this.catalogIndex];
350
+ if (provider.managed) {
351
+ this.loginProvider = provider;
352
+ this.renameInput.setValue("");
353
+ this.renameInput.onSubmit = () => {
354
+ const label = this.renameInput.getValue().trim();
355
+ if (label)
356
+ this.startLogin(provider, label);
357
+ };
358
+ this.mode = "label";
359
+ }
360
+ else
361
+ this.startLogin(provider);
362
+ return true;
363
+ }
364
+ return true;
365
+ }
366
+ if (this.mode === "remove") {
367
+ if (matchesKey(data, "y") || matchesKey(data, "enter")) {
368
+ const row = this.selectedRow();
369
+ if (row && (row.managed || row.configured)) {
370
+ this.remove(row);
371
+ }
372
+ }
373
+ this.mode = "list";
374
+ return true;
375
+ }
376
+ if (matchesKey(data, "j") || matchesKey(data, "down")) {
377
+ this.selected = Math.min(this.rows.length, this.selected + 1);
378
+ return true;
379
+ }
380
+ if (matchesKey(data, "k") || matchesKey(data, "up")) {
381
+ this.selected = Math.max(0, this.selected - 1);
382
+ return true;
383
+ }
384
+ const row = this.selectedRow();
385
+ if (matchesKey(data, "p") && row?.managed && row.label) {
386
+ this.promote(row);
387
+ return true;
388
+ }
389
+ if (matchesKey(data, "r") && row?.managed && row.label) {
390
+ this.renameInput.setValue(row.label);
391
+ this.renameInput.onSubmit = () => this.rename();
392
+ this.mode = "rename";
393
+ return true;
394
+ }
395
+ if (matchesKey(data, "x") && (row?.managed || row?.configured)) {
396
+ this.mode = "remove";
397
+ return true;
398
+ }
399
+ if (matchesKey(data, "a")) {
400
+ this.openCatalog();
401
+ return true;
402
+ }
403
+ const viewOnly = row?.source === "environment" || row?.source === "runtime";
404
+ if (matchesKey(data, "l") && row && !viewOnly) {
405
+ if (row.managed && row.label)
406
+ this.startLogin(row, row.label);
407
+ else
408
+ this.startLogin(row);
409
+ return true;
410
+ }
411
+ if (matchesKey(data, "enter")) {
412
+ if (row && !viewOnly)
413
+ this.startLogin(row, row.managed && row.label ? row.label : undefined);
414
+ else if (!row)
415
+ this.openCatalog();
416
+ return true;
417
+ }
418
+ return false;
419
+ }
420
+ // `height` is the panel's row budget, supplied by the host page's live
421
+ // terminal-row callback. It can shrink to just a couple of rows, so every part
422
+ // of the panel below the mandatory content is chrome that collapses under
423
+ // pressure. For the roster/catalog list this
424
+ // is: the title/count header first, then the hint/notice/empty-state line, then the
425
+ // position indicator — never letting the selected row scroll out of view. The
426
+ // login/rename/label/remove modals have no list to window, so they apply the same
427
+ // budget via `fitTail`: their bodies always end on the actionable line (a live
428
+ // input, a confirm prompt, a login dialog's current prompt), so clipping from the
429
+ // head sheds chrome (title/count/older status lines) first and keeps that line.
430
+ badge() {
431
+ return String(this.rows.filter((row) => row.label === undefined).length);
432
+ }
433
+ render(width, height) {
434
+ const titleLine = theme.fg("accent", theme.bold("Providers"));
435
+ const countLine = theme.fg("dim", `${this.rows.filter((row) => row.label === undefined).length} configured`);
436
+ const contentBudget = Math.max(1, height);
437
+ let body;
438
+ if (this.mode === "login") {
439
+ body = fitTail(this.loginFlow?.dialog.render(width) ?? [], contentBudget);
440
+ }
441
+ else if (this.mode === "rename" || this.mode === "label") {
442
+ body = fitTail([
443
+ titleLine,
444
+ countLine,
445
+ "",
446
+ theme.fg("accent", this.mode === "rename"
447
+ ? "Rename account"
448
+ : `Name the ${this.loginProvider?.name ?? "provider"} account`),
449
+ ...this.renameInput.render(Math.max(1, width - 8)),
450
+ ], contentBudget);
451
+ }
452
+ else if (this.mode === "remove") {
453
+ const target = this.selectedRow();
454
+ const label = target?.label ??
455
+ (target?.managed
456
+ ? `${target.name} · all accounts`
457
+ : (target?.name ?? "account"));
458
+ body = fitTail([
459
+ titleLine,
460
+ countLine,
461
+ "",
462
+ theme.fg("warning", `Remove ${label}? y/enter confirm · any other key cancel`),
463
+ ], contentBudget);
464
+ }
465
+ else {
466
+ // The title/count header is the first chrome to give way: only as many of its
467
+ // two lines are kept as fit while still reserving at least one row for the
468
+ // mandatory selected entry.
469
+ const header = [titleLine, countLine].slice(0, Math.max(0, contentBudget - 1));
470
+ const remaining = contentBudget - header.length; // always >= 1
471
+ body = [...header];
472
+ if (this.mode === "catalog") {
473
+ const items = this.catalog.length;
474
+ const clipped = items > remaining;
475
+ // Only trade a row for the position indicator when there's a spare row to trade;
476
+ // at `remaining === 1` the sole row goes to the mandatory selected entry instead.
477
+ const reserveIndicator = clipped && remaining >= 2;
478
+ const rowBudget = reserveIndicator ? remaining - 1 : remaining;
479
+ const { start, end } = visibleRange(items, this.catalogIndex, rowBudget);
480
+ let leftover = remaining - (end - start) - (reserveIndicator ? 1 : 0);
481
+ if (leftover > 0) {
482
+ body.push(theme.fg("dim", "Select a provider to add · esc back"));
483
+ leftover -= 1;
484
+ }
485
+ for (let index = start; index < end; index++) {
486
+ const provider = this.catalog[index];
487
+ body.push(`${index === this.catalogIndex ? theme.fg("accent", "▶") : " "} ${provider.name}`);
488
+ }
489
+ if (reserveIndicator)
490
+ body.push(theme.fg("dim", `(${this.catalogIndex + 1}/${items})`));
491
+ }
492
+ else {
493
+ const totalEntries = this.rows.length + 1; // + the trailing "Add provider" sentinel
494
+ const clipped = totalEntries > remaining;
495
+ const reserveIndicator = clipped && remaining >= 2;
496
+ const rowBudget = reserveIndicator ? remaining - 1 : remaining;
497
+ const { start, end } = visibleRange(totalEntries, this.selected, rowBudget);
498
+ let leftover = remaining - (end - start) - (reserveIndicator ? 1 : 0);
499
+ const showEmpty = this.rows.length === 0 && leftover > 0;
500
+ if (showEmpty)
501
+ leftover -= 1;
502
+ const showNotice = Boolean(this.notice) && leftover > 0;
503
+ if (showEmpty)
504
+ body.push(theme.fg("warning", "No provider configured yet."));
505
+ for (let index = start; index < end; index++) {
506
+ if (index === this.rows.length) {
507
+ body.push(`${this.selected === this.rows.length ? theme.fg("accent", "▶") : " "} ${theme.fg("accent", "+ Add provider")}`);
508
+ continue;
509
+ }
510
+ const row = this.rows[index];
511
+ const selected = index === this.selected ? theme.fg("accent", "▶") : " ";
512
+ if (!row.label) {
513
+ const state = row.managed
514
+ ? `${this.rows.filter((item) => item.providerId === row.providerId && item.label).length} accounts`
515
+ : row.source === "environment" || row.source === "runtime"
516
+ ? `${row.source}${row.sourceLabel ? ` · ${row.sourceLabel}` : ""} (view only)`
517
+ : "configured";
518
+ body.push(`${selected} ${theme.fg("accent", row.name)}${theme.fg("dim", ` ${state}`)}`);
519
+ }
520
+ else {
521
+ const health = row.cooldownUntil && row.cooldownUntil > Date.now()
522
+ ? `cooldown ${Math.ceil((row.cooldownUntil - Date.now()) / 60000)}m`
523
+ : "ready";
524
+ const identity = row.accountId
525
+ ? ` · ${row.accountId.length > 12 ? `${row.accountId.slice(0, 8)}…${row.accountId.slice(-4)}` : row.accountId}`
526
+ : "";
527
+ body.push(`${selected} ${row.preferred ? theme.fg("success", "●") : " "} ${row.label}${theme.fg("dim", identity)} ${theme.fg("dim", health)}${row.preferred ? theme.fg("accent", " preferred") : ""}`);
528
+ }
529
+ }
530
+ if (reserveIndicator)
531
+ body.push(theme.fg("dim", `(${this.selected + 1}/${totalEntries})`));
532
+ if (showNotice)
533
+ body.push(theme.fg("dim", this.notice));
534
+ }
535
+ }
536
+ return body.map((line) => truncateToWidth(line, width));
537
+ }
538
+ }
@@ -0,0 +1,55 @@
1
+ import { ModelRegistry, ModelRuntime } from "@earendil-works/pi-coding-agent";
2
+ import { TUI, type Component, type Focusable } from "@earendil-works/pi-tui";
3
+ import { type BindingId, type BindingResolution } from "../../core/keybindings/index.js";
4
+ export declare class SettingsShell implements Component, Focusable {
5
+ private readonly tui;
6
+ private readonly bindings;
7
+ private readonly terminalRows;
8
+ private readonly providers;
9
+ private readonly models;
10
+ private readonly keybindings;
11
+ private readonly brokerLimits;
12
+ private readonly keys;
13
+ private readonly destinations;
14
+ private index;
15
+ /** The rail owns the arrow keys until you step into a panel. */
16
+ private railFocused;
17
+ private _focused;
18
+ private cachedWidth;
19
+ private cachedHeight;
20
+ private cachedLines;
21
+ private keySaveInFlight;
22
+ onCancel?: () => void;
23
+ constructor(tui: TUI, agentDir: string, runtime: ModelRuntime, registry: ModelRegistry, bindings: BindingResolution<BindingId>, rawKeybindings: unknown, terminalRows: () => number, rawTmuxPassthrough?: unknown);
24
+ set focused(value: boolean);
25
+ get focused(): boolean;
26
+ private get current();
27
+ invalidate(): void;
28
+ private syncFocus;
29
+ private enterRail;
30
+ private enterPanel;
31
+ private go;
32
+ private matches;
33
+ private label;
34
+ /** Panels that have taken over the keyboard — a live text field, a modal, an
35
+ * open picker — keep every key including Escape until they release it. */
36
+ private panelOwnsKeyboard;
37
+ /** `crtr.setup.tab-next`/`-previous` still carry the tab strip's horizontal
38
+ * arrows. In the rail layout the horizontal arrows mean "into the panel" and
39
+ * "back to the rail", so only the Tab gestures cycle destinations. */
40
+ private cyclesDestination;
41
+ handleInput(data: string): void;
42
+ /** Typing a letter on the rail jumps to the destination it starts. */
43
+ private jumpToInitial;
44
+ private routeToPanel;
45
+ private saveExaKey;
46
+ private close;
47
+ dispose(): void;
48
+ private renderRail;
49
+ /** Left hint plus the always-there navigation keys, the hint shedding its
50
+ * optional half on a narrow terminal rather than pushing "close" off. */
51
+ private footer;
52
+ private panelHint;
53
+ render(width: number): string[];
54
+ }
55
+ export declare function runSettings(): Promise<void>;