@oh-my-pi/pi-tui 18.2.4 → 18.2.6

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 (748) hide show
  1. package/CHANGELOG.md +23 -0
  2. package/README.md +43 -0
  3. package/dist/types/app-keybindings.d.ts +395 -0
  4. package/dist/types/apps/autoresearch-dashboard.d.ts +43 -0
  5. package/dist/types/apps/autoresearch-data.d.ts +15 -0
  6. package/dist/types/apps/cleanse-board.d.ts +66 -0
  7. package/dist/types/apps/cleanse-picker.d.ts +23 -0
  8. package/dist/types/apps/debug/log-formatting.d.ts +6 -0
  9. package/dist/types/apps/debug/log-viewer.d.ts +81 -0
  10. package/dist/types/apps/debug/protocol-probe.d.ts +42 -0
  11. package/dist/types/apps/debug/raw-sse-buffer.d.ts +58 -0
  12. package/dist/types/apps/debug/raw-sse.d.ts +26 -0
  13. package/dist/types/apps/debug/terminal-info.d.ts +34 -0
  14. package/dist/types/apps/debug/viewer-frame.d.ts +52 -0
  15. package/dist/types/apps/git/avatar.d.ts +9 -0
  16. package/dist/types/apps/git/colors.d.ts +49 -0
  17. package/dist/types/apps/git/diff-pane.d.ts +188 -0
  18. package/dist/types/apps/git/git-tui.d.ts +66 -0
  19. package/dist/types/apps/git/sidebar.d.ts +149 -0
  20. package/dist/types/apps/git/state.d.ts +117 -0
  21. package/dist/types/apps/if-bench-board.d.ts +75 -0
  22. package/dist/types/apps/live-visualizer.d.ts +33 -0
  23. package/dist/types/apps/ps-data.d.ts +51 -0
  24. package/dist/types/apps/ps-top.d.ts +33 -0
  25. package/dist/types/apps/session-picker.d.ts +26 -0
  26. package/dist/types/apps/setup-model-picker.d.ts +13 -0
  27. package/dist/types/apps/standalone-picker.d.ts +42 -0
  28. package/dist/types/autocomplete.d.ts +4 -0
  29. package/dist/types/chat/advisor-message.d.ts +11 -0
  30. package/dist/types/chat/assistant-message.d.ts +106 -0
  31. package/dist/types/chat/background-tan-message.d.ts +9 -0
  32. package/dist/types/chat/bash-execution.d.ts +47 -0
  33. package/dist/types/chat/cache-invalidation-marker.d.ts +50 -0
  34. package/dist/types/chat/chat-transcript-builder.d.ts +50 -0
  35. package/dist/types/chat/collab-prompt-message.d.ts +10 -0
  36. package/dist/types/chat/compaction-summary-message.d.ts +54 -0
  37. package/dist/types/chat/custom-message.d.ts +10 -0
  38. package/dist/types/chat/display-preferences.d.ts +13 -0
  39. package/dist/types/chat/eval-execution.d.ts +29 -0
  40. package/dist/types/chat/execution-shared.d.ts +51 -0
  41. package/dist/types/chat/extension-types.d.ts +28 -0
  42. package/dist/types/chat/hook-message.d.ts +10 -0
  43. package/dist/types/chat/image-loading.d.ts +46 -0
  44. package/dist/types/chat/late-diagnostics-message.d.ts +21 -0
  45. package/dist/types/chat/messages.d.ts +189 -0
  46. package/dist/types/chat/reaction.d.ts +30 -0
  47. package/dist/types/chat/read-target.d.ts +4 -0
  48. package/dist/types/chat/read-tool-group.d.ts +67 -0
  49. package/dist/types/chat/served-model-marker.d.ts +47 -0
  50. package/dist/types/chat/skill-message.d.ts +33 -0
  51. package/dist/types/chat/skill-title-input.d.ts +14 -0
  52. package/dist/types/chat/stripped-tool-calls-placeholder.d.ts +12 -0
  53. package/dist/types/chat/thinking-display.d.ts +12 -0
  54. package/dist/types/chat/todo-reminder.d.ts +13 -0
  55. package/dist/types/chat/tool-execution.d.ts +138 -0
  56. package/dist/types/chat/transcript-browser.d.ts +93 -0
  57. package/dist/types/chat/transcript-entry.d.ts +45 -0
  58. package/dist/types/chat/transcript-outline.d.ts +86 -0
  59. package/dist/types/chat/transcript-render-helpers.d.ts +92 -0
  60. package/dist/types/chat/ttsr-notification.d.ts +23 -0
  61. package/dist/types/chat/user-message.d.ts +52 -0
  62. package/dist/types/chrome/chat-block.d.ts +64 -0
  63. package/dist/types/chrome/collab-qrcode.d.ts +28 -0
  64. package/dist/types/chrome/context-thresholds.d.ts +10 -0
  65. package/dist/types/chrome/countdown-timer.d.ts +14 -0
  66. package/dist/types/chrome/diff.d.ts +14 -0
  67. package/dist/types/chrome/dynamic-border.d.ts +16 -0
  68. package/dist/types/chrome/error-block.d.ts +17 -0
  69. package/dist/types/chrome/form-theme.d.ts +3 -0
  70. package/dist/types/chrome/format.d.ts +12 -0
  71. package/dist/types/chrome/index.d.ts +20 -0
  72. package/dist/types/chrome/keybinding-hints.d.ts +40 -0
  73. package/dist/types/chrome/live-board.d.ts +23 -0
  74. package/dist/types/chrome/local-date.d.ts +4 -0
  75. package/dist/types/chrome/message-divider.d.ts +22 -0
  76. package/dist/types/chrome/message-frame.d.ts +52 -0
  77. package/dist/types/chrome/message-notice.d.ts +35 -0
  78. package/dist/types/chrome/overlay-box.d.ts +74 -0
  79. package/dist/types/chrome/qrcode.d.ts +48 -0
  80. package/dist/types/chrome/segment-track.d.ts +27 -0
  81. package/dist/types/chrome/select-list-mouse-routing.d.ts +4 -0
  82. package/dist/types/chrome/selector-helpers.d.ts +52 -0
  83. package/dist/types/chrome/shared.d.ts +5 -0
  84. package/dist/types/chrome/streaming-panel.d.ts +19 -0
  85. package/dist/types/chrome/tool-activity.d.ts +17 -0
  86. package/dist/types/chrome/transcript-container.d.ts +129 -0
  87. package/dist/types/chrome/transcript-status.d.ts +12 -0
  88. package/dist/types/chrome/visual-truncate.d.ts +19 -0
  89. package/dist/types/components/disclosure.d.ts +42 -0
  90. package/dist/types/components/form.d.ts +130 -0
  91. package/dist/types/components/key-value-list.d.ts +24 -0
  92. package/dist/types/components/layout/geometry.d.ts +73 -0
  93. package/dist/types/components/layout/row.d.ts +55 -0
  94. package/dist/types/components/layout/split-pane.d.ts +80 -0
  95. package/dist/types/components/layout/stack.d.ts +50 -0
  96. package/dist/types/components/menu-selection.d.ts +71 -0
  97. package/dist/types/components/metric.d.ts +44 -0
  98. package/dist/types/components/progress-bar.d.ts +36 -0
  99. package/dist/types/components/scroll-view.d.ts +53 -19
  100. package/dist/types/components/scroll-viewport.d.ts +46 -0
  101. package/dist/types/components/section.d.ts +19 -0
  102. package/dist/types/components/select-list.d.ts +46 -2
  103. package/dist/types/components/settings-list.d.ts +20 -0
  104. package/dist/types/components/table.d.ts +32 -0
  105. package/dist/types/components/tree-view.d.ts +130 -0
  106. package/dist/types/components/wizard-step.d.ts +60 -0
  107. package/dist/types/hotkeys-markdown.d.ts +7 -0
  108. package/dist/types/index.d.ts +17 -0
  109. package/dist/types/keybinding-matchers.d.ts +35 -0
  110. package/dist/types/keys.d.ts +2 -2
  111. package/dist/types/lang-from-path.d.ts +9 -0
  112. package/dist/types/overlays/advisor-config.d.ts +114 -0
  113. package/dist/types/overlays/agent-activity.d.ts +41 -0
  114. package/dist/types/overlays/agent-hub-projection.d.ts +33 -0
  115. package/dist/types/overlays/agent-hub-renderer.d.ts +53 -0
  116. package/dist/types/overlays/agent-hub-types.d.ts +99 -0
  117. package/dist/types/overlays/agent-hub.d.ts +126 -0
  118. package/dist/types/overlays/agent-transcript-viewer.d.ts +71 -0
  119. package/dist/types/overlays/agents-hub.d.ts +72 -0
  120. package/dist/types/overlays/ask-dialog.d.ts +88 -0
  121. package/dist/types/overlays/bordered-loader.d.ts +11 -0
  122. package/dist/types/overlays/btw-history-panel.d.ts +29 -0
  123. package/dist/types/overlays/btw-history.d.ts +17 -0
  124. package/dist/types/overlays/btw-panel.d.ts +26 -0
  125. package/dist/types/overlays/cleanse-panel.d.ts +36 -0
  126. package/dist/types/overlays/codex-reset-fireworks.d.ts +52 -0
  127. package/dist/types/overlays/composer-shape-preview.d.ts +47 -0
  128. package/dist/types/overlays/composer-shape-registry.d.ts +50 -0
  129. package/dist/types/overlays/copy-selector.d.ts +48 -0
  130. package/dist/types/overlays/copy-targets.d.ts +63 -0
  131. package/dist/types/overlays/error-banner.d.ts +13 -0
  132. package/dist/types/overlays/extensions/display-text.d.ts +10 -0
  133. package/dist/types/overlays/extensions/extension-dashboard.d.ts +63 -0
  134. package/dist/types/overlays/extensions/extension-list.d.ts +54 -0
  135. package/dist/types/overlays/extensions/inspector-model.d.ts +109 -0
  136. package/dist/types/overlays/extensions/inspector-panel.d.ts +17 -0
  137. package/dist/types/overlays/extensions/live-tool-session.d.ts +28 -0
  138. package/dist/types/overlays/extensions/mcp-runtime.d.ts +107 -0
  139. package/dist/types/overlays/extensions/state-manager.d.ts +42 -0
  140. package/dist/types/overlays/extensions/types.d.ts +165 -0
  141. package/dist/types/overlays/history-search.d.ts +16 -0
  142. package/dist/types/overlays/hook-editor.d.ts +44 -0
  143. package/dist/types/overlays/hook-input.d.ts +20 -0
  144. package/dist/types/overlays/hook-selector.d.ts +71 -0
  145. package/dist/types/overlays/hub-frame.d.ts +77 -0
  146. package/dist/types/overlays/login-dialog.d.ts +43 -0
  147. package/dist/types/overlays/logout-account-selector.d.ts +15 -0
  148. package/dist/types/overlays/mcp-add-wizard.d.ts +87 -0
  149. package/dist/types/overlays/model-browser.d.ts +213 -0
  150. package/dist/types/overlays/model-hub.d.ts +72 -0
  151. package/dist/types/overlays/model-picker.d.ts +74 -0
  152. package/dist/types/overlays/model-selector.d.ts +52 -0
  153. package/dist/types/overlays/move-overlay.d.ts +39 -0
  154. package/dist/types/overlays/oauth-selector.d.ts +41 -0
  155. package/dist/types/overlays/omfg-panel.d.ts +20 -0
  156. package/dist/types/overlays/pause-screen.d.ts +43 -0
  157. package/dist/types/overlays/plan-review-overlay.d.ts +89 -0
  158. package/dist/types/overlays/plan-save-overlay.d.ts +19 -0
  159. package/dist/types/overlays/plan-toc.d.ts +41 -0
  160. package/dist/types/overlays/plugin-selector.d.ts +28 -0
  161. package/dist/types/overlays/plugin-settings.d.ts +180 -0
  162. package/dist/types/overlays/queue-mode-selector.d.ts +11 -0
  163. package/dist/types/overlays/reset-usage-selector.d.ts +23 -0
  164. package/dist/types/overlays/rewind-selector.d.ts +61 -0
  165. package/dist/types/overlays/running-subagent-badge.d.ts +6 -0
  166. package/dist/types/overlays/session-account-selector.d.ts +24 -0
  167. package/dist/types/overlays/session-info-overlay.d.ts +17 -0
  168. package/dist/types/overlays/session-observer-registry.d.ts +77 -0
  169. package/dist/types/overlays/session-selector.d.ts +131 -0
  170. package/dist/types/overlays/settings-defs.d.ts +119 -0
  171. package/dist/types/overlays/settings-selector.d.ts +73 -0
  172. package/dist/types/overlays/show-images-selector.d.ts +11 -0
  173. package/dist/types/overlays/snapcompact-shape-preview.d.ts +31 -0
  174. package/dist/types/overlays/theme-selector.d.ts +12 -0
  175. package/dist/types/overlays/thinking-selector.d.ts +12 -0
  176. package/dist/types/overlays/tiny-title-download-progress.d.ts +21 -0
  177. package/dist/types/overlays/tree-selector.d.ts +92 -0
  178. package/dist/types/overlays/usage-dashboard.d.ts +94 -0
  179. package/dist/types/overlays/usage-display.d.ts +5 -0
  180. package/dist/types/overlays/usage-row.d.ts +17 -0
  181. package/dist/types/prompt/attachment-chips.d.ts +19 -0
  182. package/dist/types/prompt/composer-attachments.d.ts +71 -0
  183. package/dist/types/prompt/composer-cache.d.ts +37 -0
  184. package/dist/types/prompt/composer.d.ts +159 -0
  185. package/dist/types/prompt/custom-editor.d.ts +261 -0
  186. package/dist/types/prompt/editor-top-gap.d.ts +18 -0
  187. package/dist/types/prompt/emoji-autocomplete.d.ts +16 -0
  188. package/dist/types/prompt/github-ref-autocomplete.d.ts +35 -0
  189. package/dist/types/prompt/gradient-highlight.d.ts +32 -0
  190. package/dist/types/prompt/image-format.d.ts +4 -0
  191. package/dist/types/prompt/image-references.d.ts +26 -0
  192. package/dist/types/prompt/interactive-context-helpers.d.ts +43 -0
  193. package/dist/types/prompt/internal-url-autocomplete.d.ts +56 -0
  194. package/dist/types/prompt/macos-spelling.d.ts +44 -0
  195. package/dist/types/prompt/magic-keyword-boundary.d.ts +9 -0
  196. package/dist/types/prompt/magic-keywords.d.ts +26 -0
  197. package/dist/types/prompt/markdown-prose.d.ts +15 -0
  198. package/dist/types/prompt/model-mention-autocomplete.d.ts +25 -0
  199. package/dist/types/prompt/model-mention-syntax.d.ts +24 -0
  200. package/dist/types/prompt/orchestrate.d.ts +13 -0
  201. package/dist/types/prompt/prompt-action-autocomplete.d.ts +56 -0
  202. package/dist/types/prompt/queue-input.d.ts +8 -0
  203. package/dist/types/prompt/skill-tokens.d.ts +13 -0
  204. package/dist/types/prompt/tools-markdown.d.ts +12 -0
  205. package/dist/types/prompt/ultrathink.d.ts +13 -0
  206. package/dist/types/prompt/usage-amounts.d.ts +26 -0
  207. package/dist/types/prompt/video.d.ts +18 -0
  208. package/dist/types/prompt/welcome.d.ts +83 -0
  209. package/dist/types/prompt/workflow.d.ts +13 -0
  210. package/dist/types/render/code-cell.d.ts +51 -0
  211. package/dist/types/render/file-list.d.ts +22 -0
  212. package/dist/types/render/hyperlink.d.ts +80 -0
  213. package/dist/types/render/index.d.ts +16 -0
  214. package/dist/types/render/output-block.d.ts +54 -0
  215. package/dist/types/render/output-pane.d.ts +80 -0
  216. package/dist/types/render/render-utils.d.ts +312 -0
  217. package/dist/types/render/sixel.d.ts +21 -0
  218. package/dist/types/render/status-line.d.ts +23 -0
  219. package/dist/types/render/tool-card.d.ts +71 -0
  220. package/dist/types/render/tree-list.d.ts +29 -0
  221. package/dist/types/render/types.d.ts +17 -0
  222. package/dist/types/render/utils.d.ts +43 -0
  223. package/dist/types/render/width-aware-text.d.ts +23 -0
  224. package/dist/types/setup/lazy.d.ts +3 -0
  225. package/dist/types/setup/scenes/composer.d.ts +3 -0
  226. package/dist/types/setup/scenes/glyph.d.ts +3 -0
  227. package/dist/types/setup/scenes/model.d.ts +3 -0
  228. package/dist/types/setup/scenes/outro.d.ts +2 -0
  229. package/dist/types/setup/scenes/providers.d.ts +3 -0
  230. package/dist/types/setup/scenes/sign-in.d.ts +21 -0
  231. package/dist/types/setup/scenes/splash.d.ts +11 -0
  232. package/dist/types/setup/scenes/theme.d.ts +3 -0
  233. package/dist/types/setup/scenes/types.d.ts +110 -0
  234. package/dist/types/setup/scenes/web-search.d.ts +22 -0
  235. package/dist/types/setup/setup-version.d.ts +11 -0
  236. package/dist/types/setup/startup-splash.d.ts +9 -0
  237. package/dist/types/setup/wizard-overlay.d.ts +16 -0
  238. package/dist/types/setup/wizard.d.ts +25 -0
  239. package/dist/types/status-line/component.d.ts +182 -0
  240. package/dist/types/status-line/context-usage.d.ts +156 -0
  241. package/dist/types/status-line/footer.d.ts +30 -0
  242. package/dist/types/status-line/git-utils.d.ts +22 -0
  243. package/dist/types/status-line/host.d.ts +129 -0
  244. package/dist/types/status-line/index.d.ts +6 -0
  245. package/dist/types/status-line/loop.d.ts +18 -0
  246. package/dist/types/status-line/metrics.d.ts +21 -0
  247. package/dist/types/status-line/presets.d.ts +3 -0
  248. package/dist/types/status-line/schema.d.ts +15 -0
  249. package/dist/types/status-line/segments.d.ts +5 -0
  250. package/dist/types/status-line/separators.d.ts +3 -0
  251. package/dist/types/status-line/types.d.ts +236 -0
  252. package/dist/types/stdin-buffer.d.ts +4 -0
  253. package/dist/types/theme/color.d.ts +24 -0
  254. package/dist/types/theme/defaults/index.d.ts +9489 -0
  255. package/dist/types/theme/index.d.ts +4 -0
  256. package/dist/types/theme/loader.d.ts +23 -0
  257. package/dist/types/theme/mermaid-cache.d.ts +26 -0
  258. package/dist/types/theme/schema-validation.d.ts +3 -0
  259. package/dist/types/theme/schema.d.ts +25 -0
  260. package/dist/types/theme/session-color.d.ts +43 -0
  261. package/dist/types/theme/shimmer.d.ts +44 -0
  262. package/dist/types/theme/symbols.d.ts +34 -0
  263. package/dist/types/theme/theme-class.d.ts +299 -0
  264. package/dist/types/theme/theme.d.ts +111 -0
  265. package/dist/types/theme/tui-adapters.d.ts +30 -0
  266. package/dist/types/thinking.d.ts +165 -0
  267. package/dist/types/tools/agent-tree.d.ts +36 -0
  268. package/dist/types/tools/ask.d.ts +67 -0
  269. package/dist/types/tools/ast-edit.d.ts +53 -0
  270. package/dist/types/tools/ast-grep.d.ts +52 -0
  271. package/dist/types/tools/autoresearch.d.ts +156 -0
  272. package/dist/types/tools/bash-interactive.d.ts +28 -0
  273. package/dist/types/tools/bash.d.ts +103 -0
  274. package/dist/types/tools/conflict-detect.d.ts +43 -0
  275. package/dist/types/tools/debug.d.ts +60 -0
  276. package/dist/types/tools/default-renderer.d.ts +24 -0
  277. package/dist/types/tools/edit.d.ts +158 -0
  278. package/dist/types/tools/eval-format/code-mode-declarations.d.ts +5 -0
  279. package/dist/types/tools/eval-format/index.d.ts +5 -0
  280. package/dist/types/tools/eval-format/javascript.d.ts +2 -0
  281. package/dist/types/tools/eval-format/python.d.ts +2 -0
  282. package/dist/types/tools/eval.d.ts +94 -0
  283. package/dist/types/tools/fetch.d.ts +42 -0
  284. package/dist/types/tools/gh-format.d.ts +8 -0
  285. package/dist/types/tools/github.d.ts +144 -0
  286. package/dist/types/tools/glob.d.ts +44 -0
  287. package/dist/types/tools/goal.d.ts +42 -0
  288. package/dist/types/tools/grep.d.ts +64 -0
  289. package/dist/types/tools/grouped-file-output.d.ts +71 -0
  290. package/dist/types/tools/hashline-format.d.ts +28 -0
  291. package/dist/types/tools/hub.d.ts +340 -0
  292. package/dist/types/tools/index.d.ts +4 -0
  293. package/dist/types/tools/json-tree.d.ts +59 -0
  294. package/dist/types/tools/line-ranges.d.ts +29 -0
  295. package/dist/types/tools/list-limit.d.ts +15 -0
  296. package/dist/types/tools/lsp.d.ts +72 -0
  297. package/dist/types/tools/match-line-format.d.ts +11 -0
  298. package/dist/types/tools/mcp.d.ts +81 -0
  299. package/dist/types/tools/memory.d.ts +67 -0
  300. package/dist/types/tools/output-meta.d.ts +151 -0
  301. package/dist/types/tools/read.d.ts +139 -0
  302. package/dist/types/tools/renderer.d.ts +98 -0
  303. package/dist/types/tools/report-tool-issue.d.ts +8 -0
  304. package/dist/types/tools/resolve.d.ts +47 -0
  305. package/dist/types/tools/streaming-output.d.ts +282 -0
  306. package/dist/types/tools/subprocess.d.ts +24 -0
  307. package/dist/types/tools/task-repair-args.d.ts +53 -0
  308. package/dist/types/tools/task-yield-assembly.d.ts +20 -0
  309. package/dist/types/tools/task.d.ts +425 -0
  310. package/dist/types/tools/terminal-output.d.ts +8 -0
  311. package/dist/types/tools/think.d.ts +13 -0
  312. package/dist/types/tools/todo.d.ts +118 -0
  313. package/dist/types/tools/tool-errors.d.ts +7 -0
  314. package/dist/types/tools/vibe.d.ts +120 -0
  315. package/dist/types/tools/web-search.d.ts +195 -0
  316. package/dist/types/tools/write.d.ts +76 -0
  317. package/dist/types/tools/xd-url.d.ts +13 -0
  318. package/dist/types/tools/xdev.d.ts +52 -0
  319. package/dist/types/tui.d.ts +18 -0
  320. package/dist/types/utils.d.ts +2 -0
  321. package/package.json +37 -3
  322. package/src/app-keybindings.ts +760 -0
  323. package/src/apps/autoresearch-dashboard.ts +500 -0
  324. package/src/apps/autoresearch-data.ts +64 -0
  325. package/src/apps/cleanse-board.ts +341 -0
  326. package/src/apps/cleanse-picker.ts +57 -0
  327. package/src/apps/debug/log-formatting.ts +53 -0
  328. package/src/apps/debug/log-viewer.ts +868 -0
  329. package/src/apps/debug/protocol-probe.ts +267 -0
  330. package/src/apps/debug/raw-sse-buffer.ts +449 -0
  331. package/src/apps/debug/raw-sse.ts +282 -0
  332. package/src/apps/debug/terminal-info.ts +115 -0
  333. package/src/apps/debug/viewer-frame.ts +174 -0
  334. package/src/apps/git/avatar.ts +52 -0
  335. package/src/apps/git/colors.ts +109 -0
  336. package/src/apps/git/diff-pane.ts +1512 -0
  337. package/src/apps/git/git-tui.ts +889 -0
  338. package/src/apps/git/sidebar.ts +1204 -0
  339. package/src/apps/git/state.ts +113 -0
  340. package/src/apps/if-bench-board.ts +324 -0
  341. package/src/apps/live-visualizer.ts +238 -0
  342. package/src/apps/ps-data.ts +116 -0
  343. package/src/apps/ps-top.ts +422 -0
  344. package/src/apps/session-picker.ts +95 -0
  345. package/src/apps/setup-model-picker.ts +21 -0
  346. package/src/apps/standalone-picker.ts +111 -0
  347. package/src/autocomplete.ts +9 -13
  348. package/src/chat/advisor-message.ts +175 -0
  349. package/src/chat/assistant-message.ts +1214 -0
  350. package/src/chat/background-tan-message.ts +35 -0
  351. package/src/chat/bash-execution.ts +394 -0
  352. package/src/chat/cache-invalidation-marker.ts +94 -0
  353. package/src/chat/chat-transcript-builder.ts +593 -0
  354. package/src/chat/collab-prompt-message.ts +34 -0
  355. package/src/chat/compaction-summary-message.ts +261 -0
  356. package/src/chat/custom-message.ts +23 -0
  357. package/src/chat/display-preferences.ts +24 -0
  358. package/src/chat/eval-execution.ts +172 -0
  359. package/src/chat/execution-shared.ts +113 -0
  360. package/src/chat/extension-types.ts +46 -0
  361. package/src/chat/hook-message.ts +20 -0
  362. package/src/chat/image-loading.ts +122 -0
  363. package/src/chat/late-diagnostics-message.ts +92 -0
  364. package/src/chat/messages.ts +305 -0
  365. package/src/chat/reaction.ts +65 -0
  366. package/src/chat/read-target.ts +7 -0
  367. package/src/chat/read-tool-group.ts +873 -0
  368. package/src/chat/served-model-marker.ts +91 -0
  369. package/src/chat/skill-message.ts +220 -0
  370. package/src/chat/skill-title-input.ts +41 -0
  371. package/src/chat/stripped-tool-calls-placeholder.ts +35 -0
  372. package/src/chat/thinking-display.ts +312 -0
  373. package/src/chat/todo-reminder.ts +33 -0
  374. package/src/chat/tool-execution.ts +1395 -0
  375. package/src/chat/transcript-browser.ts +268 -0
  376. package/src/chat/transcript-entry.ts +96 -0
  377. package/src/chat/transcript-outline.ts +260 -0
  378. package/src/chat/transcript-render-helpers.ts +315 -0
  379. package/src/chat/ttsr-notification.ts +123 -0
  380. package/src/chat/user-message.ts +287 -0
  381. package/src/chrome/chat-block.ts +110 -0
  382. package/src/chrome/collab-qrcode.ts +74 -0
  383. package/src/chrome/context-thresholds.ts +85 -0
  384. package/src/chrome/countdown-timer.ts +74 -0
  385. package/src/chrome/diff.ts +266 -0
  386. package/src/chrome/dynamic-border.ts +36 -0
  387. package/src/chrome/error-block.ts +63 -0
  388. package/src/chrome/form-theme.ts +10 -0
  389. package/src/chrome/format.ts +66 -0
  390. package/src/chrome/index.ts +21 -0
  391. package/src/chrome/keybinding-hints.ts +55 -0
  392. package/src/chrome/live-board.ts +123 -0
  393. package/src/chrome/local-date.ts +20 -0
  394. package/src/chrome/message-divider.ts +51 -0
  395. package/src/chrome/message-frame.ts +164 -0
  396. package/src/chrome/message-notice.ts +103 -0
  397. package/src/chrome/overlay-box.ts +301 -0
  398. package/src/chrome/qrcode.ts +539 -0
  399. package/src/chrome/segment-track.ts +86 -0
  400. package/src/chrome/select-list-mouse-routing.ts +11 -0
  401. package/src/chrome/selector-helpers.ts +119 -0
  402. package/src/chrome/shared.ts +27 -0
  403. package/src/chrome/streaming-panel.ts +72 -0
  404. package/src/chrome/tool-activity.ts +44 -0
  405. package/src/chrome/transcript-container.ts +902 -0
  406. package/src/chrome/transcript-status.ts +27 -0
  407. package/src/chrome/visual-truncate.ts +70 -0
  408. package/src/components/disclosure.ts +235 -0
  409. package/src/components/editor.ts +10 -12
  410. package/src/components/form.ts +566 -0
  411. package/src/components/input.ts +6 -27
  412. package/src/components/key-value-list.ts +88 -0
  413. package/src/components/layout/geometry.ts +202 -0
  414. package/src/components/layout/row.ts +283 -0
  415. package/src/components/layout/split-pane.ts +349 -0
  416. package/src/components/layout/stack.ts +261 -0
  417. package/src/components/markdown.ts +16 -12
  418. package/src/components/menu-selection.ts +248 -0
  419. package/src/components/metric.ts +132 -0
  420. package/src/components/progress-bar.ts +140 -0
  421. package/src/components/scroll-view.ts +372 -70
  422. package/src/components/scroll-viewport.ts +154 -0
  423. package/src/components/section.ts +77 -0
  424. package/src/components/select-list.ts +238 -159
  425. package/src/components/settings-list.ts +103 -80
  426. package/src/components/table.ts +127 -0
  427. package/src/components/tree-view.ts +481 -0
  428. package/src/components/wizard-step.ts +229 -0
  429. package/src/deccara.ts +1 -3
  430. package/src/hotkeys-markdown.ts +100 -0
  431. package/src/index.ts +18 -0
  432. package/src/keybinding-matchers.ts +99 -0
  433. package/src/keys.ts +2 -2
  434. package/src/lang-from-path.ts +252 -0
  435. package/src/overlays/advisor-config.ts +761 -0
  436. package/src/overlays/agent-activity.ts +113 -0
  437. package/src/overlays/agent-hub-projection.ts +250 -0
  438. package/src/overlays/agent-hub-renderer.ts +281 -0
  439. package/src/overlays/agent-hub-types.ts +74 -0
  440. package/src/overlays/agent-hub.ts +1562 -0
  441. package/src/overlays/agent-transcript-viewer.ts +669 -0
  442. package/src/overlays/agents-hub.ts +1203 -0
  443. package/src/overlays/ask-dialog.ts +1202 -0
  444. package/src/overlays/bordered-loader.ts +41 -0
  445. package/src/overlays/btw-history-panel.ts +591 -0
  446. package/src/overlays/btw-history.ts +33 -0
  447. package/src/overlays/btw-panel.ts +167 -0
  448. package/src/overlays/cleanse-panel.ts +167 -0
  449. package/src/overlays/codex-reset-fireworks.ts +375 -0
  450. package/src/overlays/composer-shape-preview.ts +137 -0
  451. package/src/overlays/composer-shape-registry.ts +82 -0
  452. package/src/overlays/copy-selector.ts +618 -0
  453. package/src/overlays/copy-targets.ts +210 -0
  454. package/src/overlays/error-banner.ts +39 -0
  455. package/src/overlays/extensions/display-text.ts +39 -0
  456. package/src/overlays/extensions/extension-dashboard.ts +645 -0
  457. package/src/overlays/extensions/extension-list.ts +667 -0
  458. package/src/overlays/extensions/inspector-model.ts +484 -0
  459. package/src/overlays/extensions/inspector-panel.ts +669 -0
  460. package/src/overlays/extensions/live-tool-session.ts +67 -0
  461. package/src/overlays/extensions/mcp-runtime.ts +289 -0
  462. package/src/overlays/extensions/state-manager.ts +337 -0
  463. package/src/overlays/extensions/types.ts +208 -0
  464. package/src/overlays/history-search.ts +268 -0
  465. package/src/overlays/hook-editor.ts +272 -0
  466. package/src/overlays/hook-input.ts +84 -0
  467. package/src/overlays/hook-selector.ts +635 -0
  468. package/src/overlays/hub-frame.ts +262 -0
  469. package/src/overlays/login-dialog.ts +231 -0
  470. package/src/overlays/logout-account-selector.ts +115 -0
  471. package/src/overlays/mcp-add-wizard.ts +1436 -0
  472. package/src/overlays/model-browser.ts +1176 -0
  473. package/src/overlays/model-hub.ts +2279 -0
  474. package/src/overlays/model-picker.ts +285 -0
  475. package/src/overlays/model-selector.ts +107 -0
  476. package/src/overlays/move-overlay.ts +197 -0
  477. package/src/overlays/oauth-selector.ts +446 -0
  478. package/src/overlays/omfg-panel.ts +136 -0
  479. package/src/overlays/pause-screen.ts +198 -0
  480. package/src/overlays/plan-review-overlay.ts +1227 -0
  481. package/src/overlays/plan-save-overlay.ts +74 -0
  482. package/src/overlays/plan-toc.ts +139 -0
  483. package/src/overlays/plugin-selector.ts +97 -0
  484. package/src/overlays/plugin-settings.ts +839 -0
  485. package/src/overlays/queue-mode-selector.ts +55 -0
  486. package/src/overlays/reset-usage-selector.ts +170 -0
  487. package/src/overlays/rewind-selector.ts +499 -0
  488. package/src/overlays/running-subagent-badge.ts +19 -0
  489. package/src/overlays/session-account-selector.ts +68 -0
  490. package/src/overlays/session-info-overlay.ts +96 -0
  491. package/src/overlays/session-observer-registry.ts +289 -0
  492. package/src/overlays/session-selector.ts +1137 -0
  493. package/src/overlays/settings-defs.ts +315 -0
  494. package/src/overlays/settings-selector.ts +1415 -0
  495. package/src/overlays/show-images-selector.ts +44 -0
  496. package/src/overlays/snapcompact-shape-preview-doc.md +14 -0
  497. package/src/overlays/snapcompact-shape-preview.ts +192 -0
  498. package/src/overlays/theme-selector.ts +62 -0
  499. package/src/overlays/thinking-selector.ts +51 -0
  500. package/src/overlays/tiny-title-download-progress.ts +102 -0
  501. package/src/overlays/tree-selector.ts +1121 -0
  502. package/src/overlays/usage-dashboard.ts +629 -0
  503. package/src/overlays/usage-display.ts +45 -0
  504. package/src/overlays/usage-row.ts +118 -0
  505. package/src/prompt/attachment-chips.ts +201 -0
  506. package/src/prompt/composer-attachments.ts +280 -0
  507. package/src/prompt/composer-cache.ts +304 -0
  508. package/src/prompt/composer.ts +934 -0
  509. package/src/prompt/custom-editor.ts +1392 -0
  510. package/src/prompt/data/emojis.json +1 -0
  511. package/src/prompt/editor-top-gap.ts +28 -0
  512. package/src/prompt/emoji-autocomplete.ts +285 -0
  513. package/src/prompt/github-ref-autocomplete.ts +75 -0
  514. package/src/prompt/gradient-highlight.ts +101 -0
  515. package/src/prompt/image-format.ts +28 -0
  516. package/src/prompt/image-references.ts +102 -0
  517. package/src/prompt/interactive-context-helpers.ts +126 -0
  518. package/src/prompt/internal-url-autocomplete.ts +155 -0
  519. package/src/prompt/macos-spelling.ts +456 -0
  520. package/src/prompt/magic-keyword-boundary.ts +23 -0
  521. package/src/prompt/magic-keywords.ts +42 -0
  522. package/src/prompt/markdown-prose.ts +245 -0
  523. package/src/prompt/model-mention-autocomplete.ts +94 -0
  524. package/src/prompt/model-mention-syntax.ts +41 -0
  525. package/src/prompt/orchestrate.ts +26 -0
  526. package/src/prompt/prompt-action-autocomplete.ts +337 -0
  527. package/src/prompt/queue-input.ts +132 -0
  528. package/src/prompt/skill-tokens.ts +36 -0
  529. package/src/prompt/tips.txt +27 -0
  530. package/src/prompt/tools-markdown.ts +29 -0
  531. package/src/prompt/ultrathink.ts +26 -0
  532. package/src/prompt/usage-amounts.ts +99 -0
  533. package/src/prompt/video.ts +47 -0
  534. package/src/prompt/welcome.ts +605 -0
  535. package/src/prompt/workflow.ts +26 -0
  536. package/src/render/code-cell.ts +244 -0
  537. package/src/render/file-list.ts +58 -0
  538. package/src/render/hyperlink.ts +192 -0
  539. package/src/render/index.ts +17 -0
  540. package/src/render/output-block.ts +267 -0
  541. package/src/render/output-pane.ts +299 -0
  542. package/src/render/render-utils.ts +1182 -0
  543. package/src/render/sixel.ts +69 -0
  544. package/src/render/status-line.ts +55 -0
  545. package/src/render/tool-card.ts +272 -0
  546. package/src/render/tree-list.ts +188 -0
  547. package/src/render/types.ts +19 -0
  548. package/src/render/utils.ts +109 -0
  549. package/src/render/width-aware-text.ts +60 -0
  550. package/src/setup/lazy.ts +17 -0
  551. package/src/setup/scenes/composer.ts +127 -0
  552. package/src/setup/scenes/glyph.ts +120 -0
  553. package/src/setup/scenes/model.ts +138 -0
  554. package/src/setup/scenes/outro.ts +24 -0
  555. package/src/setup/scenes/providers.ts +107 -0
  556. package/src/setup/scenes/sign-in.ts +373 -0
  557. package/src/setup/scenes/splash.ts +192 -0
  558. package/src/setup/scenes/theme.ts +343 -0
  559. package/src/setup/scenes/types.ts +111 -0
  560. package/src/setup/scenes/web-search.ts +165 -0
  561. package/src/setup/setup-version.ts +11 -0
  562. package/src/setup/startup-splash.ts +107 -0
  563. package/src/setup/wizard-overlay.ts +319 -0
  564. package/src/setup/wizard.ts +101 -0
  565. package/src/status-line/component.ts +3003 -0
  566. package/src/status-line/context-usage.ts +688 -0
  567. package/src/status-line/footer.ts +323 -0
  568. package/src/status-line/git-utils.ts +42 -0
  569. package/src/status-line/host.ts +97 -0
  570. package/src/status-line/index.ts +6 -0
  571. package/src/status-line/loop.ts +28 -0
  572. package/src/status-line/metrics.ts +94 -0
  573. package/src/status-line/presets.ts +107 -0
  574. package/src/status-line/schema.ts +57 -0
  575. package/src/status-line/segments.ts +934 -0
  576. package/src/status-line/separators.ts +55 -0
  577. package/src/status-line/types.ts +227 -0
  578. package/src/stdin-buffer.ts +4 -2
  579. package/src/theme/color.ts +95 -0
  580. package/src/theme/dark.json +95 -0
  581. package/src/theme/defaults/alabaster.json +93 -0
  582. package/src/theme/defaults/amethyst.json +96 -0
  583. package/src/theme/defaults/anthracite.json +93 -0
  584. package/src/theme/defaults/basalt.json +91 -0
  585. package/src/theme/defaults/birch.json +95 -0
  586. package/src/theme/defaults/dark-abyss.json +91 -0
  587. package/src/theme/defaults/dark-arctic.json +104 -0
  588. package/src/theme/defaults/dark-aurora.json +95 -0
  589. package/src/theme/defaults/dark-catppuccin.json +107 -0
  590. package/src/theme/defaults/dark-cavern.json +91 -0
  591. package/src/theme/defaults/dark-celestial.json +106 -0
  592. package/src/theme/defaults/dark-copper.json +95 -0
  593. package/src/theme/defaults/dark-cosmos.json +90 -0
  594. package/src/theme/defaults/dark-cyberpunk.json +102 -0
  595. package/src/theme/defaults/dark-dracula.json +98 -0
  596. package/src/theme/defaults/dark-eclipse.json +91 -0
  597. package/src/theme/defaults/dark-ember.json +95 -0
  598. package/src/theme/defaults/dark-equinox.json +90 -0
  599. package/src/theme/defaults/dark-forest.json +96 -0
  600. package/src/theme/defaults/dark-github.json +105 -0
  601. package/src/theme/defaults/dark-gruvbox.json +112 -0
  602. package/src/theme/defaults/dark-lavender.json +95 -0
  603. package/src/theme/defaults/dark-lunar.json +89 -0
  604. package/src/theme/defaults/dark-midnight.json +95 -0
  605. package/src/theme/defaults/dark-monochrome.json +94 -0
  606. package/src/theme/defaults/dark-monokai.json +98 -0
  607. package/src/theme/defaults/dark-nebula.json +90 -0
  608. package/src/theme/defaults/dark-nord.json +98 -0
  609. package/src/theme/defaults/dark-ocean.json +101 -0
  610. package/src/theme/defaults/dark-one.json +100 -0
  611. package/src/theme/defaults/dark-poimandres.json +115 -0
  612. package/src/theme/defaults/dark-rainforest.json +91 -0
  613. package/src/theme/defaults/dark-reef.json +91 -0
  614. package/src/theme/defaults/dark-retro.json +92 -0
  615. package/src/theme/defaults/dark-rose-pine.json +96 -0
  616. package/src/theme/defaults/dark-sakura.json +95 -0
  617. package/src/theme/defaults/dark-slate.json +95 -0
  618. package/src/theme/defaults/dark-solarized.json +97 -0
  619. package/src/theme/defaults/dark-solstice.json +90 -0
  620. package/src/theme/defaults/dark-starfall.json +91 -0
  621. package/src/theme/defaults/dark-sunset.json +99 -0
  622. package/src/theme/defaults/dark-swamp.json +90 -0
  623. package/src/theme/defaults/dark-synthwave.json +103 -0
  624. package/src/theme/defaults/dark-taiga.json +91 -0
  625. package/src/theme/defaults/dark-terminal.json +95 -0
  626. package/src/theme/defaults/dark-tokyo-night.json +101 -0
  627. package/src/theme/defaults/dark-tundra.json +91 -0
  628. package/src/theme/defaults/dark-twilight.json +91 -0
  629. package/src/theme/defaults/dark-volcanic.json +91 -0
  630. package/src/theme/defaults/graphite.json +92 -0
  631. package/src/theme/defaults/index.ts +201 -0
  632. package/src/theme/defaults/light-arctic.json +107 -0
  633. package/src/theme/defaults/light-aurora-day.json +91 -0
  634. package/src/theme/defaults/light-canyon.json +91 -0
  635. package/src/theme/defaults/light-catppuccin.json +106 -0
  636. package/src/theme/defaults/light-cirrus.json +90 -0
  637. package/src/theme/defaults/light-coral.json +95 -0
  638. package/src/theme/defaults/light-cyberpunk.json +96 -0
  639. package/src/theme/defaults/light-dawn.json +90 -0
  640. package/src/theme/defaults/light-dunes.json +91 -0
  641. package/src/theme/defaults/light-eucalyptus.json +95 -0
  642. package/src/theme/defaults/light-forest.json +100 -0
  643. package/src/theme/defaults/light-frost.json +95 -0
  644. package/src/theme/defaults/light-github.json +115 -0
  645. package/src/theme/defaults/light-glacier.json +91 -0
  646. package/src/theme/defaults/light-gruvbox.json +108 -0
  647. package/src/theme/defaults/light-haze.json +90 -0
  648. package/src/theme/defaults/light-honeycomb.json +95 -0
  649. package/src/theme/defaults/light-lagoon.json +91 -0
  650. package/src/theme/defaults/light-lavender.json +95 -0
  651. package/src/theme/defaults/light-meadow.json +91 -0
  652. package/src/theme/defaults/light-mint.json +95 -0
  653. package/src/theme/defaults/light-monochrome.json +101 -0
  654. package/src/theme/defaults/light-ocean.json +99 -0
  655. package/src/theme/defaults/light-one.json +99 -0
  656. package/src/theme/defaults/light-opal.json +91 -0
  657. package/src/theme/defaults/light-orchard.json +91 -0
  658. package/src/theme/defaults/light-paper.json +95 -0
  659. package/src/theme/defaults/light-poimandres.json +115 -0
  660. package/src/theme/defaults/light-prism.json +90 -0
  661. package/src/theme/defaults/light-retro.json +98 -0
  662. package/src/theme/defaults/light-sand.json +95 -0
  663. package/src/theme/defaults/light-savanna.json +91 -0
  664. package/src/theme/defaults/light-solarized.json +102 -0
  665. package/src/theme/defaults/light-soleil.json +90 -0
  666. package/src/theme/defaults/light-sunset.json +99 -0
  667. package/src/theme/defaults/light-synthwave.json +98 -0
  668. package/src/theme/defaults/light-tokyo-night.json +111 -0
  669. package/src/theme/defaults/light-wetland.json +91 -0
  670. package/src/theme/defaults/light-zenith.json +89 -0
  671. package/src/theme/defaults/limestone.json +94 -0
  672. package/src/theme/defaults/mahogany.json +97 -0
  673. package/src/theme/defaults/marble.json +93 -0
  674. package/src/theme/defaults/obsidian.json +91 -0
  675. package/src/theme/defaults/onyx.json +91 -0
  676. package/src/theme/defaults/pearl.json +93 -0
  677. package/src/theme/defaults/porcelain.json +91 -0
  678. package/src/theme/defaults/quartz.json +96 -0
  679. package/src/theme/defaults/sandstone.json +95 -0
  680. package/src/theme/defaults/titanium.json +90 -0
  681. package/src/theme/index.ts +5 -0
  682. package/src/theme/light.json +93 -0
  683. package/src/theme/loader.ts +200 -0
  684. package/src/theme/mermaid-cache.ts +92 -0
  685. package/src/theme/schema-validation.ts +119 -0
  686. package/src/theme/schema.ts +168 -0
  687. package/src/theme/session-color.ts +253 -0
  688. package/src/theme/shimmer.ts +307 -0
  689. package/src/theme/symbols.ts +1433 -0
  690. package/src/theme/theme-class.ts +787 -0
  691. package/src/theme/theme-schema.json +463 -0
  692. package/src/theme/theme.ts +810 -0
  693. package/src/theme/tui-adapters.ts +339 -0
  694. package/src/thinking.ts +380 -0
  695. package/src/tools/agent-tree.ts +128 -0
  696. package/src/tools/ask.ts +482 -0
  697. package/src/tools/ast-edit.ts +210 -0
  698. package/src/tools/ast-grep.ts +171 -0
  699. package/src/tools/autoresearch.ts +287 -0
  700. package/src/tools/bash-interactive.ts +295 -0
  701. package/src/tools/bash.ts +468 -0
  702. package/src/tools/conflict-detect.ts +77 -0
  703. package/src/tools/debug.ts +167 -0
  704. package/src/tools/default-renderer.ts +172 -0
  705. package/src/tools/edit.ts +1258 -0
  706. package/src/tools/eval-format/code-mode-declarations.ts +61 -0
  707. package/src/tools/eval-format/index.ts +16 -0
  708. package/src/tools/eval-format/javascript.ts +952 -0
  709. package/src/tools/eval-format/python.ts +544 -0
  710. package/src/tools/eval.ts +835 -0
  711. package/src/tools/fetch.ts +226 -0
  712. package/src/tools/gh-format.ts +18 -0
  713. package/src/tools/github.ts +686 -0
  714. package/src/tools/glob.ts +213 -0
  715. package/src/tools/goal.ts +153 -0
  716. package/src/tools/grep.ts +385 -0
  717. package/src/tools/grouped-file-output.ts +211 -0
  718. package/src/tools/hashline-format.ts +59 -0
  719. package/src/tools/hub.ts +1488 -0
  720. package/src/tools/index.ts +71 -0
  721. package/src/tools/json-tree.ts +388 -0
  722. package/src/tools/line-ranges.ts +98 -0
  723. package/src/tools/list-limit.ts +43 -0
  724. package/src/tools/lsp.ts +702 -0
  725. package/src/tools/match-line-format.ts +20 -0
  726. package/src/tools/mcp.ts +309 -0
  727. package/src/tools/memory.ts +220 -0
  728. package/src/tools/output-meta.ts +367 -0
  729. package/src/tools/read.ts +628 -0
  730. package/src/tools/renderer.ts +107 -0
  731. package/src/tools/report-tool-issue.ts +13 -0
  732. package/src/tools/resolve.ts +139 -0
  733. package/src/tools/streaming-output.ts +1576 -0
  734. package/src/tools/subprocess.ts +39 -0
  735. package/src/tools/task-repair-args.ts +118 -0
  736. package/src/tools/task-yield-assembly.ts +147 -0
  737. package/src/tools/task.ts +2110 -0
  738. package/src/tools/terminal-output.ts +153 -0
  739. package/src/tools/think.ts +28 -0
  740. package/src/tools/todo.ts +580 -0
  741. package/src/tools/tool-errors.ts +15 -0
  742. package/src/tools/vibe.ts +420 -0
  743. package/src/tools/web-search.ts +409 -0
  744. package/src/tools/write.ts +511 -0
  745. package/src/tools/xd-url.ts +28 -0
  746. package/src/tools/xdev.ts +201 -0
  747. package/src/tui.ts +57 -4
  748. package/src/utils.ts +8 -0
