@north-light/crouter 0.3.318 → 0.3.320

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 (1304) hide show
  1. package/README.md +0 -3
  2. package/dist/api/client.js +2 -912
  3. package/dist/api/dto/attach.js +0 -13
  4. package/dist/api/dto/bash-jobs.js +1 -9
  5. package/dist/api/dto/broker-ops.js +0 -6
  6. package/dist/api/dto/broker.js +0 -20
  7. package/dist/api/dto/canvas.js +0 -2
  8. package/dist/api/dto/chat-inventory.js +0 -11
  9. package/dist/api/dto/common.js +1 -15
  10. package/dist/api/dto/config.js +0 -3
  11. package/dist/api/dto/crons.js +1 -10
  12. package/dist/api/dto/files.js +0 -7
  13. package/dist/api/dto/focus.js +0 -10
  14. package/dist/api/dto/health.js +0 -2
  15. package/dist/api/dto/human-requests.js +0 -4
  16. package/dist/api/dto/human.js +0 -4
  17. package/dist/api/dto/inbox.js +0 -4
  18. package/dist/api/dto/lifecycle.js +0 -3
  19. package/dist/api/dto/mail.js +0 -1
  20. package/dist/api/dto/memory.js +0 -6
  21. package/dist/api/dto/messages.js +0 -2
  22. package/dist/api/dto/model-config.js +0 -1
  23. package/dist/api/dto/modelauth.js +0 -4
  24. package/dist/api/dto/node-outcomes.js +0 -2
  25. package/dist/api/dto/nodes.js +0 -3
  26. package/dist/api/dto/profiles.js +1 -4
  27. package/dist/api/dto/recovery.js +0 -1
  28. package/dist/api/dto/reports.js +0 -2
  29. package/dist/api/dto/review-comments.js +0 -5
  30. package/dist/api/dto/reviews.js +0 -5
  31. package/dist/api/dto/subscriptions.js +0 -2
  32. package/dist/api/dto/worktree.js +0 -6
  33. package/dist/api/errors.js +1 -40
  34. package/dist/api/index.js +1 -33
  35. package/dist/api/plugin-manifest-schema.js +0 -23
  36. package/dist/api/routes.js +1 -147
  37. package/dist/build-root.js +1 -198
  38. package/dist/cli.js +3 -99
  39. package/dist/clients/attach/ansi-cells.js +1 -137
  40. package/dist/clients/attach/chrome/bash-jobs.js +1 -31
  41. package/dist/clients/attach/chrome/canvas-panels.js +1 -194
  42. package/dist/clients/attach/chrome/completion-bell.js +1 -89
  43. package/dist/clients/attach/chrome/cron-wait.js +1 -34
  44. package/dist/clients/attach/chrome/git-info.js +2 -44
  45. package/dist/clients/attach/chrome/header.js +1 -30
  46. package/dist/clients/attach/chrome/inbox-strip.js +1 -199
  47. package/dist/clients/attach/chrome/recap.js +1 -19
  48. package/dist/clients/attach/chrome/review-wait.js +1 -22
  49. package/dist/clients/attach/chrome/roster.js +4 -275
  50. package/dist/clients/attach/chrome/status-line.js +1 -117
  51. package/dist/clients/attach/chrome/ticket-panel.js +1 -280
  52. package/dist/clients/attach/chrome/widgets.js +1 -51
  53. package/dist/clients/attach/command.js +1 -107
  54. package/dist/clients/attach/config.js +1 -274
  55. package/dist/clients/attach/input/capabilities.js +1 -104
  56. package/dist/clients/attach/input/clipboard-image.js +3 -220
  57. package/dist/clients/attach/input/completion-frecency.js +1 -141
  58. package/dist/clients/attach/input/controller.js +7 -377
  59. package/dist/clients/attach/input/overlay-owner.js +1 -199
  60. package/dist/clients/attach/input/ref-autocomplete.js +2 -176
  61. package/dist/clients/attach/input/titled-editor.js +4 -859
  62. package/dist/clients/attach/overlays/auth.js +2 -271
  63. package/dist/clients/attach/overlays/dialogs.js +2 -102
  64. package/dist/clients/attach/overlays/file-review.js +2 -128
  65. package/dist/clients/attach/overlays/graph.js +1 -661
  66. package/dist/clients/attach/overlays/help.js +1 -211
  67. package/dist/clients/attach/overlays/mcp.js +1 -302
  68. package/dist/clients/attach/overlays/pickers.js +1 -163
  69. package/dist/clients/attach/render/activity-slot.js +1 -13
  70. package/dist/clients/attach/render/assistant-message.js +1 -56
  71. package/dist/clients/attach/render/card-presentation.js +5 -218
  72. package/dist/clients/attach/render/chat-view.js +5 -1708
  73. package/dist/clients/attach/render/condensed-history.js +1 -60
  74. package/dist/clients/attach/render/context-message.js +1 -63
  75. package/dist/clients/attach/render/crtr-output.js +17 -905
  76. package/dist/clients/attach/render/diagram.js +7 -111
  77. package/dist/clients/attach/render/edit-diff.js +5 -304
  78. package/dist/clients/attach/render/glyph-codepoints.js +1 -42
  79. package/dist/clients/attach/render/group-activity.js +2 -263
  80. package/dist/clients/attach/render/group-recap.js +1 -152
  81. package/dist/clients/attach/render/markdown-source.js +5 -266
  82. package/dist/clients/attach/render/measured-container.js +1 -322
  83. package/dist/clients/attach/render/page-block.js +1 -183
  84. package/dist/clients/attach/render/scroll-animation.js +1 -80
  85. package/dist/clients/attach/render/tool-calls.js +3 -361
  86. package/dist/clients/attach/render/transcript-copy.js +2 -81
  87. package/dist/clients/attach/render/transcript-search.js +1 -152
  88. package/dist/clients/attach/render/viewport.js +1 -184
  89. package/dist/clients/attach/session/banner.js +1 -29
  90. package/dist/clients/attach/session/bindings.js +1 -71
  91. package/dist/clients/attach/session/chrome-refresh.js +1 -94
  92. package/dist/clients/attach/session/connection.js +1 -186
  93. package/dist/clients/attach/session/context.js +0 -16
  94. package/dist/clients/attach/session/editor-frame.js +1 -142
  95. package/dist/clients/attach/session/editor-inventory.js +6 -160
  96. package/dist/clients/attach/session/file-links.js +1 -68
  97. package/dist/clients/attach/session/focus-events.js +1 -12
  98. package/dist/clients/attach/session/frame.js +1 -214
  99. package/dist/clients/attach/session/frames.js +1 -188
  100. package/dist/clients/attach/session/identity.js +1 -26
  101. package/dist/clients/attach/session/input-wiring.js +1 -140
  102. package/dist/clients/attach/session/invariant.js +1 -15
  103. package/dist/clients/attach/session/keys.js +1 -77
  104. package/dist/clients/attach/session/layout.js +1 -59
  105. package/dist/clients/attach/session/mouse.js +1 -78
  106. package/dist/clients/attach/session/pane-focus.js +1 -42
  107. package/dist/clients/attach/session/pane-tag.js +1 -112
  108. package/dist/clients/attach/session/pi-assets.js +1 -24
  109. package/dist/clients/attach/session/pi-oauth-flows.js +1 -21
  110. package/dist/clients/attach/session/profile-files.js +1 -228
  111. package/dist/clients/attach/session/reconnect.js +1 -175
  112. package/dist/clients/attach/session/selection.js +3 -108
  113. package/dist/clients/attach/session/state-sync.js +1 -67
  114. package/dist/clients/attach/session/surface-frame.js +1 -73
  115. package/dist/clients/attach/session/surface-host.js +1 -255
  116. package/dist/clients/attach/session/teardown.js +5 -94
  117. package/dist/clients/attach/session/transcript-search.js +3 -151
  118. package/dist/clients/attach/session/whip-achievements.js +2 -145
  119. package/dist/clients/attach/session/whip.js +1 -362
  120. package/dist/clients/attach/slash/dispatch.js +1 -706
  121. package/dist/clients/attach/slash/prompt-preview.js +1 -121
  122. package/dist/clients/attach/viewer.js +441 -441
  123. package/dist/clients/conversation/projection.js +1 -324
  124. package/dist/clients/conversation/submit.js +1 -51
  125. package/dist/clients/inbox/controller.js +1 -701
  126. package/dist/clients/inbox/dto-adapt.js +1 -93
  127. package/dist/clients/inbox/layout.js +1 -9
  128. package/dist/clients/inbox/page-adapter.js +1 -55
  129. package/dist/clients/inbox/resolve.js +1 -35
  130. package/dist/clients/inbox/review/anchors.js +1 -89
  131. package/dist/clients/inbox/review/comments-client.js +1 -98
  132. package/dist/clients/inbox/review/companion-pane.js +1 -82
  133. package/dist/clients/inbox/review/document-surface.js +2 -1188
  134. package/dist/clients/inbox/review/frame.js +1 -216
  135. package/dist/clients/inbox/review/keys.js +1 -123
  136. package/dist/clients/inbox/review/launch.js +1 -151
  137. package/dist/clients/inbox/review/live-source.js +1 -160
  138. package/dist/clients/inbox/review/nvim.js +1 -44
  139. package/dist/clients/inbox/review/remap.js +1 -157
  140. package/dist/clients/inbox/review/review-client.js +1 -123
  141. package/dist/clients/inbox/review/roundtrip.js +3 -36
  142. package/dist/clients/inbox/review/state.js +4 -315
  143. package/dist/clients/inbox/review-adapter.js +1 -43
  144. package/dist/clients/inbox/surface.js +1 -152
  145. package/dist/clients/inbox/tui/ansi.js +3 -321
  146. package/dist/clients/inbox/tui/input.js +5 -392
  147. package/dist/clients/inbox/tui/keys.js +1 -104
  148. package/dist/clients/inbox/tui/page-body.js +1 -66
  149. package/dist/clients/inbox/tui/panel.js +1 -84
  150. package/dist/clients/inbox/tui/render.js +2 -368
  151. package/dist/clients/inbox/tui/slots.js +3 -134
  152. package/dist/clients/inbox/tui/types.js +0 -1
  153. package/dist/clients/inbox/tui.js +1 -86
  154. package/dist/clients/surfaces/host.js +0 -1
  155. package/dist/commands/api-client.js +4 -290
  156. package/dist/commands/attention.js +1 -215
  157. package/dist/commands/canvas-browse.js +1 -70
  158. package/dist/commands/canvas-config.js +2 -192
  159. package/dist/commands/canvas-history/grep.js +7 -85
  160. package/dist/commands/canvas-history/read.js +3 -50
  161. package/dist/commands/canvas-history/search.js +10 -99
  162. package/dist/commands/canvas-history/shared.js +1 -139
  163. package/dist/commands/canvas-history/stats.js +6 -68
  164. package/dist/commands/canvas-history.js +1 -32
  165. package/dist/commands/canvas-issue.js +14 -149
  166. package/dist/commands/canvas-prune.js +1 -108
  167. package/dist/commands/canvas-roster.js +1 -69
  168. package/dist/commands/canvas-snapshot.js +1 -34
  169. package/dist/commands/canvas-use.js +1 -61
  170. package/dist/commands/canvas.js +1 -49
  171. package/dist/commands/chord.js +1 -241
  172. package/dist/commands/cron.js +11 -534
  173. package/dist/commands/dashboard.js +1 -85
  174. package/dist/commands/human/components.js +3 -77
  175. package/dist/commands/human/feedback.js +1 -112
  176. package/dist/commands/human/prompts.js +1 -331
  177. package/dist/commands/human/queue.js +1 -191
  178. package/dist/commands/human/request.js +1 -266
  179. package/dist/commands/human/review.js +1 -288
  180. package/dist/commands/human/shared.js +1 -67
  181. package/dist/commands/human.js +4 -60
  182. package/dist/commands/memory/delete.js +1 -100
  183. package/dist/commands/memory/edit.js +21 -219
  184. package/dist/commands/memory/find.js +2 -244
  185. package/dist/commands/memory/history.js +5 -199
  186. package/dist/commands/memory/lint.js +1 -107
  187. package/dist/commands/memory/list.js +1 -142
  188. package/dist/commands/memory/move.js +1 -223
  189. package/dist/commands/memory/origin.js +1 -130
  190. package/dist/commands/memory/read.js +6 -232
  191. package/dist/commands/memory/shared.js +12 -802
  192. package/dist/commands/memory/write.js +13 -235
  193. package/dist/commands/memory.js +1 -30
  194. package/dist/commands/node/bash.js +5 -245
  195. package/dist/commands/node/create.js +3 -332
  196. package/dist/commands/node/inspect.js +12 -300
  197. package/dist/commands/node/lifecycle.js +2 -453
  198. package/dist/commands/node/message.js +1 -161
  199. package/dist/commands/node/outcome.js +4 -134
  200. package/dist/commands/node/pyramid.js +2 -79
  201. package/dist/commands/node/subscription.js +1 -78
  202. package/dist/commands/node/wait.js +7 -163
  203. package/dist/commands/node-context.js +2 -159
  204. package/dist/commands/node-inspect-artifacts.js +8 -109
  205. package/dist/commands/node-lifecycle-revive.js +1 -217
  206. package/dist/commands/node-snapshot.js +1 -37
  207. package/dist/commands/node-transcript.js +1 -62
  208. package/dist/commands/node-worktree.js +1 -138
  209. package/dist/commands/node.js +1 -29
  210. package/dist/commands/pkg/browse/actions.js +1 -198
  211. package/dist/commands/pkg/browse/catalog.js +1 -466
  212. package/dist/commands/pkg/browse/command-view.js +1 -191
  213. package/dist/commands/pkg/browse/detail-panel.js +1 -402
  214. package/dist/commands/pkg/browse/doc-view.js +1 -89
  215. package/dist/commands/pkg/browse/list-panel.js +2 -168
  216. package/dist/commands/pkg/browse/model.js +1 -36
  217. package/dist/commands/pkg/browse/shell.js +1 -640
  218. package/dist/commands/pkg/browse.js +1 -27
  219. package/dist/commands/pkg/market-inspect.js +1 -141
  220. package/dist/commands/pkg/market-manage.js +1 -327
  221. package/dist/commands/pkg/market.js +1 -14
  222. package/dist/commands/pkg/plugin-inspect.js +1 -168
  223. package/dist/commands/pkg/plugin-manage.js +17 -1109
  224. package/dist/commands/pkg/plugin.js +1 -14
  225. package/dist/commands/pkg/shared.js +1 -62
  226. package/dist/commands/pkg.js +1 -21
  227. package/dist/commands/profile/default.js +1 -139
  228. package/dist/commands/profile/delete.js +1 -66
  229. package/dist/commands/profile/env.js +3 -188
  230. package/dist/commands/profile/kind.js +2 -35
  231. package/dist/commands/profile/list.js +1 -43
  232. package/dist/commands/profile/meta.js +1 -67
  233. package/dist/commands/profile/new.js +1 -115
  234. package/dist/commands/profile/pause.js +1 -59
  235. package/dist/commands/profile/project.js +1 -113
  236. package/dist/commands/profile/rename.js +1 -38
  237. package/dist/commands/profile/show.js +1 -52
  238. package/dist/commands/profile.js +1 -35
  239. package/dist/commands/push.js +9 -265
  240. package/dist/commands/revive.js +10 -181
  241. package/dist/commands/surface/node/cycle.js +1 -83
  242. package/dist/commands/surface/node/focus.js +1 -81
  243. package/dist/commands/surface/node/id.js +1 -38
  244. package/dist/commands/surface/node/pin.js +1 -42
  245. package/dist/commands/surface/node/placement.js +1 -134
  246. package/dist/commands/surface-edit.js +1 -157
  247. package/dist/commands/surface-inbox.js +1 -98
  248. package/dist/commands/surface-inspect.js +1 -39
  249. package/dist/commands/surface-node.js +1 -19
  250. package/dist/commands/surface-reload.js +2 -134
  251. package/dist/commands/surface-tmux-spread.js +1 -214
  252. package/dist/commands/surface.js +1 -28
  253. package/dist/commands/sys/branch.js +1 -19
  254. package/dist/commands/sys/config.js +1 -353
  255. package/dist/commands/sys/context/admin/actions.js +2 -246
  256. package/dist/commands/sys/context/admin/detail-panel.js +1 -247
  257. package/dist/commands/sys/context/admin/docs-panel.js +1 -191
  258. package/dist/commands/sys/context/admin/list-view.js +1 -183
  259. package/dist/commands/sys/context/admin/model.js +1 -229
  260. package/dist/commands/sys/context/admin/rail-panel.js +1 -227
  261. package/dist/commands/sys/context/admin/read-view.js +2 -194
  262. package/dist/commands/sys/context/admin/shell.js +1 -910
  263. package/dist/commands/sys/context/admin.js +2 -126
  264. package/dist/commands/sys/context/doc.js +3 -197
  265. package/dist/commands/sys/context/prompt-review.js +11 -291
  266. package/dist/commands/sys/context/resolve.js +10 -489
  267. package/dist/commands/sys/context/sysprompt.js +5 -96
  268. package/dist/commands/sys/context.js +1 -20
  269. package/dist/commands/sys/daemon.js +1 -313
  270. package/dist/commands/sys/doctor.js +1 -617
  271. package/dist/commands/sys/feedback.js +7 -228
  272. package/dist/commands/sys/logs.js +3 -129
  273. package/dist/commands/sys/migrate.js +1 -94
  274. package/dist/commands/sys/panels/broker-limits-panel.js +2 -110
  275. package/dist/commands/sys/panels/dependencies-panel.js +1 -80
  276. package/dist/commands/sys/panels/keybindings-panel.js +1 -703
  277. package/dist/commands/sys/panels/models-panel.js +1 -1133
  278. package/dist/commands/sys/panels/plugins-panel.js +1 -80
  279. package/dist/commands/sys/panels/prefs-panel.js +1 -85
  280. package/dist/commands/sys/panels/profiles-panel.js +1 -601
  281. package/dist/commands/sys/panels/provider-panel.js +1 -538
  282. package/dist/commands/sys/settings-shell.js +1 -400
  283. package/dist/commands/sys/settings.js +1 -46
  284. package/dist/commands/sys/setup-core.js +6 -579
  285. package/dist/commands/sys/setup-settings-runner.js +1 -16
  286. package/dist/commands/sys/setup-wizard.js +1 -279
  287. package/dist/commands/sys/setup.js +1 -34
  288. package/dist/commands/sys/shared.js +1 -81
  289. package/dist/commands/sys/support/prepare.js +3 -239
  290. package/dist/commands/sys/support/submit.js +6 -524
  291. package/dist/commands/sys/support.js +1 -18
  292. package/dist/commands/sys/sync-deps.js +15 -498
  293. package/dist/commands/sys/sync-project-guidance.js +4 -481
  294. package/dist/commands/sys/sync-shared.js +1 -49
  295. package/dist/commands/sys/sync-skills.js +2 -311
  296. package/dist/commands/sys/sync.js +1 -18
  297. package/dist/commands/sys/update.js +1 -147
  298. package/dist/commands/sys/worktrees.js +5 -53
  299. package/dist/commands/sys.js +1 -18
  300. package/dist/core/activity-signal.js +2 -38
  301. package/dist/core/asset-root.js +1 -18
  302. package/dist/core/auth-file.js +2 -179
  303. package/dist/core/auth-interaction.js +3 -94
  304. package/dist/core/auto-update.js +4 -94
  305. package/dist/core/bash-guard.js +11 -393
  306. package/dist/core/bash-jobs.js +7 -411
  307. package/dist/core/bootstrap.js +2 -53
  308. package/dist/core/broker-client/client.js +1 -184
  309. package/dist/core/broker-client/index.js +1 -13
  310. package/dist/core/broker-client/transport-relay.js +1 -157
  311. package/dist/core/broker-client/transport-socket.js +1 -179
  312. package/dist/core/broker-client/transport.js +1 -26
  313. package/dist/core/canvas/attention.js +1 -47
  314. package/dist/core/canvas/boot-id.js +1 -26
  315. package/dist/core/canvas/boot.js +1 -186
  316. package/dist/core/canvas/browse/app.js +3 -919
  317. package/dist/core/canvas/browse/model.js +1 -477
  318. package/dist/core/canvas/browse/pins.js +1 -29
  319. package/dist/core/canvas/browse/render.js +3 -1055
  320. package/dist/core/canvas/canvas.js +15 -922
  321. package/dist/core/canvas/crons.js +11 -481
  322. package/dist/core/canvas/daemon-owner.js +2 -146
  323. package/dist/core/canvas/db.js +2 -100
  324. package/dist/core/canvas/deliveries.js +22 -283
  325. package/dist/core/canvas/delivery-contract.js +1 -8
  326. package/dist/core/canvas/executions.js +1 -68
  327. package/dist/core/canvas/extensions.js +1 -83
  328. package/dist/core/canvas/focuses.js +1 -77
  329. package/dist/core/canvas/history.js +24 -860
  330. package/dist/core/canvas/index.js +1 -15
  331. package/dist/core/canvas/install-id.js +1 -84
  332. package/dist/core/canvas/labels.js +1 -43
  333. package/dist/core/canvas/meta-file.js +1 -89
  334. package/dist/core/canvas/migrations.js +41 -1150
  335. package/dist/core/canvas/nav-model.js +1 -231
  336. package/dist/core/canvas/nav-render.js +1 -260
  337. package/dist/core/canvas/node-order.js +1 -37
  338. package/dist/core/canvas/node-recap.js +2 -67
  339. package/dist/core/canvas/node-sql-migration.js +2 -209
  340. package/dist/core/canvas/paths.js +1 -153
  341. package/dist/core/canvas/pid.js +4 -683
  342. package/dist/core/canvas/recovery.js +3 -565
  343. package/dist/core/canvas/remote-canvas-source.js +1 -288
  344. package/dist/core/canvas/remote-transport.js +1 -57
  345. package/dist/core/canvas/render-source.js +10 -635
  346. package/dist/core/canvas/sessions.js +1 -78
  347. package/dist/core/canvas/source.js +1 -47
  348. package/dist/core/canvas/status-glyph.js +1 -132
  349. package/dist/core/canvas/telemetry.js +1 -35
  350. package/dist/core/canvas/types.js +1 -6
  351. package/dist/core/canvas/waits.js +4 -68
  352. package/dist/core/canvas/worktrees.js +1 -93
  353. package/dist/core/clipboard-text.js +1 -57
  354. package/dist/core/command-hooks/artifact.js +1 -145
  355. package/dist/core/command-hooks/catalog.js +1 -38
  356. package/dist/core/command-hooks/compose.js +1 -99
  357. package/dist/core/command-hooks/discovery.js +1 -228
  358. package/dist/core/command-hooks/help.js +1 -18
  359. package/dist/core/command-hooks/index.js +1 -7
  360. package/dist/core/command-hooks/lifecycle-catalog.js +1 -9
  361. package/dist/core/command-hooks/lifecycle-create.js +1 -51
  362. package/dist/core/command-hooks/report.js +1 -28
  363. package/dist/core/command-hooks/schema.js +1 -157
  364. package/dist/core/command-hooks/transport/exec-invoke.js +1 -276
  365. package/dist/core/command-hooks/transport/exec-lifecycle.js +1 -211
  366. package/dist/core/command-manifests/manifest.js +1 -324
  367. package/dist/core/command-manifests/registry.js +1 -118
  368. package/dist/core/command-manifests/schema.js +1 -736
  369. package/dist/core/command-plugins/bundle.js +1 -261
  370. package/dist/core/command-plugins/compose.js +1 -65
  371. package/dist/core/command-plugins/discovery.js +1 -245
  372. package/dist/core/command-plugins/endpoint.js +1 -48
  373. package/dist/core/command-plugins/extensions.js +1 -166
  374. package/dist/core/command-plugins/help-addenda.js +1 -44
  375. package/dist/core/command-plugins/presence.js +1 -17
  376. package/dist/core/command-plugins/revalidate.js +2 -152
  377. package/dist/core/command-plugins/transport/exec-invoke.js +1 -215
  378. package/dist/core/command-plugins/transport/http-fetch.js +1 -68
  379. package/dist/core/command-plugins/transport/http-invoke.js +3 -546
  380. package/dist/core/command.js +10 -739
  381. package/dist/core/config.js +1 -1059
  382. package/dist/core/document-lines.js +3 -6
  383. package/dist/core/env-name.js +1 -9
  384. package/dist/core/errors.js +1 -52
  385. package/dist/core/events/emit.js +1 -17
  386. package/dist/core/events/envelope.js +1 -84
  387. package/dist/core/events/errors.js +1 -69
  388. package/dist/core/events/index.js +1 -4
  389. package/dist/core/events/operation-id.js +1 -24
  390. package/dist/core/events/read.js +1 -623
  391. package/dist/core/events/serialize.js +1 -199
  392. package/dist/core/events/source.js +1 -31
  393. package/dist/core/events/types.js +1 -11
  394. package/dist/core/exclusive-lock.js +1 -197
  395. package/dist/core/fault-classifier.js +1 -96
  396. package/dist/core/feed/feed.js +7 -202
  397. package/dist/core/feed/inbox-migrate.js +3 -135
  398. package/dist/core/feed/inbox.js +10 -122
  399. package/dist/core/feed/messages.js +6 -212
  400. package/dist/core/frontmatter.js +1 -35
  401. package/dist/core/fs-utils.js +3 -202
  402. package/dist/core/git.js +2 -103
  403. package/dist/core/help.js +9 -310
  404. package/dist/core/host-exports/builtins.js +9 -68
  405. package/dist/core/host-exports/export.js +3 -124
  406. package/dist/core/human/action-binding.js +1 -40
  407. package/dist/core/human/answer-text.js +5 -100
  408. package/dist/core/human/answer.js +1 -119
  409. package/dist/core/human/claim.js +3 -67
  410. package/dist/core/human/completion.js +1 -27
  411. package/dist/core/human/component-docs.js +78 -272
  412. package/dist/core/human/convention.js +2 -82
  413. package/dist/core/human/feedback-companion.js +1 -106
  414. package/dist/core/human/feedback.js +1 -88
  415. package/dist/core/human/page-authoring.js +1 -19
  416. package/dist/core/human/page-catalog.js +1 -172
  417. package/dist/core/human/page-errors.js +1 -7
  418. package/dist/core/human/page-eval.js +1 -125
  419. package/dist/core/human/page-html-markdown.js +8 -260
  420. package/dist/core/human/page-markdown.js +17 -295
  421. package/dist/core/human/page-schema.js +1 -373
  422. package/dist/core/human/page-synth.js +8 -27
  423. package/dist/core/human/page.js +1 -198
  424. package/dist/core/human/requests.js +15 -466
  425. package/dist/core/human/review-schema.js +1 -34
  426. package/dist/core/human/root.js +1 -11
  427. package/dist/core/human/scan.js +1 -69
  428. package/dist/core/human/summary.js +1 -5
  429. package/dist/core/human/tickets.js +1 -171
  430. package/dist/core/human/types.js +0 -1
  431. package/dist/core/human/visible-paths.js +1 -77
  432. package/dist/core/human-actions.js +1 -101
  433. package/dist/core/inspector/chrome.js +1 -14
  434. package/dist/core/inspector/contract.js +0 -1
  435. package/dist/core/inspector/core.js +2 -295
  436. package/dist/core/inspector/host.js +4 -538
  437. package/dist/core/inspector/model.js +2 -226
  438. package/dist/core/inspector/text.js +6 -45
  439. package/dist/core/inspector/transport.js +1 -36
  440. package/dist/core/inspector/tui.js +2 -295
  441. package/dist/core/installed-plugins.js +1 -78
  442. package/dist/core/io.js +7 -356
  443. package/dist/core/keybindings/attach-control.js +1 -42
  444. package/dist/core/keybindings/background-bash.js +1 -33
  445. package/dist/core/keybindings/catalog.js +1 -256
  446. package/dist/core/keybindings/inbox.js +1 -25
  447. package/dist/core/keybindings/index.js +1 -7
  448. package/dist/core/keybindings/match.js +1 -127
  449. package/dist/core/keybindings/persistence.js +1 -49
  450. package/dist/core/keybindings/resolve.js +1 -348
  451. package/dist/core/keybindings/types.js +0 -1
  452. package/dist/core/locked-file.js +1 -118
  453. package/dist/core/log.js +3 -27
  454. package/dist/core/manifest-recovery.js +1 -72
  455. package/dist/core/manifest-stale.js +1 -39
  456. package/dist/core/manifest.js +1 -20
  457. package/dist/core/memory/doc-link-grammar.js +2 -109
  458. package/dist/core/memory/extensions.js +1 -221
  459. package/dist/core/memory/history.js +6 -268
  460. package/dist/core/memory/identity.js +1 -181
  461. package/dist/core/memory/inline-ref-grammar.js +1 -98
  462. package/dist/core/memory/inline-ref-guidance.js +2 -35
  463. package/dist/core/memory/inline-ref-inventory.js +1 -59
  464. package/dist/core/memory/lint.js +2 -671
  465. package/dist/core/memory/project-namespace.js +2 -85
  466. package/dist/core/memory/repository-association.js +1 -129
  467. package/dist/core/memory/tree.js +1 -93
  468. package/dist/core/memory-resolver.js +2 -611
  469. package/dist/core/model-config.js +1 -107
  470. package/dist/core/model-routes.js +1 -201
  471. package/dist/core/nested-stores.js +2 -166
  472. package/dist/core/output.js +7 -99
  473. package/dist/core/pagination.js +1 -88
  474. package/dist/core/plugin-swap-lock.js +1 -31
  475. package/dist/core/pool-credential-store.js +1 -116
  476. package/dist/core/predicate.js +1 -191
  477. package/dist/core/preview-registry.js +2 -411
  478. package/dist/core/preview-result-path.js +1 -26
  479. package/dist/core/profiles/default-binding.js +1 -24
  480. package/dist/core/profiles/deletion-reservation.js +1 -42
  481. package/dist/core/profiles/env-store.js +2 -162
  482. package/dist/core/profiles/fuzzy-match.js +1 -92
  483. package/dist/core/profiles/manifest.js +1 -574
  484. package/dist/core/profiles/select.js +35 -741
  485. package/dist/core/profiles/state-block.js +3 -17
  486. package/dist/core/provider-error-recognition.js +1 -74
  487. package/dist/core/provider-failure.js +1 -86
  488. package/dist/core/provider-management.js +1 -22
  489. package/dist/core/remote-canvas-target.js +1 -30
  490. package/dist/core/render.js +18 -138
  491. package/dist/core/resolver.js +1 -111
  492. package/dist/core/review/birth.js +1 -52
  493. package/dist/core/review/comments.js +5 -279
  494. package/dist/core/review/companion.js +1 -215
  495. package/dist/core/review/document.js +2 -138
  496. package/dist/core/review/project.js +1 -36
  497. package/dist/core/review/realize.js +1 -71
  498. package/dist/core/review/remap.js +4 -141
  499. package/dist/core/review/signal.js +1 -12
  500. package/dist/core/review/stage.js +1 -184
  501. package/dist/core/review/store.js +1 -168
  502. package/dist/core/review/types.js +1 -23
  503. package/dist/core/runtime/advertised-command-invocation.js +1 -233
  504. package/dist/core/runtime/auth-reload.js +1 -67
  505. package/dist/core/runtime/banner.js +1 -51
  506. package/dist/core/runtime/bearings-render.js +18 -250
  507. package/dist/core/runtime/bearings.js +7 -194
  508. package/dist/core/runtime/bin-contributions.js +2 -186
  509. package/dist/core/runtime/boot-root.js +1 -107
  510. package/dist/core/runtime/branded-host.js +2 -264
  511. package/dist/core/runtime/broker/auth-reload.js +1 -157
  512. package/dist/core/runtime/broker/client-registry.js +1 -179
  513. package/dist/core/runtime/broker/daemon-ops.js +1 -88
  514. package/dist/core/runtime/broker/engine-drive.js +1 -354
  515. package/dist/core/runtime/broker/engine-routing.js +1 -211
  516. package/dist/core/runtime/broker/event-projection.js +1 -193
  517. package/dist/core/runtime/broker/extension-abort.js +1 -36
  518. package/dist/core/runtime/broker/fault-retry.js +1 -588
  519. package/dist/core/runtime/broker/frame-client.js +1 -132
  520. package/dist/core/runtime/broker/frame-dispatch.js +1 -183
  521. package/dist/core/runtime/broker/frame-engine-control.js +1 -231
  522. package/dist/core/runtime/broker/frame-memory-refs.js +1 -41
  523. package/dist/core/runtime/broker/frame-model-query.js +1 -69
  524. package/dist/core/runtime/broker/frame-read.js +1 -116
  525. package/dist/core/runtime/broker/frame-replies.js +1 -64
  526. package/dist/core/runtime/broker/frame-session.js +4 -203
  527. package/dist/core/runtime/broker/held-deferred-inbox.js +1 -13
  528. package/dist/core/runtime/broker/inbox.js +13 -163
  529. package/dist/core/runtime/broker/node-named.js +1 -27
  530. package/dist/core/runtime/broker/read-ops.js +1 -171
  531. package/dist/core/runtime/broker/rebind.js +1 -318
  532. package/dist/core/runtime/broker/tool-groups.js +1 -246
  533. package/dist/core/runtime/broker/turn-admission.js +1 -31
  534. package/dist/core/runtime/broker/turn-ignition.js +1 -84
  535. package/dist/core/runtime/broker-cli.js +3 -81
  536. package/dist/core/runtime/broker-extension-render.js +5 -135
  537. package/dist/core/runtime/broker-inventory.js +1 -116
  538. package/dist/core/runtime/broker-persona-guidance.js +4 -154
  539. package/dist/core/runtime/broker-protocol.js +3 -152
  540. package/dist/core/runtime/broker-request.js +1 -85
  541. package/dist/core/runtime/broker-sdk.js +1 -129
  542. package/dist/core/runtime/broker.js +1 -1214
  543. package/dist/core/runtime/canvas-extensions.js +1 -96
  544. package/dist/core/runtime/chat-inventory-rows.js +1 -105
  545. package/dist/core/runtime/close.js +1 -265
  546. package/dist/core/runtime/command-expansion.js +9 -104
  547. package/dist/core/runtime/command-surface.js +1 -117
  548. package/dist/core/runtime/connectivity.js +1 -73
  549. package/dist/core/runtime/deliver-live.js +1 -88
  550. package/dist/core/runtime/fault-recovery.js +1 -83
  551. package/dist/core/runtime/fault.js +1 -17
  552. package/dist/core/runtime/fleet.js +1 -58
  553. package/dist/core/runtime/front-door-env.js +1 -16
  554. package/dist/core/runtime/front-door.js +7 -183
  555. package/dist/core/runtime/headless-pi.js +1 -161
  556. package/dist/core/runtime/host.js +1 -457
  557. package/dist/core/runtime/interactive-deliver.js +1 -51
  558. package/dist/core/runtime/invocation.js +0 -10
  559. package/dist/core/runtime/kickoff.js +30 -327
  560. package/dist/core/runtime/launch-config-worker.js +1 -12
  561. package/dist/core/runtime/launch-prompt.js +4 -13
  562. package/dist/core/runtime/launch-target.js +1 -55
  563. package/dist/core/runtime/launch.js +1 -483
  564. package/dist/core/runtime/lifecycle.js +2 -213
  565. package/dist/core/runtime/managed-provider-cooling.js +1 -62
  566. package/dist/core/runtime/memory.js +1 -17
  567. package/dist/core/runtime/model-registry.js +1 -13
  568. package/dist/core/runtime/model-selection.js +1 -135
  569. package/dist/core/runtime/model-swap.js +1 -86
  570. package/dist/core/runtime/naming.js +14 -298
  571. package/dist/core/runtime/nerd-font.js +2 -127
  572. package/dist/core/runtime/node-read.js +2 -386
  573. package/dist/core/runtime/nodes.js +1 -331
  574. package/dist/core/runtime/outcome-document.js +1 -97
  575. package/dist/core/runtime/package-health.js +4 -99
  576. package/dist/core/runtime/persona.js +2 -55
  577. package/dist/core/runtime/pi-cli.js +1 -65
  578. package/dist/core/runtime/pi-vendored.js +1 -66
  579. package/dist/core/runtime/placement-tmux.js +1 -81
  580. package/dist/core/runtime/placement.js +1 -386
  581. package/dist/core/runtime/promote.js +1 -174
  582. package/dist/core/runtime/prospective-inventory-cli.js +3 -61
  583. package/dist/core/runtime/prospective-inventory.js +2 -88
  584. package/dist/core/runtime/recap.js +27 -103
  585. package/dist/core/runtime/recycle.js +1 -190
  586. package/dist/core/runtime/reopen.js +1 -138
  587. package/dist/core/runtime/reset.js +1 -245
  588. package/dist/core/runtime/resume-root.js +10 -290
  589. package/dist/core/runtime/revive-all.js +1 -107
  590. package/dist/core/runtime/revive.js +4 -544
  591. package/dist/core/runtime/roadmap.js +4 -38
  592. package/dist/core/runtime/session-branch.js +1 -46
  593. package/dist/core/runtime/session-cycles.js +1 -110
  594. package/dist/core/runtime/session-list-cache.js +1 -406
  595. package/dist/core/runtime/session-visibility.js +1 -99
  596. package/dist/core/runtime/shell-expansion.js +9 -100
  597. package/dist/core/runtime/situational-context.js +2 -67
  598. package/dist/core/runtime/situational-live.js +1 -41
  599. package/dist/core/runtime/spawn-env.js +1 -255
  600. package/dist/core/runtime/spawn.js +3 -577
  601. package/dist/core/runtime/stamp/channel.js +1 -76
  602. package/dist/core/runtime/stamp/protocol.js +1 -113
  603. package/dist/core/runtime/stop-guard.js +7 -116
  604. package/dist/core/runtime/stop-signals.js +1 -46
  605. package/dist/core/runtime/stream-watchdog.js +1 -134
  606. package/dist/core/runtime/structured-output.js +4 -156
  607. package/dist/core/runtime/surface-bg.js +1 -85
  608. package/dist/core/runtime/tmux-bindings.js +4 -730
  609. package/dist/core/runtime/tmux-chrome.js +1 -5
  610. package/dist/core/runtime/tmux-driver.js +7 -637
  611. package/dist/core/runtime/tool-group-summary.js +6 -85
  612. package/dist/core/runtime/turn-visibility.js +1 -31
  613. package/dist/core/runtime/view-socket.js +1 -83
  614. package/dist/core/runtime/warm-pool.js +1 -395
  615. package/dist/core/scope.js +1 -254
  616. package/dist/core/scoped-state/db.js +1 -135
  617. package/dist/core/scoped-state/migrate.js +3 -181
  618. package/dist/core/scoped-state/paths.js +1 -27
  619. package/dist/core/scoped-state/profiles.js +1 -62
  620. package/dist/core/scoped-state/providers.js +1 -8
  621. package/dist/core/scoped-state/schema.js +3 -16
  622. package/dist/core/scoped-state/settings.js +1 -82
  623. package/dist/core/secrets.js +2 -55
  624. package/dist/core/self-update.js +1 -71
  625. package/dist/core/session-model/session-state.js +1 -180
  626. package/dist/core/shell-segments.js +4 -169
  627. package/dist/core/spawn.js +1 -26
  628. package/dist/core/stdout-errors.js +1 -14
  629. package/dist/core/subscription-state.js +3 -193
  630. package/dist/core/substrate/frontmatter-validation.js +1 -105
  631. package/dist/core/substrate/gate-explain.js +1 -424
  632. package/dist/core/substrate/gate.js +1 -26
  633. package/dist/core/substrate/index.js +1 -30
  634. package/dist/core/substrate/injected-store.js +1 -249
  635. package/dist/core/substrate/listings.js +1 -115
  636. package/dist/core/substrate/on-read-node.js +1 -36
  637. package/dist/core/substrate/on-read.js +9 -315
  638. package/dist/core/substrate/plan.js +1 -266
  639. package/dist/core/substrate/render-node.js +1 -30
  640. package/dist/core/substrate/render.js +65 -689
  641. package/dist/core/substrate/schema.js +1 -186
  642. package/dist/core/substrate/session-cache.js +1 -83
  643. package/dist/core/substrate/subject-fields.js +1 -35
  644. package/dist/core/substrate/subject.js +1 -47
  645. package/dist/core/substrate/surface-match.js +1 -242
  646. package/dist/core/termrender/code-doc.js +5 -92
  647. package/dist/core/termrender/display.js +2 -56
  648. package/dist/core/termrender/termrender.js +14 -719
  649. package/dist/core/termrender/version.js +1 -1
  650. package/dist/core/timing.js +2 -94
  651. package/dist/core/tui/draw.js +2 -378
  652. package/dist/core/tui/fuzzy.js +1 -38
  653. package/dist/core/tui/markdown.js +3 -407
  654. package/dist/core/tui/page-host.js +1 -74
  655. package/dist/core/tui/panel.js +1 -137
  656. package/dist/core/tui/terminal.js +2 -100
  657. package/dist/core/user-settings.js +1 -454
  658. package/dist/core/wake.js +1 -296
  659. package/dist/core/worktree-close.js +6 -228
  660. package/dist/core/worktree-containment.js +3 -48
  661. package/dist/core/worktree-landing.js +4 -56
  662. package/dist/core/worktree-mutation-async.js +10 -280
  663. package/dist/core/worktree-quarantine.js +1 -54
  664. package/dist/core/worktree-sweep.js +6 -453
  665. package/dist/core/worktree.js +18 -899
  666. package/dist/daemon/api/bridge.js +8 -418
  667. package/dist/daemon/api/handlers/attach.js +1 -65
  668. package/dist/daemon/api/handlers/bash-jobs.js +2 -91
  669. package/dist/daemon/api/handlers/broker-ops.js +1 -447
  670. package/dist/daemon/api/handlers/broker-recovery.js +1 -251
  671. package/dist/daemon/api/handlers/canvas.js +6 -490
  672. package/dist/daemon/api/handlers/chat-inventory.js +1 -25
  673. package/dist/daemon/api/handlers/crons.js +1 -373
  674. package/dist/daemon/api/handlers/daemon.js +1 -76
  675. package/dist/daemon/api/handlers/feedback-comments.js +3 -199
  676. package/dist/daemon/api/handlers/files.js +1 -63
  677. package/dist/daemon/api/handlers/focus.js +1 -92
  678. package/dist/daemon/api/handlers/health.js +1 -76
  679. package/dist/daemon/api/handlers/human-requests.js +1 -379
  680. package/dist/daemon/api/handlers/human.js +1 -3
  681. package/dist/daemon/api/handlers/inbox-page.js +1 -89
  682. package/dist/daemon/api/handlers/inbox.js +1 -301
  683. package/dist/daemon/api/handlers/memory.js +1 -50
  684. package/dist/daemon/api/handlers/messages.js +2 -506
  685. package/dist/daemon/api/handlers/model-config.js +1 -44
  686. package/dist/daemon/api/handlers/modelauth.js +1 -165
  687. package/dist/daemon/api/handlers/node-outcomes.js +1 -181
  688. package/dist/daemon/api/handlers/nodes.js +1 -939
  689. package/dist/daemon/api/handlers/profiles.js +1 -140
  690. package/dist/daemon/api/handlers/prospective-chat-inventory.js +1 -59
  691. package/dist/daemon/api/handlers/reports.js +16 -332
  692. package/dist/daemon/api/handlers/review-comments.js +1 -465
  693. package/dist/daemon/api/handlers/reviews.js +1 -200
  694. package/dist/daemon/api/handlers/subscriptions.js +1 -53
  695. package/dist/daemon/api/handlers/validate.js +1 -58
  696. package/dist/daemon/api/handlers/worktree.js +1 -39
  697. package/dist/daemon/api/map.js +2 -735
  698. package/dist/daemon/api/router.js +1 -190
  699. package/dist/daemon/api/server.js +11 -408
  700. package/dist/daemon/boot-migrations.js +1 -31
  701. package/dist/daemon/companion-retire.js +1 -34
  702. package/dist/daemon/control.js +1 -22
  703. package/dist/daemon/cron/armed-context.js +1 -100
  704. package/dist/daemon/cron/capture.js +2 -45
  705. package/dist/daemon/cron/disposition.js +1 -55
  706. package/dist/daemon/cron/escalation.js +3 -124
  707. package/dist/daemon/cron/held.js +1 -20
  708. package/dist/daemon/cron/lease-recovery.js +1 -119
  709. package/dist/daemon/cron/live-runs.js +1 -23
  710. package/dist/daemon/cron/passes.js +1 -58
  711. package/dist/daemon/cron/settle.js +1 -61
  712. package/dist/daemon/cron/sinks.js +2 -59
  713. package/dist/daemon/cron-run.js +1 -405
  714. package/dist/daemon/crtrd-cli.js +1 -23
  715. package/dist/daemon/crtrd.js +8 -854
  716. package/dist/daemon/delivery/run-delivery.js +1 -164
  717. package/dist/daemon/fleet.js +17 -475
  718. package/dist/daemon/human/finish.js +10 -179
  719. package/dist/daemon/human/settle.js +1 -89
  720. package/dist/daemon/human/sweep.js +1 -66
  721. package/dist/daemon/manage.js +2 -595
  722. package/dist/daemon/messaging/node-message.js +1 -99
  723. package/dist/daemon/park-activity.js +1 -30
  724. package/dist/daemon/park-pending.js +1 -52
  725. package/dist/daemon/pidfile.js +1 -37
  726. package/dist/daemon/profile-delete.js +1 -306
  727. package/dist/daemon/reconcilers/bash-deadline.js +1 -80
  728. package/dist/daemon/reconcilers/broker-supervision.js +4 -761
  729. package/dist/daemon/reconcilers/controller-death.js +1 -14
  730. package/dist/daemon/reconcilers/cron-lane.js +1 -29
  731. package/dist/daemon/reconcilers/delivery-lane.js +1 -130
  732. package/dist/daemon/reconcilers/live-obligation.js +1 -87
  733. package/dist/daemon/reconcilers/managed-worktree-sweep.js +1 -202
  734. package/dist/daemon/reconcilers/node-deadline.js +1 -82
  735. package/dist/daemon/reconcilers/node-lifecycle/freeze-lane.js +1 -172
  736. package/dist/daemon/reconcilers/node-lifecycle/respawn-policy.js +1 -59
  737. package/dist/daemon/reconcilers/node-lifecycle/terminating.js +1 -12
  738. package/dist/daemon/reconcilers/node-lifecycle/tick.js +1 -146
  739. package/dist/daemon/reconcilers/node-lifecycle/wants-execution.js +1 -11
  740. package/dist/daemon/reconcilers/pending-review-submit.js +1 -36
  741. package/dist/daemon/reconcilers/storage-maintenance.js +1 -207
  742. package/dist/daemon/review/comment-notify.js +2 -109
  743. package/dist/daemon/review/companion.js +1 -29
  744. package/dist/daemon/review/deliver.js +3 -8
  745. package/dist/daemon/review/finish.js +1 -122
  746. package/dist/daemon/review/sweep.js +1 -18
  747. package/dist/daemon/startup-policy.js +1 -1
  748. package/dist/daemon/supervise-cadence.js +1 -6
  749. package/dist/hook-authoring.js +5 -447
  750. package/dist/hook-process.js +1 -34
  751. package/dist/index.js +1 -52
  752. package/dist/migrations/001-surfaces-frontmatter.js +1 -161
  753. package/dist/migrations/002-profile-project-memory.js +1 -72
  754. package/dist/migrations/003-repository-root-memory-identity/front-door.js +11 -231
  755. package/dist/migrations/003-repository-root-memory-identity/index.js +5 -513
  756. package/dist/migrations/003-repository-root-memory-identity/references.js +5 -469
  757. package/dist/migrations/003-repository-root-memory-identity/repository-facts.js +3 -349
  758. package/dist/migrations/activation.js +2 -89
  759. package/dist/migrations/convergent.js +2 -82
  760. package/dist/migrations/corpus.js +3 -483
  761. package/dist/migrations/frontmatter-splice.js +8 -176
  762. package/dist/migrations/profile-manifests.js +2 -70
  763. package/dist/migrations/registry.js +1 -42
  764. package/dist/migrations/runner.js +1 -85
  765. package/dist/migrations/types.js +0 -24
  766. package/dist/pi-extensions/broker-local.js +2 -106
  767. package/dist/pi-extensions/canvas-bash-valve.js +7 -461
  768. package/dist/pi-extensions/canvas-context-intro.js +2 -113
  769. package/dist/pi-extensions/canvas-doc-substrate.js +9 -178
  770. package/dist/pi-extensions/canvas-goal-capture.js +1 -83
  771. package/dist/pi-extensions/canvas-inbox-watcher.js +1 -1010
  772. package/dist/pi-extensions/canvas-passive-context.js +14 -203
  773. package/dist/pi-extensions/canvas-preview-result.js +2 -72
  774. package/dist/pi-extensions/canvas-prompt-scrub.js +2 -54
  775. package/dist/pi-extensions/canvas-recap.js +11 -405
  776. package/dist/pi-extensions/canvas-review-boundary.js +3 -63
  777. package/dist/pi-extensions/canvas-stamp.js +2 -77
  778. package/dist/pi-extensions/canvas-stophook.js +1 -643
  779. package/dist/pi-extensions/canvas-structured-output.js +13 -35
  780. package/dist/pi-extensions/canvas-tool-guide.js +9 -78
  781. package/dist/pi-extensions/envelope-merge.js +8 -29
  782. package/dist/prompts/review.js +20 -42
  783. package/dist/shared/birth-announcement.js +1 -25
  784. package/dist/shared/crtr-version.js +1 -18
  785. package/dist/shared/env.js +1 -214
  786. package/dist/shared/generated-context.js +11 -226
  787. package/dist/shared/predicates.js +1 -4
  788. package/dist/shared/shell-quote.js +1 -5
  789. package/dist/shared/tool-groups.js +1 -64
  790. package/dist/shared/working-activity.js +1 -27
  791. package/dist/suppress-experimental-warnings.js +1 -15
  792. package/dist/types.js +1 -185
  793. package/docs/public-api.md +10 -9
  794. package/package.json +6 -4
  795. package/runtime.lock.json +5 -5
  796. package/scripts/pack-minify.mjs +108 -0
  797. package/dist/api/__tests__/integration/client.test.d.ts +0 -1
  798. package/dist/api/__tests__/integration/client.test.js +0 -163
  799. package/dist/builtin-pi-packages/pi-crtr-extensions/__tests__/insights-active-init.test.ts +0 -98
  800. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/__tests__/crtr-commands.test.ts +0 -93
  801. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/__tests__/integration/provider-rotation.test.ts +0 -2530
  802. package/dist/clients/__tests__/helpers/human-daemon.d.ts +0 -11
  803. package/dist/clients/__tests__/helpers/human-daemon.js +0 -60
  804. package/dist/clients/attach/__tests__/attach-remote-readonly.test.d.ts +0 -1
  805. package/dist/clients/attach/__tests__/attach-remote-readonly.test.js +0 -97
  806. package/dist/clients/attach/__tests__/bash-call-width.test.d.ts +0 -1
  807. package/dist/clients/attach/__tests__/bash-call-width.test.js +0 -38
  808. package/dist/clients/attach/__tests__/chat-view-snapshot-ordering.test.d.ts +0 -1
  809. package/dist/clients/attach/__tests__/chat-view-snapshot-ordering.test.js +0 -175
  810. package/dist/clients/attach/__tests__/completion-frecency.test.d.ts +0 -1
  811. package/dist/clients/attach/__tests__/completion-frecency.test.js +0 -35
  812. package/dist/clients/attach/__tests__/context-message.test.d.ts +0 -1
  813. package/dist/clients/attach/__tests__/context-message.test.js +0 -130
  814. package/dist/clients/attach/__tests__/crtr-output.test.d.ts +0 -1
  815. package/dist/clients/attach/__tests__/crtr-output.test.js +0 -68
  816. package/dist/clients/attach/__tests__/diagram.test.d.ts +0 -1
  817. package/dist/clients/attach/__tests__/diagram.test.js +0 -42
  818. package/dist/clients/attach/__tests__/edit-diff.test.d.ts +0 -1
  819. package/dist/clients/attach/__tests__/edit-diff.test.js +0 -31
  820. package/dist/clients/attach/__tests__/frame-selection.test.d.ts +0 -1
  821. package/dist/clients/attach/__tests__/frame-selection.test.js +0 -84
  822. package/dist/clients/attach/__tests__/group-activity.test.d.ts +0 -1
  823. package/dist/clients/attach/__tests__/group-activity.test.js +0 -165
  824. package/dist/clients/attach/__tests__/oauth-dialog-lifecycle.test.d.ts +0 -1
  825. package/dist/clients/attach/__tests__/oauth-dialog-lifecycle.test.js +0 -83
  826. package/dist/clients/attach/__tests__/pane-tag-successor.test.d.ts +0 -1
  827. package/dist/clients/attach/__tests__/pane-tag-successor.test.js +0 -56
  828. package/dist/clients/attach/__tests__/profile-files.test.d.ts +0 -1
  829. package/dist/clients/attach/__tests__/profile-files.test.js +0 -21
  830. package/dist/clients/attach/__tests__/prompt-preview.test.d.ts +0 -1
  831. package/dist/clients/attach/__tests__/prompt-preview.test.js +0 -21
  832. package/dist/clients/attach/__tests__/ref-autocomplete.test.d.ts +0 -1
  833. package/dist/clients/attach/__tests__/ref-autocomplete.test.js +0 -64
  834. package/dist/clients/attach/__tests__/titled-editor-paste.test.d.ts +0 -1
  835. package/dist/clients/attach/__tests__/titled-editor-paste.test.js +0 -114
  836. package/dist/clients/attach/__tests__/titled-editor-preview.test.d.ts +0 -1
  837. package/dist/clients/attach/__tests__/titled-editor-preview.test.js +0 -83
  838. package/dist/clients/inbox/__tests__/integration/inbox-controller.test.d.ts +0 -1
  839. package/dist/clients/inbox/__tests__/integration/inbox-controller.test.js +0 -81
  840. package/dist/clients/inbox/__tests__/integration/mount-panel.test.d.ts +0 -1
  841. package/dist/clients/inbox/__tests__/integration/mount-panel.test.js +0 -135
  842. package/dist/clients/inbox/__tests__/integration/stale-row-activation.test.d.ts +0 -1
  843. package/dist/clients/inbox/__tests__/integration/stale-row-activation.test.js +0 -66
  844. package/dist/clients/inbox/review/__tests__/editor-roundtrip.test.d.ts +0 -1
  845. package/dist/clients/inbox/review/__tests__/editor-roundtrip.test.js +0 -35
  846. package/dist/clients/inbox/review/__tests__/review-core.test.d.ts +0 -1
  847. package/dist/clients/inbox/review/__tests__/review-core.test.js +0 -52
  848. package/dist/clients/inbox/review/__tests__/teardown-notice.test.d.ts +0 -1
  849. package/dist/clients/inbox/review/__tests__/teardown-notice.test.js +0 -100
  850. package/dist/commands/__tests__/api-client-cold-start-diagnostic.test.d.ts +0 -1
  851. package/dist/commands/__tests__/api-client-cold-start-diagnostic.test.js +0 -69
  852. package/dist/commands/__tests__/human.test.d.ts +0 -1
  853. package/dist/commands/__tests__/human.test.js +0 -172
  854. package/dist/commands/__tests__/integration/dashboard-snapshot.test.d.ts +0 -1
  855. package/dist/commands/__tests__/integration/dashboard-snapshot.test.js +0 -237
  856. package/dist/commands/__tests__/integration/migrate.test.d.ts +0 -1
  857. package/dist/commands/__tests__/integration/migrate.test.js +0 -1330
  858. package/dist/commands/__tests__/node-message.test.d.ts +0 -1
  859. package/dist/commands/__tests__/node-message.test.js +0 -112
  860. package/dist/commands/__tests__/node-new.test.d.ts +0 -1
  861. package/dist/commands/__tests__/node-new.test.js +0 -58
  862. package/dist/commands/__tests__/revive-now-gate.test.d.ts +0 -1
  863. package/dist/commands/__tests__/revive-now-gate.test.js +0 -62
  864. package/dist/commands/__tests__/seam/daemon-status.test.d.ts +0 -1
  865. package/dist/commands/__tests__/seam/daemon-status.test.js +0 -29
  866. package/dist/commands/__tests__/surface-reload-target.test.d.ts +0 -1
  867. package/dist/commands/__tests__/surface-reload-target.test.js +0 -21
  868. package/dist/commands/memory/__tests__/command-selector-and-mutation-guards.test.d.ts +0 -1
  869. package/dist/commands/memory/__tests__/command-selector-and-mutation-guards.test.js +0 -379
  870. package/dist/commands/memory/__tests__/memory-list-and-lint-ignore.test.d.ts +0 -1
  871. package/dist/commands/memory/__tests__/memory-list-and-lint-ignore.test.js +0 -124
  872. package/dist/commands/memory/__tests__/repository-root-lint.test.d.ts +0 -1
  873. package/dist/commands/memory/__tests__/repository-root-lint.test.js +0 -148
  874. package/dist/commands/sys/__tests__/config-model-ladders.test.d.ts +0 -1
  875. package/dist/commands/sys/__tests__/config-model-ladders.test.js +0 -114
  876. package/dist/commands/sys/__tests__/setup-core.test.d.ts +0 -1
  877. package/dist/commands/sys/__tests__/setup-core.test.js +0 -45
  878. package/dist/commands/sys/__tests__/sync-project-guidance.test.d.ts +0 -1
  879. package/dist/commands/sys/__tests__/sync-project-guidance.test.js +0 -244
  880. package/dist/core/__tests__/bash-guard.test.d.ts +0 -1
  881. package/dist/core/__tests__/bash-guard.test.js +0 -190
  882. package/dist/core/__tests__/boot-fault-attempt.test.d.ts +0 -1
  883. package/dist/core/__tests__/boot-fault-attempt.test.js +0 -105
  884. package/dist/core/__tests__/boot.test.d.ts +0 -1
  885. package/dist/core/__tests__/boot.test.js +0 -274
  886. package/dist/core/__tests__/branded-host-concurrency.test.d.ts +0 -1
  887. package/dist/core/__tests__/branded-host-concurrency.test.js +0 -72
  888. package/dist/core/__tests__/broker-extension-canvas-db-boundary.test.d.ts +0 -1
  889. package/dist/core/__tests__/broker-extension-canvas-db-boundary.test.js +0 -75
  890. package/dist/core/__tests__/broker-launch-candidates.test.d.ts +0 -1
  891. package/dist/core/__tests__/broker-launch-candidates.test.js +0 -311
  892. package/dist/core/__tests__/broker-preflight.test.d.ts +0 -1
  893. package/dist/core/__tests__/broker-preflight.test.js +0 -95
  894. package/dist/core/__tests__/broker-stream-watchdog-floor.test.d.ts +0 -1
  895. package/dist/core/__tests__/broker-stream-watchdog-floor.test.js +0 -82
  896. package/dist/core/__tests__/broker-turn-admission.test.d.ts +0 -1
  897. package/dist/core/__tests__/broker-turn-admission.test.js +0 -44
  898. package/dist/core/__tests__/canvas-db-boundary.test.d.ts +0 -1
  899. package/dist/core/__tests__/canvas-db-boundary.test.js +0 -46
  900. package/dist/core/__tests__/canvas-inbox-watcher-hold.test.d.ts +0 -1
  901. package/dist/core/__tests__/canvas-inbox-watcher-hold.test.js +0 -710
  902. package/dist/core/__tests__/canvas-inbox-watcher-naming.test.d.ts +0 -1
  903. package/dist/core/__tests__/canvas-inbox-watcher-naming.test.js +0 -310
  904. package/dist/core/__tests__/canvas-inbox-watcher.test.d.ts +0 -1
  905. package/dist/core/__tests__/canvas-inbox-watcher.test.js +0 -397
  906. package/dist/core/__tests__/canvas.test.d.ts +0 -1
  907. package/dist/core/__tests__/canvas.test.js +0 -138
  908. package/dist/core/__tests__/child-death-wake.test.d.ts +0 -1
  909. package/dist/core/__tests__/child-death-wake.test.js +0 -153
  910. package/dist/core/__tests__/cli-help-contract.test.d.ts +0 -1
  911. package/dist/core/__tests__/cli-help-contract.test.js +0 -152
  912. package/dist/core/__tests__/close.test.d.ts +0 -1
  913. package/dist/core/__tests__/close.test.js +0 -284
  914. package/dist/core/__tests__/collectible.test.d.ts +0 -1
  915. package/dist/core/__tests__/collectible.test.js +0 -89
  916. package/dist/core/__tests__/config-change-delta.test.d.ts +0 -1
  917. package/dist/core/__tests__/config-change-delta.test.js +0 -108
  918. package/dist/core/__tests__/context-intro.test.d.ts +0 -1
  919. package/dist/core/__tests__/context-intro.test.js +0 -123
  920. package/dist/core/__tests__/cron-armed-context-failure.test.d.ts +0 -1
  921. package/dist/core/__tests__/cron-armed-context-failure.test.js +0 -150
  922. package/dist/core/__tests__/cron-held-settlement.test.d.ts +0 -1
  923. package/dist/core/__tests__/cron-held-settlement.test.js +0 -240
  924. package/dist/core/__tests__/cron-node-sink-parked-root.test.d.ts +0 -1
  925. package/dist/core/__tests__/cron-node-sink-parked-root.test.js +0 -166
  926. package/dist/core/__tests__/cron-self-cancel-delivery.test.d.ts +0 -1
  927. package/dist/core/__tests__/cron-self-cancel-delivery.test.js +0 -84
  928. package/dist/core/__tests__/cron-timeout-descendants.test.d.ts +0 -1
  929. package/dist/core/__tests__/cron-timeout-descendants.test.js +0 -114
  930. package/dist/core/__tests__/daemon-boot.test.d.ts +0 -1
  931. package/dist/core/__tests__/daemon-boot.test.js +0 -422
  932. package/dist/core/__tests__/daemon-wedge.test.d.ts +0 -1
  933. package/dist/core/__tests__/daemon-wedge.test.js +0 -106
  934. package/dist/core/__tests__/dead-node-policy-table.test.d.ts +0 -1
  935. package/dist/core/__tests__/dead-node-policy-table.test.js +0 -77
  936. package/dist/core/__tests__/events-contract.test.d.ts +0 -1
  937. package/dist/core/__tests__/events-contract.test.js +0 -76
  938. package/dist/core/__tests__/extension-abort.test.d.ts +0 -1
  939. package/dist/core/__tests__/extension-abort.test.js +0 -21
  940. package/dist/core/__tests__/fault-classifier.test.d.ts +0 -1
  941. package/dist/core/__tests__/fault-classifier.test.js +0 -138
  942. package/dist/core/__tests__/fixtures/api-server-host.d.ts +0 -1
  943. package/dist/core/__tests__/fixtures/api-server-host.js +0 -47
  944. package/dist/core/__tests__/fixtures/c3-custom-provider-ext.d.ts +0 -2
  945. package/dist/core/__tests__/fixtures/c3-custom-provider-ext.js +0 -34
  946. package/dist/core/__tests__/fixtures/c5-command-boundary-ext.d.ts +0 -2
  947. package/dist/core/__tests__/fixtures/c5-command-boundary-ext.js +0 -32
  948. package/dist/core/__tests__/fixtures/fake-engine.d.ts +0 -347
  949. package/dist/core/__tests__/fixtures/fake-engine.js +0 -1509
  950. package/dist/core/__tests__/fixtures/fake-pi-host.d.ts +0 -2
  951. package/dist/core/__tests__/fixtures/fake-pi-host.js +0 -311
  952. package/dist/core/__tests__/fixtures/memory-slash-live-probe.d.ts +0 -1
  953. package/dist/core/__tests__/fixtures/memory-slash-live-probe.js +0 -75
  954. package/dist/core/__tests__/fixtures/metadata-migration-race.d.ts +0 -1
  955. package/dist/core/__tests__/fixtures/metadata-migration-race.js +0 -49
  956. package/dist/core/__tests__/focuses.test.d.ts +0 -1
  957. package/dist/core/__tests__/focuses.test.js +0 -113
  958. package/dist/core/__tests__/fs-utils.test.d.ts +0 -1
  959. package/dist/core/__tests__/fs-utils.test.js +0 -50
  960. package/dist/core/__tests__/helpers/broker-clients.d.ts +0 -43
  961. package/dist/core/__tests__/helpers/broker-clients.js +0 -174
  962. package/dist/core/__tests__/helpers/fleet.d.ts +0 -12
  963. package/dist/core/__tests__/helpers/fleet.js +0 -50
  964. package/dist/core/__tests__/helpers/harness.d.ts +0 -124
  965. package/dist/core/__tests__/helpers/harness.js +0 -806
  966. package/dist/core/__tests__/helpers/viewer-panes.d.ts +0 -12
  967. package/dist/core/__tests__/helpers/viewer-panes.js +0 -133
  968. package/dist/core/__tests__/history-inbox.test.d.ts +0 -1
  969. package/dist/core/__tests__/history-inbox.test.js +0 -121
  970. package/dist/core/__tests__/human-action-delivery.test.d.ts +0 -1
  971. package/dist/core/__tests__/human-action-delivery.test.js +0 -162
  972. package/dist/core/__tests__/human-actions.test.d.ts +0 -1
  973. package/dist/core/__tests__/human-actions.test.js +0 -120
  974. package/dist/core/__tests__/inline-memory-refs.test.d.ts +0 -1
  975. package/dist/core/__tests__/inline-memory-refs.test.js +0 -225
  976. package/dist/core/__tests__/integration/broker-fork-seam.test.d.ts +0 -1
  977. package/dist/core/__tests__/integration/broker-fork-seam.test.js +0 -193
  978. package/dist/core/__tests__/integration/broker-sdk-wiring.test.d.ts +0 -1
  979. package/dist/core/__tests__/integration/broker-sdk-wiring.test.js +0 -750
  980. package/dist/core/__tests__/integration/broker-snapshot-history.test.d.ts +0 -1
  981. package/dist/core/__tests__/integration/broker-snapshot-history.test.js +0 -288
  982. package/dist/core/__tests__/integration/broker-wedge-supervision.test.d.ts +0 -1
  983. package/dist/core/__tests__/integration/broker-wedge-supervision.test.js +0 -103
  984. package/dist/core/__tests__/integration/command-plugins.test.d.ts +0 -1
  985. package/dist/core/__tests__/integration/command-plugins.test.js +0 -1200
  986. package/dist/core/__tests__/integration/deferred-no-wake.test.d.ts +0 -1
  987. package/dist/core/__tests__/integration/deferred-no-wake.test.js +0 -610
  988. package/dist/core/__tests__/integration/flagship-lifecycle.test.d.ts +0 -1
  989. package/dist/core/__tests__/integration/flagship-lifecycle.test.js +0 -264
  990. package/dist/core/__tests__/integration/fresh-home-commands.test.d.ts +0 -1
  991. package/dist/core/__tests__/integration/fresh-home-commands.test.js +0 -49
  992. package/dist/core/__tests__/integration/git-optional-locks.test.d.ts +0 -1
  993. package/dist/core/__tests__/integration/git-optional-locks.test.js +0 -81
  994. package/dist/core/__tests__/integration/host-teardown-process-group.test.d.ts +0 -1
  995. package/dist/core/__tests__/integration/host-teardown-process-group.test.js +0 -480
  996. package/dist/core/__tests__/integration/lifecycle-hooks.test.d.ts +0 -1
  997. package/dist/core/__tests__/integration/lifecycle-hooks.test.js +0 -498
  998. package/dist/core/__tests__/integration/live-mutation-verbs.test.d.ts +0 -1
  999. package/dist/core/__tests__/integration/live-mutation-verbs.test.js +0 -180
  1000. package/dist/core/__tests__/integration/live-mutation.test.d.ts +0 -1
  1001. package/dist/core/__tests__/integration/live-mutation.test.js +0 -173
  1002. package/dist/core/__tests__/integration/plugin-revalidate.test.d.ts +0 -1
  1003. package/dist/core/__tests__/integration/plugin-revalidate.test.js +0 -359
  1004. package/dist/core/__tests__/integration/profile-pause.test.d.ts +0 -1
  1005. package/dist/core/__tests__/integration/profile-pause.test.js +0 -115
  1006. package/dist/core/__tests__/integration/refresh-stall-recycle.test.d.ts +0 -1
  1007. package/dist/core/__tests__/integration/refresh-stall-recycle.test.js +0 -151
  1008. package/dist/core/__tests__/integration/revive.test.d.ts +0 -1
  1009. package/dist/core/__tests__/integration/revive.test.js +0 -615
  1010. package/dist/core/__tests__/integration/spawn-root.test.d.ts +0 -1
  1011. package/dist/core/__tests__/integration/spawn-root.test.js +0 -536
  1012. package/dist/core/__tests__/integration/subscription-delivery.test.d.ts +0 -1
  1013. package/dist/core/__tests__/integration/subscription-delivery.test.js +0 -132
  1014. package/dist/core/__tests__/integration/tmux-surface.test.d.ts +0 -1
  1015. package/dist/core/__tests__/integration/tmux-surface.test.js +0 -330
  1016. package/dist/core/__tests__/integration/worktree-land.test.d.ts +0 -1
  1017. package/dist/core/__tests__/integration/worktree-land.test.js +0 -607
  1018. package/dist/core/__tests__/integration/worktree-reap.test.d.ts +0 -1
  1019. package/dist/core/__tests__/integration/worktree-reap.test.js +0 -842
  1020. package/dist/core/__tests__/kickoff.test.d.ts +0 -1
  1021. package/dist/core/__tests__/kickoff.test.js +0 -196
  1022. package/dist/core/__tests__/lifecycle-terminal-reasons.test.d.ts +0 -1
  1023. package/dist/core/__tests__/lifecycle-terminal-reasons.test.js +0 -62
  1024. package/dist/core/__tests__/lifecycle.test.d.ts +0 -1
  1025. package/dist/core/__tests__/lifecycle.test.js +0 -176
  1026. package/dist/core/__tests__/live-lifecycle-prompt.test.d.ts +0 -1
  1027. package/dist/core/__tests__/live-lifecycle-prompt.test.js +0 -63
  1028. package/dist/core/__tests__/memory-resolver-precedence.test.d.ts +0 -1
  1029. package/dist/core/__tests__/memory-resolver-precedence.test.js +0 -228
  1030. package/dist/core/__tests__/migration.test.d.ts +0 -1
  1031. package/dist/core/__tests__/migration.test.js +0 -946
  1032. package/dist/core/__tests__/model-pin-durability.test.d.ts +0 -1
  1033. package/dist/core/__tests__/model-pin-durability.test.js +0 -195
  1034. package/dist/core/__tests__/model-routes-config.test.d.ts +0 -1
  1035. package/dist/core/__tests__/model-routes-config.test.js +0 -150
  1036. package/dist/core/__tests__/nested-store-discovery.test.d.ts +0 -1
  1037. package/dist/core/__tests__/nested-store-discovery.test.js +0 -89
  1038. package/dist/core/__tests__/node-outcome.test.d.ts +0 -1
  1039. package/dist/core/__tests__/node-outcome.test.js +0 -246
  1040. package/dist/core/__tests__/on-read-crouter-home-fence.test.d.ts +0 -1
  1041. package/dist/core/__tests__/on-read-crouter-home-fence.test.js +0 -66
  1042. package/dist/core/__tests__/on-read-dedup-resume.test.d.ts +0 -1
  1043. package/dist/core/__tests__/on-read-dedup-resume.test.js +0 -132
  1044. package/dist/core/__tests__/on-read-nested-store.test.d.ts +0 -1
  1045. package/dist/core/__tests__/on-read-nested-store.test.js +0 -135
  1046. package/dist/core/__tests__/parse-argv-stdin-secret.test.d.ts +0 -1
  1047. package/dist/core/__tests__/parse-argv-stdin-secret.test.js +0 -68
  1048. package/dist/core/__tests__/passive-subscription.test.d.ts +0 -1
  1049. package/dist/core/__tests__/passive-subscription.test.js +0 -120
  1050. package/dist/core/__tests__/pid-identity-match.test.d.ts +0 -1
  1051. package/dist/core/__tests__/pid-identity-match.test.js +0 -145
  1052. package/dist/core/__tests__/pid-zombie.test.d.ts +0 -1
  1053. package/dist/core/__tests__/pid-zombie.test.js +0 -42
  1054. package/dist/core/__tests__/plugin-kinds.test.d.ts +0 -1
  1055. package/dist/core/__tests__/plugin-kinds.test.js +0 -182
  1056. package/dist/core/__tests__/plugin-link-symlinked-scope-root.test.d.ts +0 -1
  1057. package/dist/core/__tests__/plugin-link-symlinked-scope-root.test.js +0 -43
  1058. package/dist/core/__tests__/plugin-page-components.test.d.ts +0 -1
  1059. package/dist/core/__tests__/plugin-page-components.test.js +0 -159
  1060. package/dist/core/__tests__/preview-mirror-cap.test.d.ts +0 -1
  1061. package/dist/core/__tests__/preview-mirror-cap.test.js +0 -53
  1062. package/dist/core/__tests__/preview-registry-sync.test.d.ts +0 -1
  1063. package/dist/core/__tests__/preview-registry-sync.test.js +0 -107
  1064. package/dist/core/__tests__/profile-project-memory-delivery.test.d.ts +0 -1
  1065. package/dist/core/__tests__/profile-project-memory-delivery.test.js +0 -644
  1066. package/dist/core/__tests__/prospective-inventory-capability-parity.test.d.ts +0 -1
  1067. package/dist/core/__tests__/prospective-inventory-capability-parity.test.js +0 -91
  1068. package/dist/core/__tests__/prune.test.d.ts +0 -1
  1069. package/dist/core/__tests__/prune.test.js +0 -243
  1070. package/dist/core/__tests__/push-final-guard.test.d.ts +0 -1
  1071. package/dist/core/__tests__/push-final-guard.test.js +0 -191
  1072. package/dist/core/__tests__/relaunch-root.test.d.ts +0 -1
  1073. package/dist/core/__tests__/relaunch-root.test.js +0 -249
  1074. package/dist/core/__tests__/remote-canvas-target.test.d.ts +0 -1
  1075. package/dist/core/__tests__/remote-canvas-target.test.js +0 -93
  1076. package/dist/core/__tests__/repository-association.test.d.ts +0 -1
  1077. package/dist/core/__tests__/repository-association.test.js +0 -153
  1078. package/dist/core/__tests__/repository-root-identity.test.d.ts +0 -1
  1079. package/dist/core/__tests__/repository-root-identity.test.js +0 -223
  1080. package/dist/core/__tests__/respawn-throttle.test.d.ts +0 -1
  1081. package/dist/core/__tests__/respawn-throttle.test.js +0 -20
  1082. package/dist/core/__tests__/review-model-floor.test.d.ts +0 -1
  1083. package/dist/core/__tests__/review-model-floor.test.js +0 -83
  1084. package/dist/core/__tests__/revive-all.test.d.ts +0 -1
  1085. package/dist/core/__tests__/revive-all.test.js +0 -157
  1086. package/dist/core/__tests__/revive-capacity.test.d.ts +0 -1
  1087. package/dist/core/__tests__/revive-capacity.test.js +0 -184
  1088. package/dist/core/__tests__/revive-parked-fresh.test.d.ts +0 -1
  1089. package/dist/core/__tests__/revive-parked-fresh.test.js +0 -176
  1090. package/dist/core/__tests__/scope-crouter-home-fence.test.d.ts +0 -1
  1091. package/dist/core/__tests__/scope-crouter-home-fence.test.js +0 -55
  1092. package/dist/core/__tests__/seam/broker-attach-multiclient.test.d.ts +0 -1
  1093. package/dist/core/__tests__/seam/broker-attach-multiclient.test.js +0 -262
  1094. package/dist/core/__tests__/seam/broker-attach-stream.test.d.ts +0 -1
  1095. package/dist/core/__tests__/seam/broker-attach-stream.test.js +0 -176
  1096. package/dist/core/__tests__/seam/broker-cap-freeze.test.d.ts +0 -1
  1097. package/dist/core/__tests__/seam/broker-cap-freeze.test.js +0 -155
  1098. package/dist/core/__tests__/seam/broker-crash-teardown.test.d.ts +0 -1
  1099. package/dist/core/__tests__/seam/broker-crash-teardown.test.js +0 -131
  1100. package/dist/core/__tests__/seam/broker-pane-resolution.test.d.ts +0 -1
  1101. package/dist/core/__tests__/seam/broker-pane-resolution.test.js +0 -204
  1102. package/dist/core/__tests__/seam/broker-provider-retry.test.d.ts +0 -1
  1103. package/dist/core/__tests__/seam/broker-provider-retry.test.js +0 -686
  1104. package/dist/core/__tests__/seam/broker-startup-diagnostics.test.d.ts +0 -1
  1105. package/dist/core/__tests__/seam/broker-startup-diagnostics.test.js +0 -82
  1106. package/dist/core/__tests__/seam/broker-whip-interrupt.test.d.ts +0 -1
  1107. package/dist/core/__tests__/seam/broker-whip-interrupt.test.js +0 -50
  1108. package/dist/core/__tests__/seam/deadline-wake-delivery.test.d.ts +0 -1
  1109. package/dist/core/__tests__/seam/deadline-wake-delivery.test.js +0 -138
  1110. package/dist/core/__tests__/seam/dormancy-release.test.d.ts +0 -1
  1111. package/dist/core/__tests__/seam/dormancy-release.test.js +0 -516
  1112. package/dist/core/__tests__/seam/held-deferred-human-prompt.test.d.ts +0 -1
  1113. package/dist/core/__tests__/seam/held-deferred-human-prompt.test.js +0 -65
  1114. package/dist/core/__tests__/seam/inbox-reference-guidance.test.d.ts +0 -1
  1115. package/dist/core/__tests__/seam/inbox-reference-guidance.test.js +0 -84
  1116. package/dist/core/__tests__/seam/memory-slash-node-relative-inventory.test.d.ts +0 -1
  1117. package/dist/core/__tests__/seam/memory-slash-node-relative-inventory.test.js +0 -160
  1118. package/dist/core/__tests__/seam/node-outcome-delivery.test.d.ts +0 -1
  1119. package/dist/core/__tests__/seam/node-outcome-delivery.test.js +0 -177
  1120. package/dist/core/__tests__/seam/prospective-inventory-stdout.test.d.ts +0 -1
  1121. package/dist/core/__tests__/seam/prospective-inventory-stdout.test.js +0 -31
  1122. package/dist/core/__tests__/seam/reopen-invalidated-worktree.test.d.ts +0 -1
  1123. package/dist/core/__tests__/seam/reopen-invalidated-worktree.test.js +0 -60
  1124. package/dist/core/__tests__/seam/self-close-teardown.test.d.ts +0 -1
  1125. package/dist/core/__tests__/seam/self-close-teardown.test.js +0 -49
  1126. package/dist/core/__tests__/seam/yield-refresh-transaction.test.d.ts +0 -1
  1127. package/dist/core/__tests__/seam/yield-refresh-transaction.test.js +0 -100
  1128. package/dist/core/__tests__/secrets.test.d.ts +0 -1
  1129. package/dist/core/__tests__/secrets.test.js +0 -49
  1130. package/dist/core/__tests__/self-update.test.d.ts +0 -1
  1131. package/dist/core/__tests__/self-update.test.js +0 -46
  1132. package/dist/core/__tests__/session-branch.test.d.ts +0 -1
  1133. package/dist/core/__tests__/session-branch.test.js +0 -61
  1134. package/dist/core/__tests__/session-cycles.test.d.ts +0 -1
  1135. package/dist/core/__tests__/session-cycles.test.js +0 -133
  1136. package/dist/core/__tests__/session-model.test.d.ts +0 -1
  1137. package/dist/core/__tests__/session-model.test.js +0 -111
  1138. package/dist/core/__tests__/spawn-worktree-id-conflict.test.d.ts +0 -1
  1139. package/dist/core/__tests__/spawn-worktree-id-conflict.test.js +0 -71
  1140. package/dist/core/__tests__/stdin-body-no-discard.test.d.ts +0 -1
  1141. package/dist/core/__tests__/stdin-body-no-discard.test.js +0 -33
  1142. package/dist/core/__tests__/stdout-errors.test.d.ts +0 -1
  1143. package/dist/core/__tests__/stdout-errors.test.js +0 -16
  1144. package/dist/core/__tests__/stop-guard.test.d.ts +0 -1
  1145. package/dist/core/__tests__/stop-guard.test.js +0 -237
  1146. package/dist/core/__tests__/stream-watchdog.test.d.ts +0 -1
  1147. package/dist/core/__tests__/stream-watchdog.test.js +0 -154
  1148. package/dist/core/__tests__/subscription-pool-credential-guard.test.d.ts +0 -1
  1149. package/dist/core/__tests__/subscription-pool-credential-guard.test.js +0 -95
  1150. package/dist/core/__tests__/tmux-driver-boundary.test.d.ts +0 -1
  1151. package/dist/core/__tests__/tmux-driver-boundary.test.js +0 -50
  1152. package/dist/core/__tests__/warm-claim-preference-snapshot.test.d.ts +0 -1
  1153. package/dist/core/__tests__/warm-claim-preference-snapshot.test.js +0 -54
  1154. package/dist/core/__tests__/worktree-landing.test.d.ts +0 -1
  1155. package/dist/core/__tests__/worktree-landing.test.js +0 -11
  1156. package/dist/core/__tests__/yield-ensures-daemon.test.d.ts +0 -1
  1157. package/dist/core/__tests__/yield-ensures-daemon.test.js +0 -55
  1158. package/dist/core/broker-client/__tests__/transport-relay.test.d.ts +0 -1
  1159. package/dist/core/broker-client/__tests__/transport-relay.test.js +0 -214
  1160. package/dist/core/broker-client/__tests__/transport-socket.test.d.ts +0 -1
  1161. package/dist/core/broker-client/__tests__/transport-socket.test.js +0 -73
  1162. package/dist/core/canvas/__tests__/attention.test.d.ts +0 -1
  1163. package/dist/core/canvas/__tests__/attention.test.js +0 -83
  1164. package/dist/core/canvas/__tests__/history-transcript.test.d.ts +0 -1
  1165. package/dist/core/canvas/__tests__/history-transcript.test.js +0 -102
  1166. package/dist/core/canvas/__tests__/remote-canvas-source.test.d.ts +0 -1
  1167. package/dist/core/canvas/__tests__/remote-canvas-source.test.js +0 -328
  1168. package/dist/core/canvas/__tests__/remote-transport.test.d.ts +0 -1
  1169. package/dist/core/canvas/__tests__/remote-transport.test.js +0 -97
  1170. package/dist/core/canvas/__tests__/render-remote.test.d.ts +0 -1
  1171. package/dist/core/canvas/__tests__/render-remote.test.js +0 -243
  1172. package/dist/core/canvas/__tests__/session-window.test.d.ts +0 -1
  1173. package/dist/core/canvas/__tests__/session-window.test.js +0 -70
  1174. package/dist/core/feed/__tests__/inbox-migrate.test.d.ts +0 -1
  1175. package/dist/core/feed/__tests__/inbox-migrate.test.js +0 -49
  1176. package/dist/core/human/__tests__/page-catalog.test.d.ts +0 -1
  1177. package/dist/core/human/__tests__/page-catalog.test.js +0 -20
  1178. package/dist/core/human/__tests__/page-html-markdown.test.d.ts +0 -1
  1179. package/dist/core/human/__tests__/page-html-markdown.test.js +0 -48
  1180. package/dist/core/human/__tests__/page.test.d.ts +0 -1
  1181. package/dist/core/human/__tests__/page.test.js +0 -92
  1182. package/dist/core/keybindings/__tests__/resolve.test.d.ts +0 -1
  1183. package/dist/core/keybindings/__tests__/resolve.test.js +0 -171
  1184. package/dist/core/profiles/__tests__/env-store.test.d.ts +0 -1
  1185. package/dist/core/profiles/__tests__/env-store.test.js +0 -99
  1186. package/dist/core/profiles/__tests__/fuzzy-match.test.d.ts +0 -1
  1187. package/dist/core/profiles/__tests__/fuzzy-match.test.js +0 -51
  1188. package/dist/core/profiles/__tests__/root-profile.test.d.ts +0 -1
  1189. package/dist/core/profiles/__tests__/root-profile.test.js +0 -59
  1190. package/dist/core/review/__tests__/capture-origin.test.d.ts +0 -1
  1191. package/dist/core/review/__tests__/capture-origin.test.js +0 -150
  1192. package/dist/core/review/__tests__/comments.test.d.ts +0 -1
  1193. package/dist/core/review/__tests__/comments.test.js +0 -116
  1194. package/dist/core/review/__tests__/remap.test.d.ts +0 -1
  1195. package/dist/core/review/__tests__/remap.test.js +0 -177
  1196. package/dist/core/review/__tests__/stage-identity.test.d.ts +0 -1
  1197. package/dist/core/review/__tests__/stage-identity.test.js +0 -150
  1198. package/dist/core/runtime/__tests__/engine-route.test.d.ts +0 -1
  1199. package/dist/core/runtime/__tests__/engine-route.test.js +0 -36
  1200. package/dist/core/runtime/__tests__/install-id-cache-scoping.test.d.ts +0 -1
  1201. package/dist/core/runtime/__tests__/install-id-cache-scoping.test.js +0 -45
  1202. package/dist/core/runtime/__tests__/node-env.test.d.ts +0 -1
  1203. package/dist/core/runtime/__tests__/node-env.test.js +0 -73
  1204. package/dist/core/runtime/__tests__/spawn-env.test.d.ts +0 -1
  1205. package/dist/core/runtime/__tests__/spawn-env.test.js +0 -259
  1206. package/dist/core/substrate/__tests__/surface-match-command.test.d.ts +0 -1
  1207. package/dist/core/substrate/__tests__/surface-match-command.test.js +0 -89
  1208. package/dist/core/substrate/__tests__/surface-match-memory-read.test.d.ts +0 -1
  1209. package/dist/core/substrate/__tests__/surface-match-memory-read.test.js +0 -28
  1210. package/dist/core/substrate/__tests__/surface-match-pre-command.test.d.ts +0 -1
  1211. package/dist/core/substrate/__tests__/surface-match-pre-command.test.js +0 -92
  1212. package/dist/daemon/__tests__/autostart-storm.test.d.ts +0 -1
  1213. package/dist/daemon/__tests__/autostart-storm.test.js +0 -128
  1214. package/dist/daemon/__tests__/broker-ownership.test.d.ts +0 -1
  1215. package/dist/daemon/__tests__/broker-ownership.test.js +0 -25
  1216. package/dist/daemon/__tests__/daemon-ownership.test.d.ts +0 -1
  1217. package/dist/daemon/__tests__/daemon-ownership.test.js +0 -27
  1218. package/dist/daemon/__tests__/helpers/source-daemon.d.ts +0 -30
  1219. package/dist/daemon/__tests__/helpers/source-daemon.js +0 -176
  1220. package/dist/daemon/__tests__/integration/api-startup-readiness.test.d.ts +0 -1
  1221. package/dist/daemon/__tests__/integration/api-startup-readiness.test.js +0 -83
  1222. package/dist/daemon/__tests__/integration/migration-startup.test.d.ts +0 -1
  1223. package/dist/daemon/__tests__/integration/migration-startup.test.js +0 -127
  1224. package/dist/daemon/__tests__/node-deadline-lane.test.d.ts +0 -1
  1225. package/dist/daemon/__tests__/node-deadline-lane.test.js +0 -77
  1226. package/dist/daemon/__tests__/node-outcome-birth-invariants.test.d.ts +0 -1
  1227. package/dist/daemon/__tests__/node-outcome-birth-invariants.test.js +0 -146
  1228. package/dist/daemon/__tests__/node-outcome-delivery.test.d.ts +0 -1
  1229. package/dist/daemon/__tests__/node-outcome-delivery.test.js +0 -116
  1230. package/dist/daemon/__tests__/reconciler-signature.test.d.ts +0 -1
  1231. package/dist/daemon/__tests__/reconciler-signature.test.js +0 -37
  1232. package/dist/daemon/__tests__/subtree-filter-freshness.test.d.ts +0 -1
  1233. package/dist/daemon/__tests__/subtree-filter-freshness.test.js +0 -63
  1234. package/dist/daemon/__tests__/thaw-order.test.d.ts +0 -1
  1235. package/dist/daemon/__tests__/thaw-order.test.js +0 -55
  1236. package/dist/daemon/api/__tests__/bridge-heartbeat.test.d.ts +0 -1
  1237. package/dist/daemon/api/__tests__/bridge-heartbeat.test.js +0 -58
  1238. package/dist/daemon/api/__tests__/broker-settle-park.test.d.ts +0 -1
  1239. package/dist/daemon/api/__tests__/broker-settle-park.test.js +0 -175
  1240. package/dist/daemon/api/__tests__/canvas-snapshot-fields.test.d.ts +0 -1
  1241. package/dist/daemon/api/__tests__/canvas-snapshot-fields.test.js +0 -216
  1242. package/dist/daemon/api/__tests__/error-seam.test.d.ts +0 -1
  1243. package/dist/daemon/api/__tests__/error-seam.test.js +0 -83
  1244. package/dist/daemon/api/__tests__/model-config.test.d.ts +0 -1
  1245. package/dist/daemon/api/__tests__/model-config.test.js +0 -73
  1246. package/dist/daemon/api/__tests__/node-create-description.test.d.ts +0 -1
  1247. package/dist/daemon/api/__tests__/node-create-description.test.js +0 -127
  1248. package/dist/daemon/api/__tests__/node-model-validation.test.d.ts +0 -1
  1249. package/dist/daemon/api/__tests__/node-model-validation.test.js +0 -183
  1250. package/dist/daemon/api/__tests__/nodes-activity-query.test.d.ts +0 -1
  1251. package/dist/daemon/api/__tests__/nodes-activity-query.test.js +0 -99
  1252. package/dist/daemon/api/__tests__/profile-launch-gates.test.d.ts +0 -1
  1253. package/dist/daemon/api/__tests__/profile-launch-gates.test.js +0 -172
  1254. package/dist/daemon/api/__tests__/profile-metadata-route.test.d.ts +0 -1
  1255. package/dist/daemon/api/__tests__/profile-metadata-route.test.js +0 -95
  1256. package/dist/daemon/api/__tests__/reopen-delivery.test.d.ts +0 -1
  1257. package/dist/daemon/api/__tests__/reopen-delivery.test.js +0 -260
  1258. package/dist/daemon/api/__tests__/seam/api-server.test.d.ts +0 -1
  1259. package/dist/daemon/api/__tests__/seam/api-server.test.js +0 -442
  1260. package/dist/daemon/api/__tests__/seam/b10-attach-modelauth.test.d.ts +0 -1
  1261. package/dist/daemon/api/__tests__/seam/b10-attach-modelauth.test.js +0 -310
  1262. package/dist/daemon/api/__tests__/seam/leaf-api-parity.test.d.ts +0 -1
  1263. package/dist/daemon/api/__tests__/seam/leaf-api-parity.test.js +0 -351
  1264. package/dist/daemon/api/__tests__/seam/node-outcome-api.test.d.ts +0 -1
  1265. package/dist/daemon/api/__tests__/seam/node-outcome-api.test.js +0 -159
  1266. package/dist/daemon/api/__tests__/seam/profile-delete.test.d.ts +0 -1
  1267. package/dist/daemon/api/__tests__/seam/profile-delete.test.js +0 -372
  1268. package/dist/daemon/api/__tests__/submit-result.test.d.ts +0 -1
  1269. package/dist/daemon/api/__tests__/submit-result.test.js +0 -215
  1270. package/dist/migrations/__tests__/activation-concurrency.test.d.ts +0 -1
  1271. package/dist/migrations/__tests__/activation-concurrency.test.js +0 -146
  1272. package/dist/migrations/__tests__/activation.test.d.ts +0 -1
  1273. package/dist/migrations/__tests__/activation.test.js +0 -152
  1274. package/dist/migrations/__tests__/deletion-and-root-declaration.test.d.ts +0 -1
  1275. package/dist/migrations/__tests__/deletion-and-root-declaration.test.js +0 -149
  1276. package/dist/pi-extensions/__tests__/canvas-bash-valve.test.d.ts +0 -1
  1277. package/dist/pi-extensions/__tests__/canvas-bash-valve.test.js +0 -86
  1278. package/dist/pi-extensions/__tests__/canvas-context-intro.test.d.ts +0 -1
  1279. package/dist/pi-extensions/__tests__/canvas-context-intro.test.js +0 -364
  1280. package/dist/pi-extensions/__tests__/canvas-goal-capture-envelope.test.d.ts +0 -1
  1281. package/dist/pi-extensions/__tests__/canvas-goal-capture-envelope.test.js +0 -106
  1282. package/dist/pi-extensions/__tests__/canvas-recap.test.d.ts +0 -1
  1283. package/dist/pi-extensions/__tests__/canvas-recap.test.js +0 -62
  1284. package/dist/pi-extensions/__tests__/canvas-stophook-agentend.test.d.ts +0 -1
  1285. package/dist/pi-extensions/__tests__/canvas-stophook-agentend.test.js +0 -432
  1286. package/dist/pi-extensions/__tests__/canvas-stophook-context-nudge.test.d.ts +0 -1
  1287. package/dist/pi-extensions/__tests__/canvas-stophook-context-nudge.test.js +0 -152
  1288. package/dist/pi-extensions/__tests__/canvas-structured-output.test.d.ts +0 -1
  1289. package/dist/pi-extensions/__tests__/canvas-structured-output.test.js +0 -88
  1290. package/dist/pi-extensions/__tests__/canvas-tool-guide.test.d.ts +0 -1
  1291. package/dist/pi-extensions/__tests__/canvas-tool-guide.test.js +0 -96
  1292. package/dist/pi-extensions/__tests__/integration/canvas-bash-valve.test.d.ts +0 -1
  1293. package/dist/pi-extensions/__tests__/integration/canvas-bash-valve.test.js +0 -133
  1294. package/dist/pi-extensions/__tests__/pre-command-gate.test.d.ts +0 -1
  1295. package/dist/pi-extensions/__tests__/pre-command-gate.test.js +0 -232
  1296. package/dist/shared/__tests__/env-boundary.test.d.ts +0 -1
  1297. package/dist/shared/__tests__/env-boundary.test.js +0 -95
  1298. package/dist/shared/__tests__/generated-context-grammar.test.d.ts +0 -1
  1299. package/dist/shared/__tests__/generated-context-grammar.test.js +0 -80
  1300. package/docs/compat/hearth-crtr-v1.md +0 -179
  1301. package/docs/compat/hearth-crtr-v2.md +0 -177
  1302. package/docs/compat/hearth-crtr-v3.md +0 -176
  1303. package/docs/compat/hearth-crtr-v4.md +0 -182
  1304. package/docs/compat/hearth-crtr-v5.md +0 -169
