@oh-my-pi/pi-tui 18.4.2 → 18.4.4

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 (463) hide show
  1. package/CHANGELOG.md +56 -0
  2. package/dist/types/apps/cleanse-board.d.ts +17 -0
  3. package/dist/types/apps/git/help.d.ts +16 -0
  4. package/dist/types/apps/git/sidebar.d.ts +18 -0
  5. package/dist/types/apps/live-visualizer.d.ts +10 -0
  6. package/dist/types/apps/ps-top.d.ts +15 -0
  7. package/dist/types/apps/standalone-picker.d.ts +3 -0
  8. package/dist/types/autocomplete.d.ts +8 -0
  9. package/dist/types/chat/advisor-message.d.ts +12 -2
  10. package/dist/types/chat/assistant-message.d.ts +20 -0
  11. package/dist/types/chat/bash-execution.d.ts +9 -0
  12. package/dist/types/chat/chat-transcript-builder.d.ts +6 -1
  13. package/dist/types/chat/collab-prompt-message.d.ts +4 -0
  14. package/dist/types/chat/compaction-summary-message.d.ts +15 -0
  15. package/dist/types/chat/eval-execution.d.ts +8 -0
  16. package/dist/types/chat/execution-shared.d.ts +58 -0
  17. package/dist/types/chat/late-diagnostics-message.d.ts +15 -1
  18. package/dist/types/chat/read-tool-group.d.ts +15 -0
  19. package/dist/types/chat/skill-message.d.ts +9 -0
  20. package/dist/types/chat/stripped-tool-calls-placeholder.d.ts +3 -0
  21. package/dist/types/chat/thinking-display.d.ts +2 -0
  22. package/dist/types/chat/todo-reminder.d.ts +4 -1
  23. package/dist/types/chat/tool-execution.d.ts +25 -1
  24. package/dist/types/chat/transcript-actions.d.ts +37 -0
  25. package/dist/types/chat/transcript-entry.d.ts +3 -1
  26. package/dist/types/chat/user-message.d.ts +25 -0
  27. package/dist/types/chrome/collab-qrcode.d.ts +7 -0
  28. package/dist/types/chrome/context-thresholds.d.ts +11 -0
  29. package/dist/types/chrome/countdown-timer.d.ts +9 -3
  30. package/dist/types/chrome/diff.d.ts +12 -0
  31. package/dist/types/chrome/dynamic-border.d.ts +3 -0
  32. package/dist/types/chrome/format.d.ts +6 -0
  33. package/dist/types/chrome/message-divider.d.ts +13 -0
  34. package/dist/types/chrome/message-frame.d.ts +10 -0
  35. package/dist/types/chrome/message-notice.d.ts +23 -0
  36. package/dist/types/chrome/overlay-box.d.ts +11 -2
  37. package/dist/types/chrome/qrcode.d.ts +7 -0
  38. package/dist/types/chrome/segment-track.d.ts +7 -0
  39. package/dist/types/chrome/selector-helpers.d.ts +0 -6
  40. package/dist/types/chrome/status-notice.d.ts +14 -0
  41. package/dist/types/chrome/streaming-panel.d.ts +3 -0
  42. package/dist/types/chrome/tool-activity.d.ts +3 -0
  43. package/dist/types/chrome/transcript-container.d.ts +13 -0
  44. package/dist/types/chrome/transcript-status.d.ts +15 -3
  45. package/dist/types/components/box.d.ts +7 -0
  46. package/dist/types/components/disclosure.d.ts +9 -0
  47. package/dist/types/components/editor.d.ts +42 -0
  48. package/dist/types/components/form.d.ts +14 -0
  49. package/dist/types/components/image.d.ts +7 -0
  50. package/dist/types/components/input.d.ts +20 -1
  51. package/dist/types/components/key-value-list.d.ts +3 -0
  52. package/dist/types/components/layout/geometry.d.ts +16 -0
  53. package/dist/types/components/layout/row.d.ts +7 -0
  54. package/dist/types/components/layout/split-pane.d.ts +8 -0
  55. package/dist/types/components/layout/stack.d.ts +6 -0
  56. package/dist/types/components/loader.d.ts +48 -0
  57. package/dist/types/components/markdown.d.ts +8 -0
  58. package/dist/types/components/metric.d.ts +7 -0
  59. package/dist/types/components/progress-bar.d.ts +3 -0
  60. package/dist/types/components/scroll-view.d.ts +6 -0
  61. package/dist/types/components/section.d.ts +3 -0
  62. package/dist/types/components/select-list.d.ts +33 -0
  63. package/dist/types/components/settings-list.d.ts +68 -0
  64. package/dist/types/components/spacer.d.ts +4 -0
  65. package/dist/types/components/tab-bar.d.ts +9 -0
  66. package/dist/types/components/table.d.ts +7 -0
  67. package/dist/types/components/text.d.ts +6 -0
  68. package/dist/types/components/tree-view.d.ts +9 -0
  69. package/dist/types/components/truncated-text.d.ts +3 -0
  70. package/dist/types/components/wizard-step.d.ts +6 -0
  71. package/dist/types/hotkeys-markdown.d.ts +24 -0
  72. package/dist/types/index.d.ts +5 -0
  73. package/dist/types/latex-block.d.ts +7 -0
  74. package/dist/types/loop-watchdog.d.ts +9 -0
  75. package/dist/types/native/apply.d.ts +39 -0
  76. package/dist/types/native/backend.d.ts +94 -0
  77. package/dist/types/native/blobs.d.ts +29 -0
  78. package/dist/types/native/describe.d.ts +56 -0
  79. package/dist/types/native/encode.d.ts +50 -0
  80. package/dist/types/native/icons.d.ts +18 -0
  81. package/dist/types/native/memo.d.ts +27 -0
  82. package/dist/types/native/node.d.ts +107 -0
  83. package/dist/types/native/overlay.d.ts +64 -0
  84. package/dist/types/native/picker.d.ts +124 -0
  85. package/dist/types/native/reconcile.d.ts +41 -0
  86. package/dist/types/native/settle.d.ts +11 -0
  87. package/dist/types/native/spans.d.ts +21 -0
  88. package/dist/types/native/state.d.ts +6 -0
  89. package/dist/types/native/tone.d.ts +24 -0
  90. package/dist/types/overlays/advisor-config.d.ts +20 -0
  91. package/dist/types/overlays/agent-hub-renderer.d.ts +27 -11
  92. package/dist/types/overlays/agent-hub.d.ts +10 -0
  93. package/dist/types/overlays/agent-transcript-viewer.d.ts +7 -0
  94. package/dist/types/overlays/agents-hub.d.ts +8 -0
  95. package/dist/types/overlays/annotation-overlay.d.ts +3 -0
  96. package/dist/types/overlays/ask-dialog.d.ts +23 -0
  97. package/dist/types/overlays/bordered-loader.d.ts +3 -0
  98. package/dist/types/overlays/btw-history-panel.d.ts +9 -0
  99. package/dist/types/overlays/btw-panel.d.ts +3 -0
  100. package/dist/types/overlays/cleanse-panel.d.ts +5 -2
  101. package/dist/types/overlays/composer-shape-preview.d.ts +7 -1
  102. package/dist/types/overlays/copy-selector.d.ts +38 -0
  103. package/dist/types/overlays/error-banner.d.ts +9 -0
  104. package/dist/types/overlays/extensions/extension-list.d.ts +1 -0
  105. package/dist/types/overlays/history-search.d.ts +18 -0
  106. package/dist/types/overlays/hook-editor.d.ts +28 -1
  107. package/dist/types/overlays/hook-input.d.ts +3 -0
  108. package/dist/types/overlays/hook-selector.d.ts +10 -0
  109. package/dist/types/overlays/hub-frame.d.ts +18 -0
  110. package/dist/types/overlays/jobs-panel.d.ts +24 -0
  111. package/dist/types/overlays/login-dialog.d.ts +10 -0
  112. package/dist/types/overlays/logout-account-selector.d.ts +4 -0
  113. package/dist/types/overlays/mcp-add-wizard.d.ts +4 -0
  114. package/dist/types/overlays/model-browser.d.ts +69 -0
  115. package/dist/types/overlays/model-hub.d.ts +7 -0
  116. package/dist/types/overlays/model-picker.d.ts +9 -1
  117. package/dist/types/overlays/move-overlay.d.ts +3 -0
  118. package/dist/types/overlays/oauth-selector.d.ts +4 -0
  119. package/dist/types/overlays/omfg-panel.d.ts +3 -0
  120. package/dist/types/overlays/pause-screen.d.ts +12 -0
  121. package/dist/types/overlays/plan-review-overlay.d.ts +5 -0
  122. package/dist/types/overlays/plan-save-overlay.d.ts +10 -0
  123. package/dist/types/overlays/plugin-selector.d.ts +4 -0
  124. package/dist/types/overlays/plugin-settings.d.ts +30 -0
  125. package/dist/types/overlays/queue-mode-selector.d.ts +4 -0
  126. package/dist/types/overlays/reset-usage-selector.d.ts +8 -0
  127. package/dist/types/overlays/rewind-selector.d.ts +5 -0
  128. package/dist/types/overlays/session-info-overlay.d.ts +19 -1
  129. package/dist/types/overlays/session-selector.d.ts +64 -1
  130. package/dist/types/overlays/settings-defs.d.ts +14 -0
  131. package/dist/types/overlays/settings-selector.d.ts +21 -0
  132. package/dist/types/overlays/show-images-selector.d.ts +4 -0
  133. package/dist/types/overlays/snapcompact-shape-preview.d.ts +2 -0
  134. package/dist/types/overlays/stats-notice.d.ts +8 -0
  135. package/dist/types/overlays/theme-selector.d.ts +11 -0
  136. package/dist/types/overlays/thinking-selector.d.ts +4 -0
  137. package/dist/types/overlays/tree-selector.d.ts +60 -2
  138. package/dist/types/overlays/usage-dashboard.d.ts +26 -3
  139. package/dist/types/overlays/usage-row.d.ts +36 -2
  140. package/dist/types/prompt/attachment-chips.d.ts +8 -0
  141. package/dist/types/prompt/composer-attachments.d.ts +15 -3
  142. package/dist/types/prompt/composer.d.ts +18 -1
  143. package/dist/types/prompt/custom-editor.d.ts +48 -2
  144. package/dist/types/prompt/editor-top-gap.d.ts +2 -0
  145. package/dist/types/prompt/macos-spelling.d.ts +6 -0
  146. package/dist/types/prompt/magic-keywords.d.ts +9 -0
  147. package/dist/types/prompt/queued-messages.d.ts +23 -0
  148. package/dist/types/prompt/skill-tokens.d.ts +4 -2
  149. package/dist/types/prompt/welcome.d.ts +16 -0
  150. package/dist/types/render/code-cell.d.ts +10 -0
  151. package/dist/types/render/file-list.d.ts +8 -0
  152. package/dist/types/render/hyperlink.d.ts +14 -0
  153. package/dist/types/render/output-block.d.ts +43 -0
  154. package/dist/types/render/output-pane.d.ts +17 -0
  155. package/dist/types/render/tool-card.d.ts +8 -0
  156. package/dist/types/render/tree-list.d.ts +8 -0
  157. package/dist/types/render/width-aware-text.d.ts +7 -0
  158. package/dist/types/setup/scenes/outro.d.ts +7 -0
  159. package/dist/types/setup/scenes/sign-in.d.ts +16 -9
  160. package/dist/types/setup/scenes/splash.d.ts +8 -0
  161. package/dist/types/setup/scenes/types.d.ts +6 -27
  162. package/dist/types/setup/wizard-overlay.d.ts +9 -0
  163. package/dist/types/status-line/component.d.ts +49 -5
  164. package/dist/types/status-line/context-usage.d.ts +20 -0
  165. package/dist/types/status-line/footer.d.ts +8 -0
  166. package/dist/types/status-line/metrics.d.ts +1 -2
  167. package/dist/types/status-line/segments.d.ts +10 -1
  168. package/dist/types/status-line/types.d.ts +40 -1
  169. package/dist/types/stdin-buffer.d.ts +10 -7
  170. package/dist/types/terminal-capabilities.d.ts +1 -1
  171. package/dist/types/terminal.d.ts +36 -0
  172. package/dist/types/theme/defaults/index.d.ts +100 -0
  173. package/dist/types/theme/schema.d.ts +2 -0
  174. package/dist/types/theme/shimmer.d.ts +8 -0
  175. package/dist/types/theme/theme-class.d.ts +2 -0
  176. package/dist/types/theme/theme.d.ts +33 -1
  177. package/dist/types/tools/ask.d.ts +3 -0
  178. package/dist/types/tools/ast-edit.d.ts +10 -1
  179. package/dist/types/tools/ast-grep.d.ts +10 -1
  180. package/dist/types/tools/autoresearch.d.ts +21 -4
  181. package/dist/types/tools/bash.d.ts +30 -1
  182. package/dist/types/tools/cfg-render.d.ts +5 -1
  183. package/dist/types/tools/debug.d.ts +3 -1
  184. package/dist/types/tools/default-renderer.d.ts +6 -1
  185. package/dist/types/tools/edit.d.ts +14 -1
  186. package/dist/types/tools/eval.d.ts +12 -1
  187. package/dist/types/tools/fetch.d.ts +16 -1
  188. package/dist/types/tools/find.d.ts +15 -1
  189. package/dist/types/tools/github.d.ts +3 -0
  190. package/dist/types/tools/glob.d.ts +14 -1
  191. package/dist/types/tools/goal.d.ts +3 -1
  192. package/dist/types/tools/grep.d.ts +14 -1
  193. package/dist/types/tools/grouped-file-output.d.ts +58 -0
  194. package/dist/types/tools/json-tree.d.ts +20 -0
  195. package/dist/types/tools/lsp.d.ts +3 -10
  196. package/dist/types/tools/mcp.d.ts +16 -1
  197. package/dist/types/tools/memory.d.ts +26 -0
  198. package/dist/types/tools/native-view.d.ts +90 -0
  199. package/dist/types/tools/proc-render.d.ts +7 -1
  200. package/dist/types/tools/read.d.ts +23 -1
  201. package/dist/types/tools/renderer.d.ts +57 -0
  202. package/dist/types/tools/report-tool-issue.d.ts +3 -0
  203. package/dist/types/tools/resolve.d.ts +14 -1
  204. package/dist/types/tools/task.d.ts +3 -0
  205. package/dist/types/tools/think.d.ts +3 -0
  206. package/dist/types/tools/todo.d.ts +12 -0
  207. package/dist/types/tools/vibe.d.ts +3 -1
  208. package/dist/types/tools/wait.d.ts +3 -0
  209. package/dist/types/tools/web-search-types.d.ts +90 -0
  210. package/dist/types/tools/web-search.d.ts +9 -168
  211. package/dist/types/tools/write.d.ts +14 -1
  212. package/dist/types/tools/xdev.d.ts +13 -0
  213. package/dist/types/tui.d.ts +49 -0
  214. package/package.json +9 -9
  215. package/src/apps/autoresearch-dashboard.ts +362 -4
  216. package/src/apps/cleanse-board.ts +219 -1
  217. package/src/apps/cleanse-picker.ts +9 -1
  218. package/src/apps/debug/log-viewer.ts +15 -15
  219. package/src/apps/debug/protocol-probe.ts +2 -20
  220. package/src/apps/git/avatar.ts +2 -22
  221. package/src/apps/git/git-tui.ts +406 -59
  222. package/src/apps/git/help.ts +130 -0
  223. package/src/apps/git/sidebar.ts +491 -0
  224. package/src/apps/live-visualizer.ts +65 -0
  225. package/src/apps/ps-top.ts +448 -17
  226. package/src/apps/session-picker.ts +1 -0
  227. package/src/apps/setup-model-picker.ts +5 -1
  228. package/src/apps/standalone-picker.ts +55 -1
  229. package/src/autocomplete.ts +44 -1
  230. package/src/chat/advisor-message.ts +72 -3
  231. package/src/chat/assistant-message.ts +538 -51
  232. package/src/chat/background-tan-message.ts +4 -4
  233. package/src/chat/bash-execution.ts +81 -0
  234. package/src/chat/cache-invalidation-marker.ts +8 -0
  235. package/src/chat/chat-transcript-builder.ts +37 -6
  236. package/src/chat/collab-prompt-message.ts +15 -3
  237. package/src/chat/compaction-summary-message.ts +74 -1
  238. package/src/chat/custom-message.ts +3 -1
  239. package/src/chat/eval-execution.ts +57 -0
  240. package/src/chat/execution-shared.ts +153 -1
  241. package/src/chat/hook-message.ts +1 -0
  242. package/src/chat/late-diagnostics-message.ts +85 -2
  243. package/src/chat/read-tool-group.ts +341 -1
  244. package/src/chat/served-model-marker.ts +8 -0
  245. package/src/chat/skill-message.ts +63 -0
  246. package/src/chat/stripped-tool-calls-placeholder.ts +18 -10
  247. package/src/chat/thinking-display.ts +73 -11
  248. package/src/chat/todo-reminder.ts +34 -4
  249. package/src/chat/tool-execution.ts +385 -10
  250. package/src/chat/transcript-actions.ts +38 -0
  251. package/src/chat/transcript-browser.ts +2 -9
  252. package/src/chat/transcript-entry.ts +10 -1
  253. package/src/chat/transcript-render-helpers.ts +16 -15
  254. package/src/chat/ttsr-notification.ts +38 -1
  255. package/src/chat/user-message.ts +167 -4
  256. package/src/chrome/collab-qrcode.ts +27 -2
  257. package/src/chrome/context-thresholds.ts +34 -0
  258. package/src/chrome/countdown-timer.ts +24 -1
  259. package/src/chrome/diff.ts +60 -1
  260. package/src/chrome/dynamic-border.ts +7 -0
  261. package/src/chrome/format.ts +12 -0
  262. package/src/chrome/message-divider.ts +33 -1
  263. package/src/chrome/message-frame.ts +53 -10
  264. package/src/chrome/message-notice.ts +71 -0
  265. package/src/chrome/overlay-box.ts +45 -2
  266. package/src/chrome/qrcode.ts +28 -0
  267. package/src/chrome/segment-track.ts +26 -0
  268. package/src/chrome/selector-helpers.ts +1 -17
  269. package/src/chrome/status-notice.ts +46 -0
  270. package/src/chrome/streaming-panel.ts +25 -1
  271. package/src/chrome/tool-activity.ts +20 -0
  272. package/src/chrome/transcript-container.ts +139 -17
  273. package/src/chrome/transcript-status.ts +40 -11
  274. package/src/components/box.ts +51 -0
  275. package/src/components/disclosure.ts +33 -0
  276. package/src/components/editor.ts +239 -36
  277. package/src/components/form.ts +93 -9
  278. package/src/components/image.ts +30 -0
  279. package/src/components/input.ts +77 -26
  280. package/src/components/key-value-list.ts +18 -0
  281. package/src/components/layout/geometry.ts +44 -0
  282. package/src/components/layout/row.ts +30 -0
  283. package/src/components/layout/split-pane.ts +65 -0
  284. package/src/components/layout/stack.ts +27 -0
  285. package/src/components/loader.ts +183 -1
  286. package/src/components/markdown.ts +131 -56
  287. package/src/components/metric.ts +39 -0
  288. package/src/components/progress-bar.ts +28 -0
  289. package/src/components/scroll-view.ts +23 -0
  290. package/src/components/section.ts +16 -0
  291. package/src/components/select-list.ts +174 -25
  292. package/src/components/settings-list.ts +264 -7
  293. package/src/components/spacer.ts +17 -0
  294. package/src/components/tab-bar.ts +42 -0
  295. package/src/components/table.ts +34 -0
  296. package/src/components/text.ts +23 -0
  297. package/src/components/tree-view.ts +65 -0
  298. package/src/components/truncated-text.ts +14 -0
  299. package/src/components/wizard-step.ts +18 -9
  300. package/src/debug-server.ts +14 -7
  301. package/src/hotkeys-markdown.ts +251 -69
  302. package/src/index.ts +6 -0
  303. package/src/latex-block.ts +11 -0
  304. package/src/loop-watchdog.ts +38 -10
  305. package/src/native/apply.ts +275 -0
  306. package/src/native/backend.ts +682 -0
  307. package/src/native/blobs.ts +70 -0
  308. package/src/native/describe.ts +124 -0
  309. package/src/native/encode.ts +233 -0
  310. package/src/native/icons.ts +184 -0
  311. package/src/native/memo.ts +64 -0
  312. package/src/native/node.ts +112 -0
  313. package/src/native/overlay.ts +131 -0
  314. package/src/native/picker.ts +333 -0
  315. package/src/native/reconcile.ts +1063 -0
  316. package/src/native/settle.ts +23 -0
  317. package/src/native/spans.ts +308 -0
  318. package/src/native/state.ts +28 -0
  319. package/src/native/tone.ts +79 -0
  320. package/src/overlays/advisor-config.ts +420 -0
  321. package/src/overlays/agent-hub-renderer.ts +155 -18
  322. package/src/overlays/agent-hub.ts +1037 -44
  323. package/src/overlays/agent-transcript-viewer.ts +129 -0
  324. package/src/overlays/agents-hub.ts +688 -53
  325. package/src/overlays/annotation-overlay.ts +391 -52
  326. package/src/overlays/ask-dialog.ts +435 -24
  327. package/src/overlays/bordered-loader.ts +17 -0
  328. package/src/overlays/btw-history-panel.ts +182 -0
  329. package/src/overlays/btw-panel.ts +68 -2
  330. package/src/overlays/cleanse-panel.ts +105 -15
  331. package/src/overlays/codex-reset-fireworks.ts +65 -5
  332. package/src/overlays/composer-shape-preview.ts +26 -1
  333. package/src/overlays/copy-selector.ts +545 -23
  334. package/src/overlays/error-banner.ts +44 -0
  335. package/src/overlays/extensions/extension-list.ts +23 -17
  336. package/src/overlays/history-search.ts +175 -33
  337. package/src/overlays/hook-editor.ts +113 -6
  338. package/src/overlays/hook-input.ts +22 -1
  339. package/src/overlays/hook-selector.ts +311 -22
  340. package/src/overlays/hub-frame.ts +80 -0
  341. package/src/overlays/jobs-panel.ts +112 -0
  342. package/src/overlays/login-dialog.ts +183 -1
  343. package/src/overlays/logout-account-selector.ts +102 -4
  344. package/src/overlays/mcp-add-wizard.ts +232 -53
  345. package/src/overlays/model-browser.ts +681 -22
  346. package/src/overlays/model-hub.ts +1402 -78
  347. package/src/overlays/model-picker.ts +184 -7
  348. package/src/overlays/move-overlay.ts +45 -0
  349. package/src/overlays/oauth-selector.ts +227 -23
  350. package/src/overlays/omfg-panel.ts +86 -2
  351. package/src/overlays/pause-screen.ts +55 -4
  352. package/src/overlays/plan-review-overlay.ts +352 -0
  353. package/src/overlays/plan-save-overlay.ts +45 -0
  354. package/src/overlays/plugin-selector.ts +21 -1
  355. package/src/overlays/plugin-settings.ts +195 -5
  356. package/src/overlays/queue-mode-selector.ts +19 -1
  357. package/src/overlays/reset-usage-selector.ts +110 -40
  358. package/src/overlays/rewind-selector.ts +458 -44
  359. package/src/overlays/session-account-selector.ts +1 -1
  360. package/src/overlays/session-info-overlay.ts +137 -1
  361. package/src/overlays/session-selector.ts +807 -46
  362. package/src/overlays/settings-defs.ts +41 -0
  363. package/src/overlays/settings-selector.ts +585 -33
  364. package/src/overlays/show-images-selector.ts +18 -1
  365. package/src/overlays/snapcompact-shape-preview.ts +48 -3
  366. package/src/overlays/stats-notice.ts +31 -0
  367. package/src/overlays/theme-selector.ts +31 -1
  368. package/src/overlays/thinking-selector.ts +22 -1
  369. package/src/overlays/tree-selector.ts +570 -110
  370. package/src/overlays/usage-dashboard.ts +587 -12
  371. package/src/overlays/usage-row.ts +161 -25
  372. package/src/prompt/attachment-chips.ts +60 -0
  373. package/src/prompt/composer-attachments.ts +31 -9
  374. package/src/prompt/composer.ts +55 -2
  375. package/src/prompt/custom-editor.ts +302 -4
  376. package/src/prompt/editor-top-gap.ts +8 -0
  377. package/src/prompt/macos-spelling.ts +24 -9
  378. package/src/prompt/magic-keywords.ts +22 -1
  379. package/src/prompt/model-mention-autocomplete.ts +1 -0
  380. package/src/prompt/queued-messages.ts +101 -0
  381. package/src/prompt/skill-tokens.ts +5 -3
  382. package/src/prompt/welcome.ts +213 -6
  383. package/src/render/code-cell.ts +103 -2
  384. package/src/render/file-list.ts +29 -0
  385. package/src/render/hyperlink.ts +32 -0
  386. package/src/render/output-block.ts +110 -0
  387. package/src/render/output-pane.ts +37 -0
  388. package/src/render/tool-card.ts +137 -0
  389. package/src/render/tree-list.ts +39 -0
  390. package/src/render/width-aware-text.ts +20 -0
  391. package/src/setup/scenes/composer.ts +29 -0
  392. package/src/setup/scenes/glyph.ts +15 -0
  393. package/src/setup/scenes/model.ts +36 -8
  394. package/src/setup/scenes/outro.ts +28 -1
  395. package/src/setup/scenes/sign-in.ts +138 -24
  396. package/src/setup/scenes/splash.ts +28 -1
  397. package/src/setup/scenes/theme.ts +88 -3
  398. package/src/setup/scenes/types.ts +7 -28
  399. package/src/setup/startup-splash.ts +46 -9
  400. package/src/setup/wizard-overlay.ts +140 -23
  401. package/src/setup/wizard.ts +1 -1
  402. package/src/status-line/component.ts +414 -18
  403. package/src/status-line/context-usage.ts +279 -50
  404. package/src/status-line/footer.ts +94 -1
  405. package/src/status-line/metrics.ts +3 -6
  406. package/src/status-line/segments.ts +463 -97
  407. package/src/status-line/separators.ts +3 -16
  408. package/src/status-line/types.ts +43 -1
  409. package/src/stdin-buffer.ts +27 -21
  410. package/src/terminal-capabilities.ts +7 -0
  411. package/src/terminal.ts +153 -11
  412. package/src/theme/defaults/dark-neon-noir.json +100 -0
  413. package/src/theme/defaults/index.ts +2 -0
  414. package/src/theme/defaults/light-prism.json +5 -5
  415. package/src/theme/defaults/onyx.json +62 -62
  416. package/src/theme/mermaid-cache.ts +10 -1
  417. package/src/theme/schema.ts +15 -0
  418. package/src/theme/shimmer.ts +33 -0
  419. package/src/theme/theme-class.ts +24 -19
  420. package/src/theme/theme.ts +111 -9
  421. package/src/theme/tui-adapters.ts +14 -1
  422. package/src/tools/ask.ts +157 -1
  423. package/src/tools/ast-edit.ts +174 -1
  424. package/src/tools/ast-grep.ts +82 -2
  425. package/src/tools/autoresearch.ts +149 -1
  426. package/src/tools/bash.ts +233 -62
  427. package/src/tools/cfg-render.ts +66 -1
  428. package/src/tools/debug.ts +78 -1
  429. package/src/tools/default-renderer.ts +35 -1
  430. package/src/tools/edit.ts +357 -31
  431. package/src/tools/eval.ts +257 -1
  432. package/src/tools/fetch.ts +102 -3
  433. package/src/tools/find.ts +127 -1
  434. package/src/tools/github.ts +119 -10
  435. package/src/tools/glob.ts +116 -1
  436. package/src/tools/goal.ts +56 -1
  437. package/src/tools/grep.ts +83 -2
  438. package/src/tools/grouped-file-output.ts +205 -0
  439. package/src/tools/json-tree.ts +116 -1
  440. package/src/tools/lsp.ts +318 -1
  441. package/src/tools/mcp.ts +80 -1
  442. package/src/tools/memory.ts +93 -11
  443. package/src/tools/native-view.ts +292 -0
  444. package/src/tools/proc-render.ts +221 -1
  445. package/src/tools/read.ts +199 -4
  446. package/src/tools/renderer.ts +61 -0
  447. package/src/tools/report-tool-issue.ts +7 -1
  448. package/src/tools/resolve.ts +63 -1
  449. package/src/tools/streaming-output.ts +79 -16
  450. package/src/tools/task.ts +406 -4
  451. package/src/tools/think.ts +19 -1
  452. package/src/tools/todo.ts +89 -0
  453. package/src/tools/vibe.ts +230 -2
  454. package/src/tools/wait.ts +181 -1
  455. package/src/tools/web-search-types.ts +99 -0
  456. package/src/tools/web-search.ts +111 -170
  457. package/src/tools/write.ts +144 -5
  458. package/src/tools/xdev.ts +64 -1
  459. package/src/tui.ts +295 -4
  460. package/dist/types/setup/scenes/providers.d.ts +0 -3
  461. package/dist/types/setup/scenes/web-search.d.ts +0 -22
  462. package/src/setup/scenes/providers.ts +0 -110
  463. package/src/setup/scenes/web-search.ts +0 -165
