@oh-my-pi/pi-tui 18.4.3 → 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 (447) hide show
  1. package/CHANGELOG.md +36 -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/todo-reminder.d.ts +4 -1
  22. package/dist/types/chat/tool-execution.d.ts +25 -1
  23. package/dist/types/chat/transcript-actions.d.ts +37 -0
  24. package/dist/types/chat/transcript-entry.d.ts +3 -1
  25. package/dist/types/chat/user-message.d.ts +25 -0
  26. package/dist/types/chrome/collab-qrcode.d.ts +7 -0
  27. package/dist/types/chrome/context-thresholds.d.ts +11 -0
  28. package/dist/types/chrome/countdown-timer.d.ts +9 -3
  29. package/dist/types/chrome/diff.d.ts +12 -0
  30. package/dist/types/chrome/dynamic-border.d.ts +3 -0
  31. package/dist/types/chrome/format.d.ts +6 -0
  32. package/dist/types/chrome/message-divider.d.ts +13 -0
  33. package/dist/types/chrome/message-frame.d.ts +10 -0
  34. package/dist/types/chrome/message-notice.d.ts +23 -0
  35. package/dist/types/chrome/overlay-box.d.ts +11 -2
  36. package/dist/types/chrome/qrcode.d.ts +7 -0
  37. package/dist/types/chrome/segment-track.d.ts +7 -0
  38. package/dist/types/chrome/selector-helpers.d.ts +0 -6
  39. package/dist/types/chrome/status-notice.d.ts +14 -0
  40. package/dist/types/chrome/streaming-panel.d.ts +3 -0
  41. package/dist/types/chrome/tool-activity.d.ts +3 -0
  42. package/dist/types/chrome/transcript-container.d.ts +13 -0
  43. package/dist/types/chrome/transcript-status.d.ts +15 -3
  44. package/dist/types/components/box.d.ts +7 -0
  45. package/dist/types/components/disclosure.d.ts +9 -0
  46. package/dist/types/components/editor.d.ts +37 -0
  47. package/dist/types/components/form.d.ts +14 -0
  48. package/dist/types/components/image.d.ts +7 -0
  49. package/dist/types/components/input.d.ts +20 -1
  50. package/dist/types/components/key-value-list.d.ts +3 -0
  51. package/dist/types/components/layout/geometry.d.ts +16 -0
  52. package/dist/types/components/layout/row.d.ts +7 -0
  53. package/dist/types/components/layout/split-pane.d.ts +8 -0
  54. package/dist/types/components/layout/stack.d.ts +6 -0
  55. package/dist/types/components/loader.d.ts +48 -0
  56. package/dist/types/components/markdown.d.ts +8 -0
  57. package/dist/types/components/metric.d.ts +7 -0
  58. package/dist/types/components/progress-bar.d.ts +3 -0
  59. package/dist/types/components/scroll-view.d.ts +6 -0
  60. package/dist/types/components/section.d.ts +3 -0
  61. package/dist/types/components/select-list.d.ts +33 -0
  62. package/dist/types/components/settings-list.d.ts +68 -0
  63. package/dist/types/components/spacer.d.ts +4 -0
  64. package/dist/types/components/tab-bar.d.ts +9 -0
  65. package/dist/types/components/table.d.ts +7 -0
  66. package/dist/types/components/text.d.ts +6 -0
  67. package/dist/types/components/tree-view.d.ts +9 -0
  68. package/dist/types/components/truncated-text.d.ts +3 -0
  69. package/dist/types/components/wizard-step.d.ts +6 -0
  70. package/dist/types/hotkeys-markdown.d.ts +24 -0
  71. package/dist/types/index.d.ts +5 -0
  72. package/dist/types/latex-block.d.ts +7 -0
  73. package/dist/types/native/apply.d.ts +39 -0
  74. package/dist/types/native/backend.d.ts +94 -0
  75. package/dist/types/native/blobs.d.ts +29 -0
  76. package/dist/types/native/describe.d.ts +56 -0
  77. package/dist/types/native/encode.d.ts +50 -0
  78. package/dist/types/native/icons.d.ts +18 -0
  79. package/dist/types/native/memo.d.ts +27 -0
  80. package/dist/types/native/node.d.ts +107 -0
  81. package/dist/types/native/overlay.d.ts +64 -0
  82. package/dist/types/native/picker.d.ts +124 -0
  83. package/dist/types/native/reconcile.d.ts +41 -0
  84. package/dist/types/native/settle.d.ts +11 -0
  85. package/dist/types/native/spans.d.ts +21 -0
  86. package/dist/types/native/state.d.ts +6 -0
  87. package/dist/types/native/tone.d.ts +24 -0
  88. package/dist/types/overlays/advisor-config.d.ts +20 -0
  89. package/dist/types/overlays/agent-hub-renderer.d.ts +27 -11
  90. package/dist/types/overlays/agent-hub.d.ts +10 -0
  91. package/dist/types/overlays/agent-transcript-viewer.d.ts +7 -0
  92. package/dist/types/overlays/agents-hub.d.ts +8 -0
  93. package/dist/types/overlays/annotation-overlay.d.ts +3 -0
  94. package/dist/types/overlays/ask-dialog.d.ts +23 -0
  95. package/dist/types/overlays/bordered-loader.d.ts +3 -0
  96. package/dist/types/overlays/btw-history-panel.d.ts +9 -0
  97. package/dist/types/overlays/btw-panel.d.ts +3 -0
  98. package/dist/types/overlays/cleanse-panel.d.ts +5 -2
  99. package/dist/types/overlays/composer-shape-preview.d.ts +7 -1
  100. package/dist/types/overlays/copy-selector.d.ts +38 -0
  101. package/dist/types/overlays/error-banner.d.ts +9 -0
  102. package/dist/types/overlays/extensions/extension-list.d.ts +1 -0
  103. package/dist/types/overlays/history-search.d.ts +18 -0
  104. package/dist/types/overlays/hook-editor.d.ts +28 -1
  105. package/dist/types/overlays/hook-input.d.ts +3 -0
  106. package/dist/types/overlays/hook-selector.d.ts +10 -0
  107. package/dist/types/overlays/hub-frame.d.ts +18 -0
  108. package/dist/types/overlays/jobs-panel.d.ts +24 -0
  109. package/dist/types/overlays/login-dialog.d.ts +10 -0
  110. package/dist/types/overlays/logout-account-selector.d.ts +4 -0
  111. package/dist/types/overlays/mcp-add-wizard.d.ts +4 -0
  112. package/dist/types/overlays/model-browser.d.ts +69 -0
  113. package/dist/types/overlays/model-hub.d.ts +7 -0
  114. package/dist/types/overlays/model-picker.d.ts +7 -0
  115. package/dist/types/overlays/move-overlay.d.ts +3 -0
  116. package/dist/types/overlays/oauth-selector.d.ts +4 -0
  117. package/dist/types/overlays/omfg-panel.d.ts +3 -0
  118. package/dist/types/overlays/pause-screen.d.ts +12 -0
  119. package/dist/types/overlays/plan-review-overlay.d.ts +5 -0
  120. package/dist/types/overlays/plan-save-overlay.d.ts +10 -0
  121. package/dist/types/overlays/plugin-selector.d.ts +4 -0
  122. package/dist/types/overlays/plugin-settings.d.ts +30 -0
  123. package/dist/types/overlays/queue-mode-selector.d.ts +4 -0
  124. package/dist/types/overlays/reset-usage-selector.d.ts +8 -0
  125. package/dist/types/overlays/rewind-selector.d.ts +5 -0
  126. package/dist/types/overlays/session-info-overlay.d.ts +19 -1
  127. package/dist/types/overlays/session-selector.d.ts +64 -1
  128. package/dist/types/overlays/settings-defs.d.ts +14 -0
  129. package/dist/types/overlays/settings-selector.d.ts +21 -0
  130. package/dist/types/overlays/show-images-selector.d.ts +4 -0
  131. package/dist/types/overlays/snapcompact-shape-preview.d.ts +2 -0
  132. package/dist/types/overlays/stats-notice.d.ts +8 -0
  133. package/dist/types/overlays/theme-selector.d.ts +11 -0
  134. package/dist/types/overlays/thinking-selector.d.ts +4 -0
  135. package/dist/types/overlays/tree-selector.d.ts +60 -2
  136. package/dist/types/overlays/usage-dashboard.d.ts +26 -3
  137. package/dist/types/overlays/usage-row.d.ts +36 -2
  138. package/dist/types/prompt/attachment-chips.d.ts +8 -0
  139. package/dist/types/prompt/composer-attachments.d.ts +15 -3
  140. package/dist/types/prompt/composer.d.ts +18 -1
  141. package/dist/types/prompt/custom-editor.d.ts +48 -2
  142. package/dist/types/prompt/editor-top-gap.d.ts +2 -0
  143. package/dist/types/prompt/macos-spelling.d.ts +6 -0
  144. package/dist/types/prompt/magic-keywords.d.ts +9 -0
  145. package/dist/types/prompt/queued-messages.d.ts +23 -0
  146. package/dist/types/prompt/skill-tokens.d.ts +4 -2
  147. package/dist/types/prompt/welcome.d.ts +16 -0
  148. package/dist/types/render/code-cell.d.ts +10 -0
  149. package/dist/types/render/file-list.d.ts +8 -0
  150. package/dist/types/render/hyperlink.d.ts +14 -0
  151. package/dist/types/render/output-block.d.ts +43 -0
  152. package/dist/types/render/output-pane.d.ts +17 -0
  153. package/dist/types/render/tool-card.d.ts +8 -0
  154. package/dist/types/render/tree-list.d.ts +8 -0
  155. package/dist/types/render/width-aware-text.d.ts +7 -0
  156. package/dist/types/setup/scenes/outro.d.ts +7 -0
  157. package/dist/types/setup/scenes/sign-in.d.ts +7 -0
  158. package/dist/types/setup/scenes/splash.d.ts +8 -0
  159. package/dist/types/setup/scenes/types.d.ts +6 -1
  160. package/dist/types/setup/wizard-overlay.d.ts +9 -0
  161. package/dist/types/status-line/component.d.ts +49 -5
  162. package/dist/types/status-line/context-usage.d.ts +20 -0
  163. package/dist/types/status-line/footer.d.ts +8 -0
  164. package/dist/types/status-line/metrics.d.ts +1 -2
  165. package/dist/types/status-line/segments.d.ts +10 -1
  166. package/dist/types/status-line/types.d.ts +40 -1
  167. package/dist/types/terminal-capabilities.d.ts +1 -1
  168. package/dist/types/terminal.d.ts +27 -0
  169. package/dist/types/theme/defaults/index.d.ts +100 -0
  170. package/dist/types/theme/schema.d.ts +2 -0
  171. package/dist/types/theme/shimmer.d.ts +8 -0
  172. package/dist/types/theme/theme-class.d.ts +2 -0
  173. package/dist/types/theme/theme.d.ts +33 -1
  174. package/dist/types/tools/ask.d.ts +3 -0
  175. package/dist/types/tools/ast-edit.d.ts +10 -1
  176. package/dist/types/tools/ast-grep.d.ts +10 -1
  177. package/dist/types/tools/autoresearch.d.ts +21 -4
  178. package/dist/types/tools/bash.d.ts +30 -1
  179. package/dist/types/tools/cfg-render.d.ts +5 -1
  180. package/dist/types/tools/debug.d.ts +3 -1
  181. package/dist/types/tools/default-renderer.d.ts +6 -1
  182. package/dist/types/tools/edit.d.ts +14 -1
  183. package/dist/types/tools/eval.d.ts +12 -1
  184. package/dist/types/tools/fetch.d.ts +16 -1
  185. package/dist/types/tools/find.d.ts +15 -1
  186. package/dist/types/tools/github.d.ts +3 -0
  187. package/dist/types/tools/glob.d.ts +14 -1
  188. package/dist/types/tools/goal.d.ts +3 -1
  189. package/dist/types/tools/grep.d.ts +14 -1
  190. package/dist/types/tools/grouped-file-output.d.ts +58 -0
  191. package/dist/types/tools/json-tree.d.ts +20 -0
  192. package/dist/types/tools/lsp.d.ts +3 -10
  193. package/dist/types/tools/mcp.d.ts +16 -1
  194. package/dist/types/tools/memory.d.ts +26 -0
  195. package/dist/types/tools/native-view.d.ts +90 -0
  196. package/dist/types/tools/proc-render.d.ts +7 -1
  197. package/dist/types/tools/read.d.ts +23 -1
  198. package/dist/types/tools/renderer.d.ts +57 -0
  199. package/dist/types/tools/report-tool-issue.d.ts +3 -0
  200. package/dist/types/tools/resolve.d.ts +14 -1
  201. package/dist/types/tools/task.d.ts +3 -0
  202. package/dist/types/tools/think.d.ts +3 -0
  203. package/dist/types/tools/todo.d.ts +12 -0
  204. package/dist/types/tools/vibe.d.ts +3 -1
  205. package/dist/types/tools/wait.d.ts +3 -0
  206. package/dist/types/tools/web-search.d.ts +8 -0
  207. package/dist/types/tools/write.d.ts +14 -1
  208. package/dist/types/tools/xdev.d.ts +13 -0
  209. package/dist/types/tui.d.ts +49 -0
  210. package/package.json +9 -9
  211. package/src/apps/autoresearch-dashboard.ts +362 -4
  212. package/src/apps/cleanse-board.ts +219 -1
  213. package/src/apps/cleanse-picker.ts +9 -1
  214. package/src/apps/debug/log-viewer.ts +15 -15
  215. package/src/apps/debug/protocol-probe.ts +2 -20
  216. package/src/apps/git/avatar.ts +2 -22
  217. package/src/apps/git/git-tui.ts +406 -59
  218. package/src/apps/git/help.ts +130 -0
  219. package/src/apps/git/sidebar.ts +491 -0
  220. package/src/apps/live-visualizer.ts +65 -0
  221. package/src/apps/ps-top.ts +448 -17
  222. package/src/apps/session-picker.ts +1 -0
  223. package/src/apps/setup-model-picker.ts +5 -1
  224. package/src/apps/standalone-picker.ts +55 -1
  225. package/src/autocomplete.ts +44 -1
  226. package/src/chat/advisor-message.ts +72 -3
  227. package/src/chat/assistant-message.ts +346 -11
  228. package/src/chat/background-tan-message.ts +4 -4
  229. package/src/chat/bash-execution.ts +81 -0
  230. package/src/chat/cache-invalidation-marker.ts +8 -0
  231. package/src/chat/chat-transcript-builder.ts +37 -6
  232. package/src/chat/collab-prompt-message.ts +15 -3
  233. package/src/chat/compaction-summary-message.ts +74 -1
  234. package/src/chat/custom-message.ts +3 -1
  235. package/src/chat/eval-execution.ts +57 -0
  236. package/src/chat/execution-shared.ts +153 -1
  237. package/src/chat/hook-message.ts +1 -0
  238. package/src/chat/late-diagnostics-message.ts +85 -2
  239. package/src/chat/read-tool-group.ts +341 -1
  240. package/src/chat/served-model-marker.ts +8 -0
  241. package/src/chat/skill-message.ts +63 -0
  242. package/src/chat/stripped-tool-calls-placeholder.ts +18 -10
  243. package/src/chat/todo-reminder.ts +34 -4
  244. package/src/chat/tool-execution.ts +385 -10
  245. package/src/chat/transcript-actions.ts +38 -0
  246. package/src/chat/transcript-browser.ts +2 -9
  247. package/src/chat/transcript-entry.ts +10 -1
  248. package/src/chat/transcript-render-helpers.ts +16 -15
  249. package/src/chat/ttsr-notification.ts +38 -1
  250. package/src/chat/user-message.ts +167 -4
  251. package/src/chrome/collab-qrcode.ts +27 -2
  252. package/src/chrome/context-thresholds.ts +34 -0
  253. package/src/chrome/countdown-timer.ts +24 -1
  254. package/src/chrome/diff.ts +60 -1
  255. package/src/chrome/dynamic-border.ts +7 -0
  256. package/src/chrome/format.ts +12 -0
  257. package/src/chrome/message-divider.ts +33 -1
  258. package/src/chrome/message-frame.ts +53 -10
  259. package/src/chrome/message-notice.ts +71 -0
  260. package/src/chrome/overlay-box.ts +45 -2
  261. package/src/chrome/qrcode.ts +28 -0
  262. package/src/chrome/segment-track.ts +26 -0
  263. package/src/chrome/selector-helpers.ts +1 -17
  264. package/src/chrome/status-notice.ts +46 -0
  265. package/src/chrome/streaming-panel.ts +25 -1
  266. package/src/chrome/tool-activity.ts +20 -0
  267. package/src/chrome/transcript-container.ts +37 -0
  268. package/src/chrome/transcript-status.ts +40 -11
  269. package/src/components/box.ts +51 -0
  270. package/src/components/disclosure.ts +33 -0
  271. package/src/components/editor.ts +216 -27
  272. package/src/components/form.ts +93 -9
  273. package/src/components/image.ts +30 -0
  274. package/src/components/input.ts +77 -26
  275. package/src/components/key-value-list.ts +18 -0
  276. package/src/components/layout/geometry.ts +44 -0
  277. package/src/components/layout/row.ts +30 -0
  278. package/src/components/layout/split-pane.ts +65 -0
  279. package/src/components/layout/stack.ts +27 -0
  280. package/src/components/loader.ts +183 -1
  281. package/src/components/markdown.ts +21 -0
  282. package/src/components/metric.ts +39 -0
  283. package/src/components/progress-bar.ts +28 -0
  284. package/src/components/scroll-view.ts +23 -0
  285. package/src/components/section.ts +16 -0
  286. package/src/components/select-list.ts +174 -25
  287. package/src/components/settings-list.ts +264 -7
  288. package/src/components/spacer.ts +17 -0
  289. package/src/components/tab-bar.ts +42 -0
  290. package/src/components/table.ts +34 -0
  291. package/src/components/text.ts +23 -0
  292. package/src/components/tree-view.ts +65 -0
  293. package/src/components/truncated-text.ts +14 -0
  294. package/src/components/wizard-step.ts +18 -9
  295. package/src/debug-server.ts +14 -7
  296. package/src/hotkeys-markdown.ts +251 -69
  297. package/src/index.ts +6 -0
  298. package/src/latex-block.ts +11 -0
  299. package/src/native/apply.ts +275 -0
  300. package/src/native/backend.ts +682 -0
  301. package/src/native/blobs.ts +70 -0
  302. package/src/native/describe.ts +124 -0
  303. package/src/native/encode.ts +233 -0
  304. package/src/native/icons.ts +184 -0
  305. package/src/native/memo.ts +64 -0
  306. package/src/native/node.ts +112 -0
  307. package/src/native/overlay.ts +131 -0
  308. package/src/native/picker.ts +333 -0
  309. package/src/native/reconcile.ts +1063 -0
  310. package/src/native/settle.ts +23 -0
  311. package/src/native/spans.ts +308 -0
  312. package/src/native/state.ts +28 -0
  313. package/src/native/tone.ts +79 -0
  314. package/src/overlays/advisor-config.ts +420 -0
  315. package/src/overlays/agent-hub-renderer.ts +155 -18
  316. package/src/overlays/agent-hub.ts +1037 -44
  317. package/src/overlays/agent-transcript-viewer.ts +129 -0
  318. package/src/overlays/agents-hub.ts +688 -53
  319. package/src/overlays/annotation-overlay.ts +391 -52
  320. package/src/overlays/ask-dialog.ts +435 -24
  321. package/src/overlays/bordered-loader.ts +17 -0
  322. package/src/overlays/btw-history-panel.ts +182 -0
  323. package/src/overlays/btw-panel.ts +68 -2
  324. package/src/overlays/cleanse-panel.ts +105 -15
  325. package/src/overlays/codex-reset-fireworks.ts +65 -5
  326. package/src/overlays/composer-shape-preview.ts +26 -1
  327. package/src/overlays/copy-selector.ts +545 -23
  328. package/src/overlays/error-banner.ts +44 -0
  329. package/src/overlays/extensions/extension-list.ts +23 -17
  330. package/src/overlays/history-search.ts +175 -33
  331. package/src/overlays/hook-editor.ts +113 -6
  332. package/src/overlays/hook-input.ts +22 -1
  333. package/src/overlays/hook-selector.ts +311 -22
  334. package/src/overlays/hub-frame.ts +80 -0
  335. package/src/overlays/jobs-panel.ts +112 -0
  336. package/src/overlays/login-dialog.ts +183 -1
  337. package/src/overlays/logout-account-selector.ts +102 -4
  338. package/src/overlays/mcp-add-wizard.ts +232 -53
  339. package/src/overlays/model-browser.ts +681 -22
  340. package/src/overlays/model-hub.ts +1402 -78
  341. package/src/overlays/model-picker.ts +175 -1
  342. package/src/overlays/move-overlay.ts +45 -0
  343. package/src/overlays/oauth-selector.ts +227 -23
  344. package/src/overlays/omfg-panel.ts +86 -2
  345. package/src/overlays/pause-screen.ts +55 -4
  346. package/src/overlays/plan-review-overlay.ts +352 -0
  347. package/src/overlays/plan-save-overlay.ts +45 -0
  348. package/src/overlays/plugin-selector.ts +21 -1
  349. package/src/overlays/plugin-settings.ts +195 -5
  350. package/src/overlays/queue-mode-selector.ts +19 -1
  351. package/src/overlays/reset-usage-selector.ts +110 -40
  352. package/src/overlays/rewind-selector.ts +458 -44
  353. package/src/overlays/session-account-selector.ts +1 -1
  354. package/src/overlays/session-info-overlay.ts +137 -1
  355. package/src/overlays/session-selector.ts +807 -46
  356. package/src/overlays/settings-defs.ts +41 -0
  357. package/src/overlays/settings-selector.ts +583 -23
  358. package/src/overlays/show-images-selector.ts +18 -1
  359. package/src/overlays/snapcompact-shape-preview.ts +48 -3
  360. package/src/overlays/stats-notice.ts +31 -0
  361. package/src/overlays/theme-selector.ts +31 -1
  362. package/src/overlays/thinking-selector.ts +22 -1
  363. package/src/overlays/tree-selector.ts +570 -110
  364. package/src/overlays/usage-dashboard.ts +587 -12
  365. package/src/overlays/usage-row.ts +161 -25
  366. package/src/prompt/attachment-chips.ts +60 -0
  367. package/src/prompt/composer-attachments.ts +31 -9
  368. package/src/prompt/composer.ts +55 -2
  369. package/src/prompt/custom-editor.ts +302 -4
  370. package/src/prompt/editor-top-gap.ts +8 -0
  371. package/src/prompt/macos-spelling.ts +24 -9
  372. package/src/prompt/magic-keywords.ts +22 -1
  373. package/src/prompt/model-mention-autocomplete.ts +1 -0
  374. package/src/prompt/queued-messages.ts +101 -0
  375. package/src/prompt/skill-tokens.ts +5 -3
  376. package/src/prompt/welcome.ts +213 -6
  377. package/src/render/code-cell.ts +103 -2
  378. package/src/render/file-list.ts +29 -0
  379. package/src/render/hyperlink.ts +32 -0
  380. package/src/render/output-block.ts +110 -0
  381. package/src/render/output-pane.ts +37 -0
  382. package/src/render/tool-card.ts +137 -0
  383. package/src/render/tree-list.ts +39 -0
  384. package/src/render/width-aware-text.ts +20 -0
  385. package/src/setup/scenes/composer.ts +29 -0
  386. package/src/setup/scenes/glyph.ts +15 -0
  387. package/src/setup/scenes/model.ts +36 -8
  388. package/src/setup/scenes/outro.ts +28 -1
  389. package/src/setup/scenes/sign-in.ts +122 -13
  390. package/src/setup/scenes/splash.ts +28 -1
  391. package/src/setup/scenes/theme.ts +88 -3
  392. package/src/setup/scenes/types.ts +7 -1
  393. package/src/setup/startup-splash.ts +46 -9
  394. package/src/setup/wizard-overlay.ts +140 -23
  395. package/src/status-line/component.ts +398 -16
  396. package/src/status-line/context-usage.ts +279 -50
  397. package/src/status-line/footer.ts +94 -1
  398. package/src/status-line/metrics.ts +3 -6
  399. package/src/status-line/segments.ts +463 -97
  400. package/src/status-line/separators.ts +3 -16
  401. package/src/status-line/types.ts +43 -1
  402. package/src/terminal-capabilities.ts +7 -0
  403. package/src/terminal.ts +130 -2
  404. package/src/theme/defaults/dark-neon-noir.json +100 -0
  405. package/src/theme/defaults/index.ts +2 -0
  406. package/src/theme/defaults/light-prism.json +5 -5
  407. package/src/theme/defaults/onyx.json +62 -62
  408. package/src/theme/schema.ts +15 -0
  409. package/src/theme/shimmer.ts +33 -0
  410. package/src/theme/theme-class.ts +24 -19
  411. package/src/theme/theme.ts +111 -9
  412. package/src/tools/ask.ts +157 -1
  413. package/src/tools/ast-edit.ts +174 -1
  414. package/src/tools/ast-grep.ts +82 -2
  415. package/src/tools/autoresearch.ts +149 -1
  416. package/src/tools/bash.ts +180 -49
  417. package/src/tools/cfg-render.ts +66 -1
  418. package/src/tools/debug.ts +78 -1
  419. package/src/tools/default-renderer.ts +35 -1
  420. package/src/tools/edit.ts +247 -2
  421. package/src/tools/eval.ts +257 -1
  422. package/src/tools/fetch.ts +102 -3
  423. package/src/tools/find.ts +127 -1
  424. package/src/tools/github.ts +119 -10
  425. package/src/tools/glob.ts +116 -1
  426. package/src/tools/goal.ts +56 -1
  427. package/src/tools/grep.ts +83 -2
  428. package/src/tools/grouped-file-output.ts +205 -0
  429. package/src/tools/json-tree.ts +116 -1
  430. package/src/tools/lsp.ts +318 -1
  431. package/src/tools/mcp.ts +80 -1
  432. package/src/tools/memory.ts +93 -11
  433. package/src/tools/native-view.ts +292 -0
  434. package/src/tools/proc-render.ts +221 -1
  435. package/src/tools/read.ts +199 -4
  436. package/src/tools/renderer.ts +61 -0
  437. package/src/tools/report-tool-issue.ts +7 -1
  438. package/src/tools/resolve.ts +63 -1
  439. package/src/tools/task.ts +406 -4
  440. package/src/tools/think.ts +19 -1
  441. package/src/tools/todo.ts +89 -0
  442. package/src/tools/vibe.ts +230 -2
  443. package/src/tools/wait.ts +181 -1
  444. package/src/tools/web-search.ts +113 -1
  445. package/src/tools/write.ts +144 -5
  446. package/src/tools/xdev.ts +64 -1
  447. package/src/tui.ts +294 -3