@@ -1,1133 +1 @@
1
- import { envProfileId } from '../../../shared/env.js';
2
- import { ModelSelectorComponent, ThinkingSelectorComponent, } from '@earendil-works/pi-coding-agent';
3
- import { Input, 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, persistModelRoute, 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, wrapText, } from '../../../core/tui/panel.js';
11
- const MODELS_CHROME_LINES = 3;
12
- const RUNTIME_PROVIDER_ID = {
13
- anthropic: ANTHROPIC_PROVIDER_ID,
14
- openai: OPENAI_CODEX_PROVIDER_ID,
15
- };
16
- const PROVIDER_LABEL = {
17
- anthropic: "Anthropic",
18
- openai: "OpenAI",
19
- };
20
- const KIND_COLUMNS = [
21
- { mode: "base", dimension: "family" },
22
- { mode: "base", dimension: "strength" },
23
- { mode: "orchestrator", dimension: "family" },
24
- { mode: "orchestrator", dimension: "strength" },
25
- ];
26
- function modelConfigTargets() {
27
- const userRoot = userScopeRoot();
28
- const profileId = envProfileId() || null;
29
- let profileTarget;
30
- if (profileId !== null) {
31
- try {
32
- const entry = loadProfileManifest(profileId);
33
- profileTarget = {
34
- label: `Profile: ${entry.manifest.name}`,
35
- root: profileRoot(entry.profileId),
36
- };
37
- }
38
- catch {
39
- // A stale profile env should not make setup unusable; user/project
40
- // targets remain valid and launch resolution already ignores it.
41
- }
42
- }
43
- const projectRoots = findProjectScopeRoots(process.cwd(), profileId);
44
- const projectTargets = projectRoots.map((root) => ({
45
- label: `Project: ${basename(dirname(root))}`,
46
- root,
47
- }));
48
- return {
49
- targets: [
50
- { label: "User", root: userRoot },
51
- ...(profileTarget ? [profileTarget] : []),
52
- ...projectTargets,
53
- ],
54
- precedenceRoots: [
55
- ...projectRoots,
56
- ...(profileTarget ? [profileTarget.root] : []),
57
- userRoot,
58
- ],
59
- };
60
- }
61
- /** Parse a model ref `<provider>/<modelId>:<level>` into parts. */
62
- function parseModelRef(ref) {
63
- if (!ref)
64
- return {};
65
- const trimmed = ref.trim();
66
- const slash = trimmed.indexOf("/");
67
- const provider = slash === -1 ? undefined : trimmed.slice(0, slash);
68
- const rest = slash === -1 ? trimmed : trimmed.slice(slash + 1);
69
- const m = rest.match(/^(.*?):(off|minimal|low|medium|high|xhigh|max)$/i);
70
- return {
71
- provider,
72
- id: m ? m[1] : rest,
73
- level: m ? m[2].toLowerCase() : undefined,
74
- };
75
- }
76
- /** Short display for a ladder cell value — strip the `<provider>/` prefix. */
77
- function shortRef(ref) {
78
- if (!ref)
79
- return "\u2014";
80
- const slash = ref.indexOf("/");
81
- return slash === -1 ? ref : ref.slice(slash + 1);
82
- }
83
- export class ModelsPanel {
84
- tui;
85
- runtime;
86
- registry;
87
- matches;
88
- label;
89
- mode = "list";
90
- ladders;
91
- modelRoutes;
92
- legacyModelRoutes;
93
- kinds;
94
- /** The ladder providers this panel offers — only columns whose runtime
95
- * provider is signed in (all of them when nobody is, so config stays
96
- * reachable pre-login). Recomputed with every reload/refresh so a login
97
- * made on the Providers tab shows up when this tab is next entered. */
98
- providerKeys = MODEL_PROVIDER_KEYS;
99
- targets;
100
- precedenceRoots;
101
- targetIndex = 0;
102
- rawTarget;
103
- rows = [];
104
- selected = 0;
105
- column = 0;
106
- notice = "";
107
- modelSelector;
108
- thinkingSelector;
109
- pending;
110
- choice;
111
- choiceIndex = 0;
112
- routeForm;
113
- routeInput = new Input();
114
- pendingRouteCell;
115
- onChange;
116
- constructor(tui, runtime, registry, matches, label) {
117
- this.tui = tui;
118
- this.runtime = runtime;
119
- this.registry = registry;
120
- this.matches = matches;
121
- this.label = label;
122
- const scopes = modelConfigTargets();
123
- this.targets = scopes.targets;
124
- this.precedenceRoots = scopes.precedenceRoots;
125
- this.rawTarget = readRawConfigAtRoot(this.currentTarget().root);
126
- const merged = readMergedLaunchConfig();
127
- this.ladders = merged.modelLadders;
128
- this.modelRoutes = merged.modelRoutes ?? {};
129
- this.legacyModelRoutes = merged.legacyModelRoutes ?? {};
130
- this.kinds = merged.kinds;
131
- this.providerKeys = this.offeredProviders();
132
- this.rows = this.buildRows();
133
- this.routeInput.onSubmit = (value) => {
134
- const form = this.routeForm;
135
- if (!form || form.editing === null)
136
- return;
137
- form.text[form.editing] = value.trim();
138
- form.editing = null;
139
- this.routeInput.focused = false;
140
- this.notify();
141
- };
142
- this.routeInput.onEscape = () => {
143
- if (!this.routeForm)
144
- return;
145
- this.routeForm.editing = null;
146
- this.routeInput.focused = false;
147
- this.notify();
148
- };
149
- }
150
- /** Same signed-in rule as the broker's Alt+M cycle: pool occupancy for a
151
- * managed provider (read live), else the registry's auth status. */
152
- offeredProviders() {
153
- try {
154
- return configuredLadderProviders((providerId) => (isManagedProvider(providerId) &&
155
- readSubscriptionPool(providerId).length > 0) ||
156
- this.registry.getProviderAuthStatus(providerId).configured, this.ladders);
157
- }
158
- catch {
159
- return MODEL_PROVIDER_KEYS; // auth state unreadable — offer the full grid
160
- }
161
- }
162
- currentTarget() {
163
- return this.targets[this.targetIndex];
164
- }
165
- cycleTarget() {
166
- this.targetIndex = (this.targetIndex + 1) % this.targets.length;
167
- this.rawTarget = readRawConfigAtRoot(this.currentTarget().root);
168
- this.notice = "";
169
- this.notify();
170
- }
171
- shadowingPath(hasOverride) {
172
- for (const root of this.precedenceRoots) {
173
- if (root === this.currentTarget().root)
174
- break;
175
- const raw = readRawConfigAtRoot(root);
176
- if (raw && hasOverride(raw))
177
- return join(root, "config.json");
178
- }
179
- return undefined;
180
- }
181
- savedButShadowed(path) {
182
- return `Saved to ${this.currentTarget().label}; overridden by ${path ?? "a more specific config"}`;
183
- }
184
- routeIds() {
185
- return [
186
- ...new Set([
187
- ...Object.keys(this.modelRoutes),
188
- ...Object.keys(this.legacyModelRoutes),
189
- ]),
190
- ];
191
- }
192
- routeFamilies() {
193
- return [
194
- ...new Set(this.routeIds().map((routeId) => (this.modelRoutes[routeId] ?? this.legacyModelRoutes[routeId])
195
- .family)),
196
- ];
197
- }
198
- buildRows() {
199
- const rows = [{ section: "ladder", kind: "defaultProvider" }];
200
- for (const strength of MODEL_STRENGTHS)
201
- rows.push({ section: "ladder", kind: "strength", strength });
202
- for (const routeId of this.routeIds())
203
- rows.push({ section: "route", routeId });
204
- rows.push({ section: "route", routeId: null });
205
- for (const name of Object.keys(this.kinds)) {
206
- if (name.includes("/"))
207
- continue;
208
- rows.push({ section: "kind", name });
209
- }
210
- return rows;
211
- }
212
- reload() {
213
- const merged = readMergedLaunchConfig();
214
- this.ladders = merged.modelLadders;
215
- this.modelRoutes = merged.modelRoutes ?? {};
216
- this.legacyModelRoutes = merged.legacyModelRoutes ?? {};
217
- this.kinds = merged.kinds;
218
- this.rawTarget = readRawConfigAtRoot(this.currentTarget().root);
219
- this.providerKeys = this.offeredProviders();
220
- this.rows = this.buildRows();
221
- this.selected = Math.min(this.selected, this.rows.length - 1);
222
- this.clampColumn();
223
- }
224
- /** Re-read config and auth state — called when the Models tab is entered so
225
- * a provider signed in (or out) on the Providers tab is reflected here. */
226
- refresh() {
227
- this.reload();
228
- this.notify();
229
- }
230
- notify() {
231
- this.onChange?.();
232
- this.tui.requestRender();
233
- }
234
- isPickerOpen() {
235
- return this.mode !== "list";
236
- }
237
- currentRow() {
238
- return this.rows[Math.min(this.selected, this.rows.length - 1)];
239
- }
240
- columnsFor(row) {
241
- if (row.section === "ladder")
242
- return row.kind === "strength" ? this.providerKeys.length : 1;
243
- if (row.section === "route")
244
- return 1;
245
- return KIND_COLUMNS.length;
246
- }
247
- clampColumn() {
248
- this.column = Math.min(this.column, this.columnsFor(this.currentRow()) - 1);
249
- }
250
- handleInput(data) {
251
- if (this.mode === "route-form") {
252
- const form = this.routeForm;
253
- if (!form) {
254
- this.mode = "list";
255
- return true;
256
- }
257
- if (form.editing !== null) {
258
- this.routeInput.handleInput(data);
259
- return true;
260
- }
261
- if (this.matches("crtr.setup.models.cancel", data)) {
262
- this.closeRouteForm();
263
- return true;
264
- }
265
- if (this.matches("crtr.setup.list-down", data)) {
266
- form.index = Math.min(form.fields.length - 1, form.index + 1);
267
- this.notice = "";
268
- return true;
269
- }
270
- if (this.matches("crtr.setup.list-up", data)) {
271
- form.index = Math.max(0, form.index - 1);
272
- this.notice = "";
273
- return true;
274
- }
275
- if (this.matches("crtr.setup.models.open", data) ||
276
- this.matches("crtr.setup.models.commit", data)) {
277
- this.activateRouteField();
278
- return true;
279
- }
280
- return true;
281
- }
282
- if (this.mode === "route-delete") {
283
- if (this.matches("crtr.setup.confirm.accept", data)) {
284
- this.deleteRoute();
285
- return true;
286
- }
287
- if (this.matches("crtr.setup.confirm.back", data)) {
288
- this.mode = "route-form";
289
- this.notify();
290
- return true;
291
- }
292
- return true;
293
- }
294
- if (this.mode === "dimension-picker") {
295
- if (this.matches("crtr.setup.models.commit", data)) {
296
- this.commitChoice();
297
- return true;
298
- }
299
- if (this.matches("crtr.setup.models.cancel", data)) {
300
- this.closePicker();
301
- return true;
302
- }
303
- if (this.matches("crtr.setup.list-down", data)) {
304
- this.choiceIndex = Math.min((this.choice?.options.length ?? 1) - 1, this.choiceIndex + 1);
305
- return true;
306
- }
307
- if (this.matches("crtr.setup.list-up", data)) {
308
- this.choiceIndex = Math.max(0, this.choiceIndex - 1);
309
- return true;
310
- }
311
- return true;
312
- }
313
- if (this.mode === "model-picker") {
314
- const input = this.matches("crtr.setup.models.commit", data)
315
- ? "\r"
316
- : this.matches("crtr.setup.models.cancel", data)
317
- ? "\u001b"
318
- : data;
319
- this.modelSelector?.handleInput(input);
320
- return true;
321
- }
322
- if (this.mode === "thinking-picker") {
323
- const input = this.matches("crtr.setup.models.commit", data)
324
- ? "\r"
325
- : this.matches("crtr.setup.models.cancel", data)
326
- ? "\u001b"
327
- : data;
328
- this.thinkingSelector?.getSelectList().handleInput(input);
329
- return true;
330
- }
331
- if (this.matches("crtr.setup.list-down", data)) {
332
- this.selected = Math.min(this.rows.length - 1, this.selected + 1);
333
- this.clampColumn();
334
- this.notice = "";
335
- return true;
336
- }
337
- if (this.matches("crtr.setup.list-up", data)) {
338
- this.selected = Math.max(0, this.selected - 1);
339
- this.clampColumn();
340
- this.notice = "";
341
- return true;
342
- }
343
- if (this.matches("crtr.setup.cell-previous", data)) {
344
- this.column = Math.max(0, this.column - 1);
345
- return true;
346
- }
347
- if (this.matches("crtr.setup.cell-next", data)) {
348
- this.column = Math.min(this.columnsFor(this.currentRow()) - 1, this.column + 1);
349
- return true;
350
- }
351
- if (this.matches("crtr.setup.models.scope-next", data)) {
352
- this.cycleTarget();
353
- return true;
354
- }
355
- if (this.matches("crtr.setup.models.open", data)) {
356
- this.activateCell();
357
- return true;
358
- }
359
- return false;
360
- }
361
- activateCell() {
362
- const row = this.currentRow();
363
- this.notice = "";
364
- if (row.section === "ladder" && row.kind === "defaultProvider") {
365
- const currentProvider = inferPortableModelSelection(undefined, this.ladders).provider;
366
- // Cycle within the offered providers only; with a single signed-in
367
- // provider the default has nowhere else to go.
368
- const offered = this.providerKeys;
369
- const next = offered[(Math.max(0, offered.indexOf(currentProvider)) + 1) % offered.length];
370
- if (next === currentProvider)
371
- return;
372
- try {
373
- persistModelLadders(this.currentTarget().root, {
374
- defaultProvider: next,
375
- });
376
- }
377
- catch (error) {
378
- this.notice = `Could not save: ${error instanceof Error ? error.message : String(error)}`;
379
- this.notify();
380
- return;
381
- }
382
- this.reload();
383
- if ((this.ladders.defaultProvider ?? "anthropic") !== next) {
384
- const path = this.shadowingPath((raw) => raw.modelLadders?.defaultProvider !== undefined);
385
- this.notice = this.savedButShadowed(path);
386
- }
387
- this.notify();
388
- return;
389
- }
390
- if (row.section === "ladder" && row.kind === "strength") {
391
- this.openModelPicker(this.providerKeys[this.column], row.strength);
392
- return;
393
- }
394
- if (row.section === "route") {
395
- this.openRouteForm(row.routeId);
396
- return;
397
- }
398
- if (row.section === "kind") {
399
- const col = KIND_COLUMNS[this.column];
400
- if (!col)
401
- return;
402
- this.openDimensionPicker(row.name, col.mode, col.dimension);
403
- }
404
- }
405
- portableSelection(value) {
406
- if (value !== undefined) {
407
- const slash = value.lastIndexOf("/");
408
- const family = slash === -1 ? "" : value.slice(0, slash);
409
- const strength = slash === -1 ? "" : value.slice(slash + 1);
410
- if (this.routeFamilies().includes(family) &&
411
- MODEL_STRENGTHS.includes(strength)) {
412
- return { family, strength: strength };
413
- }
414
- }
415
- const inferred = inferPortableModelSelection(value, this.ladders);
416
- return { family: inferred.provider, strength: inferred.strength };
417
- }
418
- familyLabel(family) {
419
- return family === "anthropic" || family === "openai"
420
- ? PROVIDER_LABEL[family]
421
- : family;
422
- }
423
- familyOptions() {
424
- return [...new Set([...this.providerKeys, ...this.routeFamilies()])];
425
- }
426
- /** Snapshot of the mode's current family+strength. For orchestrator this
427
- * falls back to the base `model` when no explicit override exists, so the
428
- * inherited pair is what an edit preserves. */
429
- kindSelection(name, mode) {
430
- const cfg = this.kinds[name];
431
- const value = mode === "orchestrator"
432
- ? (cfg?.orchestratorModel ?? cfg?.model)
433
- : cfg?.model;
434
- return this.portableSelection(value);
435
- }
436
- openDimensionPicker(name, mode, dimension) {
437
- const current = this.kindSelection(name, mode);
438
- const options = dimension === "family" ? this.familyOptions() : MODEL_STRENGTHS;
439
- const currentToken = dimension === "family" ? current.family : current.strength;
440
- const modeLabel = mode === "orchestrator" ? "orchestrator" : "base";
441
- const paired = dimension === "family"
442
- ? `strength ${current.strength}`
443
- : `family ${this.familyLabel(current.family)}`;
444
- this.choice = {
445
- title: `Choose ${modeLabel} ${dimension}`,
446
- subtitle: `${name} · keeps ${modeLabel} ${paired}`,
447
- options,
448
- label: (option) => dimension === "family" ? this.familyLabel(option) : option,
449
- commit: (chosen) => {
450
- const family = dimension === "family" ? chosen : current.family;
451
- const strength = dimension === "strength"
452
- ? chosen
453
- : current.strength;
454
- this.writeKindSelection(name, mode, family, strength);
455
- },
456
- };
457
- this.choiceIndex = Math.max(0, options.indexOf(currentToken));
458
- this.mode = "dimension-picker";
459
- this.notify();
460
- }
461
- writeKindSelection(name, mode, family, strength) {
462
- const token = `${family}/${strength}`;
463
- try {
464
- persistDefaultKindModel({
465
- root: this.currentTarget().root,
466
- kind: name,
467
- model: token,
468
- orchestrator: mode === "orchestrator",
469
- });
470
- }
471
- catch (error) {
472
- this.notice = `Could not save: ${error instanceof Error ? error.message : String(error)}`;
473
- return;
474
- }
475
- this.reload();
476
- const after = this.kinds[name];
477
- const effective = mode === "orchestrator" ? after?.orchestratorModel : after?.model;
478
- if (effective !== token) {
479
- const field = mode === "orchestrator" ? "orchestratorModel" : "model";
480
- const path = this.shadowingPath((raw) => {
481
- const entry = raw.kinds?.[name];
482
- return entry?.[field] !== undefined;
483
- });
484
- this.notice = this.savedButShadowed(path);
485
- }
486
- }
487
- commitChoice() {
488
- const choice = this.choice;
489
- const chosen = choice?.options[this.choiceIndex];
490
- if (choice && chosen !== undefined)
491
- choice.commit(chosen);
492
- this.closePicker();
493
- }
494
- openRouteForm(routeId) {
495
- const route = routeId === null
496
- ? undefined
497
- : (this.modelRoutes[routeId] ?? this.legacyModelRoutes[routeId]);
498
- const fields = [
499
- ...(routeId === null
500
- ? [{ kind: "text", key: "routeId", label: "Route id" }]
501
- : []),
502
- { kind: "text", key: "family", label: "Family" },
503
- {
504
- kind: "text",
505
- key: "credentialSource",
506
- label: "Credential source",
507
- },
508
- { kind: "provider", label: "Provider id" },
509
- ...MODEL_STRENGTHS.map((strength) => ({ kind: "cell", strength })),
510
- { kind: "save" },
511
- ...(routeId === null ? [] : [{ kind: "delete" }]),
512
- ];
513
- this.routeForm = {
514
- existing: routeId,
515
- text: {
516
- routeId: routeId ?? "",
517
- family: route?.family ?? "",
518
- credentialSource: route?.credentialSource ?? "",
519
- },
520
- providerId: route?.providerId ?? "",
521
- models: { ...route?.models },
522
- fields,
523
- index: 0,
524
- editing: null,
525
- };
526
- this.mode = "route-form";
527
- this.notice = "";
528
- this.notify();
529
- }
530
- closeRouteForm() {
531
- this.routeInput.focused = false;
532
- this.routeForm = undefined;
533
- this.mode = "list";
534
- this.notice = "";
535
- this.notify();
536
- }
537
- activateRouteField() {
538
- const form = this.routeForm;
539
- const field = form?.fields[form.index];
540
- if (!form || !field)
541
- return;
542
- if (field.kind === "text") {
543
- form.editing = field.key;
544
- this.routeInput.setValue(form.text[field.key]);
545
- this.routeInput.handleInput("\x05");
546
- this.routeInput.focused = true;
547
- this.notify();
548
- return;
549
- }
550
- if (field.kind === "provider") {
551
- const options = [
552
- ...new Set([
553
- ...this.registry.getAll().map((model) => model.provider),
554
- ...(form.providerId ? [form.providerId] : []),
555
- ]),
556
- ].sort();
557
- this.choice = {
558
- title: "Choose provider id",
559
- subtitle: "Route cells must all belong to this registry provider",
560
- options,
561
- label: (option) => option,
562
- commit: (chosen) => this.setRouteProvider(chosen),
563
- };
564
- this.choiceIndex = Math.max(0, options.indexOf(form.providerId));
565
- this.mode = "dimension-picker";
566
- this.notify();
567
- return;
568
- }
569
- if (field.kind === "cell") {
570
- this.openRouteCell(field.strength);
571
- return;
572
- }
573
- if (field.kind === "save") {
574
- this.saveRoute();
575
- return;
576
- }
577
- this.mode = "route-delete";
578
- this.notify();
579
- }
580
- setRouteProvider(providerId) {
581
- const form = this.routeForm;
582
- if (!form)
583
- return;
584
- form.providerId = providerId;
585
- const cleared = [];
586
- for (const strength of MODEL_STRENGTHS) {
587
- const ref = form.models[strength];
588
- if (ref !== undefined && !ref.startsWith(`${providerId}/`)) {
589
- delete form.models[strength];
590
- cleared.push(strength);
591
- }
592
- }
593
- this.notice =
594
- cleared.length === 0
595
- ? ""
596
- : `Cleared ${cleared.join(", ")} because those models belong to another provider.`;
597
- }
598
- openRouteCell(strength) {
599
- const form = this.routeForm;
600
- if (!form)
601
- return;
602
- if (!form.providerId) {
603
- this.notice = "Choose the provider id first";
604
- this.notify();
605
- return;
606
- }
607
- const scoped = this.registry
608
- .getAll()
609
- .filter((model) => model.provider === form.providerId);
610
- if (scoped.length === 0) {
611
- this.notice = `No models registered for provider "${form.providerId}" — this route cannot be edited here.`;
612
- this.notify();
613
- return;
614
- }
615
- const parsed = parseModelRef(form.models[strength]);
616
- const current = parsed.provider && parsed.id
617
- ? this.registry.find(parsed.provider, parsed.id)
618
- : undefined;
619
- this.pendingRouteCell = { strength };
620
- this.showModelSelector(scoped, current, (model) => this.onRouteModelPicked(model));
621
- }
622
- onRouteModelPicked(model) {
623
- const pending = this.pendingRouteCell;
624
- const form = this.routeForm;
625
- if (!pending || !form) {
626
- this.closePicker();
627
- return;
628
- }
629
- if (model.provider !== form.providerId) {
630
- this.notice = `That is a ${model.provider} model — pick a ${form.providerId} model for this route.`;
631
- this.closePicker();
632
- return;
633
- }
634
- pending.model = model;
635
- if (model.reasoning) {
636
- const currentLevel = parseModelRef(form.models[pending.strength]).level ?? "medium";
637
- this.thinkingSelector = new ThinkingSelectorComponent(currentLevel, [...THINKING_SUFFIXES], (level) => this.onThinkingPicked(level), () => this.closePicker());
638
- this.modelSelector = undefined;
639
- this.mode = "thinking-picker";
640
- this.notify();
641
- return;
642
- }
643
- form.models[pending.strength] = `${model.provider}/${model.id}`;
644
- this.closePicker();
645
- }
646
- saveRoute() {
647
- const form = this.routeForm;
648
- if (!form)
649
- return;
650
- const routeId = form.text.routeId.trim();
651
- if (!routeId) {
652
- this.notice = "Route id is required.";
653
- this.notify();
654
- return;
655
- }
656
- if (!form.text.family.trim()) {
657
- this.notice = "Family is required.";
658
- this.notify();
659
- return;
660
- }
661
- if (!form.text.credentialSource.trim()) {
662
- this.notice = "Credential source is required.";
663
- this.notify();
664
- return;
665
- }
666
- if (!form.providerId.trim()) {
667
- this.notice = "Provider id is required.";
668
- this.notify();
669
- return;
670
- }
671
- const missing = MODEL_STRENGTHS.filter((strength) => form.models[strength] === undefined);
672
- if (missing.length > 0) {
673
- this.notice = `Choose models for ${missing.join(", ")} before saving.`;
674
- this.notify();
675
- return;
676
- }
677
- const route = {
678
- family: form.text.family.trim(),
679
- credentialSource: form.text.credentialSource.trim(),
680
- providerId: form.providerId.trim(),
681
- models: {
682
- ultra: form.models.ultra,
683
- strong: form.models.strong,
684
- medium: form.models.medium,
685
- light: form.models.light,
686
- },
687
- };
688
- try {
689
- persistModelRoute(this.currentTarget().root, routeId, route);
690
- }
691
- catch (error) {
692
- this.notice = `Could not save: ${error instanceof Error ? error.message : String(error)}`;
693
- this.notify();
694
- return;
695
- }
696
- this.routeForm = undefined;
697
- this.mode = "list";
698
- this.reload();
699
- const routeRow = this.rows.findIndex((row) => row.section === "route" && row.routeId === routeId);
700
- if (routeRow >= 0)
701
- this.selected = routeRow;
702
- if (JSON.stringify(this.modelRoutes[routeId]) !== JSON.stringify(route)) {
703
- const path = this.shadowingPath((raw) => raw.modelRoutes?.[routeId] !== undefined);
704
- this.notice = this.savedButShadowed(path);
705
- }
706
- else {
707
- this.notice = `Saved route "${routeId}" to ${this.currentTarget().label}.`;
708
- }
709
- this.notify();
710
- }
711
- declaringPath(routeId) {
712
- for (const root of this.precedenceRoots) {
713
- if (root === this.currentTarget().root)
714
- continue;
715
- const raw = readRawConfigAtRoot(root);
716
- if (raw?.modelRoutes?.[routeId] !== undefined)
717
- return join(root, "config.json");
718
- }
719
- return undefined;
720
- }
721
- deleteRoute() {
722
- const routeId = this.routeForm?.existing;
723
- if (!routeId) {
724
- this.mode = "route-form";
725
- this.notify();
726
- return;
727
- }
728
- try {
729
- persistModelRoute(this.currentTarget().root, routeId, undefined);
730
- }
731
- catch (error) {
732
- this.mode = "route-form";
733
- this.notice = `Could not delete: ${error instanceof Error ? error.message : String(error)}`;
734
- this.notify();
735
- return;
736
- }
737
- const inherited = this.declaringPath(routeId);
738
- this.routeForm = undefined;
739
- this.mode = "list";
740
- this.reload();
741
- this.notice = inherited
742
- ? `Removed route "${routeId}" from ${this.currentTarget().label}; it is still declared by ${inherited}.`
743
- : `Removed route "${routeId}" from ${this.currentTarget().label}.`;
744
- this.notify();
745
- }
746
- showModelSelector(scoped, current, onPick) {
747
- this.modelSelector = new ModelSelectorComponent(this.tui, current, this.runtime, scoped.map((model) => ({ model })), onPick, () => this.closePicker());
748
- this.modelSelector.focused = true;
749
- this.mode = "model-picker";
750
- this.notify();
751
- }
752
- openModelPicker(providerKey, strength) {
753
- const expectedRuntime = RUNTIME_PROVIDER_ID[providerKey];
754
- const registry = this.registry;
755
- const parsed = parseModelRef(this.ladders[providerKey][strength]);
756
- const currentModel = parsed.provider && parsed.id
757
- ? registry.find(parsed.provider, parsed.id)
758
- : undefined;
759
- const scoped = registry
760
- .getAvailable()
761
- .filter((model) => model.provider === expectedRuntime);
762
- if (scoped.length === 0) {
763
- this.notice = `No ${providerKey} models available \u2014 sign in first.`;
764
- this.notify();
765
- return;
766
- }
767
- this.pending = { providerKey, strength, expectedRuntime };
768
- this.showModelSelector(scoped, currentModel, (model) => this.onModelPicked(model));
769
- }
770
- onModelPicked(model) {
771
- if (!this.pending) {
772
- this.closePicker();
773
- return;
774
- }
775
- if (model.provider !== this.pending.expectedRuntime) {
776
- this.notice = `That is a ${model.provider} model \u2014 pick an ${this.pending.providerKey} model for this column.`;
777
- this.closePicker();
778
- return;
779
- }
780
- this.pending.model = model;
781
- if (model.reasoning) {
782
- const currentLevel = parseModelRef(this.ladders[this.pending.providerKey][this.pending.strength]).level ?? "medium";
783
- this.thinkingSelector = new ThinkingSelectorComponent(currentLevel, [...THINKING_SUFFIXES], (level) => this.onThinkingPicked(level), () => this.closePicker());
784
- this.modelSelector = undefined;
785
- this.mode = "thinking-picker";
786
- this.notify();
787
- return;
788
- }
789
- this.writeLadder(model, undefined);
790
- this.closePicker();
791
- }
792
- onThinkingPicked(level) {
793
- if (this.pendingRouteCell?.model && this.routeForm) {
794
- const { model, strength } = this.pendingRouteCell;
795
- this.routeForm.models[strength] = `${model.provider}/${model.id}${level !== "off" ? `:${level}` : ""}`;
796
- }
797
- else if (this.pending?.model) {
798
- this.writeLadder(this.pending.model, level);
799
- }
800
- this.closePicker();
801
- }
802
- writeLadder(model, level) {
803
- if (!this.pending)
804
- return;
805
- const ref = `${model.provider}/${model.id}${level && level !== "off" ? `:${level}` : ""}`;
806
- const { providerKey, strength } = this.pending;
807
- try {
808
- persistModelLadders(this.currentTarget().root, {
809
- [providerKey]: { [strength]: ref },
810
- });
811
- }
812
- catch (error) {
813
- this.notice = `Could not save: ${error instanceof Error ? error.message : String(error)}`;
814
- return;
815
- }
816
- this.reload();
817
- if (this.ladders[providerKey][strength] !== ref) {
818
- const path = this.shadowingPath((raw) => raw.modelLadders?.[providerKey]?.[strength] !== undefined);
819
- this.notice = this.savedButShadowed(path);
820
- }
821
- }
822
- closePicker() {
823
- this.mode = this.routeForm !== undefined ? "route-form" : "list";
824
- this.modelSelector = undefined;
825
- this.thinkingSelector = undefined;
826
- this.pending = undefined;
827
- this.pendingRouteCell = undefined;
828
- this.choice = undefined;
829
- this.notify();
830
- }
831
- dispose() {
832
- this.routeForm = undefined;
833
- this.closePicker();
834
- }
835
- targetLadderOverride(providerKey, strength) {
836
- const raw = this.rawTarget?.modelLadders;
837
- return raw?.[providerKey]?.[strength] !== undefined;
838
- }
839
- targetKindOverride(name, orchestrator) {
840
- const kinds = this.rawTarget?.kinds;
841
- const field = orchestrator ? "orchestratorModel" : "model";
842
- return kinds?.[name]?.[field] !== undefined;
843
- }
844
- footerHint() {
845
- if (this.mode === "dimension-picker") {
846
- return `${this.label("crtr.setup.list-down")}/${this.label("crtr.setup.list-up")} choice \u00b7 ${this.label("crtr.setup.models.commit")} save \u00b7 ${this.label("crtr.setup.models.cancel")} cancel`;
847
- }
848
- if (this.mode === "model-picker")
849
- return `type to search \u00b7 ${this.label("crtr.setup.models.commit")} select \u00b7 tab all/scoped \u00b7 ${this.label("crtr.setup.models.cancel")} cancel`;
850
- if (this.mode === "thinking-picker")
851
- return `\u2191/\u2193 level \u00b7 ${this.label("crtr.setup.models.commit")} set \u00b7 ${this.label("crtr.setup.models.cancel")} cancel`;
852
- if (this.mode === "route-delete")
853
- return `${this.label("crtr.setup.confirm.accept")} delete \u00b7 ${this.label("crtr.setup.confirm.back")} cancel`;
854
- if (this.mode === "route-form") {
855
- return typeof this.routeForm?.editing === "string"
856
- ? "type a value · enter save · esc cancel"
857
- : `${this.label("crtr.setup.list-down")}/${this.label("crtr.setup.list-up")} field · ${this.label("crtr.setup.models.open")} edit · ${this.label("crtr.setup.models.cancel")} back`;
858
- }
859
- return "";
860
- }
861
- /** Body lines only — the caller frames and windows them. */
862
- renderChoicePicker() {
863
- const choice = this.choice;
864
- if (!choice)
865
- return [theme.fg("warning", "No setting selected.")];
866
- const body = [
867
- theme.fg("accent", theme.bold(choice.title)),
868
- theme.fg("dim", choice.subtitle),
869
- "",
870
- ];
871
- for (const [index, option] of choice.options.entries()) {
872
- const active = index === this.choiceIndex;
873
- const marker = active ? theme.fg("accent", "\u25b6") : " ";
874
- const label = choice.label(option);
875
- body.push(`${marker} ${active ? theme.fg("accent", `[${label}]`) : theme.fg("dim", ` ${label} `)}`);
876
- }
877
- return body;
878
- }
879
- renderRouteForm(width) {
880
- const form = this.routeForm;
881
- if (!form)
882
- return [theme.fg("warning", "No route selected.")];
883
- const target = this.currentTarget();
884
- const body = [
885
- theme.fg("accent", theme.bold(form.existing === null
886
- ? "New provider route"
887
- : `Provider route: ${form.existing}`)),
888
- theme.fg("dim", `${target.label} · ${join(target.root, "config.json")}`),
889
- "",
890
- ];
891
- const labelWidth = 20;
892
- for (const [index, field] of form.fields.entries()) {
893
- const active = index === form.index;
894
- const marker = active ? theme.fg("accent", "▶") : " ";
895
- let label;
896
- let value;
897
- if (field.kind === "text") {
898
- label = field.label;
899
- value = form.text[field.key] || "—";
900
- if (active && form.editing === field.key) {
901
- const inputWidth = Math.max(8, width - labelWidth - 4);
902
- value = this.routeInput.render(inputWidth)[0] ?? "";
903
- }
904
- }
905
- else if (field.kind === "provider") {
906
- label = field.label;
907
- value = form.providerId || "—";
908
- }
909
- else if (field.kind === "cell") {
910
- label = field.strength;
911
- value = shortRef(form.models[field.strength]);
912
- }
913
- else if (field.kind === "save") {
914
- label = "";
915
- value = "Save route";
916
- }
917
- else {
918
- label = "";
919
- value = "Delete route";
920
- }
921
- const missing = value === "—";
922
- const rendered = active
923
- ? theme.fg("accent", `[${value}]`)
924
- : theme.fg(missing ? "warning" : "dim", ` ${value} `);
925
- body.push(`${marker} ${padAnsi(label, labelWidth)}${rendered}`);
926
- }
927
- if (this.notice)
928
- body.push("", theme.fg("warning", this.notice));
929
- return body;
930
- }
931
- renderRouteDelete(width) {
932
- const routeId = this.routeForm?.existing ?? "this route";
933
- const target = this.currentTarget();
934
- const warning = wrapText(`This removes the entry from ${target.label}. Any "${routeId}" declared by a lower-precedence config becomes effective again; this does not guarantee the route is gone.`, width).map((line) => theme.fg("warning", line));
935
- return [
936
- theme.fg("accent", theme.bold(`Delete provider route: ${routeId}`)),
937
- theme.fg("dim", join(target.root, "config.json")),
938
- "",
939
- ...warning,
940
- "",
941
- theme.fg("dim", `${this.label("crtr.setup.confirm.accept")} delete ${this.label("crtr.setup.confirm.back")} cancel`),
942
- ];
943
- }
944
- /** Fits the panel body into `budget` rows. The wizard draws header/tabs above
945
- * and a footer below, so a body taller than its budget pushes the tab strip
946
- * off the top of the terminal — the panel must window itself instead. Chrome
947
- * (title/subtitle/blank) sheds first, then the remaining lines scroll just
948
- * far enough to keep the selected row on screen. */
949
- fitBody(lines, selected, budget) {
950
- if (lines.length <= budget)
951
- return lines;
952
- const chrome = Math.min(MODELS_CHROME_LINES, lines.length - budget);
953
- const rest = lines.slice(chrome);
954
- if (rest.length <= budget)
955
- return rest;
956
- const anchor = Math.max(0, selected - chrome);
957
- const start = Math.max(0, Math.min(anchor - budget + 2, rest.length - budget));
958
- return rest.slice(start, start + budget);
959
- }
960
- render(width, height) {
961
- const contentBudget = Math.max(1, height);
962
- const frame = (lines) => renderRows(lines, width);
963
- if (this.mode === "dimension-picker")
964
- // Provider ids run to dozens of options, so the picker windows on its
965
- // selection like the list does — a tail cut would scroll the cursor off.
966
- return frame(this.fitBody(this.renderChoicePicker(), MODELS_CHROME_LINES + this.choiceIndex, contentBudget));
967
- if (this.mode === "model-picker")
968
- return frame(fitTail(this.modelSelector?.render(width) ?? [], contentBudget));
969
- if (this.mode === "thinking-picker")
970
- return frame(fitTail(this.thinkingSelector?.render(width) ?? [], contentBudget));
971
- if (this.mode === "route-form") {
972
- const selectedLine = 3 + (this.routeForm?.index ?? 0);
973
- return frame(this.fitBody(this.renderRouteForm(width), selectedLine, contentBudget));
974
- }
975
- if (this.mode === "route-delete")
976
- return frame(fitTail(this.renderRouteDelete(width), contentBudget));
977
- let selectedLine = 0;
978
- const body = [
979
- theme.fg("accent", theme.bold("Models")),
980
- theme.fg("dim", "global user defaults \u00b7 project/profile scopes can shadow these"),
981
- "",
982
- ];
983
- const selectedRow = this.currentRow();
984
- const strengthSelected = selectedRow.section === "ladder" && selectedRow.kind === "strength";
985
- // Ladder grid layout. The provider columns share the width left after the
986
- // 2-space marker gutter and the strength label, divided across as many
987
- // columns as fit at a minimum cell width; any that don't fit scroll into a
988
- // horizontal viewport that follows the selected column, so the grid scales
989
- // to N providers instead of truncating the last column off-screen.
990
- const innerWidth = Math.max(1, width);
991
- const ladderLabelWidth = Math.max(12, Math.min(20, Math.floor(innerWidth * 0.24)));
992
- const providerCount = this.providerKeys.length;
993
- const gridWidth = Math.max(1, innerWidth - 2 - ladderLabelWidth);
994
- const minCellWidth = 12;
995
- const maxVisible = Math.max(1, Math.floor((gridWidth + 1) / (minCellWidth + 1)));
996
- const visibleCount = Math.min(providerCount, maxVisible);
997
- const ladderCellWidth = Math.max(minCellWidth, Math.floor((gridWidth - (visibleCount - 1)) / visibleCount));
998
- const activeColumn = strengthSelected
999
- ? Math.min(this.column, providerCount - 1)
1000
- : 0;
1001
- const viewStart = Math.max(0, Math.min(activeColumn >= visibleCount ? activeColumn - visibleCount + 1 : 0, providerCount - visibleCount));
1002
- const viewEnd = viewStart + visibleCount;
1003
- const visibleCols = this.providerKeys
1004
- .map((provider, column) => ({ provider, column }))
1005
- .slice(viewStart, viewEnd);
1006
- const moreLeft = viewStart > 0;
1007
- const moreRight = viewEnd < providerCount;
1008
- const scrollHint = moreLeft || moreRight
1009
- ? ` ${theme.fg("dim", `${moreLeft ? "\u2039 " : ""}${viewStart + 1}\u2013${viewEnd} of ${providerCount}${moreRight ? " \u203a" : ""}`)}`
1010
- : "";
1011
- const target = this.currentTarget();
1012
- body.push(`${theme.fg("accent", "Editing config")} ${theme.fg("accent", `[${target.label}]`)}${theme.fg("dim", ` ${this.targetIndex + 1}/${this.targets.length}`)}`);
1013
- body.push(theme.fg("muted", join(target.root, "config.json")), "");
1014
- body.push(theme.fg("accent", "Strength ladders") + scrollHint);
1015
- const effectiveDefaultProvider = inferPortableModelSelection(undefined, this.ladders).provider;
1016
- const defaultRow = this.rows.find((row) => row.section === "ladder" && row.kind === "defaultProvider");
1017
- const defaultSelected = defaultRow === selectedRow;
1018
- if (defaultSelected)
1019
- selectedLine = body.length;
1020
- body.push(`${defaultSelected ? theme.fg("accent", "\u25b6") : " "} ${padAnsi(defaultSelected ? theme.fg("accent", "Default provider") : "Default provider", 20)} ${theme.fg("success", effectiveDefaultProvider)}`);
1021
- const providerHeading = (provider, column) => {
1022
- const heading = padAnsi(theme.bold(PROVIDER_LABEL[provider]), ladderCellWidth);
1023
- return strengthSelected && this.column === column
1024
- ? theme.fg("accent", heading)
1025
- : theme.fg("dim", heading);
1026
- };
1027
- const ladderCell = (text, active) => {
1028
- const content = padAnsi(truncateToWidth(text, Math.max(1, ladderCellWidth - 2)), Math.max(1, ladderCellWidth - 2));
1029
- return active
1030
- ? theme.fg("accent", `[${content}]`)
1031
- : theme.fg("dim", ` ${content} `);
1032
- };
1033
- body.push(`${" ".repeat(2)}${padAnsi(theme.fg("dim", "Strength"), ladderLabelWidth)}${visibleCols.map(({ provider, column }) => providerHeading(provider, column)).join(" ")}`);
1034
- for (const row of this.rows) {
1035
- if (row.section !== "ladder" || row.kind !== "strength")
1036
- continue;
1037
- const isSel = row === selectedRow;
1038
- const marker = isSel ? theme.fg("accent", "\u25b6") : " ";
1039
- if (isSel)
1040
- selectedLine = body.length;
1041
- const cells = visibleCols.map(({ provider, column }) => {
1042
- const over = this.targetLadderOverride(provider, row.strength)
1043
- ? theme.fg("warning", "\u2022")
1044
- : " ";
1045
- return ladderCell(`${over}${shortRef(this.ladders[provider][row.strength])}`, isSel && column === this.column);
1046
- });
1047
- body.push(`${marker} ${padAnsi(row.strength, ladderLabelWidth)}${cells.join(" ")}`);
1048
- }
1049
- body.push("", theme.fg("accent", "Provider routes"));
1050
- body.push(theme.fg("dim", `${theme.fg("warning", "•")} override in ${target.label} · a declared route replaces the ladders above at launch · id, then family · source · provider`));
1051
- const routeCellWidth = Math.max(10, Math.floor((innerWidth - 8) / 4));
1052
- body.push(`${" ".repeat(4)}${MODEL_STRENGTHS.map((strength) => padAnsi(theme.fg("dim", strength), routeCellWidth)).join(" ")}`);
1053
- const routeIds = this.routeIds();
1054
- if (routeIds.length === 0) {
1055
- body.push(theme.fg("dim", " No routes declared — the ladders above are used."));
1056
- }
1057
- for (const row of this.rows) {
1058
- if (row.section !== "route" || row.routeId === null)
1059
- continue;
1060
- const routeId = row.routeId;
1061
- const complete = this.modelRoutes[routeId];
1062
- const route = complete ?? this.legacyModelRoutes[routeId];
1063
- const isSel = row === selectedRow;
1064
- if (isSel)
1065
- selectedLine = body.length;
1066
- const marker = isSel ? theme.fg("accent", "▶") : " ";
1067
- const over = this.rawTarget?.modelRoutes?.[routeId] !== undefined
1068
- ? theme.fg("warning", "•")
1069
- : " ";
1070
- const incomplete = complete ? "" : theme.fg("warning", " · incomplete");
1071
- const metadata = theme.fg("dim", `${route.family} · ${route.credentialSource} · ${route.providerId}`);
1072
- body.push(`${marker} ${over}${theme.fg(isSel ? "accent" : "dim", routeId)} ${metadata}${incomplete}`);
1073
- const cells = MODEL_STRENGTHS.map((strength) => {
1074
- const value = route.models[strength];
1075
- const rendered = padAnsi(truncateToWidth(shortRef(value), routeCellWidth), routeCellWidth);
1076
- return theme.fg(value === undefined ? "warning" : "dim", rendered);
1077
- });
1078
- body.push(`${" ".repeat(4)}${cells.join(" ")}`);
1079
- }
1080
- const newRouteRow = this.rows.find((row) => row.section === "route" && row.routeId === null);
1081
- const newRouteSelected = newRouteRow === selectedRow;
1082
- if (newRouteSelected)
1083
- selectedLine = body.length;
1084
- body.push(`${newRouteSelected ? theme.fg("accent", "▶") : " "} ${theme.fg(newRouteSelected ? "accent" : "dim", "+ New route")}`);
1085
- body.push("", theme.fg("accent", "Kind defaults"));
1086
- body.push(theme.fg("dim", `${theme.fg("warning", "\u2022")} override in ${target.label} \u00b7 orchestrator inherits base until you set it`));
1087
- const nameW = 16;
1088
- const familyCellW = 12;
1089
- const strCellW = 9;
1090
- const groupW = familyCellW + 1 + strCellW;
1091
- // Fixed-width cell: `[value]` when the column is selected, faint (muted) for
1092
- // an inherited orchestrator value, plain dim otherwise. The 2 brackets/spaces
1093
- // keep every cell exactly `w` wide so the column headers line up.
1094
- const cell = (raw, w, active, faint) => {
1095
- const inner = padAnsi(truncateToWidth(raw, Math.max(1, w - 2)), Math.max(1, w - 2));
1096
- return active
1097
- ? theme.fg("accent", `[${inner}]`)
1098
- : faint
1099
- ? theme.fg("muted", ` ${inner} `)
1100
- : theme.fg("dim", ` ${inner} `);
1101
- };
1102
- body.push(`${" ".repeat(2 + nameW)}${padAnsi(theme.bold(theme.fg("dim", "Base")), groupW)} ${padAnsi(theme.bold(theme.fg("dim", "Orchestrator")), groupW)}`);
1103
- body.push(`${" ".repeat(2)}${padAnsi(theme.fg("dim", "Kind"), nameW)}${padAnsi(theme.fg("dim", "Family"), familyCellW)} ${padAnsi(theme.fg("dim", "Strength"), strCellW)} ${padAnsi(theme.fg("dim", "Family"), familyCellW)} ${padAnsi(theme.fg("dim", "Strength"), strCellW)}`);
1104
- for (const row of this.rows) {
1105
- if (row.section !== "kind")
1106
- continue;
1107
- const isSel = row === selectedRow;
1108
- const marker = isSel ? theme.fg("accent", "\u25b6") : " ";
1109
- if (isSel)
1110
- selectedLine = body.length;
1111
- const cfg = this.kinds[row.name];
1112
- const baseSel = this.portableSelection(cfg?.model);
1113
- const orchInherited = cfg?.orchestratorModel === undefined;
1114
- const orchSel = this.portableSelection(cfg?.orchestratorModel ?? cfg?.model);
1115
- const baseOver = this.targetKindOverride(row.name, false)
1116
- ? theme.fg("warning", "\u2022")
1117
- : " ";
1118
- const orchOver = this.targetKindOverride(row.name, true)
1119
- ? theme.fg("warning", "\u2022")
1120
- : " ";
1121
- const cells = [
1122
- cell(`${baseOver}${this.familyLabel(baseSel.family)}`, familyCellW, isSel && this.column === 0, false),
1123
- cell(`${baseOver}${baseSel.strength}`, strCellW, isSel && this.column === 1, false),
1124
- cell(`${orchOver}${this.familyLabel(orchSel.family)}`, familyCellW, isSel && this.column === 2, orchInherited),
1125
- cell(`${orchOver}${orchSel.strength}`, strCellW, isSel && this.column === 3, orchInherited),
1126
- ];
1127
- body.push(`${marker} ${padAnsi(row.name, nameW)}${cells[0]} ${cells[1]} ${cells[2]} ${cells[3]}`);
1128
- }
1129
- if (this.notice)
1130
- body.push("", theme.fg("warning", this.notice));
1131
- return frame(this.fitBody(body, selectedLine, contentBudget));
1132
- }
1133
- }
1
+ var ge=Object.defineProperty;var y=(p,e)=>ge(p,"name",{value:e,configurable:!0});import{envProfileId as pe}from"../../../shared/env.js";import{ModelSelectorComponent as $e,ThinkingSelectorComponent as ee}from"@earendil-works/pi-coding-agent";import{Input as ve,truncateToWidth as V}from"@earendil-works/pi-tui";import{basename as ye,dirname as ke,join as S}from"node:path";import{ANTHROPIC_PROVIDER_ID as be,OPENAI_CODEX_PROVIDER_ID as Re,isManagedProvider as we,readSubscriptionPool as xe}from"../../../core/subscription-state.js";import{readRawConfigAtRoot as P,persistDefaultKindModel as Ie,persistModelLadders as te,persistModelRoute as ie,readMergedLaunchConfig as re}from"../../../core/config.js";import{findProjectScopeRoots as Me,userScopeRoot as Se}from"../../../core/scope.js";import{loadProfileManifest as Pe,profileRoot as Ce}from"../../../core/profiles/manifest.js";import{configuredLadderProviders as Te,inferPortableModelSelection as q,MODEL_PROVIDER_KEYS as oe,MODEL_STRENGTHS as k,THINKING_SUFFIXES as se}from"../../../core/runtime/model-selection.js";import{fitTail as U,padAnsi as f,renderRows as Fe,theme as o,wrapText as Oe}from"../../../core/tui/panel.js";const ne=3,Le={anthropic:be,openai:Re},ce={anthropic:"Anthropic",openai:"OpenAI"},de=[{mode:"base",dimension:"family"},{mode:"base",dimension:"strength"},{mode:"orchestrator",dimension:"family"},{mode:"orchestrator",dimension:"strength"}];function Ee(){const p=Se(),e=pe()||null;let t;if(e!==null)try{const s=Pe(e);t={label:`Profile: ${s.manifest.name}`,root:Ce(s.profileId)}}catch{}const i=Me(process.cwd(),e),r=i.map(s=>({label:`Project: ${ye(ke(s))}`,root:s}));return{targets:[{label:"User",root:p},...t?[t]:[],...r],precedenceRoots:[...i,...t?[t.root]:[],p]}}y(Ee,"modelConfigTargets");function j(p){if(!p)return{};const e=p.trim(),t=e.indexOf("/"),i=t===-1?void 0:e.slice(0,t),r=t===-1?e:e.slice(t+1),s=r.match(/^(.*?):(off|minimal|low|medium|high|xhigh|max)$/i);return{provider:i,id:s?s[1]:r,level:s?s[2].toLowerCase():void 0}}y(j,"parseModelRef");function G(p){if(!p)return"\u2014";const e=p.indexOf("/");return e===-1?p:p.slice(e+1)}y(G,"shortRef");class Xe{static{y(this,"ModelsPanel")}tui;runtime;registry;matches;label;mode="list";ladders;modelRoutes;legacyModelRoutes;kinds;providerKeys=oe;targets;precedenceRoots;targetIndex=0;rawTarget;rows=[];selected=0;column=0;notice="";modelSelector;thinkingSelector;pending;choice;choiceIndex=0;routeForm;routeInput=new ve;pendingRouteCell;onChange;constructor(e,t,i,r,s){this.tui=e,this.runtime=t,this.registry=i,this.matches=r,this.label=s;const n=Ee();this.targets=n.targets,this.precedenceRoots=n.precedenceRoots,this.rawTarget=P(this.currentTarget().root);const c=re();this.ladders=c.modelLadders,this.modelRoutes=c.modelRoutes??{},this.legacyModelRoutes=c.legacyModelRoutes??{},this.kinds=c.kinds,this.providerKeys=this.offeredProviders(),this.rows=this.buildRows(),this.routeInput.onSubmit=l=>{const u=this.routeForm;!u||u.editing===null||(u.text[u.editing]=l.trim(),u.editing=null,this.routeInput.focused=!1,this.notify())},this.routeInput.onEscape=()=>{this.routeForm&&(this.routeForm.editing=null,this.routeInput.focused=!1,this.notify())}}offeredProviders(){try{return Te(e=>we(e)&&xe(e).length>0||this.registry.getProviderAuthStatus(e).configured,this.ladders)}catch{return oe}}currentTarget(){return this.targets[this.targetIndex]}cycleTarget(){this.targetIndex=(this.targetIndex+1)%this.targets.length,this.rawTarget=P(this.currentTarget().root),this.notice="",this.notify()}shadowingPath(e){for(const t of this.precedenceRoots){if(t===this.currentTarget().root)break;const i=P(t);if(i&&e(i))return S(t,"config.json")}}savedButShadowed(e){return`Saved to ${this.currentTarget().label}; overridden by ${e??"a more specific config"}`}routeIds(){return[...new Set([...Object.keys(this.modelRoutes),...Object.keys(this.legacyModelRoutes)])]}routeFamilies(){return[...new Set(this.routeIds().map(e=>(this.modelRoutes[e]??this.legacyModelRoutes[e]).family))]}buildRows(){const e=[{section:"ladder",kind:"defaultProvider"}];for(const t of k)e.push({section:"ladder",kind:"strength",strength:t});for(const t of this.routeIds())e.push({section:"route",routeId:t});e.push({section:"route",routeId:null});for(const t of Object.keys(this.kinds))t.includes("/")||e.push({section:"kind",name:t});return e}reload(){const e=re();this.ladders=e.modelLadders,this.modelRoutes=e.modelRoutes??{},this.legacyModelRoutes=e.legacyModelRoutes??{},this.kinds=e.kinds,this.rawTarget=P(this.currentTarget().root),this.providerKeys=this.offeredProviders(),this.rows=this.buildRows(),this.selected=Math.min(this.selected,this.rows.length-1),this.clampColumn()}refresh(){this.reload(),this.notify()}notify(){this.onChange?.(),this.tui.requestRender()}isPickerOpen(){return this.mode!=="list"}currentRow(){return this.rows[Math.min(this.selected,this.rows.length-1)]}columnsFor(e){return e.section==="ladder"?e.kind==="strength"?this.providerKeys.length:1:e.section==="route"?1:de.length}clampColumn(){this.column=Math.min(this.column,this.columnsFor(this.currentRow())-1)}handleInput(e){if(this.mode==="route-form"){const t=this.routeForm;return t?t.editing!==null?(this.routeInput.handleInput(e),!0):this.matches("crtr.setup.models.cancel",e)?(this.closeRouteForm(),!0):this.matches("crtr.setup.list-down",e)?(t.index=Math.min(t.fields.length-1,t.index+1),this.notice="",!0):this.matches("crtr.setup.list-up",e)?(t.index=Math.max(0,t.index-1),this.notice="",!0):((this.matches("crtr.setup.models.open",e)||this.matches("crtr.setup.models.commit",e))&&this.activateRouteField(),!0):(this.mode="list",!0)}if(this.mode==="route-delete")return this.matches("crtr.setup.confirm.accept",e)?(this.deleteRoute(),!0):(this.matches("crtr.setup.confirm.back",e)&&(this.mode="route-form",this.notify()),!0);if(this.mode==="dimension-picker")return this.matches("crtr.setup.models.commit",e)?(this.commitChoice(),!0):this.matches("crtr.setup.models.cancel",e)?(this.closePicker(),!0):this.matches("crtr.setup.list-down",e)?(this.choiceIndex=Math.min((this.choice?.options.length??1)-1,this.choiceIndex+1),!0):(this.matches("crtr.setup.list-up",e)&&(this.choiceIndex=Math.max(0,this.choiceIndex-1)),!0);if(this.mode==="model-picker"){const t=this.matches("crtr.setup.models.commit",e)?"\r":this.matches("crtr.setup.models.cancel",e)?"\x1B":e;return this.modelSelector?.handleInput(t),!0}if(this.mode==="thinking-picker"){const t=this.matches("crtr.setup.models.commit",e)?"\r":this.matches("crtr.setup.models.cancel",e)?"\x1B":e;return this.thinkingSelector?.getSelectList().handleInput(t),!0}return this.matches("crtr.setup.list-down",e)?(this.selected=Math.min(this.rows.length-1,this.selected+1),this.clampColumn(),this.notice="",!0):this.matches("crtr.setup.list-up",e)?(this.selected=Math.max(0,this.selected-1),this.clampColumn(),this.notice="",!0):this.matches("crtr.setup.cell-previous",e)?(this.column=Math.max(0,this.column-1),!0):this.matches("crtr.setup.cell-next",e)?(this.column=Math.min(this.columnsFor(this.currentRow())-1,this.column+1),!0):this.matches("crtr.setup.models.scope-next",e)?(this.cycleTarget(),!0):this.matches("crtr.setup.models.open",e)?(this.activateCell(),!0):!1}activateCell(){const e=this.currentRow();if(this.notice="",e.section==="ladder"&&e.kind==="defaultProvider"){const t=q(void 0,this.ladders).provider,i=this.providerKeys,r=i[(Math.max(0,i.indexOf(t))+1)%i.length];if(r===t)return;try{te(this.currentTarget().root,{defaultProvider:r})}catch(s){this.notice=`Could not save: ${s instanceof Error?s.message:String(s)}`,this.notify();return}if(this.reload(),(this.ladders.defaultProvider??"anthropic")!==r){const s=this.shadowingPath(n=>n.modelLadders?.defaultProvider!==void 0);this.notice=this.savedButShadowed(s)}this.notify();return}if(e.section==="ladder"&&e.kind==="strength"){this.openModelPicker(this.providerKeys[this.column],e.strength);return}if(e.section==="route"){this.openRouteForm(e.routeId);return}if(e.section==="kind"){const t=de[this.column];if(!t)return;this.openDimensionPicker(e.name,t.mode,t.dimension)}}portableSelection(e){if(e!==void 0){const i=e.lastIndexOf("/"),r=i===-1?"":e.slice(0,i),s=i===-1?"":e.slice(i+1);if(this.routeFamilies().includes(r)&&k.includes(s))return{family:r,strength:s}}const t=q(e,this.ladders);return{family:t.provider,strength:t.strength}}familyLabel(e){return e==="anthropic"||e==="openai"?ce[e]:e}familyOptions(){return[...new Set([...this.providerKeys,...this.routeFamilies()])]}kindSelection(e,t){const i=this.kinds[e],r=t==="orchestrator"?i?.orchestratorModel??i?.model:i?.model;return this.portableSelection(r)}openDimensionPicker(e,t,i){const r=this.kindSelection(e,t),s=i==="family"?this.familyOptions():k,n=i==="family"?r.family:r.strength,c=t==="orchestrator"?"orchestrator":"base",l=i==="family"?`strength ${r.strength}`:`family ${this.familyLabel(r.family)}`;this.choice={title:`Choose ${c} ${i}`,subtitle:`${e} \xB7 keeps ${c} ${l}`,options:s,label:y(u=>i==="family"?this.familyLabel(u):u,"label"),commit:y(u=>{const m=i==="family"?u:r.family,a=i==="strength"?u:r.strength;this.writeKindSelection(e,t,m,a)},"commit")},this.choiceIndex=Math.max(0,s.indexOf(n)),this.mode="dimension-picker",this.notify()}writeKindSelection(e,t,i,r){const s=`${i}/${r}`;try{Ie({root:this.currentTarget().root,kind:e,model:s,orchestrator:t==="orchestrator"})}catch(l){this.notice=`Could not save: ${l instanceof Error?l.message:String(l)}`;return}this.reload();const n=this.kinds[e];if((t==="orchestrator"?n?.orchestratorModel:n?.model)!==s){const l=t==="orchestrator"?"orchestratorModel":"model",u=this.shadowingPath(m=>m.kinds?.[e]?.[l]!==void 0);this.notice=this.savedButShadowed(u)}}commitChoice(){const e=this.choice,t=e?.options[this.choiceIndex];e&&t!==void 0&&e.commit(t),this.closePicker()}openRouteForm(e){const t=e===null?void 0:this.modelRoutes[e]??this.legacyModelRoutes[e],i=[...e===null?[{kind:"text",key:"routeId",label:"Route id"}]:[],{kind:"text",key:"family",label:"Family"},{kind:"text",key:"credentialSource",label:"Credential source"},{kind:"provider",label:"Provider id"},...k.map(r=>({kind:"cell",strength:r})),{kind:"save"},...e===null?[]:[{kind:"delete"}]];this.routeForm={existing:e,text:{routeId:e??"",family:t?.family??"",credentialSource:t?.credentialSource??""},providerId:t?.providerId??"",models:{...t?.models},fields:i,index:0,editing:null},this.mode="route-form",this.notice="",this.notify()}closeRouteForm(){this.routeInput.focused=!1,this.routeForm=void 0,this.mode="list",this.notice="",this.notify()}activateRouteField(){const e=this.routeForm,t=e?.fields[e.index];if(!(!e||!t)){if(t.kind==="text"){e.editing=t.key,this.routeInput.setValue(e.text[t.key]),this.routeInput.handleInput(""),this.routeInput.focused=!0,this.notify();return}if(t.kind==="provider"){const i=[...new Set([...this.registry.getAll().map(r=>r.provider),...e.providerId?[e.providerId]:[]])].sort();this.choice={title:"Choose provider id",subtitle:"Route cells must all belong to this registry provider",options:i,label:y(r=>r,"label"),commit:y(r=>this.setRouteProvider(r),"commit")},this.choiceIndex=Math.max(0,i.indexOf(e.providerId)),this.mode="dimension-picker",this.notify();return}if(t.kind==="cell"){this.openRouteCell(t.strength);return}if(t.kind==="save"){this.saveRoute();return}this.mode="route-delete",this.notify()}}setRouteProvider(e){const t=this.routeForm;if(!t)return;t.providerId=e;const i=[];for(const r of k){const s=t.models[r];s!==void 0&&!s.startsWith(`${e}/`)&&(delete t.models[r],i.push(r))}this.notice=i.length===0?"":`Cleared ${i.join(", ")} because those models belong to another provider.`}openRouteCell(e){const t=this.routeForm;if(!t)return;if(!t.providerId){this.notice="Choose the provider id first",this.notify();return}const i=this.registry.getAll().filter(n=>n.provider===t.providerId);if(i.length===0){this.notice=`No models registered for provider "${t.providerId}" \u2014 this route cannot be edited here.`,this.notify();return}const r=j(t.models[e]),s=r.provider&&r.id?this.registry.find(r.provider,r.id):void 0;this.pendingRouteCell={strength:e},this.showModelSelector(i,s,n=>this.onRouteModelPicked(n))}onRouteModelPicked(e){const t=this.pendingRouteCell,i=this.routeForm;if(!t||!i){this.closePicker();return}if(e.provider!==i.providerId){this.notice=`That is a ${e.provider} model \u2014 pick a ${i.providerId} model for this route.`,this.closePicker();return}if(t.model=e,e.reasoning){const r=j(i.models[t.strength]).level??"medium";this.thinkingSelector=new ee(r,[...se],s=>this.onThinkingPicked(s),()=>this.closePicker()),this.modelSelector=void 0,this.mode="thinking-picker",this.notify();return}i.models[t.strength]=`${e.provider}/${e.id}`,this.closePicker()}saveRoute(){const e=this.routeForm;if(!e)return;const t=e.text.routeId.trim();if(!t){this.notice="Route id is required.",this.notify();return}if(!e.text.family.trim()){this.notice="Family is required.",this.notify();return}if(!e.text.credentialSource.trim()){this.notice="Credential source is required.",this.notify();return}if(!e.providerId.trim()){this.notice="Provider id is required.",this.notify();return}const i=k.filter(n=>e.models[n]===void 0);if(i.length>0){this.notice=`Choose models for ${i.join(", ")} before saving.`,this.notify();return}const r={family:e.text.family.trim(),credentialSource:e.text.credentialSource.trim(),providerId:e.providerId.trim(),models:{ultra:e.models.ultra,strong:e.models.strong,medium:e.models.medium,light:e.models.light}};try{ie(this.currentTarget().root,t,r)}catch(n){this.notice=`Could not save: ${n instanceof Error?n.message:String(n)}`,this.notify();return}this.routeForm=void 0,this.mode="list",this.reload();const s=this.rows.findIndex(n=>n.section==="route"&&n.routeId===t);if(s>=0&&(this.selected=s),JSON.stringify(this.modelRoutes[t])!==JSON.stringify(r)){const n=this.shadowingPath(c=>c.modelRoutes?.[t]!==void 0);this.notice=this.savedButShadowed(n)}else this.notice=`Saved route "${t}" to ${this.currentTarget().label}.`;this.notify()}declaringPath(e){for(const t of this.precedenceRoots){if(t===this.currentTarget().root)continue;if(P(t)?.modelRoutes?.[e]!==void 0)return S(t,"config.json")}}deleteRoute(){const e=this.routeForm?.existing;if(!e){this.mode="route-form",this.notify();return}try{ie(this.currentTarget().root,e,void 0)}catch(i){this.mode="route-form",this.notice=`Could not delete: ${i instanceof Error?i.message:String(i)}`,this.notify();return}const t=this.declaringPath(e);this.routeForm=void 0,this.mode="list",this.reload(),this.notice=t?`Removed route "${e}" from ${this.currentTarget().label}; it is still declared by ${t}.`:`Removed route "${e}" from ${this.currentTarget().label}.`,this.notify()}showModelSelector(e,t,i){this.modelSelector=new $e(this.tui,t,this.runtime,e.map(r=>({model:r})),i,()=>this.closePicker()),this.modelSelector.focused=!0,this.mode="model-picker",this.notify()}openModelPicker(e,t){const i=Le[e],r=this.registry,s=j(this.ladders[e][t]),n=s.provider&&s.id?r.find(s.provider,s.id):void 0,c=r.getAvailable().filter(l=>l.provider===i);if(c.length===0){this.notice=`No ${e} models available \u2014 sign in first.`,this.notify();return}this.pending={providerKey:e,strength:t,expectedRuntime:i},this.showModelSelector(c,n,l=>this.onModelPicked(l))}onModelPicked(e){if(!this.pending){this.closePicker();return}if(e.provider!==this.pending.expectedRuntime){this.notice=`That is a ${e.provider} model \u2014 pick an ${this.pending.providerKey} model for this column.`,this.closePicker();return}if(this.pending.model=e,e.reasoning){const t=j(this.ladders[this.pending.providerKey][this.pending.strength]).level??"medium";this.thinkingSelector=new ee(t,[...se],i=>this.onThinkingPicked(i),()=>this.closePicker()),this.modelSelector=void 0,this.mode="thinking-picker",this.notify();return}this.writeLadder(e,void 0),this.closePicker()}onThinkingPicked(e){if(this.pendingRouteCell?.model&&this.routeForm){const{model:t,strength:i}=this.pendingRouteCell;this.routeForm.models[i]=`${t.provider}/${t.id}${e!=="off"?`:${e}`:""}`}else this.pending?.model&&this.writeLadder(this.pending.model,e);this.closePicker()}writeLadder(e,t){if(!this.pending)return;const i=`${e.provider}/${e.id}${t&&t!=="off"?`:${t}`:""}`,{providerKey:r,strength:s}=this.pending;try{te(this.currentTarget().root,{[r]:{[s]:i}})}catch(n){this.notice=`Could not save: ${n instanceof Error?n.message:String(n)}`;return}if(this.reload(),this.ladders[r][s]!==i){const n=this.shadowingPath(c=>c.modelLadders?.[r]?.[s]!==void 0);this.notice=this.savedButShadowed(n)}}closePicker(){this.mode=this.routeForm!==void 0?"route-form":"list",this.modelSelector=void 0,this.thinkingSelector=void 0,this.pending=void 0,this.pendingRouteCell=void 0,this.choice=void 0,this.notify()}dispose(){this.routeForm=void 0,this.closePicker()}targetLadderOverride(e,t){return this.rawTarget?.modelLadders?.[e]?.[t]!==void 0}targetKindOverride(e,t){const i=this.rawTarget?.kinds,r=t?"orchestratorModel":"model";return i?.[e]?.[r]!==void 0}footerHint(){return this.mode==="dimension-picker"?`${this.label("crtr.setup.list-down")}/${this.label("crtr.setup.list-up")} choice \xB7 ${this.label("crtr.setup.models.commit")} save \xB7 ${this.label("crtr.setup.models.cancel")} cancel`:this.mode==="model-picker"?`type to search \xB7 ${this.label("crtr.setup.models.commit")} select \xB7 tab all/scoped \xB7 ${this.label("crtr.setup.models.cancel")} cancel`:this.mode==="thinking-picker"?`\u2191/\u2193 level \xB7 ${this.label("crtr.setup.models.commit")} set \xB7 ${this.label("crtr.setup.models.cancel")} cancel`:this.mode==="route-delete"?`${this.label("crtr.setup.confirm.accept")} delete \xB7 ${this.label("crtr.setup.confirm.back")} cancel`:this.mode==="route-form"?typeof this.routeForm?.editing=="string"?"type a value \xB7 enter save \xB7 esc cancel":`${this.label("crtr.setup.list-down")}/${this.label("crtr.setup.list-up")} field \xB7 ${this.label("crtr.setup.models.open")} edit \xB7 ${this.label("crtr.setup.models.cancel")} back`:""}renderChoicePicker(){const e=this.choice;if(!e)return[o.fg("warning","No setting selected.")];const t=[o.fg("accent",o.bold(e.title)),o.fg("dim",e.subtitle),""];for(const[i,r]of e.options.entries()){const s=i===this.choiceIndex,n=s?o.fg("accent","\u25B6"):" ",c=e.label(r);t.push(`${n} ${s?o.fg("accent",`[${c}]`):o.fg("dim",` ${c} `)}`)}return t}renderRouteForm(e){const t=this.routeForm;if(!t)return[o.fg("warning","No route selected.")];const i=this.currentTarget(),r=[o.fg("accent",o.bold(t.existing===null?"New provider route":`Provider route: ${t.existing}`)),o.fg("dim",`${i.label} \xB7 ${S(i.root,"config.json")}`),""],s=20;for(const[n,c]of t.fields.entries()){const l=n===t.index,u=l?o.fg("accent","\u25B6"):" ";let m,a;if(c.kind==="text"){if(m=c.label,a=t.text[c.key]||"\u2014",l&&t.editing===c.key){const K=Math.max(8,e-s-4);a=this.routeInput.render(K)[0]??""}}else c.kind==="provider"?(m=c.label,a=t.providerId||"\u2014"):c.kind==="cell"?(m=c.strength,a=G(t.models[c.strength])):c.kind==="save"?(m="",a="Save route"):(m="",a="Delete route");const C=a==="\u2014",T=l?o.fg("accent",`[${a}]`):o.fg(C?"warning":"dim",` ${a} `);r.push(`${u} ${f(m,s)}${T}`)}return this.notice&&r.push("",o.fg("warning",this.notice)),r}renderRouteDelete(e){const t=this.routeForm?.existing??"this route",i=this.currentTarget(),r=Oe(`This removes the entry from ${i.label}. Any "${t}" declared by a lower-precedence config becomes effective again; this does not guarantee the route is gone.`,e).map(s=>o.fg("warning",s));return[o.fg("accent",o.bold(`Delete provider route: ${t}`)),o.fg("dim",S(i.root,"config.json")),"",...r,"",o.fg("dim",`${this.label("crtr.setup.confirm.accept")} delete ${this.label("crtr.setup.confirm.back")} cancel`)]}fitBody(e,t,i){if(e.length<=i)return e;const r=Math.min(ne,e.length-i),s=e.slice(r);if(s.length<=i)return s;const n=Math.max(0,t-r),c=Math.max(0,Math.min(n-i+2,s.length-i));return s.slice(c,c+i)}render(e,t){const i=Math.max(1,t),r=y(d=>Fe(d,e),"frame");if(this.mode==="dimension-picker")return r(this.fitBody(this.renderChoicePicker(),ne+this.choiceIndex,i));if(this.mode==="model-picker")return r(U(this.modelSelector?.render(e)??[],i));if(this.mode==="thinking-picker")return r(U(this.thinkingSelector?.render(e)??[],i));if(this.mode==="route-form"){const d=3+(this.routeForm?.index??0);return r(this.fitBody(this.renderRouteForm(e),d,i))}if(this.mode==="route-delete")return r(U(this.renderRouteDelete(e),i));let s=0;const n=[o.fg("accent",o.bold("Models")),o.fg("dim","global user defaults \xB7 project/profile scopes can shadow these"),""],c=this.currentRow(),l=c.section==="ladder"&&c.kind==="strength",u=Math.max(1,e),m=Math.max(12,Math.min(20,Math.floor(u*.24))),a=this.providerKeys.length,C=Math.max(1,u-2-m),T=12,K=Math.max(1,Math.floor((C+1)/(T+1))),b=Math.min(a,K),N=Math.max(T,Math.floor((C-(b-1))/b)),J=l?Math.min(this.column,a-1):0,F=Math.max(0,Math.min(J>=b?J-b+1:0,a-b)),_=F+b,X=this.providerKeys.map((d,h)=>({provider:d,column:h})).slice(F,_),Y=F>0,z=_<a,he=Y||z?` ${o.fg("dim",`${Y?"\u2039 ":""}${F+1}\u2013${_} of ${a}${z?" \u203A":""}`)}`:"",O=this.currentTarget();n.push(`${o.fg("accent","Editing config")} ${o.fg("accent",`[${O.label}]`)}${o.fg("dim",` ${this.targetIndex+1}/${this.targets.length}`)}`),n.push(o.fg("muted",S(O.root,"config.json")),""),n.push(o.fg("accent","Strength ladders")+he);const le=q(void 0,this.ladders).provider,W=this.rows.find(d=>d.section==="ladder"&&d.kind==="defaultProvider")===c;W&&(s=n.length),n.push(`${W?o.fg("accent","\u25B6"):" "} ${f(W?o.fg("accent","Default provider"):"Default provider",20)} ${o.fg("success",le)}`);const ue=y((d,h)=>{const g=f(o.bold(ce[d]),N);return l&&this.column===h?o.fg("accent",g):o.fg("dim",g)},"providerHeading"),ae=y((d,h)=>{const g=f(V(d,Math.max(1,N-2)),Math.max(1,N-2));return h?o.fg("accent",`[${g}]`):o.fg("dim",` ${g} `)},"ladderCell");n.push(`${" ".repeat(2)}${f(o.fg("dim","Strength"),m)}${X.map(({provider:d,column:h})=>ue(d,h)).join(" ")}`);for(const d of this.rows){if(d.section!=="ladder"||d.kind!=="strength")continue;const h=d===c,g=h?o.fg("accent","\u25B6"):" ";h&&(s=n.length);const $=X.map(({provider:v,column:R})=>{const w=this.targetLadderOverride(v,d.strength)?o.fg("warning","\u2022"):" ";return ae(`${w}${G(this.ladders[v][d.strength])}`,h&&R===this.column)});n.push(`${g} ${f(d.strength,m)}${$.join(" ")}`)}n.push("",o.fg("accent","Provider routes")),n.push(o.fg("dim",`${o.fg("warning","\u2022")} override in ${O.label} \xB7 a declared route replaces the ladders above at launch \xB7 id, then family \xB7 source \xB7 provider`));const A=Math.max(10,Math.floor((u-8)/4));n.push(`${" ".repeat(4)}${k.map(d=>f(o.fg("dim",d),A)).join(" ")}`),this.routeIds().length===0&&n.push(o.fg("dim"," No routes declared \u2014 the ladders above are used."));for(const d of this.rows){if(d.section!=="route"||d.routeId===null)continue;const h=d.routeId,g=this.modelRoutes[h],$=g??this.legacyModelRoutes[h],v=d===c;v&&(s=n.length);const R=v?o.fg("accent","\u25B6"):" ",w=this.rawTarget?.modelRoutes?.[h]!==void 0?o.fg("warning","\u2022"):" ",E=g?"":o.fg("warning"," \xB7 incomplete"),D=o.fg("dim",`${$.family} \xB7 ${$.credentialSource} \xB7 ${$.providerId}`);n.push(`${R} ${w}${o.fg(v?"accent":"dim",h)} ${D}${E}`);const x=k.map(fe=>{const Z=$.models[fe],me=f(V(G(Z),A),A);return o.fg(Z===void 0?"warning":"dim",me)});n.push(`${" ".repeat(4)}${x.join(" ")}`)}const B=this.rows.find(d=>d.section==="route"&&d.routeId===null)===c;B&&(s=n.length),n.push(`${B?o.fg("accent","\u25B6"):" "} ${o.fg(B?"accent":"dim","+ New route")}`),n.push("",o.fg("accent","Kind defaults")),n.push(o.fg("dim",`${o.fg("warning","\u2022")} override in ${O.label} \xB7 orchestrator inherits base until you set it`));const H=16,I=12,M=9,Q=I+1+M,L=y((d,h,g,$)=>{const v=f(V(d,Math.max(1,h-2)),Math.max(1,h-2));return g?o.fg("accent",`[${v}]`):$?o.fg("muted",` ${v} `):o.fg("dim",` ${v} `)},"cell");n.push(`${" ".repeat(2+H)}${f(o.bold(o.fg("dim","Base")),Q)} ${f(o.bold(o.fg("dim","Orchestrator")),Q)}`),n.push(`${" ".repeat(2)}${f(o.fg("dim","Kind"),H)}${f(o.fg("dim","Family"),I)} ${f(o.fg("dim","Strength"),M)} ${f(o.fg("dim","Family"),I)} ${f(o.fg("dim","Strength"),M)}`);for(const d of this.rows){if(d.section!=="kind")continue;const h=d===c,g=h?o.fg("accent","\u25B6"):" ";h&&(s=n.length);const $=this.kinds[d.name],v=this.portableSelection($?.model),R=$?.orchestratorModel===void 0,w=this.portableSelection($?.orchestratorModel??$?.model),E=this.targetKindOverride(d.name,!1)?o.fg("warning","\u2022"):" ",D=this.targetKindOverride(d.name,!0)?o.fg("warning","\u2022"):" ",x=[L(`${E}${this.familyLabel(v.family)}`,I,h&&this.column===0,!1),L(`${E}${v.strength}`,M,h&&this.column===1,!1),L(`${D}${this.familyLabel(w.family)}`,I,h&&this.column===2,R),L(`${D}${w.strength}`,M,h&&this.column===3,R)];n.push(`${g} ${f(d.name,H)}${x[0]} ${x[1]} ${x[2]} ${x[3]}`)}return this.notice&&n.push("",o.fg("warning",this.notice)),r(this.fitBody(n,s,i))}}export{Xe as ModelsPanel};