@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
@@ -0,0 +1,124 @@
1
+ /**
2
+ * Builders for the data-first `picker` kind (Stencil repo,
3
+ * `crates/tern/NATIVE_REDESIGN.md` §4): the model hub, session selector,
4
+ * rewind, tree, copy, history search and the small selectors send their data
5
+ * and Tern draws the sheet (head, scopes, tabs, fact columns, rows, preview,
6
+ * action bar).
7
+ *
8
+ * A picker is its own sheet: the component returns `nativeSheet(cx)` true
9
+ * (usually `cx.supports("picker")`) so the backend puts it directly in
10
+ * `layer`, and `describe()` returns {@link picker}. When the terminal lacks
11
+ * the kind, components keep describing their generic composition.
12
+ *
13
+ * Keys stay the program's: a search field is an {@link Input} (every editor
14
+ * text binding works), sent through {@link pickerQuery} with its caret.
15
+ * Pointer events arrive as `select`/`activate` with
16
+ * the item id and `action` with an action id (plus `value` for
17
+ * `scope`/`tab`/`strip`). {@link pickerEvent} folds them into one shape.
18
+ */
19
+ import type { TspPickerAction, TspPickerItem, TspPickerProps } from "@oh-my-pi/pi-wire";
20
+ import type { KeyName } from "../key-hint-format.js";
21
+ import { type Keybinding } from "../keybindings.js";
22
+ import type { Input } from "../components/input.js";
23
+ import type { SelectItem, SelectList } from "../components/select-list.js";
24
+ import type { NativeChild, NativeNode, NativeUiEvent } from "./node.js";
25
+ /** The picker sheet; `preview` children fill its preview pane. */
26
+ export declare function picker(p: TspPickerProps, preview?: readonly NativeChild[]): NativeNode;
27
+ /**
28
+ * A picker's search field from the {@link Input} that edits it: the text and
29
+ * its caret. `null` hides the field. Memoized pickers MUST key on the caret
30
+ * too, or motion keys (word jumps, line start) never reach the screen.
31
+ */
32
+ export declare function pickerQuery(input: Input | null): Pick<TspPickerProps, "query" | "cursor">;
33
+ /** Key of the picker child a dock/editor-mounted selector describes; its events arrive at this keypath. */
34
+ export declare const PICKER_KEY = "picker";
35
+ /**
36
+ * The root a selector mounted in the editor slot describes: a column holding
37
+ * the picker as child {@link PICKER_KEY}, which the reconciler hoists into
38
+ * `layer`. Route its events with `pickerEvent(event, PICKER_KEY)`.
39
+ */
40
+ export declare function dockedPicker(p: TspPickerProps, preview?: readonly NativeChild[]): NativeNode;
41
+ /** Keycap names for one key id (`"alt+enter"` → `["alt", "enter"]`, `"escape"` → `["esc"]`). */
42
+ export declare function pickerKeys(key: KeyName | string): string[];
43
+ /** The keycaps of a keybinding's primary key, empty when unbound. */
44
+ export declare function bindingKeys(binding: Keybinding): string[];
45
+ /** An action-bar button; `keys` is a key id (`"alt+enter"`), a keybinding's keycaps, or none. */
46
+ export declare function pickerAction(id: string, label: string, keys?: KeyName | string | readonly string[], opts?: Omit<TspPickerAction, "id" | "label" | "keys">): TspPickerAction;
47
+ /** The right-aligned `Close esc` every picker ends with; Tern's backdrop and head `esc` send it too. */
48
+ export declare const CLOSE_ACTION: TspPickerAction;
49
+ /** A `time` fact: the compact age of `at` (`now`, `5m`, `2h`, `3d`, `2w`, `6mo`, `1y`). */
50
+ export declare function pickerAge(at: Date | number, now?: number): string;
51
+ /**
52
+ * Search `hits` for a label: disjoint, ordered UTF-16 ranges of every
53
+ * case-insensitive occurrence of any of the (lowercase) `tokens`.
54
+ */
55
+ export declare function pickerHits(label: string, tokens: readonly string[]): [number, number][];
56
+ /** The absolute local time behind a `time` fact, for its tooltip (`28 Sep 2026, 18:02`). */
57
+ export declare function pickerDate(at: Date | number): string;
58
+ /** A picker pointer event, folded: which item, or which action with its value. */
59
+ export type PickerEvent = {
60
+ readonly kind: "select" | "activate";
61
+ readonly item: string;
62
+ } | {
63
+ readonly kind: "action";
64
+ readonly act: string;
65
+ readonly value: string | undefined;
66
+ };
67
+ /**
68
+ * The picker event `event` carries, or undefined when it is not for the
69
+ * picker at keypath `key`: `""` for a root picker, else the picker child's
70
+ * key (a hoisted child's keypath carries a `^` marker, ignored here).
71
+ */
72
+ export declare function pickerEvent(event: NativeUiEvent, key?: string): PickerEvent | undefined;
73
+ /**
74
+ * {@link pickerHits} for fuzzy-filtered lists: each whitespace token of
75
+ * `query` marks its first case-insensitive substring, else its characters as
76
+ * a greedy in-order subsequence (the fuzzy matcher's shape). Undefined when
77
+ * nothing matches.
78
+ */
79
+ export declare function pickerFuzzyHits(label: string, query: string): [number, number][] | undefined;
80
+ /** The `md` sheet a short {@link SelectList} selector becomes (thinking level, hook options, queue mode, …). */
81
+ export interface SelectPickerOptions {
82
+ readonly title: string;
83
+ readonly subtitle?: string;
84
+ readonly icon?: string;
85
+ readonly noun?: string;
86
+ /** Show omp's filter text as the search field (lists that filter as you type). */
87
+ readonly searchable?: boolean;
88
+ /** Per-item extras (a thinking-level dot, a swatch mark, a budget fact). */
89
+ readonly decorate?: (item: SelectItem) => Partial<Omit<TspPickerItem, "id">> | undefined;
90
+ readonly columns?: TspPickerProps["columns"];
91
+ /** Values in use now (the current theme, the current level). */
92
+ readonly current?: readonly string[];
93
+ /** The primary action's label (`Apply`, `Select`). */
94
+ readonly confirm?: string;
95
+ }
96
+ /**
97
+ * Picker props for a {@link SelectList}: its filtered items in order, the
98
+ * selection, the pending-confirmation strip, and `Select ⏎` / `Close esc`.
99
+ * Memoize on {@link SelectList.pickerView}'s parts: the builder allocates.
100
+ */
101
+ export declare function selectListPicker(list: SelectList, o: SelectPickerOptions): TspPickerProps;
102
+ /**
103
+ * Routes a picker event to a {@link SelectList}: a row click selects (and
104
+ * previews, through `onSelectionChange`), a second click or `confirm`
105
+ * activates, `close`/`cancel` cancels. Returns whether it handled the event.
106
+ */
107
+ export declare function routeSelectListPicker(list: SelectList, event: NativeUiEvent, key?: string): boolean;
108
+ /**
109
+ * A {@link SelectList} described as a picker, memoized: the node is rebuilt
110
+ * only when the list's filtered items, selection, pending confirmation or
111
+ * query change (or {@link invalidate} is called after `options` inputs move).
112
+ */
113
+ export declare class SelectListSheet {
114
+ #private;
115
+ readonly list: SelectList;
116
+ constructor(list: SelectList, options: SelectPickerOptions | (() => SelectPickerOptions), { docked }?: {
117
+ docked?: boolean;
118
+ });
119
+ /** Drop the memo (decorations or options changed outside the list). */
120
+ invalidate(): void;
121
+ describe(): NativeNode;
122
+ /** Route a picker event onto the list; see {@link routeSelectListPicker}. */
123
+ handle(event: NativeUiEvent): boolean;
124
+ }
@@ -0,0 +1,41 @@
1
+ import { type TspOp } from "@oh-my-pi/pi-wire";
2
+ import { type Component } from "../tui.js";
3
+ import type { DescribeContext, NativeChild } from "./node.js";
4
+ /** The regions a frame fills. */
5
+ export interface NativeRegions {
6
+ readonly main: readonly NativeChild[];
7
+ readonly dock: readonly NativeChild[];
8
+ readonly layer: readonly NativeChild[];
9
+ }
10
+ /** Where a wire id came from, for event routing. */
11
+ export interface NativeTarget {
12
+ readonly component: Component;
13
+ /** Keypath inside the component ("" for its root node). */
14
+ readonly keypath: string;
15
+ }
16
+ /** Stable base-36 wire id of a component instance (its root node's id). */
17
+ export declare function nativeComponentId(component: Component): string;
18
+ /** One surface's reconciler. */
19
+ export declare class Reconciler {
20
+ #private;
21
+ readonly surface: string;
22
+ constructor(surface: string);
23
+ /** `rows` fallback nodes in the last reconciled frame. */
24
+ get fallbackCount(): number;
25
+ /** Diff the regions against the previous frame; the first call adds everything. */
26
+ reconcile(regions: NativeRegions, cx: DescribeContext): TspOp[];
27
+ /**
28
+ * The surface was closed (`keep:true`) and is being adopted: the terminal
29
+ * dropped `dock`, `layer` and focus but kept `main`. The next frame re-adds
30
+ * the live regions from scratch and keeps diffing `main`.
31
+ */
32
+ detachLive(): void;
33
+ /** The component and keypath that described wire node `id`. */
34
+ target(id: string): NativeTarget | null;
35
+ /** The key a list item node was described with (its key, else its child index). */
36
+ itemKey(id: string): string;
37
+ /** Wire id of the first `editor`/`input` `component` describes (for `focus`), or null. */
38
+ focusTarget(component: Component): string | null;
39
+ /** Stop referencing ids the terminal dropped (`gone`). */
40
+ forget(ids: readonly string[]): void;
41
+ }
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Settling: the frame provider marks finalized transcript blocks so the
3
+ * native reconciler stops keeping their description (spec §12 "Settling and
4
+ * program memory"). A settled block stays editable: a later change is sent as
5
+ * targeted ops by id, followed by a fresh `settle` hint.
6
+ */
7
+ import type { Component } from "../tui.js";
8
+ /** Mark `component` (and everything it describes) as finalized. Idempotent; a no-op outside a TSP terminal. */
9
+ export declare function settleNative(component: Component): void;
10
+ /** Whether {@link settleNative} was called for `component`. */
11
+ export declare function isNativeSettled(component: Component): boolean;
@@ -0,0 +1,21 @@
1
+ import type { TspSpan, TspText } from "@oh-my-pi/pi-wire";
2
+ import { type ThemeBg } from "../theme/theme.js";
3
+ import type { NativeNode } from "./node.js";
4
+ /**
5
+ * Convert ANSI-styled text into escape-free spans. SGR colours map back to
6
+ * the omp theme tokens that produced them; OSC 8 becomes `href`; every other
7
+ * escape (cursor moves, APC markers) is dropped.
8
+ */
9
+ export declare function styledSpans(styled: string): TspSpan[];
10
+ /** The visible characters of ANSI-styled text: every escape dropped, sanitized like {@link styledSpans}. */
11
+ export declare function plainText(styled: string): string;
12
+ /** {@link plainText} as a single-line label: line breaks and whitespace runs collapse to one space. */
13
+ export declare function plainLine(styled: string): string;
14
+ /** Spans for plain text passed through an optional ANSI styler. */
15
+ export declare function styleSpans(content: string, style?: (text: string) => string): TspSpan[];
16
+ /** Collapse unstyled single-span text to a plain string (smaller frames). */
17
+ export declare function compactText(spans: readonly TspSpan[]): TspText;
18
+ /** Pre-rendered ANSI rows as one unwrapped text block (rows already carry their line breaks). */
19
+ export declare function rowsText(lines: readonly string[]): NativeNode;
20
+ /** Theme background token of the first SGR background in ANSI-styled text. */
21
+ export declare function styledBackground(styled: string): ThemeBg | undefined;
@@ -0,0 +1,6 @@
1
+ /** Whether a TSP surface is live in this process. */
2
+ export declare function isNativeRendering(): boolean;
3
+ /** Called by the native backend on surface open and close. */
4
+ export declare function setNativeRendering(on: boolean): void;
5
+ /** Call `listener` whenever native rendering starts or stops; returns the unsubscribe. */
6
+ export declare function onNativeRenderingChange(listener: (on: boolean) => void): () => void;
@@ -0,0 +1,24 @@
1
+ /**
2
+ * omp theme colours → TSP tones. Components that only hold ANSI stylers
3
+ * (`(text) => string`) sample them with a probe string to recover the theme
4
+ * token behind the escape, then map the token to a card/text tone.
5
+ */
6
+ import type { TspTone } from "@oh-my-pi/pi-wire";
7
+ import { type ThemeBg, type ThemeColor } from "../theme/theme.js";
8
+ /** Theme background token of an ANSI background styler, sampled with a probe string. */
9
+ export declare function sampleBackground(bgFn: ((text: string) => string) | undefined): ThemeBg | undefined;
10
+ /** Theme foreground token of an ANSI colour styler, sampled with a probe string. */
11
+ export declare function sampleForeground(color: ((text: string) => string) | undefined): ThemeColor | undefined;
12
+ /** Card chrome derived from a background fill. */
13
+ export interface BackgroundChrome {
14
+ tone?: TspTone;
15
+ role?: string;
16
+ selected?: boolean;
17
+ }
18
+ /** Map an omp background token to card tone/role. */
19
+ export declare function backgroundChrome(bg: ThemeBg | undefined): BackgroundChrome;
20
+ /**
21
+ * Tone of an omp colour used as a severity or border colour; undefined for
22
+ * colours that carry no tone (callers pick their own fallback).
23
+ */
24
+ export declare function colorTone(color: ThemeColor | undefined): TspTone | undefined;
@@ -19,6 +19,7 @@ import type { ThinkingLevel } from "@oh-my-pi/pi-agent-core";
19
19
  import { type Model, type UsageLimit, type UsageReport } from "@oh-my-pi/pi-ai";
20
20
  import { type Component, type TUI } from "../index.js";
21
21
  import { type ModelBrowserSource } from "./model-browser.js";
22
+ import type { DescribeContext, NativeNode, NativeUiEvent } from "../native/node.js";
22
23
  /** One advisor declared in `WATCHDOG.yml`; its instructions specialize the shared baseline. */
23
24
  export interface AdvisorConfig {
24
25
  name: string;
@@ -108,6 +109,25 @@ export declare class AdvisorConfigOverlayComponent implements Component {
108
109
  #private;
109
110
  constructor(tui: TUI, deps: AdvisorConfigDeps, scope: AdvisorConfigScope, doc: WatchdogConfigDoc, callbacks: AdvisorConfigCallbacks);
110
111
  render(width: number): readonly string[];
112
+ /** Docks as a side sheet beside the transcript, like `/settings`, when the terminal draws `prefs` with `aside`. */
113
+ nativeSheet(cx: DescribeContext): boolean;
114
+ /**
115
+ * The native settings page (`prefs`) when the terminal draws it: a page per
116
+ * advisor plus the shared instructions, the advisor's fields as typed rows,
117
+ * the file actions, and the model/tools/instructions editors over the page.
118
+ * Otherwise the root card `omp.overlay.advisor`: on the roster screen a
119
+ * sidebar (the active `SelectList`) beside the highlighted entry's preview;
120
+ * every other screen shows its editor component alone. Key hints close the
121
+ * card.
122
+ */
123
+ describe(cx: DescribeContext): NativeNode;
124
+ /**
125
+ * Native page events, each through the roster/detail selections the keys
126
+ * make: a page opens that advisor (or the shared instructions), a field
127
+ * change or button runs the field's detail action, and closing an editor
128
+ * or the page cancels like Esc.
129
+ */
130
+ handleNativeEvent(event: NativeUiEvent): void;
111
131
  handleInput(data: string): void;
112
132
  /** Forward enhanced-paste transports into a multiline instructions editor. */
113
133
  pasteText(text: string): void;
@@ -1,5 +1,6 @@
1
+ import type { TspSpan, TspTone } from "@oh-my-pi/pi-wire";
1
2
  import type { ThemeColor } from "../theme/theme.js";
2
- import { type AgentRecordLike } from "./agent-hub-types.js";
3
+ import { type AgentRecordLike, type AgentStatus } from "./agent-hub-types.js";
3
4
  import type { ObservableSession } from "./session-observer-registry.js";
4
5
  import type { AgentMetrics } from "./agent-hub-projection.js";
5
6
  export interface RosterRender {
@@ -13,6 +14,14 @@ export declare function sanitizeLine(text: string, maxWidth?: number): string;
13
14
  export declare function clampHubLine(line: string, width: number): string;
14
15
  /** Status glyph, colored per theme status conventions. The title-line counts spell out the words. */
15
16
  export declare function statusGlyph(status: AgentRecordLike["status"]): string;
17
+ /** Native tone for a roster status. */
18
+ export declare function statusTone(status: AgentStatus): TspTone;
19
+ /** Picker row dot for a roster status. */
20
+ export declare function statusDot(status: AgentStatus): TspTone;
21
+ /** One-line task summary: the subagent prompt's fixed assignment preamble is not part of the task. */
22
+ export declare function taskSummary(task: string): string;
23
+ /** Native span of {@link statusGlyph}. */
24
+ export declare function statusGlyphSpan(status: AgentStatus): TspSpan;
16
25
  export declare function statusText(status: AgentRecordLike["status"], text: string): string;
17
26
  /** Host-resolved model-role label and color. */
18
27
  export interface AgentRoleDisplay {
@@ -22,20 +31,27 @@ export interface AgentRoleDisplay {
22
31
  }
23
32
  /** Textual model-role tag; color reinforces (but never replaces) the label. */
24
33
  export declare function formatRoleBadge(role: string, info: AgentRoleDisplay): string;
25
- /**
26
- * Resolved model + reasoning level for a hub row. Exact executor progress is
27
- * authoritative (and survives completion); direct live sessions are the
28
- * fallback for agents without an observer snapshot — the main session has no
29
- * snapshot at all, so its row is read straight off the live session.
30
- *
31
- * Every source reports the model that produced the row's work, never the one
32
- * the session merely points at: an armed fallback that has not served yet stays
33
- * attributed to whichever model last actually spoke.
34
- */
34
+ /** Native span of {@link formatRoleBadge}. */
35
+ export declare function roleBadgeSpan(role: string, info: AgentRoleDisplay): TspSpan;
35
36
  export declare function modelBadge(ref: AgentRecordLike, observed: ObservableSession | undefined): string | undefined;
37
+ /** A picker chip for the model that produced a row's work: label plus thinking-level colour token. */
38
+ export interface ModelChip {
39
+ text: string;
40
+ /** Thinking level shown next to the model (`low`), when the model reasons. */
41
+ level?: string;
42
+ /** Theme token of {@link level}. */
43
+ dot?: string;
44
+ fallback: boolean;
45
+ }
46
+ /** Structured {@link modelBadge} for picker chips. */
47
+ export declare function modelChip(ref: AgentRecordLike, observed: ObservableSession | undefined): ModelChip | undefined;
48
+ /** Native spans of {@link modelBadge}. */
49
+ export declare function modelBadgeSpans(ref: AgentRecordLike, observed: ObservableSession | undefined): TspSpan[] | undefined;
36
50
  export declare function formatMetricDuration(metrics: AgentMetrics): string | undefined;
37
51
  export declare function formatCost(cost: number): string;
38
52
  export declare function formatMetrics(metrics: AgentMetrics): string;
53
+ /** Plain-text {@link formatMetrics} for native spans. */
54
+ export declare function metricsText(metrics: AgentMetrics): string;
39
55
  /** Row-grid variant of {@link formatMetrics}: fixed-width cells so every agent's metadata
40
56
  * line shares one column layout instead of flowing after wrapped text. Cost is left-aligned
41
57
  * so the line starts flush; the numeric cells are right-aligned so units line up. */
@@ -24,6 +24,7 @@ import { type AgentRecordLike, type AgentHubRegistry } from "./agent-hub-types.j
24
24
  import type { SessionObserverRegistry } from "./session-observer-registry.js";
25
25
  import { type AgentTranscriptSource } from "./agent-transcript-viewer.js";
26
26
  import type { AgentRoleDisplay } from "./agent-hub-renderer.js";
27
+ import { type DescribeContext, type NativeNode, type NativeUiEvent } from "../native/node.js";
27
28
  export type AgentHubSection = "agents" | "activity";
28
29
  /** Result of one host-backed transcript read for the Agent Hub viewer. */
29
30
  export interface AgentHubRemoteTranscript {
@@ -119,6 +120,15 @@ export declare class AgentHubOverlayComponent<TRecord extends AgentRecordLike =
119
120
  * restored when the viewer closes. No-op without a real TUI (render-only test stub).
120
121
  */
121
122
  openChat(id: string, entryId?: string): void;
123
+ /** A `picker` is its own sheet: the backend mounts it in `layer` without an `overlay` wrapper. */
124
+ nativeSheet(cx: DescribeContext): boolean;
125
+ describe(cx: DescribeContext): NativeNode;
126
+ /**
127
+ * Pointer actions on the described hub. `select` mirrors keyboard selection
128
+ * (roster row, activity row, section tab, projection tab); `activate` does
129
+ * what Enter does on that row. Picker actions run the key handlers' paths.
130
+ */
131
+ handleNativeEvent(event: NativeUiEvent): void;
122
132
  handleWheel(delta: -1 | 1): void;
123
133
  hitTest(line: number): number | undefined;
124
134
  setHoverIndex(index: number | null): void;
@@ -23,6 +23,7 @@ import type { AgentHubRegistry } from "./agent-hub-types.js";
23
23
  import type { SessionMessageEntryLike } from "../chat/transcript-entry.js";
24
24
  import type { SessionObserverRegistry } from "./session-observer-registry.js";
25
25
  import type { AgentHubRemote } from "./agent-hub.js";
26
+ import type { DescribeContext, NativeNode } from "../native/node.js";
26
27
  /** Parsed message and model metadata relevant to a transcript viewer. */
27
28
  export type AgentTranscriptEntry = SessionMessageEntryLike | {
28
29
  type: "model_change";
@@ -68,4 +69,10 @@ export declare class AgentTranscriptViewer implements Component {
68
69
  dispose(): void;
69
70
  handleInput(data: string): void;
70
71
  render(width: number): readonly string[];
72
+ /**
73
+ * Header, transcript body (the builder's container, which describes its own
74
+ * blocks), notice, message editor, stats and key hints. Scrolling is the
75
+ * terminal's, so the j/k/g/G scroll hints are omitted.
76
+ */
77
+ describe(_cx: DescribeContext): NativeNode;
71
78
  }
@@ -11,6 +11,7 @@
11
11
  */
12
12
  import type { Model } from "@oh-my-pi/pi-ai";
13
13
  import { type Component, type TUI } from "../index.js";
14
+ import type { DescribeContext, NativeNode, NativeUiEvent } from "../native/node.js";
14
15
  import type { AgentSource } from "../tools/task.js";
15
16
  import { type ModelBrowserSource } from "./model-browser.js";
16
17
  /** One agent with its per-agent settings overrides resolved for display. */
@@ -71,5 +72,12 @@ export declare class AgentsHubComponent implements Component {
71
72
  dispose(): void;
72
73
  invalidate(): void;
73
74
  handleInput(data: string): void;
75
+ /**
76
+ * The agent list (and its chip strips) is a `picker` sheet. The pattern
77
+ * input, the model browser and the create wizard stay the generic overlay.
78
+ */
79
+ nativeSheet(cx: DescribeContext): boolean;
80
+ describe(cx: DescribeContext): NativeNode;
81
+ handleNativeEvent(event: NativeUiEvent): void;
74
82
  render(width: number): readonly string[];
75
83
  }
@@ -2,6 +2,7 @@ import { type Component, type TUI } from "../index.js";
2
2
  import { type KeybindingsManager } from "../app-keybindings.js";
3
3
  import { type Theme } from "../theme/theme.js";
4
4
  import type { CodeReviewAnnotation, CodeReviewOverlayResult, ReviewDiffFile, TextReviewAnnotation, TextReviewOverlayResult, TextReviewSource } from "./annotation-types.js";
5
+ import { type NativeNode, type NativeUiEvent } from "../native/node.js";
5
6
  export declare const CONTINUE_CODE_REVIEW_ACTION = "Continue with LLM review";
6
7
  export declare const PASTE_CODE_REVIEW_ACTION = "Paste annotations into prompt";
7
8
  export interface AnnotationOverlayCallbacks {
@@ -26,5 +27,7 @@ export declare class AnnotationOverlay implements Component {
26
27
  getAnnotations(): CodeReviewAnnotation[];
27
28
  getTextAnnotations(): TextReviewAnnotation[];
28
29
  handleInput(data: string): void;
30
+ describe(): NativeNode;
31
+ handleNativeEvent(event: NativeUiEvent): void;
29
32
  render(width: number): readonly string[];
30
33
  }
@@ -1,3 +1,4 @@
1
+ import type { ImageContent } from "@oh-my-pi/pi-ai";
1
2
  import { type Component, type TUI } from "../index.js";
2
3
  /** One selectable answer in an ask dialog. */
3
4
  export interface ExtensionAskDialogOption {
@@ -14,6 +15,11 @@ export interface ExtensionAskDialogQuestion {
14
15
  multi?: boolean;
15
16
  recommended?: number;
16
17
  }
18
+ /** Prompt text and the images pasted into it (custom answers and notes). */
19
+ export interface AskDialogPromptValue {
20
+ text: string;
21
+ images?: ImageContent[];
22
+ }
17
23
  /** Submitted answer to one dialog question. */
18
24
  export interface ExtensionAskDialogResultItem {
19
25
  id: string;
@@ -22,7 +28,9 @@ export interface ExtensionAskDialogResultItem {
22
28
  multi: boolean;
23
29
  selectedOptions: string[];
24
30
  customInput?: string;
31
+ customInputImages?: ImageContent[];
25
32
  note?: string;
33
+ noteImages?: ImageContent[];
26
34
  timedOut?: boolean;
27
35
  }
28
36
  /** Answers submitted from the dialog. */
@@ -36,6 +44,7 @@ export interface ExtensionAskDialogChatResult {
36
44
  }
37
45
  /** Completed dialog action, distinct from cancellation. */
38
46
  export type ExtensionAskDialogResult = ExtensionAskDialogSubmitResult | ExtensionAskDialogChatResult;
47
+ import { type DescribeContext, type NativeNode, type NativeUiEvent } from "../native/node.js";
39
48
  /** Bound a prompt editor title to a fixed row/width budget so long or
40
49
  * multi-line questions stay usable inside the small prompt overlay. */
41
50
  export declare function boundPromptTitle(prefix: string, question: string): string;
@@ -43,6 +52,8 @@ interface AskDialogCallbacks {
43
52
  onSubmit(result: ExtensionAskDialogSubmitResult): void;
44
53
  onCancel(): void;
45
54
  onPrompt(title: string, prefill?: string): Promise<string | undefined>;
55
+ /** Prompt that accepts pasted images; without it, prompts use `onPrompt`. */
56
+ onImagePrompt?(title: string, prefill: AskDialogPromptValue | undefined): Promise<AskDialogPromptValue | undefined>;
46
57
  }
47
58
  interface AskDialogInputGuard {
48
59
  isBlocked(): boolean;
@@ -84,5 +95,17 @@ export declare class AskDialogComponent implements Component {
84
95
  toggleQuestionExpansion(): boolean;
85
96
  handleInput(keyData: string): void;
86
97
  render(width: number): readonly string[];
98
+ /**
99
+ * A bottom-anchored glass sheet over the composer (the `overlay` hoists into
100
+ * the terminal's layer; the dialog's own slot in the dock stays empty).
101
+ */
102
+ describe(cx: DescribeContext): NativeNode;
103
+ /**
104
+ * Pointer actions: a tab click switches to it; a click on an answer row is
105
+ * Enter on it (Space for a multi-select option, so it toggles; its
106
+ * double-click `activate` is Enter); the action bar's Submit, Note and Skip
107
+ * run exactly what Enter, `n` and Esc run on the highlighted row.
108
+ */
109
+ handleNativeEvent(event: NativeUiEvent): void;
87
110
  }
88
111
  export {};
@@ -1,11 +1,14 @@
1
1
  import { Container, type TUI } from "../index.js";
2
2
  import type { Theme } from "../theme/theme.js";
3
+ import type { NativeNode } from "../native/node.js";
3
4
  /** Loader wrapped with borders for hook UI */
4
5
  export declare class BorderedLoader extends Container {
5
6
  #private;
6
7
  constructor(tui: TUI, theme: Theme, message: string);
7
8
  get signal(): AbortSignal;
8
9
  set onAbort(fn: (() => void) | undefined);
10
+ invalidate(): void;
11
+ describe(): NativeNode;
9
12
  handleInput(data: string): void;
10
13
  dispose(): void;
11
14
  }
@@ -1,6 +1,7 @@
1
1
  import { type Component, type Focusable, Input } from "../index.js";
2
2
  import { type BtwHistoryRecord } from "./btw-history.js";
3
3
  import type { SpaceHoldHandler } from "../space-hold.js";
4
+ import type { NativeNode, NativeUiEvent } from "../native/node.js";
4
5
  interface BtwHistoryPanelOptions {
5
6
  records: readonly BtwHistoryRecord[];
6
7
  onClose: () => void;
@@ -27,6 +28,14 @@ export declare class BtwHistoryPanel implements Component, Focusable {
27
28
  /** Enhanced clipboard pastes belong only to the active composer. */
28
29
  pasteText(text: string): void;
29
30
  handleInput(data: string): void;
31
+ /** A large glass sheet titled "BTW history". */
32
+ readonly nativeOverlay: {
33
+ readonly role: "omp.overlay.btwHistory";
34
+ readonly size: "lg";
35
+ readonly head: "BTW history";
36
+ };
37
+ describe(): NativeNode;
38
+ handleNativeEvent(event: NativeUiEvent): void;
30
39
  render(width: number): readonly string[];
31
40
  }
32
41
  export {};
@@ -1,5 +1,6 @@
1
1
  import { type TUI } from "../index.js";
2
2
  import { OverlayPanel } from "../chrome/overlay-box.js";
3
+ import type { NativeNode } from "../native/node.js";
3
4
  interface BtwPanelComponentOptions {
4
5
  question: string;
5
6
  tui: TUI;
@@ -22,5 +23,7 @@ export declare class BtwPanelComponent extends OverlayPanel {
22
23
  isCopyable(): boolean;
23
24
  getCopyText(): string | undefined;
24
25
  close(): void;
26
+ invalidate(): void;
27
+ describe(): NativeNode;
25
28
  }
26
29
  export {};
@@ -2,6 +2,7 @@
2
2
  import { type TUI } from "../index.js";
3
3
  import type { AgentProgress } from "../tools/task.js";
4
4
  import { OverlayPanel } from "../chrome/overlay-box.js";
5
+ import type { DescribeContext, NativeNode } from "../native/node.js";
5
6
  import type { CleanseBoardModel, CleanseCheckerDescriptor, CleanseCheckResult, CleanseAssignment, CleanseAgentOutcome } from "../apps/cleanse-board.js";
6
7
  export type CleansePanelRunStatus = "clean" | "unresolved" | "unsupported" | "cancelled";
7
8
  interface CleansePanelComponentOptions {
@@ -14,9 +15,9 @@ export declare class CleansePanelComponent extends OverlayPanel {
14
15
  #private;
15
16
  readonly interactive = true;
16
17
  constructor(options: CleansePanelComponentOptions);
17
- log(text: string): void;
18
+ log(line: string): void;
18
19
  /** Permanent line styled as a failure (the core's stderr-equivalent). */
19
- logError(text: string): void;
20
+ logError(line: string): void;
20
21
  phase(text: string | undefined): void;
21
22
  checkerStarted(checker: CleanseCheckerDescriptor): void;
22
23
  checkerFinished(check: CleanseCheckResult, durationMs: number): void;
@@ -32,5 +33,7 @@ export declare class CleansePanelComponent extends OverlayPanel {
32
33
  markError(message: string): void;
33
34
  /** Release the repaint timer during teardown. */
34
35
  dispose(): void;
36
+ invalidate(): void;
37
+ describe(cx: DescribeContext): NativeNode;
35
38
  }
36
39
  export {};
@@ -8,7 +8,8 @@
8
8
  * (passed via `previewTitle`) when the session is unnamed.
9
9
  */
10
10
  import { type Component } from "../index.js";
11
- import type { ComposerShape } from "./composer-shape-registry.js";
11
+ import { type ComposerShape } from "./composer-shape-registry.js";
12
+ import type { NativeNode } from "../native/node.js";
12
13
  /**
13
14
  * Real status renderer the preview borrows rows from — structurally satisfied
14
15
  * by {@link StatusLineComponent}. Layout is parameterized so a preview can
@@ -43,5 +44,10 @@ export declare class ComposerShapePreview implements Component {
43
44
  #private;
44
45
  constructor(initialValue?: ComposerShape, options?: ComposerShapePreviewOptions);
45
46
  setValue(shape: ComposerShape): void;
47
+ /**
48
+ * A TSP terminal draws the composer itself, so the shape's glyph chrome has
49
+ * no native twin: the preview names the shape over a read-only prompt.
50
+ */
51
+ describe(): NativeNode;
46
52
  render(width: number): readonly string[];
47
53
  }
@@ -15,9 +15,36 @@
15
15
  * mouse selection nor cmd-click.
16
16
  */
17
17
  import type { AgentTool } from "@oh-my-pi/pi-agent-core";
18
+ import type { TspPickerColumn, TspPickerItem, TspText } from "@oh-my-pi/pi-wire";
18
19
  import { type Component, type TUI } from "../index.js";
19
20
  import type { MessageRenderer } from "../chat/extension-types.js";
20
21
  import { type TranscriptEntryLike as TranscriptEntry } from "../chat/transcript-entry.js";
22
+ import { type OutlineTarget } from "../chat/transcript-outline.js";
23
+ import type { DescribeContext, NativeNode, NativeUiEvent } from "../native/node.js";
24
+ /** Key of the leading list item that replays the history older than the startup tail. */
25
+ export declare const EARLIER_TURNS_KEY = "earlier";
26
+ /** Leading item of a truncated transcript list; selecting it loads the older turns. */
27
+ export declare const earlierTurnsItem: NativeNode;
28
+ /**
29
+ * One list item per outline target, keyed by the turn's opening entry id:
30
+ * the plain turn summary as label, `detail` (or the entry time) on the right.
31
+ */
32
+ export declare function turnItem(target: OutlineTarget, detail?: TspText): NativeNode;
33
+ /** Preview of a turn's text: prose as markdown, command/tool output as a plain code block. */
34
+ export declare function turnPreview(target: OutlineTarget, content: string): NativeNode;
35
+ /** The timeline pickers' one fact column: a user turn's clock time. */
36
+ export declare const TIMELINE_COLUMNS: readonly TspPickerColumn[];
37
+ /**
38
+ * The `timeline` picker item of one outline target (rewind, copy), keyed by
39
+ * the turn's opening entry id: user turns carry their `HH:MM`, pure tool turns
40
+ * the tool's role and a `name target` label.
41
+ */
42
+ export declare function timelineItem(target: OutlineTarget): TspPickerItem;
43
+ /** Timeline picker items for `targets`, reused while `targets` is the same array. */
44
+ export declare class TimelineItems {
45
+ #private;
46
+ of(targets: readonly OutlineTarget[]): TspPickerItem[];
47
+ }
21
48
  export interface CopySelectorDeps {
22
49
  ui: TUI;
23
50
  getTool?: (name: string) => AgentTool | undefined;
@@ -72,5 +99,16 @@ export declare class CopySelectorComponent implements Component {
72
99
  invalidate(): void;
73
100
  dispose(): void;
74
101
  handleInput(data: string): void;
102
+ /** A `picker` is its own sheet: the backend mounts it in `layer` without a wrapper. */
103
+ nativeSheet(cx: DescribeContext): boolean;
104
+ handleNativeEvent(event: NativeUiEvent): void;
105
+ describe(cx: DescribeContext): NativeNode;
75
106
  render(width: number): readonly string[];
76
107
  }
108
+ /** Inner blocks of one turn: markdown code/quotes, commands, and tool output. */
109
+ export declare function collectBlocks(entries: readonly TranscriptEntry[]): CopyBlock[];
110
+ /** Clipboard payload for a whole turn, falling back to its blocks when the turn has no prose. */
111
+ export declare function targetCopy(target: OutlineTarget, blocks: readonly CopyBlock[]): {
112
+ content: string;
113
+ label: string;
114
+ };