@north-light/crouter 0.3.317 → 0.3.319

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 (1305) hide show
  1. package/README.md +0 -3
  2. package/dist/api/client.d.ts +1 -1
  3. package/dist/api/client.js +2 -912
  4. package/dist/api/dto/attach.js +0 -13
  5. package/dist/api/dto/bash-jobs.js +1 -9
  6. package/dist/api/dto/broker-ops.js +0 -6
  7. package/dist/api/dto/broker.js +0 -20
  8. package/dist/api/dto/canvas.js +0 -2
  9. package/dist/api/dto/chat-inventory.js +0 -11
  10. package/dist/api/dto/common.js +1 -15
  11. package/dist/api/dto/config.js +0 -3
  12. package/dist/api/dto/crons.js +1 -10
  13. package/dist/api/dto/files.js +0 -7
  14. package/dist/api/dto/focus.js +0 -10
  15. package/dist/api/dto/health.js +0 -2
  16. package/dist/api/dto/human-requests.js +0 -4
  17. package/dist/api/dto/human.js +0 -4
  18. package/dist/api/dto/inbox.js +0 -4
  19. package/dist/api/dto/lifecycle.js +0 -3
  20. package/dist/api/dto/mail.js +0 -1
  21. package/dist/api/dto/memory.js +0 -6
  22. package/dist/api/dto/messages.js +0 -2
  23. package/dist/api/dto/model-config.js +0 -1
  24. package/dist/api/dto/modelauth.js +0 -4
  25. package/dist/api/dto/node-outcomes.js +0 -2
  26. package/dist/api/dto/nodes.js +0 -3
  27. package/dist/api/dto/profiles.js +1 -4
  28. package/dist/api/dto/recovery.js +0 -1
  29. package/dist/api/dto/reports.js +0 -2
  30. package/dist/api/dto/review-comments.js +0 -5
  31. package/dist/api/dto/reviews.js +0 -5
  32. package/dist/api/dto/subscriptions.js +0 -2
  33. package/dist/api/dto/worktree.js +0 -6
  34. package/dist/api/errors.js +1 -40
  35. package/dist/api/index.js +1 -33
  36. package/dist/api/plugin-manifest-schema.js +0 -23
  37. package/dist/api/routes.js +1 -147
  38. package/dist/build-root.js +1 -198
  39. package/dist/cli.js +3 -99
  40. package/dist/clients/attach/ansi-cells.js +1 -137
  41. package/dist/clients/attach/chrome/bash-jobs.js +1 -31
  42. package/dist/clients/attach/chrome/canvas-panels.js +1 -194
  43. package/dist/clients/attach/chrome/completion-bell.js +1 -89
  44. package/dist/clients/attach/chrome/cron-wait.js +1 -34
  45. package/dist/clients/attach/chrome/git-info.js +2 -44
  46. package/dist/clients/attach/chrome/header.js +1 -30
  47. package/dist/clients/attach/chrome/inbox-strip.js +1 -199
  48. package/dist/clients/attach/chrome/recap.js +1 -19
  49. package/dist/clients/attach/chrome/review-wait.js +1 -22
  50. package/dist/clients/attach/chrome/roster.js +4 -275
  51. package/dist/clients/attach/chrome/status-line.js +1 -117
  52. package/dist/clients/attach/chrome/ticket-panel.js +1 -280
  53. package/dist/clients/attach/chrome/widgets.js +1 -51
  54. package/dist/clients/attach/command.js +1 -107
  55. package/dist/clients/attach/config.js +1 -274
  56. package/dist/clients/attach/input/capabilities.js +1 -104
  57. package/dist/clients/attach/input/clipboard-image.js +3 -220
  58. package/dist/clients/attach/input/completion-frecency.js +1 -141
  59. package/dist/clients/attach/input/controller.js +7 -377
  60. package/dist/clients/attach/input/overlay-owner.js +1 -199
  61. package/dist/clients/attach/input/ref-autocomplete.js +2 -176
  62. package/dist/clients/attach/input/titled-editor.js +4 -859
  63. package/dist/clients/attach/overlays/auth.js +2 -271
  64. package/dist/clients/attach/overlays/dialogs.js +2 -102
  65. package/dist/clients/attach/overlays/file-review.js +2 -128
  66. package/dist/clients/attach/overlays/graph.js +1 -661
  67. package/dist/clients/attach/overlays/help.js +1 -211
  68. package/dist/clients/attach/overlays/mcp.js +1 -302
  69. package/dist/clients/attach/overlays/pickers.js +1 -163
  70. package/dist/clients/attach/render/activity-slot.js +1 -13
  71. package/dist/clients/attach/render/assistant-message.js +1 -56
  72. package/dist/clients/attach/render/card-presentation.js +5 -218
  73. package/dist/clients/attach/render/chat-view.js +5 -1708
  74. package/dist/clients/attach/render/condensed-history.js +1 -60
  75. package/dist/clients/attach/render/context-message.js +1 -63
  76. package/dist/clients/attach/render/crtr-output.js +17 -905
  77. package/dist/clients/attach/render/diagram.js +7 -111
  78. package/dist/clients/attach/render/edit-diff.js +5 -304
  79. package/dist/clients/attach/render/glyph-codepoints.js +1 -42
  80. package/dist/clients/attach/render/group-activity.js +2 -263
  81. package/dist/clients/attach/render/group-recap.js +1 -152
  82. package/dist/clients/attach/render/markdown-source.js +5 -266
  83. package/dist/clients/attach/render/measured-container.js +1 -322
  84. package/dist/clients/attach/render/page-block.js +1 -183
  85. package/dist/clients/attach/render/scroll-animation.js +1 -80
  86. package/dist/clients/attach/render/tool-calls.js +3 -361
  87. package/dist/clients/attach/render/transcript-copy.js +2 -81
  88. package/dist/clients/attach/render/transcript-search.js +1 -152
  89. package/dist/clients/attach/render/viewport.js +1 -184
  90. package/dist/clients/attach/session/banner.js +1 -29
  91. package/dist/clients/attach/session/bindings.js +1 -71
  92. package/dist/clients/attach/session/chrome-refresh.js +1 -94
  93. package/dist/clients/attach/session/connection.js +1 -186
  94. package/dist/clients/attach/session/context.js +0 -16
  95. package/dist/clients/attach/session/editor-frame.js +1 -142
  96. package/dist/clients/attach/session/editor-inventory.js +6 -160
  97. package/dist/clients/attach/session/file-links.js +1 -68
  98. package/dist/clients/attach/session/focus-events.js +1 -12
  99. package/dist/clients/attach/session/frame.js +1 -214
  100. package/dist/clients/attach/session/frames.js +1 -188
  101. package/dist/clients/attach/session/identity.js +1 -26
  102. package/dist/clients/attach/session/input-wiring.js +1 -140
  103. package/dist/clients/attach/session/invariant.js +1 -15
  104. package/dist/clients/attach/session/keys.js +1 -77
  105. package/dist/clients/attach/session/layout.js +1 -59
  106. package/dist/clients/attach/session/mouse.js +1 -78
  107. package/dist/clients/attach/session/pane-focus.js +1 -42
  108. package/dist/clients/attach/session/pane-tag.js +1 -112
  109. package/dist/clients/attach/session/pi-assets.js +1 -24
  110. package/dist/clients/attach/session/pi-oauth-flows.js +1 -21
  111. package/dist/clients/attach/session/profile-files.js +1 -228
  112. package/dist/clients/attach/session/reconnect.js +1 -175
  113. package/dist/clients/attach/session/selection.js +3 -108
  114. package/dist/clients/attach/session/state-sync.js +1 -67
  115. package/dist/clients/attach/session/surface-frame.js +1 -73
  116. package/dist/clients/attach/session/surface-host.js +1 -255
  117. package/dist/clients/attach/session/teardown.js +5 -94
  118. package/dist/clients/attach/session/transcript-search.js +3 -151
  119. package/dist/clients/attach/session/whip-achievements.js +2 -145
  120. package/dist/clients/attach/session/whip.js +1 -362
  121. package/dist/clients/attach/slash/dispatch.js +1 -706
  122. package/dist/clients/attach/slash/prompt-preview.js +1 -121
  123. package/dist/clients/attach/viewer.js +1 -1
  124. package/dist/clients/conversation/projection.js +1 -324
  125. package/dist/clients/conversation/submit.js +1 -51
  126. package/dist/clients/inbox/controller.js +1 -701
  127. package/dist/clients/inbox/dto-adapt.js +1 -93
  128. package/dist/clients/inbox/layout.js +1 -9
  129. package/dist/clients/inbox/page-adapter.js +1 -55
  130. package/dist/clients/inbox/resolve.js +1 -35
  131. package/dist/clients/inbox/review/anchors.js +1 -89
  132. package/dist/clients/inbox/review/comments-client.js +1 -98
  133. package/dist/clients/inbox/review/companion-pane.js +1 -82
  134. package/dist/clients/inbox/review/document-surface.js +2 -1188
  135. package/dist/clients/inbox/review/frame.js +1 -216
  136. package/dist/clients/inbox/review/keys.js +1 -123
  137. package/dist/clients/inbox/review/launch.js +1 -151
  138. package/dist/clients/inbox/review/live-source.js +1 -160
  139. package/dist/clients/inbox/review/nvim.js +1 -44
  140. package/dist/clients/inbox/review/remap.js +1 -157
  141. package/dist/clients/inbox/review/review-client.js +1 -123
  142. package/dist/clients/inbox/review/roundtrip.js +3 -36
  143. package/dist/clients/inbox/review/state.js +4 -315
  144. package/dist/clients/inbox/review-adapter.js +1 -43
  145. package/dist/clients/inbox/surface.js +1 -152
  146. package/dist/clients/inbox/tui/ansi.js +3 -321
  147. package/dist/clients/inbox/tui/input.js +5 -392
  148. package/dist/clients/inbox/tui/keys.js +1 -104
  149. package/dist/clients/inbox/tui/page-body.js +1 -66
  150. package/dist/clients/inbox/tui/panel.js +1 -84
  151. package/dist/clients/inbox/tui/render.js +2 -368
  152. package/dist/clients/inbox/tui/slots.js +3 -134
  153. package/dist/clients/inbox/tui/types.js +0 -1
  154. package/dist/clients/inbox/tui.js +1 -86
  155. package/dist/clients/surfaces/host.js +0 -1
  156. package/dist/commands/api-client.js +4 -290
  157. package/dist/commands/attention.js +1 -215
  158. package/dist/commands/canvas-browse.js +1 -70
  159. package/dist/commands/canvas-config.js +2 -192
  160. package/dist/commands/canvas-history/grep.js +7 -85
  161. package/dist/commands/canvas-history/read.js +3 -50
  162. package/dist/commands/canvas-history/search.js +10 -99
  163. package/dist/commands/canvas-history/shared.js +1 -139
  164. package/dist/commands/canvas-history/stats.js +6 -68
  165. package/dist/commands/canvas-history.js +1 -32
  166. package/dist/commands/canvas-issue.js +14 -149
  167. package/dist/commands/canvas-prune.js +1 -108
  168. package/dist/commands/canvas-roster.js +1 -69
  169. package/dist/commands/canvas-snapshot.js +1 -34
  170. package/dist/commands/canvas-use.js +1 -61
  171. package/dist/commands/canvas.js +1 -49
  172. package/dist/commands/chord.js +1 -241
  173. package/dist/commands/cron.js +11 -534
  174. package/dist/commands/dashboard.js +1 -85
  175. package/dist/commands/human/components.js +3 -77
  176. package/dist/commands/human/feedback.js +1 -112
  177. package/dist/commands/human/prompts.js +1 -331
  178. package/dist/commands/human/queue.js +1 -191
  179. package/dist/commands/human/request.js +1 -266
  180. package/dist/commands/human/review.js +1 -288
  181. package/dist/commands/human/shared.js +1 -67
  182. package/dist/commands/human.js +4 -60
  183. package/dist/commands/memory/delete.js +1 -100
  184. package/dist/commands/memory/edit.js +21 -219
  185. package/dist/commands/memory/find.js +2 -244
  186. package/dist/commands/memory/history.js +5 -199
  187. package/dist/commands/memory/lint.js +1 -107
  188. package/dist/commands/memory/list.js +1 -142
  189. package/dist/commands/memory/move.js +1 -223
  190. package/dist/commands/memory/origin.js +1 -130
  191. package/dist/commands/memory/read.js +6 -232
  192. package/dist/commands/memory/shared.js +12 -802
  193. package/dist/commands/memory/write.js +13 -235
  194. package/dist/commands/memory.js +1 -30
  195. package/dist/commands/node/bash.js +5 -245
  196. package/dist/commands/node/create.js +3 -332
  197. package/dist/commands/node/inspect.js +12 -300
  198. package/dist/commands/node/lifecycle.js +2 -453
  199. package/dist/commands/node/message.js +1 -161
  200. package/dist/commands/node/outcome.js +4 -134
  201. package/dist/commands/node/pyramid.js +2 -79
  202. package/dist/commands/node/subscription.js +1 -78
  203. package/dist/commands/node/wait.js +7 -163
  204. package/dist/commands/node-context.js +2 -159
  205. package/dist/commands/node-inspect-artifacts.js +8 -109
  206. package/dist/commands/node-lifecycle-revive.js +1 -217
  207. package/dist/commands/node-snapshot.js +1 -37
  208. package/dist/commands/node-transcript.js +1 -62
  209. package/dist/commands/node-worktree.js +1 -138
  210. package/dist/commands/node.js +1 -29
  211. package/dist/commands/pkg/browse/actions.js +1 -198
  212. package/dist/commands/pkg/browse/catalog.js +1 -466
  213. package/dist/commands/pkg/browse/command-view.js +1 -191
  214. package/dist/commands/pkg/browse/detail-panel.js +1 -402
  215. package/dist/commands/pkg/browse/doc-view.js +1 -89
  216. package/dist/commands/pkg/browse/list-panel.js +2 -168
  217. package/dist/commands/pkg/browse/model.js +1 -36
  218. package/dist/commands/pkg/browse/shell.js +1 -640
  219. package/dist/commands/pkg/browse.js +1 -27
  220. package/dist/commands/pkg/market-inspect.js +1 -141
  221. package/dist/commands/pkg/market-manage.js +1 -327
  222. package/dist/commands/pkg/market.js +1 -14
  223. package/dist/commands/pkg/plugin-inspect.js +1 -168
  224. package/dist/commands/pkg/plugin-manage.js +17 -1109
  225. package/dist/commands/pkg/plugin.js +1 -14
  226. package/dist/commands/pkg/shared.js +1 -62
  227. package/dist/commands/pkg.js +1 -21
  228. package/dist/commands/profile/default.js +1 -139
  229. package/dist/commands/profile/delete.js +1 -66
  230. package/dist/commands/profile/env.js +3 -188
  231. package/dist/commands/profile/kind.js +2 -35
  232. package/dist/commands/profile/list.js +1 -43
  233. package/dist/commands/profile/meta.js +1 -67
  234. package/dist/commands/profile/new.js +1 -115
  235. package/dist/commands/profile/pause.js +1 -59
  236. package/dist/commands/profile/project.js +1 -113
  237. package/dist/commands/profile/rename.js +1 -38
  238. package/dist/commands/profile/show.js +1 -52
  239. package/dist/commands/profile.js +1 -35
  240. package/dist/commands/push.js +9 -265
  241. package/dist/commands/revive.js +10 -181
  242. package/dist/commands/surface/node/cycle.js +1 -83
  243. package/dist/commands/surface/node/focus.js +1 -81
  244. package/dist/commands/surface/node/id.js +1 -38
  245. package/dist/commands/surface/node/pin.js +1 -42
  246. package/dist/commands/surface/node/placement.js +1 -134
  247. package/dist/commands/surface-edit.js +1 -157
  248. package/dist/commands/surface-inbox.js +1 -98
  249. package/dist/commands/surface-inspect.js +1 -39
  250. package/dist/commands/surface-node.js +1 -19
  251. package/dist/commands/surface-reload.js +2 -134
  252. package/dist/commands/surface-tmux-spread.js +1 -214
  253. package/dist/commands/surface.js +1 -28
  254. package/dist/commands/sys/branch.js +1 -19
  255. package/dist/commands/sys/config.js +1 -353
  256. package/dist/commands/sys/context/admin/actions.js +2 -246
  257. package/dist/commands/sys/context/admin/detail-panel.js +1 -247
  258. package/dist/commands/sys/context/admin/docs-panel.js +1 -191
  259. package/dist/commands/sys/context/admin/list-view.js +1 -183
  260. package/dist/commands/sys/context/admin/model.js +1 -229
  261. package/dist/commands/sys/context/admin/rail-panel.js +1 -227
  262. package/dist/commands/sys/context/admin/read-view.js +2 -194
  263. package/dist/commands/sys/context/admin/shell.js +1 -910
  264. package/dist/commands/sys/context/admin.js +2 -126
  265. package/dist/commands/sys/context/doc.js +3 -197
  266. package/dist/commands/sys/context/prompt-review.js +11 -291
  267. package/dist/commands/sys/context/resolve.js +10 -489
  268. package/dist/commands/sys/context/sysprompt.js +5 -96
  269. package/dist/commands/sys/context.js +1 -20
  270. package/dist/commands/sys/daemon.js +1 -313
  271. package/dist/commands/sys/doctor.js +1 -617
  272. package/dist/commands/sys/feedback.js +7 -228
  273. package/dist/commands/sys/logs.js +3 -129
  274. package/dist/commands/sys/migrate.js +1 -94
  275. package/dist/commands/sys/panels/broker-limits-panel.js +2 -110
  276. package/dist/commands/sys/panels/dependencies-panel.js +1 -80
  277. package/dist/commands/sys/panels/keybindings-panel.js +1 -703
  278. package/dist/commands/sys/panels/models-panel.js +1 -1133
  279. package/dist/commands/sys/panels/plugins-panel.js +1 -80
  280. package/dist/commands/sys/panels/prefs-panel.js +1 -85
  281. package/dist/commands/sys/panels/profiles-panel.js +1 -601
  282. package/dist/commands/sys/panels/provider-panel.js +1 -538
  283. package/dist/commands/sys/settings-shell.js +1 -400
  284. package/dist/commands/sys/settings.js +1 -46
  285. package/dist/commands/sys/setup-core.js +6 -579
  286. package/dist/commands/sys/setup-settings-runner.js +1 -16
  287. package/dist/commands/sys/setup-wizard.js +1 -279
  288. package/dist/commands/sys/setup.js +1 -34
  289. package/dist/commands/sys/shared.js +1 -81
  290. package/dist/commands/sys/support/prepare.js +3 -239
  291. package/dist/commands/sys/support/submit.js +6 -524
  292. package/dist/commands/sys/support.js +1 -18
  293. package/dist/commands/sys/sync-deps.js +15 -498
  294. package/dist/commands/sys/sync-project-guidance.js +4 -481
  295. package/dist/commands/sys/sync-shared.js +1 -49
  296. package/dist/commands/sys/sync-skills.js +2 -311
  297. package/dist/commands/sys/sync.js +1 -18
  298. package/dist/commands/sys/update.js +1 -147
  299. package/dist/commands/sys/worktrees.js +5 -53
  300. package/dist/commands/sys.js +1 -18
  301. package/dist/core/activity-signal.js +2 -38
  302. package/dist/core/asset-root.js +1 -18
  303. package/dist/core/auth-file.js +2 -179
  304. package/dist/core/auth-interaction.js +3 -94
  305. package/dist/core/auto-update.js +4 -94
  306. package/dist/core/bash-guard.js +11 -393
  307. package/dist/core/bash-jobs.js +7 -411
  308. package/dist/core/bootstrap.js +2 -53
  309. package/dist/core/broker-client/client.js +1 -184
  310. package/dist/core/broker-client/index.js +1 -13
  311. package/dist/core/broker-client/transport-relay.js +1 -157
  312. package/dist/core/broker-client/transport-socket.js +1 -179
  313. package/dist/core/broker-client/transport.js +1 -26
  314. package/dist/core/canvas/attention.js +1 -47
  315. package/dist/core/canvas/boot-id.js +1 -26
  316. package/dist/core/canvas/boot.js +1 -186
  317. package/dist/core/canvas/browse/app.js +3 -919
  318. package/dist/core/canvas/browse/model.js +1 -477
  319. package/dist/core/canvas/browse/pins.js +1 -29
  320. package/dist/core/canvas/browse/render.js +3 -1055
  321. package/dist/core/canvas/canvas.js +15 -922
  322. package/dist/core/canvas/crons.js +11 -481
  323. package/dist/core/canvas/daemon-owner.js +2 -146
  324. package/dist/core/canvas/db.js +2 -100
  325. package/dist/core/canvas/deliveries.js +22 -283
  326. package/dist/core/canvas/delivery-contract.js +1 -8
  327. package/dist/core/canvas/executions.js +1 -68
  328. package/dist/core/canvas/extensions.js +1 -83
  329. package/dist/core/canvas/focuses.js +1 -77
  330. package/dist/core/canvas/history.js +24 -860
  331. package/dist/core/canvas/index.js +1 -15
  332. package/dist/core/canvas/install-id.js +1 -84
  333. package/dist/core/canvas/labels.js +1 -43
  334. package/dist/core/canvas/meta-file.js +1 -89
  335. package/dist/core/canvas/migrations.js +41 -1150
  336. package/dist/core/canvas/nav-model.js +1 -231
  337. package/dist/core/canvas/nav-render.js +1 -260
  338. package/dist/core/canvas/node-order.js +1 -37
  339. package/dist/core/canvas/node-recap.js +2 -67
  340. package/dist/core/canvas/node-sql-migration.js +2 -209
  341. package/dist/core/canvas/paths.js +1 -153
  342. package/dist/core/canvas/pid.js +4 -683
  343. package/dist/core/canvas/recovery.js +3 -565
  344. package/dist/core/canvas/remote-canvas-source.js +1 -288
  345. package/dist/core/canvas/remote-transport.js +1 -57
  346. package/dist/core/canvas/render-source.js +10 -635
  347. package/dist/core/canvas/sessions.js +1 -78
  348. package/dist/core/canvas/source.js +1 -47
  349. package/dist/core/canvas/status-glyph.js +1 -132
  350. package/dist/core/canvas/telemetry.js +1 -35
  351. package/dist/core/canvas/types.js +1 -6
  352. package/dist/core/canvas/waits.js +4 -68
  353. package/dist/core/canvas/worktrees.js +1 -93
  354. package/dist/core/clipboard-text.js +1 -57
  355. package/dist/core/command-hooks/artifact.js +1 -145
  356. package/dist/core/command-hooks/catalog.js +1 -38
  357. package/dist/core/command-hooks/compose.js +1 -99
  358. package/dist/core/command-hooks/discovery.js +1 -228
  359. package/dist/core/command-hooks/help.js +1 -18
  360. package/dist/core/command-hooks/index.js +1 -7
  361. package/dist/core/command-hooks/lifecycle-catalog.js +1 -9
  362. package/dist/core/command-hooks/lifecycle-create.js +1 -51
  363. package/dist/core/command-hooks/report.js +1 -28
  364. package/dist/core/command-hooks/schema.js +1 -157
  365. package/dist/core/command-hooks/transport/exec-invoke.js +1 -276
  366. package/dist/core/command-hooks/transport/exec-lifecycle.js +1 -211
  367. package/dist/core/command-manifests/manifest.js +1 -324
  368. package/dist/core/command-manifests/registry.js +1 -118
  369. package/dist/core/command-manifests/schema.js +1 -736
  370. package/dist/core/command-plugins/bundle.js +1 -261
  371. package/dist/core/command-plugins/compose.js +1 -65
  372. package/dist/core/command-plugins/discovery.js +1 -245
  373. package/dist/core/command-plugins/endpoint.js +1 -48
  374. package/dist/core/command-plugins/extensions.js +1 -166
  375. package/dist/core/command-plugins/help-addenda.js +1 -44
  376. package/dist/core/command-plugins/presence.js +1 -17
  377. package/dist/core/command-plugins/revalidate.js +2 -152
  378. package/dist/core/command-plugins/transport/exec-invoke.js +1 -215
  379. package/dist/core/command-plugins/transport/http-fetch.js +1 -68
  380. package/dist/core/command-plugins/transport/http-invoke.js +3 -546
  381. package/dist/core/command.js +10 -739
  382. package/dist/core/config.js +1 -1059
  383. package/dist/core/document-lines.js +3 -6
  384. package/dist/core/env-name.js +1 -9
  385. package/dist/core/errors.js +1 -52
  386. package/dist/core/events/emit.js +1 -17
  387. package/dist/core/events/envelope.js +1 -84
  388. package/dist/core/events/errors.js +1 -69
  389. package/dist/core/events/index.js +1 -4
  390. package/dist/core/events/operation-id.js +1 -24
  391. package/dist/core/events/read.js +1 -623
  392. package/dist/core/events/serialize.js +1 -199
  393. package/dist/core/events/source.js +1 -31
  394. package/dist/core/events/types.js +1 -11
  395. package/dist/core/exclusive-lock.js +1 -197
  396. package/dist/core/fault-classifier.js +1 -96
  397. package/dist/core/feed/feed.js +7 -202
  398. package/dist/core/feed/inbox-migrate.js +3 -135
  399. package/dist/core/feed/inbox.js +10 -122
  400. package/dist/core/feed/messages.js +6 -212
  401. package/dist/core/frontmatter.js +1 -35
  402. package/dist/core/fs-utils.js +3 -202
  403. package/dist/core/git.js +2 -103
  404. package/dist/core/help.js +9 -310
  405. package/dist/core/host-exports/builtins.js +9 -68
  406. package/dist/core/host-exports/export.js +3 -124
  407. package/dist/core/human/action-binding.js +1 -40
  408. package/dist/core/human/answer-text.js +5 -100
  409. package/dist/core/human/answer.js +1 -119
  410. package/dist/core/human/claim.js +3 -67
  411. package/dist/core/human/completion.js +1 -27
  412. package/dist/core/human/component-docs.js +78 -272
  413. package/dist/core/human/convention.js +2 -82
  414. package/dist/core/human/feedback-companion.js +1 -106
  415. package/dist/core/human/feedback.js +1 -88
  416. package/dist/core/human/page-authoring.js +1 -19
  417. package/dist/core/human/page-catalog.js +1 -172
  418. package/dist/core/human/page-errors.js +1 -7
  419. package/dist/core/human/page-eval.js +1 -125
  420. package/dist/core/human/page-html-markdown.js +8 -260
  421. package/dist/core/human/page-markdown.js +17 -295
  422. package/dist/core/human/page-schema.js +1 -373
  423. package/dist/core/human/page-synth.js +8 -27
  424. package/dist/core/human/page.js +1 -198
  425. package/dist/core/human/requests.js +15 -466
  426. package/dist/core/human/review-schema.js +1 -34
  427. package/dist/core/human/root.js +1 -11
  428. package/dist/core/human/scan.js +1 -69
  429. package/dist/core/human/summary.js +1 -5
  430. package/dist/core/human/tickets.js +1 -171
  431. package/dist/core/human/types.js +0 -1
  432. package/dist/core/human/visible-paths.js +1 -77
  433. package/dist/core/human-actions.js +1 -101
  434. package/dist/core/inspector/chrome.js +1 -14
  435. package/dist/core/inspector/contract.js +0 -1
  436. package/dist/core/inspector/core.js +2 -295
  437. package/dist/core/inspector/host.js +4 -538
  438. package/dist/core/inspector/model.js +2 -226
  439. package/dist/core/inspector/text.js +6 -45
  440. package/dist/core/inspector/transport.js +1 -36
  441. package/dist/core/inspector/tui.js +2 -295
  442. package/dist/core/installed-plugins.js +1 -78
  443. package/dist/core/io.js +7 -356
  444. package/dist/core/keybindings/attach-control.js +1 -42
  445. package/dist/core/keybindings/background-bash.js +1 -33
  446. package/dist/core/keybindings/catalog.js +1 -256
  447. package/dist/core/keybindings/inbox.js +1 -25
  448. package/dist/core/keybindings/index.js +1 -7
  449. package/dist/core/keybindings/match.js +1 -127
  450. package/dist/core/keybindings/persistence.js +1 -49
  451. package/dist/core/keybindings/resolve.js +1 -348
  452. package/dist/core/keybindings/types.js +0 -1
  453. package/dist/core/locked-file.js +1 -118
  454. package/dist/core/log.js +3 -27
  455. package/dist/core/manifest-recovery.js +1 -72
  456. package/dist/core/manifest-stale.js +1 -39
  457. package/dist/core/manifest.js +1 -20
  458. package/dist/core/memory/doc-link-grammar.js +2 -109
  459. package/dist/core/memory/extensions.js +1 -221
  460. package/dist/core/memory/history.js +6 -268
  461. package/dist/core/memory/identity.js +1 -181
  462. package/dist/core/memory/inline-ref-grammar.js +1 -98
  463. package/dist/core/memory/inline-ref-guidance.js +2 -35
  464. package/dist/core/memory/inline-ref-inventory.js +1 -59
  465. package/dist/core/memory/lint.js +2 -671
  466. package/dist/core/memory/project-namespace.js +2 -85
  467. package/dist/core/memory/repository-association.js +1 -129
  468. package/dist/core/memory/tree.js +1 -93
  469. package/dist/core/memory-resolver.js +2 -611
  470. package/dist/core/model-config.js +1 -107
  471. package/dist/core/model-routes.js +1 -201
  472. package/dist/core/nested-stores.js +2 -166
  473. package/dist/core/output.js +7 -99
  474. package/dist/core/pagination.js +1 -88
  475. package/dist/core/plugin-swap-lock.js +1 -31
  476. package/dist/core/pool-credential-store.js +1 -116
  477. package/dist/core/predicate.js +1 -191
  478. package/dist/core/preview-registry.js +2 -411
  479. package/dist/core/preview-result-path.js +1 -26
  480. package/dist/core/profiles/default-binding.js +1 -24
  481. package/dist/core/profiles/deletion-reservation.js +1 -42
  482. package/dist/core/profiles/env-store.js +2 -162
  483. package/dist/core/profiles/fuzzy-match.js +1 -92
  484. package/dist/core/profiles/manifest.js +1 -574
  485. package/dist/core/profiles/select.js +35 -741
  486. package/dist/core/profiles/state-block.js +3 -17
  487. package/dist/core/provider-error-recognition.js +1 -74
  488. package/dist/core/provider-failure.js +1 -86
  489. package/dist/core/provider-management.js +1 -22
  490. package/dist/core/remote-canvas-target.js +1 -30
  491. package/dist/core/render.js +18 -138
  492. package/dist/core/resolver.js +1 -111
  493. package/dist/core/review/birth.js +1 -52
  494. package/dist/core/review/comments.js +5 -279
  495. package/dist/core/review/companion.js +1 -215
  496. package/dist/core/review/document.js +2 -138
  497. package/dist/core/review/project.js +1 -36
  498. package/dist/core/review/realize.js +1 -71
  499. package/dist/core/review/remap.js +4 -141
  500. package/dist/core/review/signal.js +1 -12
  501. package/dist/core/review/stage.js +1 -184
  502. package/dist/core/review/store.js +1 -168
  503. package/dist/core/review/types.js +1 -23
  504. package/dist/core/runtime/advertised-command-invocation.js +1 -233
  505. package/dist/core/runtime/auth-reload.js +1 -67
  506. package/dist/core/runtime/banner.js +1 -51
  507. package/dist/core/runtime/bearings-render.js +18 -250
  508. package/dist/core/runtime/bearings.js +7 -194
  509. package/dist/core/runtime/bin-contributions.js +2 -186
  510. package/dist/core/runtime/boot-root.js +1 -107
  511. package/dist/core/runtime/branded-host.js +2 -264
  512. package/dist/core/runtime/broker/auth-reload.js +1 -157
  513. package/dist/core/runtime/broker/client-registry.js +1 -179
  514. package/dist/core/runtime/broker/daemon-ops.js +1 -88
  515. package/dist/core/runtime/broker/engine-drive.js +1 -354
  516. package/dist/core/runtime/broker/engine-routing.js +1 -211
  517. package/dist/core/runtime/broker/event-projection.js +1 -193
  518. package/dist/core/runtime/broker/extension-abort.js +1 -36
  519. package/dist/core/runtime/broker/fault-retry.js +1 -588
  520. package/dist/core/runtime/broker/frame-client.js +1 -132
  521. package/dist/core/runtime/broker/frame-dispatch.js +1 -183
  522. package/dist/core/runtime/broker/frame-engine-control.js +1 -231
  523. package/dist/core/runtime/broker/frame-memory-refs.js +1 -41
  524. package/dist/core/runtime/broker/frame-model-query.js +1 -69
  525. package/dist/core/runtime/broker/frame-read.js +1 -116
  526. package/dist/core/runtime/broker/frame-replies.js +1 -64
  527. package/dist/core/runtime/broker/frame-session.js +4 -203
  528. package/dist/core/runtime/broker/held-deferred-inbox.js +1 -13
  529. package/dist/core/runtime/broker/inbox.js +13 -163
  530. package/dist/core/runtime/broker/node-named.js +1 -27
  531. package/dist/core/runtime/broker/read-ops.js +1 -171
  532. package/dist/core/runtime/broker/rebind.js +1 -318
  533. package/dist/core/runtime/broker/tool-groups.js +1 -246
  534. package/dist/core/runtime/broker/turn-admission.js +1 -31
  535. package/dist/core/runtime/broker/turn-ignition.js +1 -84
  536. package/dist/core/runtime/broker-cli.js +3 -81
  537. package/dist/core/runtime/broker-extension-render.js +5 -135
  538. package/dist/core/runtime/broker-inventory.js +1 -116
  539. package/dist/core/runtime/broker-persona-guidance.js +4 -154
  540. package/dist/core/runtime/broker-protocol.js +3 -152
  541. package/dist/core/runtime/broker-request.js +1 -85
  542. package/dist/core/runtime/broker-sdk.js +1 -129
  543. package/dist/core/runtime/broker.js +1 -1214
  544. package/dist/core/runtime/canvas-extensions.js +1 -96
  545. package/dist/core/runtime/chat-inventory-rows.js +1 -105
  546. package/dist/core/runtime/close.js +1 -265
  547. package/dist/core/runtime/command-expansion.js +9 -104
  548. package/dist/core/runtime/command-surface.js +1 -117
  549. package/dist/core/runtime/connectivity.js +1 -73
  550. package/dist/core/runtime/deliver-live.js +1 -88
  551. package/dist/core/runtime/fault-recovery.js +1 -83
  552. package/dist/core/runtime/fault.js +1 -17
  553. package/dist/core/runtime/fleet.js +1 -58
  554. package/dist/core/runtime/front-door-env.js +1 -16
  555. package/dist/core/runtime/front-door.js +7 -183
  556. package/dist/core/runtime/headless-pi.js +1 -161
  557. package/dist/core/runtime/host.js +1 -457
  558. package/dist/core/runtime/interactive-deliver.js +1 -51
  559. package/dist/core/runtime/invocation.js +0 -10
  560. package/dist/core/runtime/kickoff.js +30 -327
  561. package/dist/core/runtime/launch-config-worker.js +1 -12
  562. package/dist/core/runtime/launch-prompt.js +4 -13
  563. package/dist/core/runtime/launch-target.js +1 -55
  564. package/dist/core/runtime/launch.js +1 -483
  565. package/dist/core/runtime/lifecycle.js +2 -213
  566. package/dist/core/runtime/managed-provider-cooling.js +1 -62
  567. package/dist/core/runtime/memory.js +1 -17
  568. package/dist/core/runtime/model-registry.js +1 -13
  569. package/dist/core/runtime/model-selection.js +1 -135
  570. package/dist/core/runtime/model-swap.js +1 -86
  571. package/dist/core/runtime/naming.js +14 -298
  572. package/dist/core/runtime/nerd-font.js +2 -127
  573. package/dist/core/runtime/node-read.js +2 -386
  574. package/dist/core/runtime/nodes.js +1 -331
  575. package/dist/core/runtime/outcome-document.js +1 -97
  576. package/dist/core/runtime/package-health.js +4 -99
  577. package/dist/core/runtime/persona.js +2 -55
  578. package/dist/core/runtime/pi-cli.js +1 -65
  579. package/dist/core/runtime/pi-vendored.js +1 -66
  580. package/dist/core/runtime/placement-tmux.js +1 -81
  581. package/dist/core/runtime/placement.js +1 -386
  582. package/dist/core/runtime/promote.js +1 -174
  583. package/dist/core/runtime/prospective-inventory-cli.js +3 -61
  584. package/dist/core/runtime/prospective-inventory.js +2 -88
  585. package/dist/core/runtime/recap.js +27 -103
  586. package/dist/core/runtime/recycle.js +1 -190
  587. package/dist/core/runtime/reopen.js +1 -138
  588. package/dist/core/runtime/reset.js +1 -245
  589. package/dist/core/runtime/resume-root.js +10 -290
  590. package/dist/core/runtime/revive-all.js +1 -107
  591. package/dist/core/runtime/revive.js +4 -544
  592. package/dist/core/runtime/roadmap.js +4 -38
  593. package/dist/core/runtime/session-branch.js +1 -46
  594. package/dist/core/runtime/session-cycles.js +1 -110
  595. package/dist/core/runtime/session-list-cache.js +1 -406
  596. package/dist/core/runtime/session-visibility.js +1 -99
  597. package/dist/core/runtime/shell-expansion.js +9 -100
  598. package/dist/core/runtime/situational-context.js +2 -67
  599. package/dist/core/runtime/situational-live.js +1 -41
  600. package/dist/core/runtime/spawn-env.js +1 -255
  601. package/dist/core/runtime/spawn.js +3 -577
  602. package/dist/core/runtime/stamp/channel.js +1 -76
  603. package/dist/core/runtime/stamp/protocol.js +1 -113
  604. package/dist/core/runtime/stop-guard.js +7 -116
  605. package/dist/core/runtime/stop-signals.js +1 -46
  606. package/dist/core/runtime/stream-watchdog.js +1 -134
  607. package/dist/core/runtime/structured-output.js +4 -156
  608. package/dist/core/runtime/surface-bg.js +1 -85
  609. package/dist/core/runtime/tmux-bindings.js +4 -730
  610. package/dist/core/runtime/tmux-chrome.js +1 -5
  611. package/dist/core/runtime/tmux-driver.js +7 -637
  612. package/dist/core/runtime/tool-group-summary.js +6 -85
  613. package/dist/core/runtime/turn-visibility.js +1 -31
  614. package/dist/core/runtime/view-socket.js +1 -83
  615. package/dist/core/runtime/warm-pool.d.ts +3 -2
  616. package/dist/core/runtime/warm-pool.js +1 -385
  617. package/dist/core/scope.js +1 -254
  618. package/dist/core/scoped-state/db.js +1 -135
  619. package/dist/core/scoped-state/migrate.js +3 -181
  620. package/dist/core/scoped-state/paths.js +1 -27
  621. package/dist/core/scoped-state/profiles.js +1 -62
  622. package/dist/core/scoped-state/providers.js +1 -8
  623. package/dist/core/scoped-state/schema.js +3 -16
  624. package/dist/core/scoped-state/settings.js +1 -82
  625. package/dist/core/secrets.js +2 -55
  626. package/dist/core/self-update.js +1 -71
  627. package/dist/core/session-model/session-state.js +1 -180
  628. package/dist/core/shell-segments.js +4 -169
  629. package/dist/core/spawn.js +1 -26
  630. package/dist/core/stdout-errors.js +1 -14
  631. package/dist/core/subscription-state.js +3 -193
  632. package/dist/core/substrate/frontmatter-validation.js +1 -105
  633. package/dist/core/substrate/gate-explain.js +1 -424
  634. package/dist/core/substrate/gate.js +1 -26
  635. package/dist/core/substrate/index.js +1 -30
  636. package/dist/core/substrate/injected-store.js +1 -249
  637. package/dist/core/substrate/listings.js +1 -115
  638. package/dist/core/substrate/on-read-node.js +1 -36
  639. package/dist/core/substrate/on-read.js +9 -315
  640. package/dist/core/substrate/plan.js +1 -266
  641. package/dist/core/substrate/render-node.js +1 -30
  642. package/dist/core/substrate/render.js +65 -689
  643. package/dist/core/substrate/schema.js +1 -186
  644. package/dist/core/substrate/session-cache.js +1 -83
  645. package/dist/core/substrate/subject-fields.js +1 -35
  646. package/dist/core/substrate/subject.js +1 -47
  647. package/dist/core/substrate/surface-match.js +1 -242
  648. package/dist/core/termrender/code-doc.js +5 -92
  649. package/dist/core/termrender/display.js +2 -56
  650. package/dist/core/termrender/termrender.js +14 -719
  651. package/dist/core/termrender/version.js +1 -1
  652. package/dist/core/timing.js +2 -94
  653. package/dist/core/tui/draw.js +2 -378
  654. package/dist/core/tui/fuzzy.js +1 -38
  655. package/dist/core/tui/markdown.js +3 -407
  656. package/dist/core/tui/page-host.js +1 -74
  657. package/dist/core/tui/panel.js +1 -137
  658. package/dist/core/tui/terminal.js +2 -100
  659. package/dist/core/user-settings.js +1 -454
  660. package/dist/core/wake.js +1 -296
  661. package/dist/core/worktree-close.js +6 -228
  662. package/dist/core/worktree-containment.js +3 -48
  663. package/dist/core/worktree-landing.js +4 -56
  664. package/dist/core/worktree-mutation-async.js +10 -280
  665. package/dist/core/worktree-quarantine.js +1 -54
  666. package/dist/core/worktree-sweep.js +6 -453
  667. package/dist/core/worktree.js +18 -899
  668. package/dist/daemon/api/bridge.js +8 -418
  669. package/dist/daemon/api/handlers/attach.js +1 -65
  670. package/dist/daemon/api/handlers/bash-jobs.js +2 -91
  671. package/dist/daemon/api/handlers/broker-ops.js +1 -447
  672. package/dist/daemon/api/handlers/broker-recovery.js +1 -251
  673. package/dist/daemon/api/handlers/canvas.js +6 -490
  674. package/dist/daemon/api/handlers/chat-inventory.js +1 -25
  675. package/dist/daemon/api/handlers/crons.js +1 -373
  676. package/dist/daemon/api/handlers/daemon.js +1 -76
  677. package/dist/daemon/api/handlers/feedback-comments.js +3 -199
  678. package/dist/daemon/api/handlers/files.js +1 -63
  679. package/dist/daemon/api/handlers/focus.js +1 -92
  680. package/dist/daemon/api/handlers/health.js +1 -76
  681. package/dist/daemon/api/handlers/human-requests.js +1 -379
  682. package/dist/daemon/api/handlers/human.js +1 -3
  683. package/dist/daemon/api/handlers/inbox-page.js +1 -89
  684. package/dist/daemon/api/handlers/inbox.js +1 -301
  685. package/dist/daemon/api/handlers/memory.js +1 -50
  686. package/dist/daemon/api/handlers/messages.js +2 -506
  687. package/dist/daemon/api/handlers/model-config.js +1 -44
  688. package/dist/daemon/api/handlers/modelauth.js +1 -165
  689. package/dist/daemon/api/handlers/node-outcomes.js +1 -181
  690. package/dist/daemon/api/handlers/nodes.js +1 -943
  691. package/dist/daemon/api/handlers/profiles.js +1 -140
  692. package/dist/daemon/api/handlers/prospective-chat-inventory.js +1 -59
  693. package/dist/daemon/api/handlers/reports.js +16 -332
  694. package/dist/daemon/api/handlers/review-comments.js +1 -465
  695. package/dist/daemon/api/handlers/reviews.js +1 -200
  696. package/dist/daemon/api/handlers/subscriptions.js +1 -53
  697. package/dist/daemon/api/handlers/validate.js +1 -58
  698. package/dist/daemon/api/handlers/worktree.js +1 -39
  699. package/dist/daemon/api/map.js +2 -735
  700. package/dist/daemon/api/router.js +1 -190
  701. package/dist/daemon/api/server.js +11 -408
  702. package/dist/daemon/boot-migrations.js +1 -31
  703. package/dist/daemon/companion-retire.js +1 -34
  704. package/dist/daemon/control.js +1 -22
  705. package/dist/daemon/cron/armed-context.js +1 -100
  706. package/dist/daemon/cron/capture.js +2 -45
  707. package/dist/daemon/cron/disposition.js +1 -55
  708. package/dist/daemon/cron/escalation.js +3 -124
  709. package/dist/daemon/cron/held.js +1 -20
  710. package/dist/daemon/cron/lease-recovery.js +1 -119
  711. package/dist/daemon/cron/live-runs.js +1 -23
  712. package/dist/daemon/cron/passes.js +1 -58
  713. package/dist/daemon/cron/settle.js +1 -61
  714. package/dist/daemon/cron/sinks.js +2 -59
  715. package/dist/daemon/cron-run.js +1 -405
  716. package/dist/daemon/crtrd-cli.js +1 -23
  717. package/dist/daemon/crtrd.js +8 -854
  718. package/dist/daemon/delivery/run-delivery.js +1 -164
  719. package/dist/daemon/fleet.js +17 -475
  720. package/dist/daemon/human/finish.js +10 -179
  721. package/dist/daemon/human/settle.js +1 -89
  722. package/dist/daemon/human/sweep.js +1 -66
  723. package/dist/daemon/manage.js +2 -595
  724. package/dist/daemon/messaging/node-message.js +1 -99
  725. package/dist/daemon/park-activity.js +1 -30
  726. package/dist/daemon/park-pending.js +1 -52
  727. package/dist/daemon/pidfile.js +1 -37
  728. package/dist/daemon/profile-delete.js +1 -306
  729. package/dist/daemon/reconcilers/bash-deadline.js +1 -80
  730. package/dist/daemon/reconcilers/broker-supervision.js +4 -761
  731. package/dist/daemon/reconcilers/controller-death.js +1 -14
  732. package/dist/daemon/reconcilers/cron-lane.js +1 -29
  733. package/dist/daemon/reconcilers/delivery-lane.js +1 -130
  734. package/dist/daemon/reconcilers/live-obligation.js +1 -87
  735. package/dist/daemon/reconcilers/managed-worktree-sweep.js +1 -202
  736. package/dist/daemon/reconcilers/node-deadline.js +1 -82
  737. package/dist/daemon/reconcilers/node-lifecycle/freeze-lane.js +1 -172
  738. package/dist/daemon/reconcilers/node-lifecycle/respawn-policy.js +1 -59
  739. package/dist/daemon/reconcilers/node-lifecycle/terminating.js +1 -12
  740. package/dist/daemon/reconcilers/node-lifecycle/tick.js +1 -146
  741. package/dist/daemon/reconcilers/node-lifecycle/wants-execution.js +1 -11
  742. package/dist/daemon/reconcilers/pending-review-submit.js +1 -36
  743. package/dist/daemon/reconcilers/storage-maintenance.js +1 -207
  744. package/dist/daemon/review/comment-notify.js +2 -109
  745. package/dist/daemon/review/companion.js +1 -29
  746. package/dist/daemon/review/deliver.js +3 -8
  747. package/dist/daemon/review/finish.js +1 -122
  748. package/dist/daemon/review/sweep.js +1 -18
  749. package/dist/daemon/startup-policy.js +1 -1
  750. package/dist/daemon/supervise-cadence.js +1 -6
  751. package/dist/hook-authoring.js +5 -447
  752. package/dist/hook-process.js +1 -34
  753. package/dist/index.js +1 -52
  754. package/dist/migrations/001-surfaces-frontmatter.js +1 -161
  755. package/dist/migrations/002-profile-project-memory.js +1 -72
  756. package/dist/migrations/003-repository-root-memory-identity/front-door.js +11 -231
  757. package/dist/migrations/003-repository-root-memory-identity/index.js +5 -513
  758. package/dist/migrations/003-repository-root-memory-identity/references.js +5 -469
  759. package/dist/migrations/003-repository-root-memory-identity/repository-facts.js +3 -349
  760. package/dist/migrations/activation.js +2 -89
  761. package/dist/migrations/convergent.js +2 -82
  762. package/dist/migrations/corpus.js +3 -483
  763. package/dist/migrations/frontmatter-splice.js +8 -176
  764. package/dist/migrations/profile-manifests.js +2 -70
  765. package/dist/migrations/registry.js +1 -42
  766. package/dist/migrations/runner.js +1 -85
  767. package/dist/migrations/types.js +0 -24
  768. package/dist/pi-extensions/broker-local.js +2 -106
  769. package/dist/pi-extensions/canvas-bash-valve.js +7 -461
  770. package/dist/pi-extensions/canvas-context-intro.js +2 -113
  771. package/dist/pi-extensions/canvas-doc-substrate.js +9 -178
  772. package/dist/pi-extensions/canvas-goal-capture.js +1 -83
  773. package/dist/pi-extensions/canvas-inbox-watcher.js +1 -1010
  774. package/dist/pi-extensions/canvas-passive-context.js +14 -203
  775. package/dist/pi-extensions/canvas-preview-result.js +2 -72
  776. package/dist/pi-extensions/canvas-prompt-scrub.js +2 -54
  777. package/dist/pi-extensions/canvas-recap.js +11 -405
  778. package/dist/pi-extensions/canvas-review-boundary.js +3 -63
  779. package/dist/pi-extensions/canvas-stamp.js +2 -77
  780. package/dist/pi-extensions/canvas-stophook.js +1 -643
  781. package/dist/pi-extensions/canvas-structured-output.js +13 -35
  782. package/dist/pi-extensions/canvas-tool-guide.js +9 -78
  783. package/dist/pi-extensions/envelope-merge.js +8 -29
  784. package/dist/prompts/review.js +20 -42
  785. package/dist/shared/birth-announcement.js +1 -25
  786. package/dist/shared/crtr-version.js +1 -18
  787. package/dist/shared/env.js +1 -214
  788. package/dist/shared/generated-context.js +11 -226
  789. package/dist/shared/predicates.js +1 -4
  790. package/dist/shared/shell-quote.js +1 -5
  791. package/dist/shared/tool-groups.js +1 -64
  792. package/dist/shared/working-activity.js +1 -27
  793. package/dist/suppress-experimental-warnings.js +1 -15
  794. package/dist/types.js +1 -185
  795. package/docs/public-api.md +10 -9
  796. package/package.json +6 -5
  797. package/runtime.lock.json +5 -5
  798. package/dist/api/__tests__/integration/client.test.d.ts +0 -1
  799. package/dist/api/__tests__/integration/client.test.js +0 -163
  800. package/dist/builtin-pi-packages/pi-crtr-extensions/__tests__/insights-active-init.test.ts +0 -98
  801. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/__tests__/crtr-commands.test.ts +0 -93
  802. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/__tests__/integration/provider-rotation.test.ts +0 -2530
  803. package/dist/clients/__tests__/helpers/human-daemon.d.ts +0 -11
  804. package/dist/clients/__tests__/helpers/human-daemon.js +0 -60
  805. package/dist/clients/attach/__tests__/attach-remote-readonly.test.d.ts +0 -1
  806. package/dist/clients/attach/__tests__/attach-remote-readonly.test.js +0 -97
  807. package/dist/clients/attach/__tests__/bash-call-width.test.d.ts +0 -1
  808. package/dist/clients/attach/__tests__/bash-call-width.test.js +0 -38
  809. package/dist/clients/attach/__tests__/chat-view-snapshot-ordering.test.d.ts +0 -1
  810. package/dist/clients/attach/__tests__/chat-view-snapshot-ordering.test.js +0 -175
  811. package/dist/clients/attach/__tests__/completion-frecency.test.d.ts +0 -1
  812. package/dist/clients/attach/__tests__/completion-frecency.test.js +0 -35
  813. package/dist/clients/attach/__tests__/context-message.test.d.ts +0 -1
  814. package/dist/clients/attach/__tests__/context-message.test.js +0 -130
  815. package/dist/clients/attach/__tests__/crtr-output.test.d.ts +0 -1
  816. package/dist/clients/attach/__tests__/crtr-output.test.js +0 -68
  817. package/dist/clients/attach/__tests__/diagram.test.d.ts +0 -1
  818. package/dist/clients/attach/__tests__/diagram.test.js +0 -42
  819. package/dist/clients/attach/__tests__/edit-diff.test.d.ts +0 -1
  820. package/dist/clients/attach/__tests__/edit-diff.test.js +0 -31
  821. package/dist/clients/attach/__tests__/frame-selection.test.d.ts +0 -1
  822. package/dist/clients/attach/__tests__/frame-selection.test.js +0 -84
  823. package/dist/clients/attach/__tests__/group-activity.test.d.ts +0 -1
  824. package/dist/clients/attach/__tests__/group-activity.test.js +0 -165
  825. package/dist/clients/attach/__tests__/oauth-dialog-lifecycle.test.d.ts +0 -1
  826. package/dist/clients/attach/__tests__/oauth-dialog-lifecycle.test.js +0 -83
  827. package/dist/clients/attach/__tests__/pane-tag-successor.test.d.ts +0 -1
  828. package/dist/clients/attach/__tests__/pane-tag-successor.test.js +0 -56
  829. package/dist/clients/attach/__tests__/profile-files.test.d.ts +0 -1
  830. package/dist/clients/attach/__tests__/profile-files.test.js +0 -21
  831. package/dist/clients/attach/__tests__/prompt-preview.test.d.ts +0 -1
  832. package/dist/clients/attach/__tests__/prompt-preview.test.js +0 -21
  833. package/dist/clients/attach/__tests__/ref-autocomplete.test.d.ts +0 -1
  834. package/dist/clients/attach/__tests__/ref-autocomplete.test.js +0 -64
  835. package/dist/clients/attach/__tests__/titled-editor-paste.test.d.ts +0 -1
  836. package/dist/clients/attach/__tests__/titled-editor-paste.test.js +0 -114
  837. package/dist/clients/attach/__tests__/titled-editor-preview.test.d.ts +0 -1
  838. package/dist/clients/attach/__tests__/titled-editor-preview.test.js +0 -83
  839. package/dist/clients/inbox/__tests__/integration/inbox-controller.test.d.ts +0 -1
  840. package/dist/clients/inbox/__tests__/integration/inbox-controller.test.js +0 -81
  841. package/dist/clients/inbox/__tests__/integration/mount-panel.test.d.ts +0 -1
  842. package/dist/clients/inbox/__tests__/integration/mount-panel.test.js +0 -135
  843. package/dist/clients/inbox/__tests__/integration/stale-row-activation.test.d.ts +0 -1
  844. package/dist/clients/inbox/__tests__/integration/stale-row-activation.test.js +0 -66
  845. package/dist/clients/inbox/review/__tests__/editor-roundtrip.test.d.ts +0 -1
  846. package/dist/clients/inbox/review/__tests__/editor-roundtrip.test.js +0 -35
  847. package/dist/clients/inbox/review/__tests__/review-core.test.d.ts +0 -1
  848. package/dist/clients/inbox/review/__tests__/review-core.test.js +0 -52
  849. package/dist/clients/inbox/review/__tests__/teardown-notice.test.d.ts +0 -1
  850. package/dist/clients/inbox/review/__tests__/teardown-notice.test.js +0 -100
  851. package/dist/commands/__tests__/api-client-cold-start-diagnostic.test.d.ts +0 -1
  852. package/dist/commands/__tests__/api-client-cold-start-diagnostic.test.js +0 -69
  853. package/dist/commands/__tests__/human.test.d.ts +0 -1
  854. package/dist/commands/__tests__/human.test.js +0 -172
  855. package/dist/commands/__tests__/integration/dashboard-snapshot.test.d.ts +0 -1
  856. package/dist/commands/__tests__/integration/dashboard-snapshot.test.js +0 -237
  857. package/dist/commands/__tests__/integration/migrate.test.d.ts +0 -1
  858. package/dist/commands/__tests__/integration/migrate.test.js +0 -1330
  859. package/dist/commands/__tests__/node-message.test.d.ts +0 -1
  860. package/dist/commands/__tests__/node-message.test.js +0 -112
  861. package/dist/commands/__tests__/node-new.test.d.ts +0 -1
  862. package/dist/commands/__tests__/node-new.test.js +0 -58
  863. package/dist/commands/__tests__/revive-now-gate.test.d.ts +0 -1
  864. package/dist/commands/__tests__/revive-now-gate.test.js +0 -62
  865. package/dist/commands/__tests__/seam/daemon-status.test.d.ts +0 -1
  866. package/dist/commands/__tests__/seam/daemon-status.test.js +0 -29
  867. package/dist/commands/__tests__/surface-reload-target.test.d.ts +0 -1
  868. package/dist/commands/__tests__/surface-reload-target.test.js +0 -21
  869. package/dist/commands/memory/__tests__/command-selector-and-mutation-guards.test.d.ts +0 -1
  870. package/dist/commands/memory/__tests__/command-selector-and-mutation-guards.test.js +0 -379
  871. package/dist/commands/memory/__tests__/memory-list-and-lint-ignore.test.d.ts +0 -1
  872. package/dist/commands/memory/__tests__/memory-list-and-lint-ignore.test.js +0 -124
  873. package/dist/commands/memory/__tests__/repository-root-lint.test.d.ts +0 -1
  874. package/dist/commands/memory/__tests__/repository-root-lint.test.js +0 -148
  875. package/dist/commands/sys/__tests__/config-model-ladders.test.d.ts +0 -1
  876. package/dist/commands/sys/__tests__/config-model-ladders.test.js +0 -114
  877. package/dist/commands/sys/__tests__/setup-core.test.d.ts +0 -1
  878. package/dist/commands/sys/__tests__/setup-core.test.js +0 -45
  879. package/dist/commands/sys/__tests__/sync-project-guidance.test.d.ts +0 -1
  880. package/dist/commands/sys/__tests__/sync-project-guidance.test.js +0 -244
  881. package/dist/core/__tests__/bash-guard.test.d.ts +0 -1
  882. package/dist/core/__tests__/bash-guard.test.js +0 -190
  883. package/dist/core/__tests__/boot-fault-attempt.test.d.ts +0 -1
  884. package/dist/core/__tests__/boot-fault-attempt.test.js +0 -105
  885. package/dist/core/__tests__/boot.test.d.ts +0 -1
  886. package/dist/core/__tests__/boot.test.js +0 -274
  887. package/dist/core/__tests__/branded-host-concurrency.test.d.ts +0 -1
  888. package/dist/core/__tests__/branded-host-concurrency.test.js +0 -72
  889. package/dist/core/__tests__/broker-extension-canvas-db-boundary.test.d.ts +0 -1
  890. package/dist/core/__tests__/broker-extension-canvas-db-boundary.test.js +0 -75
  891. package/dist/core/__tests__/broker-launch-candidates.test.d.ts +0 -1
  892. package/dist/core/__tests__/broker-launch-candidates.test.js +0 -311
  893. package/dist/core/__tests__/broker-preflight.test.d.ts +0 -1
  894. package/dist/core/__tests__/broker-preflight.test.js +0 -95
  895. package/dist/core/__tests__/broker-stream-watchdog-floor.test.d.ts +0 -1
  896. package/dist/core/__tests__/broker-stream-watchdog-floor.test.js +0 -82
  897. package/dist/core/__tests__/broker-turn-admission.test.d.ts +0 -1
  898. package/dist/core/__tests__/broker-turn-admission.test.js +0 -44
  899. package/dist/core/__tests__/canvas-db-boundary.test.d.ts +0 -1
  900. package/dist/core/__tests__/canvas-db-boundary.test.js +0 -46
  901. package/dist/core/__tests__/canvas-inbox-watcher-hold.test.d.ts +0 -1
  902. package/dist/core/__tests__/canvas-inbox-watcher-hold.test.js +0 -710
  903. package/dist/core/__tests__/canvas-inbox-watcher-naming.test.d.ts +0 -1
  904. package/dist/core/__tests__/canvas-inbox-watcher-naming.test.js +0 -310
  905. package/dist/core/__tests__/canvas-inbox-watcher.test.d.ts +0 -1
  906. package/dist/core/__tests__/canvas-inbox-watcher.test.js +0 -397
  907. package/dist/core/__tests__/canvas.test.d.ts +0 -1
  908. package/dist/core/__tests__/canvas.test.js +0 -138
  909. package/dist/core/__tests__/child-death-wake.test.d.ts +0 -1
  910. package/dist/core/__tests__/child-death-wake.test.js +0 -153
  911. package/dist/core/__tests__/cli-help-contract.test.d.ts +0 -1
  912. package/dist/core/__tests__/cli-help-contract.test.js +0 -152
  913. package/dist/core/__tests__/close.test.d.ts +0 -1
  914. package/dist/core/__tests__/close.test.js +0 -284
  915. package/dist/core/__tests__/collectible.test.d.ts +0 -1
  916. package/dist/core/__tests__/collectible.test.js +0 -89
  917. package/dist/core/__tests__/config-change-delta.test.d.ts +0 -1
  918. package/dist/core/__tests__/config-change-delta.test.js +0 -108
  919. package/dist/core/__tests__/context-intro.test.d.ts +0 -1
  920. package/dist/core/__tests__/context-intro.test.js +0 -123
  921. package/dist/core/__tests__/cron-armed-context-failure.test.d.ts +0 -1
  922. package/dist/core/__tests__/cron-armed-context-failure.test.js +0 -150
  923. package/dist/core/__tests__/cron-held-settlement.test.d.ts +0 -1
  924. package/dist/core/__tests__/cron-held-settlement.test.js +0 -240
  925. package/dist/core/__tests__/cron-node-sink-parked-root.test.d.ts +0 -1
  926. package/dist/core/__tests__/cron-node-sink-parked-root.test.js +0 -166
  927. package/dist/core/__tests__/cron-self-cancel-delivery.test.d.ts +0 -1
  928. package/dist/core/__tests__/cron-self-cancel-delivery.test.js +0 -84
  929. package/dist/core/__tests__/cron-timeout-descendants.test.d.ts +0 -1
  930. package/dist/core/__tests__/cron-timeout-descendants.test.js +0 -114
  931. package/dist/core/__tests__/daemon-boot.test.d.ts +0 -1
  932. package/dist/core/__tests__/daemon-boot.test.js +0 -422
  933. package/dist/core/__tests__/daemon-wedge.test.d.ts +0 -1
  934. package/dist/core/__tests__/daemon-wedge.test.js +0 -106
  935. package/dist/core/__tests__/dead-node-policy-table.test.d.ts +0 -1
  936. package/dist/core/__tests__/dead-node-policy-table.test.js +0 -77
  937. package/dist/core/__tests__/events-contract.test.d.ts +0 -1
  938. package/dist/core/__tests__/events-contract.test.js +0 -76
  939. package/dist/core/__tests__/extension-abort.test.d.ts +0 -1
  940. package/dist/core/__tests__/extension-abort.test.js +0 -21
  941. package/dist/core/__tests__/fault-classifier.test.d.ts +0 -1
  942. package/dist/core/__tests__/fault-classifier.test.js +0 -138
  943. package/dist/core/__tests__/fixtures/api-server-host.d.ts +0 -1
  944. package/dist/core/__tests__/fixtures/api-server-host.js +0 -47
  945. package/dist/core/__tests__/fixtures/c3-custom-provider-ext.d.ts +0 -2
  946. package/dist/core/__tests__/fixtures/c3-custom-provider-ext.js +0 -34
  947. package/dist/core/__tests__/fixtures/c5-command-boundary-ext.d.ts +0 -2
  948. package/dist/core/__tests__/fixtures/c5-command-boundary-ext.js +0 -32
  949. package/dist/core/__tests__/fixtures/fake-engine.d.ts +0 -347
  950. package/dist/core/__tests__/fixtures/fake-engine.js +0 -1509
  951. package/dist/core/__tests__/fixtures/fake-pi-host.d.ts +0 -2
  952. package/dist/core/__tests__/fixtures/fake-pi-host.js +0 -311
  953. package/dist/core/__tests__/fixtures/memory-slash-live-probe.d.ts +0 -1
  954. package/dist/core/__tests__/fixtures/memory-slash-live-probe.js +0 -75
  955. package/dist/core/__tests__/fixtures/metadata-migration-race.d.ts +0 -1
  956. package/dist/core/__tests__/fixtures/metadata-migration-race.js +0 -49
  957. package/dist/core/__tests__/focuses.test.d.ts +0 -1
  958. package/dist/core/__tests__/focuses.test.js +0 -113
  959. package/dist/core/__tests__/fs-utils.test.d.ts +0 -1
  960. package/dist/core/__tests__/fs-utils.test.js +0 -50
  961. package/dist/core/__tests__/helpers/broker-clients.d.ts +0 -43
  962. package/dist/core/__tests__/helpers/broker-clients.js +0 -174
  963. package/dist/core/__tests__/helpers/fleet.d.ts +0 -12
  964. package/dist/core/__tests__/helpers/fleet.js +0 -50
  965. package/dist/core/__tests__/helpers/harness.d.ts +0 -124
  966. package/dist/core/__tests__/helpers/harness.js +0 -806
  967. package/dist/core/__tests__/helpers/viewer-panes.d.ts +0 -12
  968. package/dist/core/__tests__/helpers/viewer-panes.js +0 -133
  969. package/dist/core/__tests__/history-inbox.test.d.ts +0 -1
  970. package/dist/core/__tests__/history-inbox.test.js +0 -121
  971. package/dist/core/__tests__/human-action-delivery.test.d.ts +0 -1
  972. package/dist/core/__tests__/human-action-delivery.test.js +0 -162
  973. package/dist/core/__tests__/human-actions.test.d.ts +0 -1
  974. package/dist/core/__tests__/human-actions.test.js +0 -120
  975. package/dist/core/__tests__/inline-memory-refs.test.d.ts +0 -1
  976. package/dist/core/__tests__/inline-memory-refs.test.js +0 -225
  977. package/dist/core/__tests__/integration/broker-fork-seam.test.d.ts +0 -1
  978. package/dist/core/__tests__/integration/broker-fork-seam.test.js +0 -193
  979. package/dist/core/__tests__/integration/broker-sdk-wiring.test.d.ts +0 -1
  980. package/dist/core/__tests__/integration/broker-sdk-wiring.test.js +0 -750
  981. package/dist/core/__tests__/integration/broker-snapshot-history.test.d.ts +0 -1
  982. package/dist/core/__tests__/integration/broker-snapshot-history.test.js +0 -288
  983. package/dist/core/__tests__/integration/broker-wedge-supervision.test.d.ts +0 -1
  984. package/dist/core/__tests__/integration/broker-wedge-supervision.test.js +0 -103
  985. package/dist/core/__tests__/integration/command-plugins.test.d.ts +0 -1
  986. package/dist/core/__tests__/integration/command-plugins.test.js +0 -1200
  987. package/dist/core/__tests__/integration/deferred-no-wake.test.d.ts +0 -1
  988. package/dist/core/__tests__/integration/deferred-no-wake.test.js +0 -610
  989. package/dist/core/__tests__/integration/flagship-lifecycle.test.d.ts +0 -1
  990. package/dist/core/__tests__/integration/flagship-lifecycle.test.js +0 -264
  991. package/dist/core/__tests__/integration/fresh-home-commands.test.d.ts +0 -1
  992. package/dist/core/__tests__/integration/fresh-home-commands.test.js +0 -49
  993. package/dist/core/__tests__/integration/git-optional-locks.test.d.ts +0 -1
  994. package/dist/core/__tests__/integration/git-optional-locks.test.js +0 -81
  995. package/dist/core/__tests__/integration/host-teardown-process-group.test.d.ts +0 -1
  996. package/dist/core/__tests__/integration/host-teardown-process-group.test.js +0 -480
  997. package/dist/core/__tests__/integration/lifecycle-hooks.test.d.ts +0 -1
  998. package/dist/core/__tests__/integration/lifecycle-hooks.test.js +0 -498
  999. package/dist/core/__tests__/integration/live-mutation-verbs.test.d.ts +0 -1
  1000. package/dist/core/__tests__/integration/live-mutation-verbs.test.js +0 -180
  1001. package/dist/core/__tests__/integration/live-mutation.test.d.ts +0 -1
  1002. package/dist/core/__tests__/integration/live-mutation.test.js +0 -173
  1003. package/dist/core/__tests__/integration/plugin-revalidate.test.d.ts +0 -1
  1004. package/dist/core/__tests__/integration/plugin-revalidate.test.js +0 -359
  1005. package/dist/core/__tests__/integration/profile-pause.test.d.ts +0 -1
  1006. package/dist/core/__tests__/integration/profile-pause.test.js +0 -115
  1007. package/dist/core/__tests__/integration/refresh-stall-recycle.test.d.ts +0 -1
  1008. package/dist/core/__tests__/integration/refresh-stall-recycle.test.js +0 -151
  1009. package/dist/core/__tests__/integration/revive.test.d.ts +0 -1
  1010. package/dist/core/__tests__/integration/revive.test.js +0 -615
  1011. package/dist/core/__tests__/integration/spawn-root.test.d.ts +0 -1
  1012. package/dist/core/__tests__/integration/spawn-root.test.js +0 -536
  1013. package/dist/core/__tests__/integration/subscription-delivery.test.d.ts +0 -1
  1014. package/dist/core/__tests__/integration/subscription-delivery.test.js +0 -132
  1015. package/dist/core/__tests__/integration/tmux-surface.test.d.ts +0 -1
  1016. package/dist/core/__tests__/integration/tmux-surface.test.js +0 -330
  1017. package/dist/core/__tests__/integration/worktree-land.test.d.ts +0 -1
  1018. package/dist/core/__tests__/integration/worktree-land.test.js +0 -607
  1019. package/dist/core/__tests__/integration/worktree-reap.test.d.ts +0 -1
  1020. package/dist/core/__tests__/integration/worktree-reap.test.js +0 -842
  1021. package/dist/core/__tests__/kickoff.test.d.ts +0 -1
  1022. package/dist/core/__tests__/kickoff.test.js +0 -196
  1023. package/dist/core/__tests__/lifecycle-terminal-reasons.test.d.ts +0 -1
  1024. package/dist/core/__tests__/lifecycle-terminal-reasons.test.js +0 -62
  1025. package/dist/core/__tests__/lifecycle.test.d.ts +0 -1
  1026. package/dist/core/__tests__/lifecycle.test.js +0 -176
  1027. package/dist/core/__tests__/live-lifecycle-prompt.test.d.ts +0 -1
  1028. package/dist/core/__tests__/live-lifecycle-prompt.test.js +0 -63
  1029. package/dist/core/__tests__/memory-resolver-precedence.test.d.ts +0 -1
  1030. package/dist/core/__tests__/memory-resolver-precedence.test.js +0 -228
  1031. package/dist/core/__tests__/migration.test.d.ts +0 -1
  1032. package/dist/core/__tests__/migration.test.js +0 -946
  1033. package/dist/core/__tests__/model-pin-durability.test.d.ts +0 -1
  1034. package/dist/core/__tests__/model-pin-durability.test.js +0 -195
  1035. package/dist/core/__tests__/model-routes-config.test.d.ts +0 -1
  1036. package/dist/core/__tests__/model-routes-config.test.js +0 -150
  1037. package/dist/core/__tests__/nested-store-discovery.test.d.ts +0 -1
  1038. package/dist/core/__tests__/nested-store-discovery.test.js +0 -89
  1039. package/dist/core/__tests__/node-outcome.test.d.ts +0 -1
  1040. package/dist/core/__tests__/node-outcome.test.js +0 -246
  1041. package/dist/core/__tests__/on-read-crouter-home-fence.test.d.ts +0 -1
  1042. package/dist/core/__tests__/on-read-crouter-home-fence.test.js +0 -66
  1043. package/dist/core/__tests__/on-read-dedup-resume.test.d.ts +0 -1
  1044. package/dist/core/__tests__/on-read-dedup-resume.test.js +0 -132
  1045. package/dist/core/__tests__/on-read-nested-store.test.d.ts +0 -1
  1046. package/dist/core/__tests__/on-read-nested-store.test.js +0 -135
  1047. package/dist/core/__tests__/parse-argv-stdin-secret.test.d.ts +0 -1
  1048. package/dist/core/__tests__/parse-argv-stdin-secret.test.js +0 -68
  1049. package/dist/core/__tests__/passive-subscription.test.d.ts +0 -1
  1050. package/dist/core/__tests__/passive-subscription.test.js +0 -120
  1051. package/dist/core/__tests__/pid-identity-match.test.d.ts +0 -1
  1052. package/dist/core/__tests__/pid-identity-match.test.js +0 -145
  1053. package/dist/core/__tests__/pid-zombie.test.d.ts +0 -1
  1054. package/dist/core/__tests__/pid-zombie.test.js +0 -42
  1055. package/dist/core/__tests__/plugin-kinds.test.d.ts +0 -1
  1056. package/dist/core/__tests__/plugin-kinds.test.js +0 -182
  1057. package/dist/core/__tests__/plugin-link-symlinked-scope-root.test.d.ts +0 -1
  1058. package/dist/core/__tests__/plugin-link-symlinked-scope-root.test.js +0 -43
  1059. package/dist/core/__tests__/plugin-page-components.test.d.ts +0 -1
  1060. package/dist/core/__tests__/plugin-page-components.test.js +0 -159
  1061. package/dist/core/__tests__/preview-mirror-cap.test.d.ts +0 -1
  1062. package/dist/core/__tests__/preview-mirror-cap.test.js +0 -53
  1063. package/dist/core/__tests__/preview-registry-sync.test.d.ts +0 -1
  1064. package/dist/core/__tests__/preview-registry-sync.test.js +0 -107
  1065. package/dist/core/__tests__/profile-project-memory-delivery.test.d.ts +0 -1
  1066. package/dist/core/__tests__/profile-project-memory-delivery.test.js +0 -644
  1067. package/dist/core/__tests__/prospective-inventory-capability-parity.test.d.ts +0 -1
  1068. package/dist/core/__tests__/prospective-inventory-capability-parity.test.js +0 -91
  1069. package/dist/core/__tests__/prune.test.d.ts +0 -1
  1070. package/dist/core/__tests__/prune.test.js +0 -243
  1071. package/dist/core/__tests__/push-final-guard.test.d.ts +0 -1
  1072. package/dist/core/__tests__/push-final-guard.test.js +0 -191
  1073. package/dist/core/__tests__/relaunch-root.test.d.ts +0 -1
  1074. package/dist/core/__tests__/relaunch-root.test.js +0 -249
  1075. package/dist/core/__tests__/remote-canvas-target.test.d.ts +0 -1
  1076. package/dist/core/__tests__/remote-canvas-target.test.js +0 -93
  1077. package/dist/core/__tests__/repository-association.test.d.ts +0 -1
  1078. package/dist/core/__tests__/repository-association.test.js +0 -153
  1079. package/dist/core/__tests__/repository-root-identity.test.d.ts +0 -1
  1080. package/dist/core/__tests__/repository-root-identity.test.js +0 -223
  1081. package/dist/core/__tests__/respawn-throttle.test.d.ts +0 -1
  1082. package/dist/core/__tests__/respawn-throttle.test.js +0 -20
  1083. package/dist/core/__tests__/review-model-floor.test.d.ts +0 -1
  1084. package/dist/core/__tests__/review-model-floor.test.js +0 -83
  1085. package/dist/core/__tests__/revive-all.test.d.ts +0 -1
  1086. package/dist/core/__tests__/revive-all.test.js +0 -157
  1087. package/dist/core/__tests__/revive-capacity.test.d.ts +0 -1
  1088. package/dist/core/__tests__/revive-capacity.test.js +0 -184
  1089. package/dist/core/__tests__/revive-parked-fresh.test.d.ts +0 -1
  1090. package/dist/core/__tests__/revive-parked-fresh.test.js +0 -176
  1091. package/dist/core/__tests__/scope-crouter-home-fence.test.d.ts +0 -1
  1092. package/dist/core/__tests__/scope-crouter-home-fence.test.js +0 -55
  1093. package/dist/core/__tests__/seam/broker-attach-multiclient.test.d.ts +0 -1
  1094. package/dist/core/__tests__/seam/broker-attach-multiclient.test.js +0 -262
  1095. package/dist/core/__tests__/seam/broker-attach-stream.test.d.ts +0 -1
  1096. package/dist/core/__tests__/seam/broker-attach-stream.test.js +0 -176
  1097. package/dist/core/__tests__/seam/broker-cap-freeze.test.d.ts +0 -1
  1098. package/dist/core/__tests__/seam/broker-cap-freeze.test.js +0 -155
  1099. package/dist/core/__tests__/seam/broker-crash-teardown.test.d.ts +0 -1
  1100. package/dist/core/__tests__/seam/broker-crash-teardown.test.js +0 -131
  1101. package/dist/core/__tests__/seam/broker-pane-resolution.test.d.ts +0 -1
  1102. package/dist/core/__tests__/seam/broker-pane-resolution.test.js +0 -204
  1103. package/dist/core/__tests__/seam/broker-provider-retry.test.d.ts +0 -1
  1104. package/dist/core/__tests__/seam/broker-provider-retry.test.js +0 -686
  1105. package/dist/core/__tests__/seam/broker-startup-diagnostics.test.d.ts +0 -1
  1106. package/dist/core/__tests__/seam/broker-startup-diagnostics.test.js +0 -82
  1107. package/dist/core/__tests__/seam/broker-whip-interrupt.test.d.ts +0 -1
  1108. package/dist/core/__tests__/seam/broker-whip-interrupt.test.js +0 -50
  1109. package/dist/core/__tests__/seam/deadline-wake-delivery.test.d.ts +0 -1
  1110. package/dist/core/__tests__/seam/deadline-wake-delivery.test.js +0 -138
  1111. package/dist/core/__tests__/seam/dormancy-release.test.d.ts +0 -1
  1112. package/dist/core/__tests__/seam/dormancy-release.test.js +0 -516
  1113. package/dist/core/__tests__/seam/held-deferred-human-prompt.test.d.ts +0 -1
  1114. package/dist/core/__tests__/seam/held-deferred-human-prompt.test.js +0 -65
  1115. package/dist/core/__tests__/seam/inbox-reference-guidance.test.d.ts +0 -1
  1116. package/dist/core/__tests__/seam/inbox-reference-guidance.test.js +0 -84
  1117. package/dist/core/__tests__/seam/memory-slash-node-relative-inventory.test.d.ts +0 -1
  1118. package/dist/core/__tests__/seam/memory-slash-node-relative-inventory.test.js +0 -160
  1119. package/dist/core/__tests__/seam/node-outcome-delivery.test.d.ts +0 -1
  1120. package/dist/core/__tests__/seam/node-outcome-delivery.test.js +0 -177
  1121. package/dist/core/__tests__/seam/prospective-inventory-stdout.test.d.ts +0 -1
  1122. package/dist/core/__tests__/seam/prospective-inventory-stdout.test.js +0 -31
  1123. package/dist/core/__tests__/seam/reopen-invalidated-worktree.test.d.ts +0 -1
  1124. package/dist/core/__tests__/seam/reopen-invalidated-worktree.test.js +0 -60
  1125. package/dist/core/__tests__/seam/self-close-teardown.test.d.ts +0 -1
  1126. package/dist/core/__tests__/seam/self-close-teardown.test.js +0 -49
  1127. package/dist/core/__tests__/seam/yield-refresh-transaction.test.d.ts +0 -1
  1128. package/dist/core/__tests__/seam/yield-refresh-transaction.test.js +0 -100
  1129. package/dist/core/__tests__/secrets.test.d.ts +0 -1
  1130. package/dist/core/__tests__/secrets.test.js +0 -49
  1131. package/dist/core/__tests__/self-update.test.d.ts +0 -1
  1132. package/dist/core/__tests__/self-update.test.js +0 -46
  1133. package/dist/core/__tests__/session-branch.test.d.ts +0 -1
  1134. package/dist/core/__tests__/session-branch.test.js +0 -61
  1135. package/dist/core/__tests__/session-cycles.test.d.ts +0 -1
  1136. package/dist/core/__tests__/session-cycles.test.js +0 -133
  1137. package/dist/core/__tests__/session-model.test.d.ts +0 -1
  1138. package/dist/core/__tests__/session-model.test.js +0 -111
  1139. package/dist/core/__tests__/spawn-worktree-id-conflict.test.d.ts +0 -1
  1140. package/dist/core/__tests__/spawn-worktree-id-conflict.test.js +0 -71
  1141. package/dist/core/__tests__/stdin-body-no-discard.test.d.ts +0 -1
  1142. package/dist/core/__tests__/stdin-body-no-discard.test.js +0 -33
  1143. package/dist/core/__tests__/stdout-errors.test.d.ts +0 -1
  1144. package/dist/core/__tests__/stdout-errors.test.js +0 -16
  1145. package/dist/core/__tests__/stop-guard.test.d.ts +0 -1
  1146. package/dist/core/__tests__/stop-guard.test.js +0 -237
  1147. package/dist/core/__tests__/stream-watchdog.test.d.ts +0 -1
  1148. package/dist/core/__tests__/stream-watchdog.test.js +0 -154
  1149. package/dist/core/__tests__/subscription-pool-credential-guard.test.d.ts +0 -1
  1150. package/dist/core/__tests__/subscription-pool-credential-guard.test.js +0 -95
  1151. package/dist/core/__tests__/tmux-driver-boundary.test.d.ts +0 -1
  1152. package/dist/core/__tests__/tmux-driver-boundary.test.js +0 -50
  1153. package/dist/core/__tests__/warm-claim-preference-snapshot.test.d.ts +0 -1
  1154. package/dist/core/__tests__/warm-claim-preference-snapshot.test.js +0 -54
  1155. package/dist/core/__tests__/worktree-landing.test.d.ts +0 -1
  1156. package/dist/core/__tests__/worktree-landing.test.js +0 -11
  1157. package/dist/core/__tests__/yield-ensures-daemon.test.d.ts +0 -1
  1158. package/dist/core/__tests__/yield-ensures-daemon.test.js +0 -55
  1159. package/dist/core/broker-client/__tests__/transport-relay.test.d.ts +0 -1
  1160. package/dist/core/broker-client/__tests__/transport-relay.test.js +0 -214
  1161. package/dist/core/broker-client/__tests__/transport-socket.test.d.ts +0 -1
  1162. package/dist/core/broker-client/__tests__/transport-socket.test.js +0 -73
  1163. package/dist/core/canvas/__tests__/attention.test.d.ts +0 -1
  1164. package/dist/core/canvas/__tests__/attention.test.js +0 -83
  1165. package/dist/core/canvas/__tests__/history-transcript.test.d.ts +0 -1
  1166. package/dist/core/canvas/__tests__/history-transcript.test.js +0 -102
  1167. package/dist/core/canvas/__tests__/remote-canvas-source.test.d.ts +0 -1
  1168. package/dist/core/canvas/__tests__/remote-canvas-source.test.js +0 -328
  1169. package/dist/core/canvas/__tests__/remote-transport.test.d.ts +0 -1
  1170. package/dist/core/canvas/__tests__/remote-transport.test.js +0 -97
  1171. package/dist/core/canvas/__tests__/render-remote.test.d.ts +0 -1
  1172. package/dist/core/canvas/__tests__/render-remote.test.js +0 -243
  1173. package/dist/core/canvas/__tests__/session-window.test.d.ts +0 -1
  1174. package/dist/core/canvas/__tests__/session-window.test.js +0 -70
  1175. package/dist/core/feed/__tests__/inbox-migrate.test.d.ts +0 -1
  1176. package/dist/core/feed/__tests__/inbox-migrate.test.js +0 -49
  1177. package/dist/core/human/__tests__/page-catalog.test.d.ts +0 -1
  1178. package/dist/core/human/__tests__/page-catalog.test.js +0 -20
  1179. package/dist/core/human/__tests__/page-html-markdown.test.d.ts +0 -1
  1180. package/dist/core/human/__tests__/page-html-markdown.test.js +0 -48
  1181. package/dist/core/human/__tests__/page.test.d.ts +0 -1
  1182. package/dist/core/human/__tests__/page.test.js +0 -92
  1183. package/dist/core/keybindings/__tests__/resolve.test.d.ts +0 -1
  1184. package/dist/core/keybindings/__tests__/resolve.test.js +0 -171
  1185. package/dist/core/profiles/__tests__/env-store.test.d.ts +0 -1
  1186. package/dist/core/profiles/__tests__/env-store.test.js +0 -99
  1187. package/dist/core/profiles/__tests__/fuzzy-match.test.d.ts +0 -1
  1188. package/dist/core/profiles/__tests__/fuzzy-match.test.js +0 -51
  1189. package/dist/core/profiles/__tests__/root-profile.test.d.ts +0 -1
  1190. package/dist/core/profiles/__tests__/root-profile.test.js +0 -59
  1191. package/dist/core/review/__tests__/capture-origin.test.d.ts +0 -1
  1192. package/dist/core/review/__tests__/capture-origin.test.js +0 -150
  1193. package/dist/core/review/__tests__/comments.test.d.ts +0 -1
  1194. package/dist/core/review/__tests__/comments.test.js +0 -116
  1195. package/dist/core/review/__tests__/remap.test.d.ts +0 -1
  1196. package/dist/core/review/__tests__/remap.test.js +0 -177
  1197. package/dist/core/review/__tests__/stage-identity.test.d.ts +0 -1
  1198. package/dist/core/review/__tests__/stage-identity.test.js +0 -150
  1199. package/dist/core/runtime/__tests__/engine-route.test.d.ts +0 -1
  1200. package/dist/core/runtime/__tests__/engine-route.test.js +0 -36
  1201. package/dist/core/runtime/__tests__/install-id-cache-scoping.test.d.ts +0 -1
  1202. package/dist/core/runtime/__tests__/install-id-cache-scoping.test.js +0 -45
  1203. package/dist/core/runtime/__tests__/node-env.test.d.ts +0 -1
  1204. package/dist/core/runtime/__tests__/node-env.test.js +0 -73
  1205. package/dist/core/runtime/__tests__/spawn-env.test.d.ts +0 -1
  1206. package/dist/core/runtime/__tests__/spawn-env.test.js +0 -259
  1207. package/dist/core/substrate/__tests__/surface-match-command.test.d.ts +0 -1
  1208. package/dist/core/substrate/__tests__/surface-match-command.test.js +0 -89
  1209. package/dist/core/substrate/__tests__/surface-match-memory-read.test.d.ts +0 -1
  1210. package/dist/core/substrate/__tests__/surface-match-memory-read.test.js +0 -28
  1211. package/dist/core/substrate/__tests__/surface-match-pre-command.test.d.ts +0 -1
  1212. package/dist/core/substrate/__tests__/surface-match-pre-command.test.js +0 -92
  1213. package/dist/daemon/__tests__/autostart-storm.test.d.ts +0 -1
  1214. package/dist/daemon/__tests__/autostart-storm.test.js +0 -128
  1215. package/dist/daemon/__tests__/broker-ownership.test.d.ts +0 -1
  1216. package/dist/daemon/__tests__/broker-ownership.test.js +0 -25
  1217. package/dist/daemon/__tests__/daemon-ownership.test.d.ts +0 -1
  1218. package/dist/daemon/__tests__/daemon-ownership.test.js +0 -27
  1219. package/dist/daemon/__tests__/helpers/source-daemon.d.ts +0 -30
  1220. package/dist/daemon/__tests__/helpers/source-daemon.js +0 -176
  1221. package/dist/daemon/__tests__/integration/api-startup-readiness.test.d.ts +0 -1
  1222. package/dist/daemon/__tests__/integration/api-startup-readiness.test.js +0 -83
  1223. package/dist/daemon/__tests__/integration/migration-startup.test.d.ts +0 -1
  1224. package/dist/daemon/__tests__/integration/migration-startup.test.js +0 -127
  1225. package/dist/daemon/__tests__/node-deadline-lane.test.d.ts +0 -1
  1226. package/dist/daemon/__tests__/node-deadline-lane.test.js +0 -77
  1227. package/dist/daemon/__tests__/node-outcome-birth-invariants.test.d.ts +0 -1
  1228. package/dist/daemon/__tests__/node-outcome-birth-invariants.test.js +0 -146
  1229. package/dist/daemon/__tests__/node-outcome-delivery.test.d.ts +0 -1
  1230. package/dist/daemon/__tests__/node-outcome-delivery.test.js +0 -116
  1231. package/dist/daemon/__tests__/reconciler-signature.test.d.ts +0 -1
  1232. package/dist/daemon/__tests__/reconciler-signature.test.js +0 -37
  1233. package/dist/daemon/__tests__/subtree-filter-freshness.test.d.ts +0 -1
  1234. package/dist/daemon/__tests__/subtree-filter-freshness.test.js +0 -63
  1235. package/dist/daemon/__tests__/thaw-order.test.d.ts +0 -1
  1236. package/dist/daemon/__tests__/thaw-order.test.js +0 -55
  1237. package/dist/daemon/api/__tests__/bridge-heartbeat.test.d.ts +0 -1
  1238. package/dist/daemon/api/__tests__/bridge-heartbeat.test.js +0 -58
  1239. package/dist/daemon/api/__tests__/broker-settle-park.test.d.ts +0 -1
  1240. package/dist/daemon/api/__tests__/broker-settle-park.test.js +0 -175
  1241. package/dist/daemon/api/__tests__/canvas-snapshot-fields.test.d.ts +0 -1
  1242. package/dist/daemon/api/__tests__/canvas-snapshot-fields.test.js +0 -216
  1243. package/dist/daemon/api/__tests__/error-seam.test.d.ts +0 -1
  1244. package/dist/daemon/api/__tests__/error-seam.test.js +0 -83
  1245. package/dist/daemon/api/__tests__/model-config.test.d.ts +0 -1
  1246. package/dist/daemon/api/__tests__/model-config.test.js +0 -73
  1247. package/dist/daemon/api/__tests__/node-create-description.test.d.ts +0 -1
  1248. package/dist/daemon/api/__tests__/node-create-description.test.js +0 -107
  1249. package/dist/daemon/api/__tests__/node-model-validation.test.d.ts +0 -1
  1250. package/dist/daemon/api/__tests__/node-model-validation.test.js +0 -183
  1251. package/dist/daemon/api/__tests__/nodes-activity-query.test.d.ts +0 -1
  1252. package/dist/daemon/api/__tests__/nodes-activity-query.test.js +0 -99
  1253. package/dist/daemon/api/__tests__/profile-launch-gates.test.d.ts +0 -1
  1254. package/dist/daemon/api/__tests__/profile-launch-gates.test.js +0 -172
  1255. package/dist/daemon/api/__tests__/profile-metadata-route.test.d.ts +0 -1
  1256. package/dist/daemon/api/__tests__/profile-metadata-route.test.js +0 -95
  1257. package/dist/daemon/api/__tests__/reopen-delivery.test.d.ts +0 -1
  1258. package/dist/daemon/api/__tests__/reopen-delivery.test.js +0 -260
  1259. package/dist/daemon/api/__tests__/seam/api-server.test.d.ts +0 -1
  1260. package/dist/daemon/api/__tests__/seam/api-server.test.js +0 -442
  1261. package/dist/daemon/api/__tests__/seam/b10-attach-modelauth.test.d.ts +0 -1
  1262. package/dist/daemon/api/__tests__/seam/b10-attach-modelauth.test.js +0 -310
  1263. package/dist/daemon/api/__tests__/seam/leaf-api-parity.test.d.ts +0 -1
  1264. package/dist/daemon/api/__tests__/seam/leaf-api-parity.test.js +0 -351
  1265. package/dist/daemon/api/__tests__/seam/node-outcome-api.test.d.ts +0 -1
  1266. package/dist/daemon/api/__tests__/seam/node-outcome-api.test.js +0 -159
  1267. package/dist/daemon/api/__tests__/seam/profile-delete.test.d.ts +0 -1
  1268. package/dist/daemon/api/__tests__/seam/profile-delete.test.js +0 -372
  1269. package/dist/daemon/api/__tests__/submit-result.test.d.ts +0 -1
  1270. package/dist/daemon/api/__tests__/submit-result.test.js +0 -215
  1271. package/dist/migrations/__tests__/activation-concurrency.test.d.ts +0 -1
  1272. package/dist/migrations/__tests__/activation-concurrency.test.js +0 -146
  1273. package/dist/migrations/__tests__/activation.test.d.ts +0 -1
  1274. package/dist/migrations/__tests__/activation.test.js +0 -152
  1275. package/dist/migrations/__tests__/deletion-and-root-declaration.test.d.ts +0 -1
  1276. package/dist/migrations/__tests__/deletion-and-root-declaration.test.js +0 -149
  1277. package/dist/pi-extensions/__tests__/canvas-bash-valve.test.d.ts +0 -1
  1278. package/dist/pi-extensions/__tests__/canvas-bash-valve.test.js +0 -86
  1279. package/dist/pi-extensions/__tests__/canvas-context-intro.test.d.ts +0 -1
  1280. package/dist/pi-extensions/__tests__/canvas-context-intro.test.js +0 -364
  1281. package/dist/pi-extensions/__tests__/canvas-goal-capture-envelope.test.d.ts +0 -1
  1282. package/dist/pi-extensions/__tests__/canvas-goal-capture-envelope.test.js +0 -106
  1283. package/dist/pi-extensions/__tests__/canvas-recap.test.d.ts +0 -1
  1284. package/dist/pi-extensions/__tests__/canvas-recap.test.js +0 -62
  1285. package/dist/pi-extensions/__tests__/canvas-stophook-agentend.test.d.ts +0 -1
  1286. package/dist/pi-extensions/__tests__/canvas-stophook-agentend.test.js +0 -432
  1287. package/dist/pi-extensions/__tests__/canvas-stophook-context-nudge.test.d.ts +0 -1
  1288. package/dist/pi-extensions/__tests__/canvas-stophook-context-nudge.test.js +0 -152
  1289. package/dist/pi-extensions/__tests__/canvas-structured-output.test.d.ts +0 -1
  1290. package/dist/pi-extensions/__tests__/canvas-structured-output.test.js +0 -88
  1291. package/dist/pi-extensions/__tests__/canvas-tool-guide.test.d.ts +0 -1
  1292. package/dist/pi-extensions/__tests__/canvas-tool-guide.test.js +0 -96
  1293. package/dist/pi-extensions/__tests__/integration/canvas-bash-valve.test.d.ts +0 -1
  1294. package/dist/pi-extensions/__tests__/integration/canvas-bash-valve.test.js +0 -133
  1295. package/dist/pi-extensions/__tests__/pre-command-gate.test.d.ts +0 -1
  1296. package/dist/pi-extensions/__tests__/pre-command-gate.test.js +0 -232
  1297. package/dist/shared/__tests__/env-boundary.test.d.ts +0 -1
  1298. package/dist/shared/__tests__/env-boundary.test.js +0 -95
  1299. package/dist/shared/__tests__/generated-context-grammar.test.d.ts +0 -1
  1300. package/dist/shared/__tests__/generated-context-grammar.test.js +0 -80
  1301. package/docs/compat/hearth-crtr-v1.md +0 -179
  1302. package/docs/compat/hearth-crtr-v2.md +0 -177
  1303. package/docs/compat/hearth-crtr-v3.md +0 -176
  1304. package/docs/compat/hearth-crtr-v4.md +0 -182
  1305. package/docs/compat/hearth-crtr-v5.md +0 -169
