@north-light/crouter 0.3.233 → 0.3.234

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 (379) hide show
  1. package/dist/api/client.js +16 -15
  2. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/__tests__/integration/provider-rotation.test.ts +1 -1
  3. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/claude-plugin-commands.ts +14 -17
  4. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/crtr-commands/index.ts +7 -11
  5. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/frontmatter-rules/index.ts +8 -8
  6. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/memory-slash-commands.ts +10 -11
  7. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/pi-shell-runner.ts +2 -2
  8. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/provider-rotation.d.ts +3 -3
  9. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/provider-rotation.js +7 -7
  10. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/provider-rotation.ts +8 -8
  11. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/statusline.ts +6 -6
  12. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/sysprompt-window.ts +3 -3
  13. package/dist/builtin-pi-packages/pi-crtr-extensions/lib/subscription-state.ts +1 -1
  14. package/dist/clients/attach/chrome/ticket-panel.js +15 -2
  15. package/dist/clients/attach/overlays/graph.js +0 -3
  16. package/dist/clients/attach/overlays/mcp.js +1 -2
  17. package/dist/clients/attach/render/chat-view.js +0 -12
  18. package/dist/clients/attach/render/crtr-output.js +0 -2
  19. package/dist/clients/attach/render/tool-calls.js +0 -6
  20. package/dist/clients/attach/slash/dispatch.js +8 -11
  21. package/dist/clients/attach/viewer.js +532 -534
  22. package/dist/clients/conversation/projection.js +0 -2
  23. package/dist/clients/inbox/controller.js +22 -3
  24. package/dist/clients/inbox/review/companion-pane.js +0 -4
  25. package/dist/clients/inbox/review-adapter.js +0 -7
  26. package/dist/clients/inbox/tui/slots.d.ts +3 -3
  27. package/dist/clients/inbox/tui/types.d.ts +2 -2
  28. package/dist/commands/api-client.js +0 -8
  29. package/dist/commands/attention.js +0 -8
  30. package/dist/commands/canvas-browse.js +2 -1
  31. package/dist/commands/canvas-config.js +0 -10
  32. package/dist/commands/canvas-history.js +2 -1
  33. package/dist/commands/cron.js +5 -18
  34. package/dist/commands/dashboard.js +0 -2
  35. package/dist/commands/human/feedback.js +2 -1
  36. package/dist/commands/human/prompts.js +2 -5
  37. package/dist/commands/human/queue.js +2 -7
  38. package/dist/commands/human/request.js +0 -14
  39. package/dist/commands/human/review.js +2 -1
  40. package/dist/commands/memory/__tests__/command-selector-and-mutation-guards.test.js +4 -4
  41. package/dist/commands/memory/find.js +2 -2
  42. package/dist/commands/memory/lint.js +2 -1
  43. package/dist/commands/memory/read.d.ts +2 -7
  44. package/dist/commands/memory/read.js +5 -16
  45. package/dist/commands/memory/shared.js +4 -7
  46. package/dist/commands/memory/write.js +4 -3
  47. package/dist/commands/node/bash.js +2 -1
  48. package/dist/commands/node/create.js +2 -1
  49. package/dist/commands/node/inspect.js +0 -6
  50. package/dist/commands/node/lifecycle.js +4 -13
  51. package/dist/commands/node/message.js +3 -2
  52. package/dist/commands/node/subscription.js +2 -1
  53. package/dist/commands/node/wait.js +4 -3
  54. package/dist/commands/node-context.js +2 -1
  55. package/dist/commands/node-lifecycle-revive.js +0 -2
  56. package/dist/commands/node-worktree.js +2 -1
  57. package/dist/commands/pkg/browse/actions.d.ts +1 -1
  58. package/dist/commands/pkg/browse/actions.js +4 -4
  59. package/dist/commands/pkg/browse/catalog.d.ts +1 -1
  60. package/dist/commands/pkg/browse/catalog.js +15 -15
  61. package/dist/commands/pkg/browse/command-view.d.ts +1 -1
  62. package/dist/commands/pkg/browse/command-view.js +3 -3
  63. package/dist/commands/pkg/browse/detail-panel.d.ts +1 -1
  64. package/dist/commands/pkg/browse/detail-panel.js +8 -8
  65. package/dist/commands/pkg/browse/doc-view.d.ts +1 -1
  66. package/dist/commands/pkg/browse/doc-view.js +3 -3
  67. package/dist/commands/pkg/browse/list-panel.d.ts +1 -1
  68. package/dist/commands/pkg/browse/list-panel.js +3 -3
  69. package/dist/commands/pkg/browse/model.d.ts +3 -3
  70. package/dist/commands/pkg/browse/shell.d.ts +2 -2
  71. package/dist/commands/pkg/browse/shell.js +13 -13
  72. package/dist/commands/pkg/plugin-manage.js +2 -1
  73. package/dist/commands/pkg/shared.js +0 -2
  74. package/dist/commands/profile/delete.js +2 -1
  75. package/dist/commands/push.js +2 -3
  76. package/dist/commands/revive.js +0 -2
  77. package/dist/commands/surface/node/placement.js +2 -1
  78. package/dist/commands/surface-edit.js +2 -1
  79. package/dist/commands/sys/config.js +0 -4
  80. package/dist/commands/sys/daemon.js +0 -10
  81. package/dist/commands/sys/doctor.js +3 -2
  82. package/dist/commands/sys/panels/broker-limits-panel.d.ts +2 -2
  83. package/dist/commands/sys/panels/broker-limits-panel.js +4 -4
  84. package/dist/commands/sys/panels/dependencies-panel.d.ts +2 -2
  85. package/dist/commands/sys/panels/dependencies-panel.js +2 -2
  86. package/dist/commands/sys/panels/keybindings-panel.d.ts +1 -1
  87. package/dist/commands/sys/panels/keybindings-panel.js +5 -5
  88. package/dist/commands/sys/panels/models-panel.d.ts +4 -4
  89. package/dist/commands/sys/panels/models-panel.js +11 -10
  90. package/dist/commands/sys/panels/plugins-panel.d.ts +2 -2
  91. package/dist/commands/sys/panels/plugins-panel.js +2 -2
  92. package/dist/commands/sys/panels/prefs-panel.d.ts +2 -2
  93. package/dist/commands/sys/panels/prefs-panel.js +4 -4
  94. package/dist/commands/sys/panels/profiles-panel.d.ts +1 -1
  95. package/dist/commands/sys/panels/profiles-panel.js +14 -13
  96. package/dist/commands/sys/panels/provider-panel.d.ts +3 -3
  97. package/dist/commands/sys/panels/provider-panel.js +8 -8
  98. package/dist/commands/sys/settings-shell.d.ts +3 -3
  99. package/dist/commands/sys/settings-shell.js +15 -15
  100. package/dist/commands/sys/setup-settings-runner.d.ts +3 -3
  101. package/dist/commands/sys/setup-settings-runner.js +5 -5
  102. package/dist/commands/sys/setup-wizard.d.ts +4 -4
  103. package/dist/commands/sys/setup-wizard.js +8 -8
  104. package/dist/commands/sys/support/prepare.js +4 -4
  105. package/dist/commands/sys/support/submit.js +2 -2
  106. package/dist/commands/sys/sync-deps.js +0 -2
  107. package/dist/commands/sys/sync-project-guidance.js +2 -1
  108. package/dist/commands/sys/sysprompt.js +2 -1
  109. package/dist/core/__tests__/boot.test.js +0 -8
  110. package/dist/core/__tests__/broker-extension-canvas-db-boundary.test.js +23 -1
  111. package/dist/core/__tests__/canvas-db-boundary.test.d.ts +1 -0
  112. package/dist/core/__tests__/canvas-db-boundary.test.js +46 -0
  113. package/dist/core/__tests__/canvas.test.js +1 -1
  114. package/dist/core/__tests__/child-death-wake.test.js +0 -2
  115. package/dist/core/__tests__/cron-armed-context-failure.test.d.ts +1 -0
  116. package/dist/core/__tests__/cron-armed-context-failure.test.js +145 -0
  117. package/dist/core/__tests__/daemon-wedge.test.js +0 -4
  118. package/dist/core/__tests__/dead-node-policy-table.test.js +0 -4
  119. package/dist/core/__tests__/fixtures/fake-engine.js +4 -14
  120. package/dist/core/__tests__/fixtures/fake-pi-host.js +5 -5
  121. package/dist/core/__tests__/focuses.test.js +0 -6
  122. package/dist/core/__tests__/fs-utils.test.d.ts +1 -0
  123. package/dist/core/__tests__/fs-utils.test.js +50 -0
  124. package/dist/core/__tests__/helpers/harness.js +1 -1
  125. package/dist/core/__tests__/inline-memory-refs.test.js +0 -2
  126. package/dist/core/__tests__/integration/broker-fork-seam.test.js +0 -2
  127. package/dist/core/__tests__/integration/broker-sdk-wiring.test.js +3 -16
  128. package/dist/core/__tests__/integration/command-plugins.test.js +0 -24
  129. package/dist/core/__tests__/integration/deferred-no-wake.test.js +0 -6
  130. package/dist/core/__tests__/integration/flagship-lifecycle.test.js +0 -26
  131. package/dist/core/__tests__/integration/live-mutation-verbs.test.js +0 -4
  132. package/dist/core/__tests__/integration/live-mutation.test.js +1 -5
  133. package/dist/core/__tests__/integration/refresh-stall-recycle.test.js +1 -5
  134. package/dist/core/__tests__/integration/revive.test.js +0 -12
  135. package/dist/core/__tests__/integration/subscription-delivery.test.js +0 -6
  136. package/dist/core/__tests__/integration/tmux-surface.test.js +24 -8
  137. package/dist/core/__tests__/integration/worktree-reap.test.js +0 -6
  138. package/dist/core/__tests__/lifecycle.test.js +0 -18
  139. package/dist/core/__tests__/memory-resolver-precedence.test.js +1 -1
  140. package/dist/core/__tests__/migration.test.js +2 -2
  141. package/dist/core/__tests__/on-read-dedup-resume.test.js +3 -3
  142. package/dist/core/__tests__/pid-identity-match.test.js +1 -1
  143. package/dist/core/__tests__/plugin-kinds.test.js +1 -1
  144. package/dist/core/__tests__/plugin-page-components.test.js +1 -1
  145. package/dist/core/__tests__/preview-registry-sync.test.js +42 -1
  146. package/dist/core/__tests__/respawn-throttle.test.js +0 -4
  147. package/dist/core/__tests__/revive-all.test.js +5 -5
  148. package/dist/core/__tests__/revive-parked-fresh.test.js +62 -11
  149. package/dist/core/__tests__/seam/broker-attach-multiclient.test.js +0 -8
  150. package/dist/core/__tests__/seam/broker-attach-stream.test.js +0 -8
  151. package/dist/core/__tests__/seam/broker-crash-teardown.test.js +0 -2
  152. package/dist/core/__tests__/tmux-driver-boundary.test.d.ts +1 -0
  153. package/dist/core/__tests__/tmux-driver-boundary.test.js +50 -0
  154. package/dist/core/activity-signal.d.ts +7 -0
  155. package/dist/core/activity-signal.js +38 -0
  156. package/dist/core/auto-update.js +2 -1
  157. package/dist/core/bootstrap.js +2 -1
  158. package/dist/core/canvas/__tests__/remote-canvas-source.test.js +1 -1
  159. package/dist/core/canvas/__tests__/remote-transport.test.js +1 -1
  160. package/dist/core/canvas/__tests__/render-remote.test.js +1 -1
  161. package/dist/core/canvas/browse/app.js +3 -2
  162. package/dist/core/canvas/browse/model.d.ts +1 -1
  163. package/dist/core/canvas/browse/model.js +0 -4
  164. package/dist/core/canvas/canvas.d.ts +22 -0
  165. package/dist/core/canvas/canvas.js +50 -18
  166. package/dist/core/canvas/crons.js +0 -6
  167. package/dist/core/canvas/db.d.ts +14 -20
  168. package/dist/core/canvas/db.js +30 -1332
  169. package/dist/core/canvas/focuses.js +0 -4
  170. package/dist/core/canvas/history.js +2 -1
  171. package/dist/core/canvas/migrations.d.ts +20 -0
  172. package/dist/core/canvas/migrations.js +1339 -0
  173. package/dist/core/canvas/nav-model.js +1 -11
  174. package/dist/core/canvas/nav-render.js +0 -8
  175. package/dist/core/canvas/remote-canvas-source.js +0 -2
  176. package/dist/core/canvas/render-source.js +31 -13
  177. package/dist/core/command-manifests/manifest.js +0 -10
  178. package/dist/core/command-manifests/schema.js +0 -4
  179. package/dist/core/command-plugins/transport/http-invoke.js +0 -14
  180. package/dist/core/command.js +0 -4
  181. package/dist/core/config.js +2 -1
  182. package/dist/core/feed/inbox.d.ts +10 -0
  183. package/dist/core/feed/inbox.js +18 -12
  184. package/dist/core/fs-utils.d.ts +9 -2
  185. package/dist/core/fs-utils.js +7 -15
  186. package/dist/core/help.js +0 -8
  187. package/dist/core/host-exports/export.d.ts +2 -2
  188. package/dist/core/host-exports/export.js +9 -12
  189. package/dist/core/human/answer.d.ts +2 -2
  190. package/dist/core/human/convention.d.ts +2 -5
  191. package/dist/core/human/convention.js +3 -13
  192. package/dist/core/human/page-schema.d.ts +2 -2
  193. package/dist/core/human/page-schema.js +2 -2
  194. package/dist/core/human/root.js +6 -23
  195. package/dist/core/human/scan.js +24 -7
  196. package/dist/core/human/tickets.d.ts +4 -1
  197. package/dist/core/human/tickets.js +20 -6
  198. package/dist/core/io.js +0 -12
  199. package/dist/core/memory/identity.js +0 -4
  200. package/dist/core/memory/inline-ref-inventory.js +3 -2
  201. package/dist/core/memory/lint.js +3 -6
  202. package/dist/core/memory-resolver.d.ts +5 -0
  203. package/dist/core/memory-resolver.js +14 -12
  204. package/dist/core/pagination.js +0 -2
  205. package/dist/core/preview-registry.d.ts +14 -0
  206. package/dist/core/preview-registry.js +2 -4
  207. package/dist/core/preview-result-path.js +2 -1
  208. package/dist/core/profiles/manifest.d.ts +37 -5
  209. package/dist/core/profiles/manifest.js +44 -24
  210. package/dist/core/profiles/select.js +0 -4
  211. package/dist/core/review/signal.js +4 -23
  212. package/dist/core/review/ticket-filter.d.ts +3 -3
  213. package/dist/core/review/ticket-filter.js +4 -9
  214. package/dist/core/runtime/__tests__/engine-route.test.js +1 -1
  215. package/dist/core/runtime/__tests__/spawn-env.test.js +0 -8
  216. package/dist/core/runtime/bearings-render.d.ts +56 -0
  217. package/dist/core/runtime/bearings-render.js +241 -0
  218. package/dist/core/runtime/bearings.d.ts +2 -17
  219. package/dist/core/runtime/bearings.js +12 -198
  220. package/dist/core/runtime/broker/auth-reload.d.ts +39 -0
  221. package/dist/core/runtime/broker/auth-reload.js +149 -0
  222. package/dist/core/runtime/broker/engine-drive.d.ts +26 -0
  223. package/dist/core/runtime/broker/engine-drive.js +257 -0
  224. package/dist/core/runtime/broker/engine-routing.d.ts +143 -0
  225. package/dist/core/runtime/broker/engine-routing.js +211 -0
  226. package/dist/core/runtime/broker/event-projection.js +3 -2
  227. package/dist/core/runtime/broker/fault-retry.js +5 -4
  228. package/dist/core/runtime/broker/frame-client.d.ts +38 -0
  229. package/dist/core/runtime/broker/frame-client.js +129 -0
  230. package/dist/core/runtime/broker/frame-dispatch.d.ts +12 -189
  231. package/dist/core/runtime/broker/frame-dispatch.js +89 -1476
  232. package/dist/core/runtime/broker/frame-engine-control.d.ts +20 -0
  233. package/dist/core/runtime/broker/frame-engine-control.js +231 -0
  234. package/dist/core/runtime/broker/frame-memory-refs.d.ts +19 -0
  235. package/dist/core/runtime/broker/frame-memory-refs.js +41 -0
  236. package/dist/core/runtime/broker/frame-model-query.d.ts +13 -0
  237. package/dist/core/runtime/broker/frame-model-query.js +69 -0
  238. package/dist/core/runtime/broker/frame-read.d.ts +19 -0
  239. package/dist/core/runtime/broker/frame-read.js +116 -0
  240. package/dist/core/runtime/broker/frame-replies.d.ts +24 -0
  241. package/dist/core/runtime/broker/frame-replies.js +64 -0
  242. package/dist/core/runtime/broker/frame-session.d.ts +34 -0
  243. package/dist/core/runtime/broker/frame-session.js +203 -0
  244. package/dist/core/runtime/broker/turn-ignition.d.ts +42 -0
  245. package/dist/core/runtime/broker/turn-ignition.js +74 -0
  246. package/dist/core/runtime/broker-extension-render.js +9 -85
  247. package/dist/core/runtime/broker-protocol.js +0 -4
  248. package/dist/core/runtime/broker-sdk.js +2 -1
  249. package/dist/core/runtime/broker.d.ts +1 -1
  250. package/dist/core/runtime/broker.js +5 -23
  251. package/dist/core/runtime/fault.js +3 -2
  252. package/dist/core/runtime/headless-pi.js +3 -2
  253. package/dist/core/runtime/host.js +2 -3
  254. package/dist/core/runtime/kickoff.js +0 -4
  255. package/dist/core/runtime/launch-target.js +2 -1
  256. package/dist/core/runtime/launch.js +3 -6
  257. package/dist/core/runtime/lifecycle.js +17 -26
  258. package/dist/core/runtime/managed-provider-cooling.d.ts +1 -1
  259. package/dist/core/runtime/naming.js +0 -2
  260. package/dist/core/runtime/nodes.js +2 -1
  261. package/dist/core/runtime/persona.js +0 -6
  262. package/dist/core/runtime/placement-tmux.js +2 -5
  263. package/dist/core/runtime/placement.js +4 -11
  264. package/dist/core/runtime/recap.js +4 -3
  265. package/dist/core/runtime/reopen.js +4 -7
  266. package/dist/core/runtime/reset.js +0 -4
  267. package/dist/core/runtime/resume-root.js +0 -2
  268. package/dist/core/runtime/revive.js +17 -13
  269. package/dist/core/runtime/session-list-cache.js +2 -2
  270. package/dist/core/runtime/shell-expansion.js +0 -2
  271. package/dist/core/runtime/spawn.js +0 -2
  272. package/dist/core/runtime/stream-watchdog.d.ts +0 -1
  273. package/dist/core/runtime/stream-watchdog.js +13 -18
  274. package/dist/core/runtime/tmux-bindings.js +0 -2
  275. package/dist/core/runtime/tmux-driver.d.ts +12 -0
  276. package/dist/core/runtime/tmux-driver.js +18 -13
  277. package/dist/core/runtime/warm-pool.js +0 -4
  278. package/dist/core/scope.js +4 -3
  279. package/dist/core/spawn.js +2 -3
  280. package/dist/core/subscription-state.js +10 -17
  281. package/dist/core/substrate/__tests__/surface-match-pre-command.test.js +3 -3
  282. package/dist/core/substrate/render.js +0 -12
  283. package/dist/core/substrate/schema.js +0 -12
  284. package/dist/core/substrate/surface-match.js +0 -2
  285. package/dist/core/termrender/display.js +2 -1
  286. package/dist/core/tui/page-host.d.ts +3 -3
  287. package/dist/core/tui/page-host.js +4 -4
  288. package/dist/core/tui/panel.js +3 -3
  289. package/dist/core/wake.js +0 -12
  290. package/dist/core/worktree.js +0 -2
  291. package/dist/daemon/__tests__/reconciler-signature.test.d.ts +1 -0
  292. package/dist/daemon/__tests__/reconciler-signature.test.js +36 -0
  293. package/dist/daemon/api/__tests__/seam/api-server.test.js +2 -16
  294. package/dist/daemon/api/__tests__/seam/b10-attach-modelauth.test.js +3 -11
  295. package/dist/daemon/api/__tests__/seam/leaf-api-parity.test.js +0 -6
  296. package/dist/daemon/api/handlers/attach.js +2 -1
  297. package/dist/daemon/api/handlers/broker-ops.js +3 -6
  298. package/dist/daemon/api/handlers/canvas.js +12 -18
  299. package/dist/daemon/api/handlers/feedback-comments.js +0 -8
  300. package/dist/daemon/api/handlers/health.js +3 -2
  301. package/dist/daemon/api/handlers/human-requests.js +0 -10
  302. package/dist/daemon/api/handlers/human.js +1 -5
  303. package/dist/daemon/api/handlers/inbox.js +0 -18
  304. package/dist/daemon/api/handlers/memory.js +1 -1
  305. package/dist/daemon/api/handlers/messages.js +4 -8
  306. package/dist/daemon/api/handlers/nodes.js +10 -21
  307. package/dist/daemon/api/handlers/reports.js +1 -1
  308. package/dist/daemon/api/handlers/reviews.js +1 -6
  309. package/dist/daemon/api/map.js +0 -6
  310. package/dist/daemon/api/router.js +0 -4
  311. package/dist/daemon/api/server.js +2 -5
  312. package/dist/daemon/boot-migrations.d.ts +14 -0
  313. package/dist/daemon/boot-migrations.js +31 -0
  314. package/dist/daemon/cron/armed-context.d.ts +21 -0
  315. package/dist/daemon/cron/armed-context.js +100 -0
  316. package/dist/daemon/cron/capture.d.ts +20 -0
  317. package/dist/daemon/cron/capture.js +45 -0
  318. package/dist/daemon/cron/disposition.d.ts +19 -0
  319. package/dist/daemon/cron/disposition.js +52 -0
  320. package/dist/daemon/cron/escalation.d.ts +12 -0
  321. package/dist/daemon/cron/escalation.js +124 -0
  322. package/dist/daemon/cron/held.d.ts +4 -0
  323. package/dist/daemon/cron/held.js +20 -0
  324. package/dist/daemon/cron/lease-recovery.d.ts +3 -0
  325. package/dist/daemon/cron/lease-recovery.js +119 -0
  326. package/dist/daemon/cron/live-runs.d.ts +11 -0
  327. package/dist/daemon/cron/live-runs.js +23 -0
  328. package/dist/daemon/cron/passes.d.ts +11 -0
  329. package/dist/daemon/cron/passes.js +78 -0
  330. package/dist/daemon/cron/settle.d.ts +28 -0
  331. package/dist/daemon/cron/settle.js +37 -0
  332. package/dist/daemon/cron/sinks.d.ts +2 -0
  333. package/dist/daemon/cron/sinks.js +100 -0
  334. package/dist/daemon/cron-run.d.ts +5 -41
  335. package/dist/daemon/cron-run.js +193 -882
  336. package/dist/daemon/crtrd-cli.js +2 -1
  337. package/dist/daemon/crtrd.js +22 -22
  338. package/dist/daemon/fleet.js +0 -4
  339. package/dist/daemon/human/deliver-action.js +2 -1
  340. package/dist/daemon/human/sweep.js +15 -4
  341. package/dist/daemon/manage.d.ts +2 -2
  342. package/dist/daemon/manage.js +4 -13
  343. package/dist/daemon/pidfile.js +2 -2
  344. package/dist/daemon/reconcilers/broker-supervision.js +26 -29
  345. package/dist/daemon/reconcilers/dormant-inbox.d.ts +1 -1
  346. package/dist/daemon/reconcilers/dormant-inbox.js +2 -1
  347. package/dist/daemon/reconcilers/live-obligation.js +2 -2
  348. package/dist/daemon/reconcilers/pending-review-submit.d.ts +1 -1
  349. package/dist/daemon/reconcilers/pending-review-submit.js +2 -1
  350. package/dist/daemon/reconcilers/storage-maintenance.d.ts +2 -1
  351. package/dist/daemon/reconcilers/storage-maintenance.js +2 -1
  352. package/dist/daemon/review/companion.js +2 -2
  353. package/dist/daemon/review/sweep.js +8 -3
  354. package/dist/migrations/001-surfaces-frontmatter.js +0 -6
  355. package/dist/migrations/corpus.js +2 -5
  356. package/dist/migrations/registry.js +15 -2
  357. package/dist/pi-extensions/__tests__/canvas-stophook-agentend.test.js +0 -4
  358. package/dist/pi-extensions/broker-local.js +2 -1
  359. package/dist/pi-extensions/canvas-bash-valve.js +3 -17
  360. package/dist/pi-extensions/canvas-context-intro.js +2 -7
  361. package/dist/pi-extensions/canvas-doc-substrate.js +2 -3
  362. package/dist/pi-extensions/canvas-goal-capture.js +2 -1
  363. package/dist/pi-extensions/canvas-inbox-watcher.js +5 -12
  364. package/dist/pi-extensions/canvas-passive-context.js +2 -5
  365. package/dist/pi-extensions/canvas-preview-result.js +2 -1
  366. package/dist/pi-extensions/canvas-prompt-scrub.js +2 -1
  367. package/dist/pi-extensions/canvas-recap.js +3 -16
  368. package/dist/pi-extensions/canvas-review-boundary.js +2 -5
  369. package/dist/pi-extensions/canvas-stophook.js +2 -26
  370. package/dist/pi-extensions/canvas-structured-output.js +2 -1
  371. package/dist/pi-extensions/canvas-tool-guide.js +2 -1
  372. package/dist/shared/__tests__/env-boundary.test.d.ts +1 -0
  373. package/dist/shared/__tests__/env-boundary.test.js +93 -0
  374. package/dist/shared/env.d.ts +68 -0
  375. package/dist/shared/env.js +171 -0
  376. package/package.json +3 -1
  377. package/runtime.lock.json +2 -2
  378. package/dist/core/canvas/render.d.ts +0 -47
  379. package/dist/core/canvas/render.js +0 -245
