@aragon-agent/cli 0.6.46 → 0.6.48

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 (775) hide show
  1. package/CHANGELOG.md +28 -0
  2. package/README.md +80 -12
  3. package/dist/agent/coalesce.d.ts +5 -1
  4. package/dist/agent/coalesce.js +13 -0
  5. package/dist/agent/controller.d.ts +41 -20
  6. package/dist/agent/controller.js +68 -15
  7. package/dist/agent/conversation-reset.d.ts +1 -1
  8. package/dist/agent/governance-wiring.d.ts +6 -6
  9. package/dist/agent/governance-wiring.js +4 -4
  10. package/dist/agent/headless.d.ts +5 -5
  11. package/dist/agent/headless.js +4 -4
  12. package/dist/agent/job-notices.d.ts +1 -1
  13. package/dist/agent/job-notices.js +1 -1
  14. package/dist/agent/kit-apply.d.ts +3 -3
  15. package/dist/agent/kit-apply.js +3 -3
  16. package/dist/agent/model-profile-settings.d.ts +2 -2
  17. package/dist/agent/model-profile-settings.js +6 -6
  18. package/dist/agent/prompt-options.d.ts +1 -1
  19. package/dist/agent/system-prompt.d.ts +1 -1
  20. package/dist/agent/user-attention.d.ts +17 -0
  21. package/dist/agent/user-attention.js +32 -0
  22. package/dist/{ui → app}/App.d.ts +9 -9
  23. package/dist/{ui → app}/App.js +113 -79
  24. package/dist/{ui → app}/use-startup-notices.d.ts +1 -1
  25. package/dist/{ui → app}/use-startup-notices.js +2 -2
  26. package/dist/cli.js +31 -32
  27. package/dist/commands/agents-command.js +1 -1
  28. package/dist/commands/builtins.js +9 -9
  29. package/dist/commands/governance-command.js +2 -2
  30. package/dist/commands/governance-runs-table.js +1 -1
  31. package/dist/commands/kit-command.js +1 -1
  32. package/dist/commands/perf.d.ts +3 -3
  33. package/dist/commands/perf.js +1 -1
  34. package/dist/commands/registry.d.ts +8 -8
  35. package/dist/commands/skills.js +2 -2
  36. package/dist/commands/team-command.js +1 -1
  37. package/dist/compaction/archive.d.ts +1 -1
  38. package/dist/compaction/archive.js +1 -1
  39. package/dist/compaction/child.d.ts +3 -3
  40. package/dist/compaction/child.js +4 -4
  41. package/dist/compaction/command.js +5 -5
  42. package/dist/compaction/compactor.d.ts +6 -6
  43. package/dist/compaction/compactor.js +6 -6
  44. package/dist/compaction/context-command.js +1 -1
  45. package/dist/compaction/digest.js +1 -1
  46. package/dist/compaction/memory-input.js +1 -1
  47. package/dist/compaction/memory-validation.js +1 -1
  48. package/dist/compaction/memory.js +1 -1
  49. package/dist/compaction/summarize-call.js +1 -1
  50. package/dist/compaction/summary-prompt.js +1 -1
  51. package/dist/compaction/tail-budget.js +2 -2
  52. package/dist/compaction/wiring.d.ts +5 -5
  53. package/dist/compaction/wiring.js +2 -2
  54. package/dist/config/cli-commands.d.ts +1 -1
  55. package/dist/config/cli-commands.js +3 -3
  56. package/dist/config/env.d.ts +1 -1
  57. package/dist/config/env.js +4 -4
  58. package/dist/config/load.d.ts +2 -2
  59. package/dist/config/load.js +10 -31
  60. package/dist/config/migrate-state-out-of-config.js +1 -1
  61. package/dist/config/model-profile-store.d.ts +4 -54
  62. package/dist/config/model-profile-store.js +3 -3
  63. package/dist/config/prompt-history.js +1 -1
  64. package/dist/config/store.d.ts +2 -2
  65. package/dist/config/store.js +3 -3
  66. package/dist/diagnostics/doctor.js +4 -4
  67. package/dist/exec/bridge/decisions.d.ts +1 -1
  68. package/dist/exec/bridge/human-answers.d.ts +1 -1
  69. package/dist/exec/bridge/human-answers.js +1 -1
  70. package/dist/exec/bridge/protocol.d.ts +1 -1
  71. package/dist/exec/bridge/server.js +1 -1
  72. package/dist/exec/events.d.ts +2 -2
  73. package/dist/exec/index.d.ts +1 -1
  74. package/dist/exec/index.js +1 -1
  75. package/dist/exec/permission.js +1 -1
  76. package/dist/exec/runner.d.ts +3 -3
  77. package/dist/exec/runner.js +2 -2
  78. package/dist/exec/threads/runtime.js +1 -1
  79. package/dist/fast/digest.d.ts +1 -1
  80. package/dist/fast/digest.js +1 -1
  81. package/dist/fast/frames.d.ts +1 -1
  82. package/dist/fast/frames.js +1 -1
  83. package/dist/fast/prompt.d.ts +1 -1
  84. package/dist/fast/prompt.js +1 -1
  85. package/dist/fast/review-call.js +1 -1
  86. package/dist/fast/reviewer.d.ts +3 -3
  87. package/dist/fast/reviewer.js +1 -1
  88. package/dist/fast/summary-call.d.ts +3 -3
  89. package/dist/fast/summary-call.js +2 -2
  90. package/dist/fast/summary-prompt.d.ts +1 -1
  91. package/dist/fast/summary-prompt.js +1 -1
  92. package/dist/fast/wiring.d.ts +4 -4
  93. package/dist/fast/wiring.js +1 -1
  94. package/dist/governance/card-normalize.d.ts +1 -1
  95. package/dist/governance/copy.d.ts +1 -1
  96. package/dist/governance/copy.js +2 -2
  97. package/dist/governance/engine/artifact-persist.d.ts +1 -1
  98. package/dist/governance/engine/budget.d.ts +1 -1
  99. package/dist/governance/engine/budget.js +1 -1
  100. package/dist/governance/engine/cards.d.ts +1 -1
  101. package/dist/governance/engine/digest.js +1 -1
  102. package/dist/governance/engine/engine-core.d.ts +5 -5
  103. package/dist/governance/engine/engine-core.js +1 -1
  104. package/dist/governance/engine/engine.d.ts +1 -1
  105. package/dist/governance/engine/engine.js +1 -1
  106. package/dist/governance/engine/estimate.d.ts +1 -1
  107. package/dist/governance/engine/estimate.js +1 -1
  108. package/dist/governance/engine/inspector.js +2 -2
  109. package/dist/governance/engine/integration.d.ts +1 -1
  110. package/dist/governance/engine/lifecycle.d.ts +1 -1
  111. package/dist/governance/engine/lifecycle.js +1 -1
  112. package/dist/governance/engine/phase-members.d.ts +1 -1
  113. package/dist/governance/engine/phase-planner.d.ts +1 -1
  114. package/dist/governance/engine/phase-planner.js +1 -1
  115. package/dist/governance/engine/rebuild.d.ts +1 -1
  116. package/dist/governance/engine/report.d.ts +1 -1
  117. package/dist/governance/engine/report.js +1 -1
  118. package/dist/governance/engine/run-digest.d.ts +1 -1
  119. package/dist/governance/engine/spec-builder.d.ts +2 -2
  120. package/dist/governance/engine/spec-builder.js +2 -2
  121. package/dist/governance/engine/stage-runner.js +2 -2
  122. package/dist/governance/engine/start-input.d.ts +1 -1
  123. package/dist/governance/engine/start-input.js +1 -1
  124. package/dist/governance/engine/state-machine.d.ts +1 -1
  125. package/dist/governance/engine/state-machine.js +3 -3
  126. package/dist/governance/engine/submission-queries.d.ts +1 -1
  127. package/dist/governance/engine/submission-render.d.ts +1 -1
  128. package/dist/governance/engine/submissions.d.ts +1 -1
  129. package/dist/governance/engine/submissions.js +1 -1
  130. package/dist/governance/engine/visibility.d.ts +1 -1
  131. package/dist/governance/engine/visibility.js +1 -1
  132. package/dist/governance/posture-transition.d.ts +2 -2
  133. package/dist/governance/posture-transition.js +1 -1
  134. package/dist/governance/profiles.d.ts +1 -1
  135. package/dist/governance/prompts/orchestrator-block.d.ts +2 -2
  136. package/dist/governance/prompts/orchestrator-block.js +2 -2
  137. package/dist/governance/prompts/plan-addendum.d.ts +1 -1
  138. package/dist/governance/prompts/plan-addendum.js +1 -1
  139. package/dist/governance/prompts/role-blocks.d.ts +2 -2
  140. package/dist/governance/prompts/role-blocks.js +1 -1
  141. package/dist/governance/report-reader.js +1 -1
  142. package/dist/governance/roles.d.ts +1 -1
  143. package/dist/governance/rules/claims.d.ts +1 -1
  144. package/dist/governance/rules/claims.js +1 -1
  145. package/dist/governance/rules/elimination.d.ts +1 -1
  146. package/dist/governance/rules/elimination.js +1 -1
  147. package/dist/governance/rules/failure-analysis.d.ts +2 -2
  148. package/dist/governance/rules/failure-analysis.js +1 -1
  149. package/dist/governance/rules/ledger-replay.d.ts +1 -1
  150. package/dist/governance/rules/ledger-state.d.ts +1 -1
  151. package/dist/governance/rules/ledger-state.js +1 -1
  152. package/dist/governance/rules/ledger.d.ts +2 -2
  153. package/dist/governance/rules/ledger.js +2 -2
  154. package/dist/governance/rules/rca.d.ts +1 -1
  155. package/dist/governance/rules/rca.js +1 -1
  156. package/dist/governance/rules/settlement.d.ts +2 -2
  157. package/dist/governance/rules/settlement.js +2 -2
  158. package/dist/governance/rules/suspicion.d.ts +1 -1
  159. package/dist/governance/store/artifacts.d.ts +1 -1
  160. package/dist/governance/store/artifacts.js +1 -1
  161. package/dist/governance/store/events-log.d.ts +1 -1
  162. package/dist/governance/store/run-store.d.ts +1 -1
  163. package/dist/governance/store/run-store.js +1 -1
  164. package/dist/governance/store/scoreboard-export.d.ts +1 -1
  165. package/dist/governance/tools/child-tools.d.ts +1 -1
  166. package/dist/governance/tools/guard.d.ts +1 -1
  167. package/dist/governance/tools/guard.js +1 -1
  168. package/dist/governance/tools/inspector-tools.d.ts +2 -2
  169. package/dist/governance/tools/inspector-tools.js +2 -2
  170. package/dist/governance/tools/lead-tools.d.ts +1 -1
  171. package/dist/governance/tools/lead-tools.js +1 -1
  172. package/dist/governance/tools/normalize-util.js +1 -1
  173. package/dist/governance/tools/scan-incomplete.js +1 -1
  174. package/dist/governance/tools/shared-tools.d.ts +1 -1
  175. package/dist/governance/tools/shared-tools.js +1 -1
  176. package/dist/governance/tools/submit-normalizers.d.ts +1 -1
  177. package/dist/governance/tools/submit-normalizers.js +1 -1
  178. package/dist/governance/tools/submit-tools.d.ts +1 -1
  179. package/dist/logging/cli-commands.js +1 -1
  180. package/dist/logging/install.d.ts +1 -1
  181. package/dist/logging/install.js +3 -3
  182. package/dist/logging/logger.d.ts +2 -2
  183. package/dist/logging/logger.js +31 -2
  184. package/dist/proc/kill-tree.js +1 -1
  185. package/dist/proc/log-mirror.js +1 -1
  186. package/dist/proc/log-ring.js +2 -2
  187. package/dist/proc/notices.d.ts +1 -1
  188. package/dist/proc/notices.js +2 -2
  189. package/dist/proc/prompt.d.ts +1 -1
  190. package/dist/proc/prompt.js +8 -5
  191. package/dist/proc/readiness.js +1 -1
  192. package/dist/proc/supervisor.d.ts +1 -1
  193. package/dist/proc/supervisor.js +10 -4
  194. package/dist/proc/wait-plan.d.ts +39 -0
  195. package/dist/proc/wait-plan.js +77 -0
  196. package/dist/proc/wait.d.ts +37 -4
  197. package/dist/proc/wait.js +68 -5
  198. package/dist/prompts/command.d.ts +1 -1
  199. package/dist/prompts/command.js +1 -1
  200. package/dist/prompts/normalize.d.ts +1 -1
  201. package/dist/prompts/normalize.js +1 -1
  202. package/dist/prompts/resolve.d.ts +1 -1
  203. package/dist/prompts/store.d.ts +2 -12
  204. package/dist/prompts/store.js +6 -60
  205. package/dist/session/checkpoint.d.ts +2 -2
  206. package/dist/session/checkpoint.js +2 -0
  207. package/dist/session/clear-archive.d.ts +2 -2
  208. package/dist/session/persist.d.ts +2 -2
  209. package/dist/session/persist.js +20 -3
  210. package/dist/session/startup-session.d.ts +2 -2
  211. package/dist/session/validate-session.js +6 -3
  212. package/dist/skills/service.d.ts +2 -2
  213. package/dist/team/bus.d.ts +1 -1
  214. package/dist/team/bus.js +1 -1
  215. package/dist/team/child-reviewer.d.ts +2 -2
  216. package/dist/team/child-reviewer.js +1 -1
  217. package/dist/team/comm-tools.js +1 -1
  218. package/dist/team/dispatch-gate.js +1 -1
  219. package/dist/team/forced-dispatch.js +1 -1
  220. package/dist/team/forced-mode.d.ts +1 -1
  221. package/dist/team/forced-prompt.d.ts +1 -1
  222. package/dist/team/forced-prompt.js +1 -1
  223. package/dist/team/normalize.d.ts +1 -1
  224. package/dist/team/normalize.js +1 -1
  225. package/dist/team/overseer.d.ts +3 -3
  226. package/dist/team/overseer.js +3 -3
  227. package/dist/team/prompt.d.ts +1 -1
  228. package/dist/team/prompt.js +1 -1
  229. package/dist/team/report.d.ts +2 -2
  230. package/dist/team/report.js +2 -2
  231. package/dist/team/retry.d.ts +1 -1
  232. package/dist/team/retry.js +1 -1
  233. package/dist/team/runtime.d.ts +4 -4
  234. package/dist/team/runtime.js +2 -2
  235. package/dist/team/settled.d.ts +2 -2
  236. package/dist/team/subagent.d.ts +4 -4
  237. package/dist/team/subagent.js +5 -5
  238. package/dist/team/task-tool.d.ts +1 -1
  239. package/dist/team/task-tool.js +1 -1
  240. package/dist/todo/normalize.d.ts +1 -1
  241. package/dist/todo/normalize.js +1 -1
  242. package/dist/todo/prompt.d.ts +1 -1
  243. package/dist/todo/prompt.js +1 -1
  244. package/dist/todo/store.d.ts +1 -1
  245. package/dist/todo/store.js +2 -2
  246. package/dist/todo/todo-tool.d.ts +1 -1
  247. package/dist/todo/todo-tool.js +2 -2
  248. package/dist/tools/bash-tool.d.ts +1 -1
  249. package/dist/tools/bash-tool.js +2 -2
  250. package/dist/tools/diff.d.ts +1 -1
  251. package/dist/tools/diff.js +1 -1
  252. package/dist/tools/file-change-store.d.ts +1 -1
  253. package/dist/tools/fs-tools.d.ts +2 -2
  254. package/dist/tools/fs-tools.js +1 -1
  255. package/dist/tools/index.d.ts +3 -3
  256. package/dist/tools/index.js +1 -1
  257. package/dist/tools/job-tools.d.ts +14 -3
  258. package/dist/tools/job-tools.js +158 -35
  259. package/dist/tools/plan-tools.d.ts +1 -1
  260. package/dist/tools/plan-tools.js +1 -1
  261. package/dist/tools/proc-tools.d.ts +1 -1
  262. package/dist/tools/proc-tools.js +2 -2
  263. package/dist/update/classify-failure.d.ts +1 -1
  264. package/dist/update/install-lock.js +1 -1
  265. package/dist/update/install-source.d.ts +1 -1
  266. package/dist/update/installer.js +2 -2
  267. package/dist/update/npm-view.d.ts +1 -1
  268. package/dist/update/npm-view.js +1 -1
  269. package/dist/update/registry.d.ts +1 -1
  270. package/dist/update/registry.js +1 -1
  271. package/dist/update/service.d.ts +2 -2
  272. package/dist/update/service.js +2 -2
  273. package/package.json +7 -7
  274. package/dist/agent/agent-mode.d.ts +0 -108
  275. package/dist/agent/agent-mode.js +0 -121
  276. package/dist/agent/entry-limits.d.ts +0 -65
  277. package/dist/agent/entry-limits.js +0 -133
  278. package/dist/agent/governance-view.d.ts +0 -40
  279. package/dist/agent/governance-view.js +0 -40
  280. package/dist/agent/invocation-card.d.ts +0 -77
  281. package/dist/agent/invocation-card.js +0 -169
  282. package/dist/agent/model-probe-limits.d.ts +0 -39
  283. package/dist/agent/model-probe-limits.js +0 -25
  284. package/dist/agent/model-probe.d.ts +0 -104
  285. package/dist/agent/model-probe.js +0 -391
  286. package/dist/agent/queued-messages.d.ts +0 -23
  287. package/dist/agent/queued-messages.js +0 -49
  288. package/dist/agent/reducer.d.ts +0 -837
  289. package/dist/agent/reducer.js +0 -1617
  290. package/dist/agent/retry-view.d.ts +0 -68
  291. package/dist/agent/retry-view.js +0 -95
  292. package/dist/agent/usage.d.ts +0 -47
  293. package/dist/agent/usage.js +0 -84
  294. package/dist/compaction/limits.d.ts +0 -61
  295. package/dist/compaction/limits.js +0 -64
  296. package/dist/compaction/meter.d.ts +0 -276
  297. package/dist/compaction/meter.js +0 -512
  298. package/dist/compaction/pressure.d.ts +0 -163
  299. package/dist/compaction/pressure.js +0 -199
  300. package/dist/compaction/reason-text.d.ts +0 -36
  301. package/dist/compaction/reason-text.js +0 -78
  302. package/dist/compaction/types.d.ts +0 -360
  303. package/dist/compaction/types.js +0 -22
  304. package/dist/config/governance-config.d.ts +0 -125
  305. package/dist/config/governance-config.js +0 -164
  306. package/dist/config/kit-resolution.d.ts +0 -93
  307. package/dist/config/kit-resolution.js +0 -226
  308. package/dist/config/model-kits.d.ts +0 -225
  309. package/dist/config/model-kits.js +0 -302
  310. package/dist/config/model-profile-resolution.d.ts +0 -28
  311. package/dist/config/model-profile-resolution.js +0 -88
  312. package/dist/config/model-profiles.d.ts +0 -103
  313. package/dist/config/model-profiles.js +0 -188
  314. package/dist/config/schema.d.ts +0 -1645
  315. package/dist/config/schema.js +0 -1377
  316. package/dist/fast/limits.d.ts +0 -152
  317. package/dist/fast/limits.js +0 -152
  318. package/dist/fast/resolve.d.ts +0 -44
  319. package/dist/fast/resolve.js +0 -107
  320. package/dist/fast/task-summary-types.d.ts +0 -66
  321. package/dist/fast/task-summary-types.js +0 -17
  322. package/dist/fast/types.d.ts +0 -141
  323. package/dist/fast/types.js +0 -14
  324. package/dist/governance/governed-dispatch.d.ts +0 -19
  325. package/dist/governance/governed-dispatch.js +0 -17
  326. package/dist/governance/limits.d.ts +0 -107
  327. package/dist/governance/limits.js +0 -131
  328. package/dist/governance/posture.d.ts +0 -35
  329. package/dist/governance/posture.js +0 -59
  330. package/dist/governance/rules/events-table.d.ts +0 -46
  331. package/dist/governance/rules/events-table.js +0 -94
  332. package/dist/governance/types.d.ts +0 -661
  333. package/dist/governance/types.js +0 -27
  334. package/dist/input/control-sequences.d.ts +0 -71
  335. package/dist/input/control-sequences.js +0 -222
  336. package/dist/input/csiu-keys.d.ts +0 -66
  337. package/dist/input/csiu-keys.js +0 -181
  338. package/dist/input/cursor-report.d.ts +0 -61
  339. package/dist/input/cursor-report.js +0 -97
  340. package/dist/input/enter-sequences.d.ts +0 -64
  341. package/dist/input/enter-sequences.js +0 -153
  342. package/dist/input/interrupt-gesture.d.ts +0 -18
  343. package/dist/input/interrupt-gesture.js +0 -19
  344. package/dist/input/keyboard-enhancement.d.ts +0 -42
  345. package/dist/input/keyboard-enhancement.js +0 -65
  346. package/dist/input/keymap.d.ts +0 -20
  347. package/dist/input/keymap.js +0 -99
  348. package/dist/input/limits.d.ts +0 -118
  349. package/dist/input/limits.js +0 -109
  350. package/dist/input/mouse-events.d.ts +0 -87
  351. package/dist/input/mouse-events.js +0 -212
  352. package/dist/input/paste-parse.d.ts +0 -83
  353. package/dist/input/paste-parse.js +0 -107
  354. package/dist/input/pointer-router.d.ts +0 -11
  355. package/dist/input/pointer-router.js +0 -14
  356. package/dist/input/stdin-filter.d.ts +0 -112
  357. package/dist/input/stdin-filter.js +0 -657
  358. package/dist/input/win32-input-mode.d.ts +0 -61
  359. package/dist/input/win32-input-mode.js +0 -269
  360. package/dist/logging/levels.d.ts +0 -40
  361. package/dist/logging/levels.js +0 -59
  362. package/dist/logging/secret-registry.d.ts +0 -32
  363. package/dist/logging/secret-registry.js +0 -73
  364. package/dist/proc/limits.d.ts +0 -200
  365. package/dist/proc/limits.js +0 -207
  366. package/dist/proc/progress.d.ts +0 -40
  367. package/dist/proc/progress.js +0 -135
  368. package/dist/proc/types.d.ts +0 -263
  369. package/dist/proc/types.js +0 -15
  370. package/dist/prompts/copy.d.ts +0 -89
  371. package/dist/prompts/copy.js +0 -131
  372. package/dist/prompts/fill.d.ts +0 -51
  373. package/dist/prompts/fill.js +0 -46
  374. package/dist/prompts/limits.d.ts +0 -53
  375. package/dist/prompts/limits.js +0 -53
  376. package/dist/prompts/search.d.ts +0 -58
  377. package/dist/prompts/search.js +0 -146
  378. package/dist/prompts/types.d.ts +0 -204
  379. package/dist/prompts/types.js +0 -13
  380. package/dist/team/activity.d.ts +0 -67
  381. package/dist/team/activity.js +0 -130
  382. package/dist/team/limits.d.ts +0 -308
  383. package/dist/team/limits.js +0 -330
  384. package/dist/team/model.d.ts +0 -104
  385. package/dist/team/model.js +0 -150
  386. package/dist/team/panel-rows.d.ts +0 -48
  387. package/dist/team/panel-rows.js +0 -75
  388. package/dist/team/timeline.d.ts +0 -74
  389. package/dist/team/timeline.js +0 -101
  390. package/dist/team/types.d.ts +0 -354
  391. package/dist/team/types.js +0 -13
  392. package/dist/todo/acceptance.d.ts +0 -120
  393. package/dist/todo/acceptance.js +0 -399
  394. package/dist/todo/follow-through.d.ts +0 -138
  395. package/dist/todo/follow-through.js +0 -248
  396. package/dist/todo/limits.d.ts +0 -152
  397. package/dist/todo/limits.js +0 -152
  398. package/dist/todo/panel-rows.d.ts +0 -45
  399. package/dist/todo/panel-rows.js +0 -70
  400. package/dist/todo/plan-sections.d.ts +0 -60
  401. package/dist/todo/plan-sections.js +0 -108
  402. package/dist/todo/row-window.d.ts +0 -51
  403. package/dist/todo/row-window.js +0 -107
  404. package/dist/todo/types.d.ts +0 -124
  405. package/dist/todo/types.js +0 -12
  406. package/dist/tools/human-input.d.ts +0 -212
  407. package/dist/tools/human-input.js +0 -265
  408. package/dist/tools/patch.d.ts +0 -115
  409. package/dist/tools/patch.js +0 -453
  410. package/dist/tools/terminal-output.d.ts +0 -115
  411. package/dist/tools/terminal-output.js +0 -201
  412. package/dist/tools/tool-output-store.d.ts +0 -68
  413. package/dist/tools/tool-output-store.js +0 -102
  414. package/dist/ui/ActivityLine.d.ts +0 -26
  415. package/dist/ui/ActivityLine.js +0 -48
  416. package/dist/ui/AutocompletePopup.d.ts +0 -23
  417. package/dist/ui/AutocompletePopup.js +0 -17
  418. package/dist/ui/BottomStatusRow.d.ts +0 -10
  419. package/dist/ui/BottomStatusRow.js +0 -9
  420. package/dist/ui/Composer.d.ts +0 -115
  421. package/dist/ui/Composer.js +0 -64
  422. package/dist/ui/GovernancePanel.d.ts +0 -50
  423. package/dist/ui/GovernancePanel.js +0 -77
  424. package/dist/ui/GovernanceRun.d.ts +0 -18
  425. package/dist/ui/GovernanceRun.js +0 -11
  426. package/dist/ui/Header.d.ts +0 -48
  427. package/dist/ui/Header.js +0 -27
  428. package/dist/ui/Logo.d.ts +0 -32
  429. package/dist/ui/Logo.js +0 -65
  430. package/dist/ui/Markdown.d.ts +0 -29
  431. package/dist/ui/Markdown.js +0 -116
  432. package/dist/ui/PromptCaret.d.ts +0 -11
  433. package/dist/ui/PromptCaret.js +0 -31
  434. package/dist/ui/PromptInput.d.ts +0 -192
  435. package/dist/ui/PromptInput.js +0 -689
  436. package/dist/ui/QueuePanel.d.ts +0 -8
  437. package/dist/ui/QueuePanel.js +0 -9
  438. package/dist/ui/QueueStatusRow.d.ts +0 -24
  439. package/dist/ui/QueueStatusRow.js +0 -51
  440. package/dist/ui/ScrollbackShell.d.ts +0 -132
  441. package/dist/ui/ScrollbackShell.js +0 -26
  442. package/dist/ui/SessionOpener.d.ts +0 -30
  443. package/dist/ui/SessionOpener.js +0 -12
  444. package/dist/ui/StatusBar.d.ts +0 -129
  445. package/dist/ui/StatusBar.js +0 -61
  446. package/dist/ui/TeamPanel.d.ts +0 -76
  447. package/dist/ui/TeamPanel.js +0 -103
  448. package/dist/ui/ToastStack.d.ts +0 -8
  449. package/dist/ui/ToastStack.js +0 -31
  450. package/dist/ui/TodoPanel.d.ts +0 -52
  451. package/dist/ui/TodoPanel.js +0 -214
  452. package/dist/ui/Transcript.d.ts +0 -105
  453. package/dist/ui/Transcript.js +0 -251
  454. package/dist/ui/UpdateLine.d.ts +0 -44
  455. package/dist/ui/UpdateLine.js +0 -129
  456. package/dist/ui/activity-phrases.d.ts +0 -33
  457. package/dist/ui/activity-phrases.js +0 -50
  458. package/dist/ui/capabilities.d.ts +0 -27
  459. package/dist/ui/capabilities.js +0 -65
  460. package/dist/ui/clipboard-task.d.ts +0 -29
  461. package/dist/ui/clipboard-task.js +0 -66
  462. package/dist/ui/clipboard.d.ts +0 -31
  463. package/dist/ui/clipboard.js +0 -157
  464. package/dist/ui/color-runtime.d.ts +0 -5
  465. package/dist/ui/color-runtime.js +0 -29
  466. package/dist/ui/composer-input.d.ts +0 -38
  467. package/dist/ui/composer-input.js +0 -79
  468. package/dist/ui/composer-limits.d.ts +0 -30
  469. package/dist/ui/composer-limits.js +0 -45
  470. package/dist/ui/composer-rows.d.ts +0 -73
  471. package/dist/ui/composer-rows.js +0 -129
  472. package/dist/ui/console-bridge.d.ts +0 -19
  473. package/dist/ui/console-bridge.js +0 -52
  474. package/dist/ui/density.d.ts +0 -26
  475. package/dist/ui/density.js +0 -34
  476. package/dist/ui/display-tab.d.ts +0 -51
  477. package/dist/ui/display-tab.js +0 -82
  478. package/dist/ui/editor-navigation.d.ts +0 -55
  479. package/dist/ui/editor-navigation.js +0 -96
  480. package/dist/ui/editor-reducer.d.ts +0 -108
  481. package/dist/ui/editor-reducer.js +0 -187
  482. package/dist/ui/enter-frames.d.ts +0 -47
  483. package/dist/ui/enter-frames.js +0 -117
  484. package/dist/ui/entries/AssistantEntry.d.ts +0 -37
  485. package/dist/ui/entries/AssistantEntry.js +0 -43
  486. package/dist/ui/entries/CompactionCard.d.ts +0 -88
  487. package/dist/ui/entries/CompactionCard.js +0 -222
  488. package/dist/ui/entries/DiffView.d.ts +0 -61
  489. package/dist/ui/entries/DiffView.js +0 -103
  490. package/dist/ui/entries/EntryFrame.d.ts +0 -23
  491. package/dist/ui/entries/EntryFrame.js +0 -6
  492. package/dist/ui/entries/FastCard.d.ts +0 -53
  493. package/dist/ui/entries/FastCard.js +0 -105
  494. package/dist/ui/entries/GovernanceCard.d.ts +0 -30
  495. package/dist/ui/entries/GovernanceCard.js +0 -32
  496. package/dist/ui/entries/InvocationCard.d.ts +0 -20
  497. package/dist/ui/entries/InvocationCard.js +0 -32
  498. package/dist/ui/entries/QueuedEntry.d.ts +0 -27
  499. package/dist/ui/entries/QueuedEntry.js +0 -33
  500. package/dist/ui/entries/RetryCard.d.ts +0 -56
  501. package/dist/ui/entries/RetryCard.js +0 -60
  502. package/dist/ui/entries/ServiceCard.d.ts +0 -82
  503. package/dist/ui/entries/ServiceCard.js +0 -151
  504. package/dist/ui/entries/TeamCard.d.ts +0 -55
  505. package/dist/ui/entries/TeamCard.js +0 -94
  506. package/dist/ui/entries/TodoCard.d.ts +0 -54
  507. package/dist/ui/entries/TodoCard.js +0 -98
  508. package/dist/ui/entries/ToolCard.d.ts +0 -81
  509. package/dist/ui/entries/ToolCard.js +0 -160
  510. package/dist/ui/entries/ToolPreview.d.ts +0 -59
  511. package/dist/ui/entries/ToolPreview.js +0 -208
  512. package/dist/ui/entries/UserEntry.d.ts +0 -36
  513. package/dist/ui/entries/UserEntry.js +0 -57
  514. package/dist/ui/exit-snapshot.d.ts +0 -43
  515. package/dist/ui/exit-snapshot.js +0 -26
  516. package/dist/ui/frame-differ.d.ts +0 -166
  517. package/dist/ui/frame-differ.js +0 -354
  518. package/dist/ui/frame-observer.d.ts +0 -17
  519. package/dist/ui/frame-observer.js +0 -94
  520. package/dist/ui/frame-parser.d.ts +0 -7
  521. package/dist/ui/frame-parser.js +0 -18
  522. package/dist/ui/gauge.d.ts +0 -39
  523. package/dist/ui/gauge.js +0 -55
  524. package/dist/ui/glyphs.d.ts +0 -178
  525. package/dist/ui/glyphs.js +0 -165
  526. package/dist/ui/governance-copy.d.ts +0 -69
  527. package/dist/ui/governance-copy.js +0 -104
  528. package/dist/ui/governance-status.d.ts +0 -145
  529. package/dist/ui/governance-status.js +0 -326
  530. package/dist/ui/gradient.d.ts +0 -11
  531. package/dist/ui/gradient.js +0 -50
  532. package/dist/ui/ink-runtime.d.ts +0 -4
  533. package/dist/ui/ink-runtime.js +0 -51
  534. package/dist/ui/interaction-copy.d.ts +0 -82
  535. package/dist/ui/interaction-copy.js +0 -38
  536. package/dist/ui/interaction-hints.d.ts +0 -44
  537. package/dist/ui/interaction-hints.js +0 -97
  538. package/dist/ui/layout/AppShell.d.ts +0 -17
  539. package/dist/ui/layout/AppShell.js +0 -6
  540. package/dist/ui/layout/Gutter.d.ts +0 -67
  541. package/dist/ui/layout/Gutter.js +0 -42
  542. package/dist/ui/layout/MeasuredEntry.d.ts +0 -21
  543. package/dist/ui/layout/MeasuredEntry.js +0 -30
  544. package/dist/ui/layout/OverlayFrame.d.ts +0 -73
  545. package/dist/ui/layout/OverlayFrame.js +0 -110
  546. package/dist/ui/layout/ScrollIndicator.d.ts +0 -32
  547. package/dist/ui/layout/ScrollIndicator.js +0 -22
  548. package/dist/ui/layout/ScrollViewport.d.ts +0 -40
  549. package/dist/ui/layout/ScrollViewport.js +0 -222
  550. package/dist/ui/layout/agents-board.d.ts +0 -102
  551. package/dist/ui/layout/agents-board.js +0 -389
  552. package/dist/ui/layout/autocomplete.d.ts +0 -18
  553. package/dist/ui/layout/autocomplete.js +0 -26
  554. package/dist/ui/layout/budget.d.ts +0 -43
  555. package/dist/ui/layout/budget.js +0 -52
  556. package/dist/ui/layout/cells.d.ts +0 -61
  557. package/dist/ui/layout/cells.js +0 -156
  558. package/dist/ui/layout/document-layout.d.ts +0 -13
  559. package/dist/ui/layout/document-layout.js +0 -10
  560. package/dist/ui/layout/follow-state.d.ts +0 -138
  561. package/dist/ui/layout/follow-state.js +0 -148
  562. package/dist/ui/layout/frame.d.ts +0 -36
  563. package/dist/ui/layout/frame.js +0 -39
  564. package/dist/ui/layout/governance-board.d.ts +0 -121
  565. package/dist/ui/layout/governance-board.js +0 -382
  566. package/dist/ui/layout/governance-card.d.ts +0 -53
  567. package/dist/ui/layout/governance-card.js +0 -134
  568. package/dist/ui/layout/governance-chip.d.ts +0 -38
  569. package/dist/ui/layout/governance-chip.js +0 -64
  570. package/dist/ui/layout/governance-panel.d.ts +0 -85
  571. package/dist/ui/layout/governance-panel.js +0 -358
  572. package/dist/ui/layout/governance-roster.d.ts +0 -65
  573. package/dist/ui/layout/governance-roster.js +0 -275
  574. package/dist/ui/layout/header-hints.d.ts +0 -90
  575. package/dist/ui/layout/header-hints.js +0 -110
  576. package/dist/ui/layout/header-left.d.ts +0 -115
  577. package/dist/ui/layout/header-left.js +0 -206
  578. package/dist/ui/layout/invocation-card.d.ts +0 -41
  579. package/dist/ui/layout/invocation-card.js +0 -91
  580. package/dist/ui/layout/kit-chip.d.ts +0 -50
  581. package/dist/ui/layout/kit-chip.js +0 -81
  582. package/dist/ui/layout/overlay-window.d.ts +0 -43
  583. package/dist/ui/layout/overlay-window.js +0 -51
  584. package/dist/ui/layout/queue-layout.d.ts +0 -19
  585. package/dist/ui/layout/queue-layout.js +0 -26
  586. package/dist/ui/layout/rail.d.ts +0 -7
  587. package/dist/ui/layout/rail.js +0 -16
  588. package/dist/ui/layout/scroll-indicator.d.ts +0 -27
  589. package/dist/ui/layout/scroll-indicator.js +0 -36
  590. package/dist/ui/layout/scroll.d.ts +0 -37
  591. package/dist/ui/layout/scroll.js +0 -99
  592. package/dist/ui/layout/scrollbar-geometry.d.ts +0 -17
  593. package/dist/ui/layout/scrollbar-geometry.js +0 -13
  594. package/dist/ui/layout/session-chip.d.ts +0 -52
  595. package/dist/ui/layout/session-chip.js +0 -64
  596. package/dist/ui/layout/shortcut-panel-layout.d.ts +0 -191
  597. package/dist/ui/layout/shortcut-panel-layout.js +0 -321
  598. package/dist/ui/layout/status-detail-layout.d.ts +0 -9
  599. package/dist/ui/layout/status-detail-layout.js +0 -79
  600. package/dist/ui/layout/status-layout.d.ts +0 -139
  601. package/dist/ui/layout/status-layout.js +0 -253
  602. package/dist/ui/layout/task-summary-cell.d.ts +0 -61
  603. package/dist/ui/layout/task-summary-cell.js +0 -65
  604. package/dist/ui/layout/team-panel.d.ts +0 -18
  605. package/dist/ui/layout/team-panel.js +0 -25
  606. package/dist/ui/layout/team-row.d.ts +0 -139
  607. package/dist/ui/layout/team-row.js +0 -246
  608. package/dist/ui/layout/todo-layout.d.ts +0 -62
  609. package/dist/ui/layout/todo-layout.js +0 -102
  610. package/dist/ui/layout/useTerminalSize.d.ts +0 -13
  611. package/dist/ui/layout/useTerminalSize.js +0 -50
  612. package/dist/ui/layout/viewport-geometry.d.ts +0 -29
  613. package/dist/ui/layout/viewport-geometry.js +0 -28
  614. package/dist/ui/layout/virtual-window.d.ts +0 -112
  615. package/dist/ui/layout/virtual-window.js +0 -488
  616. package/dist/ui/layout/wrap-rows.d.ts +0 -26
  617. package/dist/ui/layout/wrap-rows.js +0 -88
  618. package/dist/ui/live-clamp.d.ts +0 -14
  619. package/dist/ui/live-clamp.js +0 -46
  620. package/dist/ui/markdown-blocks.d.ts +0 -107
  621. package/dist/ui/markdown-blocks.js +0 -240
  622. package/dist/ui/overlays/AgentsBoardOverlay.d.ts +0 -57
  623. package/dist/ui/overlays/AgentsBoardOverlay.js +0 -183
  624. package/dist/ui/overlays/ConfirmDialog.d.ts +0 -31
  625. package/dist/ui/overlays/ConfirmDialog.js +0 -44
  626. package/dist/ui/overlays/GovernanceBoardOverlay.d.ts +0 -41
  627. package/dist/ui/overlays/GovernanceBoardOverlay.js +0 -76
  628. package/dist/ui/overlays/GovernanceSettingsPage.d.ts +0 -48
  629. package/dist/ui/overlays/GovernanceSettingsPage.js +0 -93
  630. package/dist/ui/overlays/HelpOverlay.d.ts +0 -29
  631. package/dist/ui/overlays/HelpOverlay.js +0 -232
  632. package/dist/ui/overlays/KitEditor.d.ts +0 -23
  633. package/dist/ui/overlays/KitEditor.js +0 -101
  634. package/dist/ui/overlays/KitManager.d.ts +0 -23
  635. package/dist/ui/overlays/KitManager.js +0 -104
  636. package/dist/ui/overlays/KitPicker.d.ts +0 -49
  637. package/dist/ui/overlays/KitPicker.js +0 -58
  638. package/dist/ui/overlays/ModelDiscoveryList.d.ts +0 -23
  639. package/dist/ui/overlays/ModelDiscoveryList.js +0 -161
  640. package/dist/ui/overlays/ModelPicker.d.ts +0 -26
  641. package/dist/ui/overlays/ModelPicker.js +0 -63
  642. package/dist/ui/overlays/ModelProfileEditor.d.ts +0 -29
  643. package/dist/ui/overlays/ModelProfileEditor.js +0 -168
  644. package/dist/ui/overlays/ModelProfilePicker.d.ts +0 -48
  645. package/dist/ui/overlays/ModelProfilePicker.js +0 -231
  646. package/dist/ui/overlays/PlanReviewOverlay.d.ts +0 -51
  647. package/dist/ui/overlays/PlanReviewOverlay.js +0 -132
  648. package/dist/ui/overlays/PromptEditorPage.d.ts +0 -48
  649. package/dist/ui/overlays/PromptEditorPage.js +0 -227
  650. package/dist/ui/overlays/PromptLibraryOverlay.d.ts +0 -37
  651. package/dist/ui/overlays/PromptLibraryOverlay.js +0 -191
  652. package/dist/ui/overlays/PromptPicker.d.ts +0 -36
  653. package/dist/ui/overlays/PromptPicker.js +0 -129
  654. package/dist/ui/overlays/PromptTextArea.d.ts +0 -86
  655. package/dist/ui/overlays/PromptTextArea.js +0 -141
  656. package/dist/ui/overlays/QuestionOverlay.d.ts +0 -39
  657. package/dist/ui/overlays/QuestionOverlay.js +0 -258
  658. package/dist/ui/overlays/QueueOverlay.d.ts +0 -22
  659. package/dist/ui/overlays/QueueOverlay.js +0 -79
  660. package/dist/ui/overlays/SettingsScreen.d.ts +0 -228
  661. package/dist/ui/overlays/SettingsScreen.js +0 -1037
  662. package/dist/ui/overlays/ShortcutPanel.d.ts +0 -39
  663. package/dist/ui/overlays/ShortcutPanel.js +0 -106
  664. package/dist/ui/overlays/TeamFanoutPage.d.ts +0 -51
  665. package/dist/ui/overlays/TeamFanoutPage.js +0 -90
  666. package/dist/ui/overlays/governance-settings.d.ts +0 -79
  667. package/dist/ui/overlays/governance-settings.js +0 -140
  668. package/dist/ui/overlays/kit-picker-state.d.ts +0 -87
  669. package/dist/ui/overlays/kit-picker-state.js +0 -136
  670. package/dist/ui/overlays/kit-settings-state.d.ts +0 -129
  671. package/dist/ui/overlays/kit-settings-state.js +0 -268
  672. package/dist/ui/overlays/model-probe-view.d.ts +0 -128
  673. package/dist/ui/overlays/model-probe-view.js +0 -225
  674. package/dist/ui/overlays/model-profile-state.d.ts +0 -177
  675. package/dist/ui/overlays/model-profile-state.js +0 -301
  676. package/dist/ui/overlays/prompt-library-state.d.ts +0 -162
  677. package/dist/ui/overlays/prompt-library-state.js +0 -335
  678. package/dist/ui/overlays/prompt-picker-state.d.ts +0 -71
  679. package/dist/ui/overlays/prompt-picker-state.js +0 -98
  680. package/dist/ui/overlays/team-fanout-state.d.ts +0 -106
  681. package/dist/ui/overlays/team-fanout-state.js +0 -155
  682. package/dist/ui/overlays/use-model-probe.d.ts +0 -30
  683. package/dist/ui/overlays/use-model-probe.js +0 -109
  684. package/dist/ui/palettes.d.ts +0 -112
  685. package/dist/ui/palettes.js +0 -130
  686. package/dist/ui/paste-frames.d.ts +0 -91
  687. package/dist/ui/paste-frames.js +0 -117
  688. package/dist/ui/paste-tokens.d.ts +0 -90
  689. package/dist/ui/paste-tokens.js +0 -147
  690. package/dist/ui/render-cache.d.ts +0 -81
  691. package/dist/ui/render-cache.js +0 -196
  692. package/dist/ui/render-governor.d.ts +0 -54
  693. package/dist/ui/render-governor.js +0 -78
  694. package/dist/ui/run-metrics.d.ts +0 -23
  695. package/dist/ui/run-metrics.js +0 -27
  696. package/dist/ui/run-status-row.d.ts +0 -61
  697. package/dist/ui/run-status-row.js +0 -54
  698. package/dist/ui/screen.d.ts +0 -107
  699. package/dist/ui/screen.js +0 -234
  700. package/dist/ui/scrollback/LiveTail.d.ts +0 -115
  701. package/dist/ui/scrollback/LiveTail.js +0 -48
  702. package/dist/ui/scrollback/band.d.ts +0 -114
  703. package/dist/ui/scrollback/band.js +0 -143
  704. package/dist/ui/scrollback/budget.d.ts +0 -90
  705. package/dist/ui/scrollback/budget.js +0 -100
  706. package/dist/ui/scrollback/canvas.d.ts +0 -100
  707. package/dist/ui/scrollback/canvas.js +0 -114
  708. package/dist/ui/scrollback/cursor-probe.d.ts +0 -71
  709. package/dist/ui/scrollback/cursor-probe.js +0 -133
  710. package/dist/ui/scrollback/drain.d.ts +0 -32
  711. package/dist/ui/scrollback/drain.js +0 -64
  712. package/dist/ui/scrollback/exit-summary.d.ts +0 -23
  713. package/dist/ui/scrollback/exit-summary.js +0 -25
  714. package/dist/ui/scrollback/limits.d.ts +0 -98
  715. package/dist/ui/scrollback/limits.js +0 -98
  716. package/dist/ui/scrollback/live-preview.d.ts +0 -34
  717. package/dist/ui/scrollback/live-preview.js +0 -118
  718. package/dist/ui/scrollback/overflow-print.d.ts +0 -108
  719. package/dist/ui/scrollback/overflow-print.js +0 -120
  720. package/dist/ui/scrollback/renderer.d.ts +0 -48
  721. package/dist/ui/scrollback/renderer.js +0 -186
  722. package/dist/ui/scrollback/scrollback-writer.d.ts +0 -174
  723. package/dist/ui/scrollback/scrollback-writer.js +0 -648
  724. package/dist/ui/scrollback/settled-boundary.d.ts +0 -42
  725. package/dist/ui/scrollback/settled-boundary.js +0 -109
  726. package/dist/ui/scrollback/tail-anchor.d.ts +0 -71
  727. package/dist/ui/scrollback/tail-anchor.js +0 -79
  728. package/dist/ui/scrollback/tail-window.d.ts +0 -73
  729. package/dist/ui/scrollback/tail-window.js +0 -89
  730. package/dist/ui/scrollback/use-scrollback-view.d.ts +0 -139
  731. package/dist/ui/scrollback/use-scrollback-view.js +0 -601
  732. package/dist/ui/scrollback/writer-shapes.d.ts +0 -127
  733. package/dist/ui/scrollback/writer-shapes.js +0 -159
  734. package/dist/ui/scrollbar-controller.d.ts +0 -30
  735. package/dist/ui/scrollbar-controller.js +0 -124
  736. package/dist/ui/selection/highlight.d.ts +0 -39
  737. package/dist/ui/selection/highlight.js +0 -64
  738. package/dist/ui/selection/screen-mirror.d.ts +0 -24
  739. package/dist/ui/selection/screen-mirror.js +0 -35
  740. package/dist/ui/selection/selection-controller.d.ts +0 -104
  741. package/dist/ui/selection/selection-controller.js +0 -372
  742. package/dist/ui/selection/selection.d.ts +0 -90
  743. package/dist/ui/selection/selection.js +0 -223
  744. package/dist/ui/shortcuts.d.ts +0 -81
  745. package/dist/ui/shortcuts.js +0 -221
  746. package/dist/ui/status-feedback.d.ts +0 -35
  747. package/dist/ui/status-feedback.js +0 -38
  748. package/dist/ui/stdout-frame-writer.d.ts +0 -74
  749. package/dist/ui/stdout-frame-writer.js +0 -155
  750. package/dist/ui/team-status.d.ts +0 -166
  751. package/dist/ui/team-status.js +0 -252
  752. package/dist/ui/terminal-plan.d.ts +0 -52
  753. package/dist/ui/terminal-plan.js +0 -49
  754. package/dist/ui/theme.d.ts +0 -96
  755. package/dist/ui/theme.js +0 -130
  756. package/dist/ui/transcript-text.d.ts +0 -41
  757. package/dist/ui/transcript-text.js +0 -282
  758. package/dist/ui/use-height-store.d.ts +0 -31
  759. package/dist/ui/use-height-store.js +0 -76
  760. package/dist/ui/use-render-governor.d.ts +0 -39
  761. package/dist/ui/use-render-governor.js +0 -57
  762. package/dist/ui/use-wheel-routing.d.ts +0 -57
  763. package/dist/ui/use-wheel-routing.js +0 -152
  764. package/dist/ui/win-vt-force.d.ts +0 -136
  765. package/dist/ui/win-vt-force.js +0 -237
  766. package/dist/ui/win-vt-input.d.ts +0 -57
  767. package/dist/ui/win-vt-input.js +0 -62
  768. package/dist/update/limits.d.ts +0 -111
  769. package/dist/update/limits.js +0 -111
  770. package/dist/update/semver.d.ts +0 -89
  771. package/dist/update/semver.js +0 -295
  772. package/dist/update/types.d.ts +0 -169
  773. package/dist/update/types.js +0 -68
  774. /package/dist/{ui → app}/session-bridge.d.ts +0 -0
  775. /package/dist/{ui → app}/session-bridge.js +0 -0