@@ -1,859 +1,4 @@
1
- // input/titled-editor.ts — the `crtr surface attach` input editor with two bits of chrome pi's
2
- // stock editor doesn't give us:
3
- // 1. the session name painted INTO the top border as a solid-background chip,
4
- // so it stays pinned to the editor instead of scrolling off as a free badge;
5
- // 2. a border color that tracks the agent's thinking level (set by viewer.ts
6
- // on each state update), mirroring pi's `getThinkingBorderColor`.
7
- // Both are pure render-layer chrome; nothing here touches the socket or session.
8
- import { statSync } from 'node:fs';
9
- import { CustomEditor } from '@earendil-works/pi-coding-agent';
10
- import { CURSOR_MARKER, truncateToWidth, visibleWidth, wrapTextWithAnsi, } from '@earendil-works/pi-tui';
11
- // Deep import: `wordWrapLine` implements pi-tui's exact word-wrap algorithm but is
12
- // not re-exported from the package root (only `Editor`/`EditorTheme`/`EditorOptions`
13
- // are). The package has no `"exports"` field, so a deep subpath import is not
14
- // blocked by Node's resolution. We need the EXACT wrap algorithm (not a
15
- // reimplementation) to recompute layout for ref-highlight decoration below —
16
- // see `buildRefLayoutChunks`.
17
- import { wordWrapLine } from '@earendil-works/pi-tui/dist/components/editor.js';
18
- import { findRefTokens } from '../../../core/memory/inline-ref-grammar.js';
19
- import { findRefCompletionContext } from './ref-autocomplete.js';
20
- const LOADED_COMMAND_PREVIEW_MAX_LINES = 8;
21
- const LOADED_COMMAND_PREVIEW_MIN_WIDTH = 24;
22
- const LOADED_COMMAND_PREVIEW_MAX_CHARS = 8_192;
23
- /** Strip terminal controls from inline chrome only. The exact, unmodified
24
- * prompt remains available through the inspector. */
25
- function sanitizeLoadedCommandPreview(content, limit) {
26
- const bounded = content.slice(0, limit);
27
- const truncated = content.length > limit;
28
- // CSI, OSC (BEL or ST terminated), and every remaining C0/C1 control other
29
- // than newline are inert in a Text component, never terminal instructions.
30
- const text = bounded
31
- .replace(/\x1b\](?:[^\x07\x1b]*)(?:\x07|\x1b\\)?/g, '')
32
- .replace(/\x1b\[[0-?]*[ -/]*[@-~]/g, '')
33
- .replace(/[\x00-\x09\x0b-\x1f\x7f-\x9f]/g, '');
34
- return { text, truncated };
35
- }
36
- /** Keep inline command disclosure compact and bounded before wrapping; the
37
- * inspector remains the unbounded, exact-prompt surface. */
38
- export function compactLoadedCommandPreview(content, width) {
39
- if (width < LOADED_COMMAND_PREVIEW_MIN_WIDTH)
40
- return [];
41
- const limit = Math.min(LOADED_COMMAND_PREVIEW_MAX_CHARS, Math.max(256, width * LOADED_COMMAND_PREVIEW_MAX_LINES * 4));
42
- const safe = sanitizeLoadedCommandPreview(content, limit);
43
- const wrapped = wrapTextWithAnsi(safe.text, width);
44
- if (!safe.truncated && wrapped.length <= LOADED_COMMAND_PREVIEW_MAX_LINES)
45
- return wrapped;
46
- const visible = wrapped.slice(0, LOADED_COMMAND_PREVIEW_MAX_LINES - 1);
47
- visible.push(truncateToWidth('… truncated · inspect for full prompt', width));
48
- return visible;
49
- }
50
- /** The standard thinking levels form a deliberate cool→warm ramp between blue
51
- * and its orange complement. `max` is a distinct, intense cyan endpoint so it
52
- * never falls back to the neutral default border. `off` alone falls back to
53
- * the caller's default border color. The colors double as title-chip
54
- * BACKGROUNDS under bold white text, so each must remain dark enough for the
55
- * label to read clearly. */
56
- const THINKING_START = [46, 92, 190]; // deep blue
57
- const THINKING_END = [166, 98, 24]; // deep amber
58
- const THINKING_MAX = [0, 145, 170]; // intense cyan
59
- function interpolateRgb(start, end, t) {
60
- return [
61
- Math.round(start[0] + (end[0] - start[0]) * t),
62
- Math.round(start[1] + (end[1] - start[1]) * t),
63
- Math.round(start[2] + (end[2] - start[2]) * t),
64
- ];
65
- }
66
- const THINKING_RGB = {
67
- off: undefined, // default border color
68
- minimal: interpolateRgb(THINKING_START, THINKING_END, 0 / 4),
69
- low: interpolateRgb(THINKING_START, THINKING_END, 1 / 4),
70
- medium: interpolateRgb(THINKING_START, THINKING_END, 2 / 4),
71
- high: interpolateRgb(THINKING_START, THINKING_END, 3 / 4),
72
- xhigh: interpolateRgb(THINKING_START, THINKING_END, 4 / 4),
73
- max: THINKING_MAX,
74
- };
75
- /** Named colours `/color` accepts, as RGB — mirrors the tmux colour-name table
76
- * (so the chip and the pane border read as the same hue). */
77
- const NAMED_RGB = {
78
- black: [0, 0, 0],
79
- red: [205, 49, 49],
80
- green: [13, 188, 121],
81
- yellow: [229, 229, 16],
82
- blue: [36, 114, 200],
83
- magenta: [188, 63, 188],
84
- cyan: [17, 168, 205],
85
- white: [229, 229, 229],
86
- orange: [228, 152, 68],
87
- grey: [128, 128, 128],
88
- gray: [128, 128, 128],
89
- brightred: [241, 76, 76],
90
- brightgreen: [35, 209, 139],
91
- brightyellow: [245, 245, 67],
92
- brightblue: [59, 142, 234],
93
- brightmagenta: [214, 112, 214],
94
- brightcyan: [41, 184, 219],
95
- };
96
- /** Build a title-chip styler for a `/color` token (a tmux colour name, `#rrggbb`,
97
- * or `colourN`): the colour as the chip BACKGROUND with contrast-picked bold
98
- * text, matching the thinking-chip treatment. `undefined` for an unrenderable
99
- * token (e.g. `default`) — the caller keeps its fallback style. */
100
- export function colorChipStyle(token) {
101
- const t = token.trim().toLowerCase();
102
- const c256 = /^colour(\d{1,3})$/.exec(t);
103
- if (c256 !== null)
104
- return (s) => `\x1b[48;5;${c256[1]}m\x1b[97m\x1b[1m ${s} \x1b[0m`;
105
- let rgb;
106
- const hex = /^#([0-9a-f]{6})$/.exec(t);
107
- if (hex !== null) {
108
- const h = hex[1];
109
- rgb = [parseInt(h.slice(0, 2), 16), parseInt(h.slice(2, 4), 16), parseInt(h.slice(4, 6), 16)];
110
- }
111
- else {
112
- rgb = NAMED_RGB[t];
113
- }
114
- if (rgb === undefined)
115
- return undefined;
116
- const [r, g, b] = rgb;
117
- // Pick black-on-light / white-on-dark so the name stays readable on any hue.
118
- const luma = 0.299 * r + 0.587 * g + 0.114 * b;
119
- const fg = luma > 160 ? '\x1b[30m' : '\x1b[97m';
120
- return (s) => `\x1b[48;2;${r};${g};${b}m${fg}\x1b[1m ${s} \x1b[0m`;
121
- }
122
- /** The default (thinking `off`) title chip: reverse video + a space of padding
123
- * each side, so the name reads as a label sitting on the border rule. Used as
124
- * the fallback when no thinking color applies. */
125
- export const defaultTitleStyle = (s) => `\x1b[7m ${s} \x1b[27m`;
126
- /** Resolve the editor border colorizer for a thinking level. Unknown / `off` →
127
- * the supplied `fallback` (the theme's default border color). */
128
- export function thinkingBorderColor(level, fallback) {
129
- const rgb = level === undefined ? undefined : THINKING_RGB[level];
130
- if (rgb === undefined)
131
- return fallback;
132
- const [r, g, b] = rgb;
133
- return (s) => `\x1b[38;2;${r};${g};${b}m${s}\x1b[39m`;
134
- }
135
- /** Resolve the title-chip styler for a thinking level: the level's color as the
136
- * chip BACKGROUND with bold white text (a space of padding each side), so the
137
- * session name reads as a solid label in the same hue as the border. Unknown /
138
- * `off` → the supplied `fallback` (the reverse-video default chip). */
139
- export function thinkingTitleStyle(level, fallback) {
140
- const rgb = level === undefined ? undefined : THINKING_RGB[level];
141
- if (rgb === undefined)
142
- return fallback;
143
- const [r, g, b] = rgb;
144
- return (s) => `\x1b[48;2;${r};${g};${b}m\x1b[97m\x1b[1m ${s} \x1b[0m`;
145
- }
146
- /** Compose the replacement top-border line: solid title chip + border rule +
147
- * info chip, never wider than `width` (pi-tui hard-crashes on an over-wide
148
- * line). The info chip yields entirely when the chip leaves it almost no room,
149
- * and truncates when it only partially fits. Exported pure for the overflow
150
- * regression test. */
151
- export function composeTopBorder(width, title, info, titleStyle, borderColor) {
152
- const chip = title ? titleStyle(truncateToWidth(title, Math.max(1, width - 4), '…')) : '';
153
- const chipW = visibleWidth(chip);
154
- const avail = width - chipW;
155
- let infoChip = '';
156
- if (info && avail > 4) {
157
- infoChip = visibleWidth(info) <= avail ? info : truncateToWidth(info, avail, '…');
158
- }
159
- const fill = Math.max(0, width - chipW - visibleWidth(infoChip));
160
- return chip + borderColor('─'.repeat(fill)) + infoChip;
161
- }
162
- /** The stock pi-tui editor paints its fake cursor as a solid reverse-video
163
- * block (`\x1b[7m…\x1b[0m`) unconditionally — in a wall of attach panes every
164
- * pane shows an identical solid white cursor, and nothing tells you which one
165
- * keys actually go to. When the hosting pane/terminal is UNFOCUSED we rewrite
166
- * that cell into a MUTED cursor, mirroring how real terminals de-emphasize
167
- * the hardware cursor on blur. A pixel-true full-cell outline isn't possible
168
- * in text cells, and hollow-box glyphs (▯/⍘/□) render undersized, so the
169
- * muted form is a full-size block in a dim gray background — same footprint
170
- * as the focused cursor, clearly not the bright active one (ruling: tried the
171
- * glyphs, Silas preferred the dim block). The rewrite anchors on pi-tui's
172
- * zero-width CURSOR_MARKER (emitted right before the fake cursor while the
173
- * editor component has TUI focus) so it can never touch reverse video
174
- * elsewhere in the line. Returns undefined when the line carries no cursor.
175
- * Exported pure for tests. */
176
- const SOLID_CURSOR_PREFIX = '\x1b[7m';
177
- const SOLID_CURSOR_RESET = '\x1b[0m';
178
- /** Dim gray bg, default fg — the char under the cursor stays readable. */
179
- const MUTED_CURSOR_ON = '\x1b[48;5;240m';
180
- export function outlineCursorLine(line) {
181
- const m = line.indexOf(CURSOR_MARKER);
182
- if (m === -1)
183
- return undefined;
184
- const start = m + CURSOR_MARKER.length;
185
- if (!line.startsWith(SOLID_CURSOR_PREFIX, start))
186
- return undefined;
187
- const gStart = start + SOLID_CURSOR_PREFIX.length;
188
- const end = line.indexOf(SOLID_CURSOR_RESET, gStart);
189
- if (end === -1)
190
- return undefined;
191
- const grapheme = line.slice(gStart, end);
192
- const replacement = `${MUTED_CURSOR_ON}${grapheme}\x1b[0m`;
193
- return line.slice(0, start) + replacement + line.slice(end + SOLID_CURSOR_RESET.length);
194
- }
195
- /** Image file extensions a dragged path is recognized by. */
196
- const IMAGE_PATH_RE = /\.(png|jpe?g|gif|webp|bmp)$/i;
197
- /** Recognize a single input chunk as a filesystem path to an image file — how a
198
- * terminal delivers a file DRAGGED into the pane (the escaped path pasted in
199
- * bulk, optionally wrapped in bracketed-paste markers). Returns the resolved
200
- * path, or null when the chunk isn't a lone image path (normal typing, multi-
201
- * line text, a non-image path, or a path that doesn't point at a real file).
202
- * Conservative on purpose: it must never transform ordinary typed input. */
203
- export function detectDroppedImagePath(data) {
204
- // Unwrap bracketed paste (\x1b[200~ … \x1b[201~) when the terminal uses it.
205
- const bracketed = data.match(/\x1b\[200~([\s\S]*?)\x1b\[201~/);
206
- let payload = (bracketed ? bracketed[1] : data).trim();
207
- if (payload.length < 2)
208
- return null; // a lone keystroke is never a drop
209
- if (/[\u0000-\u0008\u000e-\u001f]/.test(payload))
210
- return null; // control chars → not a path
211
- // Terminals wrap a dropped path in quotes or backslash-escape its spaces.
212
- if ((payload.startsWith("'") && payload.endsWith("'")) ||
213
- (payload.startsWith('"') && payload.endsWith('"'))) {
214
- payload = payload.slice(1, -1);
215
- }
216
- const path = payload.replace(/\\(.)/g, '$1');
217
- if (/\n/.test(path) || !IMAGE_PATH_RE.test(path))
218
- return null;
219
- try {
220
- if (!statSync(path).isFile())
221
- return null;
222
- }
223
- catch {
224
- return null; // not a real file → treat as ordinary pasted text
225
- }
226
- return path;
227
- }
228
- /** Recompute the exact layout pi-tui's `Editor.render` will produce for
229
- * `lines` at `layoutWidth`, faithfully porting the private `layoutText`
230
- * algorithm (empty-editor special case; per-line whole-fit vs `wordWrapLine`
231
- * branch; cursor-in-chunk assignment for wrapped lines). `wordWrapLine` here
232
- * is called WITHOUT the base editor's private paste-marker-aware
233
- * presegmentation, so a wrapped line containing a paste marker can
234
- * theoretically diverge from the real render's chunk boundaries — harmless,
235
- * because `decorateRow`'s verify-before-splice check means any divergence
236
- * simply drops that row's decoration rather than corrupting it. */
237
- export function buildRefLayoutChunks(lines, layoutWidth, cursorLine, cursorCol) {
238
- const chunks = [];
239
- if (lines.length === 0 || (lines.length === 1 && lines[0] === '')) {
240
- chunks.push({ logicalLine: 0, startIndex: 0, endIndex: 0, text: '', hasCursor: true, cursorPos: 0 });
241
- return chunks;
242
- }
243
- for (let i = 0; i < lines.length; i++) {
244
- const line = lines[i] ?? '';
245
- const isCurrentLine = i === cursorLine;
246
- if (visibleWidth(line) <= layoutWidth) {
247
- chunks.push({
248
- logicalLine: i,
249
- startIndex: 0,
250
- endIndex: line.length,
251
- text: line,
252
- hasCursor: isCurrentLine,
253
- cursorPos: isCurrentLine ? cursorCol : 0,
254
- });
255
- continue;
256
- }
257
- const wrapped = wordWrapLine(line, layoutWidth);
258
- for (let chunkIndex = 0; chunkIndex < wrapped.length; chunkIndex++) {
259
- const chunk = wrapped[chunkIndex];
260
- if (!chunk)
261
- continue;
262
- const isLastChunk = chunkIndex === wrapped.length - 1;
263
- let hasCursorInChunk = false;
264
- let adjustedCursorPos = 0;
265
- if (isCurrentLine) {
266
- if (isLastChunk) {
267
- hasCursorInChunk = cursorCol >= chunk.startIndex;
268
- adjustedCursorPos = cursorCol - chunk.startIndex;
269
- }
270
- else {
271
- hasCursorInChunk = cursorCol >= chunk.startIndex && cursorCol < chunk.endIndex;
272
- if (hasCursorInChunk) {
273
- adjustedCursorPos = cursorCol - chunk.startIndex;
274
- if (adjustedCursorPos > chunk.text.length)
275
- adjustedCursorPos = chunk.text.length;
276
- }
277
- }
278
- }
279
- chunks.push({
280
- logicalLine: i,
281
- startIndex: chunk.startIndex,
282
- endIndex: chunk.endIndex,
283
- text: chunk.text,
284
- hasCursor: hasCursorInChunk,
285
- cursorPos: adjustedCursorPos,
286
- });
287
- }
288
- }
289
- return chunks;
290
- }
291
- /** Resolved-ref candidate spans in one logical line: exact, case-sensitive
292
- * membership in `names` (the broker-supplied inventory of visible canonical
293
- * names) — never a fuzzy or prefix match. */
294
- function resolvedSpansForLine(line, names) {
295
- return findRefTokens(line)
296
- .filter((t) => names.has(t.candidate))
297
- .map((t) => ({ start: t.start, end: t.end }));
298
- }
299
- /** Zero-width SGR for a resolved ref: underline + dim on, and ONLY those two
300
- * attributes off again — never a blanket `\x1b[0m` reset, which would erase
301
- * the cursor's own reverse-video/mute styling if a span ever abuts it. */
302
- const REF_STYLE_ON = '\x1b[4m\x1b[2m';
303
- const REF_STYLE_OFF = '\x1b[24m\x1b[22m';
304
- const refGraphemeSegmenter = new Intl.Segmenter(undefined, { granularity: 'grapheme' });
305
- /** Best-effort length (in UTF-16 code units) of the first grapheme of `text`.
306
- * Not paste-marker aware (unlike the base editor's own segmenter) — doesn't
307
- * need to be: any mismatch is caught by `decorateRow`'s verify-before-splice
308
- * check, which only ever causes a span to be left undecorated. */
309
- function firstGraphemeLength(text) {
310
- for (const seg of refGraphemeSegmenter.segment(text))
311
- return seg.segment.length;
312
- return 0;
313
- }
314
- /** Locate the cursor's own reverse-video cell within a single rendered content
315
- * row, so ref decoration can be positioned around it without ever touching
316
- * its bytes. Handles both the focused form (`SOLID_CURSOR_PREFIX`) and the
317
- * blurred, muted form `outlineCursorLine` rewrites it to (`MUTED_CURSOR_ON`)
318
- * — decoration always runs AFTER that rewrite, so both must be recognized.
319
- * Returns null when no cursor cell can be found (e.g. the row isn't the
320
- * cursor's row after all, or the base editor changed its cursor markup). */
321
- function locateCursorCell(row) {
322
- const markerIdx = row.indexOf(CURSOR_MARKER);
323
- const searchFrom = markerIdx === -1 ? 0 : markerIdx + CURSOR_MARKER.length;
324
- let prefixIdx = row.indexOf(SOLID_CURSOR_PREFIX, searchFrom);
325
- let prefixLen = SOLID_CURSOR_PREFIX.length;
326
- if (prefixIdx === -1) {
327
- prefixIdx = row.indexOf(MUTED_CURSOR_ON, searchFrom);
328
- prefixLen = MUTED_CURSOR_ON.length;
329
- }
330
- if (prefixIdx === -1)
331
- return null;
332
- const resetIdx = row.indexOf(SOLID_CURSOR_RESET, prefixIdx + prefixLen);
333
- if (resetIdx === -1)
334
- return null;
335
- return { start: markerIdx !== -1 ? markerIdx : prefixIdx, end: resetIdx + SOLID_CURSOR_RESET.length };
336
- }
337
- /** Splice underline/dim styling around every resolved-ref span that survives
338
- * chrome-safety verification. `rowStr` is one already-rendered content row
339
- * (plain, or carrying exactly the cursor's own cell markup); `chunk` is the
340
- * layout entry it was built from; `spans` are candidate resolved-ref spans
341
- * already filtered to lie within `chunk`'s logical range; `line` is the full
342
- * logical line text (used only to verify a span's characters still match at
343
- * the row offset we computed — never spliced in directly). Exported pure for
344
- * direct testing. */
345
- export function decorateRow(rowStr, chunk, spans, line, paddingX) {
346
- const insertions = [];
347
- if (!chunk.hasCursor) {
348
- for (const span of spans) {
349
- const absStart = paddingX + (span.start - chunk.startIndex);
350
- const absEnd = paddingX + (span.end - chunk.startIndex);
351
- if (rowStr.slice(absStart, absEnd) === line.slice(span.start, span.end)) {
352
- insertions.push({ absStart, absEnd });
353
- }
354
- }
355
- }
356
- else {
357
- const cell = locateCursorCell(rowStr);
358
- if (cell === null)
359
- return rowStr; // can't safely locate the cursor -> decorate nothing on this row
360
- const afterChunkText = chunk.text.slice(chunk.cursorPos);
361
- const graphemeLen = afterChunkText.length === 0 ? 0 : firstGraphemeLength(afterChunkText);
362
- const consumedEnd = chunk.cursorPos + graphemeLen;
363
- for (const span of spans) {
364
- const localStart = span.start - chunk.startIndex;
365
- const localEnd = span.end - chunk.startIndex;
366
- if (localEnd <= chunk.cursorPos) {
367
- const absStart = paddingX + localStart;
368
- const absEnd = paddingX + localEnd;
369
- if (absEnd <= cell.start && rowStr.slice(absStart, absEnd) === line.slice(span.start, span.end)) {
370
- insertions.push({ absStart, absEnd });
371
- }
372
- }
373
- else if (localStart >= consumedEnd) {
374
- const absStart = cell.end + (localStart - consumedEnd);
375
- const absEnd = cell.end + (localEnd - consumedEnd);
376
- if (absStart >= cell.end && rowStr.slice(absStart, absEnd) === line.slice(span.start, span.end)) {
377
- insertions.push({ absStart, absEnd });
378
- }
379
- }
380
- // else: span overlaps the cursor cell itself -> leave plain (design-sanctioned degrade)
381
- }
382
- }
383
- if (insertions.length === 0)
384
- return rowStr;
385
- insertions.sort((a, b) => b.absStart - a.absStart); // rightmost first so earlier offsets stay valid
386
- let out = rowStr;
387
- for (const ins of insertions) {
388
- out = out.slice(0, ins.absStart) + REF_STYLE_ON + out.slice(ins.absStart, ins.absEnd) + REF_STYLE_OFF + out.slice(ins.absEnd);
389
- }
390
- return out;
391
- }
392
- /** Mirrors `dispatchSlashCommand`'s (`slash/dispatch.ts`) own leading-name
393
- * parse EXACTLY — not a looser grammar-based extraction, since dispatch's
394
- * name charset (`\S+`) differs from the ref grammar's (`[A-Za-z0-9_:-]`) and
395
- * a grammar-based extraction would under-suppress for a command name
396
- * containing e.g. `.`. Duplicated intentionally: input/titled-editor.ts owns only
397
- * render/input, and this two-line regex is the whole surface of that
398
- * contract. */
399
- function extractLeadingCommandName(text) {
400
- const m = /^\/(\S+)\s*([\s\S]*)$/.exec(text.trim());
401
- return m ? m[1] : null;
402
- }
403
- /** Mirrors the broker's `isLeadingEngineCommand` (`core/runtime/broker.ts`)
404
- * leading-token rule EXACTLY for classification purposes:
405
- * the RAW, un-trimmed `text` must itself start with `/` — no `.trim()` — for
406
- * ANY token to be a candidate, matching the broker's own untrimmed
407
- * `text.startsWith('/')` checks byte-for-byte (space-based name split,
408
- * `/skill:` 7-character prefix). `engineNames` is the broker's own
409
- * `engineLeadingCommandNames` enumeration (`ListMemoryRefsData`, populated
410
- * per `list_memory_refs` reply) — exact extension-command invocation names
411
- * and prompt-template names bare, skills as `skill:<name>`, exactly what
412
- * `engineLeadingCommandTokens` emits. This is viewer-side, best-effort
413
- * classification for render suppression ONLY (see `decorateResolvedRefs`)
414
- * — the broker remains the sole authority at actual submission time
415
- * regardless of any viewer-side mismatch. */
416
- function matchesEngineLeadingCommand(text, engineNames) {
417
- if (!text.startsWith('/'))
418
- return false;
419
- const spaceIndex = text.indexOf(' ');
420
- const commandName = spaceIndex === -1 ? text.slice(1) : text.slice(1, spaceIndex);
421
- if (engineNames.has(commandName))
422
- return true;
423
- if (text.startsWith('/skill:')) {
424
- const skillName = spaceIndex === -1 ? text.slice(7) : text.slice(7, spaceIndex);
425
- if (engineNames.has(`skill:${skillName}`))
426
- return true;
427
- }
428
- return false;
429
- }
430
- export class TitledEditor extends CustomEditor {
431
- /** crtr's OWN keybindings manager — the same one CustomEditor matches `app.*`
432
- * against. We keep a reference so `handleInput` can resolve the newline chord
433
- * here, independent of the editor's (possibly separate) pi-tui module global. */
434
- km;
435
- /** The raw (untrimmed) text `submitValue()` is ABOUT to trim away, captured by
436
- * the `submitValue` monkeypatch just below it runs, and consumed exactly once
437
- * by the `onSubmit` accessor wrapper. See the constructor for why. */
438
- pendingRawSubmitText;
439
- /** The REAL caller-supplied `onSubmit` handler (what `InputController` wires
440
- * via `this.editor.onSubmit = ...`) — stored here because `onSubmit` itself is
441
- * converted to an accessor below whose getter always returns our substitution
442
- * wrapper, not this value directly. */
443
- realOnSubmit;
444
- /** A line ending held back to learn whether more input follows it within
445
- * `PASTE_BURST_MS` — see `handleInput`'s unbracketed-paste rescue. More input
446
- * means it was a line break inside a paste (insert a newline); silence means
447
- * a human pressed Enter (submit). */
448
- pendingReturn;
449
- /** How long a line ending is held before it counts as a real Enter. An
450
- * unbracketed paste floods `handleInput` within one event-loop tick, so its
451
- * next character always lands far inside this window; a human's next
452
- * keystroke after Enter is ~30ms+ away at the very fastest. Short enough that
453
- * the added submit latency is imperceptible. */
454
- static PASTE_BURST_MS = 10;
455
- // CustomEditor's ctor signature; captured so we own the newline chord (see
456
- // handleInput). The keybindings param is typed as pi's app-subclass manager,
457
- // but the attach viewer feeds it pi-tui's base manager — hence the cast.
458
- constructor(tui, theme, keybindings, options) {
459
- super(tui, theme, keybindings, options);
460
- this.km = keybindings;
461
- // Preserve raw (untrimmed) submit text end-to-end. The base
462
- // `Editor.submitValue()` — private in the `.d.ts` (blocking a normal TS
463
- // `override`), hence the structural cast, same pattern as the other private-
464
- // internals casts throughout this file (`scrollOffset`, `historyIndex`,
465
- // `tryTriggerAutocomplete`) — computes `expandPasteMarkers(lines.join('\n'))`,
466
- // `.trim()`s it, THEN calls `this.onSubmit(trimmed)`: the trimmed text is all
467
- // any caller-supplied `onSubmit` handler ever sees today. `getExpandedText()`
468
- // IS public and its implementation is byte-for-byte the same pre-`.trim()`
469
- // computation, so calling it here — immediately before delegating to the real
470
- // `submitValue` — captures the exact untrimmed text about to be lost, and
471
- // must happen INSIDE this wrapper (not earlier in `handleInput`): a Tab/
472
- // Enter-confirm command completion can mutate `state.lines` in the SAME
473
- // `handleInput` call, in statements that run before `submitValue()` fires
474
- // (pi-tui's `tui.select.confirm` leading-command fallthrough), so anything
475
- // captured earlier could be stale pre-completion text.
476
- const inheritedSubmitValue = this.submitValue.bind(this);
477
- this.submitValue = () => {
478
- const withExpanded = this;
479
- this.pendingRawSubmitText = withExpanded.getExpandedText();
480
- inheritedSubmitValue();
481
- };
482
- // `onSubmit` is a plain PUBLIC optional class field on the base `Editor`
483
- // (`onSubmit?: (text: string) => void;`) — an own, configurable instance
484
- // property installed during base field initialization, before this
485
- // constructor body runs — so converting it to an accessor here is safe.
486
- // `InputController` does `this.editor.onSubmit = (text) => ...`, which now
487
- // goes through the setter below (stored as `realOnSubmit`); the value the
488
- // base class actually reads and calls from inside `submitValue()` is ALWAYS
489
- // this wrapper closure, which substitutes the captured raw text for
490
- // whatever (trimmed) argument pi-tui passes.
491
- Object.defineProperty(this, 'onSubmit', {
492
- configurable: true,
493
- get: () => {
494
- return (text) => {
495
- const raw = this.pendingRawSubmitText ?? text;
496
- this.pendingRawSubmitText = undefined;
497
- this.realOnSubmit?.(raw);
498
- };
499
- },
500
- set: (handler) => {
501
- this.realOnSubmit = handler;
502
- },
503
- });
504
- }
505
- /** Insert a newline on the newLine chord (Alt+Enter / Shift+Enter) using crtr's
506
- * OWN keybindings manager, then defer everything else to the stock editor.
507
- *
508
- * The base `Editor` resolves newLine against `getKeybindings()` on ITS pi-tui
509
- * instance, which in a non-deduped install is a DIFFERENT module than the one
510
- * carrying crtr's `alt+enter` override — so the override can silently never
511
- * reach it and Alt+Enter falls through to submit. crtr's `km` (the
512
- * same manager CustomEditor matches `app.*` against) always carries the
513
- * override, so matching the chord here makes the newline behavior independent
514
- * of cross-instance keybinding mirroring. Skipped while the autocomplete popup
515
- * is open so Enter-to-confirm keeps working. */
516
- /** Set by the input controller: called when a bulk input chunk is recognized
517
- * as a filesystem path to an image file (a file DRAGGED into the pane, which
518
- * the terminal delivers as bracketed-paste TEXT, not an image event). Returns
519
- * true when it consumed the drop, so the raw path is never inserted as text. */
520
- onPasteImagePath;
521
- /** Settle a line ending held by the unbracketed-paste rescue. `'newline'` (more
522
- * input arrived, so it was a paste's own line break) inserts it in place;
523
- * `'submit'` (the hold window expired in silence, so a human pressed Enter)
524
- * replays it through the stock editor and repaints, because this runs outside
525
- * the TUI's own post-`handleInput` render request. No-op when nothing is
526
- * held. */
527
- settleHeldReturn(as) {
528
- const held = this.pendingReturn;
529
- if (held === undefined)
530
- return;
531
- clearTimeout(held.timer);
532
- this.pendingReturn = undefined;
533
- if (as === 'newline') {
534
- this.insertTextAtCursor('\n');
535
- return;
536
- }
537
- super.handleInput(held.data);
538
- this.tui.requestRender();
539
- }
540
- /** Width of an `[Image #N]` token sitting immediately before the cursor on the
541
- * current line, or 0 when the cursor isn't at the end of such a token — used to
542
- * delete/skip the token atomically. The token's separating space is a normal,
543
- * reachable character, deliberately NOT part of the atom. */
544
- imageTokenWidthBeforeCursor() {
545
- const { line, col } = this.getCursor();
546
- const text = this.getLines()[line];
547
- if (text === undefined)
548
- return 0;
549
- const match = text.slice(0, col).match(/\[Image #\d+\]$/);
550
- return match ? match[0].length : 0;
551
- }
552
- /** Width of an `[Image #N]` token sitting immediately after the cursor on the
553
- * current line, or 0 when the cursor isn't at the start of such a token — used
554
- * to skip the token with the right arrow. */
555
- imageTokenWidthAfterCursor() {
556
- const { line, col } = this.getCursor();
557
- const text = this.getLines()[line];
558
- if (text === undefined)
559
- return 0;
560
- const match = text.slice(col).match(/^\[Image #\d+\]/);
561
- return match ? match[0].length : 0;
562
- }
563
- handleInput(data) {
564
- // Any input arriving while a line ending is held settles it as a paste's own
565
- // line break: insert it FIRST so this key lands after it, in typed order.
566
- this.settleHeldReturn('newline');
567
- // Keep ↓ on the editor's native focused-input path. Only when its own
568
- // wrap-aware cursor and prompt-history navigation make no change does the
569
- // adjacent roster get a chance to take over.
570
- if (!this.isShowingAutocomplete() && this.km.matches(data, 'tui.editor.cursorDown')) {
571
- const internals = this;
572
- const beforeCursor = this.getCursor();
573
- const beforeHistory = internals.historyIndex;
574
- super.handleInput(data);
575
- const afterCursor = this.getCursor();
576
- if (internals.historyIndex === beforeHistory
577
- && afterCursor.line === beforeCursor.line
578
- && afterCursor.col === beforeCursor.col) {
579
- this.onCursorDownAtBottom?.();
580
- }
581
- return;
582
- }
583
- if (!this.isShowingAutocomplete() && this.km.matches(data, 'tui.input.newLine')) {
584
- this.insertTextAtCursor('\n');
585
- return;
586
- }
587
- // Backspace over an `[Image #N]` token deletes the WHOLE token (and its
588
- // trailing space) in one keypress, not one character at a time — the token is
589
- // a single atom to the user. We replay the backspace across the token's full
590
- // width so the base editor's cursor/undo bookkeeping stays correct.
591
- if (!this.isShowingAutocomplete() && this.km.matches(data, 'tui.editor.deleteCharBackward')) {
592
- const width = this.imageTokenWidthBeforeCursor();
593
- if (width > 1) {
594
- for (let i = 0; i < width; i++)
595
- super.handleInput(data);
596
- return;
597
- }
598
- }
599
- // Left/right arrow steps OVER an `[Image #N]` token in one keypress — the
600
- // token reads as a single character, so the caret never lands inside it. We
601
- // replay the arrow across the token's full width so cursor bookkeeping stays
602
- // correct.
603
- if (!this.isShowingAutocomplete() && this.km.matches(data, 'tui.editor.cursorLeft')) {
604
- const width = this.imageTokenWidthBeforeCursor();
605
- if (width > 1) {
606
- for (let i = 0; i < width; i++)
607
- super.handleInput(data);
608
- return;
609
- }
610
- }
611
- if (!this.isShowingAutocomplete() && this.km.matches(data, 'tui.editor.cursorRight')) {
612
- const width = this.imageTokenWidthAfterCursor();
613
- if (width > 1) {
614
- for (let i = 0; i < width; i++)
615
- super.handleInput(data);
616
- return;
617
- }
618
- }
619
- // A file dragged into the pane arrives as a bulk paste of its (shell-escaped)
620
- // path, NOT as an image on the clipboard, so onPasteImage never fires. Detect
621
- // an image-file path here and hand it to the controller so it becomes an
622
- // `[Image #N]` token like a clipboard paste, instead of the raw temp path.
623
- const droppedPath = detectDroppedImagePath(data);
624
- if (droppedPath && this.onPasteImagePath?.(droppedPath))
625
- return;
626
- // Unbracketed multi-line paste rescue. When the terminal delivers a paste
627
- // WITHOUT bracketed-paste markers (\x1b[200~ … \x1b[201~) — the outer
628
- // terminal may not support them, or tmux attached its client with a terminfo
629
- // entry lacking the Enbp/Dsbp caps — pi-tui's StdinBuffer never enters paste
630
- // mode and instead splits the paste into single sequences. Each embedded
631
- // line ending then reaches us as a bare Enter, and the stock editor SUBMITS
632
- // on it: line one becomes a prompt and every following line becomes its own
633
- // turn, is queued as steering, or is lost to pi's "Agent is already
634
- // processing" rejection when it lands inside prompt()'s async preflight. The
635
- // bracketed path (when markers DO arrive) is a single `\x1b[200~…` sequence
636
- // that never trips this branch, so it stays fully intact.
637
- //
638
- // A pasted line break is told from a pressed Enter by what FOLLOWS it, not
639
- // by what precedes it: a paste floods handleInput with its next character
640
- // microseconds later, while an Enter is followed by human-scale silence.
641
- // Deciding on the following input (rather than the preceding gap) is what
642
- // keeps `tmux send-keys <text> Enter` — one write, so its Enter arrives
643
- // microseconds after the text — submitting as intended, since nothing
644
- // follows it. A paste that ends in a trailing newline likewise submits, by
645
- // then carrying its WHOLE text, so no line is ever split off or lost.
646
- // Skipped while the autocomplete popup is open, where Enter confirms a
647
- // completion and must stay immediate.
648
- if ((data === '\r' || data === '\n') && !this.isShowingAutocomplete()) {
649
- this.pendingReturn = {
650
- data,
651
- timer: setTimeout(() => this.settleHeldReturn('submit'), TitledEditor.PASTE_BURST_MS),
652
- };
653
- return;
654
- }
655
- const { line: beforeLine, col: beforeCol } = this.getCursor();
656
- const beforeText = this.getLines()[beforeLine] ?? '';
657
- super.handleInput(data);
658
- this.maybeTriggerNonLeadingRefAutocomplete(beforeLine, beforeCol, beforeText);
659
- }
660
- /** The base editor auto-triggers autocomplete for a LEADING slash context
661
- * (`isInSlashCommandContext`, `insertCharacter`) whenever the text before
662
- * the cursor — from the very start of the line — begins with `/`. A
663
- * non-leading ref elsewhere in ordinary text (`hey check /dev`) never
664
- * satisfies that check, so it would otherwise require an explicit Tab.
665
- * This bridges exactly that gap: after an ordinary single-character
666
- * insertion, if the caret now sits in a non-leading ref token
667
- * (`findRefCompletionContext` — T1's shared caret classifier, not
668
- * reimplemented here), nudge the same private trigger the base editor uses
669
- * for its own leading case. Detected purely by before/after cursor and
670
- * text-length diffing, so it's mechanism-agnostic (typed key or decoded
671
- * printable key alike) and naturally excludes multi-character paste
672
- * (`handlePaste` already suppresses autocomplete itself, and the exact +1
673
- * length-delta check here would reject it anyway). Leading context is
674
- * deliberately left untouched — triggering it again here would double the
675
- * base editor's own native trigger for that case. */
676
- maybeTriggerNonLeadingRefAutocomplete(beforeLine, beforeCol, beforeText) {
677
- if (this.isShowingAutocomplete())
678
- return;
679
- const cursor = this.getCursor();
680
- if (cursor.line !== beforeLine || cursor.col !== beforeCol + 1)
681
- return;
682
- const afterText = this.getLines()[cursor.line] ?? '';
683
- if (afterText.length !== beforeText.length + 1)
684
- return;
685
- const inserted = afterText[beforeCol];
686
- if (inserted === undefined || (inserted !== '/' && !/[A-Za-z0-9_:-]/.test(inserted)))
687
- return;
688
- const context = findRefCompletionContext(this.getLines(), cursor.line, cursor.col);
689
- if (!context || context.kind !== 'ref')
690
- return;
691
- this.tryTriggerAutocomplete();
692
- }
693
- /** Called after native ↓ navigation proves the editor and prompt history are
694
- * both exhausted. Attach uses this boundary handoff to enter its node roster. */
695
- onCursorDownAtBottom;
696
- /** Fully-expanded prompt template currently loaded by the editor's leading
697
- * slash token. It renders inside the editor outline before submission, so the
698
- * user can inspect the exact payload while arguments are still editable. */
699
- loadedCommand;
700
- /** Session-name chip painted into the LEFT of the top border. Empty → plain. */
701
- title = '';
702
- /** Pre-styled context string painted into the RIGHT of the top border (cwd /
703
- * branch / git status). Already colorized by the caller; empty → omitted. */
704
- info = '';
705
- /** Node and workspace badge painted at the far bottom-right of the outline. */
706
- contextBadge = '';
707
- /** Paint the chip solid so the name reads as a label sitting on the border
708
- * rule. Defaults to the reverse-video chip; viewer.ts swaps in a
709
- * thinking-colored background (bold white text) on each state update. */
710
- titleStyle = defaultTitleStyle;
711
- /** Node and workspace badge colorizer, matched to the editor frame. */
712
- contextBadgeStyle = defaultTitleStyle;
713
- /** Whether the hosting tmux pane / terminal window has FOCUS (terminal focus
714
- * reporting, DECSET 1004 — viewer.ts flips this on `\x1b[I` / `\x1b[O`).
715
- * Distinct from TUI component focus: the editor keeps component focus while
716
- * its pane is blurred. False → the fake cursor renders as an outline. */
717
- paneFocused = true;
718
- /** Canonical names the broker currently resolves — the exact-membership set
719
- * a candidate ref token must be in to render as a resolved highlight.
720
- * Empty by default (no decoration) until the caller supplies the
721
- * broker-supplied inventory. */
722
- resolvedRefNames = new Set();
723
- /** Command names the VIEWER dispatches ENTIRELY locally (never reach the
724
- * engine as prose) — checked against the TRIMMED leading-name rule
725
- * (`extractLeadingCommandName`, which mirrors `slash/dispatch.ts`'s own
726
- * `text.trim()`-based dispatch parse). Exactly
727
- * `locallyConsumedCommandNames()` from `slash/dispatch.ts` — independent
728
- * of `remote` and of the broker's `get_commands` reply (see that
729
- * function's doc comment). Deliberately NEVER the merged display/
730
- * completion list (`slashCommandList` is a different, remote-filtered,
731
- * broker-augmented list, not a dispatch predicate). */
732
- localCommandNames = new Set();
733
- /** Leading tokens the ENGINE (broker) independently consumes as a leading
734
- * command/skill/template dispatch — the broker's own
735
- * `engineLeadingCommandNames`, checked against the UNTRIMMED leading-name
736
- * rule (`matchesEngineLeadingCommand`, mirroring the broker's own
737
- * `isLeadingEngineCommand`). Populated from each
738
- * `list_memory_refs` reply, alongside `resolvedRefNames`. */
739
- engineCommandNames = new Set();
740
- setResolvedRefNames(names) {
741
- this.resolvedRefNames = new Set(names);
742
- }
743
- /** The canonical names of memory refs currently resolvable in this session —
744
- * used to record ref usage on submit without counting non-ref slash tokens. */
745
- getResolvedRefNames() {
746
- return this.resolvedRefNames;
747
- }
748
- setLocalCommandNames(names) {
749
- this.localCommandNames = new Set(names);
750
- }
751
- setEngineCommandNames(names) {
752
- this.engineCommandNames = new Set(names);
753
- }
754
- /** Render-only decoration pass: underlines every resolved-ref span visible
755
- * in the already-rendered content rows, using a from-scratch layout
756
- * recompute (`buildRefLayoutChunks`) that mirrors the base editor's own
757
- * private `layoutText`/`scrollOffset`/`maxVisibleLines` math so row/column
758
- * offsets line up. Never mutates stored text; a span whose recomputed
759
- * offset doesn't verify against the real rendered row (see `decorateRow`)
760
- * is simply left undecorated. Suppressed entirely (command-wide) whenever
761
- * the composer's own leading token dispatches — as a LOCAL viewer command
762
- * (`localCommandNames`, TRIMMED rule) or as an ENGINE-consumed leading
763
- * command/skill/template (`engineCommandNames`, UNTRIMMED rule) — the ref
764
- * grammar and slash-dispatch's name charset differ, so
765
- * highlighting a ref inside a command that's about to dispatch would be
766
- * misleading chrome for text the command, not memory resolution, is about
767
- * to consume. The two rules are kept deliberately SEPARATE rather than
768
- * collapsed into one set/predicate: they classify against
769
- * different text (trimmed vs. raw) and different authorities (this
770
- * viewer's own dispatch vs. the broker's). */
771
- decorateResolvedRefs(lines, width) {
772
- if (this.resolvedRefNames.size === 0)
773
- return;
774
- const text = this.getText();
775
- const trimmedLeadingName = extractLeadingCommandName(text);
776
- if (trimmedLeadingName !== null && this.localCommandNames.has(trimmedLeadingName))
777
- return;
778
- if (matchesEngineLeadingCommand(text, this.engineCommandNames))
779
- return;
780
- const maxPadding = Math.max(0, Math.floor((width - 1) / 2));
781
- const paddingX = Math.min(this.getPaddingX(), maxPadding);
782
- const contentWidth = Math.max(1, width - paddingX * 2);
783
- const layoutWidth = Math.max(1, contentWidth - (paddingX ? 0 : 1));
784
- const logicalLines = this.getLines();
785
- const cursor = this.getCursor();
786
- const chunks = buildRefLayoutChunks(logicalLines, layoutWidth, cursor.line, cursor.col);
787
- // Private on the base `Editor`; render() above has already called
788
- // `super.render(width)`, so this reflects the scrollOffset THIS render
789
- // settled on — the same structural-cast pattern used elsewhere in this
790
- // file (e.g. the `historyIndex` cast in titled-editor-preview.test.ts).
791
- const scrollOffset = this.scrollOffset;
792
- const maxVisibleLines = Math.max(5, Math.floor(this.tui.terminal.rows * 0.3));
793
- const visibleCount = Math.min(Math.max(0, chunks.length - scrollOffset), maxVisibleLines);
794
- if (visibleCount <= 0 || lines.length < 1 + visibleCount)
795
- return; // mismatch -> skip entirely
796
- const spansByLine = new Map();
797
- for (let r = 0; r < visibleCount; r++) {
798
- const chunk = chunks[scrollOffset + r];
799
- if (!chunk)
800
- continue;
801
- let spans = spansByLine.get(chunk.logicalLine);
802
- if (spans === undefined) {
803
- spans = resolvedSpansForLine(logicalLines[chunk.logicalLine] ?? '', this.resolvedRefNames);
804
- spansByLine.set(chunk.logicalLine, spans);
805
- }
806
- const contained = spans.filter((s) => s.start >= chunk.startIndex && s.end <= chunk.endIndex);
807
- if (contained.length === 0)
808
- continue;
809
- const rowStr = lines[1 + r];
810
- if (rowStr === undefined)
811
- continue;
812
- lines[1 + r] = decorateRow(rowStr, chunk, contained, logicalLines[chunk.logicalLine] ?? '', paddingX);
813
- }
814
- }
815
- render(width) {
816
- const lines = super.render(width);
817
- if (!this.paneFocused) {
818
- for (let i = 0; i < lines.length; i++) {
819
- const hollowed = outlineCursorLine(lines[i]);
820
- if (hollowed !== undefined) {
821
- lines[i] = hollowed;
822
- break;
823
- }
824
- }
825
- }
826
- this.decorateResolvedRefs(lines, width);
827
- if (this.loadedCommand !== undefined && lines.length >= 2 && width >= 8) {
828
- const innerWidth = width - 4;
829
- const body = compactLoadedCommandPreview(this.loadedCommand.content, innerWidth);
830
- // At narrow widths the disclosure is suppressed rather than clipping away
831
- // its inspect affordance. Put that affordance first when it does render.
832
- if (body.length === 0)
833
- return lines;
834
- const label = ` ${this.loadedCommand.inspectHint} · /${this.loadedCommand.name} loaded `;
835
- const framed = body.map((line) => {
836
- const clipped = truncateToWidth(line, innerWidth);
837
- return `${this.borderColor('│')} ${clipped}${' '.repeat(Math.max(0, innerWidth - visibleWidth(clipped)))} ${this.borderColor('│')}`;
838
- });
839
- const dividerText = truncateToWidth(label, width - 2);
840
- const remaining = Math.max(0, width - 2 - visibleWidth(dividerText));
841
- const divider = this.borderColor(`├${dividerText}${'─'.repeat(remaining)}┤`);
842
- lines.splice(1, 0, divider, ...framed, this.borderColor(`├${'─'.repeat(width - 2)}┤`));
843
- }
844
- if ((this.title || this.info) && lines.length > 0) {
845
- // Replace the stock top border; dashes in the current (thinking-aware)
846
- // border color.
847
- lines[0] = composeTopBorder(width, this.title, this.info, this.titleStyle, (s) => this.borderColor(s));
848
- }
849
- if (this.contextBadge && lines.length > 0) {
850
- const badge = this.contextBadgeStyle(this.contextBadge);
851
- const badgeWidth = visibleWidth(badge);
852
- if (badgeWidth + 2 < width) {
853
- const last = lines.length - 1;
854
- lines[last] = truncateToWidth(lines[last], width - badgeWidth, '') + badge;
855
- }
856
- }
857
- return lines;
858
- }
859
- }
1
+ var w=Object.defineProperty;var d=(s,e)=>w(s,"name",{value:e,configurable:!0});import{statSync as D}from"node:fs";import{CustomEditor as B}from"@earendil-works/pi-coding-agent";import{CURSOR_MARKER as E,truncateToWidth as C,visibleWidth as b,wrapTextWithAnsi as v}from"@earendil-works/pi-tui";import{wordWrapLine as H}from"@earendil-works/pi-tui/dist/components/editor.js";import{findRefTokens as F}from"../../../core/memory/inline-ref-grammar.js";import{findRefCompletionContext as G}from"./ref-autocomplete.js";const M=8,U=24,V=8192;function K(s,e){const t=s.slice(0,e),n=s.length>e;return{text:t.replace(/\x1b\](?:[^\x07\x1b]*)(?:\x07|\x1b\\)?/g,"").replace(/\x1b\[[0-?]*[ -/]*[@-~]/g,"").replace(/[\x00-\x09\x0b-\x1f\x7f-\x9f]/g,""),truncated:n}}d(K,"sanitizeLoadedCommandPreview");function j(s,e){if(e<U)return[];const t=Math.min(V,Math.max(256,e*M*4)),n=K(s,t),r=v(n.text,e);if(!n.truncated&&r.length<=M)return r;const c=r.slice(0,M-1);return c.push(C("\u2026 truncated \xB7 inspect for full prompt",e)),c}d(j,"compactLoadedCommandPreview");const S=[46,92,190],R=[166,98,24],z=[0,145,170];function L(s,e,t){return[Math.round(s[0]+(e[0]-s[0])*t),Math.round(s[1]+(e[1]-s[1])*t),Math.round(s[2]+(e[2]-s[2])*t)]}d(L,"interpolateRgb");const P={off:void 0,minimal:L(S,R,0/4),low:L(S,R,1/4),medium:L(S,R,2/4),high:L(S,R,3/4),xhigh:L(S,R,4/4),max:z},X={black:[0,0,0],red:[205,49,49],green:[13,188,121],yellow:[229,229,16],blue:[36,114,200],magenta:[188,63,188],cyan:[17,168,205],white:[229,229,229],orange:[228,152,68],grey:[128,128,128],gray:[128,128,128],brightred:[241,76,76],brightgreen:[35,209,139],brightyellow:[245,245,67],brightblue:[59,142,234],brightmagenta:[214,112,214],brightcyan:[41,184,219]};function xe(s){const e=s.trim().toLowerCase(),t=/^colour(\d{1,3})$/.exec(e);if(t!==null)return a=>`\x1B[48;5;${t[1]}m\x1B[97m\x1B[1m ${a} \x1B[0m`;let n;const r=/^#([0-9a-f]{6})$/.exec(e);if(r!==null){const a=r[1];n=[parseInt(a.slice(0,2),16),parseInt(a.slice(2,4),16),parseInt(a.slice(4,6),16)]}else n=X[e];if(n===void 0)return;const[c,i,o]=n,u=.299*c+.587*i+.114*o>160?"\x1B[30m":"\x1B[97m";return a=>`\x1B[48;2;${c};${i};${o}m${u}\x1B[1m ${a} \x1B[0m`}d(xe,"colorChipStyle");const k=d(s=>`\x1B[7m ${s} \x1B[27m`,"defaultTitleStyle");function pe(s,e){const t=s===void 0?void 0:P[s];if(t===void 0)return e;const[n,r,c]=t;return i=>`\x1B[38;2;${n};${r};${c}m${i}\x1B[39m`}d(pe,"thinkingBorderColor");function be(s,e){const t=s===void 0?void 0:P[s];if(t===void 0)return e;const[n,r,c]=t;return i=>`\x1B[48;2;${n};${r};${c}m\x1B[97m\x1B[1m ${i} \x1B[0m`}d(be,"thinkingTitleStyle");function Y(s,e,t,n,r){const c=e?n(C(e,Math.max(1,s-4),"\u2026")):"",i=b(c),o=s-i;let l="";t&&o>4&&(l=b(t)<=o?t:C(t,o,"\u2026"));const u=Math.max(0,s-i-b(l));return c+r("\u2500".repeat(u))+l}d(Y,"composeTopBorder");const N="\x1B[7m",A="\x1B[0m",_="\x1B[48;5;240m";function q(s){const e=s.indexOf(E);if(e===-1)return;const t=e+E.length;if(!s.startsWith(N,t))return;const n=t+N.length,r=s.indexOf(A,n);if(r===-1)return;const c=s.slice(n,r),i=`${_}${c}\x1B[0m`;return s.slice(0,t)+i+s.slice(r+A.length)}d(q,"outlineCursorLine");const Z=/\.(png|jpe?g|gif|webp|bmp)$/i;function J(s){const e=s.match(/\x1b\[200~([\s\S]*?)\x1b\[201~/);let t=(e?e[1]:s).trim();if(t.length<2||/[\u0000-\u0008\u000e-\u001f]/.test(t))return null;(t.startsWith("'")&&t.endsWith("'")||t.startsWith('"')&&t.endsWith('"'))&&(t=t.slice(1,-1));const n=t.replace(/\\(.)/g,"$1");if(/\n/.test(n)||!Z.test(n))return null;try{if(!D(n).isFile())return null}catch{return null}return n}d(J,"detectDroppedImagePath");function Q(s,e,t,n){const r=[];if(s.length===0||s.length===1&&s[0]==="")return r.push({logicalLine:0,startIndex:0,endIndex:0,text:"",hasCursor:!0,cursorPos:0}),r;for(let c=0;c<s.length;c++){const i=s[c]??"",o=c===t;if(b(i)<=e){r.push({logicalLine:c,startIndex:0,endIndex:i.length,text:i,hasCursor:o,cursorPos:o?n:0});continue}const l=H(i,e);for(let u=0;u<l.length;u++){const a=l[u];if(!a)continue;const h=u===l.length-1;let m=!1,f=0;o&&(h?(m=n>=a.startIndex,f=n-a.startIndex):(m=n>=a.startIndex&&n<a.endIndex,m&&(f=n-a.startIndex,f>a.text.length&&(f=a.text.length)))),r.push({logicalLine:c,startIndex:a.startIndex,endIndex:a.endIndex,text:a.text,hasCursor:m,cursorPos:f})}}return r}d(Q,"buildRefLayoutChunks");function ee(s,e){return F(s).filter(t=>e.has(t.candidate)).map(t=>({start:t.start,end:t.end}))}d(ee,"resolvedSpansForLine");const te="\x1B[4m\x1B[2m",ne="\x1B[24m\x1B[22m",se=new Intl.Segmenter(void 0,{granularity:"grapheme"});function re(s){for(const e of se.segment(s))return e.segment.length;return 0}d(re,"firstGraphemeLength");function ie(s){const e=s.indexOf(E),t=e===-1?0:e+E.length;let n=s.indexOf(N,t),r=N.length;if(n===-1&&(n=s.indexOf(_,t),r=_.length),n===-1)return null;const c=s.indexOf(A,n+r);return c===-1?null:{start:e!==-1?e:n,end:c+A.length}}d(ie,"locateCursorCell");function oe(s,e,t,n,r){const c=[];if(e.hasCursor){const o=ie(s);if(o===null)return s;const l=e.text.slice(e.cursorPos),u=l.length===0?0:re(l),a=e.cursorPos+u;for(const h of t){const m=h.start-e.startIndex,f=h.end-e.startIndex;if(f<=e.cursorPos){const g=r+m,x=r+f;x<=o.start&&s.slice(g,x)===n.slice(h.start,h.end)&&c.push({absStart:g,absEnd:x})}else if(m>=a){const g=o.end+(m-a),x=o.end+(f-a);g>=o.end&&s.slice(g,x)===n.slice(h.start,h.end)&&c.push({absStart:g,absEnd:x})}}}else for(const o of t){const l=r+(o.start-e.startIndex),u=r+(o.end-e.startIndex);s.slice(l,u)===n.slice(o.start,o.end)&&c.push({absStart:l,absEnd:u})}if(c.length===0)return s;c.sort((o,l)=>l.absStart-o.absStart);let i=s;for(const o of c)i=i.slice(0,o.absStart)+te+i.slice(o.absStart,o.absEnd)+ne+i.slice(o.absEnd);return i}d(oe,"decorateRow");function ce(s){const e=/^\/(\S+)\s*([\s\S]*)$/.exec(s.trim());return e?e[1]:null}d(ce,"extractLeadingCommandName");function ae(s,e){if(!s.startsWith("/"))return!1;const t=s.indexOf(" "),n=t===-1?s.slice(1):s.slice(1,t);if(e.has(n))return!0;if(s.startsWith("/skill:")){const r=t===-1?s.slice(7):s.slice(7,t);if(e.has(`skill:${r}`))return!0}return!1}d(ae,"matchesEngineLeadingCommand");class W extends B{static{d(this,"TitledEditor")}km;pendingRawSubmitText;realOnSubmit;pendingReturn;static PASTE_BURST_MS=10;constructor(e,t,n,r){super(e,t,n,r),this.km=n;const c=this.submitValue.bind(this);this.submitValue=()=>{const i=this;this.pendingRawSubmitText=i.getExpandedText(),c()},Object.defineProperty(this,"onSubmit",{configurable:!0,get:d(()=>i=>{const o=this.pendingRawSubmitText??i;this.pendingRawSubmitText=void 0,this.realOnSubmit?.(o)},"get"),set:d(i=>{this.realOnSubmit=i},"set")})}onPasteImagePath;settleHeldReturn(e){const t=this.pendingReturn;if(t!==void 0){if(clearTimeout(t.timer),this.pendingReturn=void 0,e==="newline"){this.insertTextAtCursor(`
2
+ `);return}super.handleInput(t.data),this.tui.requestRender()}}imageTokenWidthBeforeCursor(){const{line:e,col:t}=this.getCursor(),n=this.getLines()[e];if(n===void 0)return 0;const r=n.slice(0,t).match(/\[Image #\d+\]$/);return r?r[0].length:0}imageTokenWidthAfterCursor(){const{line:e,col:t}=this.getCursor(),n=this.getLines()[e];if(n===void 0)return 0;const r=n.slice(t).match(/^\[Image #\d+\]/);return r?r[0].length:0}handleInput(e){if(this.settleHeldReturn("newline"),!this.isShowingAutocomplete()&&this.km.matches(e,"tui.editor.cursorDown")){const i=this,o=this.getCursor(),l=i.historyIndex;super.handleInput(e);const u=this.getCursor();i.historyIndex===l&&u.line===o.line&&u.col===o.col&&this.onCursorDownAtBottom?.();return}if(!this.isShowingAutocomplete()&&this.km.matches(e,"tui.input.newLine")){this.insertTextAtCursor(`
3
+ `);return}if(!this.isShowingAutocomplete()&&this.km.matches(e,"tui.editor.deleteCharBackward")){const i=this.imageTokenWidthBeforeCursor();if(i>1){for(let o=0;o<i;o++)super.handleInput(e);return}}if(!this.isShowingAutocomplete()&&this.km.matches(e,"tui.editor.cursorLeft")){const i=this.imageTokenWidthBeforeCursor();if(i>1){for(let o=0;o<i;o++)super.handleInput(e);return}}if(!this.isShowingAutocomplete()&&this.km.matches(e,"tui.editor.cursorRight")){const i=this.imageTokenWidthAfterCursor();if(i>1){for(let o=0;o<i;o++)super.handleInput(e);return}}const t=J(e);if(t&&this.onPasteImagePath?.(t))return;if((e==="\r"||e===`
4
+ `)&&!this.isShowingAutocomplete()){this.pendingReturn={data:e,timer:setTimeout(()=>this.settleHeldReturn("submit"),W.PASTE_BURST_MS)};return}const{line:n,col:r}=this.getCursor(),c=this.getLines()[n]??"";super.handleInput(e),this.maybeTriggerNonLeadingRefAutocomplete(n,r,c)}maybeTriggerNonLeadingRefAutocomplete(e,t,n){if(this.isShowingAutocomplete())return;const r=this.getCursor();if(r.line!==e||r.col!==t+1)return;const c=this.getLines()[r.line]??"";if(c.length!==n.length+1)return;const i=c[t];if(i===void 0||i!=="/"&&!/[A-Za-z0-9_:-]/.test(i))return;const o=G(this.getLines(),r.line,r.col);!o||o.kind!=="ref"||this.tryTriggerAutocomplete()}onCursorDownAtBottom;loadedCommand;title="";info="";contextBadge="";titleStyle=k;contextBadgeStyle=k;paneFocused=!0;resolvedRefNames=new Set;localCommandNames=new Set;engineCommandNames=new Set;setResolvedRefNames(e){this.resolvedRefNames=new Set(e)}getResolvedRefNames(){return this.resolvedRefNames}setLocalCommandNames(e){this.localCommandNames=new Set(e)}setEngineCommandNames(e){this.engineCommandNames=new Set(e)}decorateResolvedRefs(e,t){if(this.resolvedRefNames.size===0)return;const n=this.getText(),r=ce(n);if(r!==null&&this.localCommandNames.has(r)||ae(n,this.engineCommandNames))return;const c=Math.max(0,Math.floor((t-1)/2)),i=Math.min(this.getPaddingX(),c),o=Math.max(1,t-i*2),l=Math.max(1,o-(i?0:1)),u=this.getLines(),a=this.getCursor(),h=Q(u,l,a.line,a.col),m=this.scrollOffset,f=Math.max(5,Math.floor(this.tui.terminal.rows*.3)),g=Math.min(Math.max(0,h.length-m),f);if(g<=0||e.length<1+g)return;const x=new Map;for(let I=0;I<g;I++){const p=h[m+I];if(!p)continue;let T=x.get(p.logicalLine);T===void 0&&(T=ee(u[p.logicalLine]??"",this.resolvedRefNames),x.set(p.logicalLine,T));const $=T.filter(y=>y.start>=p.startIndex&&y.end<=p.endIndex);if($.length===0)continue;const O=e[1+I];O!==void 0&&(e[1+I]=oe(O,p,$,u[p.logicalLine]??"",i))}}render(e){const t=super.render(e);if(!this.paneFocused)for(let n=0;n<t.length;n++){const r=q(t[n]);if(r!==void 0){t[n]=r;break}}if(this.decorateResolvedRefs(t,e),this.loadedCommand!==void 0&&t.length>=2&&e>=8){const n=e-4,r=j(this.loadedCommand.content,n);if(r.length===0)return t;const c=` ${this.loadedCommand.inspectHint} \xB7 /${this.loadedCommand.name} loaded `,i=r.map(a=>{const h=C(a,n);return`${this.borderColor("\u2502")} ${h}${" ".repeat(Math.max(0,n-b(h)))} ${this.borderColor("\u2502")}`}),o=C(c,e-2),l=Math.max(0,e-2-b(o)),u=this.borderColor(`\u251C${o}${"\u2500".repeat(l)}\u2524`);t.splice(1,0,u,...i,this.borderColor(`\u251C${"\u2500".repeat(e-2)}\u2524`))}if((this.title||this.info)&&t.length>0&&(t[0]=Y(e,this.title,this.info,this.titleStyle,n=>this.borderColor(n))),this.contextBadge&&t.length>0){const n=this.contextBadgeStyle(this.contextBadge),r=b(n);if(r+2<e){const c=t.length-1;t[c]=C(t[c],e-r,"")+n}}return t}}export{W as TitledEditor,Q as buildRefLayoutChunks,xe as colorChipStyle,j as compactLoadedCommandPreview,Y as composeTopBorder,oe as decorateRow,k as defaultTitleStyle,J as detectDroppedImagePath,q as outlineCursorLine,pe as thinkingBorderColor,be as thinkingTitleStyle};