@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,265 @@
1
+ /**
2
+ * The human-input channel (plan-mode §3.5 / §5.1) — types, the fail-closed
3
+ * default gate, and the two pure normalizers that repair whatever the model
4
+ * actually sent.
5
+ *
6
+ * Everything here is pure except the type declarations: no Ink, no React, no
7
+ * `node:*`. `tools/` is inside the glyph scanner's scope, so every literal is
8
+ * ASCII.
9
+ *
10
+ * WHY THE NORMALIZERS ARE THE ONLY AUTHORITY ON THE LIMITS (P0-4). The
11
+ * model-facing schemas in `plan-tools.ts` declare SHAPE only — `type`,
12
+ * `required`, `default` — and put every bound in the `description`. They used to
13
+ * carry `minItems` / `maxItems` / `maxLength`, and that had two failure modes at
14
+ * once: `ToolExecutor` rejected a six-question call outright with `Invalid
15
+ * parameters: ...` before any repair could run, wasting a full research turn on
16
+ * a cosmetic defect; and `ajv` is an OPTIONAL dependency of core, so without it
17
+ * the fallback validator checks `required` plus primitive types only and the
18
+ * same call sailed through. One design, two behaviours, selected by whether an
19
+ * optional install step succeeded. Bounds live here instead, where they are
20
+ * deterministic and unit-tested.
21
+ */
22
+ import { OTHER_OPTION_LABEL } from '../agent/agent-mode.js';
23
+ /**
24
+ * Fails CLOSED. The headless default — forgetting to pass a gate must refuse,
25
+ * never hang and never assume yes.
26
+ */
27
+ export const DENY_ALL_HUMAN_INPUT = {
28
+ neverPrompts: true,
29
+ canPrompt: () => false,
30
+ request: async () => null,
31
+ };
32
+ // ---------------------------------------------------------------------------
33
+ // Limits (the single authority; see the module header for why not the schema)
34
+ // ---------------------------------------------------------------------------
35
+ export const QUESTION_LIMITS = {
36
+ maxQuestions: 5,
37
+ minOptions: 2,
38
+ maxOptions: 4,
39
+ headerChars: 12,
40
+ questionChars: 300,
41
+ labelChars: 60,
42
+ optionDescriptionChars: 120,
43
+ };
44
+ export const PLAN_LIMITS = {
45
+ titleChars: 80,
46
+ summaryChars: 600,
47
+ maxSteps: 20,
48
+ stepTitleChars: 100,
49
+ stepDetailChars: 400,
50
+ maxFiles: 30,
51
+ maxRisks: 10,
52
+ maxOpenQuestions: 10,
53
+ };
54
+ /**
55
+ * The STORAGE bound of the `ask_user` de-duplication guard — NOT a refusal
56
+ * condition, and the distinction is the whole point.
57
+ *
58
+ * Storage is memory hygiene: a turn that asks a thousand DISTINCT question sets
59
+ * is pathological, but it is still the user's turn, and Esc interrupts it. The
60
+ * refusal rule is semantic: "never ask the same answered questions twice". Folding
61
+ * the bound into the refusal rule would restore the round cap this feature
62
+ * deletes, with a different number written on it.
63
+ *
64
+ * Owned here rather than in `plan-tools.ts` (the caller) or `controller.ts` (the
65
+ * state holder) because this file is already the single authority on the
66
+ * structural limits of human input, beside `QUESTION_LIMITS` / `PLAN_LIMITS`.
67
+ */
68
+ export const ASK_GUARD_LIMITS = { maxRemembered: 128 };
69
+ /** How far back a truncation will look for a space before cutting hard. */
70
+ const WORD_BOUNDARY_WINDOW = 12;
71
+ // ---------------------------------------------------------------------------
72
+ // Small pure helpers
73
+ // ---------------------------------------------------------------------------
74
+ function asString(value) {
75
+ return typeof value === 'string' ? value : '';
76
+ }
77
+ function asArray(value) {
78
+ return Array.isArray(value) ? value : [];
79
+ }
80
+ function asRecord(value) {
81
+ return value && typeof value === 'object' && !Array.isArray(value)
82
+ ? value
83
+ : {};
84
+ }
85
+ /**
86
+ * Trim to `max` characters, preferring a word boundary within the last
87
+ * `WORD_BOUNDARY_WINDOW` characters. Cutting a sentence mid-word reads as
88
+ * corruption; cutting it at a space reads as a summary.
89
+ */
90
+ export function clampText(raw, max) {
91
+ const text = asString(raw).trim();
92
+ if (text.length <= max)
93
+ return text;
94
+ const head = text.slice(0, max);
95
+ const space = head.lastIndexOf(' ');
96
+ if (space >= max - WORD_BOUNDARY_WINDOW && space > 0)
97
+ return head.slice(0, space).trimEnd();
98
+ return head.trimEnd();
99
+ }
100
+ /**
101
+ * DROP FIRST, CAP SECOND, and it matters.
102
+ *
103
+ * Capping the raw array first would let blank or duplicate entries consume slots
104
+ * the model meant for real content: a list of 30 paths with two repeats would
105
+ * come back with 28 real ones and no way to tell that anything was lost.
106
+ */
107
+ function nonEmptyStrings(raw, max, dedupe = false) {
108
+ const cleaned = asArray(raw)
109
+ .map((v) => asString(v).trim())
110
+ .filter((s) => s.length > 0);
111
+ return (dedupe ? [...new Set(cleaned)] : cleaned).slice(0, max);
112
+ }
113
+ // ---------------------------------------------------------------------------
114
+ // normalizeQuestions
115
+ // ---------------------------------------------------------------------------
116
+ /**
117
+ * Repair whatever the model sent into something renderable.
118
+ *
119
+ * Returns `[]` when nothing survives, which the tool turns into the one hard
120
+ * failure this path has. Every rule below is reachable precisely BECAUSE the
121
+ * schema stopped declaring the bounds (P0-4); with `minItems` / `maxItems` in
122
+ * the schema, `ajv` rejected the call first and rules 1 and 4 were dead code.
123
+ */
124
+ export function normalizeQuestions(raw) {
125
+ const out = [];
126
+ // Rule 1a: keep the first N questions.
127
+ for (const item of asArray(raw).slice(0, QUESTION_LIMITS.maxQuestions)) {
128
+ const question = normalizeOneQuestion(asRecord(item), out.length);
129
+ if (question)
130
+ out.push(question);
131
+ }
132
+ return out;
133
+ }
134
+ function normalizeOneQuestion(src, index) {
135
+ const text = clampText(src.question, QUESTION_LIMITS.questionChars);
136
+ if (text.length === 0)
137
+ return null;
138
+ // Rule 1b + 1c: at least 2 options, at most 4.
139
+ const rawOptions = asArray(src.options).slice(0, QUESTION_LIMITS.maxOptions);
140
+ const options = [];
141
+ const seen = new Set();
142
+ for (const rawOption of rawOptions) {
143
+ const record = asRecord(rawOption);
144
+ const label = clampText(record.label, QUESTION_LIMITS.labelChars);
145
+ if (label.length === 0)
146
+ continue;
147
+ // Rule 4: deduplicate labels case-insensitively. Two options the user cannot
148
+ // tell apart is worse than one option fewer.
149
+ const key = label.toLowerCase();
150
+ if (seen.has(key))
151
+ continue;
152
+ seen.add(key);
153
+ options.push({
154
+ label,
155
+ description: clampText(record.description, QUESTION_LIMITS.optionDescriptionChars),
156
+ recommended: record.recommended === true,
157
+ isOther: false,
158
+ });
159
+ }
160
+ if (options.length < QUESTION_LIMITS.minOptions)
161
+ return null;
162
+ // Rules 2 and 3: exactly one recommended, always. The recommended option is
163
+ // the wizard's initial highlight, so "none" and "several" are both unusable.
164
+ const firstRecommended = options.findIndex((o) => o.recommended);
165
+ options.forEach((option, i) => {
166
+ option.recommended = i === (firstRecommended === -1 ? 0 : firstRecommended);
167
+ });
168
+ // Rule 5: the synthetic free-text escape hatch, unless the model already
169
+ // supplied something that reads as one.
170
+ if (!options.some((o) => /^other/i.test(o.label))) {
171
+ options.push({ label: OTHER_OPTION_LABEL, description: '', recommended: false, isOther: true });
172
+ }
173
+ else {
174
+ const existing = options.find((o) => /^other/i.test(o.label));
175
+ existing.isOther = true;
176
+ }
177
+ const id = asString(src.id).trim();
178
+ return {
179
+ id: id.length > 0 ? id : `q${index + 1}`,
180
+ header: clampText(src.header, QUESTION_LIMITS.headerChars) || `Q${index + 1}`,
181
+ question: text,
182
+ options,
183
+ allowMultiple: src.allowMultiple === true,
184
+ };
185
+ }
186
+ // ---------------------------------------------------------------------------
187
+ // normalizePlan
188
+ // ---------------------------------------------------------------------------
189
+ /**
190
+ * Repair a submitted plan. Returns `null` only when no step survives — the one
191
+ * hard failure, because there is then nothing left to review.
192
+ *
193
+ * A plan that is one step over the cap is still a plan, and rejecting it costs a
194
+ * full research turn to regain nothing. Truncation is silent to the model but
195
+ * VISIBLE to the user: the review overlay's position indicator counts the real
196
+ * rows, so a clipped plan cannot masquerade as complete.
197
+ */
198
+ export function normalizePlan(raw) {
199
+ const src = asRecord(raw);
200
+ // Same drop-first, cap-second discipline as `nonEmptyStrings`: a blank-titled
201
+ // step is noise, and letting it consume one of the twenty slots would silently
202
+ // discard a real step at the other end.
203
+ const steps = [];
204
+ for (const rawStep of asArray(src.steps)) {
205
+ const record = asRecord(rawStep);
206
+ const title = clampText(record.title, PLAN_LIMITS.stepTitleChars);
207
+ if (title.length === 0)
208
+ continue;
209
+ steps.push({ title, detail: clampText(record.detail, PLAN_LIMITS.stepDetailChars) });
210
+ if (steps.length === PLAN_LIMITS.maxSteps)
211
+ break;
212
+ }
213
+ if (steps.length === 0)
214
+ return null;
215
+ return {
216
+ title: clampText(src.title, PLAN_LIMITS.titleChars) || 'Untitled plan',
217
+ summary: clampText(src.summary, PLAN_LIMITS.summaryChars),
218
+ steps,
219
+ // Exact deduplication, NOT case-insensitive: POSIX paths are case-sensitive
220
+ // and two casings are two files.
221
+ filesTouched: nonEmptyStrings(src.filesTouched, PLAN_LIMITS.maxFiles, true),
222
+ risks: nonEmptyStrings(src.risks, PLAN_LIMITS.maxRisks),
223
+ openQuestions: nonEmptyStrings(src.openQuestions, PLAN_LIMITS.maxOpenQuestions),
224
+ };
225
+ }
226
+ /**
227
+ * A question SET's identity: the question texts, trimmed, lowercased, whitespace
228
+ * collapsed, sorted, joined.
229
+ *
230
+ * `id` and `header` are excluded on purpose — a model that re-asks the same thing
231
+ * under a new id is asking the same thing, and the ids are the model's own
232
+ * bookkeeping rather than part of what the user reads.
233
+ *
234
+ * The fingerprint is stable because `normalizeQuestions` already ran on the TOOL
235
+ * side: header truncation and option trimming cannot make the same question look
236
+ * different here. Worst case is 5 questions x 300 chars = 1,500 chars.
237
+ */
238
+ export function questionFingerprint(questions) {
239
+ return questions
240
+ .map((q) => q.question.trim().toLowerCase().replace(/\s+/g, ' '))
241
+ .sort()
242
+ .join(' | ');
243
+ }
244
+ /**
245
+ * Render the `ask_user` result: one human-readable line so the transcript
246
+ * preview is legible without parsing, then the JSON the model reads.
247
+ *
248
+ * CARRIES NO ROUND COUNTER, deliberately (D-4). The model used to be told
249
+ * `roundsUsed` / `roundsRemaining` on every call, which is a per-turn reminder
250
+ * that it is running out — and an agent that reads "you have 1 round left"
251
+ * behaves like one. There is no limit any more, so there is nothing to report.
252
+ *
253
+ * `asked` is passed separately rather than derived from `answers.length`
254
+ * because a cancelled wizard returns fewer answers than it asked for, and
255
+ * "answered 1 of 3" is the whole information content of that line.
256
+ */
257
+ export function formatAnswersResult(shape, asked) {
258
+ const headline = shape.cancelled
259
+ ? 'User dismissed the questions.'
260
+ : `User answered ${shape.answers.length} of ${asked} questions.`;
261
+ const guidance = shape.cancelled
262
+ ? ' Proceed with your best assumptions and say what you assumed.'
263
+ : '';
264
+ return `${headline}${guidance}\n${JSON.stringify(shape, null, 2)}`;
265
+ }
@@ -0,0 +1,115 @@
1
+ /**
2
+ * Structured file patches (agent-activity-presentation §3.3).
3
+ *
4
+ * PURE, NO I/O, NO REACT, ASCII-ONLY MARKERS. `glyphs.test.ts`'s static scan
5
+ * walks ALL of `src/` (skipping only `__tests__/` and two exempt files), so this
6
+ * module sits inside that guard rail directly rather than by analogy. The
7
+ * substantive reason is the one `reducer.ts` gives for `PREVIEW_TRUNCATION_MARK`:
8
+ * a string produced outside `src/ui/**` has no `TermCapabilities` in scope and
9
+ * must be safe on a legacy `cmd.exe`.
10
+ *
11
+ * The ladder is ANCHORED SPLIT -> BOUNDED LCS -> BLOCK REPLACE, and every
12
+ * recursion path terminates in one of three leaf returns. `blockReplace` is
13
+ * exactly what `renderUnifiedDiff` produced before this round — every old row as
14
+ * `del`, then every new row as `add` — kept as the explicit, bounded fallback so
15
+ * a pathological input degrades to today's behaviour rather than hanging.
16
+ *
17
+ * `buildPatch` is TOTAL: it never throws, for any pair of strings.
18
+ */
19
+ export type PatchLineKind = 'ctx' | 'add' | 'del';
20
+ export interface PatchLine {
21
+ kind: PatchLineKind;
22
+ /** 1-based line number in the OLD file; absent on an `add`. */
23
+ oldLine?: number;
24
+ /** 1-based line number in the NEW file; absent on a `del`. */
25
+ newLine?: number;
26
+ /** Rendered text. A trailing CR is stripped; long lines are truncated. */
27
+ text: string;
28
+ }
29
+ export interface PatchHunk {
30
+ oldStart: number;
31
+ oldCount: number;
32
+ newStart: number;
33
+ newCount: number;
34
+ lines: PatchLine[];
35
+ }
36
+ export interface FilePatch {
37
+ /** As the model wrote it — relative when the call was relative. */
38
+ path: string;
39
+ kind: 'create' | 'update';
40
+ added: number;
41
+ removed: number;
42
+ hunks: PatchHunk[];
43
+ /** Budget was hit; the tail of the change is not in `hunks`. */
44
+ truncated: boolean;
45
+ /**
46
+ * Total rendered rows across every hunk (summary and separators excluded).
47
+ *
48
+ * PRECOMPUTED so `entryRevision` stays O(1) (I-L3-1 forbids hashing, and
49
+ * summing `hunks[].lines.length` per entry per frame is exactly the cost the
50
+ * height cache exists to remove).
51
+ */
52
+ lineCount: number;
53
+ /** Set when the old side could not be read: too large, binary, or unreadable. */
54
+ degraded?: 'binary' | 'too-large' | 'unreadable';
55
+ }
56
+ export declare const PATCH_LIMITS: {
57
+ /**
58
+ * Context rows kept either side of a change, FOR THE UI.
59
+ *
60
+ * The text renderer does NOT use this (D-20): `renderUnifiedDiff` keeps its
61
+ * own `CONTEXT_LINES = 2` default so the model-facing diff does not silently
62
+ * widen by two rows on every single-region edit. One algorithm, two widths,
63
+ * chosen by the caller.
64
+ */
65
+ readonly context: 3;
66
+ /**
67
+ * Hunks separated by this many context rows or fewer are merged into one.
68
+ *
69
+ * MUST STAY `>= 2 * context` FOR EVERY CALLER'S CONTEXT WIDTH, or two adjacent
70
+ * hunks expanded by `context` would overlap and the same row would be rendered
71
+ * twice with two different line numbers. 6 covers both widths in use (3 and 2).
72
+ */
73
+ readonly mergeGap: 6;
74
+ /** Rendered rows a patch may carry, across all hunks. */
75
+ readonly maxLines: 200;
76
+ /** Total characters across all `PatchLine.text`. Mirrors STORED_PREVIEW_CHARS. */
77
+ readonly maxChars: 8000;
78
+ /** A single row is truncated past this, with `TRUNCATION_MARK`. */
79
+ readonly maxLineChars: 500;
80
+ /** Above this cell count the LCS leaf is refused; the segment becomes a block replace. */
81
+ readonly lcsCellBudget: 160000;
82
+ /** Recursion depth ceiling for the anchor split. */
83
+ readonly maxDepth: 32;
84
+ /** Old-side bytes above which `write_file` does not read for a diff. */
85
+ readonly readMaxBytes: number;
86
+ /** Model-facing diff text ceiling — a bound `edit_file` does not have today. */
87
+ readonly modelDiffMaxChars: 4000;
88
+ };
89
+ /**
90
+ * Appended to a row clipped at `maxLineChars`.
91
+ *
92
+ * SPELLED HERE RATHER THAN IMPORTED from `agent/reducer.ts`, so that `tools/`
93
+ * does not take a runtime dependency on the view model for one three-character
94
+ * string. `patch.test.ts` asserts the two spellings are equal, so the pair
95
+ * cannot drift silently — which is the property the import would have bought.
96
+ */
97
+ export declare const TRUNCATION_MARK = "...";
98
+ /** The note emitted when exactly one side ends with a newline. */
99
+ export declare const NO_NEWLINE_NOTE = "(no newline at end of file)";
100
+ export interface BuildPatchOptions {
101
+ /** As the model wrote it; carried onto the patch verbatim. */
102
+ path: string;
103
+ /** Context rows either side of a change. Defaults to `PATCH_LIMITS.context`. */
104
+ context?: number;
105
+ /**
106
+ * Why the old side is `null`.
107
+ *
108
+ * It also decides `kind`: a missing old side with no reason is a CREATE, and a
109
+ * missing old side WITH one is an UPDATE whose old half could not be read. The
110
+ * distinction matters because "created a file" and "overwrote a 5 MB file we
111
+ * declined to read" are different events and the card names them differently.
112
+ */
113
+ degraded?: FilePatch['degraded'];
114
+ }
115
+ export declare function buildPatch(oldText: string | null, newText: string, options: BuildPatchOptions): FilePatch;