@aragon-agent/tui 0.0.0-stage → 0.0.1

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 (528) hide show
  1. package/CHANGELOG.md +27 -0
  2. package/LICENSE +21 -0
  3. package/README.md +81 -2
  4. package/dist/index.d.ts +11 -0
  5. package/dist/index.js +11 -0
  6. package/dist/input/control-sequences.d.ts +71 -0
  7. package/dist/input/control-sequences.js +222 -0
  8. package/dist/input/csiu-keys.d.ts +66 -0
  9. package/dist/input/csiu-keys.js +181 -0
  10. package/dist/input/cursor-report.d.ts +61 -0
  11. package/dist/input/cursor-report.js +97 -0
  12. package/dist/input/enter-sequences.d.ts +64 -0
  13. package/dist/input/enter-sequences.js +153 -0
  14. package/dist/input/interrupt-gesture.d.ts +18 -0
  15. package/dist/input/interrupt-gesture.js +19 -0
  16. package/dist/input/keyboard-enhancement.d.ts +42 -0
  17. package/dist/input/keyboard-enhancement.js +65 -0
  18. package/dist/input/keymap.d.ts +20 -0
  19. package/dist/input/keymap.js +99 -0
  20. package/dist/input/limits.d.ts +118 -0
  21. package/dist/input/limits.js +109 -0
  22. package/dist/input/mouse-events.d.ts +87 -0
  23. package/dist/input/mouse-events.js +212 -0
  24. package/dist/input/paste-parse.d.ts +83 -0
  25. package/dist/input/paste-parse.js +107 -0
  26. package/dist/input/pointer-router.d.ts +11 -0
  27. package/dist/input/pointer-router.js +14 -0
  28. package/dist/input/stdin-filter.d.ts +112 -0
  29. package/dist/input/stdin-filter.js +657 -0
  30. package/dist/input/win32-input-mode.d.ts +61 -0
  31. package/dist/input/win32-input-mode.js +269 -0
  32. package/dist/model/agent/agent-mode.d.ts +108 -0
  33. package/dist/model/agent/agent-mode.js +121 -0
  34. package/dist/model/agent/entry-limits.d.ts +65 -0
  35. package/dist/model/agent/entry-limits.js +133 -0
  36. package/dist/model/agent/governance-view.d.ts +40 -0
  37. package/dist/model/agent/governance-view.js +40 -0
  38. package/dist/model/agent/invocation-card.d.ts +77 -0
  39. package/dist/model/agent/invocation-card.js +169 -0
  40. package/dist/model/agent/model-probe-limits.d.ts +39 -0
  41. package/dist/model/agent/model-probe-limits.js +25 -0
  42. package/dist/model/agent/model-probe.d.ts +104 -0
  43. package/dist/model/agent/model-probe.js +391 -0
  44. package/dist/model/agent/queued-messages.d.ts +23 -0
  45. package/dist/model/agent/queued-messages.js +49 -0
  46. package/dist/model/agent/reducer.d.ts +857 -0
  47. package/dist/model/agent/reducer.js +1646 -0
  48. package/dist/model/agent/retry-view.d.ts +68 -0
  49. package/dist/model/agent/retry-view.js +95 -0
  50. package/dist/model/agent/usage.d.ts +47 -0
  51. package/dist/model/agent/usage.js +84 -0
  52. package/dist/model/compaction/limits.d.ts +61 -0
  53. package/dist/model/compaction/limits.js +64 -0
  54. package/dist/model/compaction/meter.d.ts +276 -0
  55. package/dist/model/compaction/meter.js +512 -0
  56. package/dist/model/compaction/pressure.d.ts +163 -0
  57. package/dist/model/compaction/pressure.js +199 -0
  58. package/dist/model/compaction/reason-text.d.ts +36 -0
  59. package/dist/model/compaction/reason-text.js +78 -0
  60. package/dist/model/compaction/types.d.ts +360 -0
  61. package/dist/model/compaction/types.js +22 -0
  62. package/dist/model/config/governance-config.d.ts +125 -0
  63. package/dist/model/config/governance-config.js +164 -0
  64. package/dist/model/config/kit-resolution.d.ts +93 -0
  65. package/dist/model/config/kit-resolution.js +226 -0
  66. package/dist/model/config/model-kits.d.ts +225 -0
  67. package/dist/model/config/model-kits.js +302 -0
  68. package/dist/model/config/model-profile-resolution.d.ts +28 -0
  69. package/dist/model/config/model-profile-resolution.js +88 -0
  70. package/dist/model/config/model-profiles.d.ts +103 -0
  71. package/dist/model/config/model-profiles.js +188 -0
  72. package/dist/model/config/model-settings-types.d.ts +71 -0
  73. package/dist/model/config/model-settings-types.js +18 -0
  74. package/dist/model/config/schema.d.ts +1645 -0
  75. package/dist/model/config/schema.js +1383 -0
  76. package/dist/model/fast/limits.d.ts +152 -0
  77. package/dist/model/fast/limits.js +152 -0
  78. package/dist/model/fast/resolve.d.ts +44 -0
  79. package/dist/model/fast/resolve.js +107 -0
  80. package/dist/model/fast/task-summary-types.d.ts +66 -0
  81. package/dist/model/fast/task-summary-types.js +17 -0
  82. package/dist/model/fast/types.d.ts +141 -0
  83. package/dist/model/fast/types.js +14 -0
  84. package/dist/model/governance/governed-dispatch.d.ts +19 -0
  85. package/dist/model/governance/governed-dispatch.js +17 -0
  86. package/dist/model/governance/limits.d.ts +107 -0
  87. package/dist/model/governance/limits.js +131 -0
  88. package/dist/model/governance/posture.d.ts +35 -0
  89. package/dist/model/governance/posture.js +59 -0
  90. package/dist/model/governance/rules/events-table.d.ts +46 -0
  91. package/dist/model/governance/rules/events-table.js +94 -0
  92. package/dist/model/governance/types.d.ts +661 -0
  93. package/dist/model/governance/types.js +27 -0
  94. package/dist/model/logging/levels.d.ts +40 -0
  95. package/dist/model/logging/levels.js +59 -0
  96. package/dist/model/logging/log-port.d.ts +38 -0
  97. package/dist/model/logging/log-port.js +41 -0
  98. package/dist/model/logging/secret-registry.d.ts +32 -0
  99. package/dist/model/logging/secret-registry.js +73 -0
  100. package/dist/model/proc/limits.d.ts +214 -0
  101. package/dist/model/proc/limits.js +221 -0
  102. package/dist/model/proc/progress.d.ts +47 -0
  103. package/dist/model/proc/progress.js +163 -0
  104. package/dist/model/proc/types.d.ts +269 -0
  105. package/dist/model/proc/types.js +15 -0
  106. package/dist/model/proc/wait-view.d.ts +65 -0
  107. package/dist/model/proc/wait-view.js +66 -0
  108. package/dist/model/prompts/copy.d.ts +89 -0
  109. package/dist/model/prompts/copy.js +131 -0
  110. package/dist/model/prompts/fill.d.ts +51 -0
  111. package/dist/model/prompts/fill.js +46 -0
  112. package/dist/model/prompts/limits.d.ts +53 -0
  113. package/dist/model/prompts/limits.js +53 -0
  114. package/dist/model/prompts/search.d.ts +58 -0
  115. package/dist/model/prompts/search.js +146 -0
  116. package/dist/model/prompts/types.d.ts +204 -0
  117. package/dist/model/prompts/types.js +13 -0
  118. package/dist/model/prompts/validate.d.ts +22 -0
  119. package/dist/model/prompts/validate.js +69 -0
  120. package/dist/model/team/activity.d.ts +67 -0
  121. package/dist/model/team/activity.js +130 -0
  122. package/dist/model/team/limits.d.ts +308 -0
  123. package/dist/model/team/limits.js +330 -0
  124. package/dist/model/team/model.d.ts +104 -0
  125. package/dist/model/team/model.js +150 -0
  126. package/dist/model/team/panel-rows.d.ts +48 -0
  127. package/dist/model/team/panel-rows.js +75 -0
  128. package/dist/model/team/timeline.d.ts +74 -0
  129. package/dist/model/team/timeline.js +101 -0
  130. package/dist/model/team/types.d.ts +354 -0
  131. package/dist/model/team/types.js +13 -0
  132. package/dist/model/todo/acceptance.d.ts +120 -0
  133. package/dist/model/todo/acceptance.js +399 -0
  134. package/dist/model/todo/follow-through.d.ts +138 -0
  135. package/dist/model/todo/follow-through.js +248 -0
  136. package/dist/model/todo/limits.d.ts +152 -0
  137. package/dist/model/todo/limits.js +152 -0
  138. package/dist/model/todo/panel-rows.d.ts +45 -0
  139. package/dist/model/todo/panel-rows.js +70 -0
  140. package/dist/model/todo/plan-sections.d.ts +60 -0
  141. package/dist/model/todo/plan-sections.js +108 -0
  142. package/dist/model/todo/row-window.d.ts +51 -0
  143. package/dist/model/todo/row-window.js +107 -0
  144. package/dist/model/todo/types.d.ts +124 -0
  145. package/dist/model/todo/types.js +12 -0
  146. package/dist/model/tools/human-input.d.ts +212 -0
  147. package/dist/model/tools/human-input.js +265 -0
  148. package/dist/model/tools/patch.d.ts +115 -0
  149. package/dist/model/tools/patch.js +453 -0
  150. package/dist/model/tools/terminal-output.d.ts +115 -0
  151. package/dist/model/tools/terminal-output.js +201 -0
  152. package/dist/model/tools/tool-output-store.d.ts +68 -0
  153. package/dist/model/tools/tool-output-store.js +102 -0
  154. package/dist/model/update/limits.d.ts +111 -0
  155. package/dist/model/update/limits.js +111 -0
  156. package/dist/model/update/semver.d.ts +89 -0
  157. package/dist/model/update/semver.js +295 -0
  158. package/dist/model/update/types.d.ts +169 -0
  159. package/dist/model/update/types.js +68 -0
  160. package/dist/testing/governance-fixtures.d.ts +13 -0
  161. package/dist/testing/governance-fixtures.js +98 -0
  162. package/dist/testing/mini-vt.d.ts +28 -0
  163. package/dist/testing/mini-vt.js +158 -0
  164. package/dist/testing/render-at-width.d.ts +16 -0
  165. package/dist/testing/render-at-width.js +57 -0
  166. package/dist/testing/terminal-harness.d.ts +15 -0
  167. package/dist/testing/terminal-harness.js +40 -0
  168. package/dist/testing/vt-screen.d.ts +28 -0
  169. package/dist/testing/vt-screen.js +139 -0
  170. package/dist/ui/ActivityLine.d.ts +26 -0
  171. package/dist/ui/ActivityLine.js +51 -0
  172. package/dist/ui/AutocompletePopup.d.ts +23 -0
  173. package/dist/ui/AutocompletePopup.js +17 -0
  174. package/dist/ui/BottomStatusRow.d.ts +10 -0
  175. package/dist/ui/BottomStatusRow.js +9 -0
  176. package/dist/ui/Composer.d.ts +115 -0
  177. package/dist/ui/Composer.js +64 -0
  178. package/dist/ui/GovernancePanel.d.ts +50 -0
  179. package/dist/ui/GovernancePanel.js +77 -0
  180. package/dist/ui/GovernanceRun.d.ts +18 -0
  181. package/dist/ui/GovernanceRun.js +11 -0
  182. package/dist/ui/Header.d.ts +48 -0
  183. package/dist/ui/Header.js +27 -0
  184. package/dist/ui/Logo.d.ts +32 -0
  185. package/dist/ui/Logo.js +65 -0
  186. package/dist/ui/Markdown.d.ts +29 -0
  187. package/dist/ui/Markdown.js +116 -0
  188. package/dist/ui/PromptCaret.d.ts +11 -0
  189. package/dist/ui/PromptCaret.js +31 -0
  190. package/dist/ui/PromptInput.d.ts +192 -0
  191. package/dist/ui/PromptInput.js +689 -0
  192. package/dist/ui/QueuePanel.d.ts +8 -0
  193. package/dist/ui/QueuePanel.js +9 -0
  194. package/dist/ui/QueueStatusRow.d.ts +24 -0
  195. package/dist/ui/QueueStatusRow.js +51 -0
  196. package/dist/ui/ScrollbackShell.d.ts +132 -0
  197. package/dist/ui/ScrollbackShell.js +26 -0
  198. package/dist/ui/SessionOpener.d.ts +30 -0
  199. package/dist/ui/SessionOpener.js +12 -0
  200. package/dist/ui/StatusBar.d.ts +130 -0
  201. package/dist/ui/StatusBar.js +61 -0
  202. package/dist/ui/TeamPanel.d.ts +76 -0
  203. package/dist/ui/TeamPanel.js +103 -0
  204. package/dist/ui/ToastStack.d.ts +8 -0
  205. package/dist/ui/ToastStack.js +31 -0
  206. package/dist/ui/TodoPanel.d.ts +52 -0
  207. package/dist/ui/TodoPanel.js +214 -0
  208. package/dist/ui/Transcript.d.ts +105 -0
  209. package/dist/ui/Transcript.js +258 -0
  210. package/dist/ui/UpdateLine.d.ts +44 -0
  211. package/dist/ui/UpdateLine.js +129 -0
  212. package/dist/ui/activity-phrases.d.ts +33 -0
  213. package/dist/ui/activity-phrases.js +50 -0
  214. package/dist/ui/capabilities.d.ts +27 -0
  215. package/dist/ui/capabilities.js +65 -0
  216. package/dist/ui/clipboard-task.d.ts +29 -0
  217. package/dist/ui/clipboard-task.js +66 -0
  218. package/dist/ui/clipboard.d.ts +31 -0
  219. package/dist/ui/clipboard.js +157 -0
  220. package/dist/ui/color-runtime.d.ts +5 -0
  221. package/dist/ui/color-runtime.js +29 -0
  222. package/dist/ui/composer-input.d.ts +38 -0
  223. package/dist/ui/composer-input.js +79 -0
  224. package/dist/ui/composer-limits.d.ts +30 -0
  225. package/dist/ui/composer-limits.js +45 -0
  226. package/dist/ui/composer-rows.d.ts +73 -0
  227. package/dist/ui/composer-rows.js +129 -0
  228. package/dist/ui/console-bridge.d.ts +19 -0
  229. package/dist/ui/console-bridge.js +52 -0
  230. package/dist/ui/density.d.ts +26 -0
  231. package/dist/ui/density.js +34 -0
  232. package/dist/ui/display-tab.d.ts +51 -0
  233. package/dist/ui/display-tab.js +82 -0
  234. package/dist/ui/editor-navigation.d.ts +55 -0
  235. package/dist/ui/editor-navigation.js +96 -0
  236. package/dist/ui/editor-reducer.d.ts +108 -0
  237. package/dist/ui/editor-reducer.js +187 -0
  238. package/dist/ui/enter-frames.d.ts +47 -0
  239. package/dist/ui/enter-frames.js +117 -0
  240. package/dist/ui/entries/AssistantEntry.d.ts +37 -0
  241. package/dist/ui/entries/AssistantEntry.js +43 -0
  242. package/dist/ui/entries/CompactionCard.d.ts +88 -0
  243. package/dist/ui/entries/CompactionCard.js +222 -0
  244. package/dist/ui/entries/DiffView.d.ts +61 -0
  245. package/dist/ui/entries/DiffView.js +103 -0
  246. package/dist/ui/entries/EntryFrame.d.ts +23 -0
  247. package/dist/ui/entries/EntryFrame.js +6 -0
  248. package/dist/ui/entries/FastCard.d.ts +53 -0
  249. package/dist/ui/entries/FastCard.js +105 -0
  250. package/dist/ui/entries/GovernanceCard.d.ts +30 -0
  251. package/dist/ui/entries/GovernanceCard.js +32 -0
  252. package/dist/ui/entries/InvocationCard.d.ts +20 -0
  253. package/dist/ui/entries/InvocationCard.js +32 -0
  254. package/dist/ui/entries/QueuedEntry.d.ts +27 -0
  255. package/dist/ui/entries/QueuedEntry.js +33 -0
  256. package/dist/ui/entries/RetryCard.d.ts +56 -0
  257. package/dist/ui/entries/RetryCard.js +60 -0
  258. package/dist/ui/entries/ServiceCard.d.ts +82 -0
  259. package/dist/ui/entries/ServiceCard.js +151 -0
  260. package/dist/ui/entries/TeamCard.d.ts +55 -0
  261. package/dist/ui/entries/TeamCard.js +94 -0
  262. package/dist/ui/entries/TodoCard.d.ts +54 -0
  263. package/dist/ui/entries/TodoCard.js +98 -0
  264. package/dist/ui/entries/ToolCard.d.ts +81 -0
  265. package/dist/ui/entries/ToolCard.js +169 -0
  266. package/dist/ui/entries/ToolPreview.d.ts +59 -0
  267. package/dist/ui/entries/ToolPreview.js +208 -0
  268. package/dist/ui/entries/UserEntry.d.ts +36 -0
  269. package/dist/ui/entries/UserEntry.js +57 -0
  270. package/dist/ui/entries/WaitCard.d.ts +37 -0
  271. package/dist/ui/entries/WaitCard.js +92 -0
  272. package/dist/ui/exit-snapshot.d.ts +43 -0
  273. package/dist/ui/exit-snapshot.js +26 -0
  274. package/dist/ui/frame-differ.d.ts +166 -0
  275. package/dist/ui/frame-differ.js +354 -0
  276. package/dist/ui/frame-observer.d.ts +17 -0
  277. package/dist/ui/frame-observer.js +94 -0
  278. package/dist/ui/frame-parser.d.ts +7 -0
  279. package/dist/ui/frame-parser.js +18 -0
  280. package/dist/ui/gauge.d.ts +39 -0
  281. package/dist/ui/gauge.js +55 -0
  282. package/dist/ui/glyphs.d.ts +178 -0
  283. package/dist/ui/glyphs.js +165 -0
  284. package/dist/ui/governance-copy.d.ts +69 -0
  285. package/dist/ui/governance-copy.js +104 -0
  286. package/dist/ui/governance-status.d.ts +145 -0
  287. package/dist/ui/governance-status.js +326 -0
  288. package/dist/ui/gradient.d.ts +11 -0
  289. package/dist/ui/gradient.js +50 -0
  290. package/dist/ui/ink-runtime.d.ts +4 -0
  291. package/dist/ui/ink-runtime.js +51 -0
  292. package/dist/ui/interaction-copy.d.ts +84 -0
  293. package/dist/ui/interaction-copy.js +41 -0
  294. package/dist/ui/interaction-hints.d.ts +44 -0
  295. package/dist/ui/interaction-hints.js +97 -0
  296. package/dist/ui/layout/AppShell.d.ts +17 -0
  297. package/dist/ui/layout/AppShell.js +6 -0
  298. package/dist/ui/layout/Gutter.d.ts +67 -0
  299. package/dist/ui/layout/Gutter.js +42 -0
  300. package/dist/ui/layout/MeasuredEntry.d.ts +21 -0
  301. package/dist/ui/layout/MeasuredEntry.js +30 -0
  302. package/dist/ui/layout/OverlayFrame.d.ts +73 -0
  303. package/dist/ui/layout/OverlayFrame.js +110 -0
  304. package/dist/ui/layout/ScrollIndicator.d.ts +32 -0
  305. package/dist/ui/layout/ScrollIndicator.js +22 -0
  306. package/dist/ui/layout/ScrollViewport.d.ts +40 -0
  307. package/dist/ui/layout/ScrollViewport.js +222 -0
  308. package/dist/ui/layout/agents-board.d.ts +102 -0
  309. package/dist/ui/layout/agents-board.js +389 -0
  310. package/dist/ui/layout/autocomplete.d.ts +18 -0
  311. package/dist/ui/layout/autocomplete.js +26 -0
  312. package/dist/ui/layout/budget.d.ts +43 -0
  313. package/dist/ui/layout/budget.js +52 -0
  314. package/dist/ui/layout/cells.d.ts +61 -0
  315. package/dist/ui/layout/cells.js +156 -0
  316. package/dist/ui/layout/document-layout.d.ts +13 -0
  317. package/dist/ui/layout/document-layout.js +10 -0
  318. package/dist/ui/layout/follow-state.d.ts +138 -0
  319. package/dist/ui/layout/follow-state.js +148 -0
  320. package/dist/ui/layout/frame.d.ts +36 -0
  321. package/dist/ui/layout/frame.js +39 -0
  322. package/dist/ui/layout/governance-board.d.ts +121 -0
  323. package/dist/ui/layout/governance-board.js +382 -0
  324. package/dist/ui/layout/governance-card.d.ts +53 -0
  325. package/dist/ui/layout/governance-card.js +134 -0
  326. package/dist/ui/layout/governance-chip.d.ts +38 -0
  327. package/dist/ui/layout/governance-chip.js +64 -0
  328. package/dist/ui/layout/governance-panel.d.ts +85 -0
  329. package/dist/ui/layout/governance-panel.js +358 -0
  330. package/dist/ui/layout/governance-roster.d.ts +65 -0
  331. package/dist/ui/layout/governance-roster.js +275 -0
  332. package/dist/ui/layout/header-hints.d.ts +90 -0
  333. package/dist/ui/layout/header-hints.js +110 -0
  334. package/dist/ui/layout/header-left.d.ts +115 -0
  335. package/dist/ui/layout/header-left.js +206 -0
  336. package/dist/ui/layout/invocation-card.d.ts +41 -0
  337. package/dist/ui/layout/invocation-card.js +91 -0
  338. package/dist/ui/layout/kit-chip.d.ts +50 -0
  339. package/dist/ui/layout/kit-chip.js +81 -0
  340. package/dist/ui/layout/overlay-window.d.ts +43 -0
  341. package/dist/ui/layout/overlay-window.js +51 -0
  342. package/dist/ui/layout/queue-layout.d.ts +19 -0
  343. package/dist/ui/layout/queue-layout.js +26 -0
  344. package/dist/ui/layout/rail.d.ts +7 -0
  345. package/dist/ui/layout/rail.js +16 -0
  346. package/dist/ui/layout/scroll-indicator.d.ts +27 -0
  347. package/dist/ui/layout/scroll-indicator.js +36 -0
  348. package/dist/ui/layout/scroll.d.ts +37 -0
  349. package/dist/ui/layout/scroll.js +99 -0
  350. package/dist/ui/layout/scrollbar-geometry.d.ts +17 -0
  351. package/dist/ui/layout/scrollbar-geometry.js +13 -0
  352. package/dist/ui/layout/session-chip.d.ts +52 -0
  353. package/dist/ui/layout/session-chip.js +64 -0
  354. package/dist/ui/layout/shortcut-panel-layout.d.ts +191 -0
  355. package/dist/ui/layout/shortcut-panel-layout.js +321 -0
  356. package/dist/ui/layout/status-detail-layout.d.ts +9 -0
  357. package/dist/ui/layout/status-detail-layout.js +79 -0
  358. package/dist/ui/layout/status-layout.d.ts +140 -0
  359. package/dist/ui/layout/status-layout.js +262 -0
  360. package/dist/ui/layout/task-summary-cell.d.ts +61 -0
  361. package/dist/ui/layout/task-summary-cell.js +65 -0
  362. package/dist/ui/layout/team-panel.d.ts +18 -0
  363. package/dist/ui/layout/team-panel.js +25 -0
  364. package/dist/ui/layout/team-row.d.ts +139 -0
  365. package/dist/ui/layout/team-row.js +246 -0
  366. package/dist/ui/layout/todo-layout.d.ts +62 -0
  367. package/dist/ui/layout/todo-layout.js +102 -0
  368. package/dist/ui/layout/useTerminalSize.d.ts +13 -0
  369. package/dist/ui/layout/useTerminalSize.js +50 -0
  370. package/dist/ui/layout/viewport-geometry.d.ts +29 -0
  371. package/dist/ui/layout/viewport-geometry.js +28 -0
  372. package/dist/ui/layout/virtual-window.d.ts +112 -0
  373. package/dist/ui/layout/virtual-window.js +494 -0
  374. package/dist/ui/layout/wait-bar.d.ts +34 -0
  375. package/dist/ui/layout/wait-bar.js +48 -0
  376. package/dist/ui/layout/wrap-rows.d.ts +26 -0
  377. package/dist/ui/layout/wrap-rows.js +88 -0
  378. package/dist/ui/live-clamp.d.ts +14 -0
  379. package/dist/ui/live-clamp.js +46 -0
  380. package/dist/ui/markdown-blocks.d.ts +107 -0
  381. package/dist/ui/markdown-blocks.js +240 -0
  382. package/dist/ui/overlays/AgentsBoardOverlay.d.ts +57 -0
  383. package/dist/ui/overlays/AgentsBoardOverlay.js +183 -0
  384. package/dist/ui/overlays/ConfirmDialog.d.ts +31 -0
  385. package/dist/ui/overlays/ConfirmDialog.js +44 -0
  386. package/dist/ui/overlays/GovernanceBoardOverlay.d.ts +41 -0
  387. package/dist/ui/overlays/GovernanceBoardOverlay.js +76 -0
  388. package/dist/ui/overlays/GovernanceSettingsPage.d.ts +48 -0
  389. package/dist/ui/overlays/GovernanceSettingsPage.js +93 -0
  390. package/dist/ui/overlays/HelpOverlay.d.ts +29 -0
  391. package/dist/ui/overlays/HelpOverlay.js +232 -0
  392. package/dist/ui/overlays/KitEditor.d.ts +23 -0
  393. package/dist/ui/overlays/KitEditor.js +101 -0
  394. package/dist/ui/overlays/KitManager.d.ts +23 -0
  395. package/dist/ui/overlays/KitManager.js +104 -0
  396. package/dist/ui/overlays/KitPicker.d.ts +49 -0
  397. package/dist/ui/overlays/KitPicker.js +58 -0
  398. package/dist/ui/overlays/ModelDiscoveryList.d.ts +23 -0
  399. package/dist/ui/overlays/ModelDiscoveryList.js +161 -0
  400. package/dist/ui/overlays/ModelPicker.d.ts +26 -0
  401. package/dist/ui/overlays/ModelPicker.js +63 -0
  402. package/dist/ui/overlays/ModelProfileEditor.d.ts +29 -0
  403. package/dist/ui/overlays/ModelProfileEditor.js +168 -0
  404. package/dist/ui/overlays/ModelProfilePicker.d.ts +48 -0
  405. package/dist/ui/overlays/ModelProfilePicker.js +231 -0
  406. package/dist/ui/overlays/PlanReviewOverlay.d.ts +51 -0
  407. package/dist/ui/overlays/PlanReviewOverlay.js +132 -0
  408. package/dist/ui/overlays/PromptEditorPage.d.ts +48 -0
  409. package/dist/ui/overlays/PromptEditorPage.js +227 -0
  410. package/dist/ui/overlays/PromptLibraryOverlay.d.ts +37 -0
  411. package/dist/ui/overlays/PromptLibraryOverlay.js +191 -0
  412. package/dist/ui/overlays/PromptPicker.d.ts +36 -0
  413. package/dist/ui/overlays/PromptPicker.js +129 -0
  414. package/dist/ui/overlays/PromptTextArea.d.ts +86 -0
  415. package/dist/ui/overlays/PromptTextArea.js +141 -0
  416. package/dist/ui/overlays/QuestionOverlay.d.ts +39 -0
  417. package/dist/ui/overlays/QuestionOverlay.js +258 -0
  418. package/dist/ui/overlays/QueueOverlay.d.ts +22 -0
  419. package/dist/ui/overlays/QueueOverlay.js +79 -0
  420. package/dist/ui/overlays/SettingsScreen.d.ts +228 -0
  421. package/dist/ui/overlays/SettingsScreen.js +1037 -0
  422. package/dist/ui/overlays/ShortcutPanel.d.ts +39 -0
  423. package/dist/ui/overlays/ShortcutPanel.js +106 -0
  424. package/dist/ui/overlays/TeamFanoutPage.d.ts +51 -0
  425. package/dist/ui/overlays/TeamFanoutPage.js +90 -0
  426. package/dist/ui/overlays/governance-settings.d.ts +79 -0
  427. package/dist/ui/overlays/governance-settings.js +140 -0
  428. package/dist/ui/overlays/kit-picker-state.d.ts +87 -0
  429. package/dist/ui/overlays/kit-picker-state.js +136 -0
  430. package/dist/ui/overlays/kit-settings-state.d.ts +129 -0
  431. package/dist/ui/overlays/kit-settings-state.js +268 -0
  432. package/dist/ui/overlays/model-probe-view.d.ts +128 -0
  433. package/dist/ui/overlays/model-probe-view.js +225 -0
  434. package/dist/ui/overlays/model-profile-state.d.ts +177 -0
  435. package/dist/ui/overlays/model-profile-state.js +301 -0
  436. package/dist/ui/overlays/prompt-library-state.d.ts +162 -0
  437. package/dist/ui/overlays/prompt-library-state.js +335 -0
  438. package/dist/ui/overlays/prompt-picker-state.d.ts +71 -0
  439. package/dist/ui/overlays/prompt-picker-state.js +98 -0
  440. package/dist/ui/overlays/team-fanout-state.d.ts +106 -0
  441. package/dist/ui/overlays/team-fanout-state.js +155 -0
  442. package/dist/ui/overlays/use-model-probe.d.ts +30 -0
  443. package/dist/ui/overlays/use-model-probe.js +109 -0
  444. package/dist/ui/palettes.d.ts +112 -0
  445. package/dist/ui/palettes.js +130 -0
  446. package/dist/ui/paste-frames.d.ts +91 -0
  447. package/dist/ui/paste-frames.js +117 -0
  448. package/dist/ui/paste-tokens.d.ts +90 -0
  449. package/dist/ui/paste-tokens.js +147 -0
  450. package/dist/ui/render-cache.d.ts +81 -0
  451. package/dist/ui/render-cache.js +196 -0
  452. package/dist/ui/render-governor.d.ts +54 -0
  453. package/dist/ui/render-governor.js +78 -0
  454. package/dist/ui/run-metrics.d.ts +23 -0
  455. package/dist/ui/run-metrics.js +27 -0
  456. package/dist/ui/run-status-row.d.ts +63 -0
  457. package/dist/ui/run-status-row.js +54 -0
  458. package/dist/ui/screen.d.ts +107 -0
  459. package/dist/ui/screen.js +234 -0
  460. package/dist/ui/scrollback/LiveTail.d.ts +115 -0
  461. package/dist/ui/scrollback/LiveTail.js +48 -0
  462. package/dist/ui/scrollback/band.d.ts +114 -0
  463. package/dist/ui/scrollback/band.js +143 -0
  464. package/dist/ui/scrollback/budget.d.ts +90 -0
  465. package/dist/ui/scrollback/budget.js +100 -0
  466. package/dist/ui/scrollback/canvas.d.ts +100 -0
  467. package/dist/ui/scrollback/canvas.js +114 -0
  468. package/dist/ui/scrollback/cursor-probe.d.ts +71 -0
  469. package/dist/ui/scrollback/cursor-probe.js +133 -0
  470. package/dist/ui/scrollback/drain.d.ts +32 -0
  471. package/dist/ui/scrollback/drain.js +64 -0
  472. package/dist/ui/scrollback/exit-summary.d.ts +23 -0
  473. package/dist/ui/scrollback/exit-summary.js +25 -0
  474. package/dist/ui/scrollback/limits.d.ts +98 -0
  475. package/dist/ui/scrollback/limits.js +98 -0
  476. package/dist/ui/scrollback/live-preview.d.ts +34 -0
  477. package/dist/ui/scrollback/live-preview.js +130 -0
  478. package/dist/ui/scrollback/overflow-print.d.ts +108 -0
  479. package/dist/ui/scrollback/overflow-print.js +120 -0
  480. package/dist/ui/scrollback/renderer.d.ts +48 -0
  481. package/dist/ui/scrollback/renderer.js +186 -0
  482. package/dist/ui/scrollback/scrollback-writer.d.ts +174 -0
  483. package/dist/ui/scrollback/scrollback-writer.js +648 -0
  484. package/dist/ui/scrollback/settled-boundary.d.ts +42 -0
  485. package/dist/ui/scrollback/settled-boundary.js +109 -0
  486. package/dist/ui/scrollback/tail-anchor.d.ts +71 -0
  487. package/dist/ui/scrollback/tail-anchor.js +79 -0
  488. package/dist/ui/scrollback/tail-window.d.ts +73 -0
  489. package/dist/ui/scrollback/tail-window.js +89 -0
  490. package/dist/ui/scrollback/use-scrollback-view.d.ts +139 -0
  491. package/dist/ui/scrollback/use-scrollback-view.js +601 -0
  492. package/dist/ui/scrollback/writer-shapes.d.ts +127 -0
  493. package/dist/ui/scrollback/writer-shapes.js +159 -0
  494. package/dist/ui/scrollbar-controller.d.ts +30 -0
  495. package/dist/ui/scrollbar-controller.js +124 -0
  496. package/dist/ui/selection/highlight.d.ts +39 -0
  497. package/dist/ui/selection/highlight.js +64 -0
  498. package/dist/ui/selection/screen-mirror.d.ts +24 -0
  499. package/dist/ui/selection/screen-mirror.js +35 -0
  500. package/dist/ui/selection/selection-controller.d.ts +104 -0
  501. package/dist/ui/selection/selection-controller.js +372 -0
  502. package/dist/ui/selection/selection.d.ts +90 -0
  503. package/dist/ui/selection/selection.js +223 -0
  504. package/dist/ui/shortcuts.d.ts +81 -0
  505. package/dist/ui/shortcuts.js +221 -0
  506. package/dist/ui/status-feedback.d.ts +35 -0
  507. package/dist/ui/status-feedback.js +38 -0
  508. package/dist/ui/stdout-frame-writer.d.ts +74 -0
  509. package/dist/ui/stdout-frame-writer.js +155 -0
  510. package/dist/ui/team-status.d.ts +166 -0
  511. package/dist/ui/team-status.js +252 -0
  512. package/dist/ui/terminal-plan.d.ts +52 -0
  513. package/dist/ui/terminal-plan.js +49 -0
  514. package/dist/ui/theme.d.ts +96 -0
  515. package/dist/ui/theme.js +130 -0
  516. package/dist/ui/transcript-text.d.ts +41 -0
  517. package/dist/ui/transcript-text.js +282 -0
  518. package/dist/ui/use-height-store.d.ts +31 -0
  519. package/dist/ui/use-height-store.js +76 -0
  520. package/dist/ui/use-render-governor.d.ts +39 -0
  521. package/dist/ui/use-render-governor.js +57 -0
  522. package/dist/ui/use-wheel-routing.d.ts +57 -0
  523. package/dist/ui/use-wheel-routing.js +152 -0
  524. package/dist/ui/win-vt-force.d.ts +136 -0
  525. package/dist/ui/win-vt-force.js +237 -0
  526. package/dist/ui/win-vt-input.d.ts +57 -0
  527. package/dist/ui/win-vt-input.js +62 -0
  528. package/package.json +86 -4
