@oh-my-pi/pi-tui 18.2.3 → 18.2.5

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 (750) hide show
  1. package/CHANGELOG.md +29 -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/image.d.ts +18 -16
  92. package/dist/types/components/key-value-list.d.ts +24 -0
  93. package/dist/types/components/layout/geometry.d.ts +73 -0
  94. package/dist/types/components/layout/row.d.ts +55 -0
  95. package/dist/types/components/layout/split-pane.d.ts +80 -0
  96. package/dist/types/components/layout/stack.d.ts +50 -0
  97. package/dist/types/components/menu-selection.d.ts +71 -0
  98. package/dist/types/components/metric.d.ts +44 -0
  99. package/dist/types/components/progress-bar.d.ts +36 -0
  100. package/dist/types/components/scroll-view.d.ts +53 -19
  101. package/dist/types/components/scroll-viewport.d.ts +46 -0
  102. package/dist/types/components/section.d.ts +19 -0
  103. package/dist/types/components/select-list.d.ts +46 -2
  104. package/dist/types/components/settings-list.d.ts +20 -0
  105. package/dist/types/components/table.d.ts +32 -0
  106. package/dist/types/components/tree-view.d.ts +130 -0
  107. package/dist/types/components/wizard-step.d.ts +60 -0
  108. package/dist/types/hotkeys-markdown.d.ts +7 -0
  109. package/dist/types/index.d.ts +17 -0
  110. package/dist/types/keybinding-matchers.d.ts +35 -0
  111. package/dist/types/keys.d.ts +2 -2
  112. package/dist/types/lang-from-path.d.ts +9 -0
  113. package/dist/types/overlays/advisor-config.d.ts +114 -0
  114. package/dist/types/overlays/agent-activity.d.ts +41 -0
  115. package/dist/types/overlays/agent-hub-projection.d.ts +33 -0
  116. package/dist/types/overlays/agent-hub-renderer.d.ts +53 -0
  117. package/dist/types/overlays/agent-hub-types.d.ts +99 -0
  118. package/dist/types/overlays/agent-hub.d.ts +126 -0
  119. package/dist/types/overlays/agent-transcript-viewer.d.ts +71 -0
  120. package/dist/types/overlays/agents-hub.d.ts +72 -0
  121. package/dist/types/overlays/ask-dialog.d.ts +88 -0
  122. package/dist/types/overlays/bordered-loader.d.ts +11 -0
  123. package/dist/types/overlays/btw-history-panel.d.ts +29 -0
  124. package/dist/types/overlays/btw-history.d.ts +17 -0
  125. package/dist/types/overlays/btw-panel.d.ts +26 -0
  126. package/dist/types/overlays/cleanse-panel.d.ts +36 -0
  127. package/dist/types/overlays/codex-reset-fireworks.d.ts +52 -0
  128. package/dist/types/overlays/composer-shape-preview.d.ts +47 -0
  129. package/dist/types/overlays/composer-shape-registry.d.ts +50 -0
  130. package/dist/types/overlays/copy-selector.d.ts +48 -0
  131. package/dist/types/overlays/copy-targets.d.ts +63 -0
  132. package/dist/types/overlays/error-banner.d.ts +13 -0
  133. package/dist/types/overlays/extensions/display-text.d.ts +10 -0
  134. package/dist/types/overlays/extensions/extension-dashboard.d.ts +63 -0
  135. package/dist/types/overlays/extensions/extension-list.d.ts +54 -0
  136. package/dist/types/overlays/extensions/inspector-model.d.ts +109 -0
  137. package/dist/types/overlays/extensions/inspector-panel.d.ts +17 -0
  138. package/dist/types/overlays/extensions/live-tool-session.d.ts +28 -0
  139. package/dist/types/overlays/extensions/mcp-runtime.d.ts +107 -0
  140. package/dist/types/overlays/extensions/state-manager.d.ts +42 -0
  141. package/dist/types/overlays/extensions/types.d.ts +165 -0
  142. package/dist/types/overlays/history-search.d.ts +16 -0
  143. package/dist/types/overlays/hook-editor.d.ts +44 -0
  144. package/dist/types/overlays/hook-input.d.ts +20 -0
  145. package/dist/types/overlays/hook-selector.d.ts +71 -0
  146. package/dist/types/overlays/hub-frame.d.ts +77 -0
  147. package/dist/types/overlays/login-dialog.d.ts +43 -0
  148. package/dist/types/overlays/logout-account-selector.d.ts +15 -0
  149. package/dist/types/overlays/mcp-add-wizard.d.ts +87 -0
  150. package/dist/types/overlays/model-browser.d.ts +213 -0
  151. package/dist/types/overlays/model-hub.d.ts +72 -0
  152. package/dist/types/overlays/model-picker.d.ts +74 -0
  153. package/dist/types/overlays/model-selector.d.ts +52 -0
  154. package/dist/types/overlays/move-overlay.d.ts +39 -0
  155. package/dist/types/overlays/oauth-selector.d.ts +41 -0
  156. package/dist/types/overlays/omfg-panel.d.ts +20 -0
  157. package/dist/types/overlays/pause-screen.d.ts +43 -0
  158. package/dist/types/overlays/plan-review-overlay.d.ts +89 -0
  159. package/dist/types/overlays/plan-save-overlay.d.ts +19 -0
  160. package/dist/types/overlays/plan-toc.d.ts +41 -0
  161. package/dist/types/overlays/plugin-selector.d.ts +28 -0
  162. package/dist/types/overlays/plugin-settings.d.ts +180 -0
  163. package/dist/types/overlays/queue-mode-selector.d.ts +11 -0
  164. package/dist/types/overlays/reset-usage-selector.d.ts +23 -0
  165. package/dist/types/overlays/rewind-selector.d.ts +61 -0
  166. package/dist/types/overlays/running-subagent-badge.d.ts +6 -0
  167. package/dist/types/overlays/session-account-selector.d.ts +24 -0
  168. package/dist/types/overlays/session-info-overlay.d.ts +17 -0
  169. package/dist/types/overlays/session-observer-registry.d.ts +77 -0
  170. package/dist/types/overlays/session-selector.d.ts +131 -0
  171. package/dist/types/overlays/settings-defs.d.ts +119 -0
  172. package/dist/types/overlays/settings-selector.d.ts +73 -0
  173. package/dist/types/overlays/show-images-selector.d.ts +11 -0
  174. package/dist/types/overlays/snapcompact-shape-preview.d.ts +31 -0
  175. package/dist/types/overlays/theme-selector.d.ts +12 -0
  176. package/dist/types/overlays/thinking-selector.d.ts +12 -0
  177. package/dist/types/overlays/tiny-title-download-progress.d.ts +21 -0
  178. package/dist/types/overlays/tree-selector.d.ts +92 -0
  179. package/dist/types/overlays/usage-dashboard.d.ts +94 -0
  180. package/dist/types/overlays/usage-display.d.ts +5 -0
  181. package/dist/types/overlays/usage-row.d.ts +17 -0
  182. package/dist/types/prompt/attachment-chips.d.ts +19 -0
  183. package/dist/types/prompt/composer-attachments.d.ts +71 -0
  184. package/dist/types/prompt/composer-cache.d.ts +37 -0
  185. package/dist/types/prompt/composer.d.ts +159 -0
  186. package/dist/types/prompt/custom-editor.d.ts +261 -0
  187. package/dist/types/prompt/editor-top-gap.d.ts +18 -0
  188. package/dist/types/prompt/emoji-autocomplete.d.ts +16 -0
  189. package/dist/types/prompt/github-ref-autocomplete.d.ts +35 -0
  190. package/dist/types/prompt/gradient-highlight.d.ts +32 -0
  191. package/dist/types/prompt/image-format.d.ts +4 -0
  192. package/dist/types/prompt/image-references.d.ts +26 -0
  193. package/dist/types/prompt/interactive-context-helpers.d.ts +43 -0
  194. package/dist/types/prompt/internal-url-autocomplete.d.ts +56 -0
  195. package/dist/types/prompt/macos-spelling.d.ts +44 -0
  196. package/dist/types/prompt/magic-keyword-boundary.d.ts +9 -0
  197. package/dist/types/prompt/magic-keywords.d.ts +26 -0
  198. package/dist/types/prompt/markdown-prose.d.ts +15 -0
  199. package/dist/types/prompt/model-mention-autocomplete.d.ts +25 -0
  200. package/dist/types/prompt/model-mention-syntax.d.ts +24 -0
  201. package/dist/types/prompt/orchestrate.d.ts +13 -0
  202. package/dist/types/prompt/prompt-action-autocomplete.d.ts +56 -0
  203. package/dist/types/prompt/queue-input.d.ts +8 -0
  204. package/dist/types/prompt/skill-tokens.d.ts +13 -0
  205. package/dist/types/prompt/tools-markdown.d.ts +12 -0
  206. package/dist/types/prompt/ultrathink.d.ts +13 -0
  207. package/dist/types/prompt/usage-amounts.d.ts +26 -0
  208. package/dist/types/prompt/video.d.ts +18 -0
  209. package/dist/types/prompt/welcome.d.ts +83 -0
  210. package/dist/types/prompt/workflow.d.ts +13 -0
  211. package/dist/types/render/code-cell.d.ts +51 -0
  212. package/dist/types/render/file-list.d.ts +22 -0
  213. package/dist/types/render/hyperlink.d.ts +80 -0
  214. package/dist/types/render/index.d.ts +16 -0
  215. package/dist/types/render/output-block.d.ts +54 -0
  216. package/dist/types/render/output-pane.d.ts +80 -0
  217. package/dist/types/render/render-utils.d.ts +312 -0
  218. package/dist/types/render/sixel.d.ts +21 -0
  219. package/dist/types/render/status-line.d.ts +23 -0
  220. package/dist/types/render/tool-card.d.ts +71 -0
  221. package/dist/types/render/tree-list.d.ts +29 -0
  222. package/dist/types/render/types.d.ts +17 -0
  223. package/dist/types/render/utils.d.ts +43 -0
  224. package/dist/types/render/width-aware-text.d.ts +23 -0
  225. package/dist/types/setup/lazy.d.ts +3 -0
  226. package/dist/types/setup/scenes/composer.d.ts +3 -0
  227. package/dist/types/setup/scenes/glyph.d.ts +3 -0
  228. package/dist/types/setup/scenes/model.d.ts +3 -0
  229. package/dist/types/setup/scenes/outro.d.ts +2 -0
  230. package/dist/types/setup/scenes/providers.d.ts +3 -0
  231. package/dist/types/setup/scenes/sign-in.d.ts +21 -0
  232. package/dist/types/setup/scenes/splash.d.ts +11 -0
  233. package/dist/types/setup/scenes/theme.d.ts +3 -0
  234. package/dist/types/setup/scenes/types.d.ts +110 -0
  235. package/dist/types/setup/scenes/web-search.d.ts +22 -0
  236. package/dist/types/setup/setup-version.d.ts +11 -0
  237. package/dist/types/setup/startup-splash.d.ts +9 -0
  238. package/dist/types/setup/wizard-overlay.d.ts +16 -0
  239. package/dist/types/setup/wizard.d.ts +25 -0
  240. package/dist/types/status-line/component.d.ts +182 -0
  241. package/dist/types/status-line/context-usage.d.ts +156 -0
  242. package/dist/types/status-line/footer.d.ts +30 -0
  243. package/dist/types/status-line/git-utils.d.ts +22 -0
  244. package/dist/types/status-line/host.d.ts +129 -0
  245. package/dist/types/status-line/index.d.ts +6 -0
  246. package/dist/types/status-line/loop.d.ts +18 -0
  247. package/dist/types/status-line/metrics.d.ts +21 -0
  248. package/dist/types/status-line/presets.d.ts +3 -0
  249. package/dist/types/status-line/schema.d.ts +15 -0
  250. package/dist/types/status-line/segments.d.ts +5 -0
  251. package/dist/types/status-line/separators.d.ts +3 -0
  252. package/dist/types/status-line/types.d.ts +236 -0
  253. package/dist/types/stdin-buffer.d.ts +4 -0
  254. package/dist/types/theme/color.d.ts +24 -0
  255. package/dist/types/theme/defaults/index.d.ts +9489 -0
  256. package/dist/types/theme/index.d.ts +4 -0
  257. package/dist/types/theme/loader.d.ts +23 -0
  258. package/dist/types/theme/mermaid-cache.d.ts +26 -0
  259. package/dist/types/theme/schema-validation.d.ts +3 -0
  260. package/dist/types/theme/schema.d.ts +25 -0
  261. package/dist/types/theme/session-color.d.ts +43 -0
  262. package/dist/types/theme/shimmer.d.ts +44 -0
  263. package/dist/types/theme/symbols.d.ts +34 -0
  264. package/dist/types/theme/theme-class.d.ts +299 -0
  265. package/dist/types/theme/theme.d.ts +111 -0
  266. package/dist/types/theme/tui-adapters.d.ts +30 -0
  267. package/dist/types/thinking.d.ts +165 -0
  268. package/dist/types/tools/agent-tree.d.ts +36 -0
  269. package/dist/types/tools/ask.d.ts +67 -0
  270. package/dist/types/tools/ast-edit.d.ts +53 -0
  271. package/dist/types/tools/ast-grep.d.ts +52 -0
  272. package/dist/types/tools/autoresearch.d.ts +156 -0
  273. package/dist/types/tools/bash-interactive.d.ts +28 -0
  274. package/dist/types/tools/bash.d.ts +103 -0
  275. package/dist/types/tools/conflict-detect.d.ts +43 -0
  276. package/dist/types/tools/debug.d.ts +60 -0
  277. package/dist/types/tools/default-renderer.d.ts +24 -0
  278. package/dist/types/tools/edit.d.ts +158 -0
  279. package/dist/types/tools/eval-format/code-mode-declarations.d.ts +5 -0
  280. package/dist/types/tools/eval-format/index.d.ts +5 -0
  281. package/dist/types/tools/eval-format/javascript.d.ts +2 -0
  282. package/dist/types/tools/eval-format/python.d.ts +2 -0
  283. package/dist/types/tools/eval.d.ts +94 -0
  284. package/dist/types/tools/fetch.d.ts +42 -0
  285. package/dist/types/tools/gh-format.d.ts +8 -0
  286. package/dist/types/tools/github.d.ts +144 -0
  287. package/dist/types/tools/glob.d.ts +44 -0
  288. package/dist/types/tools/goal.d.ts +42 -0
  289. package/dist/types/tools/grep.d.ts +64 -0
  290. package/dist/types/tools/grouped-file-output.d.ts +71 -0
  291. package/dist/types/tools/hashline-format.d.ts +28 -0
  292. package/dist/types/tools/hub.d.ts +340 -0
  293. package/dist/types/tools/index.d.ts +4 -0
  294. package/dist/types/tools/json-tree.d.ts +59 -0
  295. package/dist/types/tools/line-ranges.d.ts +29 -0
  296. package/dist/types/tools/list-limit.d.ts +15 -0
  297. package/dist/types/tools/lsp.d.ts +72 -0
  298. package/dist/types/tools/match-line-format.d.ts +11 -0
  299. package/dist/types/tools/mcp.d.ts +81 -0
  300. package/dist/types/tools/memory.d.ts +67 -0
  301. package/dist/types/tools/output-meta.d.ts +151 -0
  302. package/dist/types/tools/read.d.ts +139 -0
  303. package/dist/types/tools/renderer.d.ts +98 -0
  304. package/dist/types/tools/report-tool-issue.d.ts +8 -0
  305. package/dist/types/tools/resolve.d.ts +47 -0
  306. package/dist/types/tools/streaming-output.d.ts +282 -0
  307. package/dist/types/tools/subprocess.d.ts +24 -0
  308. package/dist/types/tools/task-repair-args.d.ts +53 -0
  309. package/dist/types/tools/task-yield-assembly.d.ts +20 -0
  310. package/dist/types/tools/task.d.ts +425 -0
  311. package/dist/types/tools/terminal-output.d.ts +8 -0
  312. package/dist/types/tools/think.d.ts +13 -0
  313. package/dist/types/tools/todo.d.ts +118 -0
  314. package/dist/types/tools/tool-errors.d.ts +7 -0
  315. package/dist/types/tools/vibe.d.ts +120 -0
  316. package/dist/types/tools/web-search.d.ts +195 -0
  317. package/dist/types/tools/write.d.ts +76 -0
  318. package/dist/types/tools/xd-url.d.ts +13 -0
  319. package/dist/types/tools/xdev.d.ts +52 -0
  320. package/dist/types/tui.d.ts +18 -0
  321. package/dist/types/utils.d.ts +2 -0
  322. package/package.json +37 -3
  323. package/src/app-keybindings.ts +760 -0
  324. package/src/apps/autoresearch-dashboard.ts +500 -0
  325. package/src/apps/autoresearch-data.ts +64 -0
  326. package/src/apps/cleanse-board.ts +341 -0
  327. package/src/apps/cleanse-picker.ts +57 -0
  328. package/src/apps/debug/log-formatting.ts +53 -0
  329. package/src/apps/debug/log-viewer.ts +868 -0
  330. package/src/apps/debug/protocol-probe.ts +267 -0
  331. package/src/apps/debug/raw-sse-buffer.ts +449 -0
  332. package/src/apps/debug/raw-sse.ts +282 -0
  333. package/src/apps/debug/terminal-info.ts +115 -0
  334. package/src/apps/debug/viewer-frame.ts +174 -0
  335. package/src/apps/git/avatar.ts +52 -0
  336. package/src/apps/git/colors.ts +109 -0
  337. package/src/apps/git/diff-pane.ts +1512 -0
  338. package/src/apps/git/git-tui.ts +889 -0
  339. package/src/apps/git/sidebar.ts +1204 -0
  340. package/src/apps/git/state.ts +113 -0
  341. package/src/apps/if-bench-board.ts +324 -0
  342. package/src/apps/live-visualizer.ts +238 -0
  343. package/src/apps/ps-data.ts +116 -0
  344. package/src/apps/ps-top.ts +422 -0
  345. package/src/apps/session-picker.ts +95 -0
  346. package/src/apps/setup-model-picker.ts +21 -0
  347. package/src/apps/standalone-picker.ts +111 -0
  348. package/src/autocomplete.ts +9 -13
  349. package/src/chat/advisor-message.ts +175 -0
  350. package/src/chat/assistant-message.ts +1214 -0
  351. package/src/chat/background-tan-message.ts +35 -0
  352. package/src/chat/bash-execution.ts +394 -0
  353. package/src/chat/cache-invalidation-marker.ts +94 -0
  354. package/src/chat/chat-transcript-builder.ts +593 -0
  355. package/src/chat/collab-prompt-message.ts +34 -0
  356. package/src/chat/compaction-summary-message.ts +261 -0
  357. package/src/chat/custom-message.ts +23 -0
  358. package/src/chat/display-preferences.ts +24 -0
  359. package/src/chat/eval-execution.ts +172 -0
  360. package/src/chat/execution-shared.ts +113 -0
  361. package/src/chat/extension-types.ts +46 -0
  362. package/src/chat/hook-message.ts +20 -0
  363. package/src/chat/image-loading.ts +122 -0
  364. package/src/chat/late-diagnostics-message.ts +92 -0
  365. package/src/chat/messages.ts +305 -0
  366. package/src/chat/reaction.ts +65 -0
  367. package/src/chat/read-target.ts +7 -0
  368. package/src/chat/read-tool-group.ts +873 -0
  369. package/src/chat/served-model-marker.ts +91 -0
  370. package/src/chat/skill-message.ts +220 -0
  371. package/src/chat/skill-title-input.ts +41 -0
  372. package/src/chat/stripped-tool-calls-placeholder.ts +35 -0
  373. package/src/chat/thinking-display.ts +312 -0
  374. package/src/chat/todo-reminder.ts +33 -0
  375. package/src/chat/tool-execution.ts +1395 -0
  376. package/src/chat/transcript-browser.ts +268 -0
  377. package/src/chat/transcript-entry.ts +96 -0
  378. package/src/chat/transcript-outline.ts +260 -0
  379. package/src/chat/transcript-render-helpers.ts +315 -0
  380. package/src/chat/ttsr-notification.ts +123 -0
  381. package/src/chat/user-message.ts +287 -0
  382. package/src/chrome/chat-block.ts +110 -0
  383. package/src/chrome/collab-qrcode.ts +74 -0
  384. package/src/chrome/context-thresholds.ts +85 -0
  385. package/src/chrome/countdown-timer.ts +74 -0
  386. package/src/chrome/diff.ts +266 -0
  387. package/src/chrome/dynamic-border.ts +36 -0
  388. package/src/chrome/error-block.ts +63 -0
  389. package/src/chrome/form-theme.ts +10 -0
  390. package/src/chrome/format.ts +66 -0
  391. package/src/chrome/index.ts +21 -0
  392. package/src/chrome/keybinding-hints.ts +55 -0
  393. package/src/chrome/live-board.ts +123 -0
  394. package/src/chrome/local-date.ts +20 -0
  395. package/src/chrome/message-divider.ts +51 -0
  396. package/src/chrome/message-frame.ts +164 -0
  397. package/src/chrome/message-notice.ts +103 -0
  398. package/src/chrome/overlay-box.ts +301 -0
  399. package/src/chrome/qrcode.ts +539 -0
  400. package/src/chrome/segment-track.ts +86 -0
  401. package/src/chrome/select-list-mouse-routing.ts +11 -0
  402. package/src/chrome/selector-helpers.ts +119 -0
  403. package/src/chrome/shared.ts +27 -0
  404. package/src/chrome/streaming-panel.ts +72 -0
  405. package/src/chrome/tool-activity.ts +44 -0
  406. package/src/chrome/transcript-container.ts +902 -0
  407. package/src/chrome/transcript-status.ts +27 -0
  408. package/src/chrome/visual-truncate.ts +70 -0
  409. package/src/components/disclosure.ts +235 -0
  410. package/src/components/editor.ts +10 -12
  411. package/src/components/form.ts +566 -0
  412. package/src/components/image.ts +80 -53
  413. package/src/components/input.ts +6 -27
  414. package/src/components/key-value-list.ts +88 -0
  415. package/src/components/layout/geometry.ts +202 -0
  416. package/src/components/layout/row.ts +283 -0
  417. package/src/components/layout/split-pane.ts +349 -0
  418. package/src/components/layout/stack.ts +261 -0
  419. package/src/components/markdown.ts +16 -12
  420. package/src/components/menu-selection.ts +248 -0
  421. package/src/components/metric.ts +132 -0
  422. package/src/components/progress-bar.ts +140 -0
  423. package/src/components/scroll-view.ts +372 -70
  424. package/src/components/scroll-viewport.ts +154 -0
  425. package/src/components/section.ts +77 -0
  426. package/src/components/select-list.ts +238 -159
  427. package/src/components/settings-list.ts +103 -80
  428. package/src/components/table.ts +127 -0
  429. package/src/components/tree-view.ts +481 -0
  430. package/src/components/wizard-step.ts +229 -0
  431. package/src/deccara.ts +1 -3
  432. package/src/hotkeys-markdown.ts +100 -0
  433. package/src/index.ts +18 -0
  434. package/src/keybinding-matchers.ts +99 -0
  435. package/src/keys.ts +2 -2
  436. package/src/lang-from-path.ts +252 -0
  437. package/src/overlays/advisor-config.ts +761 -0
  438. package/src/overlays/agent-activity.ts +113 -0
  439. package/src/overlays/agent-hub-projection.ts +250 -0
  440. package/src/overlays/agent-hub-renderer.ts +281 -0
  441. package/src/overlays/agent-hub-types.ts +74 -0
  442. package/src/overlays/agent-hub.ts +1562 -0
  443. package/src/overlays/agent-transcript-viewer.ts +669 -0
  444. package/src/overlays/agents-hub.ts +1203 -0
  445. package/src/overlays/ask-dialog.ts +1202 -0
  446. package/src/overlays/bordered-loader.ts +41 -0
  447. package/src/overlays/btw-history-panel.ts +591 -0
  448. package/src/overlays/btw-history.ts +33 -0
  449. package/src/overlays/btw-panel.ts +167 -0
  450. package/src/overlays/cleanse-panel.ts +167 -0
  451. package/src/overlays/codex-reset-fireworks.ts +375 -0
  452. package/src/overlays/composer-shape-preview.ts +137 -0
  453. package/src/overlays/composer-shape-registry.ts +82 -0
  454. package/src/overlays/copy-selector.ts +618 -0
  455. package/src/overlays/copy-targets.ts +210 -0
  456. package/src/overlays/error-banner.ts +39 -0
  457. package/src/overlays/extensions/display-text.ts +39 -0
  458. package/src/overlays/extensions/extension-dashboard.ts +645 -0
  459. package/src/overlays/extensions/extension-list.ts +667 -0
  460. package/src/overlays/extensions/inspector-model.ts +484 -0
  461. package/src/overlays/extensions/inspector-panel.ts +669 -0
  462. package/src/overlays/extensions/live-tool-session.ts +67 -0
  463. package/src/overlays/extensions/mcp-runtime.ts +289 -0
  464. package/src/overlays/extensions/state-manager.ts +337 -0
  465. package/src/overlays/extensions/types.ts +208 -0
  466. package/src/overlays/history-search.ts +268 -0
  467. package/src/overlays/hook-editor.ts +272 -0
  468. package/src/overlays/hook-input.ts +84 -0
  469. package/src/overlays/hook-selector.ts +635 -0
  470. package/src/overlays/hub-frame.ts +262 -0
  471. package/src/overlays/login-dialog.ts +231 -0
  472. package/src/overlays/logout-account-selector.ts +115 -0
  473. package/src/overlays/mcp-add-wizard.ts +1436 -0
  474. package/src/overlays/model-browser.ts +1176 -0
  475. package/src/overlays/model-hub.ts +2279 -0
  476. package/src/overlays/model-picker.ts +285 -0
  477. package/src/overlays/model-selector.ts +107 -0
  478. package/src/overlays/move-overlay.ts +197 -0
  479. package/src/overlays/oauth-selector.ts +446 -0
  480. package/src/overlays/omfg-panel.ts +136 -0
  481. package/src/overlays/pause-screen.ts +198 -0
  482. package/src/overlays/plan-review-overlay.ts +1227 -0
  483. package/src/overlays/plan-save-overlay.ts +74 -0
  484. package/src/overlays/plan-toc.ts +139 -0
  485. package/src/overlays/plugin-selector.ts +97 -0
  486. package/src/overlays/plugin-settings.ts +839 -0
  487. package/src/overlays/queue-mode-selector.ts +55 -0
  488. package/src/overlays/reset-usage-selector.ts +170 -0
  489. package/src/overlays/rewind-selector.ts +499 -0
  490. package/src/overlays/running-subagent-badge.ts +19 -0
  491. package/src/overlays/session-account-selector.ts +68 -0
  492. package/src/overlays/session-info-overlay.ts +96 -0
  493. package/src/overlays/session-observer-registry.ts +289 -0
  494. package/src/overlays/session-selector.ts +1137 -0
  495. package/src/overlays/settings-defs.ts +315 -0
  496. package/src/overlays/settings-selector.ts +1415 -0
  497. package/src/overlays/show-images-selector.ts +44 -0
  498. package/src/overlays/snapcompact-shape-preview-doc.md +14 -0
  499. package/src/overlays/snapcompact-shape-preview.ts +192 -0
  500. package/src/overlays/theme-selector.ts +62 -0
  501. package/src/overlays/thinking-selector.ts +51 -0
  502. package/src/overlays/tiny-title-download-progress.ts +102 -0
  503. package/src/overlays/tree-selector.ts +1121 -0
  504. package/src/overlays/usage-dashboard.ts +629 -0
  505. package/src/overlays/usage-display.ts +45 -0
  506. package/src/overlays/usage-row.ts +118 -0
  507. package/src/prompt/attachment-chips.ts +201 -0
  508. package/src/prompt/composer-attachments.ts +280 -0
  509. package/src/prompt/composer-cache.ts +304 -0
  510. package/src/prompt/composer.ts +934 -0
  511. package/src/prompt/custom-editor.ts +1392 -0
  512. package/src/prompt/data/emojis.json +1 -0
  513. package/src/prompt/editor-top-gap.ts +28 -0
  514. package/src/prompt/emoji-autocomplete.ts +285 -0
  515. package/src/prompt/github-ref-autocomplete.ts +75 -0
  516. package/src/prompt/gradient-highlight.ts +101 -0
  517. package/src/prompt/image-format.ts +28 -0
  518. package/src/prompt/image-references.ts +102 -0
  519. package/src/prompt/interactive-context-helpers.ts +126 -0
  520. package/src/prompt/internal-url-autocomplete.ts +155 -0
  521. package/src/prompt/macos-spelling.ts +456 -0
  522. package/src/prompt/magic-keyword-boundary.ts +23 -0
  523. package/src/prompt/magic-keywords.ts +42 -0
  524. package/src/prompt/markdown-prose.ts +245 -0
  525. package/src/prompt/model-mention-autocomplete.ts +94 -0
  526. package/src/prompt/model-mention-syntax.ts +41 -0
  527. package/src/prompt/orchestrate.ts +26 -0
  528. package/src/prompt/prompt-action-autocomplete.ts +337 -0
  529. package/src/prompt/queue-input.ts +132 -0
  530. package/src/prompt/skill-tokens.ts +36 -0
  531. package/src/prompt/tips.txt +27 -0
  532. package/src/prompt/tools-markdown.ts +29 -0
  533. package/src/prompt/ultrathink.ts +26 -0
  534. package/src/prompt/usage-amounts.ts +99 -0
  535. package/src/prompt/video.ts +47 -0
  536. package/src/prompt/welcome.ts +605 -0
  537. package/src/prompt/workflow.ts +26 -0
  538. package/src/render/code-cell.ts +244 -0
  539. package/src/render/file-list.ts +58 -0
  540. package/src/render/hyperlink.ts +192 -0
  541. package/src/render/index.ts +17 -0
  542. package/src/render/output-block.ts +267 -0
  543. package/src/render/output-pane.ts +299 -0
  544. package/src/render/render-utils.ts +1182 -0
  545. package/src/render/sixel.ts +69 -0
  546. package/src/render/status-line.ts +55 -0
  547. package/src/render/tool-card.ts +272 -0
  548. package/src/render/tree-list.ts +188 -0
  549. package/src/render/types.ts +19 -0
  550. package/src/render/utils.ts +109 -0
  551. package/src/render/width-aware-text.ts +60 -0
  552. package/src/setup/lazy.ts +17 -0
  553. package/src/setup/scenes/composer.ts +127 -0
  554. package/src/setup/scenes/glyph.ts +120 -0
  555. package/src/setup/scenes/model.ts +138 -0
  556. package/src/setup/scenes/outro.ts +24 -0
  557. package/src/setup/scenes/providers.ts +107 -0
  558. package/src/setup/scenes/sign-in.ts +373 -0
  559. package/src/setup/scenes/splash.ts +192 -0
  560. package/src/setup/scenes/theme.ts +343 -0
  561. package/src/setup/scenes/types.ts +111 -0
  562. package/src/setup/scenes/web-search.ts +165 -0
  563. package/src/setup/setup-version.ts +11 -0
  564. package/src/setup/startup-splash.ts +107 -0
  565. package/src/setup/wizard-overlay.ts +319 -0
  566. package/src/setup/wizard.ts +101 -0
  567. package/src/status-line/component.ts +3003 -0
  568. package/src/status-line/context-usage.ts +688 -0
  569. package/src/status-line/footer.ts +323 -0
  570. package/src/status-line/git-utils.ts +42 -0
  571. package/src/status-line/host.ts +97 -0
  572. package/src/status-line/index.ts +6 -0
  573. package/src/status-line/loop.ts +28 -0
  574. package/src/status-line/metrics.ts +94 -0
  575. package/src/status-line/presets.ts +107 -0
  576. package/src/status-line/schema.ts +57 -0
  577. package/src/status-line/segments.ts +934 -0
  578. package/src/status-line/separators.ts +55 -0
  579. package/src/status-line/types.ts +227 -0
  580. package/src/stdin-buffer.ts +4 -2
  581. package/src/theme/color.ts +95 -0
  582. package/src/theme/dark.json +95 -0
  583. package/src/theme/defaults/alabaster.json +93 -0
  584. package/src/theme/defaults/amethyst.json +96 -0
  585. package/src/theme/defaults/anthracite.json +93 -0
  586. package/src/theme/defaults/basalt.json +91 -0
  587. package/src/theme/defaults/birch.json +95 -0
  588. package/src/theme/defaults/dark-abyss.json +91 -0
  589. package/src/theme/defaults/dark-arctic.json +104 -0
  590. package/src/theme/defaults/dark-aurora.json +95 -0
  591. package/src/theme/defaults/dark-catppuccin.json +107 -0
  592. package/src/theme/defaults/dark-cavern.json +91 -0
  593. package/src/theme/defaults/dark-celestial.json +106 -0
  594. package/src/theme/defaults/dark-copper.json +95 -0
  595. package/src/theme/defaults/dark-cosmos.json +90 -0
  596. package/src/theme/defaults/dark-cyberpunk.json +102 -0
  597. package/src/theme/defaults/dark-dracula.json +98 -0
  598. package/src/theme/defaults/dark-eclipse.json +91 -0
  599. package/src/theme/defaults/dark-ember.json +95 -0
  600. package/src/theme/defaults/dark-equinox.json +90 -0
  601. package/src/theme/defaults/dark-forest.json +96 -0
  602. package/src/theme/defaults/dark-github.json +105 -0
  603. package/src/theme/defaults/dark-gruvbox.json +112 -0
  604. package/src/theme/defaults/dark-lavender.json +95 -0
  605. package/src/theme/defaults/dark-lunar.json +89 -0
  606. package/src/theme/defaults/dark-midnight.json +95 -0
  607. package/src/theme/defaults/dark-monochrome.json +94 -0
  608. package/src/theme/defaults/dark-monokai.json +98 -0
  609. package/src/theme/defaults/dark-nebula.json +90 -0
  610. package/src/theme/defaults/dark-nord.json +98 -0
  611. package/src/theme/defaults/dark-ocean.json +101 -0
  612. package/src/theme/defaults/dark-one.json +100 -0
  613. package/src/theme/defaults/dark-poimandres.json +115 -0
  614. package/src/theme/defaults/dark-rainforest.json +91 -0
  615. package/src/theme/defaults/dark-reef.json +91 -0
  616. package/src/theme/defaults/dark-retro.json +92 -0
  617. package/src/theme/defaults/dark-rose-pine.json +96 -0
  618. package/src/theme/defaults/dark-sakura.json +95 -0
  619. package/src/theme/defaults/dark-slate.json +95 -0
  620. package/src/theme/defaults/dark-solarized.json +97 -0
  621. package/src/theme/defaults/dark-solstice.json +90 -0
  622. package/src/theme/defaults/dark-starfall.json +91 -0
  623. package/src/theme/defaults/dark-sunset.json +99 -0
  624. package/src/theme/defaults/dark-swamp.json +90 -0
  625. package/src/theme/defaults/dark-synthwave.json +103 -0
  626. package/src/theme/defaults/dark-taiga.json +91 -0
  627. package/src/theme/defaults/dark-terminal.json +95 -0
  628. package/src/theme/defaults/dark-tokyo-night.json +101 -0
  629. package/src/theme/defaults/dark-tundra.json +91 -0
  630. package/src/theme/defaults/dark-twilight.json +91 -0
  631. package/src/theme/defaults/dark-volcanic.json +91 -0
  632. package/src/theme/defaults/graphite.json +92 -0
  633. package/src/theme/defaults/index.ts +201 -0
  634. package/src/theme/defaults/light-arctic.json +107 -0
  635. package/src/theme/defaults/light-aurora-day.json +91 -0
  636. package/src/theme/defaults/light-canyon.json +91 -0
  637. package/src/theme/defaults/light-catppuccin.json +106 -0
  638. package/src/theme/defaults/light-cirrus.json +90 -0
  639. package/src/theme/defaults/light-coral.json +95 -0
  640. package/src/theme/defaults/light-cyberpunk.json +96 -0
  641. package/src/theme/defaults/light-dawn.json +90 -0
  642. package/src/theme/defaults/light-dunes.json +91 -0
  643. package/src/theme/defaults/light-eucalyptus.json +95 -0
  644. package/src/theme/defaults/light-forest.json +100 -0
  645. package/src/theme/defaults/light-frost.json +95 -0
  646. package/src/theme/defaults/light-github.json +115 -0
  647. package/src/theme/defaults/light-glacier.json +91 -0
  648. package/src/theme/defaults/light-gruvbox.json +108 -0
  649. package/src/theme/defaults/light-haze.json +90 -0
  650. package/src/theme/defaults/light-honeycomb.json +95 -0
  651. package/src/theme/defaults/light-lagoon.json +91 -0
  652. package/src/theme/defaults/light-lavender.json +95 -0
  653. package/src/theme/defaults/light-meadow.json +91 -0
  654. package/src/theme/defaults/light-mint.json +95 -0
  655. package/src/theme/defaults/light-monochrome.json +101 -0
  656. package/src/theme/defaults/light-ocean.json +99 -0
  657. package/src/theme/defaults/light-one.json +99 -0
  658. package/src/theme/defaults/light-opal.json +91 -0
  659. package/src/theme/defaults/light-orchard.json +91 -0
  660. package/src/theme/defaults/light-paper.json +95 -0
  661. package/src/theme/defaults/light-poimandres.json +115 -0
  662. package/src/theme/defaults/light-prism.json +90 -0
  663. package/src/theme/defaults/light-retro.json +98 -0
  664. package/src/theme/defaults/light-sand.json +95 -0
  665. package/src/theme/defaults/light-savanna.json +91 -0
  666. package/src/theme/defaults/light-solarized.json +102 -0
  667. package/src/theme/defaults/light-soleil.json +90 -0
  668. package/src/theme/defaults/light-sunset.json +99 -0
  669. package/src/theme/defaults/light-synthwave.json +98 -0
  670. package/src/theme/defaults/light-tokyo-night.json +111 -0
  671. package/src/theme/defaults/light-wetland.json +91 -0
  672. package/src/theme/defaults/light-zenith.json +89 -0
  673. package/src/theme/defaults/limestone.json +94 -0
  674. package/src/theme/defaults/mahogany.json +97 -0
  675. package/src/theme/defaults/marble.json +93 -0
  676. package/src/theme/defaults/obsidian.json +91 -0
  677. package/src/theme/defaults/onyx.json +91 -0
  678. package/src/theme/defaults/pearl.json +93 -0
  679. package/src/theme/defaults/porcelain.json +91 -0
  680. package/src/theme/defaults/quartz.json +96 -0
  681. package/src/theme/defaults/sandstone.json +95 -0
  682. package/src/theme/defaults/titanium.json +90 -0
  683. package/src/theme/index.ts +5 -0
  684. package/src/theme/light.json +93 -0
  685. package/src/theme/loader.ts +200 -0
  686. package/src/theme/mermaid-cache.ts +92 -0
  687. package/src/theme/schema-validation.ts +119 -0
  688. package/src/theme/schema.ts +168 -0
  689. package/src/theme/session-color.ts +253 -0
  690. package/src/theme/shimmer.ts +307 -0
  691. package/src/theme/symbols.ts +1433 -0
  692. package/src/theme/theme-class.ts +787 -0
  693. package/src/theme/theme-schema.json +463 -0
  694. package/src/theme/theme.ts +810 -0
  695. package/src/theme/tui-adapters.ts +339 -0
  696. package/src/thinking.ts +380 -0
  697. package/src/tools/agent-tree.ts +128 -0
  698. package/src/tools/ask.ts +482 -0
  699. package/src/tools/ast-edit.ts +210 -0
  700. package/src/tools/ast-grep.ts +171 -0
  701. package/src/tools/autoresearch.ts +287 -0
  702. package/src/tools/bash-interactive.ts +295 -0
  703. package/src/tools/bash.ts +468 -0
  704. package/src/tools/conflict-detect.ts +77 -0
  705. package/src/tools/debug.ts +167 -0
  706. package/src/tools/default-renderer.ts +172 -0
  707. package/src/tools/edit.ts +1258 -0
  708. package/src/tools/eval-format/code-mode-declarations.ts +61 -0
  709. package/src/tools/eval-format/index.ts +16 -0
  710. package/src/tools/eval-format/javascript.ts +952 -0
  711. package/src/tools/eval-format/python.ts +544 -0
  712. package/src/tools/eval.ts +835 -0
  713. package/src/tools/fetch.ts +226 -0
  714. package/src/tools/gh-format.ts +18 -0
  715. package/src/tools/github.ts +686 -0
  716. package/src/tools/glob.ts +213 -0
  717. package/src/tools/goal.ts +153 -0
  718. package/src/tools/grep.ts +385 -0
  719. package/src/tools/grouped-file-output.ts +211 -0
  720. package/src/tools/hashline-format.ts +59 -0
  721. package/src/tools/hub.ts +1488 -0
  722. package/src/tools/index.ts +71 -0
  723. package/src/tools/json-tree.ts +388 -0
  724. package/src/tools/line-ranges.ts +98 -0
  725. package/src/tools/list-limit.ts +43 -0
  726. package/src/tools/lsp.ts +702 -0
  727. package/src/tools/match-line-format.ts +20 -0
  728. package/src/tools/mcp.ts +309 -0
  729. package/src/tools/memory.ts +220 -0
  730. package/src/tools/output-meta.ts +367 -0
  731. package/src/tools/read.ts +628 -0
  732. package/src/tools/renderer.ts +107 -0
  733. package/src/tools/report-tool-issue.ts +13 -0
  734. package/src/tools/resolve.ts +139 -0
  735. package/src/tools/streaming-output.ts +1576 -0
  736. package/src/tools/subprocess.ts +39 -0
  737. package/src/tools/task-repair-args.ts +118 -0
  738. package/src/tools/task-yield-assembly.ts +147 -0
  739. package/src/tools/task.ts +2110 -0
  740. package/src/tools/terminal-output.ts +153 -0
  741. package/src/tools/think.ts +28 -0
  742. package/src/tools/todo.ts +580 -0
  743. package/src/tools/tool-errors.ts +15 -0
  744. package/src/tools/vibe.ts +420 -0
  745. package/src/tools/web-search.ts +409 -0
  746. package/src/tools/write.ts +511 -0
  747. package/src/tools/xd-url.ts +28 -0
  748. package/src/tools/xdev.ts +201 -0
  749. package/src/tui.ts +70 -8
  750. package/src/utils.ts +8 -0
