@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,212 @@
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
+ /**
24
+ * Ceiling on the held-back tail. A malformed sequence that looks like a prefix
25
+ * forever must never be able to wedge input: past this length the tail is
26
+ * flushed as ordinary text and parsing resumes from the next byte.
27
+ */
28
+ export const MAX_PENDING_MOUSE_CHARS = 32;
29
+ const ESC = '\x1b';
30
+ /** `\x1b[<b;x;yM` (press) or `…m` (release) — the only form we request. */
31
+ const SGR_REPORT = /^\x1b\[<(\d+);(\d+);(\d+)([Mm])/;
32
+ /** A strict prefix of an SGR report: `\x1b[<` plus digits and semicolons. */
33
+ const SGR_PREFIX = /^\x1b\[<[\d;]*$/;
34
+ /**
35
+ * True when `s` is a PROPER prefix of a possible mouse report (never a full
36
+ * one). Nothing a keyboard produces matches beyond `\x1b` and `\x1b[`, which is
37
+ * why the filter's flush timer is a rare path rather than a latency tax on
38
+ * typing: ordinary text and pasted blocks contain no `\x1b[<`.
39
+ */
40
+ export function isMousePrefix(s) {
41
+ return /^\x1B(\[(<[\d;]*|M[\s\S]{0,2})?)?$/.test(s);
42
+ }
43
+ function modifiers(b) {
44
+ return { shift: (b & 4) !== 0, alt: (b & 8) !== 0, ctrl: (b & 16) !== 0 };
45
+ }
46
+ /**
47
+ * Decode one report, or `null` when it is a report we consume without acting on.
48
+ *
49
+ * THE ORDER OF THESE TESTS IS THE SPECIFICATION, not a presentation choice.
50
+ * Button 66 (wheel-left) has `b & 1 === 0` and would decode as `'up'`, so the
51
+ * horizontal test has to precede the direction decode; and `b & 32` (motion) has
52
+ * to precede the `final` test, because a drag is reported with `M` exactly as a
53
+ * press is.
54
+ *
55
+ * ═══════════════════════════════════════════════════════════════════════════
56
+ * I-11 — BUTTON EVENTS COME FROM THE SGR PATH ONLY. X10 stays wheel-only, which
57
+ * is exactly the contract it has today.
58
+ *
59
+ * `matchX10` reconstructs a legacy report and hard-codes `final = 'M'`, because
60
+ * X10 HAS NO SEPARATE RELEASE FORM AT ALL — it encodes a release as button 3 of
61
+ * a press. Fed through the table below, an X10 release would become a `press`
62
+ * that is never followed by a `release`, whose `button` is 3 while the type says
63
+ * `0 | 1 | 2`, and whose consequence is a `hold` that is set and never cleared:
64
+ * content anchoring never lets go, the resume timer's third condition never
65
+ * passes, and the transcript is frozen for the rest of the session with nothing
66
+ * raised anywhere.
67
+ *
68
+ * This costs nothing real (D-16): we never REQUEST X10 — `?1006h` is over a
69
+ * decade old and every terminal that implements `?1000` implements it — and a
70
+ * terminal that ignored the SGR request also has no usable drag coordinates past
71
+ * column 223 (R-2). X10 exists in this parser only so a stray report cannot
72
+ * reach the user's draft.
73
+ * ═══════════════════════════════════════════════════════════════════════════
74
+ */
75
+ function decodeReport(b, x, y, final, encoding) {
76
+ // 1. Wheel. Buttons 64-67 in both encodings.
77
+ if ((b & 64) !== 0) {
78
+ // Horizontal wheel (66 = left, 67 = right). Consumed and dropped (non-goal).
79
+ if ((b & 3) >= 2)
80
+ return null;
81
+ // Wheel buttons are press-only; a terminal that ever sent a release for one
82
+ // must not produce a second step for the same physical notch.
83
+ if (final !== 'M')
84
+ return null;
85
+ return { kind: 'wheel', dir: (b & 1) === 1 ? 'down' : 'up', x, y, ...modifiers(b) };
86
+ }
87
+ if (encoding !== 'sgr')
88
+ return null; // I-11
89
+ // 2. Motion while a button is held (`?1002h`). `3` is "no button", which
90
+ // `?1002` should never send and `?1003` sends constantly — dropping it is
91
+ // what keeps an any-event terminal from painting a selection with no button
92
+ // down at all.
93
+ if ((b & 32) !== 0) {
94
+ const button = b & 3;
95
+ if (button === 3)
96
+ return null;
97
+ return { kind: 'drag', button: button, x, y, ...modifiers(b) };
98
+ }
99
+ // 3. Release. In SGR the final byte carries the transition, so this is
100
+ // unambiguous — unlike X10, which is why step 1's guard exists.
101
+ //
102
+ // A release whose button field reads `3` is a terminal saying "some button
103
+ // came up" without naming it. It is mapped to button 0 rather than dropped:
104
+ // the ONE thing a release must always do is let go of `hold`, and dropping
105
+ // it would leave the viewport frozen — the exact failure I-11 is about. A
106
+ // spurious button-0 release is harmless, because a selection can only exist
107
+ // if button 0 was pressed in the first place.
108
+ if (final === 'm') {
109
+ const button = b & 3;
110
+ return { kind: 'release', button: (button === 3 ? 0 : button), x, y, ...modifiers(b) };
111
+ }
112
+ // 4. Press.
113
+ const button = b & 3;
114
+ if (button === 3)
115
+ return null;
116
+ return { kind: 'press', button: button, x, y, ...modifiers(b) };
117
+ }
118
+ /**
119
+ * X10 legacy reports (`\x1b[M` + three chars, each `code - 32`).
120
+ *
121
+ * We never request this encoding — `?1006h` is over a decade old and every
122
+ * terminal that implements `?1000` implements it — but a terminal that ignored
123
+ * the SGR request would fall back to it, and a leaked `\x1b[M` + garbage is
124
+ * exactly the draft corruption I-1 exists to prevent. So it is consumed
125
+ * unconditionally; the coordinates are only trusted when all three bytes are
126
+ * plausible, because `setEncoding('utf8')` mangles raw bytes above 0x7F.
127
+ */
128
+ function matchX10(s) {
129
+ if (s.length < 6)
130
+ return { kind: 'partial' };
131
+ const codes = [s.charCodeAt(3), s.charCodeAt(4), s.charCodeAt(5)];
132
+ if (codes.some((c) => c < 32 || c > 255))
133
+ return { kind: 'complete', length: 6, event: null };
134
+ const [b, x, y] = codes;
135
+ return {
136
+ kind: 'complete',
137
+ length: 6,
138
+ // `'x10'` is what makes I-11 a property of the code rather than of somebody's
139
+ // memory: this encoding yields wheel events or nothing, ever.
140
+ event: decodeReport(b - 32, x - 32, y - 32, 'M', 'x10'),
141
+ };
142
+ }
143
+ /** Classify the escape sequence starting at `s[0] === ESC`. */
144
+ function matchReport(s) {
145
+ if (s.length === 1)
146
+ return { kind: 'partial' }; // lone ESC so far
147
+ if (s[1] !== '[')
148
+ return { kind: 'none' };
149
+ if (s.length === 2)
150
+ return { kind: 'partial' }; // `\x1b[`
151
+ if (s[2] === '<') {
152
+ const m = SGR_REPORT.exec(s);
153
+ if (m) {
154
+ const b = Number(m[1]);
155
+ const x = Number(m[2]);
156
+ const y = Number(m[3]);
157
+ return { kind: 'complete', length: m[0].length, event: decodeReport(b, x, y, m[4], 'sgr') };
158
+ }
159
+ return SGR_PREFIX.test(s) ? { kind: 'partial' } : { kind: 'none' };
160
+ }
161
+ if (s[2] === 'M')
162
+ return matchX10(s);
163
+ return { kind: 'none' };
164
+ }
165
+ /**
166
+ * Split a decoded stdin chunk into mouse events, passthrough text, and a
167
+ * trailing prefix to carry into the next chunk.
168
+ *
169
+ * The caller is expected to feed `pending + nextChunk` back in; ConPTY does
170
+ * split writes mid-sequence, and a report torn across two chunks would
171
+ * otherwise leak its tail into the composer (R-6).
172
+ *
173
+ * ONE CHANNEL, NOT TWO (§4.4.2). Widening this list to carry buttons alongside
174
+ * wheel notches is what keeps ARRIVAL ORDER intact between them; a second
175
+ * channel would let a press overtake the notch that preceded it, and the
176
+ * selection would then be anchored against rows that had already scrolled.
177
+ */
178
+ export function splitMouseEvents(buffer) {
179
+ const events = [];
180
+ let text = '';
181
+ let i = 0;
182
+ while (i < buffer.length) {
183
+ const esc = buffer.indexOf(ESC, i);
184
+ if (esc === -1) {
185
+ text += buffer.slice(i);
186
+ return { events, text, pending: '' };
187
+ }
188
+ text += buffer.slice(i, esc);
189
+ const rest = buffer.slice(esc);
190
+ const m = matchReport(rest);
191
+ if (m.kind === 'complete') {
192
+ if (m.event)
193
+ events.push(m.event);
194
+ i = esc + m.length;
195
+ continue;
196
+ }
197
+ if (m.kind === 'partial') {
198
+ // A tail that never resolves must not hold input hostage: past the
199
+ // ceiling it is ordinary text, and parsing continues after the ESC.
200
+ if (rest.length > MAX_PENDING_MOUSE_CHARS) {
201
+ text += rest;
202
+ return { events, text, pending: '' };
203
+ }
204
+ return { events, text, pending: rest };
205
+ }
206
+ // Not a mouse report — an arrow key, a paste, anything. Emit the ESC and
207
+ // resume scanning after it so the rest of the sequence reaches Ink intact.
208
+ text += ESC;
209
+ i = esc + 1;
210
+ }
211
+ return { events, text, pending: '' };
212
+ }
@@ -0,0 +1,83 @@
1
+ /**
2
+ * Paste recognition primitives (tui-paste-handling section 5.1) -- pure,
3
+ * stream-free, no timers.
4
+ *
5
+ * WHY THIS LIVES BELOW INK. `ink/build/components/App.js:131-138` reads stdin on
6
+ * `'readable'` and emits each chunk as one `'input'` event;
7
+ * `parse-keypress.js:145-148` maps the exact string `'\r'` to `name: 'return'`,
8
+ * which `PromptInput` reads as "send the message". A 15-line paste on a Windows
9
+ * console routinely arrives as a dozen chunks that are exactly `"\r"`, and each
10
+ * one SUBMITS THE DRAFT AS IT STOOD. No component-level heuristic can undo a
11
+ * `key.return` that has already fired, so recognition has to happen on the byte
12
+ * stream, in front of Ink -- the same lesson `mouse-events.ts` records.
13
+ *
14
+ * Two tiers feed one framing (D-4). Tier 1 is bracketed paste and is exact;
15
+ * Tier 2 is a heuristic on chunk SHAPE for the terminals that ignore
16
+ * `DECSET 2004`. Both are about what a keyboard can physically emit.
17
+ */
18
+ /** `DECSET 2004` wraps a paste in these two markers. */
19
+ export declare const PASTE_BEGIN_MARK = "\u001B[200~";
20
+ export declare const PASTE_END_MARK = "\u001B[201~";
21
+ /** The longest tail worth holding back while a marker might still complete. */
22
+ export declare const PASTE_MARK_LENGTH: number;
23
+ /**
24
+ * True when `s` is a PROPER prefix of either paste marker (never a whole one).
25
+ *
26
+ * Both markers are held, in every mode, whether or not THIS process enabled DEC
27
+ * 2004 (I-16): the user's shell, `tmux` or a wrapper script may have left it on,
28
+ * and an unconsumed marker is a literal `[200~` typed into the draft -- the
29
+ * exact failure the feature exists to prevent.
30
+ */
31
+ export declare function isPastePrefix(s: string): boolean;
32
+ /**
33
+ * Length of the trailing run of `text` that is a proper prefix of a paste
34
+ * marker, or 0. Shortest match wins, so only the bytes that could still become a
35
+ * marker are held back.
36
+ */
37
+ export declare function trailingPastePrefixLength(text: string): number;
38
+ /**
39
+ * Tier 2: is this chunk a paste, or keystrokes?
40
+ *
41
+ * The PRIMARY rule -- "longer than one character AND contains a line break" --
42
+ * is exactly the shape defect A needs, so the two coincide: any chunk that could
43
+ * submit the draft by accident is classified as a paste. A lone `\r` is the
44
+ * Enter key and stays `'keys'`.
45
+ *
46
+ * The SECONDARY rule needs `PASTE_MIN_BURST_CHARS` printable characters in one
47
+ * chunk. It excludes chunks carrying any C0 byte but TAB, which is what keeps an
48
+ * arrow-key burst (`\x1b[B\x1b[B...`, and every wheel notch translated by
49
+ * alternate scroll) out of the paste path.
50
+ */
51
+ export declare function classifyChunk(text: string, minBurstChars?: number): 'paste' | 'keys';
52
+ /**
53
+ * Make a payload safe to put in a buffer and draw through `<Text>` (G2).
54
+ *
55
+ * 1. CRLF and lone CR both become exactly ONE `\n` -- terminals send CR for a
56
+ * newline in pasted text, and a lone LF is dropped by Ink's key parser
57
+ * entirely, so both have to be normalised here or a pasted line break either
58
+ * submits the message or silently vanishes.
59
+ * 2. Every escape SEQUENCE is removed AS A SEQUENCE (`stripControlSequences`).
60
+ * Deleting only the introducer byte is what produced the reported defect:
61
+ * `ESC [ 3 8 ; 2 ; 1 8 ; 5 2 ; 8 6 m` minus its ESC is `[38;2;18;52;86m`,
62
+ * a run of digits Ink then writes to the terminal as ordinary text -- and it
63
+ * reached the model, the prompt history and the session file too, because
64
+ * this function is the only cleaning the payload ever gets.
65
+ * 3. Every remaining C0 byte except `\n` and `\t` is removed. Ink writes
66
+ * `<Text>` children to the terminal without escaping anything, so a
67
+ * surviving `\r` overwrites the row it is drawn on and a surviving `ESC`
68
+ * repaints the frame colours. Sequences are gone by this point, so what is
69
+ * left for this step is a stray byte, never half of one.
70
+ * 4. DEL and every C1 byte (U+0080..U+009F) go too, and that is NOT padding:
71
+ * U+009B is the single-byte CSI and U+0085 is NEL, and a terminal that
72
+ * decodes them acts on them exactly as it acts on `ESC [`. A file pasted out
73
+ * of a non-UTF-8 editor walks straight through a "strip C0" rule.
74
+ * 5. TAB is KEPT. Indentation is content, and it is what the model receives.
75
+ * Expanding it is the RENDERERS' job (`ui/display-tab.ts`), so the model
76
+ * keeps the original indentation while the screen, the composer and the
77
+ * terminal all agree on what column a TAB lands on.
78
+ *
79
+ * Applied to PAYLOAD ONLY, never to keystrokes, so `Ctrl+A` and Escape keep
80
+ * working. Non-ASCII text (CJK, emoji) is untouched. Idempotent, so the
81
+ * second pass in `ui/paste-frames.ts` stays a byte-identical no-op.
82
+ */
83
+ export declare function sanitisePaste(raw: string): string;
@@ -0,0 +1,107 @@
1
+ /**
2
+ * Paste recognition primitives (tui-paste-handling section 5.1) -- pure,
3
+ * stream-free, no timers.
4
+ *
5
+ * WHY THIS LIVES BELOW INK. `ink/build/components/App.js:131-138` reads stdin on
6
+ * `'readable'` and emits each chunk as one `'input'` event;
7
+ * `parse-keypress.js:145-148` maps the exact string `'\r'` to `name: 'return'`,
8
+ * which `PromptInput` reads as "send the message". A 15-line paste on a Windows
9
+ * console routinely arrives as a dozen chunks that are exactly `"\r"`, and each
10
+ * one SUBMITS THE DRAFT AS IT STOOD. No component-level heuristic can undo a
11
+ * `key.return` that has already fired, so recognition has to happen on the byte
12
+ * stream, in front of Ink -- the same lesson `mouse-events.ts` records.
13
+ *
14
+ * Two tiers feed one framing (D-4). Tier 1 is bracketed paste and is exact;
15
+ * Tier 2 is a heuristic on chunk SHAPE for the terminals that ignore
16
+ * `DECSET 2004`. Both are about what a keyboard can physically emit.
17
+ */
18
+ import { PASTE_MIN_BURST_CHARS } from './limits.js';
19
+ import { stripControlSequences } from './control-sequences.js';
20
+ /** `DECSET 2004` wraps a paste in these two markers. */
21
+ export const PASTE_BEGIN_MARK = '\x1b[200~';
22
+ export const PASTE_END_MARK = '\x1b[201~';
23
+ /** The longest tail worth holding back while a marker might still complete. */
24
+ export const PASTE_MARK_LENGTH = PASTE_BEGIN_MARK.length;
25
+ /**
26
+ * True when `s` is a PROPER prefix of either paste marker (never a whole one).
27
+ *
28
+ * Both markers are held, in every mode, whether or not THIS process enabled DEC
29
+ * 2004 (I-16): the user's shell, `tmux` or a wrapper script may have left it on,
30
+ * and an unconsumed marker is a literal `[200~` typed into the draft -- the
31
+ * exact failure the feature exists to prevent.
32
+ */
33
+ export function isPastePrefix(s) {
34
+ if (s.length === 0 || s.length >= PASTE_MARK_LENGTH)
35
+ return false;
36
+ return PASTE_BEGIN_MARK.startsWith(s) || PASTE_END_MARK.startsWith(s);
37
+ }
38
+ /**
39
+ * Length of the trailing run of `text` that is a proper prefix of a paste
40
+ * marker, or 0. Shortest match wins, so only the bytes that could still become a
41
+ * marker are held back.
42
+ */
43
+ export function trailingPastePrefixLength(text) {
44
+ const max = Math.min(text.length, PASTE_MARK_LENGTH - 1);
45
+ for (let k = 1; k <= max; k += 1) {
46
+ if (isPastePrefix(text.slice(text.length - k)))
47
+ return k;
48
+ }
49
+ return 0;
50
+ }
51
+ /** Any C0 control byte other than TAB -- ESC, BEL, NUL, CR, LF included. */
52
+ const HAS_CONTROL_EXCEPT_TAB = /[\u0000-\u0008\u000A-\u001F]/;
53
+ /**
54
+ * Tier 2: is this chunk a paste, or keystrokes?
55
+ *
56
+ * The PRIMARY rule -- "longer than one character AND contains a line break" --
57
+ * is exactly the shape defect A needs, so the two coincide: any chunk that could
58
+ * submit the draft by accident is classified as a paste. A lone `\r` is the
59
+ * Enter key and stays `'keys'`.
60
+ *
61
+ * The SECONDARY rule needs `PASTE_MIN_BURST_CHARS` printable characters in one
62
+ * chunk. It excludes chunks carrying any C0 byte but TAB, which is what keeps an
63
+ * arrow-key burst (`\x1b[B\x1b[B...`, and every wheel notch translated by
64
+ * alternate scroll) out of the paste path.
65
+ */
66
+ export function classifyChunk(text, minBurstChars = PASTE_MIN_BURST_CHARS) {
67
+ if (text.length > 1 && /[\r\n]/.test(text))
68
+ return 'paste';
69
+ if (text.length >= minBurstChars && !HAS_CONTROL_EXCEPT_TAB.test(text))
70
+ return 'paste';
71
+ return 'keys';
72
+ }
73
+ /**
74
+ * Make a payload safe to put in a buffer and draw through `<Text>` (G2).
75
+ *
76
+ * 1. CRLF and lone CR both become exactly ONE `\n` -- terminals send CR for a
77
+ * newline in pasted text, and a lone LF is dropped by Ink's key parser
78
+ * entirely, so both have to be normalised here or a pasted line break either
79
+ * submits the message or silently vanishes.
80
+ * 2. Every escape SEQUENCE is removed AS A SEQUENCE (`stripControlSequences`).
81
+ * Deleting only the introducer byte is what produced the reported defect:
82
+ * `ESC [ 3 8 ; 2 ; 1 8 ; 5 2 ; 8 6 m` minus its ESC is `[38;2;18;52;86m`,
83
+ * a run of digits Ink then writes to the terminal as ordinary text -- and it
84
+ * reached the model, the prompt history and the session file too, because
85
+ * this function is the only cleaning the payload ever gets.
86
+ * 3. Every remaining C0 byte except `\n` and `\t` is removed. Ink writes
87
+ * `<Text>` children to the terminal without escaping anything, so a
88
+ * surviving `\r` overwrites the row it is drawn on and a surviving `ESC`
89
+ * repaints the frame colours. Sequences are gone by this point, so what is
90
+ * left for this step is a stray byte, never half of one.
91
+ * 4. DEL and every C1 byte (U+0080..U+009F) go too, and that is NOT padding:
92
+ * U+009B is the single-byte CSI and U+0085 is NEL, and a terminal that
93
+ * decodes them acts on them exactly as it acts on `ESC [`. A file pasted out
94
+ * of a non-UTF-8 editor walks straight through a "strip C0" rule.
95
+ * 5. TAB is KEPT. Indentation is content, and it is what the model receives.
96
+ * Expanding it is the RENDERERS' job (`ui/display-tab.ts`), so the model
97
+ * keeps the original indentation while the screen, the composer and the
98
+ * terminal all agree on what column a TAB lands on.
99
+ *
100
+ * Applied to PAYLOAD ONLY, never to keystrokes, so `Ctrl+A` and Escape keep
101
+ * working. Non-ASCII text (CJK, emoji) is untouched. Idempotent, so the
102
+ * second pass in `ui/paste-frames.ts` stays a byte-identical no-op.
103
+ */
104
+ export function sanitisePaste(raw) {
105
+ return stripControlSequences(raw.replace(/\r\n?/g, '\n'))
106
+ .replace(/[\u0000-\u0008\u000B\u000C\u000E-\u001F\u007F-\u009F]/g, '');
107
+ }
@@ -0,0 +1,11 @@
1
+ import type { MouseEvent } from './mouse-events.js';
2
+ import type { MouseSource } from './stdin-filter.js';
3
+ export interface PointerRouter {
4
+ selectionSource: MouseSource;
5
+ dispose(): void;
6
+ }
7
+ /** Deliver each button gesture to the scrollbar before the selection source. */
8
+ export declare function createPointerRouter(options: {
9
+ source: MouseSource;
10
+ handle(event: MouseEvent): boolean;
11
+ }): PointerRouter;
@@ -0,0 +1,14 @@
1
+ /** Deliver each button gesture to the scrollbar before the selection source. */
2
+ export function createPointerRouter(options) {
3
+ const listeners = new Set();
4
+ const unsubscribe = options.source.subscribe((event) => {
5
+ if (event.kind !== 'wheel' && options.handle(event))
6
+ return;
7
+ for (const listener of listeners)
8
+ listener(event);
9
+ });
10
+ return { selectionSource: { subscribe: (listener) => {
11
+ listeners.add(listener);
12
+ return () => { listeners.delete(listener); };
13
+ } }, dispose: () => { unsubscribe(); listeners.clear(); } };
14
+ }
@@ -0,0 +1,112 @@
1
+ /**
2
+ * Stdin filter (mouse-wheel-region-routing section 4.2 / 5.2, extended by
3
+ * tui-paste-handling section 5.1).
4
+ *
5
+ * WHY A WRAPPER AND NOT A SECOND LISTENER. Ink 5.2.1 owns stdin in a way that
6
+ * forbids a second reader: `components/App.js` calls `setEncoding('utf8')`,
7
+ * `ref()`, `setRawMode(true)`, subscribes to `'readable'` and drains with
8
+ * `read()`. Attaching our own `'data'` listener to the same `process.stdin`
9
+ * would switch the stream into flowing mode and RACE Ink's `read()` for chunks
10
+ * -- some keystrokes would reach Ink, some would not, non-deterministically
11
+ * (D-3). So the filter REPLACES the stream Ink is given: it reads the real
12
+ * stdin, strips every mouse report, frames every paste, and writes the
13
+ * remainder into a `PassThrough` that carries the surface Ink requires.
14
+ *
15
+ * ONE CHANNEL, NOT TWO, AND THAT NOW COVERS PASTES AS WELL (D-2 / D-3). A second
16
+ * chained filter would need a second `PassThrough` and would reopen the ordering
17
+ * hazard this note closes; a side-channel paste emit would apply the payload
18
+ * BEFORE text that preceded it in the same chunk, because `wrapper.write` is
19
+ * asynchronous and a synchronous emit is not. The paste therefore travels
20
+ * INLINE, wrapped in `PASTE_OPEN` / `PASTE_CLOSE` (I-5).
21
+ *
22
+ * ORDERING IS AN INVARIANT, NOT A CONVENTION (I-8). The caller must build this
23
+ * filter BEFORE anything writes `\x1b[?1000h` or `\x1b[?2004h`. Reporting or
24
+ * bracketed paste enabled while Ink still holds the raw stream does not degrade
25
+ * the feature -- it types `[<0;12;5M` or `[200~` into the user's message, which
26
+ * is strictly worse than the bug being fixed.
27
+ *
28
+ * THE HANDLE ANSWERS EXACTLY ONE QUESTION: "is a stream wrapped?" (I-11 / D-17).
29
+ * It stopped being the answer to "is the mouse on?" the moment paste could build
30
+ * a filter on its own -- `paste` defaults to `true`, so `aragon --no-mouse`
31
+ * builds one. `cli.tsx` reads its own `mouseOn` / `pasteOn` booleans; this module
32
+ * is told which features it is running and never derives them.
33
+ */
34
+ import { type MouseEvent } from './mouse-events.js';
35
+ import { type PasteBridge } from './limits.js';
36
+ export interface MouseSource {
37
+ /**
38
+ * Returns an unsubscribe function. Multiple subscribers are allowed -- the
39
+ * wheel router and (since tui-selection-and-scroll-follow) the selection
40
+ * controller both take this one channel, and each ignores the kinds it does
41
+ * not own.
42
+ *
43
+ * With `features.mouse` false the channel exists and stays SILENT forever, so
44
+ * a subscriber written against it does not have to know which features are on.
45
+ */
46
+ subscribe(listener: (event: MouseEvent) => void): () => void;
47
+ }
48
+ /**
49
+ * Which stream-level features this filter is running.
50
+ *
51
+ * TOLD, NEVER DERIVED (D-17 / P0-1). With `{ mouse: false, paste: true }` no
52
+ * `MouseEvent` is ever emitted and `splitMouseEvents` is not called at all: a
53
+ * `--no-mouse` session never wrote `?1000h`, so no real report can arrive, and
54
+ * running the parser anyway could only ever EAT pasted bytes that happen to look
55
+ * like one. With `{ mouse: true, paste: false }` this is byte-for-byte the
56
+ * v0.6.3 mouse filter.
57
+ */
58
+ export interface StdinFilterFeatures {
59
+ /** Parse and strip SGR / X10 mouse reports, and emit `MouseEvent`s. */
60
+ readonly mouse: boolean;
61
+ /** Recognise pastes and deliver them framed. */
62
+ readonly paste: boolean;
63
+ /**
64
+ * Translate keyboard-enhancement encodings (win32-input-mode records on
65
+ * Windows, CSI-u sequences from kitty/modifyOtherKeys elsewhere) back to
66
+ * legacy bytes BEFORE Ink parses them. TOLD, never derived: `cli.tsx`
67
+ * resolves config, TTY state and `vtInputSupported`, and passes the same
68
+ * boolean to `enableKeyboardEnhancement`, so the filter only ever
69
+ * translates for a session whose mode push actually happened.
70
+ */
71
+ readonly enhancedKeys?: boolean;
72
+ /**
73
+ * Strip the Cursor Position Report a terminal sends back for `ESC[6n`
74
+ * (tui-bottom-anchored-live-region §4.5).
75
+ *
76
+ * TOLD, never derived, like the three above: `cli.tsx` passes
77
+ * `plan.differ === 'scrollback'`, so an `app`-mode session stays byte-identical to
78
+ * the build without this feature (I-A8). The report MUST NOT reach Ink -- `[` is
79
+ * 0x5B, so `PromptInput`'s control-sequence guard passes it and the reply gets
80
+ * typed into the draft -- and a report split across two reads is worse than a
81
+ * whole one, because `parse-keypress` has no branch for a half sequence.
82
+ */
83
+ readonly cursorReport?: boolean;
84
+ }
85
+ export interface StdinFilter {
86
+ /** Hand this to Ink: `render(<App/>, { stdin: filter.stdin })`. */
87
+ readonly stdin: NodeJS.ReadStream;
88
+ readonly source: MouseSource;
89
+ /**
90
+ * The probe is waiting for an answer: hold a possible report prefix until it
91
+ * settles instead of flushing it after `PENDING_FLUSH_MS`.
92
+ *
93
+ * ConPTY can split `ESC[12;1R` across two reads further apart than 12 ms, and a
94
+ * half report that reaches Ink lands on an undefined branch of its key parser.
95
+ * Turning this off flushes whatever is still held as ordinary text -- the
96
+ * correct degradation for a terminal that answered with something else (R3).
97
+ */
98
+ setExpectingCursorReport(on: boolean): void;
99
+ /** Idempotent. Detaches from the real stdin and clears every timer (I-7). */
100
+ dispose(): void;
101
+ }
102
+ export declare function createStdinFilter(real: NodeJS.ReadStream, features: StdinFilterFeatures, bridge?: PasteBridge, onWarn?: (reason: string) => void): StdinFilter;
103
+ /**
104
+ * Build a filter, or `null` if construction throws.
105
+ *
106
+ * The `null` return is the whole point (P0-1): a construction failure must
107
+ * degrade to "the wheel is inert and pastes are keystrokes" -- a supported,
108
+ * tested rung of the fail-safe ladder -- rather than leaving `?1000h` or `?2004h`
109
+ * on with no filter in front of Ink. `cli.tsx` derives BOTH `mouseOn` and
110
+ * `pasteOn` from the returned handle for exactly that reason.
111
+ */
112
+ export declare function tryCreateStdinFilter(real: NodeJS.ReadStream, features: StdinFilterFeatures, onError?: (reason: string) => void, bridge?: PasteBridge): StdinFilter | null;