@@ -0,0 +1,65 @@
1
+ /**
2
+ * Keyboard-enhancement lifecycle (the Shift+Enter newline fix).
3
+ *
4
+ * WHY A LIFECYCLE MODULE AND NOT ANOTHER `screen.ts` MODE. The alternate
5
+ * screen is bound to fullscreen rendering; keyboard enhancement must run in
6
+ * every interactive session, inline included, because the composer is always
7
+ * there. It still follows the screen module's discipline: bytes are written
8
+ * ONLY for a TTY stdout, restore is idempotent, and the caller owns every
9
+ * decision -- this module is told the resolved capability and never derives
10
+ * one from config or environment.
11
+ *
12
+ * PLATFORM SPLIT, DECIDED BY BYTE-LEVEL PROBES (see
13
+ * docs/diagnoses/shift-enter-newline-dead-by-default):
14
+ *
15
+ * - win32: `?9001h` (win32-input-mode). It works through ConPTY on both
16
+ * conhost and Windows Terminal; kitty `CSI > 1 u` is swallowed there (a
17
+ * `CSI ? u` query never answers) and modifyOtherKeys is a no-op. Gated on
18
+ * the SAME `vtInputSupported` measurement the mouse feature uses: on Node
19
+ * < 22.17 / < 24.2 libuv never turns on `ENABLE_VIRTUAL_TERMINAL_INPUT`,
20
+ * so the records cannot reach the process and the mode would be a lie.
21
+ * - everything else: kitty disambiguate (`CSI > 1 u`) plus
22
+ * `modifyOtherKeys=2`. iTerm2 / kitty / ghostty / WezTerm / foot implement
23
+ * at least one; terminals that implement neither ignore both bytes.
24
+ */
25
+ import { CSI_U_DISABLE, CSI_U_ENABLE, } from './csiu-keys.js';
26
+ import { WIN32_INPUT_DISABLE, WIN32_INPUT_ENABLE } from './win32-input-mode.js';
27
+ const NOOP_HANDLE = { restore() { } };
28
+ /** The handle a gated-out session reads: nothing was pushed, nothing unwinds. */
29
+ export const NOOP_KEYBOARD_ENHANCEMENT = NOOP_HANDLE;
30
+ function safeWrite(stdout, data) {
31
+ try {
32
+ stdout.write(data);
33
+ }
34
+ catch {
35
+ // A closed/broken stdout must never crash the exit path.
36
+ }
37
+ }
38
+ /**
39
+ * Ask the terminal to report modified keys distinctly. The returned handle's
40
+ * `restore()` hands the keyboard back; wire it into the same convergence
41
+ * point the screen restore uses so every exit path unwinds both.
42
+ *
43
+ * `vtInputSupported` is the measurement `cli.tsx` already resolves for the
44
+ * mouse gate; on win32 it decides between `?9001h` and nothing at all.
45
+ */
46
+ export function enableKeyboardEnhancement(stdout, opts) {
47
+ if (!stdout || !stdout.isTTY || typeof stdout.write !== 'function')
48
+ return NOOP_HANDLE;
49
+ const enable = opts.platform === 'win32'
50
+ ? (opts.vtInputSupported ? WIN32_INPUT_ENABLE : '')
51
+ : CSI_U_ENABLE;
52
+ if (enable.length === 0)
53
+ return NOOP_HANDLE;
54
+ const disable = opts.platform === 'win32' ? WIN32_INPUT_DISABLE : CSI_U_DISABLE;
55
+ safeWrite(stdout, enable);
56
+ let restored = false;
57
+ return {
58
+ restore() {
59
+ if (restored)
60
+ return;
61
+ restored = true;
62
+ safeWrite(stdout, disable);
63
+ },
64
+ };
65
+ }
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Editing keymap (spec §3.10). Pure: maps a raw `useInput` `(input, key)` pair
3
+ * to a line-editing intent. Ink does not surface Home/End/word keys on its
4
+ * `key` object — those arrive as raw escape sequences in `input` — so this
5
+ * recognizer inspects both the parsed `key` flags (for Ctrl/Alt combos) and the
6
+ * raw sequence (for Home/End/word jumps), and returns `null` for anything it
7
+ * does not own so the caller can drop unknown control bytes instead of
8
+ * inserting them into the buffer.
9
+ */
10
+ export type EditIntent = 'home' | 'end' | 'wordLeft' | 'wordRight' | 'deleteWordBack' | 'killToStart' | 'killToEnd';
11
+ /** Minimal shape of Ink's `Key` we consult (structurally compatible). */
12
+ export interface KeyState {
13
+ ctrl?: boolean;
14
+ meta?: boolean;
15
+ shift?: boolean;
16
+ leftArrow?: boolean;
17
+ rightArrow?: boolean;
18
+ }
19
+ /** Recognize a line-editing intent, or `null` if this key is not an edit op. */
20
+ export declare function recognize(input: string, key: KeyState): EditIntent | null;
@@ -0,0 +1,99 @@
1
+ /**
2
+ * Editing keymap (spec §3.10). Pure: maps a raw `useInput` `(input, key)` pair
3
+ * to a line-editing intent. Ink does not surface Home/End/word keys on its
4
+ * `key` object — those arrive as raw escape sequences in `input` — so this
5
+ * recognizer inspects both the parsed `key` flags (for Ctrl/Alt combos) and the
6
+ * raw sequence (for Home/End/word jumps), and returns `null` for anything it
7
+ * does not own so the caller can drop unknown control bytes instead of
8
+ * inserting them into the buffer.
9
+ */
10
+ /**
11
+ * Map a Ctrl-modified key to an intent, if any.
12
+ *
13
+ * `Ctrl+K` IS DELIBERATELY NOT HERE (agent-model-kits D-15). That byte belongs
14
+ * to the Agent-kit picker on the main screen, and this recognizer runs BEFORE
15
+ * `PromptInput`'s `if (key.ctrl) return` - so keeping the binding would delete
16
+ * the user's draft in one listener while the other opened the overlay. The
17
+ * capability moved to `Alt+K` (`fromMeta`) instead of being dropped.
18
+ */
19
+ function fromCtrl(input, key) {
20
+ if (key.leftArrow)
21
+ return 'wordLeft';
22
+ if (key.rightArrow)
23
+ return 'wordRight';
24
+ switch (input) {
25
+ case 'a':
26
+ return 'home';
27
+ case 'e':
28
+ return 'end';
29
+ case 'w':
30
+ return 'deleteWordBack';
31
+ case 'u':
32
+ return 'killToStart';
33
+ default:
34
+ return null;
35
+ }
36
+ }
37
+ /** Map an Alt/Meta-modified key to an intent, if any. */
38
+ function fromMeta(input) {
39
+ if (input === 'b')
40
+ return 'wordLeft';
41
+ if (input === 'f')
42
+ return 'wordRight';
43
+ // `killToEnd` LIVES HERE NOW (agent-model-kits D-15). `Alt+K` keeps the
44
+ // capability, and it keeps the kill family together: `M-k` is kill-sentence in
45
+ // the Emacs tradition this keymap already borrows `Ctrl+W` and `Alt+B/F` from.
46
+ if (input === 'k')
47
+ return 'killToEnd';
48
+ if (input === '\x7f' || input === '\b')
49
+ return 'deleteWordBack';
50
+ return null;
51
+ }
52
+ /** Map a raw terminal escape / control sequence to an intent, if any. */
53
+ function fromRaw(input) {
54
+ switch (input) {
55
+ case '\x1b[H':
56
+ case '\x1b[1~':
57
+ case '\x1bOH':
58
+ case '\x01': // Ctrl+A (raw)
59
+ return 'home';
60
+ case '\x1b[F':
61
+ case '\x1b[4~':
62
+ case '\x1bOF':
63
+ case '\x05': // Ctrl+E (raw)
64
+ return 'end';
65
+ case '\x1b[1;5D':
66
+ case '\x1bb':
67
+ return 'wordLeft';
68
+ case '\x1b[1;5C':
69
+ case '\x1bf':
70
+ return 'wordRight';
71
+ case '\x17': // Ctrl+W (raw)
72
+ case '\x1b\x7f':
73
+ case '\x1b\b':
74
+ return 'deleteWordBack';
75
+ case '\x15': // Ctrl+U (raw)
76
+ return 'killToStart';
77
+ case '\x1bk':
78
+ // Alt+K (raw ESC + k). `\x0b` (Ctrl+K) is deliberately ABSENT: it belongs
79
+ // to the Agent-kit picker, and a case for it here would be a dead binding
80
+ // that still looks alive to every future reader.
81
+ return 'killToEnd';
82
+ default:
83
+ return null;
84
+ }
85
+ }
86
+ /** Recognize a line-editing intent, or `null` if this key is not an edit op. */
87
+ export function recognize(input, key) {
88
+ if (key.ctrl) {
89
+ const hit = fromCtrl(input, key);
90
+ if (hit)
91
+ return hit;
92
+ }
93
+ if (key.meta) {
94
+ const hit = fromMeta(input);
95
+ if (hit)
96
+ return hit;
97
+ }
98
+ return fromRaw(input);
99
+ }
@@ -0,0 +1,118 @@
1
+ /**
2
+ * Structural bounds for paste handling (tui-paste-handling D-10 / section 8).
3
+ *
4
+ * THESE ARE STRUCTURAL, NOT POLICY. The package convention recorded in
5
+ * `.claude-index/index.md` is that `limits.ts` carries the numbers an
6
+ * implementation needs to stay bounded, while `config/schema.ts` carries the
7
+ * preferences a user is allowed to have. The only user-facing key this feature
8
+ * adds is the boolean `paste`; a tunable collapse threshold is a preference
9
+ * nobody has asked for, and a kill switch is what a bug report actually needs.
10
+ *
11
+ * The two framing constants below are the only bytes that cross from the stdin
12
+ * filter into the composer, so they are load-bearing in a way a threshold is
13
+ * not: see `PASTE_OPEN`.
14
+ */
15
+ /**
16
+ * Ceiling on ONE paste. Above it the body is dropped and the user is told,
17
+ * never truncated (D-11): a truncated paste loses data and looks like success.
18
+ */
19
+ export declare const PASTE_MAX_BYTES: number;
20
+ /** Ceiling on every live payload in one draft, summed. Above it a paste is refused. */
21
+ export declare const PASTE_DRAFT_MAX_BYTES: number;
22
+ /** Ceiling on collapsed blocks in one draft. Above it a paste is refused. */
23
+ export declare const PASTE_MAX_BLOCKS = 32;
24
+ /**
25
+ * Tier 2's single-line rule: a chunk of at least this many printable characters
26
+ * with no line break is a paste.
27
+ *
28
+ * Safe because coalescing a keyboard burst into 25 characters inside one
29
+ * event-loop turn needs roughly 1 500 WPM. It is a statement about what a
30
+ * KEYBOARD can emit, not about what text looks like.
31
+ */
32
+ export declare const PASTE_MIN_BURST_CHARS = 25;
33
+ /** Tier 2 coalescing window. Ordinary typing never opens it, so never pays it. */
34
+ export declare const PASTE_BURST_MS = 15;
35
+ /**
36
+ * How long an unterminated Tier 1 body is held before it is force-flushed.
37
+ *
38
+ * I-4: an unterminated `\x1b[200~` must never be able to wedge keyboard input,
39
+ * which is the rule `MAX_PENDING_MOUSE_CHARS` already encodes for mouse reports.
40
+ */
41
+ export declare const PASTE_ASSEMBLY_MAX_MS = 2000;
42
+ /**
43
+ * How long a paste-marker head that was ALREADY released to the pass-through as
44
+ * ordinary text may still be recognised as the head of a marker (defect 2: the
45
+ * torn-marker rescue in `stdin-filter.ts`).
46
+ *
47
+ * STRUCTURAL, NOT POLICY: no config key exposes it, because it bounds what the
48
+ * byte stream can physically do -- a marker split across two reads -- and not
49
+ * what a user prefers. What it does NOT do is delay a keystroke: the 12 ms
50
+ * pending-flush window in `stdin-filter.ts` still releases a lone ESC exactly as
51
+ * before, and this window only governs whether that release may be spliced back
52
+ * in front of the next chunk so an assembled marker is consumed, not typed.
53
+ *
54
+ * THE FALSE POSITIVE IS THE TRADE-OFF, AND IT IS ACCEPTED. Firing the rescue
55
+ * wrongly needs the user to press Esc and then TYPE the literal characters
56
+ * `[200~` or `[201~` inside this window -- a sequence no keyboard produces, and
57
+ * at worst five characters of lost typing. Paying that buys a fix for visible
58
+ * `[200~` / `[201~` garbage in the draft, which is the failure the whole paste
59
+ * feature exists to prevent.
60
+ */
61
+ export declare const PASTE_MARKER_RESCAN_TTL_MS = 250;
62
+ /**
63
+ * The inline frame the filter writes into the stream Ink reads (D-3 / I-5).
64
+ *
65
+ * ON THE SAME STREAM, NOT A SIDE CHANNEL. `wrapper.write(text)` is delivered
66
+ * asynchronously; a synchronous side-channel emit would apply the paste BEFORE
67
+ * text that preceded it in the same chunk. Framing preserves order by
68
+ * construction.
69
+ *
70
+ * NUL is the delimiter because no terminal delivers it for any key, and because
71
+ * `sanitisePaste` strips every NUL out of every payload -- so a payload can
72
+ * never forge a frame boundary.
73
+ */
74
+ export declare const PASTE_OPEN = "\0[";
75
+ export declare const PASTE_CLOSE = "\0]";
76
+ /**
77
+ * The inline frame that carries ONE newline intent from the stdin filter to the
78
+ * composer (tui-shift-enter-copy-queue 3.2).
79
+ *
80
+ * SAME FAMILY AS `PASTE_OPEN`, with the same guarantee and for the same reason:
81
+ * NUL is the delimiter because no terminal delivers it for any key, and because
82
+ * `sanitisePaste` strips every NUL out of every payload -- so pasted text can
83
+ * never forge this frame either. A newline intent is single, atomic and carries
84
+ * no payload, so one constant replaces the OPEN/CLOSE pair.
85
+ */
86
+ export declare const ENTER_NEWLINE_FRAME = "\0n";
87
+ /**
88
+ * The inline frame that carries ONE "Ctrl+I was pressed" intent from the stdin
89
+ * filter to `App` (project-indexer Ctrl+I trigger).
90
+ *
91
+ * WHY A FRAME AND NOT `key.ctrl && input === 'i'`. Legacy terminals encode
92
+ * Ctrl+I as the same byte as Tab (0x09), so by the time the stream reaches Ink
93
+ * the two are indistinguishable. Under win32-input-mode (`?9001h`) and kitty
94
+ * CSI-u the modifiers ARE known at translation time, and both translators emit
95
+ * this frame instead of the legacy Tab byte. Same NUL-delimiter guarantee as
96
+ * `ENTER_NEWLINE_FRAME`: no terminal delivers NUL for a key and pasted text is
97
+ * stripped of NUL, so a payload can never forge it. Terminals without keyboard
98
+ * enhancement keep the legacy collapse — Ctrl+I there is Tab, documented in the
99
+ * README keybindings table.
100
+ */
101
+ export declare const INDEX_KEY_FRAME = "\0i";
102
+ /**
103
+ * The one channel from the stdin filter to `App`'s notice dispatch (P1-3 / I-15).
104
+ *
105
+ * The filter is constructed in `cli.tsx` BEFORE `render()`, so it has no
106
+ * `dispatch`. Its only other outlet is the logger, and a limit that writes only
107
+ * to a log file is indistinguishable -- from the user's chair -- from a paste
108
+ * that silently did nothing, which is exactly what D-11 exists to rule out.
109
+ *
110
+ * Same late-bound shape as `selectionBridge` / `updateBridge` / `terminalBridge`:
111
+ * `cli.tsx` creates the object, `App` assigns `notify` on mount and clears it on
112
+ * unmount, and the filter calls `bridge.notify?.(...)`.
113
+ */
114
+ export interface PasteBridge {
115
+ notify: ((level: 'warn' | 'error', text: string) => void) | null;
116
+ }
117
+ /** Human-readable byte size for the refusal toast (`4.1 MB`, `812.0 KB`, `7 B`). */
118
+ export declare function formatPasteSize(bytes: number): string;
@@ -0,0 +1,109 @@
1
+ /**
2
+ * Structural bounds for paste handling (tui-paste-handling D-10 / section 8).
3
+ *
4
+ * THESE ARE STRUCTURAL, NOT POLICY. The package convention recorded in
5
+ * `.claude-index/index.md` is that `limits.ts` carries the numbers an
6
+ * implementation needs to stay bounded, while `config/schema.ts` carries the
7
+ * preferences a user is allowed to have. The only user-facing key this feature
8
+ * adds is the boolean `paste`; a tunable collapse threshold is a preference
9
+ * nobody has asked for, and a kill switch is what a bug report actually needs.
10
+ *
11
+ * The two framing constants below are the only bytes that cross from the stdin
12
+ * filter into the composer, so they are load-bearing in a way a threshold is
13
+ * not: see `PASTE_OPEN`.
14
+ */
15
+ /**
16
+ * Ceiling on ONE paste. Above it the body is dropped and the user is told,
17
+ * never truncated (D-11): a truncated paste loses data and looks like success.
18
+ */
19
+ export const PASTE_MAX_BYTES = 2 * 1024 * 1024;
20
+ /** Ceiling on every live payload in one draft, summed. Above it a paste is refused. */
21
+ export const PASTE_DRAFT_MAX_BYTES = 8 * 1024 * 1024;
22
+ /** Ceiling on collapsed blocks in one draft. Above it a paste is refused. */
23
+ export const PASTE_MAX_BLOCKS = 32;
24
+ /**
25
+ * Tier 2's single-line rule: a chunk of at least this many printable characters
26
+ * with no line break is a paste.
27
+ *
28
+ * Safe because coalescing a keyboard burst into 25 characters inside one
29
+ * event-loop turn needs roughly 1 500 WPM. It is a statement about what a
30
+ * KEYBOARD can emit, not about what text looks like.
31
+ */
32
+ export const PASTE_MIN_BURST_CHARS = 25;
33
+ /** Tier 2 coalescing window. Ordinary typing never opens it, so never pays it. */
34
+ export const PASTE_BURST_MS = 15;
35
+ /**
36
+ * How long an unterminated Tier 1 body is held before it is force-flushed.
37
+ *
38
+ * I-4: an unterminated `\x1b[200~` must never be able to wedge keyboard input,
39
+ * which is the rule `MAX_PENDING_MOUSE_CHARS` already encodes for mouse reports.
40
+ */
41
+ export const PASTE_ASSEMBLY_MAX_MS = 2_000;
42
+ /**
43
+ * How long a paste-marker head that was ALREADY released to the pass-through as
44
+ * ordinary text may still be recognised as the head of a marker (defect 2: the
45
+ * torn-marker rescue in `stdin-filter.ts`).
46
+ *
47
+ * STRUCTURAL, NOT POLICY: no config key exposes it, because it bounds what the
48
+ * byte stream can physically do -- a marker split across two reads -- and not
49
+ * what a user prefers. What it does NOT do is delay a keystroke: the 12 ms
50
+ * pending-flush window in `stdin-filter.ts` still releases a lone ESC exactly as
51
+ * before, and this window only governs whether that release may be spliced back
52
+ * in front of the next chunk so an assembled marker is consumed, not typed.
53
+ *
54
+ * THE FALSE POSITIVE IS THE TRADE-OFF, AND IT IS ACCEPTED. Firing the rescue
55
+ * wrongly needs the user to press Esc and then TYPE the literal characters
56
+ * `[200~` or `[201~` inside this window -- a sequence no keyboard produces, and
57
+ * at worst five characters of lost typing. Paying that buys a fix for visible
58
+ * `[200~` / `[201~` garbage in the draft, which is the failure the whole paste
59
+ * feature exists to prevent.
60
+ */
61
+ export const PASTE_MARKER_RESCAN_TTL_MS = 250;
62
+ /**
63
+ * The inline frame the filter writes into the stream Ink reads (D-3 / I-5).
64
+ *
65
+ * ON THE SAME STREAM, NOT A SIDE CHANNEL. `wrapper.write(text)` is delivered
66
+ * asynchronously; a synchronous side-channel emit would apply the paste BEFORE
67
+ * text that preceded it in the same chunk. Framing preserves order by
68
+ * construction.
69
+ *
70
+ * NUL is the delimiter because no terminal delivers it for any key, and because
71
+ * `sanitisePaste` strips every NUL out of every payload -- so a payload can
72
+ * never forge a frame boundary.
73
+ */
74
+ export const PASTE_OPEN = '\u0000[';
75
+ export const PASTE_CLOSE = '\u0000]';
76
+ /**
77
+ * The inline frame that carries ONE newline intent from the stdin filter to the
78
+ * composer (tui-shift-enter-copy-queue 3.2).
79
+ *
80
+ * SAME FAMILY AS `PASTE_OPEN`, with the same guarantee and for the same reason:
81
+ * NUL is the delimiter because no terminal delivers it for any key, and because
82
+ * `sanitisePaste` strips every NUL out of every payload -- so pasted text can
83
+ * never forge this frame either. A newline intent is single, atomic and carries
84
+ * no payload, so one constant replaces the OPEN/CLOSE pair.
85
+ */
86
+ export const ENTER_NEWLINE_FRAME = '\u0000n';
87
+ /**
88
+ * The inline frame that carries ONE "Ctrl+I was pressed" intent from the stdin
89
+ * filter to `App` (project-indexer Ctrl+I trigger).
90
+ *
91
+ * WHY A FRAME AND NOT `key.ctrl && input === 'i'`. Legacy terminals encode
92
+ * Ctrl+I as the same byte as Tab (0x09), so by the time the stream reaches Ink
93
+ * the two are indistinguishable. Under win32-input-mode (`?9001h`) and kitty
94
+ * CSI-u the modifiers ARE known at translation time, and both translators emit
95
+ * this frame instead of the legacy Tab byte. Same NUL-delimiter guarantee as
96
+ * `ENTER_NEWLINE_FRAME`: no terminal delivers NUL for a key and pasted text is
97
+ * stripped of NUL, so a payload can never forge it. Terminals without keyboard
98
+ * enhancement keep the legacy collapse — Ctrl+I there is Tab, documented in the
99
+ * README keybindings table.
100
+ */
101
+ export const INDEX_KEY_FRAME = '\u0000i';
102
+ /** Human-readable byte size for the refusal toast (`4.1 MB`, `812.0 KB`, `7 B`). */
103
+ export function formatPasteSize(bytes) {
104
+ if (bytes >= 1024 * 1024)
105
+ return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;
106
+ if (bytes >= 1024)
107
+ return `${(bytes / 1024).toFixed(1)} KB`;
108
+ return `${bytes} B`;
109
+ }
@@ -0,0 +1,87 @@
1
+ /**
2
+ * Mouse-report parser (mouse-wheel-region-routing §5.1) — pure, stream-free.
3
+ *
4
+ * The alternate screen has no native scrollback, so every modern terminal turns
5
+ * on DEC private mode 1007 (*alternate scroll*) and translates each wheel notch
6
+ * into a burst of arrow keys. Arrow keys carry NO POINTER POSITION, which is
7
+ * why region routing is impossible from that channel and why the CLI asks for
8
+ * real SGR mouse reporting instead (`\x1b[?1000h\x1b[?1006h`).
9
+ *
10
+ * Asking for it is only half the job. Ink 5.2.1 has no mouse branch at all:
11
+ * `parse-keypress.js` fails to match `\x1b[<64;40;12M`, `use-input.js` strips
12
+ * the leading ESC, and `PromptInput`'s `isControlSeq` guard passes the
13
+ * remainder (`[` is 0x5B, >= 0x20) straight into `insert()`. So an unfiltered
14
+ * mouse report is not ignored — it is TYPED INTO THE USER'S MESSAGE. This
15
+ * module exists so `stdin-mouse-filter.ts` can remove every byte of every
16
+ * report before Ink ever sees the chunk (invariant I-1).
17
+ *
18
+ * Every mouse report is CONSUMED here whatever it turns out to be; what changed
19
+ * with tui-selection-and-scroll-follow is that press / drag / release are now
20
+ * EMITTED as well as consumed, so `SelectionController` can build a selection
21
+ * out of them (§4.4.2). They were previously recognized and thrown away.
22
+ */
23
+ export interface WheelEvent {
24
+ readonly kind: 'wheel';
25
+ readonly dir: 'up' | 'down';
26
+ /** 1-based terminal column, as reported. */
27
+ readonly x: number;
28
+ /** 1-based terminal row, as reported. */
29
+ readonly y: number;
30
+ readonly shift: boolean;
31
+ readonly alt: boolean;
32
+ readonly ctrl: boolean;
33
+ }
34
+ export interface ButtonEvent {
35
+ readonly kind: 'press' | 'drag' | 'release';
36
+ /** 0 = left, 1 = middle, 2 = right. Never 3 — see `decodeReport`. */
37
+ readonly button: 0 | 1 | 2;
38
+ /** 1-based terminal column, as reported. */
39
+ readonly x: number;
40
+ /** 1-based terminal row, as reported. */
41
+ readonly y: number;
42
+ readonly shift: boolean;
43
+ readonly alt: boolean;
44
+ readonly ctrl: boolean;
45
+ }
46
+ export type MouseEvent = WheelEvent | ButtonEvent;
47
+ export interface MouseSplit {
48
+ /** Mouse events, in arrival order. Unrecognized reports are dropped, not returned. */
49
+ readonly events: MouseEvent[];
50
+ /** Everything that was not a mouse report — forward this to Ink verbatim. */
51
+ readonly text: string;
52
+ /** Trailing strict prefix of a possible report; feed it back in with the next chunk. */
53
+ readonly pending: string;
54
+ }
55
+ /**
56
+ * Which wire encoding a report arrived in. It is a PARAMETER rather than a
57
+ * remembered rule because the rule it expresses is invariant I-11 and the cost
58
+ * of forgetting it is a permanently frozen viewport (see `decodeReport`).
59
+ */
60
+ export type MouseEncoding = 'sgr' | 'x10';
61
+ /**
62
+ * Ceiling on the held-back tail. A malformed sequence that looks like a prefix
63
+ * forever must never be able to wedge input: past this length the tail is
64
+ * flushed as ordinary text and parsing resumes from the next byte.
65
+ */
66
+ export declare const MAX_PENDING_MOUSE_CHARS = 32;
67
+ /**
68
+ * True when `s` is a PROPER prefix of a possible mouse report (never a full
69
+ * one). Nothing a keyboard produces matches beyond `\x1b` and `\x1b[`, which is
70
+ * why the filter's flush timer is a rare path rather than a latency tax on
71
+ * typing: ordinary text and pasted blocks contain no `\x1b[<`.
72
+ */
73
+ export declare function isMousePrefix(s: string): boolean;
74
+ /**
75
+ * Split a decoded stdin chunk into mouse events, passthrough text, and a
76
+ * trailing prefix to carry into the next chunk.
77
+ *
78
+ * The caller is expected to feed `pending + nextChunk` back in; ConPTY does
79
+ * split writes mid-sequence, and a report torn across two chunks would
80
+ * otherwise leak its tail into the composer (R-6).
81
+ *
82
+ * ONE CHANNEL, NOT TWO (§4.4.2). Widening this list to carry buttons alongside
83
+ * wheel notches is what keeps ARRIVAL ORDER intact between them; a second
84
+ * channel would let a press overtake the notch that preceded it, and the
85
+ * selection would then be anchored against rows that had already scrolled.
86
+ */
87
+ export declare function splitMouseEvents(buffer: string): MouseSplit;