@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,741 +1,35 @@
1
- // Startup profile selection — the CTO-decided order applied at the front door
2
- // and at any non-inherited `crtr node new`: explicit `--profile` > a per-cwd
3
- // PINNED default (set from the menu with `d`, wins over MRU while it still
4
- // covers cwd) > a profile whose project dir IS cwd exactly (auto) > an
5
- // interactive menu of profiles covering cwd from a parent/workspace dir +
6
- // create (MRU auto when headless) > synchronous create / select-existing /
7
- // root decision when nothing covers. This is the ONLY place that decision
8
- // runs; front-door.ts/
9
- // spawn.ts call it, never re-derive it.
10
- import { spawnSync } from 'node:child_process';
11
- import { existsSync, realpathSync } from 'node:fs';
12
- import { basename, resolve as resolvePath, sep } from 'node:path';
13
- import { createInterface } from 'node:readline/promises';
14
- import { emitKeypressEvents } from 'node:readline';
15
- import { initializeFreshScopedStore } from '../scoped-state/migrate.js';
16
- import { userScopeRoot } from '../scope.js';
17
- import { listProfiles, loadProfileManifest, resolveProfileOperand, updateProfileLastUsed, createProfile, addProfileProject, ensureRootProfile, ROOT_PROFILE_ID, } from './manifest.js';
18
- import { getDefaultProfileId, setDefaultProfileId, clearDefaultProfile, } from './default-binding.js';
19
- import { tildify } from '../fs-utils.js';
20
- import { stdoutColor } from '../output.js';
21
- import { inTmux } from '../runtime/placement-tmux.js';
22
- import { surfaceTmuxStyleArgs } from '../runtime/surface-bg.js';
23
- import { formatBinding, matchesTerminalInput, resolveUserKeybindings, } from '../keybindings/index.js';
24
- const PROFILE_MENU_ACTIONS = [
25
- 'crtr.profile.menu.abort', 'crtr.profile.menu.up', 'crtr.profile.menu.down',
26
- 'crtr.profile.menu.select', 'crtr.profile.menu.accept-default',
27
- 'crtr.profile.menu.slot.1', 'crtr.profile.menu.slot.2', 'crtr.profile.menu.slot.3',
28
- 'crtr.profile.menu.slot.4', 'crtr.profile.menu.slot.5', 'crtr.profile.menu.slot.6',
29
- 'crtr.profile.menu.slot.7', 'crtr.profile.menu.slot.8', 'crtr.profile.menu.slot.9',
30
- 'crtr.profile.menu.create', 'crtr.profile.menu.search-existing', 'crtr.profile.menu.use-root',
31
- 'crtr.profile.menu.set-default', 'crtr.profile.menu.add-directory', 'crtr.profile.menu.unpin',
32
- 'crtr.profile.menu.manage',
33
- ];
34
- const PROFILE_SEARCH_ACTIONS = [
35
- 'crtr.profile.search.abort', 'crtr.profile.search.back', 'crtr.profile.search.pick',
36
- 'crtr.profile.search.up', 'crtr.profile.search.down', 'crtr.profile.search.delete',
37
- ];
38
- function profileRawInput(str, k) {
39
- return {
40
- input: k.ctrl === true || k.meta === true ? (k.name ?? str) : str,
41
- upArrow: k.name === 'up', downArrow: k.name === 'down',
42
- return: k.name === 'return' || k.name === 'enter', escape: k.name === 'escape',
43
- backspace: k.name === 'backspace', ctrl: k.ctrl, meta: k.meta, shift: k.shift,
44
- };
45
- }
46
- function firstProfileMatch(bindings, ids, raw) {
47
- return ids.find((id) => matchesTerminalInput(bindings, id, raw)) ?? null;
48
- }
49
- export function resolveProfileMenuAction(bindings, raw) {
50
- return firstProfileMatch(bindings, PROFILE_MENU_ACTIONS, raw);
51
- }
52
- export function resolveProfileSearchAction(bindings, raw) {
53
- return firstProfileMatch(bindings, PROFILE_SEARCH_ACTIONS, raw);
54
- }
55
- /** Resolve cwd to an absolute, realpath'd form so it compares against the
56
- * realpath'd project dirs `createProfile`/`addProfileProject` already store
57
- * (manifest.ts resolves every project dir through `realpathSync`). Falls back
58
- * to the plain resolved path when the dir can't be stat'd (mirrors
59
- * `resolveExistingProjectDir`'s own fallback). */
60
- function resolveCwd(cwd) {
61
- const abs = resolvePath(cwd);
62
- if (!existsSync(abs))
63
- return abs;
64
- try {
65
- return realpathSync(abs);
66
- }
67
- catch {
68
- return abs;
69
- }
70
- }
71
- /** A project dir "covers" cwd when cwd sits at or below it, OR — the
72
- * workspace-root case — the project dir itself sits below cwd (a profile can
73
- * point at one project nested under a wider workspace cwd). */
74
- function projectCovers(cwd, project) {
75
- if (cwd === project)
76
- return true;
77
- if (cwd.startsWith(project + sep))
78
- return true;
79
- if (project.startsWith(cwd + sep))
80
- return true;
81
- return false;
82
- }
83
- /** Whether a profile's purview covers `cwd` (cwd at/under one of its project
84
- * dirs, or a project dir under cwd — the workspace-root case). Exported for
85
- * `crtr profile default set`, which rejects pinning a profile that doesn't
86
- * cover cwd (the selector would ignore/self-heal such a pin anyway). */
87
- export function profileCoversCwd(entry, cwd) {
88
- return entry.manifest.projects.some((p) => projectCovers(cwd, p.path));
89
- }
90
- /** `a` more recent than `b`, treating null as the oldest possible value (never
91
- * wins over a real timestamp). ISO 8601 strings compare correctly lexically. */
92
- function isMoreRecent(a, b) {
93
- if (a === null)
94
- return false;
95
- if (b === null)
96
- return true;
97
- return a > b;
98
- }
99
- function pickMostRecent(entries) {
100
- return entries.reduce((best, cur) => isMoreRecent(cur.manifest.last_used_at, best.manifest.last_used_at) ? cur : best);
101
- }
102
- function profileSelectionState(cwd) {
103
- const resolvedCwd = resolveCwd(cwd);
104
- const covering = listProfiles().filter((profile) => profileCoversCwd(profile, resolvedCwd));
105
- const exact = covering.filter((profile) => profile.manifest.projects.some((project) => project.path === resolvedCwd));
106
- const pinnedId = getDefaultProfileId(resolvedCwd);
107
- const pinned = pinnedId === null ? null : covering.find((profile) => profile.profileId === pinnedId) ?? null;
108
- return { covering, exact, pinnedId, pinned };
109
- }
110
- /** Resolve the headless selector against existing state without changing it. */
111
- export function selectProfileForCwdReadOnly(cwd) {
112
- const { covering, exact, pinned } = profileSelectionState(cwd);
113
- if (pinned !== null)
114
- return pinned.profileId;
115
- if (exact.length === 1)
116
- return exact[0].profileId;
117
- const pool = exact.length > 0 ? exact : covering;
118
- if (pool.length > 0)
119
- return pickMostRecent(pool).profileId;
120
- return ROOT_PROFILE_ID;
121
- }
122
- function isInteractive() {
123
- return Boolean(process.stdin.isTTY) && Boolean(process.stdout.isTTY);
124
- }
125
- // Pre-boot prompt presentation. These prompts print to the raw controlling
126
- // terminal BEFORE pi takes it over (not the attach viewer), so styling is
127
- // plain ANSI via the house `stdoutColor` helper (NO_COLOR / non-TTY aware) and
128
- // portable glyphs only — no Nerd Font (the pre-boot terminal may lack it).
129
- // One shared visual language across all four gates: a bold title + optional
130
- // dim subtitle, then accent-keyed option rows. We deliberately do NOT echo the
131
- // user's own cwd back at them (they know where they are) — the only paths
132
- // worth showing are OTHER dirs: which project root a covering profile owns.
133
- const dim = stdoutColor.dim;
134
- const bold = stdoutColor.bold;
135
- const accent = stdoutColor.cyan;
136
- /** Selectable key ([1], [c], [r]) — the one thing the eye hunts for. */
137
- function key(k) {
138
- return accent(bold(k));
139
- }
140
- /** Coarse "last used" for disambiguating profiles that otherwise look alike
141
- * (notably several profiles claiming the SAME dir). null → never used. */
142
- function relativeUsed(iso) {
143
- if (iso === null)
144
- return 'never used';
145
- const then = Date.parse(iso);
146
- if (Number.isNaN(then))
147
- return 'used recently';
148
- const secs = Math.max(0, Math.floor((Date.now() - then) / 1000));
149
- if (secs < 60)
150
- return 'used just now';
151
- const mins = Math.floor(secs / 60);
152
- if (mins < 60)
153
- return `used ${mins}m ago`;
154
- const hours = Math.floor(mins / 60);
155
- if (hours < 24)
156
- return `used ${hours}h ago`;
157
- const days = Math.floor(hours / 24);
158
- if (days < 30)
159
- return `used ${days}d ago`;
160
- const months = Math.floor(days / 30);
161
- if (months < 12)
162
- return `used ${months}mo ago`;
163
- return `used ${Math.floor(months / 12)}y ago`;
164
- }
165
- /** Blank-line-padded bold title with an optional dim subtitle beneath it. No
166
- * cwd echo — the user already knows their own directory. */
167
- function writeHeader(title, subtitle) {
168
- const sub = subtitle !== undefined ? ` ${dim(subtitle)}\n` : '';
169
- process.stdout.write(`\n ${bold(title)}\n${sub}\n`);
170
- }
171
- /** Compact one-line summary of a profile's whole purview: its first project
172
- * dir plus a `· N dirs total` tail when it owns more than one. Used where
173
- * there is no cwd-match to point at (the searchable select list). */
174
- function purviewSummary(entry) {
175
- const n = entry.manifest.projects.length;
176
- const first = entry.manifest.projects[0];
177
- if (first === undefined)
178
- return relativeUsed(entry.manifest.last_used_at);
179
- return n > 1 ? `${tildify(first.path)} \u00b7 ${n} dirs total` : tildify(first.path);
180
- }
181
- /** ▸ marks the highlighted row. */
182
- const HILITE = accent('\u25b8');
183
- const cursorUp = (n) => (n > 0 ? `\u001b[${n}A\r` : '');
184
- const CLEAR_DOWN = '\u001b[0J';
185
- const ANSI_RE = /\u001b\[[0-9;]*m/g;
186
- /** Terminal rows a just-written block occupies — i.e. how far the cursor
187
- * advanced, so a redraw can move exactly that far back up. Counts each '\n'
188
- * as one row AND adds the extra rows a long line wraps into at the current
189
- * terminal width (ANSI color codes stripped so they don't count toward width).
190
- * A logical-line count alone undershoots in a narrow pane, stacking redraws. */
191
- function blockRows(block) {
192
- const cols = process.stdout.columns ?? 80;
193
- const segs = block.split('\n');
194
- const newlines = segs.length - 1; // block ends with '\n' → last seg is ''
195
- let extra = 0;
196
- for (let i = 0; i < newlines; i++) {
197
- const w = segs[i].replace(ANSI_RE, '').length;
198
- if (cols > 0 && w > cols)
199
- extra += Math.ceil(w / cols) - 1;
200
- }
201
- return newlines + extra;
202
- }
203
- function renderMenu(bindings, title, subtitle, rows, sel, hint) {
204
- let out = `\n ${bold(title)}\n`;
205
- if (subtitle !== undefined)
206
- out += ` ${dim(subtitle)}\n`;
207
- out += '\n';
208
- let num = 0;
209
- for (const [i, r] of rows.entries()) {
210
- const slot = r.bindingId === undefined ? ++num : 0;
211
- const tag = r.bindingId !== undefined
212
- ? formatBinding(bindings, r.bindingId)
213
- : slot <= 9 ? formatBinding(bindings, `crtr.profile.menu.slot.${slot}`) : '';
214
- const mark = i === sel ? HILITE : ' ';
215
- const det = r.detail !== '' ? ' ' + dim(r.detail) : '';
216
- const def = r.isDefault ? ' ' + accent('\u00b7 ' + (r.defaultText ?? 'default')) : '';
217
- out += ` ${mark} ${key(tag)} ${r.label}${det}${def}\n`;
218
- }
219
- if (hint !== undefined)
220
- out += `\n ${dim(hint)}\n`;
221
- out += `\n ${dim(`${formatBinding(bindings, 'crtr.profile.menu.up')}/${formatBinding(bindings, 'crtr.profile.menu.down')} move ${formatBinding(bindings, 'crtr.profile.menu.select')} select ${formatBinding(bindings, 'crtr.profile.menu.accept-default')} default ${formatBinding(bindings, 'crtr.profile.menu.abort')} quit`)}\n`;
222
- return out;
223
- }
224
- /** Drive a highlighted keypress menu to a resolution. Returns the selected row
225
- * index, plus the semantic action when a row-scoped action was invoked. */
226
- function runMenu(bindings, title, subtitle, rows, opts = {}) {
227
- const numbered = [];
228
- rows.forEach((r, i) => {
229
- if (r.bindingId === undefined)
230
- numbered.push(i);
231
- });
232
- let sel = opts.initialIndex ?? 0;
233
- return new Promise((resolve) => {
234
- let prevLines = 0;
235
- const draw = () => {
236
- const block = renderMenu(bindings, title, subtitle, rows, sel, opts.hint);
237
- process.stdout.write((prevLines > 0 ? cursorUp(prevLines) + CLEAR_DOWN : '') + block);
238
- prevLines = blockRows(block);
239
- };
240
- const cleanup = () => {
241
- process.stdin.off('keypress', onKey);
242
- if (process.stdin.isTTY)
243
- process.stdin.setRawMode(false);
244
- process.stdin.pause();
245
- };
246
- const onKey = (str, k) => {
247
- const action = resolveProfileMenuAction(bindings, profileRawInput(str, k));
248
- if (action === 'crtr.profile.menu.abort') {
249
- cleanup();
250
- process.stdout.write('\n');
251
- process.exit(130);
252
- }
253
- if (action === 'crtr.profile.menu.up') {
254
- sel = (sel - 1 + rows.length) % rows.length;
255
- draw();
256
- return;
257
- }
258
- if (action === 'crtr.profile.menu.down') {
259
- sel = (sel + 1) % rows.length;
260
- draw();
261
- return;
262
- }
263
- if (action === 'crtr.profile.menu.select') {
264
- cleanup();
265
- resolve({ index: sel });
266
- return;
267
- }
268
- // Esc cancels navigation and accepts the default row (the MRU/pinned
269
- // profile, or the root row on the no-coverage menu) — a safe exit, never
270
- // a dead key. Ctrl-C still aborts crtr entirely.
271
- if (action === 'crtr.profile.menu.accept-default') {
272
- cleanup();
273
- resolve({ index: opts.initialIndex ?? 0 });
274
- return;
275
- }
276
- if (action?.startsWith('crtr.profile.menu.slot.')) {
277
- const d = Number.parseInt(action.slice(-1), 10);
278
- if (d >= 1 && d <= numbered.length) {
279
- sel = numbered[d - 1];
280
- draw();
281
- }
282
- return;
283
- }
284
- const hk = rows.findIndex((r) => r.bindingId !== undefined && r.bindingId === action);
285
- if (hk >= 0) {
286
- cleanup();
287
- resolve({ index: hk });
288
- return;
289
- }
290
- if (action !== null && opts.actionBindingIds?.includes(action) === true) {
291
- cleanup();
292
- resolve({ index: sel, action });
293
- }
294
- };
295
- emitKeypressEvents(process.stdin);
296
- if (process.stdin.isTTY)
297
- process.stdin.setRawMode(true);
298
- process.stdin.resume();
299
- process.stdin.on('keypress', onKey);
300
- draw();
301
- });
302
- }
303
- // The profile manager. `v` on either selection gate opens the Profiles page of
304
- // `crtr sys settings` in a tmux popup: this menu is a CHOOSER filtered to cwd,
305
- // while that page is the whole map — every profile, every directory each one
306
- // owns, every pin. The popup runs to completion with the raw-mode menu already
307
- // torn down (runMenu cleans up before resolving an action), and the caller then
308
- // re-runs the whole selector, so a directory just adopted or a default just
309
- // pinned decides the menu you come back to.
310
- /** Open the profiles page in a tmux popup and block until it closes. False when
311
- * there is no tmux to host it — possible only on the `crtr node new` path, as
312
- * the front door requires tmux before it ever selects — after printing the
313
- * pointer, so the caller can simply redraw its menu. */
314
- function openProfileManager(cwd) {
315
- if (!inTmux()) {
316
- process.stdout.write(` ${dim('the profile manager needs tmux \u2014 run `crtr sys settings` instead')}\n`);
317
- return false;
318
- }
319
- spawnSync('tmux', [
320
- 'display-popup', '-E', '-T', ' profiles ', '-w', '90%', '-h', '85%', '-d', cwd,
321
- ...surfaceTmuxStyleArgs(),
322
- 'crtr sys settings --page profiles',
323
- ], { stdio: 'inherit' });
324
- return true;
325
- }
326
- /** The gate answering "the user managed their profiles" — every prior reading of
327
- * this directory is stale, so `selectProfileForCwd` decides again from the top. */
328
- const MANAGED = Symbol('profile-manager-ran');
329
- /** The trailing readline prompt: ` › <dim hint> `. */
330
- function caret(hint) {
331
- return ` ${accent('\u203a')} ${dim(hint)} `;
332
- }
333
- function rootProfileMessage(cwd) {
334
- return (`crtr: no profile covers ${cwd}, and this session is non-interactive — using the root profile.\n` +
335
- `Run \`crtr profile new --name <name> --project ${cwd}\` to create a dedicated profile, or pass --profile <id-or-name> next time.\n`);
336
- }
337
- /** The one synchronous (pre-boot) decision point: no profile covers cwd, and
338
- * the session IS interactive. Ask on the controlling terminal — create a
339
- * profile pointing at cwd, or proceed as root — and block until answered.
340
- * Deliberately a minimal `readline` prompt, not `crtr human send`: that bridge
341
- * is asynchronous (registers an interaction in the ticket store, then waits for
342
- * the human to answer it from a separate inbox) and cannot gate pi's boot; those
343
- * entry points (`human send`/`review`) are built for a queued,
344
- * asynchronously-answered interaction, not a two-choice gate on the same TTY pi
345
- * is about to take over — a raw `readline` question is the actual minimal
346
- * fit here. */
347
- /** Explicit `--profile` names a profile whose manifest does NOT cover cwd.
348
- * Interactive only: offer to widen the profile's purview to include this
349
- * directory (default yes), so the next node started here is covered without a
350
- * separate `crtr profile project add`. Declining leaves the manifest untouched
351
- * and runs the node under the profile anyway. Same raw-readline rationale as
352
- * `promptCreateOrRoot` — this gates pi's boot on the same TTY. */
353
- async function promptAddDirToProfile(entry, cwd) {
354
- const rl = createInterface({ input: process.stdin, output: process.stdout });
355
- try {
356
- writeHeader(`Profile "${entry.manifest.name}" doesn't cover this directory`);
357
- await offerAddDirToProfile(rl, entry, cwd);
358
- }
359
- finally {
360
- rl.close();
361
- }
362
- }
363
- /** Ask (default yes) whether to widen `entry`'s purview to include `cwd`, on an
364
- * ALREADY-OPEN readline. Shared by the explicit-`--profile` path
365
- * (`promptAddDirToProfile`) and the select-existing path in
366
- * `promptCreateOrRoot`, so a profile chosen for a directory it doesn't cover
367
- * can adopt that directory without a separate `crtr profile project add`. */
368
- async function offerAddDirToProfile(rl, entry, cwd) {
369
- const choice = (await rl.question(caret(`add this directory to "${entry.manifest.name}"? [Y/n]`)))
370
- .trim()
371
- .toLowerCase();
372
- if (choice === 'n' || choice === 'no')
373
- return;
374
- addProfileProject(entry.profileId, cwd, { memory: 'content' });
375
- process.stdout.write(` ${accent('\u2713')} ${dim(`added this directory to "${entry.manifest.name}"`)}\n`);
376
- }
377
- /** Search-and-pick among EVERY existing profile (root excluded — it is the
378
- * separate `[r]` option). Reached from the no-coverage prompt so the user can
379
- * run under a profile they can't fully name when they've started crtr in a
380
- * directory none of their profiles cover. A live search box: type to filter
381
- * (matched against name AND project paths — you may recall the directory, not
382
- * the name), ↑/↓ (or Ctrl-N/P) move the highlight, Enter picks it, Esc backs
383
- * out (returns null → caller falls back to root). Because typing filters,
384
- * navigation here is arrows-only — j/k are literal filter characters (fzf
385
- * convention), unlike the non-search menus where j/k move. */
386
- async function promptSelectExistingProfile(bindings) {
387
- const all = [...listProfiles()]
388
- .filter((e) => e.profileId !== ROOT_PROFILE_ID)
389
- .sort((a, b) => (isMoreRecent(a.manifest.last_used_at, b.manifest.last_used_at) ? -1 : 1));
390
- if (all.length === 0) {
391
- process.stdout.write(` ${dim('no existing profiles to select')}\n`);
392
- return null;
393
- }
394
- let filter = '';
395
- let sel = 0;
396
- const matchesOf = () => filter === ''
397
- ? all
398
- : all.filter((e) => e.manifest.name.toLowerCase().includes(filter) ||
399
- e.manifest.projects.some((p) => tildify(p.path).toLowerCase().includes(filter)));
400
- return new Promise((resolve) => {
401
- let prevLines = 0;
402
- const draw = () => {
403
- const matches = matchesOf();
404
- if (sel >= matches.length)
405
- sel = Math.max(0, matches.length - 1);
406
- let block = `\n ${bold('Select an existing profile')}\n`;
407
- block += ` ${dim('across every profile, not just this directory')}\n\n`;
408
- if (matches.length === 0) {
409
- block += ` ${dim(`no match for "${filter}"`)}\n`;
410
- }
411
- else {
412
- const nameWidth = Math.max(...matches.map((e) => e.manifest.name.length));
413
- matches.forEach((e, i) => {
414
- const mark = i === sel ? HILITE : ' ';
415
- block += ` ${mark} ${bold(e.manifest.name.padEnd(nameWidth))} ${dim(purviewSummary(e))}\n`;
416
- });
417
- }
418
- block += `\n ${accent('\u203a')} ${filter}${dim('\u2588')}\n`;
419
- block += ` ${dim(`type to filter ${formatBinding(bindings, 'crtr.profile.search.up')}/${formatBinding(bindings, 'crtr.profile.search.down')} move ${formatBinding(bindings, 'crtr.profile.search.pick')} pick ${formatBinding(bindings, 'crtr.profile.search.back')} back`)}\n`;
420
- process.stdout.write((prevLines > 0 ? cursorUp(prevLines) + CLEAR_DOWN : '') + block);
421
- prevLines = blockRows(block);
422
- };
423
- const cleanup = () => {
424
- process.stdin.off('keypress', onKey);
425
- if (process.stdin.isTTY)
426
- process.stdin.setRawMode(false);
427
- process.stdin.pause();
428
- };
429
- const onKey = (str, k) => {
430
- const action = resolveProfileSearchAction(bindings, profileRawInput(str, k));
431
- if (action === 'crtr.profile.search.abort') {
432
- cleanup();
433
- process.stdout.write('\n');
434
- process.exit(130);
435
- }
436
- if (action === 'crtr.profile.search.back') {
437
- cleanup();
438
- resolve(null);
439
- return;
440
- }
441
- const matches = matchesOf();
442
- if (action === 'crtr.profile.search.pick') {
443
- if (matches.length > 0) {
444
- cleanup();
445
- resolve(matches[sel].profileId);
446
- }
447
- return;
448
- }
449
- if (action === 'crtr.profile.search.up') {
450
- if (matches.length > 0) {
451
- sel = (sel - 1 + matches.length) % matches.length;
452
- draw();
453
- }
454
- return;
455
- }
456
- if (action === 'crtr.profile.search.down') {
457
- if (matches.length > 0) {
458
- sel = (sel + 1) % matches.length;
459
- draw();
460
- }
461
- return;
462
- }
463
- if (action === 'crtr.profile.search.delete') {
464
- filter = filter.slice(0, -1);
465
- sel = 0;
466
- draw();
467
- return;
468
- }
469
- if (str !== undefined && str.length === 1 && str >= ' ' && k.ctrl !== true) {
470
- filter += str.toLowerCase();
471
- sel = 0;
472
- draw();
473
- }
474
- };
475
- emitKeypressEvents(process.stdin);
476
- if (process.stdin.isTTY)
477
- process.stdin.setRawMode(true);
478
- process.stdin.resume();
479
- process.stdin.on('keypress', onKey);
480
- draw();
481
- });
482
- }
483
- /** Ask for a name (defaulting to cwd's basename) and create a profile pointing
484
- * at cwd on the SAME open readline — shared by both interactive create paths
485
- * so the name prompt reads identically whether reached via the covering menu
486
- * or the no-coverage fallback. */
487
- async function createProfileHere(rl, cwd) {
488
- const defaultName = basename(cwd) || 'profile';
489
- const nameInput = (await rl.question(caret(`name the new profile [${defaultName}]`))).trim();
490
- const name = nameInput !== '' ? nameInput : defaultName;
491
- const profileId = createProfile(name, [{ path: cwd, memory: 'content' }]).profileId;
492
- process.stdout.write(` ${accent('\u2713')} ${dim(`created profile "${name}"`)}\n`);
493
- return profileId;
494
- }
495
- async function promptCreateOrRoot(cwd, bindings) {
496
- // Root is the highlighted default so a bare Enter (or Esc) still lands on the
497
- // safe no-op, exactly as the old `[c/s/r]` prompt defaulted. Looped so Esc
498
- // out of the search sub-list returns HERE rather than silently dropping to
499
- // root — the create/select/root choice is always the fallback, never skipped.
500
- const rows = [
501
- { label: 'create a profile here', detail: '', bindingId: 'crtr.profile.menu.create' },
502
- { label: 'select an existing profile', detail: '', bindingId: 'crtr.profile.menu.search-existing' },
503
- { label: dim('use the root profile'), detail: '', bindingId: 'crtr.profile.menu.use-root', isDefault: true },
504
- ];
505
- for (;;) {
506
- const res = await runMenu(bindings, 'No profile covers this directory', undefined, rows, {
507
- initialIndex: 2,
508
- actionBindingIds: ['crtr.profile.menu.manage'],
509
- hint: `${formatBinding(bindings, 'crtr.profile.menu.manage')}=manage profiles`,
510
- });
511
- // Managing may have given this directory an owner — re-decide from the top
512
- // rather than re-showing a menu the manager just made wrong. With no tmux to
513
- // host the manager nothing changed, so fall through to a redraw.
514
- if (res.action === 'crtr.profile.menu.manage') {
515
- if (openProfileManager(cwd))
516
- return MANAGED;
517
- continue;
518
- }
519
- if (res.index === 0) {
520
- const rl = createInterface({ input: process.stdin, output: process.stdout });
521
- try {
522
- return await createProfileHere(rl, cwd);
523
- }
524
- finally {
525
- rl.close();
526
- }
527
- }
528
- if (res.index === 1) {
529
- const selected = await promptSelectExistingProfile(bindings);
530
- // Esc/back out of the search list (or no profiles to pick) → re-show this
531
- // create/select/root menu, not a silent fall-through to root.
532
- if (selected === null)
533
- continue;
534
- const entry = loadProfileManifest(selected);
535
- // The picked profile does not cover cwd (nothing does here) — offer to
536
- // widen its purview so the next node started here is covered too.
537
- const rl = createInterface({ input: process.stdin, output: process.stdout });
538
- try {
539
- await offerAddDirToProfile(rl, entry, cwd);
540
- }
541
- finally {
542
- rl.close();
543
- }
544
- return entry.profileId;
545
- }
546
- return ensureRootProfile().profileId;
547
- }
548
- }
549
- /** Choose among a set of candidate profiles for `cwd`, or create a new one.
550
- * Reached in two ambiguous cases: MULTIPLE profiles claim `cwd` as their exact
551
- * project dir (`exact` true), or `cwd` merely sits within one or more profiles'
552
- * project dirs from a parent/workspace dir (`exact` false). Present them
553
- * most-recently-used first (choice 1 / the bare-Enter default) plus "create a
554
- * new profile here", and block until answered. Root is deliberately NOT offered
555
- * here: a claimed/covered directory always has at least a covering profile as a
556
- * sane identity, so `[r]oot` belongs only to the no-coverage prompt
557
- * (`promptCreateOrRoot`). Same raw-readline / boot-gating rationale. */
558
- async function promptPickProfileOrCreate(candidates, cwd, exact, pinnedId, bindings) {
559
- // MRU-first so the most-recently-used candidate is the bare-Enter default —
560
- // the same profile the non-interactive path auto-picks. A per-cwd pin (set
561
- // here with `d`) overrides that: it sorts to the top and becomes the
562
- // Enter-default, so a single Enter keeps picking the user's chosen profile
563
- // for this directory even as global-MRU drifts to other workspaces.
564
- const mru = [...candidates].sort((a, b) => isMoreRecent(a.manifest.last_used_at, b.manifest.last_used_at) ? -1 : 1);
565
- const pinned = pinnedId !== null ? mru.find((e) => e.profileId === pinnedId) ?? null : null;
566
- const ordered = pinned !== null ? [pinned, ...mru.filter((e) => e !== pinned)] : mru;
567
- // Pad names to a shared column so the dim detail lines up down the menu.
568
- const nameWidth = Math.max(...ordered.map((e) => e.manifest.name.length));
569
- const rows = ordered.map((entry, i) => {
570
- const n = entry.manifest.projects.length;
571
- // For exact ties the matched path is cwd itself, so surface last-used to
572
- // tell them apart; for parent/workspace coverage, WHICH of the profile's
573
- // dirs matches cwd is the differentiator. Either way append the total dir
574
- // count so "covers X" is never mistaken for the profile's full purview.
575
- const detail = exact
576
- ? `${relativeUsed(entry.manifest.last_used_at)}${n > 1 ? ` \u00b7 ${n} dirs total` : ''}`
577
- : (() => {
578
- const md = entry.manifest.projects.find((p) => projectCovers(cwd, p.path)) ??
579
- entry.manifest.projects[0];
580
- return n > 1 ? `matches ${tildify(md.path)} \u00b7 ${n} dirs total` : `matches ${tildify(md.path)}`;
581
- })();
582
- const defaultText = pinned !== null && ordered[0] === pinned ? 'default (pinned)' : 'default';
583
- return {
584
- label: bold(entry.manifest.name.padEnd(nameWidth)),
585
- detail,
586
- isDefault: i === 0,
587
- defaultText,
588
- };
589
- });
590
- rows.push({ label: dim('create a new profile here'), detail: '', bindingId: 'crtr.profile.menu.create' });
591
- // Row-scoped actions pin the highlighted profile, widen its purview (hidden
592
- // when candidates already claim cwd exactly), or clear an existing pin.
593
- const actionBindingIds = ['crtr.profile.menu.set-default', 'crtr.profile.menu.manage'];
594
- if (!exact)
595
- actionBindingIds.push('crtr.profile.menu.add-directory');
596
- if (pinned !== null)
597
- actionBindingIds.push('crtr.profile.menu.unpin');
598
- const hintParts = [`${formatBinding(bindings, 'crtr.profile.menu.set-default')}=set default`];
599
- if (!exact)
600
- hintParts.push(`${formatBinding(bindings, 'crtr.profile.menu.add-directory')}=add dir here`);
601
- if (pinned !== null)
602
- hintParts.push(`${formatBinding(bindings, 'crtr.profile.menu.unpin')}=unpin`);
603
- hintParts.push(`${formatBinding(bindings, 'crtr.profile.menu.manage')}=manage profiles`);
604
- const res = await runMenu(bindings, exact ? 'Choose a profile' : 'Select a profile', exact
605
- ? 'Several profiles claim this directory as their project'
606
- : 'This directory falls under existing profile(s)', rows, { actionBindingIds, hint: hintParts.join(' ') });
607
- // The manager can adopt dirs, pin a default, create or delete profiles — every
608
- // row here may be stale, so the caller re-resolves from the top. Without tmux
609
- // nothing changed: re-show this same menu.
610
- if (res.action === 'crtr.profile.menu.manage') {
611
- return openProfileManager(cwd)
612
- ? MANAGED
613
- : await promptPickProfileOrCreate(candidates, cwd, exact, pinnedId, bindings);
614
- }
615
- // The create row is last; selecting it (Enter on it, or `c`) creates here.
616
- if (res.index >= ordered.length) {
617
- const rl = createInterface({ input: process.stdin, output: process.stdout });
618
- try {
619
- return await createProfileHere(rl, cwd);
620
- }
621
- finally {
622
- rl.close();
623
- }
624
- }
625
- const picked = ordered[res.index];
626
- if (res.action === 'crtr.profile.menu.unpin') {
627
- clearDefaultProfile(cwd);
628
- process.stdout.write(` ${accent('\u2713')} ${dim('cleared the default for this directory')}\n`);
629
- return picked.profileId;
630
- }
631
- if (res.action === 'crtr.profile.menu.set-default') {
632
- setDefaultProfileId(cwd, picked.profileId);
633
- process.stdout.write(` ${accent('\u2713')} ${dim(`"${picked.manifest.name}" is now the default here`)}\n`);
634
- }
635
- else if (res.action === 'crtr.profile.menu.add-directory') {
636
- addProfileProject(picked.profileId, cwd, { memory: 'content' });
637
- process.stdout.write(` ${accent('\u2713')} ${dim(`added this directory to "${picked.manifest.name}"`)}\n`);
638
- }
639
- return picked.profileId;
640
- }
641
- /** Select the profile a node about to boot at `cwd` should run under.
642
- *
643
- * 1. `explicitProfile` present → resolve it as a user-typed operand (exact id,
644
- * exact name, then the closest fuzzy match — nobody recalls the generated
645
- * `<slug>-<8hex>` id, and a near-miss name should still start the session). If
646
- * its manifest does not already cover `cwd` and the session is interactive,
647
- * offer to add `cwd` to its purview (default yes). Bump `last_used_at`,
648
- * return the id.
649
- * 1b. Else, a per-cwd PINNED default (menu `d`) that still covers `cwd` is
650
- * auto-picked outright — interactive and headless alike, no prompt (that is
651
- * what "default" means). Interactive prints a breadcrumb naming it and how
652
- * to change it. `forcePicker` (`crtr --pick-profile`) bypasses the pin to
653
- * re-open the menu. A stale pin (profile gone / no longer covering) is
654
- * cleared and ignored.
655
- * 2. Else, if EXACTLY ONE profile's project dir IS `cwd` (you're at a project
656
- * root, unambiguously one owner), auto-pick it with no prompt — the
657
- * strongest signal. If SEVERAL profiles claim `cwd` exactly, it's genuinely
658
- * ambiguous: interactive → menu among them + create; headless → MRU.
659
- * 3. Else, among profiles whose project list otherwise COVERS `cwd` (cwd sits
660
- * in a subdir of, or a workspace above, one of their project dirs):
661
- * - Interactive: prompt with a MENU of those covering profiles + "create
662
- * a new profile here", BEFORE pi boots (no root option — the directory
663
- * is covered). Default is the MRU covering profile.
664
- * - Non-interactive: auto-pick the MRU covering profile, no prompt.
665
- * 4. Else — nothing covers cwd walking all the way up. Interactive: prompt to
666
- * create a profile here, select an existing profile (a searchable list of
667
- * every profile, for when you started somewhere none of them cover and
668
- * can't recall the exact name — the pick then offers to adopt cwd), or use
669
- * the root profile. Non-interactive (no TTY):
670
- * default to the root profile and print the recovery instruction to STDERR —
671
- * never stdout, which the caller may be piping. */
672
- export async function selectProfileForCwd(cwd, explicitProfile, forcePicker = false) {
673
- initializeFreshScopedStore({ kind: 'user', root: userScopeRoot() });
674
- const resolvedCwd = resolveCwd(cwd);
675
- const bindings = resolveUserKeybindings();
676
- if (explicitProfile !== undefined && explicitProfile !== null && explicitProfile !== '') {
677
- const entry = resolveProfileOperand(explicitProfile);
678
- // Selecting a profile from a directory it does not yet cover: offer to
679
- // widen its purview (interactive only, default yes) before pi boots.
680
- if (!profileCoversCwd(entry, resolvedCwd) && isInteractive()) {
681
- await promptAddDirToProfile(entry, resolvedCwd);
682
- }
683
- updateProfileLastUsed(entry.profileId);
684
- return entry.profileId;
685
- }
686
- // Looped for the one gate that changes the world before it answers: `v` opens
687
- // the profile manager, which can adopt this directory, pin a default, or
688
- // create a profile — so the decision is taken again from the top rather than
689
- // resumed inside a menu the manager just invalidated.
690
- for (;;) {
691
- const { covering, exact, pinnedId, pinned } = profileSelectionState(resolvedCwd);
692
- // A per-cwd pinned default (set from the menu with `d`) is the user's
693
- // explicit "default to THIS profile HERE". It outranks both the exact-single
694
- // auto-pick and global-MRU, so long as it still covers cwd; a stale pin
695
- // (profile deleted, or its dir removed from purview) is self-healed away.
696
- if (pinnedId !== null && pinned === null)
697
- clearDefaultProfile(resolvedCwd);
698
- // A valid pin decides it outright and STOPS ASKING — the whole point of
699
- // setting a default. Auto-pick it silently: the crouton banner the viewer
700
- // paints a beat later shows the active profile and the `crtr --pick-profile`
701
- // hint, so a boot-time breadcrumb here would just be redundant.
702
- // `crtr --pick-profile` (forcePicker) re-opens the menu to re-pin/unpin.
703
- if (pinned !== null && !forcePicker) {
704
- updateProfileLastUsed(pinned.profileId);
705
- return pinned.profileId;
706
- }
707
- // Exactly one profile's project dir IS cwd — unambiguous project root, use it
708
- // silently, never a prompt. (Several exact claims fall through to the menu.)
709
- // Suppressed under forcePicker so `--pick-profile` can pin even a lone owner.
710
- if (!forcePicker && pinned === null && exact.length === 1) {
711
- updateProfileLastUsed(exact[0].profileId);
712
- return exact[0].profileId;
713
- }
714
- // Non-interactive: cannot prompt. Prefer an exact claimant, else any covering
715
- // profile (both MRU), else root.
716
- if (!isInteractive()) {
717
- const pool = exact.length > 0 ? exact : covering;
718
- if (pool.length > 0) {
719
- const winner = pickMostRecent(pool);
720
- updateProfileLastUsed(winner.profileId);
721
- return winner.profileId;
722
- }
723
- const root = ensureRootProfile();
724
- process.stderr.write(rootProfileMessage(resolvedCwd));
725
- return root.profileId;
726
- }
727
- // Interactive. Several exact claimants → choose among them. Else covered from
728
- // a parent/workspace dir → menu of covering profiles. Else nothing covers →
729
- // the create-or-root prompt (root is only ever offered there).
730
- const validPinnedId = pinned !== null ? pinned.profileId : null;
731
- const chosen = exact.length > 1
732
- ? await promptPickProfileOrCreate(exact, resolvedCwd, true, validPinnedId, bindings)
733
- : covering.length > 0
734
- ? await promptPickProfileOrCreate(covering, resolvedCwd, false, validPinnedId, bindings)
735
- : await promptCreateOrRoot(resolvedCwd, bindings);
736
- if (chosen === MANAGED)
737
- continue;
738
- updateProfileLastUsed(chosen);
739
- return chosen;
740
- }
741
- }
1
+ var oe=Object.defineProperty;var l=(t,e)=>oe(t,"name",{value:e,configurable:!0});import{spawnSync as ie}from"node:child_process";import{existsSync as se,realpathSync as le}from"node:fs";import{basename as ce,resolve as ae,sep as S}from"node:path";import{createInterface as v}from"node:readline/promises";import{emitKeypressEvents as E}from"node:readline";import{initializeFreshScopedStore as fe}from"../scoped-state/migrate.js";import{userScopeRoot as ue}from"../scope.js";import{listProfiles as A,loadProfileManifest as pe,resolveProfileOperand as de,updateProfileLastUsed as P,createProfile as me,addProfileProject as j,ensureRootProfile as k,ROOT_PROFILE_ID as D}from"./manifest.js";import{getDefaultProfileId as he,setDefaultProfileId as $e,clearDefaultProfile as O}from"./default-binding.js";import{tildify as b}from"../fs-utils.js";import{stdoutColor as M}from"../output.js";import{inTmux as ge}from"../runtime/placement-tmux.js";import{surfaceTmuxStyleArgs as Ie}from"../runtime/surface-bg.js";import{formatBinding as g,matchesTerminalInput as we,resolveUserKeybindings as ye}from"../keybindings/index.js";const xe=["crtr.profile.menu.abort","crtr.profile.menu.up","crtr.profile.menu.down","crtr.profile.menu.select","crtr.profile.menu.accept-default","crtr.profile.menu.slot.1","crtr.profile.menu.slot.2","crtr.profile.menu.slot.3","crtr.profile.menu.slot.4","crtr.profile.menu.slot.5","crtr.profile.menu.slot.6","crtr.profile.menu.slot.7","crtr.profile.menu.slot.8","crtr.profile.menu.slot.9","crtr.profile.menu.create","crtr.profile.menu.search-existing","crtr.profile.menu.use-root","crtr.profile.menu.set-default","crtr.profile.menu.add-directory","crtr.profile.menu.unpin","crtr.profile.menu.manage"],Pe=["crtr.profile.search.abort","crtr.profile.search.back","crtr.profile.search.pick","crtr.profile.search.up","crtr.profile.search.down","crtr.profile.search.delete"];function L(t,e){return{input:e.ctrl===!0||e.meta===!0?e.name??t:t,upArrow:e.name==="up",downArrow:e.name==="down",return:e.name==="return"||e.name==="enter",escape:e.name==="escape",backspace:e.name==="backspace",ctrl:e.ctrl,meta:e.meta,shift:e.shift}}l(L,"profileRawInput");function N(t,e,r){return e.find(n=>we(t,n,r))??null}l(N,"firstProfileMatch");function be(t,e){return N(t,xe,e)}l(be,"resolveProfileMenuAction");function ve(t,e){return N(t,Pe,e)}l(ve,"resolveProfileSearchAction");function Y(t){const e=ae(t);if(!se(e))return e;try{return le(e)}catch{return e}}l(Y,"resolveCwd");function B(t,e){return!!(t===e||t.startsWith(e+S)||e.startsWith(t+S))}l(B,"projectCovers");function F(t,e){return t.manifest.projects.some(r=>B(e,r.path))}l(F,"profileCoversCwd");function T(t,e){return t===null?!1:e===null?!0:t>e}l(T,"isMoreRecent");function W(t){return t.reduce((e,r)=>T(r.manifest.last_used_at,e.manifest.last_used_at)?r:e)}l(W,"pickMostRecent");function U(t){const e=Y(t),r=A().filter(o=>F(o,e)),n=r.filter(o=>o.manifest.projects.some(u=>u.path===e)),s=he(e),i=s===null?null:r.find(o=>o.profileId===s)??null;return{covering:r,exact:n,pinnedId:s,pinned:i}}l(U,"profileSelectionState");function Je(t){const{covering:e,exact:r,pinned:n}=U(t);if(n!==null)return n.profileId;if(r.length===1)return r[0].profileId;const s=r.length>0?r:e;return s.length>0?W(s).profileId:D}l(Je,"selectProfileForCwdReadOnly");function H(){return!!process.stdin.isTTY&&!!process.stdout.isTTY}l(H,"isInteractive");const $=M.dim,x=M.bold,w=M.cyan;function Me(t){return w(x(t))}l(Me,"key");function K(t){if(t===null)return"never used";const e=Date.parse(t);if(Number.isNaN(e))return"used recently";const r=Math.max(0,Math.floor((Date.now()-e)/1e3));if(r<60)return"used just now";const n=Math.floor(r/60);if(n<60)return`used ${n}m ago`;const s=Math.floor(n/60);if(s<24)return`used ${s}h ago`;const i=Math.floor(s/24);if(i<30)return`used ${i}d ago`;const o=Math.floor(i/30);return o<12?`used ${o}mo ago`:`used ${Math.floor(o/12)}y ago`}l(K,"relativeUsed");function Te(t,e){const r=e!==void 0?` ${$(e)}
2
+ `:"";process.stdout.write(`
3
+ ${x(t)}
4
+ ${r}
5
+ `)}l(Te,"writeHeader");function _e(t){const e=t.manifest.projects.length,r=t.manifest.projects[0];return r===void 0?K(t.manifest.last_used_at):e>1?`${b(r.path)} \xB7 ${e} dirs total`:b(r.path)}l(_e,"purviewSummary");const q=w("\u25B8"),z=l(t=>t>0?`\x1B[${t}A\r`:"","cursorUp"),G="\x1B[0J",Ce=/\u001b\[[0-9;]*m/g;function J(t){const e=process.stdout.columns??80,r=t.split(`
6
+ `),n=r.length-1;let s=0;for(let i=0;i<n;i++){const o=r[i].replace(Ce,"").length;e>0&&o>e&&(s+=Math.ceil(o/e)-1)}return n+s}l(J,"blockRows");function Re(t,e,r,n,s,i){let o=`
7
+ ${x(e)}
8
+ `;r!==void 0&&(o+=` ${$(r)}
9
+ `),o+=`
10
+ `;let u=0;for(const[h,m]of n.entries()){const a=m.bindingId===void 0?++u:0,d=m.bindingId!==void 0?g(t,m.bindingId):a<=9?g(t,`crtr.profile.menu.slot.${a}`):"",p=h===s?q:" ",f=m.detail!==""?" "+$(m.detail):"",c=m.isDefault?" "+w("\xB7 "+(m.defaultText??"default")):"";o+=` ${p} ${Me(d)} ${m.label}${f}${c}
11
+ `}return i!==void 0&&(o+=`
12
+ ${$(i)}
13
+ `),o+=`
14
+ ${$(`${g(t,"crtr.profile.menu.up")}/${g(t,"crtr.profile.menu.down")} move ${g(t,"crtr.profile.menu.select")} select ${g(t,"crtr.profile.menu.accept-default")} default ${g(t,"crtr.profile.menu.abort")} quit`)}
15
+ `,o}l(Re,"renderMenu");function Q(t,e,r,n,s={}){const i=[];n.forEach((u,h)=>{u.bindingId===void 0&&i.push(h)});let o=s.initialIndex??0;return new Promise(u=>{let h=0;const m=l(()=>{const p=Re(t,e,r,n,o,s.hint);process.stdout.write((h>0?z(h)+G:"")+p),h=J(p)},"draw"),a=l(()=>{process.stdin.off("keypress",d),process.stdin.isTTY&&process.stdin.setRawMode(!1),process.stdin.pause()},"cleanup"),d=l((p,f)=>{const c=be(t,L(p,f));if(c==="crtr.profile.menu.abort"&&(a(),process.stdout.write(`
16
+ `),process.exit(130)),c==="crtr.profile.menu.up"){o=(o-1+n.length)%n.length,m();return}if(c==="crtr.profile.menu.down"){o=(o+1)%n.length,m();return}if(c==="crtr.profile.menu.select"){a(),u({index:o});return}if(c==="crtr.profile.menu.accept-default"){a(),u({index:s.initialIndex??0});return}if(c?.startsWith("crtr.profile.menu.slot.")){const I=Number.parseInt(c.slice(-1),10);I>=1&&I<=i.length&&(o=i[I-1],m());return}const y=n.findIndex(I=>I.bindingId!==void 0&&I.bindingId===c);if(y>=0){a(),u({index:y});return}c!==null&&s.actionBindingIds?.includes(c)===!0&&(a(),u({index:o,action:c}))},"onKey");E(process.stdin),process.stdin.isTTY&&process.stdin.setRawMode(!0),process.stdin.resume(),process.stdin.on("keypress",d),m()})}l(Q,"runMenu");function V(t){return ge()?(ie("tmux",["display-popup","-E","-T"," profiles ","-w","90%","-h","85%","-d",t,...Ie(),"crtr sys settings --page profiles"],{stdio:"inherit"}),!0):(process.stdout.write(` ${$("the profile manager needs tmux \u2014 run `crtr sys settings` instead")}
17
+ `),!1)}l(V,"openProfileManager");const _=Symbol("profile-manager-ran");function X(t){return` ${w("\u203A")} ${$(t)} `}l(X,"caret");function Se(t){return`crtr: no profile covers ${t}, and this session is non-interactive \u2014 using the root profile.
18
+ Run \`crtr profile new --name <name> --project ${t}\` to create a dedicated profile, or pass --profile <id-or-name> next time.
19
+ `}l(Se,"rootProfileMessage");async function Ee(t,e){const r=v({input:process.stdin,output:process.stdout});try{Te(`Profile "${t.manifest.name}" doesn't cover this directory`),await Z(r,t,e)}finally{r.close()}}l(Ee,"promptAddDirToProfile");async function Z(t,e,r){const n=(await t.question(X(`add this directory to "${e.manifest.name}"? [Y/n]`))).trim().toLowerCase();n==="n"||n==="no"||(j(e.profileId,r,{memory:"content"}),process.stdout.write(` ${w("\u2713")} ${$(`added this directory to "${e.manifest.name}"`)}
20
+ `))}l(Z,"offerAddDirToProfile");async function Ae(t){const e=[...A()].filter(i=>i.profileId!==D).sort((i,o)=>T(i.manifest.last_used_at,o.manifest.last_used_at)?-1:1);if(e.length===0)return process.stdout.write(` ${$("no existing profiles to select")}
21
+ `),null;let r="",n=0;const s=l(()=>r===""?e:e.filter(i=>i.manifest.name.toLowerCase().includes(r)||i.manifest.projects.some(o=>b(o.path).toLowerCase().includes(r))),"matchesOf");return new Promise(i=>{let o=0;const u=l(()=>{const a=s();n>=a.length&&(n=Math.max(0,a.length-1));let d=`
22
+ ${x("Select an existing profile")}
23
+ `;if(d+=` ${$("across every profile, not just this directory")}
24
+
25
+ `,a.length===0)d+=` ${$(`no match for "${r}"`)}
26
+ `;else{const p=Math.max(...a.map(f=>f.manifest.name.length));a.forEach((f,c)=>{d+=` ${c===n?q:" "} ${x(f.manifest.name.padEnd(p))} ${$(_e(f))}
27
+ `})}d+=`
28
+ ${w("\u203A")} ${r}${$("\u2588")}
29
+ `,d+=` ${$(`type to filter ${g(t,"crtr.profile.search.up")}/${g(t,"crtr.profile.search.down")} move ${g(t,"crtr.profile.search.pick")} pick ${g(t,"crtr.profile.search.back")} back`)}
30
+ `,process.stdout.write((o>0?z(o)+G:"")+d),o=J(d)},"draw"),h=l(()=>{process.stdin.off("keypress",m),process.stdin.isTTY&&process.stdin.setRawMode(!1),process.stdin.pause()},"cleanup"),m=l((a,d)=>{const p=ve(t,L(a,d));if(p==="crtr.profile.search.abort"&&(h(),process.stdout.write(`
31
+ `),process.exit(130)),p==="crtr.profile.search.back"){h(),i(null);return}const f=s();if(p==="crtr.profile.search.pick"){f.length>0&&(h(),i(f[n].profileId));return}if(p==="crtr.profile.search.up"){f.length>0&&(n=(n-1+f.length)%f.length,u());return}if(p==="crtr.profile.search.down"){f.length>0&&(n=(n+1)%f.length,u());return}if(p==="crtr.profile.search.delete"){r=r.slice(0,-1),n=0,u();return}a!==void 0&&a.length===1&&a>=" "&&d.ctrl!==!0&&(r+=a.toLowerCase(),n=0,u())},"onKey");E(process.stdin),process.stdin.isTTY&&process.stdin.setRawMode(!0),process.stdin.resume(),process.stdin.on("keypress",m),u()})}l(Ae,"promptSelectExistingProfile");async function ee(t,e){const r=ce(e)||"profile",n=(await t.question(X(`name the new profile [${r}]`))).trim(),s=n!==""?n:r,i=me(s,[{path:e,memory:"content"}]).profileId;return process.stdout.write(` ${w("\u2713")} ${$(`created profile "${s}"`)}
32
+ `),i}l(ee,"createProfileHere");async function je(t,e){const r=[{label:"create a profile here",detail:"",bindingId:"crtr.profile.menu.create"},{label:"select an existing profile",detail:"",bindingId:"crtr.profile.menu.search-existing"},{label:$("use the root profile"),detail:"",bindingId:"crtr.profile.menu.use-root",isDefault:!0}];for(;;){const n=await Q(e,"No profile covers this directory",void 0,r,{initialIndex:2,actionBindingIds:["crtr.profile.menu.manage"],hint:`${g(e,"crtr.profile.menu.manage")}=manage profiles`});if(n.action==="crtr.profile.menu.manage"){if(V(t))return _;continue}if(n.index===0){const s=v({input:process.stdin,output:process.stdout});try{return await ee(s,t)}finally{s.close()}}if(n.index===1){const s=await Ae(e);if(s===null)continue;const i=pe(s),o=v({input:process.stdin,output:process.stdout});try{await Z(o,i,t)}finally{o.close()}return i.profileId}return k().profileId}}l(je,"promptCreateOrRoot");async function C(t,e,r,n,s){const i=[...t].sort((c,y)=>T(c.manifest.last_used_at,y.manifest.last_used_at)?-1:1),o=n!==null?i.find(c=>c.profileId===n)??null:null,u=o!==null?[o,...i.filter(c=>c!==o)]:i,h=Math.max(...u.map(c=>c.manifest.name.length)),m=u.map((c,y)=>{const I=c.manifest.projects.length,te=r?`${K(c.manifest.last_used_at)}${I>1?` \xB7 ${I} dirs total`:""}`:(()=>{const R=c.manifest.projects.find(ne=>B(e,ne.path))??c.manifest.projects[0];return I>1?`matches ${b(R.path)} \xB7 ${I} dirs total`:`matches ${b(R.path)}`})(),re=o!==null&&u[0]===o?"default (pinned)":"default";return{label:x(c.manifest.name.padEnd(h)),detail:te,isDefault:y===0,defaultText:re}});m.push({label:$("create a new profile here"),detail:"",bindingId:"crtr.profile.menu.create"});const a=["crtr.profile.menu.set-default","crtr.profile.menu.manage"];r||a.push("crtr.profile.menu.add-directory"),o!==null&&a.push("crtr.profile.menu.unpin");const d=[`${g(s,"crtr.profile.menu.set-default")}=set default`];r||d.push(`${g(s,"crtr.profile.menu.add-directory")}=add dir here`),o!==null&&d.push(`${g(s,"crtr.profile.menu.unpin")}=unpin`),d.push(`${g(s,"crtr.profile.menu.manage")}=manage profiles`);const p=await Q(s,r?"Choose a profile":"Select a profile",r?"Several profiles claim this directory as their project":"This directory falls under existing profile(s)",m,{actionBindingIds:a,hint:d.join(" ")});if(p.action==="crtr.profile.menu.manage")return V(e)?_:await C(t,e,r,n,s);if(p.index>=u.length){const c=v({input:process.stdin,output:process.stdout});try{return await ee(c,e)}finally{c.close()}}const f=u[p.index];return p.action==="crtr.profile.menu.unpin"?(O(e),process.stdout.write(` ${w("\u2713")} ${$("cleared the default for this directory")}
33
+ `),f.profileId):(p.action==="crtr.profile.menu.set-default"?($e(e,f.profileId),process.stdout.write(` ${w("\u2713")} ${$(`"${f.manifest.name}" is now the default here`)}
34
+ `)):p.action==="crtr.profile.menu.add-directory"&&(j(f.profileId,e,{memory:"content"}),process.stdout.write(` ${w("\u2713")} ${$(`added this directory to "${f.manifest.name}"`)}
35
+ `)),f.profileId)}l(C,"promptPickProfileOrCreate");async function Qe(t,e,r=!1){fe({kind:"user",root:ue()});const n=Y(t),s=ye();if(e!=null&&e!==""){const i=de(e);return!F(i,n)&&H()&&await Ee(i,n),P(i.profileId),i.profileId}for(;;){const{covering:i,exact:o,pinnedId:u,pinned:h}=U(n);if(u!==null&&h===null&&O(n),h!==null&&!r)return P(h.profileId),h.profileId;if(!r&&h===null&&o.length===1)return P(o[0].profileId),o[0].profileId;if(!H()){const d=o.length>0?o:i;if(d.length>0){const f=W(d);return P(f.profileId),f.profileId}const p=k();return process.stderr.write(Se(n)),p.profileId}const m=h!==null?h.profileId:null,a=o.length>1?await C(o,n,!0,m,s):i.length>0?await C(i,n,!1,m,s):await je(n,s);if(a!==_)return P(a),a}}l(Qe,"selectProfileForCwd");export{F as profileCoversCwd,be as resolveProfileMenuAction,ve as resolveProfileSearchAction,Qe as selectProfileForCwd,Je as selectProfileForCwdReadOnly};