@@ -10,6 +10,9 @@
10
10
  */
11
11
  import { formatKeyHint } from "../app-keybindings";
12
12
  import { matchesKey } from "../keys";
13
+ import { compactText, styledSpans, styleSpans } from "../native/spans";
14
+ import { node, row } from "../native/describe";
15
+ import type { DescribeContext, NativeNode, NativeUiEvent } from "../native/node";
13
16
  import type { Component } from "../tui";
14
17
  import { truncateToWidth, visibleWidth } from "../utils";
15
18
 
@@ -60,6 +63,7 @@ export class TabBar implements Component {
60
63
  #theme: TabBarTheme;
61
64
  #label: string;
62
65
  #hoverTabId: string | null = null;
66
+ #native?: { signature: string; node: NativeNode };
63
67
  /** Per-render tab hit zones: 0-based line + [start, end) columns. */
64
68
  #hitZones: { line: number; start: number; end: number; index: number }[] = [];
65
69
 
@@ -161,6 +165,44 @@ export class TabBar implements Component {
161
165
  // No cached state to invalidate
162
166
  }
163
167
 
168
+ /**
169
+ * A native `tabs` strip (muted tabs keep the muted token), preceded by the
170
+ * bar label and followed by the cycle hint when present. Shrinking to
171
+ * `short` labels and wrapping are the terminal's.
172
+ */
173
+ describe(_cx: DescribeContext): NativeNode {
174
+ // Tabs are a caller-owned mutable array (render keeps no cache either), so key on content.
175
+ let signature = `${this.#activeIndex}\0${this.#label}\0${this.showHint}`;
176
+ for (const tab of this.#tabs) signature += `\0${tab.id}\x01${tab.label}\x01${tab.muted === true}`;
177
+ if (this.#native?.signature === signature) return this.#native.node;
178
+ const tabs = node("tabs", {
179
+ items: this.#tabs.map(tab => {
180
+ const label = styledSpans(tab.label);
181
+ return {
182
+ id: tab.id,
183
+ label: tab.muted
184
+ ? label.map(part => ({ ...part, s: part.s ? `${part.s} muted` : "muted" }))
185
+ : compactText(label),
186
+ };
187
+ }),
188
+ active: this.#tabs[this.#activeIndex]?.id,
189
+ });
190
+ const parts: NativeNode[] = [];
191
+ if (this.#label) parts.push(node("text", { spans: styleSpans(`${this.#label}:`, this.#theme.label) }));
192
+ parts.push(tabs);
193
+ if (this.showHint) {
194
+ parts.push(node("text", { spans: styleSpans(`(${formatKeyHint("tab")} to cycle)`, this.#theme.hint) }));
195
+ }
196
+ const described = parts.length === 1 ? tabs : row(parts, { gap: "md", align: "center" });
197
+ this.#native = { signature, node: described };
198
+ return described;
199
+ }
200
+
201
+ /** A click on a tab activates it (muted tabs stay inert). */
202
+ handleNativeEvent(event: NativeUiEvent): void {
203
+ if (event.type === "select" || event.type === "activate") this.selectTab(event.item);
204
+ }
205
+
164
206
  /**
165
207
  * Handle keyboard input for tab navigation.
166
208
  * @returns true if the input was handled, false otherwise
@@ -1,3 +1,7 @@
1
+ import type { TspTableColumn, TspText } from "@oh-my-pi/pi-wire";
2
+ import { compactText, styleSpans } from "../native/spans";
3
+ import { node } from "../native/describe";
4
+ import type { DescribeContext, NativeNode } from "../native/node";
1
5
  import type { Component } from "../tui";
2
6
  import { Ellipsis, getWidthConfigEpoch, replaceTabs, truncateToWidth, visibleWidth } from "../utils";
3
7
 
@@ -92,6 +96,7 @@ export class Table implements Component {
92
96
  readonly #columns: readonly TableColumn[];
93
97
  readonly #options: TableOptions;
94
98
  #cache: { width: number; epoch: number; lines: readonly string[] } | undefined;
99
+ #native: NativeNode | undefined;
95
100
 
96
101
  constructor(rows: readonly (readonly TableCell[])[], columns: readonly TableColumn[], options: TableOptions = {}) {
97
102
  this.#rows = rows;
@@ -103,11 +108,40 @@ export class Table implements Component {
103
108
  if (this.#rows === rows) return false;
104
109
  this.#rows = rows;
105
110
  this.#cache = undefined;
111
+ this.#native = undefined;
106
112
  return true;
107
113
  }
108
114
 
109
115
  invalidate(): void {
110
116
  this.#cache = undefined;
117
+ this.#native = undefined;
118
+ }
119
+
120
+ /**
121
+ * A native `table`. Column priorities carry over unchanged (lower gives
122
+ * way first); truncating columns truncate at the end, the rest keep
123
+ * their content. Widths are the terminal's.
124
+ */
125
+ describe(_cx: DescribeContext): NativeNode {
126
+ if (this.#native) return this.#native;
127
+ const columns = this.#columns;
128
+ const cols: TspTableColumn[] = columns.map((column, index) => ({
129
+ id: `c${index}`,
130
+ align: column.align === "right" ? "end" : "start",
131
+ truncate: column.overflow === "truncate" ? "end" : undefined,
132
+ priority: column.priority ?? 0,
133
+ }));
134
+ const rows = this.#rows.map((row, rowIndex) => {
135
+ const cells: Record<string, TspText> = {};
136
+ const count = Math.min(row.length, columns.length);
137
+ for (let index = 0; index < count; index++) {
138
+ const cell = row[index]!;
139
+ cells[`c${index}`] = compactText(styleSpans(singleLine(cell.text), cell.style ?? columns[index]!.style));
140
+ }
141
+ return { id: `r${rowIndex}`, cells };
142
+ });
143
+ this.#native = node("table", { cols, rows });
144
+ return this.#native;
111
145
  }
112
146
 
113
147
  render(width: number): readonly string[] {
@@ -1,3 +1,7 @@
1
+ import { styledSpans } from "../native/spans";
2
+ import { backgroundChrome, sampleBackground } from "../native/tone";
3
+ import { node, text } from "../native/describe";
4
+ import type { DescribeContext, NativeNode } from "../native/node";
1
5
  import type { Component } from "../tui";
2
6
  import {
3
7
  applyBackgroundToLine,
@@ -39,6 +43,7 @@ export class Text implements Component {
39
43
  #cachedWidth?: number;
40
44
  #cachedWidthConfigEpoch?: number;
41
45
  #cachedLines?: string[];
46
+ #native?: { source: string; bg: string | undefined; node: NativeNode };
42
47
 
43
48
  constructor(text: string = "", paddingX: number = 1, paddingY: number = 1, customBgFn?: (text: string) => string) {
44
49
  this.#text = text;
@@ -104,6 +109,24 @@ export class Text implements Component {
104
109
  this.#cachedLines = undefined;
105
110
  }
106
111
 
112
+ /**
113
+ * Wrapped text; styling re-derived from the styled source so a theme swap
114
+ * re-resolves tokens. A background fill becomes the node's tone.
115
+ */
116
+ describe(_cx: DescribeContext): NativeNode {
117
+ const source = this.#styleFn ? this.#styleFn(this.#text) : this.#text;
118
+ const bg = sampleBackground(this.#customBgFn);
119
+ const cached = this.#native;
120
+ if (cached?.source === source && cached.bg === bg) return cached.node;
121
+ const spans = source.trim() === "" ? [] : styledSpans(source);
122
+ const described =
123
+ spans.length === 0
124
+ ? node("col", { hidden: true })
125
+ : text(spans, { wrap: "word", tone: backgroundChrome(bg).tone });
126
+ this.#native = { source, bg, node: described };
127
+ return described;
128
+ }
129
+
107
130
  render(width: number): readonly string[] {
108
131
  // Check cache
109
132
  if (
@@ -1,3 +1,7 @@
1
+ import type { TspSpan, TspTreeNode } from "@oh-my-pi/pi-wire";
2
+ import { styledSpans } from "../native/spans";
3
+ import { node } from "../native/describe";
4
+ import type { DescribeContext, NativeNode } from "../native/node";
1
5
  import type { Theme } from "../theme/theme";
2
6
  import type { Component } from "../tui";
3
7
  import { replaceTabs, truncateToWidth, visibleWidth } from "../utils";
@@ -191,6 +195,11 @@ export interface TreeViewOptions<T, K extends TreeKey> extends FlattenTreeOption
191
195
  scrollbarTheme?: ScrollViewTheme;
192
196
  }
193
197
 
198
+ /** A tree node under construction; frozen into the wire shape once described. */
199
+ type MutableTreeNode = {
200
+ -readonly [P in keyof TspTreeNode]: P extends "children" ? MutableTreeNode[] : TspTreeNode[P];
201
+ };
202
+
194
203
  /** Result of a tree render, including whether a row or line budget omitted content. */
195
204
  export interface TreeViewRenderResult {
196
205
  lines: readonly string[];
@@ -219,6 +228,7 @@ export class TreeView<T, K extends TreeKey = string> implements Component {
219
228
  #version = 0;
220
229
  #cache?: { width: number; version: number; result: TreeViewRenderResult };
221
230
  #childByKey = new Map<K, Component>();
231
+ #native?: { version: number; node: NativeNode | null };
222
232
 
223
233
  constructor(options: TreeViewOptions<T, K>) {
224
234
  this.#options = options;
@@ -327,6 +337,61 @@ export class TreeView<T, K extends TreeKey = string> implements Component {
327
337
  return this.renderWithState(width).lines;
328
338
  }
329
339
 
340
+ /**
341
+ * A native disclosure `tree` over the filtered rows, nested by hierarchy
342
+ * (a filtered-out ancestor lifts its visible descendants to the nearest
343
+ * visible one). Gutters, windowing and the scrollbar are the terminal's;
344
+ * the selected row is marked with the `mark` token. Rows whose body is a
345
+ * component can't be tree labels, so such a tree stays on `rows`.
346
+ */
347
+ describe(_cx: DescribeContext): NativeNode | null {
348
+ this.#ensureRows();
349
+ if (this.#native?.version === this.#version) return this.#native.node;
350
+ const rows = this.#rows;
351
+ const byKey = new Map<K, MutableTreeNode>();
352
+ const roots: MutableTreeNode[] = [];
353
+ let described: NativeNode | null = null;
354
+ let componentRow = false;
355
+ for (let rowIndex = 0; rowIndex < rows.length; rowIndex++) {
356
+ const row = rows[rowIndex]!;
357
+ const selected = row.key === this.#selectedKey;
358
+ const rendered = this.#options.renderRow(row.item, {
359
+ row,
360
+ selected,
361
+ rowIndex,
362
+ windowStart: 0,
363
+ windowEnd: rows.length,
364
+ windowRows: rows,
365
+ width: Number.POSITIVE_INFINITY,
366
+ contentWidth: Number.POSITIVE_INFINITY,
367
+ prefix: { first: "", continuation: "" },
368
+ });
369
+ if (typeof rendered !== "string" && "render" in rendered) {
370
+ this.#replaceChild(row.key, rendered);
371
+ componentRow = true;
372
+ continue;
373
+ }
374
+ this.#replaceChild(row.key, undefined);
375
+ let label: TspSpan[] = styledSpans(typeof rendered === "string" ? rendered : rendered.join("\n"));
376
+ if (selected) label = label.map(part => ({ ...part, s: part.s ? `${part.s} mark` : "mark" }));
377
+ const treeNode: MutableTreeNode = { id: String(row.key), label };
378
+ byKey.set(row.key, treeNode);
379
+ let parentKey = row.parentKey;
380
+ while (parentKey !== undefined && !byKey.has(parentKey)) parentKey = this.#rowByKey.get(parentKey)?.parentKey;
381
+ const parent = parentKey === undefined ? undefined : byKey.get(parentKey);
382
+ if (parent) {
383
+ parent.children ??= [];
384
+ parent.open = true;
385
+ parent.children.push(treeNode);
386
+ } else {
387
+ roots.push(treeNode);
388
+ }
389
+ }
390
+ if (!componentRow) described = node("tree", { nodes: roots });
391
+ this.#native = { version: this.#version, node: described };
392
+ return described;
393
+ }
394
+
330
395
  /** Render lines plus budget/window metadata for adapters that append an ellipsis. */
331
396
  renderWithState(width: number): TreeViewRenderResult {
332
397
  this.#ensureRows();
@@ -1,3 +1,6 @@
1
+ import { styledSpans } from "../native/spans";
2
+ import { text } from "../native/describe";
3
+ import type { DescribeContext, NativeNode } from "../native/node";
1
4
  import type { Component } from "../tui";
2
5
  import { padding, truncateToWidth, visibleWidth } from "../utils";
3
6
 
@@ -10,6 +13,7 @@ export class TruncatedText implements Component {
10
13
  #paddingY: number;
11
14
  #cachedWidth = -1;
12
15
  #cachedLines: string[] | undefined;
16
+ #native: NativeNode | undefined;
13
17
 
14
18
  constructor(text: string, paddingX: number = 0, paddingY: number = 0) {
15
19
  this.#text = text;
@@ -32,10 +36,20 @@ export class TruncatedText implements Component {
32
36
  }
33
37
 
34
38
  invalidate(): void {
39
+ this.#native = undefined;
35
40
  this.#cachedWidth = -1;
36
41
  this.#cachedLines = undefined;
37
42
  }
38
43
 
44
+ /** First line only, clamped to one visual line with an end ellipsis. */
45
+ describe(_cx: DescribeContext): NativeNode {
46
+ if (this.#native) return this.#native;
47
+ const newlineIndex = this.#text.indexOf("\n");
48
+ const firstLine = newlineIndex === -1 ? this.#text : this.#text.slice(0, newlineIndex);
49
+ this.#native = text(styledSpans(firstLine), { wrap: "none", truncate: "end", lines: 1 });
50
+ return this.#native;
51
+ }
52
+
39
53
  render(width: number): readonly string[] {
40
54
  if (this.#cachedLines && this.#cachedWidth === width) {
41
55
  return this.#cachedLines;
@@ -1,5 +1,9 @@
1
1
  import type { MouseRoutable, SgrMouseEvent } from "../mouse";
2
+ import { col } from "../native/describe";
3
+ import { sameItems } from "../native/memo";
4
+ import type { DescribeContext, NativeNode } from "../native/node";
2
5
  import type { Component } from "../tui";
6
+ import { spaceForRows } from "./spacer";
3
7
 
4
8
  /** Semantic role of a wizard step's primary interactive content. */
5
9
  export type WizardStepKind = "input" | "choice" | "confirm" | "async" | "custom";
@@ -37,14 +41,6 @@ function isMouseRoutable(component: Component): component is Component & MouseRo
37
41
  return "routeMouse" in component && typeof component.routeMouse === "function";
38
42
  }
39
43
 
40
- function sameLines(left: readonly string[], right: readonly string[]): boolean {
41
- if (left.length !== right.length) return false;
42
- for (let i = 0; i < left.length; i++) {
43
- if (left[i] !== right[i]) return false;
44
- }
45
- return true;
46
- }
47
-
48
44
  /**
49
45
  * Reusable presentation for input, choice, confirmation, and asynchronous
50
46
  * wizard steps. Controllers retain state transitions; this component owns the
@@ -68,6 +64,7 @@ export class WizardStep implements Component, MouseRoutable {
68
64
  #contentRowStart = -1;
69
65
  #contentRowCount = 0;
70
66
  #cachedLines: readonly string[] | undefined;
67
+ #native: { slots: readonly Component[]; node: NativeNode } | undefined;
71
68
 
72
69
  constructor(options: WizardStepOptions) {
73
70
  this.#kind = options.kind;
@@ -163,6 +160,18 @@ export class WizardStep implements Component, MouseRoutable {
163
160
  content.routeMouse(event, line - this.#contentRowStart, col);
164
161
  }
165
162
 
163
+ /**
164
+ * The slots in order as a spaced `col`; the height budget and optional
165
+ * preview collapse are the terminal's (it scrolls instead of clipping).
166
+ */
167
+ describe(_cx: DescribeContext): NativeNode {
168
+ const slots = this.debugChildren;
169
+ if (sameItems(this.#native?.slots, slots)) return this.#native!.node;
170
+ const described = col(slots, { gap: spaceForRows(this.#gap) });
171
+ this.#native = { slots, node: described };
172
+ return described;
173
+ }
174
+
166
175
  render(width: number): readonly string[] {
167
176
  const safeWidth = Math.max(1, width);
168
177
  const gap = this.#gap;
@@ -217,7 +226,7 @@ export class WizardStep implements Component, MouseRoutable {
217
226
  lines.push(...slot.lines);
218
227
  }
219
228
  const bounded = maxHeight === undefined || lines.length <= maxHeight ? lines : lines.slice(0, maxHeight);
220
- if (this.#cachedLines && sameLines(this.#cachedLines, bounded)) return this.#cachedLines;
229
+ if (this.#cachedLines && sameItems(this.#cachedLines, bounded)) return this.#cachedLines;
221
230
  this.#cachedLines = bounded;
222
231
  return bounded;
223
232
  }
@@ -1,7 +1,7 @@
1
1
  import { existsSync, unlinkSync } from "node:fs";
2
2
  import { createServer, type Server, type Socket } from "node:net";
3
3
  import { type Component, isFocusable, type OverlayOptions, type TUI } from "./tui";
4
- import { replaceTabs } from "./utils";
4
+ import { plainText } from "./native/spans";
5
5
 
6
6
  export interface TuiDebugTreeNode {
7
7
  kind: string;
@@ -63,10 +63,6 @@ const SPECIAL_KEYS: Readonly<Record<string, string>> = {
63
63
  f12: "\x1b[24~",
64
64
  };
65
65
 
66
- function plainLine(line: string): string {
67
- return replaceTabs(Bun.stripANSI(line)).replace(/[\x00-\x1f\x7f-\x9f]/g, "");
68
- }
69
-
70
66
  function errorMessage(error: unknown): string {
71
67
  try {
72
68
  return error instanceof Error ? error.message : String(error);
@@ -326,14 +322,25 @@ export class TuiDebugServer {
326
322
  if (paint === undefined) return { ok: false, error: "no frame painted yet" };
327
323
  return {
328
324
  ok: true,
329
- lines: paint.lines.map(plainLine),
325
+ lines: paint.lines.map(plainText),
330
326
  window_top: paint.windowTop,
331
327
  alt_screen: paint.altScreen,
332
328
  ...(paint.cursor === undefined ? {} : { cursor: paint.cursor }),
333
329
  };
334
330
  }
335
331
  case "frame":
336
- return { ok: true, lines: this.#tui.getDebugDocument().map(plainLine) };
332
+ return { ok: true, lines: this.#tui.getDebugDocument().map(plainText) };
333
+ case "doc": {
334
+ // The document a Tern Surface Protocol terminal should hold: every sent
335
+ // frame applied by the reference applier.
336
+ const doc = this.#tui.getNativeDocument();
337
+ if (doc === undefined) return { ok: false, error: "no native surface" };
338
+ return { ok: true, doc, rows: this.#tui.nativeFallbackCount };
339
+ }
340
+ case "tsp": {
341
+ const count = typeof request.n === "number" && request.n > 0 ? Math.trunc(request.n) : undefined;
342
+ return { ok: true, native: this.#tui.nativeRendering, frames: this.#tui.getNativeFrames(count) };
343
+ }
337
344
  case "tree":
338
345
  return { ok: true, tree: this.#tree() };
339
346
  case "values":