@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,61 @@
1
+ /**
2
+ * Win32-input-mode translation (win32 keyboard-enhancement section of the
3
+ * Shift+Enter newline fix).
4
+ *
5
+ * WHY THIS EXISTS. With `CSI ? 9001 h` the Windows console (conhost inside
6
+ * ConPTY included -- verified byte-level on both conhost and Windows Terminal
7
+ * 1.24, see docs/diagnoses/shift-enter-newline-dead-by-default) reports EVERY
8
+ * key as `ESC [ vk ; scan ; char ; keyDown ; mods ; repeat _`. That is the
9
+ * only Windows-side encoding in which Shift+Enter is distinguishable from
10
+ * Enter: mods carries SHIFT_PRESSED (0x10) on the record. Nothing else
11
+ * survives ConPTY: kitty `CSI > 1 u` is swallowed (a `CSI ? u` query never
12
+ * answers) and modifyOtherKeys is a no-op.
13
+ *
14
+ * THE CONTRACT. `splitWin32KeySequences` recognises the records in a chunk;
15
+ * `translateWin32Key` rewrites each one to the LEGACY bytes the same keypress
16
+ * would have produced with the mode off -- except the modified-Enter family,
17
+ * which becomes `ENTER_NEWLINE_FRAME` exactly like `enter-sequences.ts` maps
18
+ * its CSI-u cousins. Ink therefore sees the stream it has always seen. Key-up
19
+ * records are dropped (every press arrives as a down/up pair in one chunk).
20
+ *
21
+ * Pure: no node/React imports, callable from any test environment.
22
+ */
23
+ /** Enable / disable win32-input-mode (private mode 9001). */
24
+ export declare const WIN32_INPUT_ENABLE = "\u001B[?9001h";
25
+ export declare const WIN32_INPUT_DISABLE = "\u001B[?9001l";
26
+ /** One decoded `ESC [ vk ; sc ; char ; down ; mods ; rep _` record. */
27
+ export interface Win32KeyRecord {
28
+ readonly vk: number;
29
+ readonly scan: number;
30
+ readonly char: number;
31
+ readonly down: boolean;
32
+ readonly mods: number;
33
+ readonly repeat: number;
34
+ }
35
+ export type Win32Segment = {
36
+ kind: 'text';
37
+ text: string;
38
+ } | {
39
+ kind: 'key';
40
+ record: Win32KeyRecord;
41
+ };
42
+ /**
43
+ * Split a chunk into text spans and win32-input-mode records.
44
+ *
45
+ * MATCHES ONLY `ESC [ <digits/semicolons> _`: mouse reports need `<`, paste
46
+ * markers end in `~`, CSI-u ends in `u`, DECRPM replies start with `?`. A
47
+ * `_`-terminated all-numeric-parameter sequence is therefore unambiguous in
48
+ * the stream this filter ever sees.
49
+ */
50
+ export declare function splitWin32KeySequences(text: string): Win32Segment[];
51
+ /**
52
+ * Translate one record to the legacy bytes the same keypress would have
53
+ * produced with win32-input-mode off (Enter family excepted: a modified Enter
54
+ * becomes the newline frame, mirroring `ENTER_SEQUENCES`).
55
+ */
56
+ export declare function translateWin32Key(record: Win32KeyRecord): string;
57
+ /**
58
+ * Length of the trailing run of `text` that could still complete into a
59
+ * win32-input-mode record, or 0. Longest match, mirroring the other families.
60
+ */
61
+ export declare function trailingWin32PrefixLength(text: string): number;
@@ -0,0 +1,269 @@
1
+ /**
2
+ * Win32-input-mode translation (win32 keyboard-enhancement section of the
3
+ * Shift+Enter newline fix).
4
+ *
5
+ * WHY THIS EXISTS. With `CSI ? 9001 h` the Windows console (conhost inside
6
+ * ConPTY included -- verified byte-level on both conhost and Windows Terminal
7
+ * 1.24, see docs/diagnoses/shift-enter-newline-dead-by-default) reports EVERY
8
+ * key as `ESC [ vk ; scan ; char ; keyDown ; mods ; repeat _`. That is the
9
+ * only Windows-side encoding in which Shift+Enter is distinguishable from
10
+ * Enter: mods carries SHIFT_PRESSED (0x10) on the record. Nothing else
11
+ * survives ConPTY: kitty `CSI > 1 u` is swallowed (a `CSI ? u` query never
12
+ * answers) and modifyOtherKeys is a no-op.
13
+ *
14
+ * THE CONTRACT. `splitWin32KeySequences` recognises the records in a chunk;
15
+ * `translateWin32Key` rewrites each one to the LEGACY bytes the same keypress
16
+ * would have produced with the mode off -- except the modified-Enter family,
17
+ * which becomes `ENTER_NEWLINE_FRAME` exactly like `enter-sequences.ts` maps
18
+ * its CSI-u cousins. Ink therefore sees the stream it has always seen. Key-up
19
+ * records are dropped (every press arrives as a down/up pair in one chunk).
20
+ *
21
+ * Pure: no node/React imports, callable from any test environment.
22
+ */
23
+ import { ENTER_NEWLINE_FRAME, INDEX_KEY_FRAME } from './limits.js';
24
+ /** Enable / disable win32-input-mode (private mode 9001). */
25
+ export const WIN32_INPUT_ENABLE = '\x1b[?9001h';
26
+ export const WIN32_INPUT_DISABLE = '\x1b[?9001l';
27
+ /** Windows console `dwControlKeyState` modifier bits this module cares about. */
28
+ const RIGHT_ALT = 0x1;
29
+ const LEFT_ALT = 0x2;
30
+ const RIGHT_CTRL = 0x4;
31
+ const LEFT_CTRL = 0x8;
32
+ const SHIFT = 0x10;
33
+ /** Lock states, ENHANCED_KEY and friends must never look like modifiers. */
34
+ const MODIFIER_MASK = SHIFT | LEFT_CTRL | RIGHT_CTRL | LEFT_ALT | RIGHT_ALT;
35
+ /** Virtual-key codes the translator names explicitly. */
36
+ const VK_BACK = 0x08;
37
+ const VK_TAB = 0x09;
38
+ const VK_ENTER = 0x0d;
39
+ const VK_ESCAPE = 0x1b;
40
+ const VK_PACKET = 0xe7;
41
+ /**
42
+ * Parse one candidate body (`digits and semicolons`, the `_` excluded).
43
+ * Returns null when the field count is impossible for a real record -- that
44
+ * is what keeps a random `ESC [ 1 ; 2 3 _`-shaped paste from being eaten.
45
+ */
46
+ function parseRecord(body) {
47
+ const fields = body.split(';');
48
+ if (fields.length !== 6)
49
+ return null;
50
+ const nums = fields.map(Number);
51
+ if (nums.some((n) => !Number.isInteger(n) || n < 0 || n > 0x10ffff))
52
+ return null;
53
+ const [vk, , char, down, mods, repeat] = nums;
54
+ if (vk === undefined || char === undefined || down === undefined)
55
+ return null;
56
+ if (mods === undefined || repeat === undefined)
57
+ return null;
58
+ if (vk > 0xff)
59
+ return null;
60
+ return { vk, scan: nums[1] ?? 0, char, down: down === 1, mods, repeat };
61
+ }
62
+ /**
63
+ * Split a chunk into text spans and win32-input-mode records.
64
+ *
65
+ * MATCHES ONLY `ESC [ <digits/semicolons> _`: mouse reports need `<`, paste
66
+ * markers end in `~`, CSI-u ends in `u`, DECRPM replies start with `?`. A
67
+ * `_`-terminated all-numeric-parameter sequence is therefore unambiguous in
68
+ * the stream this filter ever sees.
69
+ */
70
+ export function splitWin32KeySequences(text) {
71
+ const segments = [];
72
+ let start = 0;
73
+ let index = 0;
74
+ while (index < text.length) {
75
+ if (text[index] !== '\x1b' || text[index + 1] !== '[') {
76
+ index += 1;
77
+ continue;
78
+ }
79
+ let end = index + 2;
80
+ while (end < text.length && text[end] !== '_') {
81
+ const c = text[end];
82
+ if (c < '0' || c > '9') {
83
+ if (c !== ';') {
84
+ end = -1;
85
+ break;
86
+ }
87
+ }
88
+ end += 1;
89
+ }
90
+ if (end === -1 || end >= text.length) {
91
+ index += 1;
92
+ continue;
93
+ }
94
+ const record = parseRecord(text.slice(index + 2, end));
95
+ if (!record) {
96
+ index += 1;
97
+ continue;
98
+ }
99
+ if (index > start)
100
+ segments.push({ kind: 'text', text: text.slice(start, index) });
101
+ segments.push({ kind: 'key', record });
102
+ index = end + 1;
103
+ start = index;
104
+ }
105
+ if (start < text.length)
106
+ segments.push({ kind: 'text', text: text.slice(start) });
107
+ return segments;
108
+ }
109
+ /** Legacy modifier parameter (xterm): 1 + shift + 2*alt + 4*ctrl. */
110
+ function legacyModifierParam(m) {
111
+ let p = 1;
112
+ if (m & SHIFT)
113
+ p += 1;
114
+ if (m & (LEFT_ALT | RIGHT_ALT))
115
+ p += 2;
116
+ if (m & (LEFT_CTRL | RIGHT_CTRL))
117
+ p += 4;
118
+ return p;
119
+ }
120
+ /** Functional keys named by vk, as (letter | tilde-code) legacy shapes. */
121
+ const FUNCTIONAL_KEYS = new Map([
122
+ [0x21, { code: 5 }], // PgUp
123
+ [0x22, { code: 6 }], // PgDn
124
+ [0x23, { letter: 'F' }], // End
125
+ [0x24, { letter: 'H' }], // Home
126
+ [0x25, { letter: 'D' }], // Left
127
+ [0x26, { letter: 'A' }], // Up
128
+ [0x27, { letter: 'C' }], // Right
129
+ [0x28, { letter: 'B' }], // Down
130
+ [0x2d, { code: 2 }], // Insert
131
+ [0x2e, { code: 3 }], // Delete
132
+ [0x70, { letter: 'P' }], // F1
133
+ [0x71, { letter: 'Q' }], // F2
134
+ [0x72, { letter: 'R' }], // F3
135
+ [0x73, { letter: 'S' }], // F4
136
+ [0x74, { code: 15 }], // F5
137
+ [0x75, { code: 17 }], // F6
138
+ [0x76, { code: 18 }], // F7
139
+ [0x77, { code: 19 }], // F8
140
+ [0x78, { code: 20 }], // F9
141
+ [0x79, { code: 21 }], // F10
142
+ [0x7a, { code: 23 }], // F11
143
+ [0x7b, { code: 24 }], // F12
144
+ ]);
145
+ /** Emit the legacy form of a functional key under `m` modifiers. */
146
+ function functionalLegacy(vk, m) {
147
+ const key = FUNCTIONAL_KEYS.get(vk);
148
+ if (!key)
149
+ return '';
150
+ if (m === 0) {
151
+ return 'letter' in key
152
+ ? (key.letter === 'P' || key.letter === 'Q' || key.letter === 'R' || key.letter === 'S'
153
+ ? `\x1bO${key.letter}`
154
+ : `\x1b[${key.letter}`)
155
+ : `\x1b[${key.code}~`;
156
+ }
157
+ const p = legacyModifierParam(m);
158
+ return 'letter' in key ? `\x1b[1;${p}${key.letter}` : `\x1b[${key.code};${p}~`;
159
+ }
160
+ /** Control code for Ctrl+letter, or the char itself when not a letter. */
161
+ function ctrlByte(char) {
162
+ if (char >= 97 && char <= 122)
163
+ return char - 96; // a-z -> 1-26
164
+ if (char >= 65 && char <= 90)
165
+ return char - 64; // A-Z -> 1-26
166
+ return char;
167
+ }
168
+ const isPrintable = (char) => char >= 0x20 && char !== 0x7f;
169
+ /**
170
+ * Translate one record to the legacy bytes the same keypress would have
171
+ * produced with win32-input-mode off (Enter family excepted: a modified Enter
172
+ * becomes the newline frame, mirroring `ENTER_SEQUENCES`).
173
+ */
174
+ export function translateWin32Key(record) {
175
+ if (!record.down)
176
+ return '';
177
+ const m = record.mods & MODIFIER_MASK;
178
+ const ctrl = (m & (LEFT_CTRL | RIGHT_CTRL)) !== 0;
179
+ const alt = (m & (LEFT_ALT | RIGHT_ALT)) !== 0;
180
+ const shift = (m & SHIFT) !== 0;
181
+ const char = record.char === 0 ? '' : String.fromCodePoint(record.char);
182
+ // AltGr arrives as RightCtrl|RightAlt (or lone RightAlt) WITH the composed
183
+ // character already in `char`; prefixing ESC or control-translating it would
184
+ // break every non-US layout. Plain typing first, exotic combos never.
185
+ if (isPrintable(record.char) && (m === RIGHT_CTRL + RIGHT_ALT || m === RIGHT_ALT)) {
186
+ return char;
187
+ }
188
+ switch (record.vk) {
189
+ case VK_ENTER:
190
+ // A modified Enter NEVER submits -- same rule as `ENTER_SEQUENCES`.
191
+ return m === 0 ? '\r' : ENTER_NEWLINE_FRAME;
192
+ case VK_TAB:
193
+ // Ctrl+I is the project-indexer trigger, and the ONLY place the two are
194
+ // tell-apart is right here: legacy encoding collapses it to the Tab
195
+ // byte. Shift keeps ESC [ Z (Shift+Tab) so the mode toggle stays intact,
196
+ // and Ctrl+Shift+I stays on that Shift branch.
197
+ if (ctrl && !shift && !alt)
198
+ return INDEX_KEY_FRAME;
199
+ return shift ? '\x1b[Z' : '\t';
200
+ case VK_ESCAPE:
201
+ return alt ? '\x1b\x1b' : '\x1b';
202
+ case VK_BACK:
203
+ // POST-normalisation bytes: `handleText` rewrites DEL (0x7f) to BS
204
+ // (0x08) for Ink, and translated records bypass that walk -- emitting
205
+ // the final form keeps the stream byte-identical to the baseline.
206
+ if (alt)
207
+ return '\x1b\x08';
208
+ return '\x08';
209
+ default:
210
+ break;
211
+ }
212
+ if (record.char !== 0 && record.char < 0x20 && record.vk !== VK_PACKET) {
213
+ // Ctrl combos: Windows already resolves the control character (Ctrl+C is
214
+ // 0x03). Alt keeps the ESC prefix; Ctrl+Alt prefixes ESC over the code.
215
+ if (!ctrl && !alt && !shift)
216
+ return char;
217
+ if (!ctrl && alt)
218
+ return `\x1b${char}`;
219
+ // Ctrl+I, letter-vk shape: a physical Ctrl+I keeps the LETTER vk
220
+ // (0x49, the same Ctrl+letter probe rule that reports Ctrl+A as 65
221
+ // and Ctrl+J as 74) while `char` is already the Tab byte, so the
222
+ // VK_TAB switch above never sees the record. 0x09 is both the Tab
223
+ // byte and VK_TAB, so the tell-apart from plain Tab is ctrl alone,
224
+ // and Shift keeps ESC [ Z exactly like that switch: the mode toggle
225
+ // stays intact and Ctrl+Shift+I stays on the Shift branch.
226
+ if (ctrl && record.char === VK_TAB) {
227
+ if (!shift && !alt)
228
+ return INDEX_KEY_FRAME;
229
+ return shift ? '\x1b[Z' : '\t';
230
+ }
231
+ return ctrl ? `${alt ? '\x1b' : ''}${char}` : char;
232
+ }
233
+ if (isPrintable(record.char)) {
234
+ if (ctrl) {
235
+ const code = ctrlByte(record.char);
236
+ return `${alt ? '\x1b' : ''}${code === record.char ? char : String.fromCharCode(code)}`;
237
+ }
238
+ if (alt)
239
+ return `\x1b${char}`;
240
+ return char;
241
+ }
242
+ return functionalLegacy(record.vk, m);
243
+ }
244
+ /** True when `s` is a PROPER prefix of some win32-input-mode record. */
245
+ function isWin32Prefix(s) {
246
+ // A bare ESC (or ESC + anything else) belongs to the Enter/mouse/paste
247
+ // families' hold; this family only ever extends `\x1b[` with digits and
248
+ // semicolons, up to but never including the `_`.
249
+ if (s.length < 3 || s[0] !== '\x1b' || s[1] !== '[')
250
+ return false;
251
+ for (let i = 2; i < s.length; i += 1) {
252
+ const c = s[i];
253
+ if ((c < '0' || c > '9') && c !== ';')
254
+ return false;
255
+ }
256
+ return true;
257
+ }
258
+ /**
259
+ * Length of the trailing run of `text` that could still complete into a
260
+ * win32-input-mode record, or 0. Longest match, mirroring the other families.
261
+ */
262
+ export function trailingWin32PrefixLength(text) {
263
+ const max = Math.min(text.length, 32);
264
+ for (let k = max; k >= 1; k -= 1) {
265
+ if (isWin32Prefix(text.slice(text.length - k)))
266
+ return k;
267
+ }
268
+ return 0;
269
+ }
@@ -0,0 +1,108 @@
1
+ /**
2
+ * Agent mode vocabulary (plan-mode §5.1).
3
+ *
4
+ * Pure: no React, no I/O, no `node:*`. Imported by the controller, the tool
5
+ * gate, the prompt builder, the slash command and four UI components, which is
6
+ * exactly why it must stay free of every one of their dependencies.
7
+ *
8
+ * `PLAN_MODE_BLOCKED_TOOLS` is deliberately NOT here. It lives in
9
+ * `tools/index.ts` beside `SKILL_TOOL_FLOOR`, because the invariant worth having
10
+ * is that the two sets PARTITION `HOST_TOOL_NAMES` — and a partition test is
11
+ * only as trustworthy as the distance between the two definitions. This file
12
+ * owns the mode vocabulary; that file owns which tools the modes act on.
13
+ *
14
+ * ASCII ONLY in every string literal below. `agent/` is inside the glyph
15
+ * scanner's scope (`glyphs.test.ts`), so a stray ellipsis here fails the build —
16
+ * which is why `OTHER_OPTION_LABEL` is a bare word and the ellipsis is appended
17
+ * at render time from `glyphs.ellipsis`.
18
+ */
19
+ export type AgentMode = 'build' | 'plan';
20
+ export declare const AGENT_MODES: readonly AgentMode[];
21
+ /** The user-visible word for each mode. English, per the repo convention. */
22
+ export declare const MODE_LABEL: Record<AgentMode, string>;
23
+ /**
24
+ * The next mode in the cycle.
25
+ *
26
+ * Written as a cycle rather than a boolean flip so that adding Claude Code's
27
+ * "auto-accept edits" as a third posture is a one-line change to `AGENT_MODES`
28
+ * and nothing else. Two ship today (§1 non-goals).
29
+ */
30
+ export declare function nextMode(current: AgentMode): AgentMode;
31
+ /**
32
+ * The keys that toggle the mode, as the user sees them written
33
+ * (shift-tab-mode-toggle-still-dead-on-windows, C2).
34
+ *
35
+ * `fallback` exists because `primary` CANNOT be made to work everywhere. On a
36
+ * Windows console without `ENABLE_VIRTUAL_TERMINAL_INPUT`, libuv takes the
37
+ * character branch for `VK_TAB` and drops the modifier wholesale, so `Shift+Tab`
38
+ * and `Ctrl+Tab` both arrive as a bare `0x09` - byte-identical to `Tab`. C1
39
+ * turns that bit back on where it can, but it has three known ways to fail that
40
+ * are outside this package (an old conhost refusing the bit, a locked-down
41
+ * PowerShell, a foreign process resetting the mode), so a rung that depends on
42
+ * NOTHING has to exist underneath it.
43
+ *
44
+ * `ctrl+n` IS MEASURED, not guessed. On the lossy path it arrives as `0x0e`,
45
+ * because Windows generates a real control character for `Ctrl+<letter>` and
46
+ * libuv's character branch forwards it untouched; `Alt+M` produces no bytes at
47
+ * all and `Ctrl+Tab` collapses exactly like `Shift+Tab` (analysis section 3.6).
48
+ * Any idle `Ctrl+<letter>` in the `0x01-0x1A` range would work; this one is free
49
+ * throughout the package - `keymap.ts` claims a/e/w/u/k, `App` claims c/g/k/l/o/r/t,
50
+ * and `PromptInput` returns early on every `key.ctrl` - so binding it takes no
51
+ * behaviour away from anyone. `Ctrl+B` survives the same path but is tmux's
52
+ * default prefix, and this binding is unconditional and cross-platform, so it
53
+ * would be silently dead for a whole class of macOS and Linux users.
54
+ *
55
+ * THIS KEY MOVED FROM `ctrl+p`, WHICH NOW OPENS THE PROMPT LIBRARY
56
+ * (quick-prompt-library D-1). The requirement names `ctrl+p` as the first entry
57
+ * to a feature users will build muscle memory for, and a key that is sometimes
58
+ * the prompt library and sometimes the mode switch is a key nobody can learn.
59
+ * `ctrl+n` was the only idle C0 byte left that survives the same lossy path, and
60
+ * it carries no conflicting behaviour: readline's `next-history` is `Up`/`Down`
61
+ * in this product.
62
+ *
63
+ * `^N` IS NOT AN ACCEPTABLE SPELLING OF IT, ANYWHERE. `^N` is already this
64
+ * product's word for TRANSCRIPT LINE OFFSET - the header's scroll chip reads
65
+ * `^<n>` and the help overlay has a `^N` row about the distance from the bottom -
66
+ * while every other `^X` in the same row is a key. Writing the mode fallback as
67
+ * `^N` would put two meanings of `^` on one line, so the header, the help
68
+ * overlay, `doctor`, the README and the one-shot migration notice all spell out
69
+ * `Ctrl+N`.
70
+ *
71
+ * BOUND UNCONDITIONALLY, on every platform. A binding that only exists where it
72
+ * is needed cannot be documented in one place, cannot be taught by muscle
73
+ * memory, and is missing on precisely the machine whose capability probe was
74
+ * wrong.
75
+ *
76
+ * THESE ARE THE LABELS, NOT THE BINDING. Editing a value here changes only what
77
+ * the user is TOLD to press - the hint row, the startup notice, `doctor`. The
78
+ * key that is actually listened for is `input === 'n'` in `App`'s `useInput`,
79
+ * and the help overlay and README spell both keys out in their own title case.
80
+ * Change one without the others and the product advertises a key it ignores.
81
+ */
82
+ export declare const MODE_TOGGLE_KEYS: {
83
+ readonly primary: "shift+tab";
84
+ readonly fallback: "ctrl+n";
85
+ };
86
+ /** The two tools that only exist because a human is attached. */
87
+ export declare const PLAN_TOOL_NAMES: readonly ["ask_user", "submit_plan"];
88
+ /**
89
+ * The synthetic free-text option appended to every question.
90
+ *
91
+ * Plain `Other`, with no ellipsis: this module is inside the glyph scanner's
92
+ * scope, and the overlay appends `glyphs.ellipsis` itself so the label degrades
93
+ * to `Other...` on a terminal without Unicode.
94
+ */
95
+ export declare const OTHER_OPTION_LABEL = "Other";
96
+ /**
97
+ * Why a mutating tool was refused in plan mode.
98
+ *
99
+ * The wording carries weight beyond politeness (§3.9). A run that flips
100
+ * `build -> plan` mid-flight keeps its original system prompt to the end — the
101
+ * loop reads `ctx.systemPrompt`, which was copied by value when the run
102
+ * started — so for the rest of that run this refusal is the ONLY place the
103
+ * model learns that plan mode is on. A bare "not permitted" reads as a tool
104
+ * malfunction and gets retried.
105
+ */
106
+ export declare function planRefusal(tool: string): string;
107
+ /** Why `submit_plan` was refused outside plan mode. */
108
+ export declare function submitPlanRefusal(): string;
@@ -0,0 +1,121 @@
1
+ /**
2
+ * Agent mode vocabulary (plan-mode §5.1).
3
+ *
4
+ * Pure: no React, no I/O, no `node:*`. Imported by the controller, the tool
5
+ * gate, the prompt builder, the slash command and four UI components, which is
6
+ * exactly why it must stay free of every one of their dependencies.
7
+ *
8
+ * `PLAN_MODE_BLOCKED_TOOLS` is deliberately NOT here. It lives in
9
+ * `tools/index.ts` beside `SKILL_TOOL_FLOOR`, because the invariant worth having
10
+ * is that the two sets PARTITION `HOST_TOOL_NAMES` — and a partition test is
11
+ * only as trustworthy as the distance between the two definitions. This file
12
+ * owns the mode vocabulary; that file owns which tools the modes act on.
13
+ *
14
+ * ASCII ONLY in every string literal below. `agent/` is inside the glyph
15
+ * scanner's scope (`glyphs.test.ts`), so a stray ellipsis here fails the build —
16
+ * which is why `OTHER_OPTION_LABEL` is a bare word and the ellipsis is appended
17
+ * at render time from `glyphs.ellipsis`.
18
+ */
19
+ export const AGENT_MODES = ['build', 'plan'];
20
+ /** The user-visible word for each mode. English, per the repo convention. */
21
+ export const MODE_LABEL = { build: 'BUILD', plan: 'PLAN' };
22
+ /**
23
+ * The next mode in the cycle.
24
+ *
25
+ * Written as a cycle rather than a boolean flip so that adding Claude Code's
26
+ * "auto-accept edits" as a third posture is a one-line change to `AGENT_MODES`
27
+ * and nothing else. Two ship today (§1 non-goals).
28
+ */
29
+ export function nextMode(current) {
30
+ const index = AGENT_MODES.indexOf(current);
31
+ return AGENT_MODES[(index + 1) % AGENT_MODES.length];
32
+ }
33
+ /**
34
+ * The keys that toggle the mode, as the user sees them written
35
+ * (shift-tab-mode-toggle-still-dead-on-windows, C2).
36
+ *
37
+ * `fallback` exists because `primary` CANNOT be made to work everywhere. On a
38
+ * Windows console without `ENABLE_VIRTUAL_TERMINAL_INPUT`, libuv takes the
39
+ * character branch for `VK_TAB` and drops the modifier wholesale, so `Shift+Tab`
40
+ * and `Ctrl+Tab` both arrive as a bare `0x09` - byte-identical to `Tab`. C1
41
+ * turns that bit back on where it can, but it has three known ways to fail that
42
+ * are outside this package (an old conhost refusing the bit, a locked-down
43
+ * PowerShell, a foreign process resetting the mode), so a rung that depends on
44
+ * NOTHING has to exist underneath it.
45
+ *
46
+ * `ctrl+n` IS MEASURED, not guessed. On the lossy path it arrives as `0x0e`,
47
+ * because Windows generates a real control character for `Ctrl+<letter>` and
48
+ * libuv's character branch forwards it untouched; `Alt+M` produces no bytes at
49
+ * all and `Ctrl+Tab` collapses exactly like `Shift+Tab` (analysis section 3.6).
50
+ * Any idle `Ctrl+<letter>` in the `0x01-0x1A` range would work; this one is free
51
+ * throughout the package - `keymap.ts` claims a/e/w/u/k, `App` claims c/g/k/l/o/r/t,
52
+ * and `PromptInput` returns early on every `key.ctrl` - so binding it takes no
53
+ * behaviour away from anyone. `Ctrl+B` survives the same path but is tmux's
54
+ * default prefix, and this binding is unconditional and cross-platform, so it
55
+ * would be silently dead for a whole class of macOS and Linux users.
56
+ *
57
+ * THIS KEY MOVED FROM `ctrl+p`, WHICH NOW OPENS THE PROMPT LIBRARY
58
+ * (quick-prompt-library D-1). The requirement names `ctrl+p` as the first entry
59
+ * to a feature users will build muscle memory for, and a key that is sometimes
60
+ * the prompt library and sometimes the mode switch is a key nobody can learn.
61
+ * `ctrl+n` was the only idle C0 byte left that survives the same lossy path, and
62
+ * it carries no conflicting behaviour: readline's `next-history` is `Up`/`Down`
63
+ * in this product.
64
+ *
65
+ * `^N` IS NOT AN ACCEPTABLE SPELLING OF IT, ANYWHERE. `^N` is already this
66
+ * product's word for TRANSCRIPT LINE OFFSET - the header's scroll chip reads
67
+ * `^<n>` and the help overlay has a `^N` row about the distance from the bottom -
68
+ * while every other `^X` in the same row is a key. Writing the mode fallback as
69
+ * `^N` would put two meanings of `^` on one line, so the header, the help
70
+ * overlay, `doctor`, the README and the one-shot migration notice all spell out
71
+ * `Ctrl+N`.
72
+ *
73
+ * BOUND UNCONDITIONALLY, on every platform. A binding that only exists where it
74
+ * is needed cannot be documented in one place, cannot be taught by muscle
75
+ * memory, and is missing on precisely the machine whose capability probe was
76
+ * wrong.
77
+ *
78
+ * THESE ARE THE LABELS, NOT THE BINDING. Editing a value here changes only what
79
+ * the user is TOLD to press - the hint row, the startup notice, `doctor`. The
80
+ * key that is actually listened for is `input === 'n'` in `App`'s `useInput`,
81
+ * and the help overlay and README spell both keys out in their own title case.
82
+ * Change one without the others and the product advertises a key it ignores.
83
+ */
84
+ export const MODE_TOGGLE_KEYS = { primary: 'shift+tab', fallback: 'ctrl+n' };
85
+ /** The two tools that only exist because a human is attached. */
86
+ export const PLAN_TOOL_NAMES = ['ask_user', 'submit_plan'];
87
+ /**
88
+ * The synthetic free-text option appended to every question.
89
+ *
90
+ * Plain `Other`, with no ellipsis: this module is inside the glyph scanner's
91
+ * scope, and the overlay appends `glyphs.ellipsis` itself so the label degrades
92
+ * to `Other...` on a terminal without Unicode.
93
+ */
94
+ export const OTHER_OPTION_LABEL = 'Other';
95
+ /** Read-only alternatives named in every refusal, so the model has somewhere to go. */
96
+ const READ_ONLY_ALTERNATIVES = 'read_file / list_dir / glob / grep';
97
+ /**
98
+ * Why a mutating tool was refused in plan mode.
99
+ *
100
+ * The wording carries weight beyond politeness (§3.9). A run that flips
101
+ * `build -> plan` mid-flight keeps its original system prompt to the end — the
102
+ * loop reads `ctx.systemPrompt`, which was copied by value when the run
103
+ * started — so for the rest of that run this refusal is the ONLY place the
104
+ * model learns that plan mode is on. A bare "not permitted" reads as a tool
105
+ * malfunction and gets retried.
106
+ */
107
+ export function planRefusal(tool) {
108
+ const extra = tool === 'bash'
109
+ ? ' bash is refused in full, including read-only commands like "git status":' +
110
+ ' a shell string cannot be classified reliably, and a gate that is right' +
111
+ ' most of the time is worse than one that is always right.'
112
+ : '';
113
+ return (`Plan mode is active, so ${tool} is refused.${extra}` +
114
+ ` Use ${READ_ONLY_ALTERNATIVES} to research, then call submit_plan.` +
115
+ ' Do not try to work around this; finish the plan instead.');
116
+ }
117
+ /** Why `submit_plan` was refused outside plan mode. */
118
+ export function submitPlanRefusal() {
119
+ return ('submit_plan is only available in Plan mode. You are in Build mode - ' +
120
+ 'just do the work and summarize when you are done.');
121
+ }
@@ -0,0 +1,65 @@
1
+ /**
2
+ * Bounded view state (tui-render-performance L1 / R5).
3
+ *
4
+ * `ViewState.entries` used to grow without any ceiling: `argsRaw`, assistant
5
+ * `text` and `thinking` all concatenated forever, and the entry array was never
6
+ * trimmed. That makes the per-frame cost of the renderer proportional to the
7
+ * total number of characters the session has ever produced, because Ink's
8
+ * `renderNodeToOutput` walks and measures every mounted text node whether or not
9
+ * `overflow: hidden` clips it.
10
+ *
11
+ * Two bounds live here, both pure and React-free:
12
+ * - `appendBounded` caps one field by eliding its MIDDLE, and
13
+ * - `trimEntries` ring-trims the entry array itself.
14
+ *
15
+ * ASCII ONLY. This module is produced outside `src/ui/**`, where no terminal
16
+ * capabilities are available, so the elision marker has to be safe on a legacy
17
+ * `cmd.exe` -- the same rule `PREVIEW_TRUNCATION_MARK` in `reducer.ts` records.
18
+ */
19
+ import type { Entry } from './reducer.js';
20
+ export interface EntryLimits {
21
+ /** Assistant answer text ceiling, in characters. */
22
+ text: number;
23
+ /** Assistant thinking ceiling. */
24
+ thinking: number;
25
+ /** Streamed tool-argument JSON ceiling. */
26
+ argsRaw: number;
27
+ }
28
+ /**
29
+ * The per-field ceilings.
30
+ *
31
+ * `text` is the generous one on purpose: a 256 KiB answer is already far past
32
+ * anything a terminal can usefully show, and the middle is what gets elided, so
33
+ * both the opening and the live cursor survive. `argsRaw` is the tight one --
34
+ * it is a streamed JSON fragment rendered as a 60-character card summary, so
35
+ * anything past a few KiB is invisible by construction.
36
+ */
37
+ export declare const ENTRY_LIMITS: EntryLimits;
38
+ /** Marker inserted at the elision point. ASCII -- produced outside `src/ui/**`. */
39
+ export declare const ELISION_MARK_PREFIX = "\n[... ";
40
+ export declare const ELISION_MARK_SUFFIX = " characters elided ...]\n";
41
+ /**
42
+ * Append `delta` to `prev`, keeping the result at or below `cap` by eliding the
43
+ * MIDDLE. Head and tail are both preserved: the head is the answer's opening,
44
+ * the tail is where the cursor is. Idempotent -- re-eliding an already elided
45
+ * string collapses the two markers into one.
46
+ *
47
+ * The returned string is NEVER longer than `cap` (AC-7). The marker's own digit
48
+ * count is bounded before the tail budget is computed, so the arithmetic cannot
49
+ * overshoot by a digit the way a naive `cap - marker.length` would.
50
+ */
51
+ export declare function appendBounded(prev: string, delta: string, cap: number): string;
52
+ export interface TrimResult {
53
+ entries: Entry[];
54
+ dropped: number;
55
+ }
56
+ /**
57
+ * Ring-trim to `retain` entries; returns the SAME array reference when no-op.
58
+ *
59
+ * The identity return is load-bearing: the reducer spreads this result into a
60
+ * new `ViewState` on every append, and a fresh array on every action would
61
+ * defeat the `React.memo` boundaries L2 installs on the transcript.
62
+ */
63
+ export declare function trimEntries(entries: Entry[], retain: number): TrimResult;
64
+ export declare function setEntryRetain(value: number): void;
65
+ export declare function entryRetain(): number;