@@ -0,0 +1,71 @@
1
+ /**
2
+ * Built-in tool renderer registry: maps tool names to their transcript renderers.
3
+ * `ToolExecutionComponent` and the `xd://` dispatch look renderers up here;
4
+ * tools without an entry fall back to `renderDefaultToolExecution`.
5
+ */
6
+ import { askToolRenderer } from "./ask";
7
+ import { astEditToolRenderer } from "./ast-edit";
8
+ import { astGrepToolRenderer } from "./ast-grep";
9
+ import { bashToolRenderer } from "./bash";
10
+ import { debugToolRenderer } from "./debug";
11
+ import { editToolRenderer } from "./edit";
12
+ import { evalToolRenderer } from "./eval";
13
+ import { githubToolRenderer } from "./github";
14
+ import { globToolRenderer } from "./glob";
15
+ import { goalToolRenderer } from "./goal";
16
+ import { grepToolRenderer } from "./grep";
17
+ import { hubToolRenderer } from "./hub";
18
+ import { lspToolRenderer } from "./lsp";
19
+ import { recallToolRenderer, reflectToolRenderer, retainToolRenderer } from "./memory";
20
+ import { readToolRenderer } from "./read";
21
+ import type { ToolRenderer } from "./renderer";
22
+ import { resolveRenderer } from "./resolve";
23
+ import { taskToolRenderer } from "./task";
24
+ import { thinkToolRenderer } from "./think";
25
+ import { todoToolRenderer } from "./todo";
26
+ import { createVibeToolRenderer } from "./vibe";
27
+ import { webSearchToolRenderer } from "./web-search";
28
+ import { writeToolRenderer } from "./write";
29
+ import { setXdevRendererLookup } from "./xdev";
30
+
31
+ export * from "./renderer";
32
+
33
+ /** Renderers keyed by tool name (plus `apply_patch`/`reject` aliases that share a renderer). */
34
+ export const toolRenderers: Record<string, ToolRenderer> = {
35
+ ask: askToolRenderer,
36
+ ast_grep: astGrepToolRenderer,
37
+ ast_edit: astEditToolRenderer,
38
+ bash: bashToolRenderer,
39
+ debug: debugToolRenderer,
40
+ eval: evalToolRenderer,
41
+ edit: editToolRenderer,
42
+ apply_patch: editToolRenderer,
43
+ glob: globToolRenderer,
44
+ grep: grepToolRenderer,
45
+ lsp: lspToolRenderer,
46
+ hub: hubToolRenderer,
47
+ read: readToolRenderer,
48
+ // Keyed by xd:// resolution-device names: the write dispatch delegates here
49
+ // by dispatch tool, and historical `resolve` tool transcripts still render
50
+ // through the `resolve` entry. Both devices carry the same ResolveDetails.
51
+ resolve: resolveRenderer,
52
+ reject: resolveRenderer,
53
+ retain: retainToolRenderer,
54
+ recall: recallToolRenderer,
55
+ reflect: reflectToolRenderer,
56
+ task: taskToolRenderer,
57
+ think: thinkToolRenderer,
58
+ todo: todoToolRenderer,
59
+ github: githubToolRenderer,
60
+ goal: goalToolRenderer,
61
+ web_search: webSearchToolRenderer,
62
+ vibe_spawn: createVibeToolRenderer("spawn"),
63
+ vibe_send: createVibeToolRenderer("send"),
64
+ vibe_wait: createVibeToolRenderer("wait"),
65
+ vibe_kill: createVibeToolRenderer("kill"),
66
+ vibe_list: createVibeToolRenderer("list"),
67
+ write: writeToolRenderer,
68
+ };
69
+
70
+ // Wire the xd:// render delegation without the xdev module importing this registry.
71
+ setXdevRendererLookup(name => toolRenderers[name]);
@@ -0,0 +1,388 @@
1
+ /**
2
+ * JSON tree rendering utilities shared across tool renderers.
3
+ */
4
+ import { INTENT_FIELD } from "@oh-my-pi/pi-wire";
5
+ import { sanitizeText } from "@oh-my-pi/pi-utils";
6
+ import { TreeView, treeRowPrefix } from "../components/tree-view";
7
+ import { truncateToWidth } from "../render/render-utils";
8
+ import type { Theme, ThemeColor } from "../theme/theme";
9
+
10
+ /** Max depth for JSON tree rendering */
11
+ export const JSON_TREE_MAX_DEPTH_COLLAPSED = 2;
12
+ /** Maximum expanded JSON tree depth. */
13
+ export const JSON_TREE_MAX_DEPTH_EXPANDED = 6;
14
+ /** Maximum collapsed JSON tree rows. */
15
+ export const JSON_TREE_MAX_LINES_COLLAPSED = 6;
16
+ /** Maximum expanded JSON tree rows. */
17
+ export const JSON_TREE_MAX_LINES_EXPANDED = 200;
18
+ /** Maximum collapsed JSON scalar width. */
19
+ export const JSON_TREE_SCALAR_LEN_COLLAPSED = 60;
20
+ /** Maximum expanded JSON scalar width. */
21
+ export const JSON_TREE_SCALAR_LEN_EXPANDED = 2000;
22
+
23
+ const HIDDEN_ARG_KEYS = { [INTENT_FIELD]: 1, __partialJson: 1 };
24
+ const DEFAULT_HIDDEN_ROOT_KEYS: readonly string[] = Object.keys(HIDDEN_ARG_KEYS);
25
+
26
+ const ARGS_INLINE_PAIR_SEP = ", ";
27
+ const ARGS_INLINE_PAIR_SEP_WIDTH = Bun.stringWidth(ARGS_INLINE_PAIR_SEP);
28
+ const ARGS_INLINE_MORE = "…";
29
+ const ARGS_INLINE_MORE_WIDTH = Bun.stringWidth(ARGS_INLINE_MORE);
30
+ /** Minimal value footprint (quotes + a couple chars) reserved for each not-yet-rendered key. */
31
+ const ARGS_INLINE_TAIL_VALUE_RESERVE = 4;
32
+
33
+ function isRecord(value: unknown): value is Record<string, unknown> {
34
+ return !!value && typeof value === "object" && !Array.isArray(value);
35
+ }
36
+
37
+ /** Sanitization, string summary, and budgeting policy for inline JSON. */
38
+ export interface InlineFormatOptions {
39
+ sanitizeText?: (text: string) => string;
40
+ multilineSummary?: boolean;
41
+ /** Character-count output budget, retaining the first pair even when oversized. */
42
+ characterBudget?: boolean;
43
+ }
44
+
45
+ /** Format a scalar with optional sanitized multiline summaries. */
46
+ export function formatScalar(value: unknown, maxLen: number, options: InlineFormatOptions = {}): string {
47
+ if (value === null) return "null";
48
+ if (value === undefined) return "undefined";
49
+ if (typeof value === "boolean") return String(value);
50
+ if (typeof value === "number") return String(value);
51
+ if (typeof value === "string") {
52
+ const text = options.sanitizeText?.(value) ?? value;
53
+ if (options.multilineSummary) {
54
+ const lines = text.split("\n");
55
+ const firstLine = lines[0].trim();
56
+ if (!firstLine) return `"" (${lines.length} lines)`;
57
+ const preview = truncateToWidth(firstLine, maxLen);
58
+ return lines.length > 1 ? `"${preview}…" (${lines.length} lines)` : `"${preview}"`;
59
+ }
60
+ const escaped = text.replace(/\n/g, "\\n").replace(/\t/g, "\\t");
61
+ const truncated = truncateToWidth(escaped, maxLen);
62
+ return `"${truncated}"`;
63
+ }
64
+ if (Array.isArray(value)) return `[${value.length} items]`;
65
+ if (typeof value === "object") {
66
+ const keys = Object.keys(value);
67
+ return `{${keys.length} keys}`;
68
+ }
69
+ const text = String(value);
70
+ return options.sanitizeText?.(text) ?? text;
71
+ }
72
+
73
+ /** Format args inline with either display-cell or legacy output character budgeting. */
74
+ export function formatArgsInline(
75
+ args: Record<string, unknown>,
76
+ maxWidth: number,
77
+ options: InlineFormatOptions = {},
78
+ ): string {
79
+ if (options.characterBudget) {
80
+ const pairs: string[] = [];
81
+ let length = 0;
82
+ for (const key in args) {
83
+ if (!Object.hasOwn(args, key)) continue;
84
+ const pair = `${options.sanitizeText?.(key) ?? key}=${formatScalar(args[key], 24, options)}`;
85
+ const added = pair.length + (pairs.length > 0 ? 2 : 0);
86
+ if (length + added > maxWidth && pairs.length > 0) {
87
+ pairs.push("…");
88
+ break;
89
+ }
90
+ pairs.push(pair);
91
+ length += added;
92
+ }
93
+ return pairs.join(", ");
94
+ }
95
+ const keys: string[] = [];
96
+ for (const key in args) {
97
+ if (key in HIDDEN_ARG_KEYS) continue;
98
+ keys.push(key);
99
+ }
100
+ let result = "";
101
+ let width = 0;
102
+ for (let i = 0; i < keys.length; i++) {
103
+ const rawKey = keys[i];
104
+ const key = options.sanitizeText?.(rawKey) ?? rawKey;
105
+ const value = args[rawKey];
106
+ const sep = width > 0 ? ARGS_INLINE_PAIR_SEP : "";
107
+ const sepW = width > 0 ? ARGS_INLINE_PAIR_SEP_WIDTH : 0;
108
+ const current = width + sepW;
109
+ const cap = maxWidth - current - ARGS_INLINE_MORE_WIDTH;
110
+ if (cap <= 0) {
111
+ return `${result}${ARGS_INLINE_MORE}`;
112
+ }
113
+ // Reserve each still-pending key's minimal footprint (sep + name + `=` +
114
+ // a short value) so a long value can't starve the keys that follow it.
115
+ let tailReserve = 0;
116
+ for (let j = i + 1; j < keys.length; j++) {
117
+ const tailKey = options.sanitizeText?.(keys[j]) ?? keys[j];
118
+ tailReserve += ARGS_INLINE_PAIR_SEP_WIDTH + Bun.stringWidth(tailKey) + 1 + ARGS_INLINE_TAIL_VALUE_RESERVE;
119
+ }
120
+ // Budget the whole `key=value` piece against the width left after the
121
+ // tail reserve, then back out the value's share. The last key reserves
122
+ // nothing and fills the line.
123
+ const pieceBudget = Math.min(cap, maxWidth - current - tailReserve);
124
+ const valueMaxLen = Math.max(1, pieceBudget - Bun.stringWidth(key) - 3);
125
+ const valueStr = formatScalar(value, valueMaxLen, options);
126
+ const piece = `${key}=${valueStr}`;
127
+ const pieceW = Bun.stringWidth(piece);
128
+ if (pieceW > pieceBudget) {
129
+ return `${result}${sep}${truncateToWidth(piece, cap)}`;
130
+ }
131
+ result += sep + piece;
132
+ width = current + pieceW;
133
+ }
134
+ return result;
135
+ }
136
+
137
+ const OUTPUT_INLINE_OPTIONS: InlineFormatOptions = {
138
+ sanitizeText,
139
+ multilineSummary: true,
140
+ characterBudget: true,
141
+ };
142
+
143
+ /** Summarize a task's structured output without expanding its JSON tree. */
144
+ export function formatOutputInline(data: unknown, maxWidth = 80): string {
145
+ const options = OUTPUT_INLINE_OPTIONS;
146
+ if (data === null || data === undefined) return "Output: none";
147
+ if (typeof data !== "object") return `Output: ${formatScalar(data, 60, options)}`;
148
+ if (Array.isArray(data)) {
149
+ if (data.length === 0) return "Output: []";
150
+ return `Output: [${data.length} items] ${formatScalar(data[0], 40, options)}${data.length > 1 ? "…" : ""}`;
151
+ }
152
+ return `Output: ${formatArgsInline(data as Record<string, unknown>, maxWidth - "Output: ".length, options) || "{}"}`;
153
+ }
154
+
155
+ /** JSON hierarchy policy accepted by {@link renderJsonTreeLines}. */
156
+ export interface JsonTreeRenderOptions {
157
+ maxDepth: number;
158
+ maxLines: number;
159
+ maxScalarLen: number;
160
+ /** Sanitize object keys and string/scalar text before styling. */
161
+ sanitizeText?: (text: string) => string;
162
+ /** Root object keys omitted from display. Defaults to internal tool argument metadata. */
163
+ hiddenRootKeys?: readonly string[];
164
+ /** Preserve embedded newlines as continuation rows. Defaults to true. */
165
+ multilineStrings?: boolean;
166
+ /** Escape inline tabs/newlines as JSON-style sequences. Defaults to true. */
167
+ escapeStringWhitespace?: boolean;
168
+ /**
169
+ * Root row gutter. `hooked` (default) attaches the tree to the block above:
170
+ * the first root draws `└ •`, the rest ` •`, and nested rows branch from
171
+ * under the bullet. `siblings` draws standard `├─`/`└─` root connectors.
172
+ */
173
+ rootConnectors?: "hooked" | "siblings";
174
+ }
175
+
176
+ type JsonTreeNodeKind = "array" | "object" | "scalar" | "placeholder";
177
+
178
+ interface JsonTreeNode {
179
+ id: number;
180
+ key: string | undefined;
181
+ value: unknown;
182
+ depth: number;
183
+ kind: JsonTreeNodeKind;
184
+ placeholder?: "…";
185
+ children?: readonly JsonTreeNode[];
186
+ }
187
+
188
+ function jsonNodeKind(value: unknown): JsonTreeNodeKind {
189
+ if (Array.isArray(value)) return "array";
190
+ if (isRecord(value)) return "object";
191
+ return "scalar";
192
+ }
193
+
194
+ /**
195
+ * Render a JSON value as bounded tree lines. The positional form remains the
196
+ * public tool-renderer contract; the options form exposes sanitization and root
197
+ * connector policy for specialized adapters such as nested task output.
198
+ */
199
+ export function renderJsonTreeLines(
200
+ value: unknown,
201
+ theme: Theme,
202
+ maxDepth: number,
203
+ maxLines: number,
204
+ maxScalarLen: number,
205
+ ): { lines: string[]; truncated: boolean };
206
+ export function renderJsonTreeLines(
207
+ value: unknown,
208
+ theme: Theme,
209
+ options: JsonTreeRenderOptions,
210
+ ): { lines: string[]; truncated: boolean };
211
+ export function renderJsonTreeLines(
212
+ value: unknown,
213
+ theme: Theme,
214
+ optionsOrMaxDepth: JsonTreeRenderOptions | number,
215
+ maxLinesArg?: number,
216
+ maxScalarLenArg?: number,
217
+ ): { lines: string[]; truncated: boolean } {
218
+ const options: JsonTreeRenderOptions =
219
+ typeof optionsOrMaxDepth === "number"
220
+ ? {
221
+ maxDepth: optionsOrMaxDepth,
222
+ maxLines: maxLinesArg ?? JSON_TREE_MAX_LINES_EXPANDED,
223
+ maxScalarLen: maxScalarLenArg ?? JSON_TREE_SCALAR_LEN_EXPANDED,
224
+ }
225
+ : optionsOrMaxDepth;
226
+ const maxDepth = Math.max(0, Math.trunc(options.maxDepth));
227
+ const maxLines = Math.max(0, Math.trunc(options.maxLines));
228
+ const maxScalarLen = Math.max(0, Math.trunc(options.maxScalarLen));
229
+ const sanitize = options.sanitizeText ?? (text => text);
230
+ const hiddenRootKeys = options.hiddenRootKeys ?? DEFAULT_HIDDEN_ROOT_KEYS;
231
+ const multilineStrings = options.multilineStrings ?? true;
232
+ const escapeStringWhitespace = options.escapeStringWhitespace ?? true;
233
+ const hookedRoots = (options.rootConnectors ?? "hooked") === "hooked";
234
+ let nextId = 0;
235
+
236
+ const node = (nodeValue: unknown, key: string | undefined, depth: number): JsonTreeNode => ({
237
+ id: nextId++,
238
+ key,
239
+ value: nodeValue,
240
+ depth,
241
+ kind: jsonNodeKind(nodeValue),
242
+ });
243
+
244
+ let roots: readonly JsonTreeNode[];
245
+ if (isRecord(value)) {
246
+ const objectRoots: JsonTreeNode[] = [];
247
+ for (const key in value) {
248
+ if (!hiddenRootKeys.includes(key)) objectRoots.push(node(value[key], key, 1));
249
+ }
250
+ roots = objectRoots;
251
+ } else if (Array.isArray(value)) {
252
+ roots = value.map((child, index) => node(child, `[${index}]`, 1));
253
+ } else {
254
+ roots = [node(value, undefined, 0)];
255
+ }
256
+
257
+ const prefixStyle = { vertical: (symbol: string) => symbol };
258
+ const hook = theme.tree.hook;
259
+ const hookPad = " ".repeat(Bun.stringWidth(hook));
260
+ const bullet = theme.format.bullet;
261
+ // Nested rows drop the root's three-cell gutter and branch from under the root label.
262
+ const rootGutter = `${hookPad} ${" ".repeat(Bun.stringWidth(bullet))} `;
263
+ let renderedLineCount = 0;
264
+ let scalarTruncated = false;
265
+
266
+ const tree = new TreeView<JsonTreeNode, number>({
267
+ roots,
268
+ getKey: item => item.id,
269
+ getChildren: item => {
270
+ if (item.children) return item.children;
271
+ let children: readonly JsonTreeNode[] = [];
272
+ if (item.kind === "array" && Array.isArray(item.value)) {
273
+ const values = item.value;
274
+ if (values.length === 0) {
275
+ children = [];
276
+ } else if (item.depth >= maxDepth) {
277
+ children = [
278
+ {
279
+ id: nextId++,
280
+ key: undefined,
281
+ value: undefined,
282
+ depth: item.depth + 1,
283
+ kind: "placeholder",
284
+ placeholder: "…",
285
+ },
286
+ ];
287
+ } else {
288
+ children = values.map((child, index) => node(child, `[${index}]`, item.depth + 1));
289
+ }
290
+ } else if (item.kind === "object" && isRecord(item.value)) {
291
+ const record = item.value;
292
+ const keys = Object.keys(record);
293
+ if (item.depth >= maxDepth) {
294
+ children = [
295
+ {
296
+ id: nextId++,
297
+ key: undefined,
298
+ value: undefined,
299
+ depth: item.depth + 1,
300
+ kind: "placeholder",
301
+ placeholder: "…",
302
+ },
303
+ ];
304
+ } else if (keys.length === 0) {
305
+ children = [];
306
+ } else {
307
+ const objectChildren: JsonTreeNode[] = [];
308
+ for (const key in record) objectChildren.push(node(record[key], key, item.depth + 1));
309
+ children = objectChildren;
310
+ }
311
+ }
312
+ item.children = children;
313
+ return children;
314
+ },
315
+ maxItems: maxLines + 1,
316
+ maxLines,
317
+ theme,
318
+ renderPrefix: itemRow => {
319
+ if (!hookedRoots) return treeRowPrefix(itemRow, theme, prefixStyle);
320
+ if (itemRow.ancestors.length === 0) {
321
+ const lead = itemRow.siblingIndex === 0 ? theme.fg("dim", hook) : hookPad;
322
+ return { first: `${lead} ${theme.fg("dim", bullet)} `, continuation: rootGutter };
323
+ }
324
+ const inner = treeRowPrefix({ ...itemRow, ancestors: itemRow.ancestors.slice(1) }, theme, prefixStyle);
325
+ return { first: `${rootGutter}${inner.first}`, continuation: `${rootGutter}${inner.continuation}` };
326
+ },
327
+ renderRow: item => {
328
+ let body: readonly string[];
329
+ const displayKey = item.key ? sanitize(item.key) : undefined;
330
+ const label = theme.fg(
331
+ "muted",
332
+ displayKey || (item.kind === "array" ? "array" : item.kind === "object" ? "object" : "value"),
333
+ );
334
+ if (item.kind === "placeholder") {
335
+ body = [theme.fg("dim", item.placeholder ?? "…")];
336
+ } else if (item.kind === "array") {
337
+ body = [`${label} ${theme.fg("dim", `[${(item.value as unknown[]).length}]`)}`];
338
+ } else if (item.kind === "object") {
339
+ body = [`${label} ${theme.fg("dim", `{${Object.keys(item.value as object).length}}`)}`];
340
+ } else if (typeof item.value === "string") {
341
+ const sanitized = sanitize(item.value);
342
+ if (multilineStrings && sanitized.includes("\n")) {
343
+ const sourceLines = sanitized.split("\n");
344
+ const available = Math.max(1, maxLines - renderedLineCount);
345
+ const displayedCount = Math.min(sourceLines.length, Math.max(1, available - 1));
346
+ const head = `${label}: `;
347
+ // Continuation rows sit under the opening quote.
348
+ const indent = " ".repeat(Bun.stringWidth(Bun.stripANSI(head)) + 1);
349
+ const scalarLines = [
350
+ `${head}${theme.fg("syntaxString", `"${truncateToWidth(sourceLines[0] ?? "", maxScalarLen)}`)}`,
351
+ ];
352
+ for (let index = 1; index < displayedCount; index++) {
353
+ scalarLines.push(
354
+ `${indent}${theme.fg("syntaxString", truncateToWidth(sourceLines[index] ?? "", maxScalarLen))}`,
355
+ );
356
+ }
357
+ if (sourceLines.length > displayedCount) {
358
+ scalarTruncated = true;
359
+ scalarLines.push(
360
+ `${indent}${theme.fg("dim", `…(${sourceLines.length - displayedCount} more lines)"`)}`,
361
+ );
362
+ } else {
363
+ const lastIndex = scalarLines.length - 1;
364
+ scalarLines[lastIndex] = `${scalarLines[lastIndex]}${theme.fg("syntaxString", '"')}`;
365
+ }
366
+ body = scalarLines;
367
+ } else {
368
+ const scalar = escapeStringWhitespace
369
+ ? formatScalar(sanitized, maxScalarLen)
370
+ : `"${truncateToWidth(sanitized, maxScalarLen)}"`;
371
+ body = [`${label}: ${theme.fg("syntaxString", scalar)}`];
372
+ }
373
+ } else {
374
+ const color: ThemeColor =
375
+ typeof item.value === "number"
376
+ ? "syntaxNumber"
377
+ : typeof item.value === "boolean" || item.value === null || item.value === undefined
378
+ ? "syntaxKeyword"
379
+ : "dim";
380
+ body = [`${label}: ${theme.fg(color, sanitize(formatScalar(item.value, maxScalarLen)))}`];
381
+ }
382
+ renderedLineCount += body.length;
383
+ return body;
384
+ },
385
+ });
386
+ const rendered = tree.renderWithState(Number.POSITIVE_INFINITY);
387
+ return { lines: [...rendered.lines], truncated: rendered.truncated || scalarTruncated };
388
+ }
@@ -0,0 +1,98 @@
1
+ import { ToolError } from "./tool-errors";
2
+
3
+ /**
4
+ * Inclusive line range describing one selector segment (e.g. `50-100`,
5
+ * `301-`, or `50+10`). `endLine` is `undefined` for open-ended ranges.
6
+ */
7
+ export interface LineRange {
8
+ startLine: number;
9
+ endLine: number | undefined;
10
+ }
11
+
12
+ /** Shared line-range grammar for selector recognition and parsing. */
13
+ export const LINE_RANGE_CHUNK_SOURCE = String.raw`L?(\d+)(?:(\.\.|[-+])L?(\d+)?)?`;
14
+ const LINE_RANGE_CHUNK_RE = new RegExp(`^${LINE_RANGE_CHUNK_SOURCE}$`, "i");
15
+
16
+ /** Parse a single `N`, `N-M`, `N-`, `N+K`, or `..`-aliased (`N..M`, `N..`) chunk. Throws via {@link ToolError} on invalid bounds. */
17
+ export function parseLineRangeChunk(sel: string): LineRange | null {
18
+ const lineMatch = LINE_RANGE_CHUNK_RE.exec(sel);
19
+ if (!lineMatch) return null;
20
+ const rawStart = Number.parseInt(lineMatch[1]!, 10);
21
+ if (rawStart < 1) {
22
+ throw new ToolError("Line selector 0 is invalid; lines are 1-indexed. Use :1.");
23
+ }
24
+ // `..` is a forgiving alias for `-` (e.g. `2724..2727` == `2724-2727`).
25
+ const sep = lineMatch[2] === ".." ? "-" : lineMatch[2];
26
+ const rhs = lineMatch[3] ? Number.parseInt(lineMatch[3], 10) : undefined;
27
+ let rawEnd: number | undefined;
28
+ if (sep === "+") {
29
+ if (rhs === undefined || rhs < 1) {
30
+ throw new ToolError(`Invalid range ${rawStart}+${rhs ?? 0}: count must be >= 1.`);
31
+ }
32
+ rawEnd = rawStart + rhs - 1;
33
+ } else if (sep === "-") {
34
+ // `301-` is shorthand for "from 301 onward" — equivalent to bare `301`.
35
+ if (rhs !== undefined) {
36
+ if (rhs < rawStart) {
37
+ throw new ToolError(`Invalid range ${rawStart}-${rhs}: end must be >= start.`);
38
+ }
39
+ rawEnd = rhs;
40
+ }
41
+ }
42
+ return { startLine: rawStart, endLine: rawEnd };
43
+ }
44
+
45
+ /**
46
+ * Parse a comma-separated list of line ranges (e.g. `5-16,960-973`). Returns
47
+ * the ranges in ascending order with overlapping/adjacent ranges merged so
48
+ * downstream consumers can stream the file in a single forward pass per range.
49
+ */
50
+ export function parseLineRanges(sel: string): [LineRange, ...LineRange[]] | null {
51
+ const chunks = sel.split(",");
52
+ const parsed: LineRange[] = [];
53
+ for (const chunk of chunks) {
54
+ const range = parseLineRangeChunk(chunk);
55
+ if (!range) return null;
56
+ parsed.push(range);
57
+ }
58
+ if (parsed.length === 0) return null;
59
+ parsed.sort((a, b) => a.startLine - b.startLine);
60
+
61
+ const merged: LineRange[] = [parsed[0]];
62
+ for (let i = 1; i < parsed.length; i++) {
63
+ const current = parsed[i];
64
+ const last = merged[merged.length - 1];
65
+ // Open-ended (endLine undefined) means "to EOF" — any later range is absorbed.
66
+ if (last.endLine === undefined) continue;
67
+ // Merge when current starts within (or immediately after) the last range.
68
+ if (current.startLine <= last.endLine + 1) {
69
+ if (current.endLine === undefined || current.endLine > last.endLine) {
70
+ merged[merged.length - 1] = { startLine: last.startLine, endLine: current.endLine };
71
+ }
72
+ continue;
73
+ }
74
+ merged.push(current);
75
+ }
76
+ return merged as [LineRange, ...LineRange[]];
77
+ }
78
+
79
+ /**
80
+ * Extract the line-range component from a read-tool selector that may also
81
+ * carry a verbatim/index display mode (`raw`, `conflicts`) — alone or compounded
82
+ * with a range (`raw:50-100`, `50-100:raw`). Returns the parsed ranges when the
83
+ * selector names any, otherwise `undefined` (pure `raw`/`conflicts`/none).
84
+ *
85
+ * Used by content search, which honors line ranges as a match filter but has no
86
+ * use for verbatim/conflict display modes — so those selectors are accepted and
87
+ * treated as an unfiltered, whole-resource search rather than rejected.
88
+ */
89
+ export function selectorLineRanges(sel: string | undefined): [LineRange, ...LineRange[]] | undefined {
90
+ if (!sel) return undefined;
91
+ for (const chunk of sel.split(":")) {
92
+ const lower = chunk.toLowerCase();
93
+ if (lower === "raw" || lower === "conflicts") continue;
94
+ const ranges = parseLineRanges(chunk);
95
+ if (ranges) return ranges;
96
+ }
97
+ return undefined;
98
+ }
@@ -0,0 +1,43 @@
1
+ import type { LimitsMeta } from "./output-meta";
2
+
3
+ /** Items retained after applying output limits and their metadata. */
4
+ export interface ListLimitResult<T> {
5
+ items: T[];
6
+ limitReached?: number;
7
+ meta: Partial<LimitsMeta>;
8
+ }
9
+
10
+ /** Limits applied to result lists and display previews. */
11
+ export interface ListLimitOptions {
12
+ limit?: number;
13
+ headLimit?: number;
14
+ limitType?: "match" | "result";
15
+ }
16
+
17
+ /** Apply result and preview limits while retaining truncation metadata. */
18
+ export function applyListLimit<T>(items: T[], options: ListLimitOptions): ListLimitResult<T> {
19
+ const meta: Partial<LimitsMeta> = {};
20
+ const limitType = options.limitType ?? "result";
21
+ const effectiveLimit = options.limit !== undefined && options.limit > 0 ? options.limit : undefined;
22
+ const effectiveHeadLimit = options.headLimit !== undefined && options.headLimit > 0 ? options.headLimit : undefined;
23
+ let limited = items;
24
+ let limitReached: number | undefined;
25
+
26
+ if (effectiveLimit !== undefined && items.length >= effectiveLimit) {
27
+ limited = items.slice(0, effectiveLimit);
28
+ limitReached = effectiveLimit;
29
+ const suggestion = effectiveLimit * 2;
30
+ if (limitType === "match") {
31
+ meta.matchLimit = { reached: effectiveLimit, suggestion };
32
+ } else {
33
+ meta.resultLimit = { reached: effectiveLimit, suggestion };
34
+ }
35
+ }
36
+
37
+ if (effectiveHeadLimit !== undefined && limited.length > effectiveHeadLimit) {
38
+ limited = limited.slice(0, effectiveHeadLimit);
39
+ meta.headLimit = { reached: effectiveHeadLimit, suggestion: effectiveHeadLimit * 2 };
40
+ }
41
+
42
+ return { items: limited, limitReached, meta };
43
+ }