@@ -0,0 +1,51 @@
1
+ import type { Component } from "../tui";
2
+ import { type ThemeColor, theme } from "../theme";
3
+ import { truncateToWidth } from "../utils";
4
+
5
+ /** Presentation policy for a compact message divider. */
6
+ export interface MessageDividerOptions {
7
+ /** Theme-aware label, recomputed after invalidation. */
8
+ readonly label: () => string;
9
+ readonly labelColor: ThemeColor;
10
+ readonly ruleColor?: ThemeColor;
11
+ readonly ruleWidth?: number;
12
+ /** Preserve an intentionally untruncated legacy label at very narrow widths. */
13
+ readonly truncateWhenNarrow?: boolean;
14
+ }
15
+
16
+ /**
17
+ * A short left-aligned rule and label surrounded by blank transcript rows.
18
+ * Rendered rows are cached by width and stay reference-stable until invalidated.
19
+ */
20
+ export class MessageDividerComponent implements Component {
21
+ readonly #options: MessageDividerOptions;
22
+ #cache: { width: number; lines: readonly string[] } | undefined;
23
+
24
+ constructor(options: MessageDividerOptions) {
25
+ this.#options = options;
26
+ }
27
+
28
+ invalidate(): void {
29
+ this.#cache = undefined;
30
+ }
31
+
32
+ render(width: number): readonly string[] {
33
+ width = Math.max(1, width);
34
+ if (this.#cache?.width === width) return this.#cache.lines;
35
+ const lines = Object.freeze(["", this.#renderDivider(width), ""]);
36
+ this.#cache = { width, lines };
37
+ return lines;
38
+ }
39
+
40
+ #renderDivider(width: number): string {
41
+ const label = this.#options.label();
42
+ const labelWidth = Bun.stringWidth(label, { countAnsiEscapeCodes: false });
43
+ const ruleWidth = Math.min(this.#options.ruleWidth ?? 10, width - labelWidth - 1);
44
+ const paintedLabel = theme.fg(this.#options.labelColor, label);
45
+ if (ruleWidth < 1) {
46
+ return this.#options.truncateWhenNarrow === false ? paintedLabel : truncateToWidth(paintedLabel, width);
47
+ }
48
+ const rule = theme.fg(this.#options.ruleColor ?? "dim", theme.tree.horizontal.repeat(ruleWidth));
49
+ return `${rule} ${paintedLabel}`;
50
+ }
51
+ }
@@ -0,0 +1,164 @@
1
+ /**
2
+ * Shared rendering for extension/hook custom message frames.
3
+ *
4
+ * `CustomMessageComponent` and `HookMessageComponent` share one behavior-owning
5
+ * frame: it tries a user-supplied renderer first and falls back to a label plus
6
+ * markdown body when the renderer returns nothing or throws. Hook messages
7
+ * collapse to the first N lines when not expanded; extension messages render
8
+ * in full.
9
+ */
10
+
11
+ import type { TextContent } from "@oh-my-pi/pi-ai";
12
+ import { Box } from "../components/box";
13
+ import { Markdown } from "../components/markdown";
14
+ import { Spacer } from "../components/spacer";
15
+ import { Text } from "../components/text";
16
+ import { type Component, Container } from "../tui";
17
+ import { getMarkdownTheme, type Theme, type ThemeColor, theme } from "../theme/index";
18
+ /** Message shape consumed by the shared frame. */
19
+ export interface FramedMessage {
20
+ customType: string;
21
+ content: string | (TextContent | { type: string })[];
22
+ }
23
+
24
+ /**
25
+ * Callable signature shared by `MessageRenderer` (extensions) and
26
+ * `HookMessageRenderer` (hooks). Both narrow `message` to their own type;
27
+ * this signature is the structural intersection callers can hand off here.
28
+ */
29
+ export type FramedRenderer<M extends FramedMessage> = (
30
+ message: M,
31
+ options: { expanded: boolean },
32
+ theme: Theme,
33
+ ) => Component | undefined;
34
+
35
+ /** Presentation and extension-renderer policy for a framed custom message. */
36
+ export interface FramedMessageOptions<M extends FramedMessage> {
37
+ readonly message: M;
38
+ /** Theme-aware icon glyph shown before the custom type. */
39
+ readonly icon?: string | (() => string);
40
+ /** Hide the default type header while retaining the message body. */
41
+ readonly hideHeader?: boolean | (() => boolean);
42
+ /** Semantic color for the outline, defaulting to the muted border. */
43
+ readonly borderColor?: ThemeColor;
44
+ /** Collapse the markdown body to this many lines when `expanded` is false. Omit to never collapse. */
45
+ readonly collapseAfterLines?: number;
46
+ readonly customRenderer?: FramedRenderer<M>;
47
+ }
48
+
49
+ /**
50
+ * Behavior-owning custom message frame. It retries extension renderers whenever
51
+ * expansion or theme state changes and falls back to the shared card when a
52
+ * renderer returns nothing or throws.
53
+ */
54
+ export class FramedMessageComponent<M extends FramedMessage> extends Container {
55
+ readonly #options: FramedMessageOptions<M>;
56
+ readonly #box: Box;
57
+ #customComponent: Component | undefined;
58
+ #expanded = false;
59
+ #disposed = false;
60
+
61
+ constructor(options: FramedMessageOptions<M>) {
62
+ super();
63
+ this.#options = options;
64
+ this.#box = new Box(1, 1, text => theme.bg("customMessageBg", text));
65
+ this.#box.setIgnoreTight(true);
66
+ this.#rebuild();
67
+ }
68
+
69
+ setExpanded(expanded: boolean): void {
70
+ if (this.#expanded === expanded) return;
71
+ this.#expanded = expanded;
72
+ this.#rebuild();
73
+ }
74
+
75
+ override invalidate(): void {
76
+ this.#rebuild();
77
+ }
78
+
79
+ override dispose(): void {
80
+ if (this.#disposed) return;
81
+ this.#disposed = true;
82
+ super.dispose();
83
+ for (const child of this.#box.children) child.dispose?.();
84
+ this.#box.clear();
85
+ this.clear();
86
+ this.#customComponent = undefined;
87
+ }
88
+
89
+ #rebuild(): void {
90
+ if (this.#disposed) return;
91
+ let nextCustomComponent: Component | undefined;
92
+ const customRenderer = this.#options.customRenderer;
93
+ if (customRenderer) {
94
+ try {
95
+ nextCustomComponent = customRenderer(this.#options.message, { expanded: this.#expanded }, theme);
96
+ } catch {
97
+ // A broken extension renderer must not hide its persisted message.
98
+ }
99
+ }
100
+
101
+ const previousCustomComponent = this.#customComponent;
102
+ if (nextCustomComponent) {
103
+ if (nextCustomComponent === previousCustomComponent) {
104
+ super.invalidate();
105
+ return;
106
+ }
107
+ if (previousCustomComponent) {
108
+ this.removeChild(previousCustomComponent);
109
+ previousCustomComponent.dispose?.();
110
+ }
111
+ this.removeChild(this.#box);
112
+ for (const child of this.#box.children) child.dispose?.();
113
+ this.#box.clear();
114
+ this.#customComponent = nextCustomComponent;
115
+ this.addChild(nextCustomComponent);
116
+ return;
117
+ }
118
+
119
+ if (previousCustomComponent) {
120
+ this.removeChild(previousCustomComponent);
121
+ previousCustomComponent.dispose?.();
122
+ this.#customComponent = undefined;
123
+ }
124
+ this.removeChild(this.#box);
125
+ for (const child of this.#box.children) child.dispose?.();
126
+ this.#box.clear();
127
+ this.#box.setBorder({
128
+ chars: theme.boxRound,
129
+ color: text => theme.fg(this.#options.borderColor ?? "borderMuted", text),
130
+ });
131
+
132
+ const hideHeader =
133
+ typeof this.#options.hideHeader === "function" ? this.#options.hideHeader() : this.#options.hideHeader;
134
+ if (!hideHeader) {
135
+ const icon = typeof this.#options.icon === "function" ? this.#options.icon() : this.#options.icon;
136
+ const tag = icon ? `${icon} ${this.#options.message.customType}` : this.#options.message.customType;
137
+ this.#box.addChild(new Text(theme.fg("customMessageLabel", theme.bold(tag)), 0, 0));
138
+ this.#box.addChild(new Spacer(1));
139
+ }
140
+
141
+ let text: string;
142
+ if (typeof this.#options.message.content === "string") {
143
+ text = this.#options.message.content;
144
+ } else {
145
+ text = this.#options.message.content
146
+ .filter((content): content is TextContent => content.type === "text")
147
+ .map(content => content.text)
148
+ .join("\n");
149
+ }
150
+
151
+ const collapseAfterLines = this.#options.collapseAfterLines;
152
+ if (!this.#expanded && collapseAfterLines !== undefined) {
153
+ const lines = text.split("\n");
154
+ if (lines.length > collapseAfterLines) text = `${lines.slice(0, collapseAfterLines).join("\n")}\n…`;
155
+ }
156
+
157
+ this.#box.addChild(
158
+ new Markdown(text, 0, 0, getMarkdownTheme(), {
159
+ color: value => theme.fg("customMessageText", value),
160
+ }),
161
+ );
162
+ this.addChild(this.#box);
163
+ }
164
+ }
@@ -0,0 +1,103 @@
1
+ import { Box } from "../components/box";
2
+ import { Spacer } from "../components/spacer";
3
+ import { Text } from "../components/text";
4
+ import { type Component, Container } from "../tui";
5
+ import { type ThemeColor, theme } from "../theme";
6
+
7
+ const NO_LINES: readonly string[] = [];
8
+
9
+ /** Render-time state supplied to a notice presentation. */
10
+ export interface MessageNoticeContext {
11
+ readonly expanded: boolean;
12
+ }
13
+
14
+ /** Header and optional detail rows rendered inside a notice box. */
15
+ export interface MessageNoticePresentation {
16
+ readonly header: string;
17
+ readonly icon?: string;
18
+ readonly body?: Component | readonly Component[];
19
+ }
20
+
21
+ function isComponentList(value: Component | readonly Component[]): value is readonly Component[] {
22
+ return Array.isArray(value);
23
+ }
24
+
25
+ /** Presentation policy for a transcript notice. */
26
+ export interface MessageNoticeOptions {
27
+ readonly presentation: (context: MessageNoticeContext) => MessageNoticePresentation;
28
+ readonly severity?: ThemeColor;
29
+ readonly background?: (text: string) => string;
30
+ readonly leadingSpace?: boolean;
31
+ }
32
+
33
+ /**
34
+ * Shared transcript notice shell with expansion and tool-activity visibility.
35
+ * Domain controllers own their state and call {@link refresh} after mutations.
36
+ */
37
+ export class MessageNoticeComponent extends Container {
38
+ readonly #options: MessageNoticeOptions;
39
+ readonly #box: Box;
40
+ #expanded = false;
41
+ #toolActivityVisible = true;
42
+
43
+ constructor(options: MessageNoticeOptions) {
44
+ super();
45
+ this.#options = options;
46
+ const severity = options.severity ?? "warning";
47
+ this.#box = new Box(1, 1, options.background ?? (text => theme.inverse(theme.fg(severity, text))));
48
+ this.#box.setIgnoreTight(true);
49
+ if (options.leadingSpace !== false) this.addChild(new Spacer(1));
50
+ this.addChild(this.#box);
51
+ this.refresh();
52
+ }
53
+
54
+ setExpanded(expanded: boolean): void {
55
+ if (this.#expanded === expanded) return;
56
+ this.#expanded = expanded;
57
+ this.refresh();
58
+ }
59
+
60
+ isExpanded(): boolean {
61
+ return this.#expanded;
62
+ }
63
+
64
+ setToolActivityVisible(visible: boolean): void {
65
+ if (this.#toolActivityVisible === visible) return;
66
+ this.#toolActivityVisible = visible;
67
+ super.invalidate();
68
+ }
69
+
70
+ /** Rebuild the presentation after controller-owned state changes. */
71
+ refresh(): void {
72
+ for (const child of this.#box.children) child.dispose?.();
73
+ this.#box.clear();
74
+ const presentation = this.#options.presentation({ expanded: this.#expanded });
75
+ const header = presentation.icon ? `${presentation.icon} ${presentation.header}` : presentation.header;
76
+ this.#box.addChild(new Text(header, 0, 0));
77
+ const body = presentation.body
78
+ ? isComponentList(presentation.body)
79
+ ? presentation.body
80
+ : [presentation.body]
81
+ : [];
82
+ if (body.length > 0) {
83
+ this.#box.addChild(new Spacer(1));
84
+ for (const child of body) this.#box.addChild(child);
85
+ }
86
+ super.invalidate();
87
+ }
88
+
89
+ override invalidate(): void {
90
+ this.refresh();
91
+ }
92
+
93
+ override dispose(): void {
94
+ super.dispose();
95
+ for (const child of this.#box.children) child.dispose?.();
96
+ this.#box.clear();
97
+ }
98
+
99
+ override render(width: number): readonly string[] {
100
+ if (!this.#toolActivityVisible) return NO_LINES;
101
+ return super.render(width);
102
+ }
103
+ }
@@ -0,0 +1,301 @@
1
+ /**
2
+ * Shared box-drawing chrome for overlays — string helpers for fullscreen
3
+ * surfaces (the `/copy` picker, the plan-review overlay, …) and the
4
+ * {@link OverlayPanel} container for inline overlays hosted in the editor slot
5
+ * or an anchored container. Everything paints with `theme.boxRound` glyphs
6
+ * (rounded corners, sharp tee/cross junctions) and the `border`/`accent` theme
7
+ * colors so all outlined overlays read identically.
8
+ */
9
+ import { type Component, visibleWidth } from "../tui";
10
+ import { Ellipsis, truncateToWidth } from "../utils";
11
+ import { padToWidth } from "../render/utils";
12
+ import { type ThemeColor, theme } from "../theme/index";
13
+
14
+ function paint(s: string, color: ThemeColor = "border"): string {
15
+ return theme.fg(color, s);
16
+ }
17
+
18
+ /** Top border with an optional title inset into the rule. `color` recolors border and title (default border/accent). */
19
+ export function topBorder(width: number, title: string, color?: ThemeColor): string {
20
+ const box = theme.boxRound;
21
+ const inner = Math.max(0, width - 2);
22
+ if (!title) return paint(box.topLeft + box.horizontal.repeat(inner) + box.topRight, color);
23
+ const shown = truncateToWidth(` ${title} `, Math.max(0, inner - 2));
24
+ const fillWidth = Math.max(0, inner - 1 - visibleWidth(shown));
25
+ return (
26
+ paint(box.topLeft + box.horizontal, color) +
27
+ theme.bold(theme.fg(color ?? "accent", shown)) +
28
+ paint(box.horizontal.repeat(fillWidth) + box.topRight, color)
29
+ );
30
+ }
31
+
32
+ /** A horizontal rule with left/right tees, splitting overlay sections. */
33
+ export function divider(width: number): string {
34
+ const box = theme.boxRound;
35
+ return paint(box.teeRight + box.horizontal.repeat(Math.max(0, width - 2)) + box.teeLeft);
36
+ }
37
+
38
+ export function bottomBorder(width: number, color?: ThemeColor): string {
39
+ const box = theme.boxRound;
40
+ return paint(box.bottomLeft + box.horizontal.repeat(Math.max(0, width - 2)) + box.bottomRight, color);
41
+ }
42
+
43
+ /** Wrap pre-styled content in vertical borders with single-column insets. */
44
+ export function row(content: string, width: number, color?: ThemeColor): string {
45
+ const box = theme.boxRound;
46
+ return `${paint(box.vertical, color)} ${width > 4 ? padToWidth(content, width - 4) : ""} ${paint(box.vertical, color)}`;
47
+ }
48
+
49
+ /**
50
+ * Column index (0-based) of the inner divider for a two-column layout whose
51
+ * sidebar content area is `sidebarWidth` columns wide. The layout is
52
+ * `│ sidebar │ body │` with a single-column inset on every side, so the divider
53
+ * vertical sits at `sidebarWidth + 3` and the body content area is
54
+ * {@link splitBodyWidth} columns.
55
+ */
56
+ function splitDividerCol(sidebarWidth: number): number {
57
+ return sidebarWidth + 3;
58
+ }
59
+
60
+ /** Body content width for a two-column overlay of total `width`. */
61
+ export function splitBodyWidth(width: number, sidebarWidth: number): number {
62
+ return Math.max(0, width - sidebarWidth - 7);
63
+ }
64
+
65
+ /** Top border carrying the title, split by a `┬` over the column divider. */
66
+ export function topBorderSplit(width: number, title: string, sidebarWidth: number): string {
67
+ const box = theme.boxRound;
68
+ const dividerCol = splitDividerCol(sidebarWidth);
69
+ const leftLen = Math.max(0, dividerCol - 1);
70
+ const rightLen = Math.max(0, width - 2 - dividerCol);
71
+ let left: string;
72
+ if (!title) {
73
+ left = paint(box.topLeft + box.horizontal.repeat(leftLen));
74
+ } else {
75
+ const shown = truncateToWidth(` ${title} `, Math.max(0, leftLen - 1));
76
+ const fillWidth = Math.max(0, leftLen - 1 - visibleWidth(shown));
77
+ left =
78
+ paint(box.topLeft + box.horizontal) +
79
+ theme.bold(theme.fg("accent", shown)) +
80
+ paint(box.horizontal.repeat(fillWidth));
81
+ }
82
+ return left + paint(box.teeDown + box.horizontal.repeat(rightLen) + box.topRight);
83
+ }
84
+
85
+ /** Section rule that closes the sidebar column with a `┴` over the divider. */
86
+ export function dividerSplit(width: number, sidebarWidth: number): string {
87
+ const box = theme.boxRound;
88
+ const dividerCol = splitDividerCol(sidebarWidth);
89
+ const leftLen = Math.max(0, dividerCol - 1);
90
+ const rightLen = Math.max(0, width - 2 - dividerCol);
91
+ return paint(
92
+ box.teeRight + box.horizontal.repeat(leftLen) + box.teeUp + box.horizontal.repeat(rightLen) + box.teeLeft,
93
+ );
94
+ }
95
+
96
+ /** A two-column content row: `│ sidebar │ body │`, each inset by one column. */
97
+ export function splitRow(sidebar: string, body: string, width: number, sidebarWidth: number): string {
98
+ const box = theme.boxRound;
99
+ const bodyWidth = splitBodyWidth(width, sidebarWidth);
100
+ const bar = paint(box.vertical);
101
+ return `${bar} ${sidebarWidth > 0 ? padToWidth(sidebar, sidebarWidth) : ""} ${bar} ${bodyWidth > 0 ? padToWidth(body, bodyWidth) : ""} ${bar}`;
102
+ }
103
+
104
+ const NO_LINES: readonly string[] = [];
105
+
106
+ interface PanelRowsMemo {
107
+ width: number;
108
+ height: number | undefined;
109
+ lines: readonly string[];
110
+ result: readonly string[];
111
+ }
112
+
113
+ /**
114
+ * Mutable row region for composing an {@link OverlayPanel}. Callers provide
115
+ * already-styled logical rows and may pin the region to an exact height; extra
116
+ * rows are clipped and missing rows are filled. This keeps dialog body budgets
117
+ * in the layout component instead of duplicating border and padding math in
118
+ * every overlay.
119
+ */
120
+ export class PanelRows implements Component {
121
+ #lines: readonly string[] = NO_LINES;
122
+ #height: number | undefined;
123
+ #memo: PanelRowsMemo | undefined;
124
+
125
+ /** Replace the region rows. Byte-identical rows retain the previous render identity. */
126
+ setLines(lines: readonly string[]): void {
127
+ if (
128
+ lines === this.#lines ||
129
+ (lines.length === this.#lines.length && lines.every((line, index) => line === this.#lines[index]))
130
+ ) {
131
+ return;
132
+ }
133
+ this.#lines = lines;
134
+ this.#memo = undefined;
135
+ }
136
+
137
+ /** Pin the region to exactly `height` rows, or pass `undefined` for its natural height. */
138
+ setHeight(height: number | undefined): void {
139
+ const next = height === undefined ? undefined : Number.isFinite(height) ? Math.max(0, Math.trunc(height)) : 0;
140
+ if (next === this.#height) return;
141
+ this.#height = next;
142
+ this.#memo = undefined;
143
+ }
144
+
145
+ invalidate(): void {
146
+ this.#memo = undefined;
147
+ }
148
+
149
+ render(width: number): readonly string[] {
150
+ const safeWidth = Number.isFinite(width) ? Math.max(0, Math.trunc(width)) : 0;
151
+ const memo = this.#memo;
152
+ if (
153
+ memo !== undefined &&
154
+ memo.width === safeWidth &&
155
+ memo.height === this.#height &&
156
+ memo.lines === this.#lines
157
+ ) {
158
+ return memo.result;
159
+ }
160
+
161
+ const rowCount = this.#height ?? this.#lines.length;
162
+ const result: string[] = [];
163
+ for (let index = 0; index < rowCount; index++) {
164
+ const line = this.#lines[index] ?? "";
165
+ result.push(visibleWidth(line) > safeWidth ? truncateToWidth(line, safeWidth) : line);
166
+ }
167
+ this.#memo = { width: safeWidth, height: this.#height, lines: this.#lines, result };
168
+ return result;
169
+ }
170
+ }
171
+
172
+ /** Sentinel child rendered by {@link OverlayPanel} as a `├───┤` section rule. */
173
+ export class PanelDivider implements Component {
174
+ render(): readonly string[] {
175
+ return NO_LINES;
176
+ }
177
+ }
178
+
179
+ interface OverlayPanelMemo {
180
+ width: number;
181
+ title: string;
182
+ children: Component[];
183
+ childLines: (readonly string[])[];
184
+ result: string[];
185
+ }
186
+
187
+ /** Titles inset into a single border row must never carry line breaks. */
188
+ function collapseTitle(title: string): string {
189
+ return title.replace(/\s+/g, " ").trim();
190
+ }
191
+
192
+ /**
193
+ * Rounded-box container for inline overlays (selectors, run panels). Children
194
+ * render inside `│ … │` rows between a titled top border and a bottom border,
195
+ * so inline overlays share the chrome of fullscreen overlays. The top border
196
+ * is exactly one row — `routeMouse` offsets written for a one-line top rule
197
+ * stay valid — and content is inset two columns on each side.
198
+ */
199
+ export class OverlayPanel implements Component {
200
+ children: Component[] = [];
201
+ #title: string;
202
+ #memo: OverlayPanelMemo | undefined;
203
+
204
+ constructor(title = "") {
205
+ this.#title = collapseTitle(title);
206
+ }
207
+
208
+ get title(): string {
209
+ return this.#title;
210
+ }
211
+
212
+ set title(value: string) {
213
+ const next = collapseTitle(value);
214
+ if (next === this.#title) return;
215
+ this.#title = next;
216
+ this.#memo = undefined;
217
+ }
218
+
219
+ addChild(component: Component): void {
220
+ this.children.push(component);
221
+ this.#memo = undefined;
222
+ }
223
+
224
+ removeChild(component: Component): void {
225
+ const index = this.children.indexOf(component);
226
+ if (index === -1) return;
227
+ this.children.splice(index, 1);
228
+ this.#memo = undefined;
229
+ }
230
+
231
+ clear(): void {
232
+ this.children = [];
233
+ this.#memo = undefined;
234
+ }
235
+
236
+ invalidate(): void {
237
+ this.#memo = undefined;
238
+ for (const child of this.children) child.invalidate?.();
239
+ }
240
+
241
+ dispose(): void {
242
+ for (const child of this.children) child.dispose?.();
243
+ }
244
+
245
+ setIgnoreTight(ignore: boolean): this {
246
+ for (const child of this.children) child.setIgnoreTight?.(ignore);
247
+ return this;
248
+ }
249
+
250
+ /**
251
+ * Body rows at the given content width, without border chrome —
252
+ * {@link render} draws exactly these (4 columns narrower) inside `│ … │`
253
+ * rows. Lets callers and tests assert on component-content coordinates
254
+ * instead of reverse-parsing box glyphs. `PanelDivider` children contribute
255
+ * no rows here (their rule is border chrome).
256
+ */
257
+ renderContent(width: number): string[] {
258
+ const result: string[] = [];
259
+ for (const child of this.children) {
260
+ if (child instanceof PanelDivider) continue;
261
+ result.push(...child.render(width));
262
+ }
263
+ return result;
264
+ }
265
+
266
+ render(width: number): readonly string[] {
267
+ width = Number.isFinite(width) ? Math.max(0, Math.trunc(width)) : 0;
268
+ const innerWidth = Math.max(1, width - 4);
269
+ // Children render every frame (renders may carry side effects); the memo
270
+ // only skips re-wrapping unchanged rows in border chrome.
271
+ const childLines = this.children.map(child =>
272
+ child instanceof PanelDivider ? NO_LINES : child.render(innerWidth),
273
+ );
274
+ const memo = this.#memo;
275
+ if (
276
+ memo !== undefined &&
277
+ memo.width === width &&
278
+ memo.title === this.#title &&
279
+ memo.children.length === this.children.length &&
280
+ this.children.every((child, i) => memo.children[i] === child && memo.childLines[i] === childLines[i])
281
+ ) {
282
+ return memo.result;
283
+ }
284
+ const result: string[] = [topBorder(width, this.#title)];
285
+ for (let i = 0; i < this.children.length; i++) {
286
+ if (this.children[i] instanceof PanelDivider) {
287
+ result.push(divider(width));
288
+ continue;
289
+ }
290
+ for (const line of childLines[i] ?? NO_LINES) result.push(row(line, width));
291
+ }
292
+ result.push(bottomBorder(width));
293
+ if (width < 4) {
294
+ for (let index = 0; index < result.length; index++) {
295
+ result[index] = truncateToWidth(result[index]!, width, Ellipsis.Omit);
296
+ }
297
+ }
298
+ this.#memo = { width, title: this.#title, children: [...this.children], childLines, result };
299
+ return result;
300
+ }
301
+ }