@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,380 @@
1
+ import type { ResolvedThinkingLevel } from "@oh-my-pi/pi-agent-core/thinking";
2
+ import type { ConfiguredThinkingLevel } from "./render/render-utils";
3
+ import { ThinkingLevel } from "@oh-my-pi/pi-agent-core/thinking";
4
+ import { Effort, THINKING_EFFORTS } from "@oh-my-pi/pi-catalog/effort";
5
+ import { clampThinkingLevelForModel, getSupportedEfforts } from "@oh-my-pi/pi-catalog/model-thinking";
6
+ import { modelsAreEqual } from "@oh-my-pi/pi-catalog/models";
7
+ import type { Model } from "@oh-my-pi/pi-catalog/types";
8
+ /** Thinking selectors accepted by CLI inputs, in display order. */
9
+ export const CLI_THINKING_LEVELS: readonly string[] = ["off", ...THINKING_EFFORTS, "auto"];
10
+
11
+ /**
12
+ * Metadata used to render thinking selector values in the coding-agent UI.
13
+ */
14
+ export interface ThinkingLevelMetadata {
15
+ value: ThinkingLevel;
16
+ label: string;
17
+ description: string;
18
+ }
19
+
20
+ const THINKING_LEVEL_METADATA: Record<ThinkingLevel, ThinkingLevelMetadata> = {
21
+ [ThinkingLevel.Inherit]: {
22
+ value: ThinkingLevel.Inherit,
23
+ label: "inherit",
24
+ description: "Inherit session default",
25
+ },
26
+ [ThinkingLevel.Off]: { value: ThinkingLevel.Off, label: "off", description: "No reasoning" },
27
+ [ThinkingLevel.Minimal]: {
28
+ value: ThinkingLevel.Minimal,
29
+ label: "min",
30
+ description: "Very brief reasoning (~1k tokens)",
31
+ },
32
+ [ThinkingLevel.Low]: { value: ThinkingLevel.Low, label: "low", description: "Light reasoning (~2k tokens)" },
33
+ [ThinkingLevel.Medium]: {
34
+ value: ThinkingLevel.Medium,
35
+ label: "medium",
36
+ description: "Moderate reasoning (~8k tokens)",
37
+ },
38
+ [ThinkingLevel.High]: { value: ThinkingLevel.High, label: "high", description: "Deep reasoning (~16k tokens)" },
39
+ [ThinkingLevel.XHigh]: {
40
+ value: ThinkingLevel.XHigh,
41
+ label: "xhigh",
42
+ description: "Extended reasoning (~32k tokens)",
43
+ },
44
+ [ThinkingLevel.Max]: {
45
+ value: ThinkingLevel.Max,
46
+ label: "max",
47
+ description: "Maximum reasoning the model supports",
48
+ },
49
+ };
50
+
51
+ const EFFORT_BY_SELECTOR: Readonly<Record<string, Effort>> = {
52
+ [Effort.Minimal]: Effort.Minimal,
53
+ [Effort.Low]: Effort.Low,
54
+ [Effort.Medium]: Effort.Medium,
55
+ [Effort.High]: Effort.High,
56
+ [Effort.XHigh]: Effort.XHigh,
57
+ [Effort.Max]: Effort.Max,
58
+ };
59
+ const THINKING_LEVEL_BY_SELECTOR: Readonly<Record<string, ThinkingLevel>> = {
60
+ [ThinkingLevel.Inherit]: ThinkingLevel.Inherit,
61
+ [ThinkingLevel.Off]: ThinkingLevel.Off,
62
+ [ThinkingLevel.Minimal]: ThinkingLevel.Minimal,
63
+ [ThinkingLevel.Low]: ThinkingLevel.Low,
64
+ [ThinkingLevel.Medium]: ThinkingLevel.Medium,
65
+ [ThinkingLevel.High]: ThinkingLevel.High,
66
+ [ThinkingLevel.XHigh]: ThinkingLevel.XHigh,
67
+ [ThinkingLevel.Max]: ThinkingLevel.Max,
68
+ };
69
+
70
+ function getOwnSelector<T>(selectors: Readonly<Record<string, T>>, value: string | null | undefined): T | undefined {
71
+ if (value === undefined || value === null) return undefined;
72
+ if (Object.hasOwn(selectors, value)) return selectors[value];
73
+ // Accept unambiguous abbreviations (`xhi` → xhigh, `med` → medium) so every
74
+ // selector surface (`--thinking`, `:suffix`, role values) parses alike.
75
+ // Two-character minimum keeps single letters (`m`) from guessing.
76
+ if (value.length < 2) return undefined;
77
+ const matches = Object.keys(selectors).filter(selector => selector.startsWith(value));
78
+ return matches.length === 1 ? selectors[matches[0]] : undefined;
79
+ }
80
+
81
+ /**
82
+ * Parses a provider-facing effort value. Accepts unambiguous abbreviations.
83
+ */
84
+ export function parseEffort(value: string | null | undefined): Effort | undefined {
85
+ return getOwnSelector(EFFORT_BY_SELECTOR, value);
86
+ }
87
+
88
+ /**
89
+ * Parses an agent-local thinking selector. Accepts unambiguous abbreviations.
90
+ */
91
+ export function parseThinkingLevel(value: string | null | undefined): ThinkingLevel | undefined {
92
+ return getOwnSelector(THINKING_LEVEL_BY_SELECTOR, value);
93
+ }
94
+
95
+ /**
96
+ * Returns display metadata for a thinking selector.
97
+ */
98
+ export function getThinkingLevelMetadata(level: ThinkingLevel): ThinkingLevelMetadata {
99
+ return THINKING_LEVEL_METADATA[level];
100
+ }
101
+
102
+ /**
103
+ * Converts an agent-local selector into the effort sent to providers.
104
+ */
105
+ export function toReasoningEffort(level: ThinkingLevel | undefined): Effort | undefined {
106
+ if (level === undefined || level === ThinkingLevel.Off || level === ThinkingLevel.Inherit) {
107
+ return undefined;
108
+ }
109
+ return level;
110
+ }
111
+
112
+ /**
113
+ * True when a selector explicitly requests provider-side reasoning disablement.
114
+ */
115
+ export function shouldDisableReasoning(level: ThinkingLevel | undefined): boolean {
116
+ return level === ThinkingLevel.Off;
117
+ }
118
+
119
+ /**
120
+ * Resolves a selector against the current model while preserving explicit "off".
121
+ */
122
+ export function resolveThinkingLevelForModel(
123
+ model: Model | undefined,
124
+ level: ThinkingLevel | undefined,
125
+ ): ResolvedThinkingLevel | undefined {
126
+ if (level === undefined || level === ThinkingLevel.Inherit) {
127
+ return undefined;
128
+ }
129
+ if (level === ThinkingLevel.Off) {
130
+ return ThinkingLevel.Off;
131
+ }
132
+ return clampThinkingLevelForModel(model, level);
133
+ }
134
+
135
+ /**
136
+ * Sentinel selector for the coding-agent "auto" thinking mode. Kept entirely
137
+ * inside the coding-agent layer: it is never an {@link Effort} or
138
+ * {@link ThinkingLevel}, so provider mapping/clamping keeps seeing concrete
139
+ * efforts. The session resolves `auto` to a concrete effort each turn.
140
+ */
141
+ export const AUTO_THINKING = "auto" as const;
142
+
143
+ /** A thinking selector as configured by the user — a concrete level or `auto`. */
144
+ export type { ConfiguredThinkingLevel } from "./render/render-utils";
145
+
146
+ /** Maps the session-level `auto` sentinel to `undefined`; concrete levels pass through. */
147
+ export function concreteThinkingLevel(level: ConfiguredThinkingLevel | undefined): ThinkingLevel | undefined {
148
+ return level === AUTO_THINKING ? undefined : level;
149
+ }
150
+
151
+ /**
152
+ * True when a prewalk hand-off from `current`/`currentLevel` to
153
+ * `target`/`targetLevel` would change nothing observable: same model id, same
154
+ * auto/fixed mode, and the same model-clamped effective effort. Prewalk arms and
155
+ * switches only when this is false.
156
+ *
157
+ * An effort-only delta on the same model id is a legitimate cheapening hand-off
158
+ * — on a reasoning model the effort is the bulk of the cost — so it is NOT a
159
+ * no-op and must still switch. A `targetLevel` of `undefined` means the prewalk
160
+ * pattern carried no explicit `:level` suffix (no effort change requested),
161
+ * which on the same model is a no-op.
162
+ *
163
+ * `auto` mode is compared before efforts: `auto` and a fixed selector that both
164
+ * resolve to `undefined` effort (e.g. `:inherit`) are NOT interchangeable —
165
+ * applying the fixed selector clears per-turn classification, so switching
166
+ * auto↔fixed is always a real change even when the clamped efforts match.
167
+ *
168
+ * Efforts are otherwise compared AFTER model clamping, so a target the model
169
+ * cannot honor (e.g. `:xhigh` on a model capped at `high`) — which
170
+ * `setThinkingLevel` would clamp straight back to the active effort — is
171
+ * recognized as a no-op instead of triggering an ephemeral reset and the
172
+ * plan/checklist nudges for nothing.
173
+ */
174
+ export function prewalkWouldBeNoop(
175
+ current: Model | undefined,
176
+ currentLevel: ConfiguredThinkingLevel | undefined,
177
+ target: Model,
178
+ targetLevel: ConfiguredThinkingLevel | undefined,
179
+ ): boolean {
180
+ if (!modelsAreEqual(current, target)) return false;
181
+ if (targetLevel === undefined) return true;
182
+ if ((targetLevel === AUTO_THINKING) !== (currentLevel === AUTO_THINKING)) return false;
183
+ return (
184
+ resolveThinkingLevelForModel(target, concreteThinkingLevel(targetLevel)) ===
185
+ resolveThinkingLevelForModel(target, concreteThinkingLevel(currentLevel))
186
+ );
187
+ }
188
+
189
+ /** Metadata used to render the `auto` selector value alongside concrete levels. */
190
+ export interface ConfiguredThinkingLevelMetadata {
191
+ value: ConfiguredThinkingLevel;
192
+ label: string;
193
+ description: string;
194
+ }
195
+
196
+ const AUTO_THINKING_METADATA: ConfiguredThinkingLevelMetadata = {
197
+ value: AUTO_THINKING,
198
+ label: "auto",
199
+ description: "Auto-detect per prompt",
200
+ };
201
+
202
+ /**
203
+ * Parses a configured thinking selector, accepting `auto` in addition to every
204
+ * value {@link parseThinkingLevel} accepts. {@link parseThinkingLevel} itself
205
+ * stays strict so model-suffix parsing (`model:high`) keeps rejecting `auto`.
206
+ */
207
+ export function parseConfiguredThinkingLevel(value: string | null | undefined): ConfiguredThinkingLevel | undefined {
208
+ if (value === AUTO_THINKING) return AUTO_THINKING;
209
+ return parseThinkingLevel(value);
210
+ }
211
+
212
+ /** Returns display metadata for a configured selector, including `auto`. */
213
+ export function getConfiguredThinkingLevelMetadata(level: ConfiguredThinkingLevel): ConfiguredThinkingLevelMetadata {
214
+ return level === AUTO_THINKING ? AUTO_THINKING_METADATA : getThinkingLevelMetadata(level);
215
+ }
216
+
217
+ /**
218
+ * Parses a `--thinking` CLI value. Accepts every {@link parseConfiguredThinkingLevel}
219
+ * selector (`off`, `auto`, `minimal`..`max`) but rejects
220
+ * `inherit`: an explicit `inherit` on the command line would suppress the
221
+ * settings/scoped-model fallback during startup resolution only to resolve back
222
+ * to the provider default, which is never what the user means.
223
+ */
224
+ export function parseCliThinkingLevel(value: string | null | undefined): ConfiguredThinkingLevel | undefined {
225
+ const level = parseConfiguredThinkingLevel(value);
226
+ return level === ThinkingLevel.Inherit ? undefined : level;
227
+ }
228
+
229
+ /**
230
+ * Resolves an auto-classified effort against the active model's supported
231
+ * range. Unlike {@link clampThinkingLevelForModel}, `auto` never resolves below
232
+ * {@link Effort.Low}: the eligible pool is the model's supported efforts at or
233
+ * above Low (falling back to the full supported set only when the model maxes
234
+ * out below Low). Within that pool the request snaps to the highest level not
235
+ * exceeding it, or the pool minimum when the request is below the pool.
236
+ * `ceiling` bounds the pool from above, so a policy ceiling survives the model
237
+ * clamp: a sparse ladder such as `["max"]` must not snap an `xhigh` request up
238
+ * to `max`. The Low floor is resolved against the model's own ladder *before*
239
+ * the ceiling applies — a ceiling that hides every tier at or above Low means
240
+ * there is nothing legal to pick (`undefined`), not a licence to fall through
241
+ * to a sub-Low tier the model happens to expose.
242
+ *
243
+ * Returns `undefined` for reasoning-capable models without a controllable
244
+ * effort surface (`thinking.efforts` empty — e.g. devin-agent models, where
245
+ * Cascade selects effort by routing to sibling model ids). Matches
246
+ * {@link clampThinkingLevelForModel}: with no effort to pick, `auto` must not
247
+ * forward a concrete effort that would then trip {@link requireSupportedEffort}
248
+ * downstream.
249
+ */
250
+ export function clampAutoThinkingEffort(
251
+ model: Model | undefined,
252
+ effort: Effort,
253
+ ceiling: Effort = Effort.Max,
254
+ ): Effort | undefined {
255
+ const supported = model ? getSupportedEfforts(model) : THINKING_EFFORTS;
256
+ if (supported.length === 0) return undefined;
257
+ const lowIndex = THINKING_EFFORTS.indexOf(Effort.Low);
258
+ const ceilingIndex = THINKING_EFFORTS.indexOf(ceiling);
259
+ const atOrAboveLow = supported.filter(level => THINKING_EFFORTS.indexOf(level) >= lowIndex);
260
+ const floored = atOrAboveLow.length > 0 ? atOrAboveLow : supported;
261
+ const pool = floored.filter(level => THINKING_EFFORTS.indexOf(level) <= ceilingIndex);
262
+ if (pool.length === 0) return undefined;
263
+ const requestedIndex = THINKING_EFFORTS.indexOf(effort);
264
+ let chosen = pool[0];
265
+ for (const candidate of pool) {
266
+ if (THINKING_EFFORTS.indexOf(candidate) > requestedIndex) break;
267
+ chosen = candidate;
268
+ }
269
+ return chosen;
270
+ }
271
+
272
+ /** Coarse per-spawn effort selectors accepted by the task tool. */
273
+ export const TASK_EFFORTS = ["lo", "med", "hi"] as const;
274
+
275
+ /** Coarse task-spawn effort: the lowest, middle, or highest thinking level the target model supports. */
276
+ export type TaskEffort = (typeof TASK_EFFORTS)[number];
277
+
278
+ /**
279
+ * Maps a coarse task effort onto the model's supported thinking range:
280
+ * `lo` = lowest supported level, `hi` = highest (whatever the model tops out
281
+ * at — high, xhigh, or max), `med` = the middle (lower of the two middles for
282
+ * an even-sized range). Without a model, maps over the full canonical range.
283
+ * Returns `undefined` when the model has no controllable effort surface, so
284
+ * callers fall back to their default selector (e.g. `auto`). Throws when the
285
+ * configured ceiling is below the model's lowest supported effort.
286
+ */
287
+ export function resolveTaskEffortLevel(
288
+ model: Model | undefined,
289
+ effort: TaskEffort,
290
+ maxEffort?: Effort,
291
+ ): Effort | undefined {
292
+ const supported = model ? getSupportedEfforts(model) : THINKING_EFFORTS;
293
+ if (supported.length === 0) return undefined;
294
+ let resolved: Effort;
295
+ switch (effort) {
296
+ case "lo":
297
+ resolved = supported[0];
298
+ break;
299
+ case "med":
300
+ resolved = supported[(supported.length - 1) >> 1];
301
+ break;
302
+ case "hi":
303
+ resolved = supported[supported.length - 1];
304
+ break;
305
+ }
306
+ if (maxEffort === undefined) return resolved;
307
+ const maxIndex = THINKING_EFFORTS.indexOf(maxEffort);
308
+ const ceiling = supported.findLast(candidate => THINKING_EFFORTS.indexOf(candidate) <= maxIndex);
309
+ if (ceiling === undefined) {
310
+ const modelName = model ? `${model.provider}/${model.id}` : "Selected model";
311
+ throw new RangeError(`${modelName} has no supported thinking effort at or below task.maxEffort=${maxEffort}`);
312
+ }
313
+ return THINKING_EFFORTS.indexOf(resolved) > THINKING_EFFORTS.indexOf(ceiling) ? ceiling : resolved;
314
+ }
315
+
316
+ /**
317
+ * Clamps a concrete thinking selector to a per-session effort ceiling (e.g. a
318
+ * task spawn's `task.maxEffort`-capped effort hint). `off`/`inherit`/
319
+ * `undefined` pass through, as do levels already at or below the ceiling.
320
+ * Levels above it snap to the highest model-supported effort at or below the
321
+ * ceiling. A model whose floor exceeds the ceiling has nothing valid to snap
322
+ * to; the requested level is returned unchanged and the caller is responsible
323
+ * for rejecting or skipping such models (see {@link modelSupportsEffortCeiling}).
324
+ */
325
+ export function clampThinkingLevelToCeiling(
326
+ model: Model | undefined,
327
+ level: Effort | undefined,
328
+ ceiling: Effort | undefined,
329
+ ): Effort | undefined;
330
+ export function clampThinkingLevelToCeiling(
331
+ model: Model | undefined,
332
+ level: ThinkingLevel | undefined,
333
+ ceiling: Effort | undefined,
334
+ ): ThinkingLevel | undefined;
335
+ export function clampThinkingLevelToCeiling(
336
+ model: Model | undefined,
337
+ level: ThinkingLevel | undefined,
338
+ ceiling: Effort | undefined,
339
+ ): ThinkingLevel | undefined {
340
+ if (ceiling === undefined || level === undefined || level === ThinkingLevel.Off || level === ThinkingLevel.Inherit) {
341
+ return level;
342
+ }
343
+ const maxIndex = THINKING_EFFORTS.indexOf(ceiling);
344
+ if (THINKING_EFFORTS.indexOf(level) <= maxIndex) return level;
345
+ const supported = model ? getSupportedEfforts(model) : THINKING_EFFORTS;
346
+ return supported.findLast(candidate => THINKING_EFFORTS.indexOf(candidate) <= maxIndex) ?? level;
347
+ }
348
+
349
+ /**
350
+ * True when `model` can honor a thinking-effort ceiling: it either has no
351
+ * controllable effort surface (nothing to cap) or supports at least one effort
352
+ * at or below the ceiling. Retry-fallback candidate filtering uses this to
353
+ * skip models whose floor would force the session above the ceiling.
354
+ */
355
+ export function modelSupportsEffortCeiling(model: Model, ceiling: Effort): boolean {
356
+ const supported = getSupportedEfforts(model);
357
+ if (supported.length === 0) return true;
358
+ const maxIndex = THINKING_EFFORTS.indexOf(ceiling);
359
+ return supported.some(candidate => THINKING_EFFORTS.indexOf(candidate) <= maxIndex);
360
+ }
361
+
362
+ /**
363
+ * The provisional concrete level shown while `auto` is configured but before a
364
+ * turn has been classified, and the fallback when classification fails. Prefers
365
+ * the model's `defaultLevel`, otherwise High, clamped into the auto range.
366
+ *
367
+ * Deliberately stays below {@link Effort.Max}: the placeholder must not bill the
368
+ * top tier for a turn nobody classified, so XHigh is passed as a hard ceiling
369
+ * rather than only capping the preferred level — otherwise a sparse `["max"]`
370
+ * ladder would snap straight back up. A model whose ladder offers nothing at or
371
+ * below XHigh therefore has no provisional level, and `auto` leaves the current
372
+ * one in place. Classification itself may still resolve Max on models that
373
+ * expose the tier when the user opts in. Returns `undefined` for non-reasoning
374
+ * models.
375
+ */
376
+ export function resolveProvisionalAutoLevel(model: Model | undefined): Effort | undefined {
377
+ if (!model?.reasoning) return undefined;
378
+ const preferred = model.thinking?.defaultLevel ?? Effort.High;
379
+ return clampAutoThinkingEffort(model, preferred === Effort.Max ? Effort.XHigh : preferred, Effort.XHigh);
380
+ }
@@ -0,0 +1,128 @@
1
+ import { formatContextUsage } from "../chrome/context-thresholds";
2
+ import {
3
+ FEED_MODEL_BADGE_WIDTH,
4
+ formatBadge,
5
+ formatDuration,
6
+ formatFeedModelBadge,
7
+ formatNumber,
8
+ formatStatusIcon,
9
+ isFeedModelBadgeEnabled,
10
+ truncateToWidth,
11
+ type ConfiguredThinkingLevel,
12
+ } from "../render/render-utils";
13
+ import type { Theme } from "../theme/theme";
14
+ import { visibleWidth } from "../utils";
15
+
16
+ /** Counters displayed alongside an agent name. */
17
+ export interface AgentStats {
18
+ toolCount?: number;
19
+ requests?: number;
20
+ contextTokens?: number;
21
+ contextWindow?: number;
22
+ cost?: number;
23
+ }
24
+
25
+ /** Format the shared tool-count, request, context, and cost stat run. */
26
+ export function formatAgentStatRun(stats: AgentStats, theme: Theme): string {
27
+ let line = "";
28
+ if (stats.toolCount) {
29
+ line += `${theme.sep.dot}${theme.fg("dim", `${formatNumber(stats.toolCount)} ${theme.icon.extensionTool}`)}`;
30
+ }
31
+ if (stats.requests) {
32
+ line += `${theme.sep.dot}${theme.fg("dim", `${formatNumber(stats.requests)} req`)}`;
33
+ }
34
+ if (stats.contextTokens && stats.contextTokens > 0) {
35
+ const context =
36
+ stats.contextWindow && stats.contextWindow > 0
37
+ ? formatContextUsage((stats.contextTokens / stats.contextWindow) * 100, stats.contextWindow)
38
+ : formatNumber(stats.contextTokens);
39
+ line += `${theme.sep.dot}${theme.fg("dim", context)}`;
40
+ }
41
+ if (stats.cost && stats.cost > 0)
42
+ line += `${theme.sep.dot}${theme.fg("statusLineCost", `$${stats.cost.toFixed(2)}`)}`;
43
+ return line;
44
+ }
45
+
46
+ /** Tool-specific presentation layered onto a bounded agent progress row. */
47
+ export interface AgentTreeRowOptions {
48
+ status: "pending" | "running" | "completed" | "failed" | "aborted";
49
+ presentation: "task" | "eval";
50
+ prefix: string;
51
+ id: string;
52
+ width: number;
53
+ model?: string;
54
+ thinkingLevel?: ConfiguredThinkingLevel;
55
+ advisor?: boolean;
56
+ spinnerFrame?: number;
57
+ frozen?: boolean;
58
+ roleBadge?: string;
59
+ statusBadge?: string;
60
+ description?: string;
61
+ preview?: string;
62
+ stats?: AgentStats;
63
+ durationMs?: number;
64
+ }
65
+
66
+ /** Render an agent row while reserving its identifier and required status badges. */
67
+ export function renderAgentTreeRow(
68
+ options: AgentTreeRowOptions,
69
+ theme: Theme,
70
+ ): { line: string; descriptionShown: boolean } {
71
+ const { status, width, description } = options;
72
+ const task = options.presentation === "task";
73
+ const live = status === "pending" || status === "running";
74
+ const failed = status === "failed" || status === "aborted";
75
+ const iconColor = status === "completed" ? "success" : failed ? "error" : "accent";
76
+ const nameColor = task && live && options.frozen ? "dim" : task && status === "completed" ? "text" : "accent";
77
+ const iconStatus = status === "failed" ? "error" : status === "completed" ? "done" : status;
78
+ const icon =
79
+ task && !failed
80
+ ? theme.styledSymbol("status.done", nameColor)
81
+ : !task && status === "completed"
82
+ ? theme.styledSymbol("tool.eval", "accent")
83
+ : theme.fg(
84
+ iconColor,
85
+ formatStatusIcon(iconStatus, theme, status === "running" ? options.spinnerFrame : undefined),
86
+ );
87
+ const lead = `${options.prefix}${options.prefix || !task ? " " : ""}${icon} `;
88
+ const statusBadge = options.statusBadge ?? (failed ? ` ${formatBadge(status, iconColor, theme)}` : "");
89
+ const id = Number.isFinite(width)
90
+ ? truncateToWidth(options.id, Math.max(0, width - visibleWidth(lead) - visibleWidth(statusBadge)))
91
+ : options.id;
92
+ const roleBadge =
93
+ options.roleBadge && Number.isFinite(width)
94
+ ? truncateToWidth(
95
+ options.roleBadge,
96
+ Math.max(0, width - visibleWidth(lead) - visibleWidth(id) - visibleWidth(statusBadge)),
97
+ )
98
+ : (options.roleBadge ?? "");
99
+ const badges = `${roleBadge}${statusBadge}`;
100
+ const modelWidth = width - visibleWidth(lead) - visibleWidth(id) - visibleWidth(badges) - 1;
101
+ const model =
102
+ isFeedModelBadgeEnabled() && (task || options.model)
103
+ ? formatFeedModelBadge(
104
+ options.model,
105
+ options.thinkingLevel,
106
+ options.advisor,
107
+ theme,
108
+ Math.min(FEED_MODEL_BADGE_WIDTH, task ? Math.max(0, modelWidth) : modelWidth),
109
+ )
110
+ : "";
111
+ const modelLead = model ? `${model} ` : "";
112
+ const descriptionShown = Boolean(
113
+ description && visibleWidth(`${lead}${modelLead}${id}: ${description}${badges}`) <= width,
114
+ );
115
+ let title = descriptionShown ? `${theme.bold(id)}: ${description}` : task ? id : theme.bold(id);
116
+ if (task && live && descriptionShown) {
117
+ title = `${theme.fg(nameColor, theme.bold(id))}${theme.fg(nameColor, ":")} ${theme.fg(nameColor, description!)}`;
118
+ } else {
119
+ title = theme.fg(nameColor, title);
120
+ }
121
+ let line = `${lead}${modelLead}${title}${badges}`;
122
+ if (options.preview) line += options.preview;
123
+ if (options.stats) line += formatAgentStatRun(options.stats, theme);
124
+ if (options.durationMs !== undefined && options.durationMs > 0) {
125
+ line += `${theme.sep.dot}${theme.fg("dim", formatDuration(options.durationMs))}`;
126
+ }
127
+ return { line: Number.isFinite(width) ? truncateToWidth(line, width, "") : line, descriptionShown };
128
+ }