@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,54 @@
1
+ /**
2
+ * TodoCard — the transcript checklist entry (todo-plan-execution §6.2;
3
+ * todo-acceptance-criteria §6.10).
4
+ *
5
+ * ASCII ONLY: every glyph comes from `pickGlyphs`.
6
+ *
7
+ * ONE CARD PER USER TURN, REWRITTEN IN PLACE. The rail is EPHEMERAL and this is the
8
+ * HISTORY, exactly as `TeamPanel` and `TeamCard` divide the same work. It renders
9
+ * through the shared `EntryFrame` supplied by `EntryView`, so a plan reads as one
10
+ * more step in the transcript rather than a second kind of object.
11
+ *
12
+ * THE FULL LIST, NO WINDOWING (the transcript scrolls; the rail does not), and
13
+ * NEVER ANIMATED even while `live` — a resumed session would otherwise spin forever
14
+ * on a card whose run ended days ago.
15
+ *
16
+ * THE ACCEPTANCE BLOCK ADDS ROWS, NOT A CARD (§6.10): same frame, same marker
17
+ * column, one block underneath. Only a FAILED criterion gets an evidence line
18
+ * (D-14), which is what keeps the height exactly `1 + items.length + failedCount`.
19
+ */
20
+ import React from 'react';
21
+ import type { Theme } from '../theme.js';
22
+ import type { TermCapabilities } from '../capabilities.js';
23
+ import type { AcceptanceSnapshot, TodoItem } from '../../model/todo/types.js';
24
+ export interface TodoCardProps {
25
+ items: TodoItem[];
26
+ doneCount: number;
27
+ total: number;
28
+ /**
29
+ * The acceptance projection (todo-acceptance-criteria §6.10).
30
+ *
31
+ * OPTIONAL, unlike `TodoSnapshot.acceptance` (P1-4): a `TodoSnapshot` has exactly
32
+ * one writer and can fail closed, while this entry's sources include transcript
33
+ * entries read back from a session file written before the feature existed. A
34
+ * required field there would be typed "present" and be `undefined` at runtime.
35
+ */
36
+ acceptance?: AcceptanceSnapshot | null;
37
+ live: boolean;
38
+ /** Saved mid-run and resumed: the run behind this card died with the process. */
39
+ interrupted?: boolean;
40
+ theme: Theme;
41
+ caps: TermCapabilities;
42
+ }
43
+ /** The card's aggregate colour: complete is done, anything else is in flight. */
44
+ export declare function todoCardColor(doneCount: number, total: number, live: boolean, theme: Theme): string | undefined;
45
+ declare function TodoCardImpl(props: TodoCardProps): React.ReactElement;
46
+ /**
47
+ * `React.memo` with the DEFAULT comparator (tui-render-performance L2 / R3).
48
+ * `mapEntry` already preserves object identity for untouched entries, so the array
49
+ * props below are stable references on a settled card, and `theme` / `caps` are
50
+ * `useMemo`d in `App.tsx` (I-L2-1). `acceptance` is a NEW object whenever a verdict
51
+ * lands and the SAME reference otherwise, which is exactly what the comparator wants.
52
+ */
53
+ export declare const TodoCard: React.MemoExoticComponent<typeof TodoCardImpl>;
54
+ export {};
@@ -0,0 +1,98 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /**
3
+ * TodoCard — the transcript checklist entry (todo-plan-execution §6.2;
4
+ * todo-acceptance-criteria §6.10).
5
+ *
6
+ * ASCII ONLY: every glyph comes from `pickGlyphs`.
7
+ *
8
+ * ONE CARD PER USER TURN, REWRITTEN IN PLACE. The rail is EPHEMERAL and this is the
9
+ * HISTORY, exactly as `TeamPanel` and `TeamCard` divide the same work. It renders
10
+ * through the shared `EntryFrame` supplied by `EntryView`, so a plan reads as one
11
+ * more step in the transcript rather than a second kind of object.
12
+ *
13
+ * THE FULL LIST, NO WINDOWING (the transcript scrolls; the rail does not), and
14
+ * NEVER ANIMATED even while `live` — a resumed session would otherwise spin forever
15
+ * on a card whose run ended days ago.
16
+ *
17
+ * THE ACCEPTANCE BLOCK ADDS ROWS, NOT A CARD (§6.10): same frame, same marker
18
+ * column, one block underneath. Only a FAILED criterion gets an evidence line
19
+ * (D-14), which is what keeps the height exactly `1 + items.length + failedCount`.
20
+ */
21
+ import React from 'react';
22
+ import { Box, Text } from 'ink';
23
+ import { pickGlyphs } from '../glyphs.js';
24
+ import { railBorderProps } from '../layout/Gutter.js';
25
+ import { derivePlanPhase } from '../../model/todo/acceptance.js';
26
+ /** The card's aggregate colour: complete is done, anything else is in flight. */
27
+ export function todoCardColor(doneCount, total, live, theme) {
28
+ if (live)
29
+ return theme.toolRunning;
30
+ if (total > 0 && doneCount === total)
31
+ return theme.toolDone;
32
+ return theme.muted;
33
+ }
34
+ function marker(item, glyphs) {
35
+ if (item.status === 'completed')
36
+ return glyphs.todoDone;
37
+ if (item.status === 'in_progress')
38
+ return glyphs.todoActive;
39
+ return glyphs.todoPending;
40
+ }
41
+ function rowColor(item, theme) {
42
+ if (item.status === 'completed')
43
+ return theme.muted;
44
+ if (item.status === 'in_progress')
45
+ return theme.primary;
46
+ return theme.hintFg ?? theme.muted;
47
+ }
48
+ /** `passed` reuses the done glyph; `failed` is the one new meaning (D-9). */
49
+ function acceptanceMarker(item, glyphs) {
50
+ if (item.status === 'passed')
51
+ return glyphs.todoDone;
52
+ if (item.status === 'failed')
53
+ return glyphs.todoFail;
54
+ if (item.status === 'in_progress')
55
+ return glyphs.todoActive;
56
+ return glyphs.todoPending;
57
+ }
58
+ function acceptanceRowColor(item, theme) {
59
+ if (item.status === 'failed')
60
+ return theme.toolError;
61
+ if (item.status === 'passed')
62
+ return theme.muted;
63
+ if (item.status === 'in_progress')
64
+ return theme.primary;
65
+ return theme.hintFg ?? theme.muted;
66
+ }
67
+ /**
68
+ * All passed reads as done, any failure as an error, otherwise muted; while the run
69
+ * is live and the plan is in VERIFY it reads as running - the same expression family
70
+ * `todoCardColor` uses one level up.
71
+ */
72
+ function acceptanceTitleColor(acceptance, items, live, theme) {
73
+ if (acceptance.failedCount > 0)
74
+ return theme.toolError;
75
+ if (live && derivePlanPhase(items, acceptance.items) === 'verify')
76
+ return theme.toolRunning;
77
+ if (acceptance.total > 0 && acceptance.checkedCount === acceptance.total)
78
+ return theme.toolDone;
79
+ return theme.muted;
80
+ }
81
+ function TodoCardImpl(props) {
82
+ const { items, doneCount, total, acceptance, live, interrupted, theme, caps } = props;
83
+ const glyphs = pickGlyphs(caps);
84
+ const criteria = acceptance && acceptance.total > 0 ? acceptance : null;
85
+ return (_jsxs(Box, { flexDirection: "column", children: [_jsxs(Box, { flexDirection: "row", children: [_jsx(Text, { color: theme.accent, bold: true, children: "Todos" }), _jsxs(Text, { color: todoCardColor(doneCount, total, live, theme), children: [' ', doneCount, "/", total] }), interrupted && (
86
+ // A resumed `2/7` would otherwise read as a run still in flight (P2-6).
87
+ // Saying so plainly is the same fix `TeamCard` makes for a dispatch that
88
+ // never got a duration.
89
+ _jsxs(Text, { color: theme.muted, children: [' ', "interrupted (session resumed)"] }))] }), _jsx(Box, { flexDirection: "column", flexShrink: 0, paddingLeft: 1, ...railBorderProps(glyphs.railVertical, theme.border), children: items.map((item, index) => (_jsxs(Text, { wrap: "truncate", color: rowColor(item, theme), children: [marker(item, glyphs).padEnd(3), item.status === 'in_progress' ? item.activeForm : item.content] }, `${index}-${item.content}`))) }), criteria && (_jsxs(Box, { flexDirection: "column", children: [_jsxs(Text, { wrap: "truncate", children: [_jsx(Text, { color: theme.accent, bold: true, children: "Acceptance" }), _jsxs(Text, { color: acceptanceTitleColor(criteria, items, live, theme), children: [' ', criteria.checkedCount, "/", criteria.total, " checked", criteria.failedCount > 0 ? ` !${criteria.failedCount} failed` : ''] })] }), _jsx(Box, { flexDirection: "column", flexShrink: 0, paddingLeft: 1, ...railBorderProps(glyphs.railVertical, theme.border), children: criteria.items.map((item, index) => (_jsxs(React.Fragment, { children: [_jsxs(Text, { wrap: "truncate", color: acceptanceRowColor(item, theme), children: [acceptanceMarker(item, glyphs).padEnd(3), item.content] }), item.status === 'failed' && item.evidence.length > 0 && (_jsxs(Text, { wrap: "truncate", color: theme.muted, children: [' ', item.evidence] }))] }, `acc-${index}-${item.content}`))) })] }))] }));
90
+ }
91
+ /**
92
+ * `React.memo` with the DEFAULT comparator (tui-render-performance L2 / R3).
93
+ * `mapEntry` already preserves object identity for untouched entries, so the array
94
+ * props below are stable references on a settled card, and `theme` / `caps` are
95
+ * `useMemo`d in `App.tsx` (I-L2-1). `acceptance` is a NEW object whenever a verdict
96
+ * lands and the SAME reference otherwise, which is exactly what the comparator wants.
97
+ */
98
+ export const TodoCard = React.memo(TodoCardImpl);
@@ -0,0 +1,81 @@
1
+ /**
2
+ * Tool-call card (spec §3.5): a per-tool glyph, the tool name, a compact args
3
+ * summary, a colored status badge, and a duration, over a collapsible rich
4
+ * preview delegated to `<ToolPreview>`. Collapsed to the first 8 lines with a
5
+ * `+M lines (Ctrl+O)` footer; `Ctrl+O` / `/expand` toggle the full preview.
6
+ *
7
+ * Two v0.4.0 changes (§4.1 / §4.3):
8
+ * - capabilities arrive as a prop. This used to infer Unicode support by
9
+ * comparing `theme.symbols.gaugeFull` against a literal block character, so
10
+ * editing an unrelated gauge glyph would have silently sent every tool icon
11
+ * back to ASCII;
12
+ * - the preview's round border is gone. It cost 2 rows and 4 columns per card,
13
+ * and nested visibly inside markdown code blocks. A left rail carries the
14
+ * same grouping in 1 column and 0 rows.
15
+ */
16
+ import React from 'react';
17
+ import type { Theme } from '../theme.js';
18
+ import type { TermCapabilities } from '../capabilities.js';
19
+ import type { ToolStatus } from '../../model/agent/reducer.js';
20
+ import type { FilePatch } from '../../model/tools/patch.js';
21
+ interface ToolCardProps {
22
+ name: string;
23
+ label: string;
24
+ argsRaw: string;
25
+ args?: Record<string, unknown>;
26
+ status: ToolStatus;
27
+ preview?: string;
28
+ /**
29
+ * The structured file diff, when the tool produced one (§3.4). Present it and
30
+ * `DiffView` draws INSTEAD of `ToolPreview`; absent — a session saved by an
31
+ * older build, an entry the store's 64-write ring evicted, or a toolset built
32
+ * without a recorder — and the text preview renders exactly what it does
33
+ * today. Nothing ever renders blank.
34
+ */
35
+ patch?: FilePatch;
36
+ durationMs?: number;
37
+ isError?: boolean;
38
+ expanded?: boolean;
39
+ reducedMotion?: boolean;
40
+ /**
41
+ * The sanitised live tail while the tool runs
42
+ * (agent-activity-presentation-live §3.3.4).
43
+ *
44
+ * PASSED AS `live={entry.live}` AND NEVER `live={entry.live ?? []}` (P2-4).
45
+ * This component is `React.memo` with the DEFAULT comparator, so a fresh `[]`
46
+ * per render is a changed prop and defeats the boundary for every settled card
47
+ * in the transcript — which is exactly why `EMPTY_LINES` above exists.
48
+ */
49
+ live?: readonly string[];
50
+ /** Epoch ms of the last output row; with `nowSec`, the stall row's clock. */
51
+ lastOutputAt?: number;
52
+ /**
53
+ * Wall-clock SECONDS, passed ONLY to running entries (D-29 / D-36).
54
+ *
55
+ * Seconds and not milliseconds, and `undefined` on every other card, for the
56
+ * same reason: a prop that changed five times a second on every entry would
57
+ * defeat this memo boundary transcript-wide. The value is wall-clock rather
58
+ * than the ticker's `elapsedMs` because the stall is `now - lastOutputAt` and
59
+ * `lastOutputAt` is epoch ms; the ticker's job is to cause the render.
60
+ */
61
+ nowSec?: number;
62
+ theme: Theme;
63
+ caps: TermCapabilities;
64
+ }
65
+ export declare function statusColor(status: ToolStatus, theme: Theme): string | undefined;
66
+ /** The tool's own glyph, used by `EntryView` as the entry's rail marker. */
67
+ export declare function toolEntryGlyph(name: string, caps: TermCapabilities): string;
68
+ declare function ToolCardImpl(props: ToolCardProps): React.ReactElement;
69
+ /**
70
+ * `React.memo` with the DEFAULT comparator (tui-render-performance L2 / R3).
71
+ * Every prop is a scalar except `args` (a stable reference on a settled entry),
72
+ * `patch` and `theme` / `caps` (both `useMemo`d in `App.tsx` — I-L2-1).
73
+ *
74
+ * `patch` QUALIFIES ONLY BECAUSE THE REDUCER WRITES IT ONCE, at `toolExecEnd`,
75
+ * and never rebuilds it — `mapEntry` preserves object identity for untouched
76
+ * entries. A future action that recomputed or normalized a patch would turn this
77
+ * boundary into a no-op WITH NOTHING FAILING, which is the same trap I-L2-1
78
+ * exists to catch for `theme` and `caps` (P2-9).
79
+ */
80
+ export declare const ToolCard: React.MemoExoticComponent<typeof ToolCardImpl>;
81
+ export {};
@@ -0,0 +1,169 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ /**
3
+ * Tool-call card (spec §3.5): a per-tool glyph, the tool name, a compact args
4
+ * summary, a colored status badge, and a duration, over a collapsible rich
5
+ * preview delegated to `<ToolPreview>`. Collapsed to the first 8 lines with a
6
+ * `+M lines (Ctrl+O)` footer; `Ctrl+O` / `/expand` toggle the full preview.
7
+ *
8
+ * Two v0.4.0 changes (§4.1 / §4.3):
9
+ * - capabilities arrive as a prop. This used to infer Unicode support by
10
+ * comparing `theme.symbols.gaugeFull` against a literal block character, so
11
+ * editing an unrelated gauge glyph would have silently sent every tool icon
12
+ * back to ASCII;
13
+ * - the preview's round border is gone. It cost 2 rows and 4 columns per card,
14
+ * and nested visibly inside markdown code blocks. A left rail carries the
15
+ * same grouping in 1 column and 0 rows.
16
+ */
17
+ import React from 'react';
18
+ import { Box, Text } from 'ink';
19
+ import Spinner from 'ink-spinner';
20
+ import { pickGlyphs, toolGlyph } from '../glyphs.js';
21
+ import { railBorderProps } from '../layout/Gutter.js';
22
+ import { splitLinesCached } from '../render-cache.js';
23
+ import { formatDuration } from '../../model/agent/usage.js';
24
+ import { ToolPreview, bashBadge } from './ToolPreview.js';
25
+ import { DiffView } from './DiffView.js';
26
+ import { STALL_AFTER_MS } from '../../model/tools/tool-output-store.js';
27
+ import { shortDuration } from '../layout/status-layout.js';
28
+ /** Number of preview lines shown before collapse. */
29
+ const COLLAPSED_LINES = 8;
30
+ /** Shared empty slice, so an argument-less card allocates nothing per frame. */
31
+ const EMPTY_LINES = [];
32
+ export function statusColor(status, theme) {
33
+ switch (status) {
34
+ case 'pending':
35
+ return theme.toolPending;
36
+ case 'running':
37
+ return theme.toolRunning;
38
+ case 'done':
39
+ return theme.toolDone;
40
+ case 'error':
41
+ return theme.toolError;
42
+ }
43
+ }
44
+ /** One-line summary of the tool arguments for the card header. */
45
+ function summarizeArgs(name, ellipsis, args, argsRaw, midDot = '-') {
46
+ if (args) {
47
+ // `t3 - up to 10m00s` reads better in the settled history row than
48
+ // `job=t3 timeoutSeconds=600` (extended-job-wait P2). Needs both fields.
49
+ if (name === 'job_wait' && typeof args.job === 'string') {
50
+ const seconds = args.timeoutSeconds;
51
+ return typeof seconds === 'number' && Number.isFinite(seconds) && seconds > 0
52
+ ? `${args.job} ${midDot} up to ${shortDuration(seconds * 1000)}`
53
+ : args.job;
54
+ }
55
+ if (name === 'bash' && typeof args.command === 'string')
56
+ return args.command;
57
+ if (typeof args.path === 'string')
58
+ return args.path;
59
+ if (typeof args.pattern === 'string')
60
+ return args.pattern;
61
+ const keys = Object.keys(args);
62
+ if (keys.length > 0)
63
+ return keys.map((k) => `${k}=${short(args[k], ellipsis)}`).join(' ');
64
+ }
65
+ return (argsRaw ?? '').slice(0, 60);
66
+ }
67
+ function short(v, ellipsis) {
68
+ const s = typeof v === 'string' ? v : JSON.stringify(v);
69
+ return s.length > 40 ? `${s.slice(0, 40)}${ellipsis}` : s;
70
+ }
71
+ /** The badge label shown to the right of the tool name. */
72
+ function badgeLabel(name, status, preview) {
73
+ if (name === 'bash' && (status === 'done' || status === 'error')) {
74
+ return bashBadge(status, preview).text;
75
+ }
76
+ switch (status) {
77
+ case 'pending':
78
+ return 'queued';
79
+ case 'running':
80
+ return 'running';
81
+ case 'done':
82
+ return 'done';
83
+ case 'error':
84
+ return 'failed';
85
+ }
86
+ }
87
+ /** The tool's own glyph, used by `EntryView` as the entry's rail marker. */
88
+ export function toolEntryGlyph(name, caps) {
89
+ return toolGlyph(pickGlyphs(caps), name);
90
+ }
91
+ function ToolCardImpl(props) {
92
+ const { name, argsRaw, args, status, preview, patch, durationMs, isError, expanded, reducedMotion, live, lastOutputAt, nowSec, theme, caps, } = props;
93
+ const glyphs = pickGlyphs(caps);
94
+ const color = statusColor(status, theme);
95
+ const previewText = preview ?? '';
96
+ // `splitLinesCached` rather than `previewText.split('\n')`: a stored preview
97
+ // is immutable once written, and this used to reallocate up to 200 strings per
98
+ // card per frame (R3).
99
+ const previewLines = previewText.length > 0 ? splitLinesCached(previewText) : EMPTY_LINES;
100
+ const ceiling = expanded ? previewLines.length : COLLAPSED_LINES;
101
+ const visibleLines = ceiling >= previewLines.length ? previewLines : previewLines.slice(0, ceiling);
102
+ const hidden = previewLines.length - visibleLines.length;
103
+ const settled = status === 'done' || status === 'error';
104
+ const showPatch = !!patch && settled;
105
+ // The live tail (agent-activity-presentation-live §3.3.4). `expanded` is
106
+ // deliberately ABSENT from this arithmetic: `Ctrl+O` is inert on a live card
107
+ // (D-26), because expansion is a promise about STORED content and the store
108
+ // deliberately holds eight rows. A key that silently does nothing is better
109
+ // than a key that promises the rest of a 400 MB stream.
110
+ //
111
+ // THE TAIL IS THE **LAST** ROWS, and the settled preview above keeps its
112
+ // head-first slice (E-21). Two different ends because they answer two
113
+ // different questions — "what did this command do" versus "what is it doing
114
+ // NOW" (D-25). Head-first while live would freeze on the first eight lines a
115
+ // build ever printed and then never change again.
116
+ const liveRows = live ?? EMPTY_LINES;
117
+ const liveCeiling = COLLAPSED_LINES;
118
+ const visibleLive = liveRows.length > liveCeiling ? liveRows.slice(-Math.max(1, liveCeiling)) : liveRows;
119
+ const showLive = !settled && visibleLive.length > 0;
120
+ // THE OUTER GUARD WIDENS WITH THE BRANCH (P2-2). It was `previewLines.length >
121
+ // 0 && ...`, and the reducer now truncates the stored preview to ONE LINE when
122
+ // a patch is attached (D-19) — so a card whose preview were ever empty would
123
+ // render its header and swallow the diff, silently. It widens a second time
124
+ // here, for the third branch: without `|| showLive` the tail would be computed
125
+ // and never drawn.
126
+ const showBody = ((previewLines.length > 0 || showPatch) && settled) || showLive;
127
+ // ONE FOOTER ROW, ALWAYS, matching `estimateEntryRows`'s arithmetic exactly: a
128
+ // CONSTANT row count is what lets the estimate be exact rather than an upper
129
+ // bound. `nowSec` is absent until the first tick, which reads as "not stalled".
130
+ const stalledFor = nowSec !== undefined && lastOutputAt !== undefined
131
+ ? nowSec * 1000 - lastOutputAt
132
+ : 0;
133
+ const liveFooter = stalledFor >= STALL_AFTER_MS
134
+ ? `no output for ${Math.floor(stalledFor / 1000)}s`
135
+ : '(running)';
136
+ const badge = status === 'running' && !reducedMotion && caps.unicode ? (_jsxs(Text, { color: color, children: [_jsx(Spinner, { type: "dots" }), " running"] })) : (_jsxs(Text, { color: color, children: [status === 'running' ? `${glyphs.spinnerStill} ` : '', badgeLabel(name, status, previewText)] }));
137
+ return (_jsxs(Box, { flexDirection: "column", children: [_jsxs(Box, { flexDirection: "row", children: [_jsx(Text, { color: theme.accent, bold: true, children: name }), _jsxs(Text, { color: theme.muted, children: [" ", summarizeArgs(name, glyphs.ellipsis, args, argsRaw, glyphs.midDot), " "] }), badge, durationMs !== undefined && (_jsxs(Text, { color: theme.muted, children: [" (", formatDuration(durationMs), ")"] }))] }), showBody && (_jsx(Box, { flexDirection: "column", flexShrink: 0, paddingLeft: 1, ...railBorderProps(glyphs.railVertical, isError ? theme.toolError : theme.border), children: showLive ? (_jsxs(_Fragment, { children: [visibleLive.map((row, i) => (
138
+ // The row is already terminal-safe and clipped at
139
+ // `LIVE_ROW_MAX_CHARS` by `sanitizeChunk`, so `wrap="truncate"`
140
+ // is an exact height rather than a hope — which is the coupling
141
+ // `estimateEntryRows`'s live branch relies on.
142
+ //
143
+ // The index IS the key: these rows are positional slots in a
144
+ // ring, not identities, and the whole array is replaced on every
145
+ // chunk anyway.
146
+ //
147
+ // AN EMPTY ROW RENDERS AS A SPACE, and that is not cosmetic:
148
+ // Ink measures a `<Text>` with an empty child as ZERO rows, so a
149
+ // blank separator line — which `npm test`, `cargo` and every
150
+ // build tool print — would make the card shorter than
151
+ // `estimateEntryRows` charged for it. That is an over-estimate,
152
+ // the safe direction, but it would quietly cost §3.3.4's
153
+ // "constant row count" the exactness its arithmetic claims. A
154
+ // space is also what the terminal itself shows for a blank line.
155
+ // eslint-disable-next-line react/no-array-index-key
156
+ _jsx(Text, { wrap: "truncate", color: theme.muted, children: row.length > 0 ? row : ' ' }, i))), _jsx(Text, { color: theme.muted, children: liveFooter })] })) : showPatch ? (_jsx(DiffView, { patch: patch, expanded: expanded, theme: theme })) : (_jsxs(_Fragment, { children: [_jsx(ToolPreview, { name: name, lines: visibleLines, theme: theme, isError: isError }), !expanded && hidden > 0 && (_jsxs(Text, { color: theme.muted, children: ["+", hidden, " ", hidden === 1 ? 'line' : 'lines', " (Ctrl+O)"] })), expanded && hidden > 0 && (_jsxs(Text, { color: theme.muted, children: ["+", hidden, " ", hidden === 1 ? 'line' : 'lines', " ", glyphs.midDot, " shown in full when this entry finishes"] })), expanded && previewLines.length > COLLAPSED_LINES && (_jsx(Text, { color: theme.muted, children: "(Ctrl+O to collapse)" }))] })) }))] }));
157
+ }
158
+ /**
159
+ * `React.memo` with the DEFAULT comparator (tui-render-performance L2 / R3).
160
+ * Every prop is a scalar except `args` (a stable reference on a settled entry),
161
+ * `patch` and `theme` / `caps` (both `useMemo`d in `App.tsx` — I-L2-1).
162
+ *
163
+ * `patch` QUALIFIES ONLY BECAUSE THE REDUCER WRITES IT ONCE, at `toolExecEnd`,
164
+ * and never rebuilds it — `mapEntry` preserves object identity for untouched
165
+ * entries. A future action that recomputed or normalized a patch would turn this
166
+ * boundary into a no-op WITH NOTHING FAILING, which is the same trap I-L2-1
167
+ * exists to catch for `theme` and `caps` (P2-9).
168
+ */
169
+ export const ToolCard = React.memo(ToolCardImpl);
@@ -0,0 +1,59 @@
1
+ /**
2
+ * Per-tool rich preview (spec §3.5). Selects a renderer by tool name: colored
3
+ * unified diffs (`edit_file`), a byte/path summary (`write_file`), a dimmed
4
+ * line-number gutter (`read_file`), a status-authoritative exit badge with a
5
+ * best-effort footer parse (`bash`), a dir/file/size listing (`list_dir`), a
6
+ * flat path list (`glob`), and a plain fallback (`grep` / default).
7
+ *
8
+ * The classification helpers are pure and exported so they are unit-testable
9
+ * without Ink.
10
+ */
11
+ import React from 'react';
12
+ import type { Theme } from '../theme.js';
13
+ import { type ToolStatus } from '../../model/agent/reducer.js';
14
+ export type DiffClass = 'add' | 'remove' | 'meta' | 'context';
15
+ /**
16
+ * Classify a unified-diff line. Meta prefixes (`@@`, `---`, `+++`) are tested
17
+ * FIRST so a `--- path` header is not mis-read as a single-char removal (P2-8);
18
+ * the `Applied edit to <path>:` lead-in falls through to `context`.
19
+ */
20
+ export declare function classifyDiffLine(line: string): DiffClass;
21
+ /**
22
+ * Derive the bash badge. The exit status is authoritative (the tool returns an
23
+ * error result iff the exit code is non-zero), so the label is `exit 0` /
24
+ * `failed` from `status`; a real `[exit code N]` / `[signal X]` last line is
25
+ * parsed best-effort for the exact number, falling back to the status label
26
+ * when the footer was truncated out of the stored preview (P1-2).
27
+ */
28
+ export declare function bashBadge(status: ToolStatus, preview: string): {
29
+ text: string;
30
+ ok: boolean;
31
+ };
32
+ /** Parse the real `Wrote <n> bytes to <path>` result — bytes+path only (P2-7). */
33
+ export declare function parseWriteFile(text: string): {
34
+ bytes: number;
35
+ path: string;
36
+ } | null;
37
+ /** `3 questions · Postgres · REST` — or `dismissed`. */
38
+ export declare function summarizeAskUser(lines: readonly string[]): string | null;
39
+ export interface ListRow {
40
+ kind: 'dir' | 'file';
41
+ name: string;
42
+ size?: string;
43
+ }
44
+ /** Parse a real `list_dir` row (`dir <name>/` / `file <name> (<n>b)`) (P2-9). */
45
+ export declare function parseListRow(line: string): ListRow | null;
46
+ /**
47
+ * No `caps` here on purpose. The only glyph this component ever spelled was the
48
+ * preview truncation marker, and that now comes from the constant its producer
49
+ * writes (`PREVIEW_TRUNCATION_MARK`), so there is nothing left to degrade — and
50
+ * a prop no body reads is exactly the kind of dead weight the last round removed.
51
+ */
52
+ interface ToolPreviewProps {
53
+ name: string;
54
+ lines: readonly string[];
55
+ theme: Theme;
56
+ isError?: boolean;
57
+ }
58
+ export declare function ToolPreview({ name, lines, theme, isError }: ToolPreviewProps): React.ReactElement;
59
+ export {};