@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
package/CHANGELOG.md ADDED
@@ -0,0 +1,27 @@
1
+ # Changelog
2
+
3
+ All notable changes to `@aragon-agent/tui` are documented here.
4
+
5
+ ## 0.1.0
6
+
7
+ ### Added
8
+ - **First release: the terminal runtime, split out of `@aragon-agent/cli`.** The Ink components,
9
+ terminal input protocols (keyboard, mouse, bracketed paste, stdin filtering), the scrollback
10
+ renderer and frame differ, every overlay, and the view model they draw from (`Entry`,
11
+ `ViewState`, the reducer, panel row models) now live in their own package, published in
12
+ lock-step with `@aragon-agent/core` and `@aragon-agent/cli`. Nothing a user can see or type
13
+ changed: the moved files are byte-identical apart from their import paths, which is checked by
14
+ a parity script before release.
15
+ - **Subpath exports, no barrel.** Import modules by path, for example
16
+ `@aragon-agent/tui/ui/theme`. The package entry exports only `TUI_API_VERSION` and has no side
17
+ effects, because `ui/ink-runtime` must be evaluated before any other module that imports Ink.
18
+ - **A logging port.** The package never reaches into the CLI's logger. Call
19
+ `setTuiLogger(...)` from `@aragon-agent/tui/model/logging/log-port`; until then logging is a no-op.
20
+ - **`testing/` helpers** (`terminal-harness`, `mini-vt`, `vt-screen`, `render-at-width`,
21
+ `governance-fixtures`) shipped for the CLI's own tests. Test support, not a stable API.
22
+
23
+ ### Notes
24
+ - `react` and `ink` are peer dependencies. Install them at the same range as the CLI so the
25
+ process has exactly one copy of each; two copies of React break hooks.
26
+ - Subpaths are an internal contract between the three AragonAgent packages. Pin an exact version
27
+ if you depend on them directly.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 AragonAgent contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md CHANGED
@@ -1,3 +1,82 @@
1
- # Temporary Holding Version
1
+ # @aragon-agent/tui
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
3
+ The terminal runtime behind the `aragon` command: [Ink](https://github.com/vadimdemedes/ink)
4
+ components, terminal input protocols, the scrollback renderer, and the view model they draw from.
5
+
6
+ ```
7
+ @aragon-agent/core engine: LLM adapters, streaming, tools, skills, sandbox
8
+ ▲
9
+ @aragon-agent/tui this package: terminal rendering, terminal input, view model
10
+ ▲
11
+ @aragon-agent/cli the `aragon` binary, the session container, config, commands, headless `exec`
12
+ ```
13
+
14
+ Most people want [`@aragon-agent/cli`](../cli), which depends on this package. Install this one
15
+ directly only to build your own terminal front end on the same components.
16
+
17
+ ## Using it
18
+
19
+ There is deliberately **no barrel**. Import a module by its path:
20
+
21
+ ```ts
22
+ import { renderTui } from '@aragon-agent/tui/ui/ink-runtime';
23
+ import { viewReducer } from '@aragon-agent/tui/model/agent/reducer';
24
+ ```
25
+
26
+ The package entry (`@aragon-agent/tui`) exports only `TUI_API_VERSION` and has no side effects.
27
+ Ink caches its CI detection the first time it is imported, and `ui/ink-runtime` must be evaluated
28
+ before any other module that imports Ink; a barrel would make that depend on import order.
29
+
30
+ `react` and `ink` are **peer dependencies**. Install them yourself, at the same range this
31
+ package declares, so your process holds exactly one copy of each.
32
+
33
+ ### Layout
34
+
35
+ | Path | Contents |
36
+ | --- | --- |
37
+ | `ui/` | components, layout, scrollback, selection, frame differ, overlays, theme and glyphs |
38
+ | `input/` | stdin filter and the keyboard / mouse / paste protocols |
39
+ | `model/` | the view model and the pure domain helpers it needs (`agent/reducer`, `config/schema`, `todo/`, `team/`, `governance/`, `tools/patch`, `update/semver`, ...) |
40
+ | `testing/` | terminal test harness and virtual-terminal helpers (test support, not a stable API) |
41
+
42
+ `model/` holds more than view state: pure, I/O-free helpers such as the config schema, the patch
43
+ parser and the semver comparison live there because the components need their values and types.
44
+ Splitting them into a separate domain package is a possible later step.
45
+
46
+ ### Logging
47
+
48
+ The package never imports the host's logger. Install one at startup:
49
+
50
+ ```ts
51
+ import { setTuiLogger } from '@aragon-agent/tui/model/logging/log-port';
52
+
53
+ setTuiLogger(myLogger); // { error, warn, info, debug, child }; default is a no-op
54
+ ```
55
+
56
+ ## Stability
57
+
58
+ Subpaths are an **internal contract** between the three AragonAgent packages, released together
59
+ and pinned exactly (`@aragon-agent/cli` depends on one exact `@aragon-agent/tui` version). Do not
60
+ assume a subpath survives a minor release. The `testing/` helpers carry no stability promise.
61
+
62
+ ## Layering rules
63
+
64
+ Enforced by the compiler and `npm run verify:layering`:
65
+
66
+ 1. This package never imports `@aragon-agent/cli`.
67
+ 2. `@aragon-agent/core` never imports this package or the CLI.
68
+ 3. The CLI reaches this package only through `@aragon-agent/tui/<subpath>`.
69
+ 4. Code here logs through the port, never through the CLI's logger.
70
+
71
+ ## Development
72
+
73
+ ```bash
74
+ npm run build -w packages/tui # tsc to dist/
75
+ npm run dev -w packages/tui # tsc --watch (restart the CLI process to pick changes up)
76
+ npm test -w packages/tui
77
+ npm run typecheck -w packages/tui
78
+ ```
79
+
80
+ ## License
81
+
82
+ MIT
@@ -0,0 +1,11 @@
1
+ /**
2
+ * `@aragon-agent/tui` - the terminal runtime of AragonAgent.
3
+ *
4
+ * This entry deliberately exports ONE constant and has no side effects. It is NOT a barrel,
5
+ * and must not become one: Ink caches its CI detection the first time `ink` is imported,
6
+ * and `ui/ink-runtime` has to be evaluated before any other module that imports Ink. A
7
+ * barrel that re-exported the components would make that order depend on import sort order.
8
+ * Consumers import the module they need by its subpath instead, for example
9
+ * `@aragon-agent/tui/ui/ink-runtime` or `@aragon-agent/tui/ui/theme`.
10
+ */
11
+ export declare const TUI_API_VERSION: 1;
package/dist/index.js ADDED
@@ -0,0 +1,11 @@
1
+ /**
2
+ * `@aragon-agent/tui` - the terminal runtime of AragonAgent.
3
+ *
4
+ * This entry deliberately exports ONE constant and has no side effects. It is NOT a barrel,
5
+ * and must not become one: Ink caches its CI detection the first time `ink` is imported,
6
+ * and `ui/ink-runtime` has to be evaluated before any other module that imports Ink. A
7
+ * barrel that re-exported the components would make that order depend on import sort order.
8
+ * Consumers import the module they need by its subpath instead, for example
9
+ * `@aragon-agent/tui/ui/ink-runtime` or `@aragon-agent/tui/ui/theme`.
10
+ */
11
+ export const TUI_API_VERSION = 1;
@@ -0,0 +1,71 @@
1
+ /**
2
+ * Control-SEQUENCE removal for text that crosses a boundary where a terminal
3
+ * escape must never become content (paste-control-sequence-residue, fix A'-1).
4
+ *
5
+ * WHY A DELETE-THE-WHOLE-SEQUENCE RULE EXISTS. Deleting only the introducer
6
+ * byte turns an escape into visible text: `ESC [ 3 8 ; 2 m` loses its ESC and
7
+ * leaves `[38;2m`, which is a run of digits and semicolons somebody then reads
8
+ * on screen and sends to the model. The bytes were never content; the sequence
9
+ * has to go as a unit.
10
+ *
11
+ * WHY IT IS NOT `tools/terminal-output.ts`'s REGEXES MOVED HERE. Those four
12
+ * regexes answer "what does this look like" for a terminal row that is still
13
+ * being written, and they are fed text whose unfinished tail has ALREADY been
14
+ * cut off and parked in a carry by the caller (`sanitizeChunk`,
15
+ * `toDisplayRow`). Pasted text is one-shot: there is no next chunk, so a
16
+ * truncated sequence needs a rule of its own. Measured against the stream
17
+ * version of the same input, `ESC [ 3 8 ; 2 ; 1 8 ; 5 2 ; 8 6` followed by
18
+ * prose loses the first letter of the prose (`n`), and an unterminated OSC
19
+ * leaves its whole body behind.
20
+ *
21
+ * THE FOUR DECISIONS THIS MODULE ENCODES:
22
+ *
23
+ * 1. A sequence introduced by a real introducer byte (`0x1B`, `0x9B`, `0x9D`,
24
+ * ...) is removed as a unit; bare text that merely LOOKS like the inside of
25
+ * one (`[38;2;18;52;86m` typed or pasted without an ESC) is left exactly as
26
+ * it is, character for character.
27
+ * 2. A string-type sequence (OSC / DCS / SOS / PM / APC) runs to BEL or ST, and
28
+ * an unterminated one is removed UP TO THE END OF ITS LINE. It never crosses
29
+ * `\n` and never guesses at a terminator: a truncated sequence is the most
30
+ * common shape in a clipboard, and the only safe reading of it is "the rest
31
+ * of this line was never text".
32
+ * 3. A truncated CSI loses its introducer and its parameter bytes and NOTHING
33
+ * ELSE. `ESC [ 3 1 m` split mid-parameter is parameters, not prose, but the
34
+ * byte after them is the user's own character and must survive.
35
+ * 4. A C1 CSI (`0x9B`) with no parameter byte at all is treated as the stray
36
+ * control byte it is most likely to be rather than as a sequence, because a
37
+ * lone `0x9B` followed by one letter is otherwise indistinguishable from a
38
+ * non-UTF-8 file's stray byte followed by content -- and consuming that
39
+ * letter would be the very data loss this module exists to prevent.
40
+ *
41
+ * Pure, ASCII-only, React-free, Ink-free, and TOTAL: it never throws and it
42
+ * never reorders or mangles the bytes it keeps. No new dependency.
43
+ */
44
+ /**
45
+ * Remove every escape/control sequence, keeping all other bytes in order.
46
+ *
47
+ * KEEPS `\t`, `\n` AND `\r`: they are line structure, and `\t` inside pasted
48
+ * indentation is content the model is supposed to receive. Stray C0/C1 bytes
49
+ * (and DEL) are NOT this function's job -- they are removed by the caller that
50
+ * wants them gone, so one rule has one owner.
51
+ */
52
+ export declare function stripControlSequences(text: string): string;
53
+ /**
54
+ * True when `text` carries a sequence a KEYBOARD cannot physically produce.
55
+ *
56
+ * Used at the keystroke branch of the stdin filter: a single-line paste that
57
+ * carries ESC fails `classifyChunk`'s two rules (no line break, and
58
+ * `HAS_CONTROL_EXCEPT_TAB`) and would otherwise reach Ink as raw bytes --
59
+ * either typing `[38;2;18;52;86m` with a live ESC into the draft, or throwing
60
+ * an uncaught `TypeError` inside Ink's key parser.
61
+ *
62
+ * THREE THINGS MUST NOT MATCH, and the shapes below are why:
63
+ * - SGR mouse reports (`ESC [ < 0 ; 1 ; 2 m`) are stripped by `splitMouseEvents`
64
+ * BEFORE this test, and `<` is not a parameter byte, so the SGR rule cannot
65
+ * see them anyway.
66
+ * - Arrow / function / Home / End keys (`ESC [ A`, `ESC [ 1 ; 5 D`, `ESC [ 3 ~`,
67
+ * `ESC [ Z`) never end in `m`.
68
+ * - `Alt`+letter (`ESC` followed by one character) has no introducer body, so
69
+ * the string-type rule does not fire.
70
+ */
71
+ export declare function hasPasteOnlySequence(text: string): boolean;
@@ -0,0 +1,222 @@
1
+ /**
2
+ * Control-SEQUENCE removal for text that crosses a boundary where a terminal
3
+ * escape must never become content (paste-control-sequence-residue, fix A'-1).
4
+ *
5
+ * WHY A DELETE-THE-WHOLE-SEQUENCE RULE EXISTS. Deleting only the introducer
6
+ * byte turns an escape into visible text: `ESC [ 3 8 ; 2 m` loses its ESC and
7
+ * leaves `[38;2m`, which is a run of digits and semicolons somebody then reads
8
+ * on screen and sends to the model. The bytes were never content; the sequence
9
+ * has to go as a unit.
10
+ *
11
+ * WHY IT IS NOT `tools/terminal-output.ts`'s REGEXES MOVED HERE. Those four
12
+ * regexes answer "what does this look like" for a terminal row that is still
13
+ * being written, and they are fed text whose unfinished tail has ALREADY been
14
+ * cut off and parked in a carry by the caller (`sanitizeChunk`,
15
+ * `toDisplayRow`). Pasted text is one-shot: there is no next chunk, so a
16
+ * truncated sequence needs a rule of its own. Measured against the stream
17
+ * version of the same input, `ESC [ 3 8 ; 2 ; 1 8 ; 5 2 ; 8 6` followed by
18
+ * prose loses the first letter of the prose (`n`), and an unterminated OSC
19
+ * leaves its whole body behind.
20
+ *
21
+ * THE FOUR DECISIONS THIS MODULE ENCODES:
22
+ *
23
+ * 1. A sequence introduced by a real introducer byte (`0x1B`, `0x9B`, `0x9D`,
24
+ * ...) is removed as a unit; bare text that merely LOOKS like the inside of
25
+ * one (`[38;2;18;52;86m` typed or pasted without an ESC) is left exactly as
26
+ * it is, character for character.
27
+ * 2. A string-type sequence (OSC / DCS / SOS / PM / APC) runs to BEL or ST, and
28
+ * an unterminated one is removed UP TO THE END OF ITS LINE. It never crosses
29
+ * `\n` and never guesses at a terminator: a truncated sequence is the most
30
+ * common shape in a clipboard, and the only safe reading of it is "the rest
31
+ * of this line was never text".
32
+ * 3. A truncated CSI loses its introducer and its parameter bytes and NOTHING
33
+ * ELSE. `ESC [ 3 1 m` split mid-parameter is parameters, not prose, but the
34
+ * byte after them is the user's own character and must survive.
35
+ * 4. A C1 CSI (`0x9B`) with no parameter byte at all is treated as the stray
36
+ * control byte it is most likely to be rather than as a sequence, because a
37
+ * lone `0x9B` followed by one letter is otherwise indistinguishable from a
38
+ * non-UTF-8 file's stray byte followed by content -- and consuming that
39
+ * letter would be the very data loss this module exists to prevent.
40
+ *
41
+ * Pure, ASCII-only, React-free, Ink-free, and TOTAL: it never throws and it
42
+ * never reorders or mangles the bytes it keeps. No new dependency.
43
+ */
44
+ /** ESC -- the introducer every terminal shares. */
45
+ const ESC = 0x1b;
46
+ /** LF. No rule in this module may consume it (decision 2). */
47
+ const LF = 0x0a;
48
+ /** BEL terminates an OSC. */
49
+ const BEL = 0x07;
50
+ /** `[` after ESC is CSI, and `\` after ESC is the two-byte ST. */
51
+ const BRACKET = 0x5b;
52
+ const BACKSLASH = 0x5c;
53
+ /** The ASCII second byte of each string-type sequence (`ESC ]`, `ESC P`, ...). */
54
+ const ESC_DCS = 0x50;
55
+ const ESC_SOS = 0x58;
56
+ const ESC_OSC = 0x5d;
57
+ const ESC_PM = 0x5e;
58
+ const ESC_APC = 0x5f;
59
+ /** C1 introducers, as written by a source that is not UTF-8 clean. */
60
+ const C1_CSI = 0x9b;
61
+ const C1_ST = 0x9c;
62
+ const C1_OSC = 0x9d;
63
+ const C1_DCS = 0x90;
64
+ const C1_SOS = 0x98;
65
+ const C1_PM = 0x9e;
66
+ const C1_APC = 0x9f;
67
+ /** Every byte that can START a sequence this module removes. */
68
+ const ANY_INTRODUCER = /[\u001b\u0090\u0098\u009b\u009d\u009e\u009f]/;
69
+ /**
70
+ * `CSI ... m` (SGR), in both encodings: `ESC [ digits ; m` and the single-byte
71
+ * C1 form `0x9B digits ; m`. NO KEY PRESS PRODUCES ONE, which is what makes it
72
+ * usable as the discriminator for an unframed paste in `stdin-filter.ts`.
73
+ */
74
+ const SGR_SEQUENCE = /\u001b\[[0-9;]*m|\u009b[0-9;]*m/;
75
+ /**
76
+ * A string-type introducer followed by at least one body byte. An `Alt`+key
77
+ * press is exactly two bytes, so "introducer plus a body" is already outside
78
+ * what a keyboard can emit.
79
+ */
80
+ const STRING_SEQUENCE = /(?:\u001b[\u0050\u0058\u005d\u005e\u005f]|[\u0090\u0098\u009d\u009e\u009f])[\s\S]/;
81
+ /** CSI final byte: `@` through `~`. */
82
+ function isFinalByte(code) {
83
+ return code >= 0x40 && code <= 0x7e;
84
+ }
85
+ /** CSI parameter byte: `0` through `?`. */
86
+ function isParamByte(code) {
87
+ return code >= 0x30 && code <= 0x3f;
88
+ }
89
+ /**
90
+ * CSI intermediate byte: `!` through `/`.
91
+ *
92
+ * SPACE (`0x20`) IS DELIBERATELY EXCLUDED (decision 3). The standard allows it,
93
+ * but a pasted sequence cut mid-parameter is followed by ` ` and then prose,
94
+ * and the first letter of that prose is a legal final byte -- so honouring the
95
+ * space would silently eat it. `CSI Ps SP q` (cursor style) is the only shape
96
+ * that gets worse, and no child process writes that to its stdout.
97
+ */
98
+ function isIntermediateByte(code) {
99
+ return code >= 0x21 && code <= 0x2f;
100
+ }
101
+ /** True for the C1 introducers that open a string, not a CSI. */
102
+ function isC1StringIntroducer(code) {
103
+ return code === C1_OSC || code === C1_DCS || code === C1_SOS || code === C1_PM || code === C1_APC;
104
+ }
105
+ /**
106
+ * End of the string-type sequence whose body starts at `from`.
107
+ *
108
+ * Stops AT the line break rather than past it, and reports "consumed to here"
109
+ * for a body that never terminates (decision 2).
110
+ */
111
+ function stringEnd(text, from) {
112
+ let i = from;
113
+ while (i < text.length) {
114
+ const code = text.charCodeAt(i);
115
+ if (code === BEL || code === C1_ST)
116
+ return i + 1;
117
+ if (code === LF)
118
+ return i;
119
+ if (code === ESC && text.charCodeAt(i + 1) === BACKSLASH)
120
+ return i + 2;
121
+ i += 1;
122
+ }
123
+ return i;
124
+ }
125
+ /**
126
+ * End of the CSI whose parameter run starts at `from`.
127
+ *
128
+ * `requireParams` implements decision 4: with no parameter byte at all, a C1
129
+ * CSI is only the introducer byte, and its "final byte" is content.
130
+ */
131
+ function csiEnd(text, from, requireParams) {
132
+ let i = from;
133
+ let sawParams = false;
134
+ while (i < text.length && isParamByte(text.charCodeAt(i))) {
135
+ sawParams = true;
136
+ i += 1;
137
+ }
138
+ if (requireParams && !sawParams)
139
+ return from;
140
+ while (i < text.length && isIntermediateByte(text.charCodeAt(i)))
141
+ i += 1;
142
+ if (i < text.length && isFinalByte(text.charCodeAt(i)))
143
+ return i + 1;
144
+ return i;
145
+ }
146
+ /** End of the sequence starting with ESC at `index` (decision 1 / 3). */
147
+ function escapeEnd(text, index) {
148
+ if (index + 1 >= text.length)
149
+ return index + 1;
150
+ const next = text.charCodeAt(index + 1);
151
+ if (next === BRACKET)
152
+ return csiEnd(text, index + 2, false);
153
+ if (next === ESC_OSC || next === ESC_DCS || next === ESC_SOS || next === ESC_PM
154
+ || next === ESC_APC) {
155
+ return stringEnd(text, index + 2);
156
+ }
157
+ if (next === LF)
158
+ return index + 1;
159
+ return index + 2;
160
+ }
161
+ /**
162
+ * End of the sequence starting at `index`, or `-1` when no sequence starts
163
+ * there.
164
+ */
165
+ function sequenceEnd(text, index) {
166
+ const code = text.charCodeAt(index);
167
+ if (code === ESC)
168
+ return escapeEnd(text, index);
169
+ if (code === C1_CSI)
170
+ return csiEnd(text, index + 1, true);
171
+ if (isC1StringIntroducer(code)) {
172
+ return index + 1 >= text.length ? index + 1 : stringEnd(text, index + 1);
173
+ }
174
+ return -1;
175
+ }
176
+ /**
177
+ * Remove every escape/control sequence, keeping all other bytes in order.
178
+ *
179
+ * KEEPS `\t`, `\n` AND `\r`: they are line structure, and `\t` inside pasted
180
+ * indentation is content the model is supposed to receive. Stray C0/C1 bytes
181
+ * (and DEL) are NOT this function's job -- they are removed by the caller that
182
+ * wants them gone, so one rule has one owner.
183
+ */
184
+ export function stripControlSequences(text) {
185
+ if (!ANY_INTRODUCER.test(text))
186
+ return text;
187
+ let out = '';
188
+ let kept = 0;
189
+ let i = 0;
190
+ while (i < text.length) {
191
+ const end = sequenceEnd(text, i);
192
+ if (end === -1) {
193
+ i += 1;
194
+ continue;
195
+ }
196
+ out += text.slice(kept, i);
197
+ i = end;
198
+ kept = end;
199
+ }
200
+ return kept === 0 ? text : out + text.slice(kept);
201
+ }
202
+ /**
203
+ * True when `text` carries a sequence a KEYBOARD cannot physically produce.
204
+ *
205
+ * Used at the keystroke branch of the stdin filter: a single-line paste that
206
+ * carries ESC fails `classifyChunk`'s two rules (no line break, and
207
+ * `HAS_CONTROL_EXCEPT_TAB`) and would otherwise reach Ink as raw bytes --
208
+ * either typing `[38;2;18;52;86m` with a live ESC into the draft, or throwing
209
+ * an uncaught `TypeError` inside Ink's key parser.
210
+ *
211
+ * THREE THINGS MUST NOT MATCH, and the shapes below are why:
212
+ * - SGR mouse reports (`ESC [ < 0 ; 1 ; 2 m`) are stripped by `splitMouseEvents`
213
+ * BEFORE this test, and `<` is not a parameter byte, so the SGR rule cannot
214
+ * see them anyway.
215
+ * - Arrow / function / Home / End keys (`ESC [ A`, `ESC [ 1 ; 5 D`, `ESC [ 3 ~`,
216
+ * `ESC [ Z`) never end in `m`.
217
+ * - `Alt`+letter (`ESC` followed by one character) has no introducer body, so
218
+ * the string-type rule does not fire.
219
+ */
220
+ export function hasPasteOnlySequence(text) {
221
+ return SGR_SEQUENCE.test(text) || STRING_SEQUENCE.test(text);
222
+ }
@@ -0,0 +1,66 @@
1
+ /**
2
+ * CSI-u key translation (posix keyboard-enhancement section of the Shift+Enter
3
+ * newline fix).
4
+ *
5
+ * WHY THIS EXISTS. On macOS/Linux the only lever that makes Shift+Enter
6
+ * distinguishable from Enter is asking the terminal to report modified keys in
7
+ * the CSI-u encoding: kitty's disambiguate mode (`CSI > 1 u`, pushed and popped
8
+ * with `CSI < u`) and xterm's `modifyOtherKeys=2` (`CSI > 4 ; 2 m`, reset with
9
+ * `CSI > 4 m`). iTerm2, kitty, ghostty, WezTerm, foot and Alacritty implement
10
+ * at least one of the two; a terminal implementing neither ignores both bytes,
11
+ * which the conhost probe confirmed is a harmless no-op.
12
+ *
13
+ * WHAT CHANGES IN THE STREAM -- AND WHAT NEVER DOES. Both modes re-encode only
14
+ * keys whose legacy encoding is ambiguous: Ctrl/Ctrl+Shift/Ctrl+Alt+letters and
15
+ * digits, the Enter family, the Escape key (kitty), and Backspace with
16
+ * modifiers. `modifyOtherKeys` is named for the OTHER keys: arrows, Home/End,
17
+ * PgUp/PgDn and F-keys keep their standard `\x1b[1;mA` / `\x1b[m~` encodings,
18
+ * and Shift+printable still types text. So the translator below only ever sees
19
+ * codepoints below 128 plus a few named control codes; anything else (a kitty
20
+ * functional-key code from a mode this app never pushes) passes through
21
+ * untouched, which is exactly the pre-enhancement behaviour.
22
+ *
23
+ * THE CONTRACT mirrors `win32-input-mode.ts`: split, translate back to the
24
+ * legacy bytes, with the modified-Enter family becoming `ENTER_NEWLINE_FRAME`.
25
+ * Pure: no node/React imports.
26
+ */
27
+ /** Enable / disable the two CSI-u report modes (posix side). */
28
+ export declare const CSI_U_ENABLE = "\u001B[>1u\u001B[>4;2m";
29
+ export declare const CSI_U_DISABLE = "\u001B[<u\u001B[>4m";
30
+ export interface CsiUKey {
31
+ /** The full original sequence, for pass-through. */
32
+ readonly seq: string;
33
+ /** First parameter's primary number (the key's codepoint). */
34
+ readonly code: number;
35
+ /** Optional `:alternate` sub-parameters of the key field (kitty/mok). */
36
+ readonly alternates: readonly number[];
37
+ /** Modifier parameter minus one (bit 1 shift, 2 alt, 4 ctrl), or 0. */
38
+ readonly mods: number;
39
+ }
40
+ export type CsiUSegment = {
41
+ kind: 'text';
42
+ text: string;
43
+ } | {
44
+ kind: 'key';
45
+ key: CsiUKey;
46
+ };
47
+ /**
48
+ * Split a chunk into text spans and CSI-u sequences.
49
+ *
50
+ * Grammar accepted: `ESC [ <params> u` where params are digits, `;` and `:`
51
+ * only, and at least one field exists. `\x1b[13;2u` is INCLUDED: with
52
+ * enhancement on, this module owns every `u`-terminated sequence and applies
53
+ * the same Enter semantics `enter-sequences.ts` defines.
54
+ */
55
+ export declare function splitCsiUKeys(text: string): CsiUSegment[];
56
+ /**
57
+ * Translate one CSI-u sequence to the legacy bytes the same keypress would
58
+ * have produced without the report modes (Enter family excepted: a modified
59
+ * Enter becomes the newline frame). Unknown keys pass through unchanged.
60
+ */
61
+ export declare function translateCsiUKey(key: CsiUKey): string;
62
+ /**
63
+ * Length of the trailing run of `text` that could still complete into a
64
+ * CSI-u sequence, or 0. Longest match, mirroring the other families.
65
+ */
66
+ export declare function trailingCsiUPrefixLength(text: string): number;