@@ -1,689 +0,0 @@
1
- import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
- /**
3
- * PromptInput (spec §3.6 / §3.10) — a controlled multiline input on Ink's
4
- * `useInput` with: full line editing (Home/End, word jump/delete, kill-line via
5
- * `input/keymap`), multi-line vertical cursor navigation, prompt-history recall
6
- * at the edges, a slash-command palette, and `@file` path completion.
7
- *
8
- * The buffer/cursor transforms (`applyEdit`, `moveVertical`) and the suggestion
9
- * computations (`slashSuggestions`, `fileTokenAt`) are pure module functions,
10
- * exported for `input.test.ts`, so the component itself stays thin.
11
- *
12
- * THE EDITOR'S FIVE PIECES OF STATE LIVE IN ONE REDUCER, and every branch of the
13
- * input handler performs AT MOST ONE `dispatch` (tui-input-flicker-fix §3.4).
14
- * Ink mounts a LEGACY React root, where `setState` outside a React event handler
15
- * is not batched — and `useInput` runs from a stdin `'data'` listener, which is
16
- * outside React entirely. The five `setState` calls one keystroke used to make
17
- * were five commits, five whole-tree Yoga layouts and, through Ink's 32 ms
18
- * leading+trailing throttle, two full-frame repaints per character. `fileMatches`
19
- * stays a plain `useState` because it is written from the debounced glob effect
20
- * rather than from a key.
21
- */
22
- import { useEffect, useLayoutEffect, useMemo, useReducer, useRef, useState } from 'react';
23
- import { Box, Text, useInput, useStdout } from 'ink';
24
- import { popupCapacity } from './layout/budget.js';
25
- import { glob as tinyGlob } from 'tinyglobby';
26
- import { pickGlyphs } from './glyphs.js';
27
- import { PromptCaret } from './PromptCaret.js';
28
- import { recognize } from '../input/keymap.js';
29
- import { AutocompletePopup } from './AutocompletePopup.js';
30
- import { buildAutocompleteLayout } from './layout/autocomplete.js';
31
- import { editorReducer, INITIAL_EDITOR_STATE, } from './editor-reducer.js';
32
- import { hasPasteFrame } from './paste-frames.js';
33
- import { hasEnterFrame, splitEnterFrames, } from './enter-frames.js';
34
- import { planComposerInput } from './composer-input.js';
35
- import { allocatePasteId, expandPastes, expandRangeOverTokens } from './paste-tokens.js';
36
- import { draftMaxRows } from './composer-limits.js';
37
- import { layoutComposer, splitRowAtColumn } from './composer-rows.js';
38
- import { moveVisualCursor, snapGrapheme, stepGrapheme } from './editor-navigation.js';
39
- import { interactionCopy } from './interaction-copy.js';
40
- import { INDEX_KEY_FRAME, PASTE_DRAFT_MAX_BYTES, PASTE_MAX_BLOCKS, formatPasteSize, } from '../input/limits.js';
41
- // ---------------------------------------------------------------------------
42
- // The scroll chip (§4.2)
43
- // ---------------------------------------------------------------------------
44
- /** Below this the full sentence does not fit beside a draft; the chip goes terse. */
45
- const CHIP_FULL_MIN_COLS = 64;
46
- /**
47
- * Ceiling on the number the chip prints, so `chipCells` is a CONSTANT per branch
48
- * rather than a function of how far behind the user is (P2-4). Past it the chip
49
- * reads `999+`.
50
- */
51
- const CHIP_MAX_N = 999;
52
- /** `↓ 999+ lines below · PgDn` — the widest form the full branch can produce. */
53
- const CHIP_FULL_CELLS = 27;
54
- /** `↓999+` — the widest form the terse branch can produce. */
55
- const CHIP_TERSE_CELLS = 6;
56
- /**
57
- * Build the chip, or `null` when the viewport is pinned to the newest output.
58
- *
59
- * Every glyph comes from `pickGlyphs` and none from a literal (I-5): on a legacy
60
- * console this renders `v12` rather than mojibake, and `glyphs.test.ts`'s static
61
- * scan fails the build if that rule is broken here.
62
- */
63
- export function scrollChip(scrolledLines, cols, glyphs) {
64
- if (!Number.isFinite(scrolledLines) || scrolledLines <= 0)
65
- return null;
66
- const n = Math.floor(scrolledLines);
67
- const shown = n > CHIP_MAX_N ? `${CHIP_MAX_N}+` : String(n);
68
- if (cols < CHIP_FULL_MIN_COLS) {
69
- return { text: `${glyphs.arrowDown}${shown}`, cells: CHIP_TERSE_CELLS };
70
- }
71
- const noun = n === 1 ? 'line' : 'lines';
72
- return {
73
- text: `${glyphs.arrowDown} ${shown} ${noun} below ${glyphs.midDot} PgDn`,
74
- cells: CHIP_FULL_CELLS,
75
- };
76
- }
77
- // ---------------------------------------------------------------------------
78
- // The draft overflow indicator (section 5.5)
79
- // ---------------------------------------------------------------------------
80
- /** `^3 v7` at its widest, so the cell is a CONSTANT (the P2-4 discipline). */
81
- const OVERFLOW_CELLS = 12;
82
- const OVERFLOW_MAX_N = 999;
83
- /**
84
- * Build the "there is more draft above / below this window" indicator, or `null`
85
- * when the whole draft is on screen.
86
- *
87
- * Every glyph comes from `pickGlyphs` and none from a literal (I-5): on a legacy
88
- * console this renders `^3 v7` rather than mojibake, and `glyphs.test.ts`'s
89
- * static scan fails the build if that rule is broken here.
90
- */
91
- export function overflowChip(hiddenAbove, hiddenBelow, glyphs) {
92
- if (hiddenAbove <= 0 && hiddenBelow <= 0)
93
- return null;
94
- const show = (n) => (n > OVERFLOW_MAX_N ? `${OVERFLOW_MAX_N}+` : String(n));
95
- const parts = [];
96
- if (hiddenAbove > 0)
97
- parts.push(`${glyphs.arrowUp}${show(hiddenAbove)}`);
98
- if (hiddenBelow > 0)
99
- parts.push(`${glyphs.arrowDown}${show(hiddenBelow)}`);
100
- return { text: parts.join(' '), cells: OVERFLOW_CELLS };
101
- }
102
- // ---------------------------------------------------------------------------
103
- // Draft-level paste limits (section 5.3, the P1-4 enforcement point)
104
- // ---------------------------------------------------------------------------
105
- /**
106
- * Would these segments push the draft past a limit? Returns the refusal text, or
107
- * `null` when the paste is allowed.
108
- *
109
- * Checked BEFORE `dispatch`, so a refusal dispatches nothing at all and the draft
110
- * is left byte-for-byte unchanged (AC-9). The one-dispatch-per-key rule is
111
- * unaffected for the same reason.
112
- */
113
- export function draftLimitRefusal(segments, editor) {
114
- let liveBytes = 0;
115
- for (const record of editor.pastes.values())
116
- liveBytes += Buffer.byteLength(record.text, 'utf8');
117
- let blocks = editor.pastes.size;
118
- for (const segment of segments) {
119
- if (segment.kind !== 'paste')
120
- continue;
121
- liveBytes += Buffer.byteLength(segment.text, 'utf8');
122
- blocks += 1;
123
- }
124
- if (blocks > PASTE_MAX_BLOCKS) {
125
- return (`Too many pasted blocks in one message (limit is ${PASTE_MAX_BLOCKS}). ` +
126
- 'Nothing was inserted.');
127
- }
128
- if (liveBytes > PASTE_DRAFT_MAX_BYTES) {
129
- return (`Pasted content in this message would reach ${formatPasteSize(liveBytes)}; ` +
130
- `limit is ${formatPasteSize(PASTE_DRAFT_MAX_BYTES)}. Nothing was inserted.`);
131
- }
132
- return null;
133
- }
134
- // ---------------------------------------------------------------------------
135
- // Pure editing helpers (unit-tested in input.test.ts)
136
- // ---------------------------------------------------------------------------
137
- const isSpace = (ch) => !!ch && /\s/.test(ch);
138
- function lineStart(buffer, cursor) {
139
- if (cursor <= 0)
140
- return 0;
141
- const nl = buffer.lastIndexOf('\n', cursor - 1);
142
- return nl === -1 ? 0 : nl + 1;
143
- }
144
- function lineEnd(buffer, cursor) {
145
- const nl = buffer.indexOf('\n', cursor);
146
- return nl === -1 ? buffer.length : nl;
147
- }
148
- function prevWord(buffer, cursor) {
149
- let i = cursor;
150
- while (i > 0 && isSpace(buffer[i - 1]))
151
- i -= 1;
152
- while (i > 0 && !isSpace(buffer[i - 1]))
153
- i -= 1;
154
- return i;
155
- }
156
- function nextWord(buffer, cursor) {
157
- let i = cursor;
158
- while (i < buffer.length && isSpace(buffer[i]))
159
- i += 1;
160
- while (i < buffer.length && !isSpace(buffer[i]))
161
- i += 1;
162
- return i;
163
- }
164
- /**
165
- * Delete `[from, to)`, first growing the range over any token it clips (G5 /
166
- * D-8).
167
- *
168
- * A no-op growth on a buffer with no tokens, so every pre-existing assertion in
169
- * `input.test.ts` holds byte-for-byte. With a token present it is what stops
170
- * `Ctrl+W` / `Ctrl+U` / `Ctrl+K` leaving half a label behind — which would be a
171
- * label the user then sends INSTEAD of the text it stands for.
172
- */
173
- function killRange(buffer, from, to) {
174
- const range = expandRangeOverTokens(buffer, snapGrapheme(buffer, from), snapGrapheme(buffer, to, true));
175
- return { buffer: buffer.slice(0, range.from) + buffer.slice(range.to), cursor: range.from };
176
- }
177
- /** Apply an edit intent as a pure buffer/cursor transform. */
178
- export function applyEdit(buffer, cursor, intent) {
179
- cursor = snapGrapheme(buffer, cursor);
180
- switch (intent) {
181
- // Navigation may enter a token label; insertion and range deletion retain
182
- // the existing token snapping and expansion contracts.
183
- case 'home':
184
- return { buffer, cursor: lineStart(buffer, cursor) };
185
- case 'end':
186
- return { buffer, cursor: lineEnd(buffer, cursor) };
187
- case 'wordLeft':
188
- return { buffer, cursor: snapGrapheme(buffer, prevWord(buffer, cursor)) };
189
- case 'wordRight':
190
- return { buffer, cursor: snapGrapheme(buffer, nextWord(buffer, cursor), true) };
191
- case 'deleteWordBack':
192
- return killRange(buffer, prevWord(buffer, cursor), cursor);
193
- case 'killToStart':
194
- return killRange(buffer, lineStart(buffer, cursor), cursor);
195
- case 'killToEnd':
196
- return killRange(buffer, cursor, lineEnd(buffer, cursor));
197
- }
198
- }
199
- /**
200
- * Move the cursor up/down one line preserving the column. Returns `null` at the
201
- * top/bottom edge (or for a single-line buffer) so the caller can fall back to
202
- * prompt-history recall.
203
- */
204
- export function moveVertical(buffer, cursor, dir) {
205
- const moved = moveVisualCursor({ buffer, cursor, direction: dir, cols: Number.MAX_SAFE_INTEGER });
206
- return moved ? { cursor: moved.cursor } : null;
207
- }
208
- /**
209
- * Slash-command suggestions when the buffer is a bare `/word` (no space yet).
210
- *
211
- * The character class covers `-` and `:` as well as `\w` (D16). Skill names are
212
- * kebab-case and the namespaced fallback is `/skill:<name>`; with the original
213
- * `^\/(\w*)$` a user typing `/my-sk` got NO popup at all — not an error message,
214
- * just silence, which reads as "that command does not exist".
215
- */
216
- export function slashSuggestions(buffer, commands) {
217
- const m = /^\/([\w:-]*)$/.exec(buffer);
218
- if (!m)
219
- return null;
220
- const q = m[1].toLowerCase();
221
- return commands
222
- .filter((c) => c.name.toLowerCase().startsWith(q))
223
- .map((c) => ({ label: `/${c.name}`, hint: c.description }));
224
- }
225
- /** The `@file` token under the cursor (`@` + non-space run), if any. */
226
- export function fileTokenAt(buffer, cursor) {
227
- let start = cursor;
228
- while (start > 0 && !isSpace(buffer[start - 1]))
229
- start -= 1;
230
- if (buffer[start] !== '@')
231
- return null;
232
- let end = cursor;
233
- while (end < buffer.length && !isSpace(buffer[end]))
234
- end += 1;
235
- return { start, end, query: buffer.slice(start + 1, end) };
236
- }
237
- /**
238
- * How many `@file` candidates reach the popup.
239
- *
240
- * The popup has its own row budget; this is the list it windows. Twenty ranked
241
- * paths are enough to spot the one you meant, and it bounds the array that every
242
- * draft edit re-renders.
243
- */
244
- const FILE_MATCH_LIMIT = 20;
245
- /**
246
- * Segments in a path - the first ranking key for an EMPTY `@` query (defect 10).
247
- *
248
- * A bare `@` matches every file in the tree, and `tinyGlob` returns them in
249
- * whatever order the filesystem walked, so opening the popup without a rank gave
250
- * a correct-but-arbitrary twenty. Shallowest first, then shortest, then
251
- * alphabetical: the paths a user is reaching for (`src/`, a root config) come
252
- * before `packages/cli/src/ui/layout/deep/thing.ts`.
253
- */
254
- function pathDepth(path) {
255
- let depth = 1;
256
- for (const char of path) {
257
- if (char === '/' || char === '\\')
258
- depth += 1;
259
- }
260
- return depth;
261
- }
262
- /** A leading C0 control byte or ESC sequence should never be inserted raw. */
263
- function isControlSeq(input) {
264
- if (input.length === 0)
265
- return true;
266
- const code = input.charCodeAt(0);
267
- return code < 0x20 || code === 0x7f;
268
- }
269
- // ---------------------------------------------------------------------------
270
- // Component
271
- // ---------------------------------------------------------------------------
272
- export function PromptInput({ cols: colsProp, terminalRows: terminalRowsProp, statusExpanded = false, cursorVisible = true, onInteraction, isActive, running, history, commands, cwd, theme, caps, popupMaxRows, popupMaxHeight, onPopupRowsChange, onCompletionContextChange, deleteDisambiguated = false, agentMode, onSubmit, onHelp, onEscape, onEscapeDismiss, reducedMotion = false, borderColor, onDraftChange, draftClearNonce, draftFill, insertMode = 'insert', onNotice, }) {
273
- const { stdout } = useStdout();
274
- const [editor, dispatch] = useReducer(editorReducer, INITIAL_EDITOR_STATE);
275
- const { buffer, cursor, historyIndex, dismissed, sel } = editor;
276
- const [fileMatches, setFileMatches] = useState([]);
277
- // --- Derived suggestion state (shared by render + input handler). --------
278
- const slashSug = dismissed ? null : slashSuggestions(buffer, commands);
279
- const fileTok = fileTokenAt(buffer, cursor);
280
- const fileQuery = fileTok ? fileTok.query : null;
281
- // A BARE `@` OPENS THE POPUP (defect 10). The `query.length >= 1` gate here and
282
- // the `< 1` early return in the scan effect below were the whole reason a lone
283
- // `@` showed nothing while `README.md` promises "@ opens a file-path completion
284
- // popup". An empty query is a legitimate one: it lists the shallowest paths.
285
- const fileActive = !dismissed && !!fileTok && fileMatches.length > 0;
286
- const popupKind = slashSug && slashSug.length > 0 ? 'slash' : fileActive ? 'file' : null;
287
- const popupItems = popupKind === 'slash'
288
- ? slashSug
289
- : popupKind === 'file'
290
- ? fileMatches.map((p) => ({ label: p }))
291
- : [];
292
- const clampedSel = popupItems.length > 0 ? Math.min(sel, popupItems.length - 1) : 0;
293
- // --- Debounced `@file` scan. ---------------------------------------------
294
- useEffect(() => {
295
- if (fileQuery === null) {
296
- setFileMatches([]);
297
- return;
298
- }
299
- let cancelled = false;
300
- const id = setTimeout(() => {
301
- tinyGlob('**/*', {
302
- cwd,
303
- dot: false,
304
- onlyFiles: true,
305
- ignore: ['**/node_modules/**', '**/.git/**'],
306
- })
307
- .then((matches) => {
308
- if (cancelled)
309
- return;
310
- const q = fileQuery.toLowerCase();
311
- // RANKED, NOT WALK ORDER (defect 10). An empty query matches every path
312
- // in the tree, so without a sort the popup for a bare `@` was
313
- // correct-but-arbitrary - the first twenty the filesystem happened to
314
- // hand back.
315
- const ranked = matches
316
- .filter((m) => m.toLowerCase().includes(q))
317
- .sort((a, b) => pathDepth(a) - pathDepth(b)
318
- || a.length - b.length || (a < b ? -1 : a > b ? 1 : 0))
319
- .slice(0, FILE_MATCH_LIMIT);
320
- setFileMatches(ranked);
321
- })
322
- .catch(() => {
323
- if (!cancelled)
324
- setFileMatches([]);
325
- });
326
- }, 120);
327
- return () => {
328
- cancelled = true;
329
- clearTimeout(id);
330
- };
331
- }, [fileQuery, cwd]);
332
- // --- Layout (section 5.5). -----------------------------------------------
333
- //
334
- // COMPUTED HERE, ABOVE THE REPORTING EFFECT, because the number the effect
335
- // sends upward has to be the number this component actually renders (I-8).
336
- // Deriving it twice — once for the frame and once for the budget — is exactly
337
- // the trap `BottomStatusRow.tsx:5-27` documents.
338
- const glyphs = pickGlyphs(caps);
339
- const cols = colsProp ?? stdout?.columns ?? 80;
340
- const terminalRows = terminalRowsProp ?? stdout?.rows ?? 24;
341
- // Err NARROW. Wrapping wider than the box Ink gives us would make Ink wrap a
342
- // second time, and then `layout.rows.length` is a lie — which is the one thing
343
- // this module may not be.
344
- const chromeCols = 2 /* border */ + 2 /* paddingX */ + 2 /* marker */;
345
- const baseCols = Math.max(8, cols - chromeCols);
346
- const measure = (wrapCols) => layoutComposer({
347
- buffer,
348
- cursor,
349
- cols: wrapCols,
350
- maxRows: draftMaxRows(terminalRows),
351
- // Scrolling may hide the caret, but must not change the measured draft.
352
- // Otherwise visibility can toggle wrapping and feed back into scrolling.
353
- active: isActive,
354
- });
355
- // TWO PASSES, AND THE SECOND ONE IS LOAD-BEARING (I-8). The overflow indicator
356
- // rides the last rendered row INSIDE the box the draft wraps in, so its cells
357
- // have to come out of the wrap width. Measured at the full width instead, a
358
- // last row that fills the line is wrapped a SECOND time by Ink, and the
359
- // composer then draws one row more than `layout.rows.length` — which is the
360
- // number this component hands to `viewportRows`. That is defect C again, in
361
- // precisely the situation this feature exists for: a draft too tall to show.
362
- //
363
- // It settles in two. Narrowing can only ADD rows, so a draft that overflowed
364
- // the first pass still overflows the second, and a third pass would measure
365
- // the same width as the second.
366
- const wide = measure(baseCols);
367
- const overflows = wide.hiddenAbove > 0 || wide.hiddenBelow > 0;
368
- const usableCols = overflows ? Math.max(8, baseCols - OVERFLOW_CELLS - 1) : baseCols;
369
- const layout = overflows ? measure(usableCols) : wide;
370
- const preferredColumnWidth = useRef();
371
- useLayoutEffect(() => { preferredColumnWidth.current = undefined; }, [usableCols]);
372
- const draftRowCount = Math.max(1, layout.rows.length);
373
- const menuCapacity = Math.min(popupMaxHeight ?? Infinity, popupCapacity(terminalRows, draftRowCount, statusExpanded));
374
- const popupLayout = buildAutocompleteLayout({
375
- itemCount: isActive ? popupItems.length : 0,
376
- selected: clampedSel,
377
- maxRows: popupMaxRows,
378
- maxHeight: menuCapacity,
379
- });
380
- const popupVisible = isActive && popupLayout.rowCount > 0;
381
- // Report on every mount, including zero. Cleanup belongs to a separate
382
- // effect so changing height does not publish an intermediate zero budget.
383
- useLayoutEffect(() => {
384
- onPopupRowsChange?.(popupLayout.rowCount);
385
- }, [onPopupRowsChange, popupLayout.rowCount]);
386
- useLayoutEffect(() => () => onPopupRowsChange?.(0), [onPopupRowsChange]);
387
- const completion = popupVisible ? popupKind ?? 'none' : 'none';
388
- const completionCallback = useRef(onCompletionContextChange);
389
- completionCallback.current = onCompletionContextChange;
390
- const lastCompletion = useRef();
391
- useLayoutEffect(() => {
392
- if (!onCompletionContextChange || lastCompletion.current === completion)
393
- return;
394
- lastCompletion.current = completion;
395
- onCompletionContextChange?.(completion);
396
- }, [onCompletionContextChange, completion]);
397
- useLayoutEffect(() => () => completionCallback.current?.('none'), []);
398
- const caretResetKey = useMemo(() => ({}), [buffer, cursor, isActive, usableCols]);
399
- // --- Draft presence and height, reported only on a transition. -----------
400
- // Notifying on every keystroke would re-render the whole App tree per key. The
401
- // row count changes on a line break or a wrap boundary, not per character
402
- // (R-6), so widening this callback does not widen how often it fires.
403
- const hasDraft = buffer.length > 0;
404
- const lastReportedDraft = useRef(null);
405
- useLayoutEffect(() => {
406
- if (!onDraftChange)
407
- return;
408
- const last = lastReportedDraft.current;
409
- if (last && last.hasDraft === hasDraft && last.rows === draftRowCount)
410
- return;
411
- lastReportedDraft.current = { hasDraft, rows: draftRowCount };
412
- onDraftChange({ hasDraft, rows: draftRowCount });
413
- }, [hasDraft, draftRowCount, onDraftChange]);
414
- // --- App-requested draft clear (ctrl-c-clear-draft-exit). --------
415
- // The NONCE, not the buffer, is the dependency: App cannot reach this
416
- // reducer directly, and keying on content would miss back-to-back
417
- // requests that land on the same (empty) buffer. `'clear'` is
418
- // idempotent, so a StrictMode double-invoked effect is harmless.
419
- useEffect(() => {
420
- if (draftClearNonce === undefined || draftClearNonce <= 0)
421
- return;
422
- dispatch({ type: 'clear' });
423
- }, [draftClearNonce]);
424
- // --- Mutators. -----------------------------------------------------------
425
- // ONE DISPATCH EACH, and that is the rule §3.4 asks a reviewer to check line
426
- // by line. Two dispatches from one key would put the legacy root back to two
427
- // commits and undo the whole of F3 for that branch.
428
- const insert = (text) => {
429
- onInteraction?.();
430
- dispatch({ type: 'insert', text });
431
- };
432
- const resolveSubmit = (state) => {
433
- const suggestions = state.dismissed ? null : slashSuggestions(state.buffer, commands);
434
- const selectedIndex = Math.min(state.sel, (suggestions?.length ?? 0) - 1);
435
- const suggestionLayout = buildAutocompleteLayout({
436
- itemCount: isActive ? suggestions?.length ?? 0 : 0,
437
- selected: selectedIndex, maxRows: popupMaxRows, maxHeight: menuCapacity,
438
- });
439
- const selected = suggestionLayout.rowCount > 0 ? suggestions?.[selectedIndex] : undefined;
440
- const text = selected?.label ?? expandPastes(state.buffer, state.pastes);
441
- return text.trim().length > 0 ? text : null;
442
- };
443
- const transact = (intents) => {
444
- const plan = planComposerInput({
445
- editor, intents, resolveSubmit, checkPasteLimit: draftLimitRefusal,
446
- });
447
- if (plan.refusal) {
448
- onNotice?.('warn', plan.refusal);
449
- return;
450
- }
451
- onInteraction?.();
452
- let result = { accepted: true };
453
- if (plan.submission !== undefined) {
454
- try {
455
- result = onSubmit(plan.submission);
456
- }
457
- catch (error) {
458
- result = { accepted: false, reason: error instanceof Error ? error.message : String(error) };
459
- }
460
- }
461
- dispatch({ type: 'adopt', state: result.accepted ? plan.nextEditor : plan.rejectedEditor });
462
- if (!result.accepted) {
463
- onNotice?.('error', result.reason ?? 'Message was not accepted; input is kept in the draft.');
464
- }
465
- else if (plan.notice) {
466
- onNotice?.('warn', plan.notice);
467
- }
468
- };
469
- // --- App-requested fill (quick-prompt-library §4.6 / D-6). -----------------
470
- //
471
- // THE NONCE IS THE DEPENDENCY, NOT THE TEXT, for the reason the clear effect above
472
- // records: two fills of the same prompt in a row must both apply, and keying on the
473
- // payload would silently drop the second one. `transact` is deliberately absent from
474
- // the dependency list - it closes over THIS render's `editor`, and depending on it
475
- // would re-run (and re-fill) the effect on every keystroke.
476
- const appliedFill = useRef(0);
477
- useEffect(() => {
478
- if (!draftFill || draftFill.nonce <= appliedFill.current)
479
- return;
480
- appliedFill.current = draftFill.nonce;
481
- transact([{
482
- kind: 'fill',
483
- text: draftFill.text,
484
- mode: insertMode,
485
- submit: draftFill.submit === true,
486
- }]);
487
- // eslint-disable-next-line react-hooks/exhaustive-deps -- see the note above
488
- }, [draftFill, insertMode]);
489
- const recallUp = () => {
490
- if (history.length === 0)
491
- return;
492
- const idx = historyIndex === null ? history.length - 1 : Math.max(0, historyIndex - 1);
493
- const value = history[idx] ?? '';
494
- dispatch({ type: 'recall', buffer: value, cursor: value.length, historyIndex: idx });
495
- };
496
- const recallDown = () => {
497
- if (historyIndex === null)
498
- return;
499
- const idx = historyIndex + 1;
500
- // Past the newest entry the walk ends and the draft goes back to empty —
501
- // `historyIndex: null` is what tells `verticalOrHistory` the user is editing
502
- // again rather than still stepping.
503
- if (idx >= history.length) {
504
- dispatch({ type: 'recall', buffer: '', cursor: 0, historyIndex: null });
505
- return;
506
- }
507
- const value = history[idx] ?? '';
508
- dispatch({ type: 'recall', buffer: value, cursor: value.length, historyIndex: idx });
509
- };
510
- const completeSelection = () => {
511
- onInteraction?.();
512
- const chosen = popupItems[clampedSel];
513
- if (!chosen)
514
- return;
515
- if (popupKind === 'slash') {
516
- const next = `${chosen.label} `;
517
- dispatch({ type: 'replace', buffer: next, cursor: next.length });
518
- }
519
- else if (popupKind === 'file' && fileTok) {
520
- const next = buffer.slice(0, fileTok.start) + chosen.label + buffer.slice(fileTok.end);
521
- dispatch({ type: 'replace', buffer: next, cursor: fileTok.start + chosen.label.length });
522
- }
523
- };
524
- const verticalOrHistory = (dir) => {
525
- onInteraction?.();
526
- const moved = moveVisualCursor({ buffer, cursor, cols: usableCols, direction: dir,
527
- preferredVisualColumn: preferredColumnWidth.current === usableCols
528
- ? editor.preferredVisualColumn : undefined });
529
- if (moved) {
530
- preferredColumnWidth.current = usableCols;
531
- dispatch({ type: 'moveCursor', ...moved });
532
- return;
533
- }
534
- // At an edge: recall history only from an empty buffer or while already
535
- // stepping through it — never clobber an in-progress draft (see spec note).
536
- if (buffer.length === 0 || historyIndex !== null) {
537
- if (dir === 'up')
538
- recallUp();
539
- else
540
- recallDown();
541
- }
542
- };
543
- // --- Input handling. -----------------------------------------------------
544
- useInput((input, key) => {
545
- // FIRST STATEMENT, BEFORE THE POPUP BRANCH, AND IT HAS TO STAY THERE.
546
- // `App` owns the Shift+Tab mode toggle. The popup branch below treats
547
- // `key.tab` as "accept the highlighted completion", so without this guard
548
- // pressing Shift+Tab with the `/` palette or an `@` file popup open would
549
- // BOTH rewrite the user's draft and change the mode — a bug that only
550
- // appears with a popup open and is therefore easy to ship (AC-P3 / R-P2).
551
- if (key.tab && key.shift)
552
- return;
553
- if (key.pageUp || key.pageDown || (key.shift && (key.upArrow || key.downArrow)))
554
- return;
555
- if ((key.return || input === '\r') && (key.meta || key.shift)) {
556
- insert('\n');
557
- return;
558
- }
559
- // App owns the Ctrl+I index frame (see input/limits.ts). Standalone it
560
- // never reaches here - isControlSeq drops it at the printable-insert
561
- // branch below - but a frame glued to typed text in one chunk must
562
- // insert ONLY the text, so strip it before any other interpretation.
563
- if (input.includes(INDEX_KEY_FRAME)) {
564
- const rest = input.split(INDEX_KEY_FRAME).join('');
565
- if (rest.length > 0)
566
- insert(rest);
567
- return;
568
- }
569
- if (hasPasteFrame(input) || hasEnterFrame(input) || /[\r\n]/.test(input)) {
570
- const intents = splitEnterFrames(input).map((frame) => frame.kind === 'paste' ? { ...frame, id: allocatePasteId() } : frame);
571
- if (intents.length > 0)
572
- transact(intents);
573
- return;
574
- }
575
- // Popup navigation owns Up/Down/Tab/→/Enter/Esc while it is open.
576
- if (popupVisible) {
577
- if (key.upArrow) {
578
- onInteraction?.();
579
- dispatch({ type: 'select', sel: Math.max(0, clampedSel - 1) });
580
- return;
581
- }
582
- if (key.downArrow) {
583
- onInteraction?.();
584
- dispatch({ type: 'select', sel: Math.min(popupItems.length - 1, clampedSel + 1) });
585
- return;
586
- }
587
- if (key.tab || (key.rightArrow && cursor >= buffer.length)) {
588
- completeSelection();
589
- return;
590
- }
591
- if (key.return && popupKind === 'slash') {
592
- transact([{ kind: 'submit' }]);
593
- return;
594
- }
595
- if (key.escape) {
596
- dispatch({ type: 'dismiss' });
597
- onEscapeDismiss?.();
598
- return;
599
- }
600
- // Any other key falls through so typing keeps filtering the popup.
601
- }
602
- if (key.escape) {
603
- onEscape?.();
604
- return;
605
- }
606
- // Line-editing intents (Home/End/word/kill) recognized from raw keys.
607
- const intent = key.meta && (key.backspace || key.delete)
608
- ? 'deleteWordBack' : recognize(input, key);
609
- if (intent) {
610
- onInteraction?.();
611
- const next = applyEdit(buffer, cursor, intent);
612
- const moving = intent === 'home' || intent === 'end'
613
- || intent === 'wordLeft' || intent === 'wordRight';
614
- dispatch(moving ? { type: 'moveCursor', cursor: next.cursor }
615
- : { type: 'replace', buffer: next.buffer, cursor: next.cursor });
616
- return;
617
- }
618
- if (key.ctrl)
619
- return; // App owns Ctrl+C / L / T / O, and now Ctrl+K (the kit picker).
620
- if (key.return) {
621
- if (key.meta || key.shift) {
622
- insert('\n');
623
- return;
624
- }
625
- if (buffer.trim().length === 0)
626
- return;
627
- transact([{ kind: 'submit' }]);
628
- return;
629
- }
630
- if (key.backspace || key.delete) {
631
- onInteraction?.();
632
- // The `cursor > 0` guard lives in the reducer now, so this branch is one
633
- // unconditional dispatch and a no-op at the left edge returns the same
634
- // state object — which React bails out on, exactly as the old
635
- // `if (cursor > 0)` skipped the `setState`s.
636
- dispatch({ type: key.delete && deleteDisambiguated ? 'delete' : 'backspace' });
637
- return;
638
- }
639
- if (key.leftArrow) {
640
- onInteraction?.();
641
- dispatch({ type: 'moveCursor', cursor: stepGrapheme(buffer, cursor, 'left') });
642
- return;
643
- }
644
- if (key.rightArrow) {
645
- onInteraction?.();
646
- dispatch({ type: 'moveCursor', cursor: stepGrapheme(buffer, cursor, 'right') });
647
- return;
648
- }
649
- // `!key.shift` is load-bearing: Shift+↑/↓ is the viewport's line-scroll
650
- // binding (§4.10). Without the guard the history recall below swallows it
651
- // and scrolling appears to be broken for no visible reason.
652
- if (key.upArrow && !key.shift) {
653
- verticalOrHistory('up');
654
- return;
655
- }
656
- if (key.downArrow && !key.shift) {
657
- verticalOrHistory('down');
658
- return;
659
- }
660
- // `?` on an empty idle input opens the help overlay.
661
- if (input === '?' && buffer.length === 0 && !running && onHelp) {
662
- onHelp();
663
- return;
664
- }
665
- // Printable input — drop any unrecognized control/escape byte.
666
- if (input && !key.tab && !isControlSeq(input))
667
- insert(input);
668
- }, { isActive });
669
- const marker = running ? glyphs.steer : glyphs.caret;
670
- const markerColor = running ? theme.toolRunning : theme.primary;
671
- const placeholder = running ? interactionCopy.runningPlaceholder : interactionCopy.idlePlaceholder;
672
- const overflow = overflowChip(layout.hiddenAbove, layout.hiddenBelow, glyphs);
673
- const tokenColor = theme.hintFg ?? theme.muted;
674
- const renderSegments = (segments, keyPrefix) => segments.map((segment, i) => (_jsx(Text, { color: segment.kind === 'token' ? tokenColor : undefined, children: segment.text }, `${keyPrefix}${i}`)));
675
- const rowNodes = layout.rows.map((row, i) => {
676
- if (i !== layout.cursorRow)
677
- return _jsx(_Fragment, { children: renderSegments(row.segments, `s${i}.`) });
678
- // The caret is drawn as one inverse cell, split at the column
679
- // `layoutComposer` reported — the same width table it wrapped with (I-9).
680
- const split = splitRowAtColumn(row, layout.cursorCol);
681
- return (_jsxs(_Fragment, { children: [renderSegments(split.before, `b${i}.`), _jsx(PromptCaret, { text: split.at ? split.at.text : ' ', active: isActive && cursorVisible, reducedMotion: reducedMotion, colorLevel: caps.colorLevel, resetKey: caretResetKey, color: split.at?.kind === 'token' ? tokenColor : undefined }), renderSegments(split.after, `a${i}.`)] }));
682
- });
683
- const inputRow = (_jsxs(Box, { flexDirection: "row", children: [_jsxs(Text, { color: markerColor, bold: true, children: [marker, ' '] }), _jsx(Box, { flexDirection: "column", flexGrow: 1, flexShrink: 1, children: buffer.length === 0 ? (_jsxs(Text, { wrap: "truncate", color: theme.muted, children: [_jsx(PromptCaret, { text: String.fromCodePoint(placeholder.codePointAt(0)), active: isActive && cursorVisible, reducedMotion: reducedMotion, colorLevel: caps.colorLevel, color: theme.muted, resetKey: caretResetKey }), placeholder.slice(String.fromCodePoint(placeholder.codePointAt(0)).length)] })) : (rowNodes.map((node, i) => overflow && i === rowNodes.length - 1 ? (
684
- // The overflow indicator rides the LAST rendered row rather than
685
- // taking one of its own: an extra row would put the composer's
686
- // real height one above the `draftRows` it just reported (I-8).
687
- _jsxs(Box, { flexDirection: "row", children: [_jsx(Box, { flexGrow: 1, flexShrink: 1, children: _jsx(Text, { children: node }) }), _jsx(Box, { flexShrink: 0, width: overflow.cells, justifyContent: "flex-end", children: _jsx(Text, { wrap: "truncate", color: theme.hintFg ?? theme.muted, children: overflow.text }) })] }, i)) : (_jsx(Text, { children: node }, i)))) })] }));
688
- return (_jsxs(Box, { flexDirection: "column", flexShrink: 0, children: [popupVisible && (_jsx(AutocompletePopup, { items: popupItems, selected: clampedSel, theme: theme, caps: caps, maxRows: popupMaxRows, layout: popupLayout })), (_jsx(Box, { flexDirection: "column", flexShrink: 0, borderStyle: glyphs.boxStyle, borderColor: borderColor, paddingX: 1, children: inputRow }))] }));
689
- }