@@ -1,6 +1,6 @@
1
- import { matchesKey, truncateToWidth, visibleWidth } from "@earendil-works/pi-tui";
2
- import { padAnsi, theme, visibleRange } from "../../../core/tui/panel.js";
3
- import { displayVersion, plural } from "./model.js";
1
+ import { matchesKey, truncateToWidth, visibleWidth } from '@earendil-works/pi-tui';
2
+ import { padAnsi, theme, visibleRange } from '../../../core/tui/panel.js';
3
+ import { displayVersion, plural } from './model.js';
4
4
  /** The middle column of the plugin browser. It owns filtering and row position;
5
5
  * the shell owns horizontal navigation and actions. */
6
6
  export class PkgListPanel {
@@ -1,6 +1,6 @@
1
- import type { Field, InputParam } from "../../../core/help.js";
2
- import type { SurfaceEntry } from "../../../core/substrate/schema.js";
3
- import type { MemoryExtensionScalar, OwnerRef, Scope } from "../../../types.js";
1
+ import type { Field, InputParam } from '../../../core/help.js';
2
+ import type { SurfaceEntry } from '../../../core/substrate/schema.js';
3
+ import type { MemoryExtensionScalar, OwnerRef, Scope } from '../../../types.js';
4
4
  /** The scopes that can hold a marketplace, and that a plugin can be installed
5
5
  * into. Narrower than `Scope`: `builtin` names plugins that ship with crtr, and
6
6
  * `listAllMarketplaces()` never yields it, so a builtin marketplace or a
@@ -1,5 +1,5 @@
1
- import { type Component, type Focusable, type TUI } from "@earendil-works/pi-tui";
2
- import { type BindingId, type BindingResolution } from "../../../core/keybindings/index.js";
1
+ import { type Component, type Focusable, type TUI } from '@earendil-works/pi-tui';
2
+ import { type BindingId, type BindingResolution } from '../../../core/keybindings/index.js';
3
3
  /** Full-screen plugin browser. The data and mutation boundaries stay in the
4
4
  * catalog/actions collaborators, leaving this class responsible for movement,
5
5
  * disclosure, and the rendered page grammar. */
@@ -1,13 +1,13 @@
1
1
  // The `crtr pkg browse` page: a grouped source rail, plugin list, and dossier.
2
- import { Input, matchesKey, truncateToWidth, visibleWidth, } from "@earendil-works/pi-tui";
3
- import { formatGesture, matchesPiTuiInput, } from "../../../core/keybindings/index.js";
4
- import { runTuiPage } from "../../../core/tui/page-host.js";
5
- import { PAGE_CHROME_ROWS, columns, framed, padAnsi, pageFrame, theme, visibleRange, } from "../../../core/tui/panel.js";
6
- import { availableActions, presentAction, runAction } from "./actions.js";
7
- import { loadCapability, loadCatalog } from "./catalog.js";
8
- import { PkgDetailPanel } from "./detail-panel.js";
9
- import { PkgListPanel } from "./list-panel.js";
10
- import { INSTALLED_SOURCE_ID, marketplaceSourceId, plural, } from "./model.js";
2
+ import { Input, matchesKey, truncateToWidth, visibleWidth, } from '@earendil-works/pi-tui';
3
+ import { formatGesture, matchesPiTuiInput, } from '../../../core/keybindings/index.js';
4
+ import { runTuiPage } from '../../../core/tui/page-host.js';
5
+ import { PAGE_CHROME_ROWS, columns, framed, padAnsi, pageFrame, theme, visibleRange, } from '../../../core/tui/panel.js';
6
+ import { availableActions, presentAction, runAction } from './actions.js';
7
+ import { loadCapability, loadCatalog } from './catalog.js';
8
+ import { PkgDetailPanel } from './detail-panel.js';
9
+ import { PkgListPanel } from './list-panel.js';
10
+ import { INSTALLED_SOURCE_ID, marketplaceSourceId, plural, } from './model.js';
11
11
  const RAIL_WIDTH = 22;
12
12
  const LIST_WIDTH = 34;
13
13
  const RAIL_MIN_TOTAL_WIDTH = 84;
@@ -96,7 +96,7 @@ export class PkgBrowseShell {
96
96
  if (this.busy !== undefined)
97
97
  clearInterval(this.busy.timer);
98
98
  }
99
- // --- model selection -----------------------------------------------------
99
+ // model selection
100
100
  sources() {
101
101
  if (this.catalog.sources.length > 0)
102
102
  return this.catalog.sources;
@@ -171,7 +171,7 @@ export class PkgBrowseShell {
171
171
  clearActionNotice() {
172
172
  this.notice = undefined;
173
173
  }
174
- // --- input ---------------------------------------------------------------
174
+ // input
175
175
  /** A live filter, an open modal, or a running action holds every key — the
176
176
  * one predicate both `handleInput` and the footer consult, so the footer can
177
177
  * never advertise a key the filter is swallowing. */
@@ -279,7 +279,7 @@ export class PkgBrowseShell {
279
279
  this.syncSource();
280
280
  }
281
281
  }
282
- // --- actions and modals --------------------------------------------------
282
+ // actions and modals
283
283
  /** The focused rail row as an action subject. Carries the marketplace's scope
284
284
  * as well as its name: two marketplaces can share a name across the user and
285
285
  * project scopes, and without the scope `availableActions` cannot tell which
@@ -424,7 +424,7 @@ export class PkgBrowseShell {
424
424
  }
425
425
  this.tui.requestRender();
426
426
  }
427
- // --- rendering -----------------------------------------------------------
427
+ // rendering
428
428
  /** The source rail. It scrolls like the list does: marketplace count is user
429
429
  * controlled, so a fixed slice would let the selection sit below the last
430
430
  * drawn row, moving invisibly while the badge the user is aiming for never
@@ -1,3 +1,4 @@
1
+ import { envProfileId } from '../../shared/env.js';
1
2
  import { dirname, join, resolve, isAbsolute, relative, sep } from 'node:path';
2
3
  import { renameSync, writeFileSync } from 'node:fs';
3
4
  import { createHash } from 'node:crypto';
@@ -106,7 +107,7 @@ function assertManifestRequiresValid(manifest, where) {
106
107
  function missingRequirementWarnings(manifest) {
107
108
  if (manifest.requires === undefined)
108
109
  return [];
109
- const env = buildBrokerEnv({ argv: [], env: { CRTR_NODE_CWD: process.cwd(), CRTR_PROFILE_ID: process.env['CRTR_PROFILE_ID'] ?? '' } });
110
+ const env = buildBrokerEnv({ argv: [], env: { CRTR_NODE_CWD: process.cwd(), CRTR_PROFILE_ID: envProfileId() ?? '' } });
110
111
  return Object.entries(normalizeRequires(manifest.requires))
111
112
  .filter(([name]) => resolvePathExecutable(name, env, process.cwd()) === null)
112
113
  .map(([name, hint]) => `Warning: plugin "${manifest.name}" requires "${name}" on PATH — ${hint}`);
@@ -3,9 +3,7 @@ import { notFound, usage } from '../../core/errors.js';
3
3
  import { resolveScopeArg, pluginsDir, projectScopeRoot } from '../../core/scope.js';
4
4
  import { updateConfig } from '../../core/config.js';
5
5
  import { pathExists } from '../../core/fs-utils.js';
6
- // ---------------------------------------------------------------------------
7
6
  // Helpers
8
- // ---------------------------------------------------------------------------
9
7
  export const GIT_URL_RE = /^(https?:\/\/|git@|ssh:\/\/|file:\/\/)/;
10
8
  export function isGitUrl(arg) {
11
9
  return GIT_URL_RE.test(arg) || arg.endsWith('.git');
@@ -1,3 +1,4 @@
1
+ import { envNodeId } from '../../shared/env.js';
1
2
  import { defineLeaf } from '../../core/command.js';
2
3
  import { cliClient, rethrowAsCliError } from '../api-client.js';
3
4
  export const deleteLeaf = defineLeaf({
@@ -53,7 +54,7 @@ export const deleteLeaf = defineLeaf({
53
54
  const result = await cliClient().deleteProfile(input['profile'], {
54
55
  force: input['force'],
55
56
  detach: input['detach'],
56
- caller_node_id: process.env['CRTR_NODE_ID'] ?? null,
57
+ caller_node_id: envNodeId() ?? null,
57
58
  }).catch(rethrowAsCliError);
58
59
  return {
59
60
  ...result,
@@ -15,13 +15,14 @@
15
15
  // server-side inside feed `push()` (spec §7.4). This file reaches ZERO canvas
16
16
  // state-store code — no `core/feed`, no `core/canvas` accessors, no
17
17
  // `core/worktree`. The only node identity read is `CRTR_NODE_ID` (client-side).
18
+ import { envNodeId } from '../shared/env.js';
18
19
  import { defineBranch, defineLeaf } from '../core/command.js';
19
20
  import { InputError, readStdinRaw } from '../core/io.js';
20
21
  import { ApiError } from '../api/index.js';
21
22
  import { cliClient, rethrowAsCliError } from './api-client.js';
22
23
  import { markStopSignal } from '../core/runtime/stop-signals.js';
23
24
  function requireCallerNode() {
24
- const id = process.env['CRTR_NODE_ID'];
25
+ const id = envNodeId();
25
26
  if (id === undefined || id.trim() === '') {
26
27
  throw new InputError({
27
28
  error: 'no_node_context',
@@ -145,9 +146,7 @@ function makeTierLeaf(tier) {
145
146
  },
146
147
  });
147
148
  }
148
- // ---------------------------------------------------------------------------
149
149
  // Registration
150
- // ---------------------------------------------------------------------------
151
150
  export function registerPush() {
152
151
  return defineBranch({
153
152
  name: 'push',
@@ -23,9 +23,7 @@ import { routes } from '../api/index.js';
23
23
  // server-side).
24
24
  import { fullName } from '../core/canvas/labels.js';
25
25
  import { recordedPidLiveness } from '../core/canvas/pid.js';
26
- // ---------------------------------------------------------------------------
27
26
  // revive --all
28
- // ---------------------------------------------------------------------------
29
27
  export const reviveLeaf = defineLeaf({
30
28
  name: 'revive',
31
29
  description: 'mass-reconnect every disconnected node',
@@ -1,9 +1,10 @@
1
1
  // `crtr surface node` — pure tmux placement for node viewers.
2
+ import { envHomeOverride } from '../../../shared/env.js';
2
3
  import { closePane, currentTmux, displayPopup, ensureSession, getPaneOption, listLivePanes, openNodeWindow, paneCurrentPath, paneExists, paneLocation, panePid, paneStartCommand, renameWindow, respawnPaneInPlace, respawnPaneSync, selectLayout, selectPane, selectWindow, setPaneOption, shellQuote, splitWindow, switchClient, viewerSplitEnv, windowOfPane, } from '../../../core/runtime/placement-tmux.js';
3
4
  import { cliClient, rethrowAsCliError } from '../../api-client.js';
4
5
  export { closePane, currentTmux, displayPopup, paneCurrentPath, paneExists, panePid, paneStartCommand, respawnPaneInPlace, respawnPaneSync, shellQuote, viewerSplitEnv };
5
6
  export function viewerEnv() {
6
- const crtrHome = process.env['CRTR_HOME'];
7
+ const crtrHome = envHomeOverride();
7
8
  return crtrHome !== undefined ? { CRTR_HOME: crtrHome } : {};
8
9
  }
9
10
  /** The live viewer pane for `nodeId` (the pane a surface-attach viewer tagged
@@ -28,6 +28,7 @@
28
28
  // inherited tmux server env (like every crtr chrome pane) — no broker-side env
29
29
  // read, no host assumption. tmux-native throughout: a web-only surface has no
30
30
  // pane to split and resolves to the no_pane error, never a caller of this.
31
+ import { envNodeId } from '../shared/env.js';
31
32
  import { existsSync, statSync } from 'node:fs';
32
33
  import { isAbsolute, resolve } from 'node:path';
33
34
  import { defineLeaf } from '../core/command.js';
@@ -50,7 +51,7 @@ function resolveTargetPane(explicit) {
50
51
  // Agent path: split beside the pane where THIS node is being watched. Resolve
51
52
  // it by the authoritative @crtr_node tag (set by any viewer) — NOT the focus
52
53
  // table, which a bare `surface attach` never writes.
53
- const nodeId = process.env['CRTR_NODE_ID'];
54
+ const nodeId = envNodeId();
54
55
  if (nodeId !== undefined && nodeId !== '') {
55
56
  const pane = paneOfNode(nodeId);
56
57
  if (pane !== null)
@@ -4,9 +4,7 @@ import { usage, notFound } from '../../core/errors.js';
4
4
  import { scopeRoot, requireScopeRoot, listScopes } from '../../core/scope.js';
5
5
  import { resolveScope } from './shared.js';
6
6
  import { SCOPE_CONFIG_KEYS, USER_SETTINGS, findUserSetting } from '../../core/user-settings.js';
7
- // ---------------------------------------------------------------------------
8
7
  // Config helpers (ported from commands/config.ts)
9
- // ---------------------------------------------------------------------------
10
8
  const CONFIG_TOP_LEVEL_HELP = SCOPE_CONFIG_KEYS.join(', ');
11
9
  const SCALAR_SETTING_HELP = USER_SETTINGS.map((setting) => `${setting.key} (${setting.valueConstraint})`).join(', ');
12
10
  const MODEL_PROVIDERS = new Set(['anthropic', 'openai']);
@@ -136,9 +134,7 @@ function setNestedValue(cfg, key, rawValue, value) {
136
134
  }
137
135
  throw usage(`unsupported key path for set: ${key}`);
138
136
  }
139
- // ---------------------------------------------------------------------------
140
137
  // Leaf definitions
141
- // ---------------------------------------------------------------------------
142
138
  const configGet = defineLeaf({
143
139
  name: 'get',
144
140
  description: 'read a config value by key',
@@ -11,9 +11,7 @@ import { InputError } from '../../core/io.js';
11
11
  import { spawnDaemon, stopDaemonProcess, sweepStrayDaemons } from '../../daemon/manage.js';
12
12
  import { isDaemonRunning, readPidfile, isPidAlive } from '../../daemon/pidfile.js';
13
13
  import { cliClient } from '../api-client.js';
14
- // ---------------------------------------------------------------------------
15
14
  // daemon start
16
- // ---------------------------------------------------------------------------
17
15
  const daemonStart = defineLeaf({
18
16
  name: 'start',
19
17
  description: 'start the daemon in the background',
@@ -38,9 +36,7 @@ const daemonStart = defineLeaf({
38
36
  return result;
39
37
  },
40
38
  });
41
- // ---------------------------------------------------------------------------
42
39
  // daemon status
43
- // ---------------------------------------------------------------------------
44
40
  const daemonStatus = defineLeaf({
45
41
  name: 'status',
46
42
  description: 'check whether the daemon is running',
@@ -64,9 +60,7 @@ const daemonStatus = defineLeaf({
64
60
  : { running: false };
65
61
  },
66
62
  });
67
- // ---------------------------------------------------------------------------
68
63
  // daemon restart
69
- // ---------------------------------------------------------------------------
70
64
  const daemonRestart = defineLeaf({
71
65
  name: 'restart',
72
66
  description: 'put the selected runtime generation in service via a daemon-owned handover',
@@ -119,9 +113,7 @@ const daemonRestart = defineLeaf({
119
113
  }
120
114
  },
121
115
  });
122
- // ---------------------------------------------------------------------------
123
116
  // daemon stop
124
- // ---------------------------------------------------------------------------
125
117
  const daemonStop = defineLeaf({
126
118
  name: 'stop',
127
119
  description: 'stop the running daemon',
@@ -173,9 +165,7 @@ const daemonStop = defineLeaf({
173
165
  }
174
166
  },
175
167
  });
176
- // ---------------------------------------------------------------------------
177
168
  // Export — mounted under `crtr sys`
178
- // ---------------------------------------------------------------------------
179
169
  export const daemonBranch = defineBranch({
180
170
  name: 'daemon',
181
171
  description: 'manage the crtrd supervisor process',
@@ -1,3 +1,4 @@
1
+ import { envProfileId } from '../../shared/env.js';
1
2
  import { createHash } from 'node:crypto';
2
3
  import { lstat, readFile, readdir, readlink } from 'node:fs/promises';
3
4
  import { dirname, isAbsolute, join, relative, resolve, sep } from 'node:path';
@@ -183,7 +184,7 @@ async function runHookPluginChecks(scopes) {
183
184
  */
184
185
  function runBinContributionChecks(scopes) {
185
186
  const inScope = new Set(scopes);
186
- const { bins, issues } = resolveBinContributions(process.cwd(), process.env['CRTR_PROFILE_ID'] || null);
187
+ const { bins, issues } = resolveBinContributions(process.cwd(), envProfileId() || null);
187
188
  const results = [];
188
189
  for (const issue of issues) {
189
190
  if (!inScope.has(issue.scope))
@@ -253,7 +254,7 @@ function runHumanActionChecks(scopes) {
253
254
  * broker environment a node launched from this cwd/profile receives. */
254
255
  function runRequiresChecks(scopes) {
255
256
  const inScope = new Set(scopes);
256
- const env = buildBrokerEnv({ argv: [], env: { CRTR_NODE_CWD: process.cwd(), CRTR_PROFILE_ID: process.env['CRTR_PROFILE_ID'] ?? '' } });
257
+ const env = buildBrokerEnv({ argv: [], env: { CRTR_NODE_CWD: process.cwd(), CRTR_PROFILE_ID: envProfileId() ?? '' } });
257
258
  const results = [];
258
259
  for (const plugin of listAllPlugins()) {
259
260
  if (!inScope.has(plugin.scope) || !plugin.enabled || plugin.manifest.requires === undefined)
@@ -1,5 +1,5 @@
1
- import { Input } from "@earendil-works/pi-tui";
2
- import { type SetupPanel } from "../../../core/tui/panel.js";
1
+ import { Input } from '@earendil-works/pi-tui';
2
+ import { type SetupPanel } from '../../../core/tui/panel.js';
3
3
  export declare class BrokerLimitsPanel implements SetupPanel {
4
4
  private readonly onChange;
5
5
  readonly warningInput: Input;
@@ -1,7 +1,7 @@
1
- import { Input, truncateToWidth } from "@earendil-works/pi-tui";
2
- import { readConfig, updateRawConfigAtomically } from "../../../core/config.js";
3
- import { BROKER_LIMIT_OVERRIDE_PRECEDENCE } from "../setup.js";
4
- import { padAnsi, theme, wrapText } from "../../../core/tui/panel.js";
1
+ import { Input, truncateToWidth } from '@earendil-works/pi-tui';
2
+ import { readConfig, updateRawConfigAtomically } from '../../../core/config.js';
3
+ import { BROKER_LIMIT_OVERRIDE_PRECEDENCE } from '../setup.js';
4
+ import { padAnsi, theme, wrapText } from '../../../core/tui/panel.js';
5
5
  function positive(value) {
6
6
  return /^\d+$/.test(value) &&
7
7
  Number.isSafeInteger(Number(value)) &&
@@ -1,5 +1,5 @@
1
- import type { SetupSystemInstallPlan } from "../setup-core.js";
2
- import { type SetupPanel } from "../../../core/tui/panel.js";
1
+ import type { SetupSystemInstallPlan } from '../setup-core.js';
2
+ import { type SetupPanel } from '../../../core/tui/panel.js';
3
3
  export declare class DependenciesPanel implements SetupPanel {
4
4
  private readonly plans;
5
5
  private readonly onChange;
@@ -1,5 +1,5 @@
1
- import { truncateToWidth } from "@earendil-works/pi-tui";
2
- import { theme } from "../../../core/tui/panel.js";
1
+ import { truncateToWidth } from '@earendil-works/pi-tui';
2
+ import { theme } from '../../../core/tui/panel.js';
3
3
  function toolLabel(tool) {
4
4
  return tool === "nvim" ? "nvim" : tool === "nerd-font" ? "Nerd Font" : "tmux";
5
5
  }
@@ -1,4 +1,4 @@
1
- import { type BindingId, type BindingResolution } from "../../../core/keybindings/index.js";
1
+ import { type BindingId, type BindingResolution } from '../../../core/keybindings/index.js';
2
2
  export declare class KeybindingsPanel {
3
3
  private readonly openingBindings;
4
4
  private readonly terminalRows;
@@ -1,8 +1,8 @@
1
- import { Input, matchesKey, truncateToWidth, visibleWidth, } from "@earendil-works/pi-tui";
2
- import { BINDING_CATALOG, formatBinding, formatGesture, isAttachPaneBinding, matchesPiTuiInput, persistUserKeybindings, KeybindingConcurrentEditError, KeybindingValidationError, } from "../../../core/keybindings/index.js";
3
- import { installTmuxBindings, occupiedTmuxRootGestures, } from "../../../core/runtime/tmux-chrome.js";
4
- import { SetupKeybindingsDraft } from "../setup-core.js";
5
- import { padAnsi, theme } from "../../../core/tui/panel.js";
1
+ import { Input, matchesKey, truncateToWidth, visibleWidth, } from '@earendil-works/pi-tui';
2
+ import { BINDING_CATALOG, formatBinding, formatGesture, isAttachPaneBinding, matchesPiTuiInput, persistUserKeybindings, KeybindingConcurrentEditError, KeybindingValidationError, } from '../../../core/keybindings/index.js';
3
+ import { installTmuxBindings, occupiedTmuxRootGestures, } from '../../../core/runtime/tmux-chrome.js';
4
+ import { SetupKeybindingsDraft } from '../setup-core.js';
5
+ import { padAnsi, theme } from '../../../core/tui/panel.js';
6
6
  /** Collapse explicitly-paired catalog definitions into one setup action row.
7
7
  * Pair membership and field roles come only from catalog metadata; neither
8
8
  * rendering nor installation guesses from binding ID names. */
@@ -1,7 +1,7 @@
1
- import { ModelRegistry, ModelRuntime } from "@earendil-works/pi-coding-agent";
2
- import { type TUI } from "@earendil-works/pi-tui";
3
- import type { BindingId } from "../../../core/keybindings/index.js";
4
- import { type SetupPanel } from "../../../core/tui/panel.js";
1
+ import { ModelRegistry, ModelRuntime } from '@earendil-works/pi-coding-agent';
2
+ import { type TUI } from '@earendil-works/pi-tui';
3
+ import type { BindingId } from '../../../core/keybindings/index.js';
4
+ import { type SetupPanel } from '../../../core/tui/panel.js';
5
5
  export declare class ModelsPanel implements SetupPanel {
6
6
  private readonly tui;
7
7
  private readonly runtime;
@@ -1,12 +1,13 @@
1
- import { ModelSelectorComponent, SettingsManager, ThinkingSelectorComponent, } from "@earendil-works/pi-coding-agent";
2
- import { truncateToWidth } from "@earendil-works/pi-tui";
3
- import { basename, dirname, join } from "node:path";
4
- import { ANTHROPIC_PROVIDER_ID, OPENAI_CODEX_PROVIDER_ID, isManagedProvider, readSubscriptionPool, } from "../../../core/subscription-state.js";
5
- import { readRawConfigAtRoot, persistDefaultKindModel, persistModelLadders, readMergedLaunchConfig, } from "../../../core/config.js";
6
- import { findProjectScopeRoots, userScopeRoot } from "../../../core/scope.js";
7
- import { loadProfileManifest, profileRoot, } from "../../../core/profiles/manifest.js";
8
- import { configuredLadderProviders, inferPortableModelSelection, MODEL_PROVIDER_KEYS, MODEL_STRENGTHS, THINKING_SUFFIXES, } from "../../../core/runtime/model-selection.js";
9
- import { fitTail, padAnsi, renderRows, theme, } from "../../../core/tui/panel.js";
1
+ import { envProfileId } from '../../../shared/env.js';
2
+ import { ModelSelectorComponent, SettingsManager, ThinkingSelectorComponent, } from '@earendil-works/pi-coding-agent';
3
+ import { truncateToWidth } from '@earendil-works/pi-tui';
4
+ import { basename, dirname, join } from 'node:path';
5
+ import { ANTHROPIC_PROVIDER_ID, OPENAI_CODEX_PROVIDER_ID, isManagedProvider, readSubscriptionPool, } from '../../../core/subscription-state.js';
6
+ import { readRawConfigAtRoot, persistDefaultKindModel, persistModelLadders, readMergedLaunchConfig, } from '../../../core/config.js';
7
+ import { findProjectScopeRoots, userScopeRoot } from '../../../core/scope.js';
8
+ import { loadProfileManifest, profileRoot, } from '../../../core/profiles/manifest.js';
9
+ import { configuredLadderProviders, inferPortableModelSelection, MODEL_PROVIDER_KEYS, MODEL_STRENGTHS, THINKING_SUFFIXES, } from '../../../core/runtime/model-selection.js';
10
+ import { fitTail, padAnsi, renderRows, theme, } from '../../../core/tui/panel.js';
10
11
  const MODELS_CHROME_LINES = 3;
11
12
  const RUNTIME_PROVIDER_ID = {
12
13
  anthropic: ANTHROPIC_PROVIDER_ID,
@@ -24,7 +25,7 @@ const KIND_COLUMNS = [
24
25
  ];
25
26
  function modelConfigTargets() {
26
27
  const userRoot = userScopeRoot();
27
- const profileId = process.env["CRTR_PROFILE_ID"] || null;
28
+ const profileId = envProfileId() || null;
28
29
  let profileTarget;
29
30
  if (profileId !== null) {
30
31
  try {
@@ -1,5 +1,5 @@
1
- import type { SetupPackageId, SetupPackageManifestEntry } from "../setup-core.js";
2
- import { type SetupPanel } from "../../../core/tui/panel.js";
1
+ import type { SetupPackageId, SetupPackageManifestEntry } from '../setup-core.js';
2
+ import { type SetupPanel } from '../../../core/tui/panel.js';
3
3
  export declare class PluginsPanel implements SetupPanel {
4
4
  private readonly manifest;
5
5
  private readonly installedPackageIds;
@@ -1,5 +1,5 @@
1
- import { truncateToWidth } from "@earendil-works/pi-tui";
2
- import { theme, wrapText } from "../../../core/tui/panel.js";
1
+ import { truncateToWidth } from '@earendil-works/pi-tui';
2
+ import { theme, wrapText } from '../../../core/tui/panel.js';
3
3
  export class PluginsPanel {
4
4
  manifest;
5
5
  installedPackageIds;
@@ -1,5 +1,5 @@
1
- import { type UserSettingGroup } from "../../../core/user-settings.js";
2
- import { type SetupPanel } from "../../../core/tui/panel.js";
1
+ import { type UserSettingGroup } from '../../../core/user-settings.js';
2
+ import { type SetupPanel } from '../../../core/tui/panel.js';
3
3
  /**
4
4
  * One destination's worth of user-scope preference rows. The old single
5
5
  * "Settings" tab listed every row flat with a permanent description under each,
@@ -1,7 +1,7 @@
1
- import { truncateToWidth } from "@earendil-works/pi-tui";
2
- import { readConfig, updateConfig } from "../../../core/config.js";
3
- import { userSettingsInGroup, } from "../../../core/user-settings.js";
4
- import { padAnsi, theme, visibleRange, wrapText, } from "../../../core/tui/panel.js";
1
+ import { truncateToWidth } from '@earendil-works/pi-tui';
2
+ import { readConfig, updateConfig } from '../../../core/config.js';
3
+ import { userSettingsInGroup, } from '../../../core/user-settings.js';
4
+ import { padAnsi, theme, visibleRange, wrapText, } from '../../../core/tui/panel.js';
5
5
  const LABEL_WIDTH = 26;
6
6
  /**
7
7
  * One destination's worth of user-scope preference rows. The old single
@@ -1,4 +1,4 @@
1
- import { type SetupPanel } from "../../../core/tui/panel.js";
1
+ import { type SetupPanel } from '../../../core/tui/panel.js';
2
2
  export declare class ProfilesPanel implements SetupPanel {
3
3
  private readonly cwd;
4
4
  private readonly onChange;
@@ -11,14 +11,15 @@
11
11
  // `default-binding.ts`, exactly as the `crtr profile` leaves do. Deletion is
12
12
  // the one exception: it cascades across nodes, crons, tickets and reviews, so
13
13
  // it routes through crtrd like `crtr profile delete`.
14
- import { Input, matchesKey, truncateToWidth } from "@earendil-works/pi-tui";
15
- import { basename } from "node:path";
16
- import { PROFILE_PROJECT_MEMORY_VALUES } from "../../../api/dto/profiles.js";
17
- import { cliClient } from "../../api-client.js";
18
- import { clearDefaultProfile, defaultProfileDirs, getDefaultProfileId, setDefaultProfileId, } from "../../../core/profiles/default-binding.js";
19
- import { ROOT_PROFILE_ID, addProfileProject, createProfile, listProfiles, pauseProfile, removeProfileProject, renameProfile, resumeProfile, } from "../../../core/profiles/manifest.js";
20
- import { profileCoversCwd, tildify } from "../../../core/profiles/select.js";
21
- import { padAnsi, theme, visibleRange, wrapText, } from "../../../core/tui/panel.js";
14
+ import { envNodeId } from '../../../shared/env.js';
15
+ import { Input, matchesKey, truncateToWidth } from '@earendil-works/pi-tui';
16
+ import { basename } from 'node:path';
17
+ import { PROFILE_PROJECT_MEMORY_VALUES } from '../../../api/dto/profiles.js';
18
+ import { cliClient } from '../../api-client.js';
19
+ import { clearDefaultProfile, defaultProfileDirs, getDefaultProfileId, setDefaultProfileId, } from '../../../core/profiles/default-binding.js';
20
+ import { ROOT_PROFILE_ID, addProfileProject, createProfile, listProfiles, pauseProfile, removeProfileProject, renameProfile, resumeProfile, } from '../../../core/profiles/manifest.js';
21
+ import { profileCoversCwd, tildify } from '../../../core/profiles/select.js';
22
+ import { padAnsi, theme, visibleRange, wrapText, } from '../../../core/tui/panel.js';
22
23
  /** Coarse "used ..." for telling otherwise-alike profiles apart. */
23
24
  function relativeUsed(iso) {
24
25
  if (iso === null)
@@ -97,7 +98,7 @@ export class ProfilesPanel {
97
98
  return matchesKey(data, "escape") || matchesKey(data, "left");
98
99
  return true;
99
100
  }
100
- // --- state ----------------------------------------------------------------
101
+ // state
101
102
  /** Profiles covering cwd first (most recently used within), then the rest by
102
103
  * recency, with root last — the ones a startup pick is deciding between sit
103
104
  * at the top, where the eye starts. */
@@ -157,7 +158,7 @@ export class ProfilesPanel {
157
158
  this.say(messageOf(error), "warning");
158
159
  }
159
160
  }
160
- // --- input ----------------------------------------------------------------
161
+ // input
161
162
  handleInput(data, matches) {
162
163
  const handled = this.route(data, matches);
163
164
  if (handled)
@@ -295,7 +296,7 @@ export class ProfilesPanel {
295
296
  this.dirIndex = (this.dirIndex + delta + count) % count;
296
297
  this.notice = undefined;
297
298
  }
298
- // --- actions --------------------------------------------------------------
299
+ // actions
299
300
  addCwdTo(entry) {
300
301
  if (entry === null)
301
302
  return true;
@@ -428,7 +429,7 @@ export class ProfilesPanel {
428
429
  try {
429
430
  const result = await cliClient().deleteProfile(open.profileId, {
430
431
  force: true,
431
- caller_node_id: process.env["CRTR_NODE_ID"] ?? null,
432
+ caller_node_id: envNodeId() ?? null,
432
433
  });
433
434
  this.openId = null;
434
435
  this.reload();
@@ -442,7 +443,7 @@ export class ProfilesPanel {
442
443
  this.onChange();
443
444
  }
444
445
  }
445
- // --- rendering ------------------------------------------------------------
446
+ // rendering
446
447
  footerHint() {
447
448
  switch (this.mode) {
448
449
  case "new-name":
@@ -1,6 +1,6 @@
1
- import { ModelRegistry, ModelRuntime } from "@earendil-works/pi-coding-agent";
2
- import { type TUI } from "@earendil-works/pi-tui";
3
- import { type SetupPanel } from "../../../core/tui/panel.js";
1
+ import { ModelRegistry, ModelRuntime } from '@earendil-works/pi-coding-agent';
2
+ import { type TUI } from '@earendil-works/pi-tui';
3
+ import { type SetupPanel } from '../../../core/tui/panel.js';
4
4
  type AuthStatus = ReturnType<ModelRegistry["getProviderAuthStatus"]>;
5
5
  type ProviderAuthType = "oauth" | "api_key";
6
6
  type ProviderRow = {
@@ -1,11 +1,11 @@
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 "../../../core/tui/panel.js";
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 '../../../core/tui/panel.js';
9
9
  /** Curated setup-catalog view over pi's OAuth providers + the model registry. */
10
10
  export function buildProviderCatalog(runtime, registry) {
11
11
  const oauth = runtime
@@ -1,6 +1,6 @@
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";
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
4
  export type DestinationId = "providers" | "models" | "keybindings" | "display" | "profiles" | "panes" | "broker-limits" | "updates";
5
5
  export declare class SettingsShell implements Component, Focusable {
6
6
  private readonly tui;