@@ -39,6 +39,10 @@ import { bottomBorder, divider, dividerSplit, PanelRows, row, topBorder, topBord
39
39
  import { isLayoutMouseRoutable } from "../components/layout/geometry";
40
40
  import { SplitPane } from "../components/layout/split-pane";
41
41
  import { Stack } from "../components/layout/stack";
42
+ import type { TspPrefsProps, TspPrefsRow, TspSpan } from "@oh-my-pi/pi-wire";
43
+ import { col, node, span, text } from "../native/describe";
44
+ import type { DescribeContext, NativeChild, NativeNode, NativeUiEvent } from "../native/node";
45
+ import { actionHint, hintsRow, type NativeHint, overlayCard } from "../native/overlay";
42
46
 
43
47
  /** One advisor declared in `WATCHDOG.yml`; its instructions specialize the shared baseline. */
44
48
  export interface AdvisorConfig {
@@ -196,6 +200,38 @@ function wrap(text: string, width: number): string[] {
196
200
 
197
201
  type Screen = "list" | "detail" | "name" | "model" | "tools" | "thinking" | "instructions";
198
202
 
203
+ /** Footer key hints per screen for the described overlay (the ANSI footer strings carry the same keys). */
204
+ function screenHints(screen: Screen): (NativeHint | undefined)[] {
205
+ switch (screen) {
206
+ case "list":
207
+ return [
208
+ actionHint(["tui.select.up", "tui.select.down"], "move"),
209
+ actionHint("tui.select.confirm", "select"),
210
+ actionHint("tui.select.cancel", "close"),
211
+ ];
212
+ case "detail":
213
+ return [actionHint("tui.select.confirm", "edit field"), actionHint("tui.select.cancel", "back")];
214
+ case "name":
215
+ return [actionHint("tui.input.submit", "save"), actionHint("tui.select.cancel", "cancel")];
216
+ case "model":
217
+ return [
218
+ { keys: [], label: "type to search" },
219
+ { keys: ["enter"], label: "pick" },
220
+ actionHint("tui.select.cancel", "back"),
221
+ ];
222
+ case "thinking":
223
+ return [actionHint("tui.select.confirm", "pick"), actionHint("tui.select.cancel", "back")];
224
+ case "tools":
225
+ return [
226
+ actionHint("tui.select.confirm", "toggle"),
227
+ { keys: [], label: "Done applies (empty = no tools; read/grep/glob = default)" },
228
+ actionHint("tui.select.cancel", "apply"),
229
+ ];
230
+ case "instructions":
231
+ return [];
232
+ }
233
+ }
234
+
199
235
  /**
200
236
  * Fullscreen advisor-configuration overlay. Implements {@link Component} directly
201
237
  * (rather than extending Container) so it owns the whole frame and the mouse
@@ -214,11 +250,26 @@ export class AdvisorConfigOverlayComponent implements Component {
214
250
  #cachedReports: UsageReport[] | null = null;
215
251
  #dirty = false;
216
252
 
253
+ /** The advisor the detail screen (and its editors) edits; -1 on the roster or the shared instructions. */
254
+ #detailIndex = -1;
255
+ #nativePrefs: { signature: string; editor: Component | undefined; node: NativeNode } | undefined;
217
256
  #screen: Screen = "list";
218
257
  /** The interactive element for the current screen. */
219
258
  #active: Component = new SelectList([], 1, getSelectListTheme());
220
259
  #footerHint = "";
221
260
  #previewScroll = 0;
261
+ #nativeHints: { screen: Screen; node: NativeNode | undefined } | undefined;
262
+ #nativePreview: { json: string; node: NativeNode } | undefined;
263
+ #nativeRoot:
264
+ | {
265
+ screen: Screen;
266
+ active: Component;
267
+ title: string;
268
+ preview: NativeNode | undefined;
269
+ hints: NativeNode | undefined;
270
+ node: NativeNode;
271
+ }
272
+ | undefined;
222
273
 
223
274
  // Persistent frame: top, growing two-pane body, divider, footer, bottom.
224
275
  // The frame paints from screen row 0, so SGR `event.row`/`event.col` —
@@ -309,6 +360,372 @@ export class AdvisorConfigOverlayComponent implements Component {
309
360
  return this.#frame.render(width);
310
361
  }
311
362
 
363
+ /** Docks as a side sheet beside the transcript, like `/settings`, when the terminal draws `prefs` with `aside`. */
364
+ nativeSheet(cx: DescribeContext): boolean {
365
+ return cx.supports("prefs") && cx.feature("aside");
366
+ }
367
+
368
+ /**
369
+ * The native settings page (`prefs`) when the terminal draws it: a page per
370
+ * advisor plus the shared instructions, the advisor's fields as typed rows,
371
+ * the file actions, and the model/tools/instructions editors over the page.
372
+ * Otherwise the root card `omp.overlay.advisor`: on the roster screen a
373
+ * sidebar (the active `SelectList`) beside the highlighted entry's preview;
374
+ * every other screen shows its editor component alone. Key hints close the
375
+ * card.
376
+ */
377
+ describe(cx: DescribeContext): NativeNode {
378
+ if (cx.supports("prefs")) return this.#describePrefs();
379
+ return this.#describeCard();
380
+ }
381
+
382
+ /** The advisor index a page shows: the detail's, else the roster's highlighted advisor, else the first. */
383
+ #pageIndex(): number {
384
+ if (this.#detailIndex >= 0) return this.#detailIndex;
385
+ const value = this.#active instanceof SelectList ? (this.#active.getSelectedItem()?.value ?? "") : "";
386
+ const match = /^advisor:(\d+)$/.exec(value);
387
+ return match ? Number(match[1]) : value === "shared" ? -1 : 0;
388
+ }
389
+
390
+ #describePrefs(): NativeNode {
391
+ const doc = this.#doc;
392
+ const index = this.#pageIndex();
393
+ const shared = index < 0;
394
+ const advisor = shared ? undefined : doc.advisors[index];
395
+ const pages: TspPrefsProps["pages"][number][] = doc.advisors.map((a, i) => ({
396
+ id: `advisor:${i}`,
397
+ label: a.name || "(unnamed)",
398
+ icon: "advisor",
399
+ group: "Advisors",
400
+ }));
401
+ pages.push({ id: "shared", label: "Shared instructions", icon: "doc", group: "All advisors" });
402
+
403
+ const sections: TspPrefsProps["sections"][number][] = [];
404
+ if (doc.warnings?.length) {
405
+ sections.push({
406
+ id: "warnings",
407
+ title: "Config problems",
408
+ rows: sanitizeDisplayWarnings(doc.warnings).map((warning, i) => ({
409
+ id: `warning:${i}`,
410
+ label: "Dropped while loading",
411
+ warning,
412
+ control: { k: "action", label: "Save to rewrite", act: "save" },
413
+ })),
414
+ });
415
+ }
416
+ if (advisor) {
417
+ const model = advisor.model?.trim();
418
+ const tools = advisor.tools ?? [...this.#deps.defaultToolNames];
419
+ const rows: TspPrefsRow[] = [
420
+ {
421
+ id: "toggleEnabled",
422
+ label: "Enabled",
423
+ hint: "Run this advisor alongside the session.",
424
+ control: { k: "switch", on: advisor.enabled !== false },
425
+ },
426
+ { id: "name", label: "Name", control: { k: "text", value: advisor.name } },
427
+ {
428
+ id: "model",
429
+ label: "Model",
430
+ hint: model ? undefined : `Uses the advisor role default (${this.#defaultModelLabel ?? "unset"}).`,
431
+ changed: model ? true : undefined,
432
+ defaultLabel: model ? (this.#defaultModelLabel ?? "advisor role default") : undefined,
433
+ control: { k: "action", label: model || this.#defaultModelLabel || "advisor role default", act: "edit" },
434
+ },
435
+ {
436
+ id: "tools",
437
+ label: "Tools",
438
+ hint: "None means no tools; read, grep and glob are the default.",
439
+ control: {
440
+ k: "multi",
441
+ values: tools,
442
+ options: this.#availableToolNames.map(name => ({ value: name, label: name })),
443
+ },
444
+ },
445
+ {
446
+ id: "instructions",
447
+ label: "Instructions",
448
+ hint: previewLineOrNone(advisor.instructions),
449
+ control: { k: "action", label: "Edit…", act: "edit" },
450
+ },
451
+ { id: "delete", label: "Delete this advisor", control: { k: "action", label: "Delete", act: "delete" } },
452
+ ];
453
+ sections.push({ id: "advisor", title: advisor.name || "Advisor", rows });
454
+ } else {
455
+ sections.push({
456
+ id: "shared",
457
+ title: "Shared instructions",
458
+ rows: [
459
+ {
460
+ id: "shared",
461
+ label: "Instructions",
462
+ hint: previewLineOrNone(doc.instructions),
463
+ control: { k: "action", label: "Edit…", act: "edit" },
464
+ },
465
+ ],
466
+ });
467
+ }
468
+ sections.push({
469
+ id: "file",
470
+ title: `WATCHDOG.yml · ${this.#scope}`,
471
+ rows: [
472
+ {
473
+ id: "save",
474
+ label: "Save & apply",
475
+ hint: "Write this file and reload the live advisors without a restart.",
476
+ warning: this.#dirty ? "Unsaved changes" : undefined,
477
+ control: { k: "action", label: "Save", act: "save" },
478
+ },
479
+ {
480
+ id: "add",
481
+ label: "Add advisor",
482
+ hint: "Create a new advisor entry, then set its model, tools and instructions.",
483
+ control: { k: "action", label: "Add", act: "add" },
484
+ },
485
+ {
486
+ id: "scope",
487
+ label: "Scope",
488
+ hint: `Editing the ${this.#scope} file. Switch to the ${this.#otherScope()} file.`,
489
+ control: { k: "action", label: `Open ${this.#otherScope()}`, act: "scope" },
490
+ },
491
+ ],
492
+ });
493
+
494
+ // Name editing shows its draft in the row; the other editors sit over the page.
495
+ const input = this.#screen === "name" && this.#active instanceof Input ? this.#active : undefined;
496
+ const editing = input
497
+ ? { row: "name", draft: input.getValue(), cursor: Number(input.debugState().cursor) }
498
+ : null;
499
+ const overlay =
500
+ this.#screen === "model" ||
501
+ this.#screen === "thinking" ||
502
+ this.#screen === "tools" ||
503
+ this.#screen === "instructions";
504
+ const editor = overlay ? this.#active : undefined;
505
+ const focus =
506
+ this.#screen === "detail" && this.#active instanceof SelectList
507
+ ? (this.#active.getSelectedItem()?.value ?? null)
508
+ : null;
509
+ const props: TspPrefsProps = {
510
+ title: this.#dirty ? "Advisors · unsaved" : "Advisors",
511
+ pages,
512
+ page: shared ? "shared" : `advisor:${index}`,
513
+ lead: shared
514
+ ? "Instructions every advisor gets before its own."
515
+ : "An advisor watches the session and leaves notes; set its model, tools and instructions here.",
516
+ sections,
517
+ focus,
518
+ editing,
519
+ };
520
+ const signature = JSON.stringify(props);
521
+ const prev = this.#nativePrefs;
522
+ if (prev && prev.signature === signature && prev.editor === editor) return prev.node;
523
+ const children: NativeChild[] = editor ? [col([editor], { role: "omp.prefs.editor" })] : [];
524
+ const root = node("prefs", props, children);
525
+ this.#nativePrefs = { signature, editor, node: root };
526
+ return root;
527
+ }
528
+
529
+ /**
530
+ * Native page events, each through the roster/detail selections the keys
531
+ * make: a page opens that advisor (or the shared instructions), a field
532
+ * change or button runs the field's detail action, and closing an editor
533
+ * or the page cancels like Esc.
534
+ */
535
+ handleNativeEvent(event: NativeUiEvent): void {
536
+ if (event.key !== "") return;
537
+ const index = this.#pageIndex();
538
+ switch (event.type) {
539
+ case "action": {
540
+ if (event.act === "page" && event.value) {
541
+ const match = /^advisor:(\d+)$/.exec(event.value);
542
+ if (match) this.#showDetail(Number(match[1]));
543
+ else if (event.value === "shared") this.#showInstructionsEditor(-1);
544
+ return;
545
+ }
546
+ if (event.act === "close") {
547
+ if (event.value !== undefined) this.#active.handleInput?.("\x1b");
548
+ else this.#cb.close();
549
+ return;
550
+ }
551
+ if (event.act === "save" || event.act === "add" || event.act === "scope") {
552
+ void this.#onListSelect(event.act).catch(err => {
553
+ this.#cb.notify(`Advisor config: ${err instanceof Error ? err.message : String(err)}`);
554
+ });
555
+ return;
556
+ }
557
+ if (event.value === "shared") this.#showInstructionsEditor(-1);
558
+ else if (index >= 0 && event.value)
559
+ this.#onDetailSelect(index, event.act === "delete" ? "delete" : event.value);
560
+ return;
561
+ }
562
+ case "change": {
563
+ if (index < 0) return;
564
+ const advisor = this.#doc.advisors[index];
565
+ if (!advisor) return;
566
+ if (event.item === "toggleEnabled" && typeof event.value === "boolean") {
567
+ if (event.value !== (advisor.enabled !== false)) this.#onDetailSelect(index, "toggleEnabled");
568
+ } else if (event.item === "tools" && Array.isArray(event.value)) {
569
+ advisor.tools = commitTools(new Set(event.value), this.#availableToolNames, this.#deps.defaultToolNames);
570
+ this.#dirty = true;
571
+ this.#showDetail(index);
572
+ } else if (event.item === "name" && typeof event.value === "string" && event.value.trim()) {
573
+ advisor.name = event.value.trim();
574
+ this.#dirty = true;
575
+ this.#showDetail(index);
576
+ }
577
+ return;
578
+ }
579
+ case "activate":
580
+ if (event.item === "shared") this.#showInstructionsEditor(-1);
581
+ else if (index >= 0) this.#onDetailSelect(index, event.item);
582
+ return;
583
+ case "select":
584
+ if (this.#screen === "detail" && this.#active instanceof SelectList) {
585
+ this.#active.setSelectedValue(event.item);
586
+ this.#cb.requestRender();
587
+ }
588
+ return;
589
+ case "toggle":
590
+ return;
591
+ }
592
+ }
593
+
594
+ #describeCard(): NativeNode {
595
+ const title = `Advisor configuration · ${this.#scope}${this.#dirty ? " ● unsaved" : ""}`;
596
+ const preview = this.#screen === "list" ? this.#describePreview() : undefined;
597
+ if (this.#nativeHints?.screen !== this.#screen) {
598
+ const hints = screenHints(this.#screen);
599
+ this.#nativeHints = { screen: this.#screen, node: hints.length > 0 ? hintsRow(hints) : undefined };
600
+ }
601
+ const hints = this.#nativeHints.node;
602
+ const prev = this.#nativeRoot;
603
+ if (
604
+ prev?.screen === this.#screen &&
605
+ prev.active === this.#active &&
606
+ prev.title === title &&
607
+ prev.preview === preview &&
608
+ prev.hints === hints
609
+ ) {
610
+ return prev.node;
611
+ }
612
+ const head: TspSpan[] = [span(`Advisor configuration · ${this.#scope}`)];
613
+ if (this.#dirty) head.push(span(" ● unsaved", "warning"));
614
+ const body: NativeNode = preview
615
+ ? node(
616
+ "row",
617
+ { gap: "md", align: "start", grow: 1 },
618
+ [
619
+ node("col", { min: { w: "22ch" }, max: { w: "42ch" }, basis: 0.34 }, [this.#active], "sidebar"),
620
+ preview,
621
+ ],
622
+ "split",
623
+ )
624
+ : node("col", { grow: 1 }, [this.#active], "body");
625
+ const children: NativeChild[] = [body];
626
+ if (hints) children.push(node("rule", undefined, undefined, "divider"), hints);
627
+ const card = overlayCard("omp.overlay.advisor", head, children);
628
+ this.#nativeRoot = { screen: this.#screen, active: this.#active, title, preview, hints, node: card };
629
+ return card;
630
+ }
631
+
632
+ /** The highlighted roster entry's preview; rebuilt only when its content changes (live stats, quota). */
633
+ #describePreview(): NativeNode {
634
+ const children: NativeNode[] = [];
635
+ if (this.#doc.warnings?.length) {
636
+ children.push(
637
+ node(
638
+ "col",
639
+ { tone: "warning" },
640
+ [
641
+ text([span("⚠ Config problems — dropped while loading:", "warning")]),
642
+ ...sanitizeDisplayWarnings(this.#doc.warnings).map(warning =>
643
+ text([span(warning, "warning")], { wrap: "word" }),
644
+ ),
645
+ ],
646
+ "warnings",
647
+ ),
648
+ );
649
+ }
650
+ const list = this.#active;
651
+ const value = list instanceof SelectList ? (list.getSelectedItem()?.value ?? "") : "";
652
+ const match = /^advisor:(\d+)$/.exec(value);
653
+ const advisor = match ? this.#doc.advisors[Number(match[1])] : undefined;
654
+ if (advisor) {
655
+ children.push(...this.#describeAdvisorPreview(advisor));
656
+ } else if (value === "shared") {
657
+ const instructions = this.#doc.instructions?.trim();
658
+ children.push(
659
+ text([span("Shared instructions", "strong")]),
660
+ instructions ? text(instructions, { wrap: "word" }) : text([span("(none)", "muted")]),
661
+ );
662
+ } else {
663
+ const help =
664
+ value === "add"
665
+ ? "Create a new advisor entry, then edit its model, tools, and instructions."
666
+ : value === "scope"
667
+ ? `Switch between the project and user WATCHDOG.yml. Currently editing the ${this.#scope}-level file.`
668
+ : value === "save"
669
+ ? "Write this scope's WATCHDOG.yml and reload the live advisors without a restart."
670
+ : value === "close"
671
+ ? "Close the editor. Unsaved changes are discarded."
672
+ : "";
673
+ if (help) children.push(text([span(help, "muted")], { wrap: "word" }));
674
+ }
675
+ const candidate = node("col", { gap: "sm", grow: 1 }, children, "preview");
676
+ const json = JSON.stringify(candidate);
677
+ if (this.#nativePreview?.json === json) return this.#nativePreview.node;
678
+ this.#nativePreview = { json, node: candidate };
679
+ return candidate;
680
+ }
681
+
682
+ #describeAdvisorPreview(advisor: AdvisorConfig): NativeNode[] {
683
+ const model = advisor.model?.trim() || this.#defaultModelLabel || "advisor role default";
684
+ const instructions = advisor.instructions?.trim();
685
+ const out: NativeNode[] = [
686
+ text([span(advisor.name || "(unnamed)", "strong")]),
687
+ node("kv", {
688
+ items: [
689
+ { k: "Enabled", v: advisor.enabled === false ? "○ off" : "● on" },
690
+ { k: "Model", v: model },
691
+ { k: "Tools", v: formatAdvisorTools(advisor.tools, "no tools") },
692
+ ],
693
+ }),
694
+ text([span("Instructions:", "dim")]),
695
+ instructions ? text(instructions, { wrap: "word" }) : text([span("(none)", "muted")]),
696
+ ];
697
+ const liveStat = this.#cb.getAdvisorStats?.()?.find(s => s.name === (advisor.name || "default"));
698
+ if (liveStat && (liveStat.status === "running" || liveStat.status === "quota_exhausted")) {
699
+ const spendParts = [
700
+ `${liveStat.tokens.input.toLocaleString()} in`,
701
+ `${liveStat.tokens.output.toLocaleString()} out`,
702
+ ];
703
+ if (liveStat.tokens.cacheRead > 0) spendParts.push(`${liveStat.tokens.cacheRead.toLocaleString()} cache`);
704
+ const usage: { k: string; v: string }[] = [{ k: "Tokens", v: spendParts.join(", ") }];
705
+ if (liveStat.cost > 0) usage.push({ k: "Cost", v: `$${liveStat.cost.toFixed(4)}` });
706
+ if (liveStat.contextWindow > 0) {
707
+ const pct = Math.round((liveStat.contextTokens / liveStat.contextWindow) * 100);
708
+ usage.push({
709
+ k: "Context",
710
+ v: `${liveStat.contextTokens.toLocaleString()}/${liveStat.contextWindow.toLocaleString()} (${pct}%)`,
711
+ });
712
+ }
713
+ out.push(text([span("Usage:", "dim")]), node("kv", { items: usage }));
714
+ }
715
+ const quotaProvider =
716
+ (advisor.model?.includes("/") ? advisor.model.split("/")[0] : null) ?? liveStat?.model?.provider;
717
+ if (this.#cachedReports && quotaProvider) {
718
+ const quota = formatCompactQuota(
719
+ quotaProvider,
720
+ this.#cachedReports,
721
+ Date.now(),
722
+ this.#cb.getQuotaLimitFilter?.(quotaProvider, liveStat?.sessionId),
723
+ );
724
+ if (quota) out.push(text([span(quota, "dim")], { wrap: "word" }));
725
+ }
726
+ return out;
727
+ }
728
+
312
729
  // ───────────────────────────── input ─────────────────────────────
313
730
 
314
731
  handleInput(data: string): void {
@@ -489,6 +906,7 @@ export class AdvisorConfigOverlayComponent implements Component {
489
906
  }
490
907
 
491
908
  #showList(): void {
909
+ this.#detailIndex = -1;
492
910
  this.#ensureRosterVisible();
493
911
  const items: SelectItem[] = this.#doc.advisors.map((advisor, index) => ({
494
912
  value: `advisor:${index}`,
@@ -579,6 +997,7 @@ export class AdvisorConfigOverlayComponent implements Component {
579
997
  this.#showList();
580
998
  return;
581
999
  }
1000
+ this.#detailIndex = index;
582
1001
  const modelDescription = advisor.model?.trim() || this.#defaultModelLabel || "advisor role default";
583
1002
  const toolsDescription = formatAdvisorTools(advisor.tools, "no tools");
584
1003
  const items: SelectItem[] = [
@@ -758,6 +1177,7 @@ export class AdvisorConfigOverlayComponent implements Component {
758
1177
  /** `index === -1` edits the shared top-level instructions; otherwise advisor[index]. */
759
1178
  #showInstructionsEditor(index: number): void {
760
1179
  const shared = index < 0;
1180
+ this.#detailIndex = index;
761
1181
  const current = shared ? this.#doc.instructions : this.#doc.advisors[index].instructions;
762
1182
  const title = shared ? "Shared advisor instructions" : `Instructions — ${this.#doc.advisors[index].name}`;
763
1183
  const editor = new HookEditorComponent(