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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (750) hide show
  1. package/CHANGELOG.md +29 -0
  2. package/README.md +43 -0
  3. package/dist/types/app-keybindings.d.ts +395 -0
  4. package/dist/types/apps/autoresearch-dashboard.d.ts +43 -0
  5. package/dist/types/apps/autoresearch-data.d.ts +15 -0
  6. package/dist/types/apps/cleanse-board.d.ts +66 -0
  7. package/dist/types/apps/cleanse-picker.d.ts +23 -0
  8. package/dist/types/apps/debug/log-formatting.d.ts +6 -0
  9. package/dist/types/apps/debug/log-viewer.d.ts +81 -0
  10. package/dist/types/apps/debug/protocol-probe.d.ts +42 -0
  11. package/dist/types/apps/debug/raw-sse-buffer.d.ts +58 -0
  12. package/dist/types/apps/debug/raw-sse.d.ts +26 -0
  13. package/dist/types/apps/debug/terminal-info.d.ts +34 -0
  14. package/dist/types/apps/debug/viewer-frame.d.ts +52 -0
  15. package/dist/types/apps/git/avatar.d.ts +9 -0
  16. package/dist/types/apps/git/colors.d.ts +49 -0
  17. package/dist/types/apps/git/diff-pane.d.ts +188 -0
  18. package/dist/types/apps/git/git-tui.d.ts +66 -0
  19. package/dist/types/apps/git/sidebar.d.ts +149 -0
  20. package/dist/types/apps/git/state.d.ts +117 -0
  21. package/dist/types/apps/if-bench-board.d.ts +75 -0
  22. package/dist/types/apps/live-visualizer.d.ts +33 -0
  23. package/dist/types/apps/ps-data.d.ts +51 -0
  24. package/dist/types/apps/ps-top.d.ts +33 -0
  25. package/dist/types/apps/session-picker.d.ts +26 -0
  26. package/dist/types/apps/setup-model-picker.d.ts +13 -0
  27. package/dist/types/apps/standalone-picker.d.ts +42 -0
  28. package/dist/types/autocomplete.d.ts +4 -0
  29. package/dist/types/chat/advisor-message.d.ts +11 -0
  30. package/dist/types/chat/assistant-message.d.ts +106 -0
  31. package/dist/types/chat/background-tan-message.d.ts +9 -0
  32. package/dist/types/chat/bash-execution.d.ts +47 -0
  33. package/dist/types/chat/cache-invalidation-marker.d.ts +50 -0
  34. package/dist/types/chat/chat-transcript-builder.d.ts +50 -0
  35. package/dist/types/chat/collab-prompt-message.d.ts +10 -0
  36. package/dist/types/chat/compaction-summary-message.d.ts +54 -0
  37. package/dist/types/chat/custom-message.d.ts +10 -0
  38. package/dist/types/chat/display-preferences.d.ts +13 -0
  39. package/dist/types/chat/eval-execution.d.ts +29 -0
  40. package/dist/types/chat/execution-shared.d.ts +51 -0
  41. package/dist/types/chat/extension-types.d.ts +28 -0
  42. package/dist/types/chat/hook-message.d.ts +10 -0
  43. package/dist/types/chat/image-loading.d.ts +46 -0
  44. package/dist/types/chat/late-diagnostics-message.d.ts +21 -0
  45. package/dist/types/chat/messages.d.ts +189 -0
  46. package/dist/types/chat/reaction.d.ts +30 -0
  47. package/dist/types/chat/read-target.d.ts +4 -0
  48. package/dist/types/chat/read-tool-group.d.ts +67 -0
  49. package/dist/types/chat/served-model-marker.d.ts +47 -0
  50. package/dist/types/chat/skill-message.d.ts +33 -0
  51. package/dist/types/chat/skill-title-input.d.ts +14 -0
  52. package/dist/types/chat/stripped-tool-calls-placeholder.d.ts +12 -0
  53. package/dist/types/chat/thinking-display.d.ts +12 -0
  54. package/dist/types/chat/todo-reminder.d.ts +13 -0
  55. package/dist/types/chat/tool-execution.d.ts +138 -0
  56. package/dist/types/chat/transcript-browser.d.ts +93 -0
  57. package/dist/types/chat/transcript-entry.d.ts +45 -0
  58. package/dist/types/chat/transcript-outline.d.ts +86 -0
  59. package/dist/types/chat/transcript-render-helpers.d.ts +92 -0
  60. package/dist/types/chat/ttsr-notification.d.ts +23 -0
  61. package/dist/types/chat/user-message.d.ts +52 -0
  62. package/dist/types/chrome/chat-block.d.ts +64 -0
  63. package/dist/types/chrome/collab-qrcode.d.ts +28 -0
  64. package/dist/types/chrome/context-thresholds.d.ts +10 -0
  65. package/dist/types/chrome/countdown-timer.d.ts +14 -0
  66. package/dist/types/chrome/diff.d.ts +14 -0
  67. package/dist/types/chrome/dynamic-border.d.ts +16 -0
  68. package/dist/types/chrome/error-block.d.ts +17 -0
  69. package/dist/types/chrome/form-theme.d.ts +3 -0
  70. package/dist/types/chrome/format.d.ts +12 -0
  71. package/dist/types/chrome/index.d.ts +20 -0
  72. package/dist/types/chrome/keybinding-hints.d.ts +40 -0
  73. package/dist/types/chrome/live-board.d.ts +23 -0
  74. package/dist/types/chrome/local-date.d.ts +4 -0
  75. package/dist/types/chrome/message-divider.d.ts +22 -0
  76. package/dist/types/chrome/message-frame.d.ts +52 -0
  77. package/dist/types/chrome/message-notice.d.ts +35 -0
  78. package/dist/types/chrome/overlay-box.d.ts +74 -0
  79. package/dist/types/chrome/qrcode.d.ts +48 -0
  80. package/dist/types/chrome/segment-track.d.ts +27 -0
  81. package/dist/types/chrome/select-list-mouse-routing.d.ts +4 -0
  82. package/dist/types/chrome/selector-helpers.d.ts +52 -0
  83. package/dist/types/chrome/shared.d.ts +5 -0
  84. package/dist/types/chrome/streaming-panel.d.ts +19 -0
  85. package/dist/types/chrome/tool-activity.d.ts +17 -0
  86. package/dist/types/chrome/transcript-container.d.ts +129 -0
  87. package/dist/types/chrome/transcript-status.d.ts +12 -0
  88. package/dist/types/chrome/visual-truncate.d.ts +19 -0
  89. package/dist/types/components/disclosure.d.ts +42 -0
  90. package/dist/types/components/form.d.ts +130 -0
  91. package/dist/types/components/image.d.ts +18 -16
  92. package/dist/types/components/key-value-list.d.ts +24 -0
  93. package/dist/types/components/layout/geometry.d.ts +73 -0
  94. package/dist/types/components/layout/row.d.ts +55 -0
  95. package/dist/types/components/layout/split-pane.d.ts +80 -0
  96. package/dist/types/components/layout/stack.d.ts +50 -0
  97. package/dist/types/components/menu-selection.d.ts +71 -0
  98. package/dist/types/components/metric.d.ts +44 -0
  99. package/dist/types/components/progress-bar.d.ts +36 -0
  100. package/dist/types/components/scroll-view.d.ts +53 -19
  101. package/dist/types/components/scroll-viewport.d.ts +46 -0
  102. package/dist/types/components/section.d.ts +19 -0
  103. package/dist/types/components/select-list.d.ts +46 -2
  104. package/dist/types/components/settings-list.d.ts +20 -0
  105. package/dist/types/components/table.d.ts +32 -0
  106. package/dist/types/components/tree-view.d.ts +130 -0
  107. package/dist/types/components/wizard-step.d.ts +60 -0
  108. package/dist/types/hotkeys-markdown.d.ts +7 -0
  109. package/dist/types/index.d.ts +17 -0
  110. package/dist/types/keybinding-matchers.d.ts +35 -0
  111. package/dist/types/keys.d.ts +2 -2
  112. package/dist/types/lang-from-path.d.ts +9 -0
  113. package/dist/types/overlays/advisor-config.d.ts +114 -0
  114. package/dist/types/overlays/agent-activity.d.ts +41 -0
  115. package/dist/types/overlays/agent-hub-projection.d.ts +33 -0
  116. package/dist/types/overlays/agent-hub-renderer.d.ts +53 -0
  117. package/dist/types/overlays/agent-hub-types.d.ts +99 -0
  118. package/dist/types/overlays/agent-hub.d.ts +126 -0
  119. package/dist/types/overlays/agent-transcript-viewer.d.ts +71 -0
  120. package/dist/types/overlays/agents-hub.d.ts +72 -0
  121. package/dist/types/overlays/ask-dialog.d.ts +88 -0
  122. package/dist/types/overlays/bordered-loader.d.ts +11 -0
  123. package/dist/types/overlays/btw-history-panel.d.ts +29 -0
  124. package/dist/types/overlays/btw-history.d.ts +17 -0
  125. package/dist/types/overlays/btw-panel.d.ts +26 -0
  126. package/dist/types/overlays/cleanse-panel.d.ts +36 -0
  127. package/dist/types/overlays/codex-reset-fireworks.d.ts +52 -0
  128. package/dist/types/overlays/composer-shape-preview.d.ts +47 -0
  129. package/dist/types/overlays/composer-shape-registry.d.ts +50 -0
  130. package/dist/types/overlays/copy-selector.d.ts +48 -0
  131. package/dist/types/overlays/copy-targets.d.ts +63 -0
  132. package/dist/types/overlays/error-banner.d.ts +13 -0
  133. package/dist/types/overlays/extensions/display-text.d.ts +10 -0
  134. package/dist/types/overlays/extensions/extension-dashboard.d.ts +63 -0
  135. package/dist/types/overlays/extensions/extension-list.d.ts +54 -0
  136. package/dist/types/overlays/extensions/inspector-model.d.ts +109 -0
  137. package/dist/types/overlays/extensions/inspector-panel.d.ts +17 -0
  138. package/dist/types/overlays/extensions/live-tool-session.d.ts +28 -0
  139. package/dist/types/overlays/extensions/mcp-runtime.d.ts +107 -0
  140. package/dist/types/overlays/extensions/state-manager.d.ts +42 -0
  141. package/dist/types/overlays/extensions/types.d.ts +165 -0
  142. package/dist/types/overlays/history-search.d.ts +16 -0
  143. package/dist/types/overlays/hook-editor.d.ts +44 -0
  144. package/dist/types/overlays/hook-input.d.ts +20 -0
  145. package/dist/types/overlays/hook-selector.d.ts +71 -0
  146. package/dist/types/overlays/hub-frame.d.ts +77 -0
  147. package/dist/types/overlays/login-dialog.d.ts +43 -0
  148. package/dist/types/overlays/logout-account-selector.d.ts +15 -0
  149. package/dist/types/overlays/mcp-add-wizard.d.ts +87 -0
  150. package/dist/types/overlays/model-browser.d.ts +213 -0
  151. package/dist/types/overlays/model-hub.d.ts +72 -0
  152. package/dist/types/overlays/model-picker.d.ts +74 -0
  153. package/dist/types/overlays/model-selector.d.ts +52 -0
  154. package/dist/types/overlays/move-overlay.d.ts +39 -0
  155. package/dist/types/overlays/oauth-selector.d.ts +41 -0
  156. package/dist/types/overlays/omfg-panel.d.ts +20 -0
  157. package/dist/types/overlays/pause-screen.d.ts +43 -0
  158. package/dist/types/overlays/plan-review-overlay.d.ts +89 -0
  159. package/dist/types/overlays/plan-save-overlay.d.ts +19 -0
  160. package/dist/types/overlays/plan-toc.d.ts +41 -0
  161. package/dist/types/overlays/plugin-selector.d.ts +28 -0
  162. package/dist/types/overlays/plugin-settings.d.ts +180 -0
  163. package/dist/types/overlays/queue-mode-selector.d.ts +11 -0
  164. package/dist/types/overlays/reset-usage-selector.d.ts +23 -0
  165. package/dist/types/overlays/rewind-selector.d.ts +61 -0
  166. package/dist/types/overlays/running-subagent-badge.d.ts +6 -0
  167. package/dist/types/overlays/session-account-selector.d.ts +24 -0
  168. package/dist/types/overlays/session-info-overlay.d.ts +17 -0
  169. package/dist/types/overlays/session-observer-registry.d.ts +77 -0
  170. package/dist/types/overlays/session-selector.d.ts +131 -0
  171. package/dist/types/overlays/settings-defs.d.ts +119 -0
  172. package/dist/types/overlays/settings-selector.d.ts +73 -0
  173. package/dist/types/overlays/show-images-selector.d.ts +11 -0
  174. package/dist/types/overlays/snapcompact-shape-preview.d.ts +31 -0
  175. package/dist/types/overlays/theme-selector.d.ts +12 -0
  176. package/dist/types/overlays/thinking-selector.d.ts +12 -0
  177. package/dist/types/overlays/tiny-title-download-progress.d.ts +21 -0
  178. package/dist/types/overlays/tree-selector.d.ts +92 -0
  179. package/dist/types/overlays/usage-dashboard.d.ts +94 -0
  180. package/dist/types/overlays/usage-display.d.ts +5 -0
  181. package/dist/types/overlays/usage-row.d.ts +17 -0
  182. package/dist/types/prompt/attachment-chips.d.ts +19 -0
  183. package/dist/types/prompt/composer-attachments.d.ts +71 -0
  184. package/dist/types/prompt/composer-cache.d.ts +37 -0
  185. package/dist/types/prompt/composer.d.ts +159 -0
  186. package/dist/types/prompt/custom-editor.d.ts +261 -0
  187. package/dist/types/prompt/editor-top-gap.d.ts +18 -0
  188. package/dist/types/prompt/emoji-autocomplete.d.ts +16 -0
  189. package/dist/types/prompt/github-ref-autocomplete.d.ts +35 -0
  190. package/dist/types/prompt/gradient-highlight.d.ts +32 -0
  191. package/dist/types/prompt/image-format.d.ts +4 -0
  192. package/dist/types/prompt/image-references.d.ts +26 -0
  193. package/dist/types/prompt/interactive-context-helpers.d.ts +43 -0
  194. package/dist/types/prompt/internal-url-autocomplete.d.ts +56 -0
  195. package/dist/types/prompt/macos-spelling.d.ts +44 -0
  196. package/dist/types/prompt/magic-keyword-boundary.d.ts +9 -0
  197. package/dist/types/prompt/magic-keywords.d.ts +26 -0
  198. package/dist/types/prompt/markdown-prose.d.ts +15 -0
  199. package/dist/types/prompt/model-mention-autocomplete.d.ts +25 -0
  200. package/dist/types/prompt/model-mention-syntax.d.ts +24 -0
  201. package/dist/types/prompt/orchestrate.d.ts +13 -0
  202. package/dist/types/prompt/prompt-action-autocomplete.d.ts +56 -0
  203. package/dist/types/prompt/queue-input.d.ts +8 -0
  204. package/dist/types/prompt/skill-tokens.d.ts +13 -0
  205. package/dist/types/prompt/tools-markdown.d.ts +12 -0
  206. package/dist/types/prompt/ultrathink.d.ts +13 -0
  207. package/dist/types/prompt/usage-amounts.d.ts +26 -0
  208. package/dist/types/prompt/video.d.ts +18 -0
  209. package/dist/types/prompt/welcome.d.ts +83 -0
  210. package/dist/types/prompt/workflow.d.ts +13 -0
  211. package/dist/types/render/code-cell.d.ts +51 -0
  212. package/dist/types/render/file-list.d.ts +22 -0
  213. package/dist/types/render/hyperlink.d.ts +80 -0
  214. package/dist/types/render/index.d.ts +16 -0
  215. package/dist/types/render/output-block.d.ts +54 -0
  216. package/dist/types/render/output-pane.d.ts +80 -0
  217. package/dist/types/render/render-utils.d.ts +312 -0
  218. package/dist/types/render/sixel.d.ts +21 -0
  219. package/dist/types/render/status-line.d.ts +23 -0
  220. package/dist/types/render/tool-card.d.ts +71 -0
  221. package/dist/types/render/tree-list.d.ts +29 -0
  222. package/dist/types/render/types.d.ts +17 -0
  223. package/dist/types/render/utils.d.ts +43 -0
  224. package/dist/types/render/width-aware-text.d.ts +23 -0
  225. package/dist/types/setup/lazy.d.ts +3 -0
  226. package/dist/types/setup/scenes/composer.d.ts +3 -0
  227. package/dist/types/setup/scenes/glyph.d.ts +3 -0
  228. package/dist/types/setup/scenes/model.d.ts +3 -0
  229. package/dist/types/setup/scenes/outro.d.ts +2 -0
  230. package/dist/types/setup/scenes/providers.d.ts +3 -0
  231. package/dist/types/setup/scenes/sign-in.d.ts +21 -0
  232. package/dist/types/setup/scenes/splash.d.ts +11 -0
  233. package/dist/types/setup/scenes/theme.d.ts +3 -0
  234. package/dist/types/setup/scenes/types.d.ts +110 -0
  235. package/dist/types/setup/scenes/web-search.d.ts +22 -0
  236. package/dist/types/setup/setup-version.d.ts +11 -0
  237. package/dist/types/setup/startup-splash.d.ts +9 -0
  238. package/dist/types/setup/wizard-overlay.d.ts +16 -0
  239. package/dist/types/setup/wizard.d.ts +25 -0
  240. package/dist/types/status-line/component.d.ts +182 -0
  241. package/dist/types/status-line/context-usage.d.ts +156 -0
  242. package/dist/types/status-line/footer.d.ts +30 -0
  243. package/dist/types/status-line/git-utils.d.ts +22 -0
  244. package/dist/types/status-line/host.d.ts +129 -0
  245. package/dist/types/status-line/index.d.ts +6 -0
  246. package/dist/types/status-line/loop.d.ts +18 -0
  247. package/dist/types/status-line/metrics.d.ts +21 -0
  248. package/dist/types/status-line/presets.d.ts +3 -0
  249. package/dist/types/status-line/schema.d.ts +15 -0
  250. package/dist/types/status-line/segments.d.ts +5 -0
  251. package/dist/types/status-line/separators.d.ts +3 -0
  252. package/dist/types/status-line/types.d.ts +236 -0
  253. package/dist/types/stdin-buffer.d.ts +4 -0
  254. package/dist/types/theme/color.d.ts +24 -0
  255. package/dist/types/theme/defaults/index.d.ts +9489 -0
  256. package/dist/types/theme/index.d.ts +4 -0
  257. package/dist/types/theme/loader.d.ts +23 -0
  258. package/dist/types/theme/mermaid-cache.d.ts +26 -0
  259. package/dist/types/theme/schema-validation.d.ts +3 -0
  260. package/dist/types/theme/schema.d.ts +25 -0
  261. package/dist/types/theme/session-color.d.ts +43 -0
  262. package/dist/types/theme/shimmer.d.ts +44 -0
  263. package/dist/types/theme/symbols.d.ts +34 -0
  264. package/dist/types/theme/theme-class.d.ts +299 -0
  265. package/dist/types/theme/theme.d.ts +111 -0
  266. package/dist/types/theme/tui-adapters.d.ts +30 -0
  267. package/dist/types/thinking.d.ts +165 -0
  268. package/dist/types/tools/agent-tree.d.ts +36 -0
  269. package/dist/types/tools/ask.d.ts +67 -0
  270. package/dist/types/tools/ast-edit.d.ts +53 -0
  271. package/dist/types/tools/ast-grep.d.ts +52 -0
  272. package/dist/types/tools/autoresearch.d.ts +156 -0
  273. package/dist/types/tools/bash-interactive.d.ts +28 -0
  274. package/dist/types/tools/bash.d.ts +103 -0
  275. package/dist/types/tools/conflict-detect.d.ts +43 -0
  276. package/dist/types/tools/debug.d.ts +60 -0
  277. package/dist/types/tools/default-renderer.d.ts +24 -0
  278. package/dist/types/tools/edit.d.ts +158 -0
  279. package/dist/types/tools/eval-format/code-mode-declarations.d.ts +5 -0
  280. package/dist/types/tools/eval-format/index.d.ts +5 -0
  281. package/dist/types/tools/eval-format/javascript.d.ts +2 -0
  282. package/dist/types/tools/eval-format/python.d.ts +2 -0
  283. package/dist/types/tools/eval.d.ts +94 -0
  284. package/dist/types/tools/fetch.d.ts +42 -0
  285. package/dist/types/tools/gh-format.d.ts +8 -0
  286. package/dist/types/tools/github.d.ts +144 -0
  287. package/dist/types/tools/glob.d.ts +44 -0
  288. package/dist/types/tools/goal.d.ts +42 -0
  289. package/dist/types/tools/grep.d.ts +64 -0
  290. package/dist/types/tools/grouped-file-output.d.ts +71 -0
  291. package/dist/types/tools/hashline-format.d.ts +28 -0
  292. package/dist/types/tools/hub.d.ts +340 -0
  293. package/dist/types/tools/index.d.ts +4 -0
  294. package/dist/types/tools/json-tree.d.ts +59 -0
  295. package/dist/types/tools/line-ranges.d.ts +29 -0
  296. package/dist/types/tools/list-limit.d.ts +15 -0
  297. package/dist/types/tools/lsp.d.ts +72 -0
  298. package/dist/types/tools/match-line-format.d.ts +11 -0
  299. package/dist/types/tools/mcp.d.ts +81 -0
  300. package/dist/types/tools/memory.d.ts +67 -0
  301. package/dist/types/tools/output-meta.d.ts +151 -0
  302. package/dist/types/tools/read.d.ts +139 -0
  303. package/dist/types/tools/renderer.d.ts +98 -0
  304. package/dist/types/tools/report-tool-issue.d.ts +8 -0
  305. package/dist/types/tools/resolve.d.ts +47 -0
  306. package/dist/types/tools/streaming-output.d.ts +282 -0
  307. package/dist/types/tools/subprocess.d.ts +24 -0
  308. package/dist/types/tools/task-repair-args.d.ts +53 -0
  309. package/dist/types/tools/task-yield-assembly.d.ts +20 -0
  310. package/dist/types/tools/task.d.ts +425 -0
  311. package/dist/types/tools/terminal-output.d.ts +8 -0
  312. package/dist/types/tools/think.d.ts +13 -0
  313. package/dist/types/tools/todo.d.ts +118 -0
  314. package/dist/types/tools/tool-errors.d.ts +7 -0
  315. package/dist/types/tools/vibe.d.ts +120 -0
  316. package/dist/types/tools/web-search.d.ts +195 -0
  317. package/dist/types/tools/write.d.ts +76 -0
  318. package/dist/types/tools/xd-url.d.ts +13 -0
  319. package/dist/types/tools/xdev.d.ts +52 -0
  320. package/dist/types/tui.d.ts +18 -0
  321. package/dist/types/utils.d.ts +2 -0
  322. package/package.json +37 -3
  323. package/src/app-keybindings.ts +760 -0
  324. package/src/apps/autoresearch-dashboard.ts +500 -0
  325. package/src/apps/autoresearch-data.ts +64 -0
  326. package/src/apps/cleanse-board.ts +341 -0
  327. package/src/apps/cleanse-picker.ts +57 -0
  328. package/src/apps/debug/log-formatting.ts +53 -0
  329. package/src/apps/debug/log-viewer.ts +868 -0
  330. package/src/apps/debug/protocol-probe.ts +267 -0
  331. package/src/apps/debug/raw-sse-buffer.ts +449 -0
  332. package/src/apps/debug/raw-sse.ts +282 -0
  333. package/src/apps/debug/terminal-info.ts +115 -0
  334. package/src/apps/debug/viewer-frame.ts +174 -0
  335. package/src/apps/git/avatar.ts +52 -0
  336. package/src/apps/git/colors.ts +109 -0
  337. package/src/apps/git/diff-pane.ts +1512 -0
  338. package/src/apps/git/git-tui.ts +889 -0
  339. package/src/apps/git/sidebar.ts +1204 -0
  340. package/src/apps/git/state.ts +113 -0
  341. package/src/apps/if-bench-board.ts +324 -0
  342. package/src/apps/live-visualizer.ts +238 -0
  343. package/src/apps/ps-data.ts +116 -0
  344. package/src/apps/ps-top.ts +422 -0
  345. package/src/apps/session-picker.ts +95 -0
  346. package/src/apps/setup-model-picker.ts +21 -0
  347. package/src/apps/standalone-picker.ts +111 -0
  348. package/src/autocomplete.ts +9 -13
  349. package/src/chat/advisor-message.ts +175 -0
  350. package/src/chat/assistant-message.ts +1214 -0
  351. package/src/chat/background-tan-message.ts +35 -0
  352. package/src/chat/bash-execution.ts +394 -0
  353. package/src/chat/cache-invalidation-marker.ts +94 -0
  354. package/src/chat/chat-transcript-builder.ts +593 -0
  355. package/src/chat/collab-prompt-message.ts +34 -0
  356. package/src/chat/compaction-summary-message.ts +261 -0
  357. package/src/chat/custom-message.ts +23 -0
  358. package/src/chat/display-preferences.ts +24 -0
  359. package/src/chat/eval-execution.ts +172 -0
  360. package/src/chat/execution-shared.ts +113 -0
  361. package/src/chat/extension-types.ts +46 -0
  362. package/src/chat/hook-message.ts +20 -0
  363. package/src/chat/image-loading.ts +122 -0
  364. package/src/chat/late-diagnostics-message.ts +92 -0
  365. package/src/chat/messages.ts +305 -0
  366. package/src/chat/reaction.ts +65 -0
  367. package/src/chat/read-target.ts +7 -0
  368. package/src/chat/read-tool-group.ts +873 -0
  369. package/src/chat/served-model-marker.ts +91 -0
  370. package/src/chat/skill-message.ts +220 -0
  371. package/src/chat/skill-title-input.ts +41 -0
  372. package/src/chat/stripped-tool-calls-placeholder.ts +35 -0
  373. package/src/chat/thinking-display.ts +312 -0
  374. package/src/chat/todo-reminder.ts +33 -0
  375. package/src/chat/tool-execution.ts +1395 -0
  376. package/src/chat/transcript-browser.ts +268 -0
  377. package/src/chat/transcript-entry.ts +96 -0
  378. package/src/chat/transcript-outline.ts +260 -0
  379. package/src/chat/transcript-render-helpers.ts +315 -0
  380. package/src/chat/ttsr-notification.ts +123 -0
  381. package/src/chat/user-message.ts +287 -0
  382. package/src/chrome/chat-block.ts +110 -0
  383. package/src/chrome/collab-qrcode.ts +74 -0
  384. package/src/chrome/context-thresholds.ts +85 -0
  385. package/src/chrome/countdown-timer.ts +74 -0
  386. package/src/chrome/diff.ts +266 -0
  387. package/src/chrome/dynamic-border.ts +36 -0
  388. package/src/chrome/error-block.ts +63 -0
  389. package/src/chrome/form-theme.ts +10 -0
  390. package/src/chrome/format.ts +66 -0
  391. package/src/chrome/index.ts +21 -0
  392. package/src/chrome/keybinding-hints.ts +55 -0
  393. package/src/chrome/live-board.ts +123 -0
  394. package/src/chrome/local-date.ts +20 -0
  395. package/src/chrome/message-divider.ts +51 -0
  396. package/src/chrome/message-frame.ts +164 -0
  397. package/src/chrome/message-notice.ts +103 -0
  398. package/src/chrome/overlay-box.ts +301 -0
  399. package/src/chrome/qrcode.ts +539 -0
  400. package/src/chrome/segment-track.ts +86 -0
  401. package/src/chrome/select-list-mouse-routing.ts +11 -0
  402. package/src/chrome/selector-helpers.ts +119 -0
  403. package/src/chrome/shared.ts +27 -0
  404. package/src/chrome/streaming-panel.ts +72 -0
  405. package/src/chrome/tool-activity.ts +44 -0
  406. package/src/chrome/transcript-container.ts +902 -0
  407. package/src/chrome/transcript-status.ts +27 -0
  408. package/src/chrome/visual-truncate.ts +70 -0
  409. package/src/components/disclosure.ts +235 -0
  410. package/src/components/editor.ts +10 -12
  411. package/src/components/form.ts +566 -0
  412. package/src/components/image.ts +80 -53
  413. package/src/components/input.ts +6 -27
  414. package/src/components/key-value-list.ts +88 -0
  415. package/src/components/layout/geometry.ts +202 -0
  416. package/src/components/layout/row.ts +283 -0
  417. package/src/components/layout/split-pane.ts +349 -0
  418. package/src/components/layout/stack.ts +261 -0
  419. package/src/components/markdown.ts +16 -12
  420. package/src/components/menu-selection.ts +248 -0
  421. package/src/components/metric.ts +132 -0
  422. package/src/components/progress-bar.ts +140 -0
  423. package/src/components/scroll-view.ts +372 -70
  424. package/src/components/scroll-viewport.ts +154 -0
  425. package/src/components/section.ts +77 -0
  426. package/src/components/select-list.ts +238 -159
  427. package/src/components/settings-list.ts +103 -80
  428. package/src/components/table.ts +127 -0
  429. package/src/components/tree-view.ts +481 -0
  430. package/src/components/wizard-step.ts +229 -0
  431. package/src/deccara.ts +1 -3
  432. package/src/hotkeys-markdown.ts +100 -0
  433. package/src/index.ts +18 -0
  434. package/src/keybinding-matchers.ts +99 -0
  435. package/src/keys.ts +2 -2
  436. package/src/lang-from-path.ts +252 -0
  437. package/src/overlays/advisor-config.ts +761 -0
  438. package/src/overlays/agent-activity.ts +113 -0
  439. package/src/overlays/agent-hub-projection.ts +250 -0
  440. package/src/overlays/agent-hub-renderer.ts +281 -0
  441. package/src/overlays/agent-hub-types.ts +74 -0
  442. package/src/overlays/agent-hub.ts +1562 -0
  443. package/src/overlays/agent-transcript-viewer.ts +669 -0
  444. package/src/overlays/agents-hub.ts +1203 -0
  445. package/src/overlays/ask-dialog.ts +1202 -0
  446. package/src/overlays/bordered-loader.ts +41 -0
  447. package/src/overlays/btw-history-panel.ts +591 -0
  448. package/src/overlays/btw-history.ts +33 -0
  449. package/src/overlays/btw-panel.ts +167 -0
  450. package/src/overlays/cleanse-panel.ts +167 -0
  451. package/src/overlays/codex-reset-fireworks.ts +375 -0
  452. package/src/overlays/composer-shape-preview.ts +137 -0
  453. package/src/overlays/composer-shape-registry.ts +82 -0
  454. package/src/overlays/copy-selector.ts +618 -0
  455. package/src/overlays/copy-targets.ts +210 -0
  456. package/src/overlays/error-banner.ts +39 -0
  457. package/src/overlays/extensions/display-text.ts +39 -0
  458. package/src/overlays/extensions/extension-dashboard.ts +645 -0
  459. package/src/overlays/extensions/extension-list.ts +667 -0
  460. package/src/overlays/extensions/inspector-model.ts +484 -0
  461. package/src/overlays/extensions/inspector-panel.ts +669 -0
  462. package/src/overlays/extensions/live-tool-session.ts +67 -0
  463. package/src/overlays/extensions/mcp-runtime.ts +289 -0
  464. package/src/overlays/extensions/state-manager.ts +337 -0
  465. package/src/overlays/extensions/types.ts +208 -0
  466. package/src/overlays/history-search.ts +268 -0
  467. package/src/overlays/hook-editor.ts +272 -0
  468. package/src/overlays/hook-input.ts +84 -0
  469. package/src/overlays/hook-selector.ts +635 -0
  470. package/src/overlays/hub-frame.ts +262 -0
  471. package/src/overlays/login-dialog.ts +231 -0
  472. package/src/overlays/logout-account-selector.ts +115 -0
  473. package/src/overlays/mcp-add-wizard.ts +1436 -0
  474. package/src/overlays/model-browser.ts +1176 -0
  475. package/src/overlays/model-hub.ts +2279 -0
  476. package/src/overlays/model-picker.ts +285 -0
  477. package/src/overlays/model-selector.ts +107 -0
  478. package/src/overlays/move-overlay.ts +197 -0
  479. package/src/overlays/oauth-selector.ts +446 -0
  480. package/src/overlays/omfg-panel.ts +136 -0
  481. package/src/overlays/pause-screen.ts +198 -0
  482. package/src/overlays/plan-review-overlay.ts +1227 -0
  483. package/src/overlays/plan-save-overlay.ts +74 -0
  484. package/src/overlays/plan-toc.ts +139 -0
  485. package/src/overlays/plugin-selector.ts +97 -0
  486. package/src/overlays/plugin-settings.ts +839 -0
  487. package/src/overlays/queue-mode-selector.ts +55 -0
  488. package/src/overlays/reset-usage-selector.ts +170 -0
  489. package/src/overlays/rewind-selector.ts +499 -0
  490. package/src/overlays/running-subagent-badge.ts +19 -0
  491. package/src/overlays/session-account-selector.ts +68 -0
  492. package/src/overlays/session-info-overlay.ts +96 -0
  493. package/src/overlays/session-observer-registry.ts +289 -0
  494. package/src/overlays/session-selector.ts +1137 -0
  495. package/src/overlays/settings-defs.ts +315 -0
  496. package/src/overlays/settings-selector.ts +1415 -0
  497. package/src/overlays/show-images-selector.ts +44 -0
  498. package/src/overlays/snapcompact-shape-preview-doc.md +14 -0
  499. package/src/overlays/snapcompact-shape-preview.ts +192 -0
  500. package/src/overlays/theme-selector.ts +62 -0
  501. package/src/overlays/thinking-selector.ts +51 -0
  502. package/src/overlays/tiny-title-download-progress.ts +102 -0
  503. package/src/overlays/tree-selector.ts +1121 -0
  504. package/src/overlays/usage-dashboard.ts +629 -0
  505. package/src/overlays/usage-display.ts +45 -0
  506. package/src/overlays/usage-row.ts +118 -0
  507. package/src/prompt/attachment-chips.ts +201 -0
  508. package/src/prompt/composer-attachments.ts +280 -0
  509. package/src/prompt/composer-cache.ts +304 -0
  510. package/src/prompt/composer.ts +934 -0
  511. package/src/prompt/custom-editor.ts +1392 -0
  512. package/src/prompt/data/emojis.json +1 -0
  513. package/src/prompt/editor-top-gap.ts +28 -0
  514. package/src/prompt/emoji-autocomplete.ts +285 -0
  515. package/src/prompt/github-ref-autocomplete.ts +75 -0
  516. package/src/prompt/gradient-highlight.ts +101 -0
  517. package/src/prompt/image-format.ts +28 -0
  518. package/src/prompt/image-references.ts +102 -0
  519. package/src/prompt/interactive-context-helpers.ts +126 -0
  520. package/src/prompt/internal-url-autocomplete.ts +155 -0
  521. package/src/prompt/macos-spelling.ts +456 -0
  522. package/src/prompt/magic-keyword-boundary.ts +23 -0
  523. package/src/prompt/magic-keywords.ts +42 -0
  524. package/src/prompt/markdown-prose.ts +245 -0
  525. package/src/prompt/model-mention-autocomplete.ts +94 -0
  526. package/src/prompt/model-mention-syntax.ts +41 -0
  527. package/src/prompt/orchestrate.ts +26 -0
  528. package/src/prompt/prompt-action-autocomplete.ts +337 -0
  529. package/src/prompt/queue-input.ts +132 -0
  530. package/src/prompt/skill-tokens.ts +36 -0
  531. package/src/prompt/tips.txt +27 -0
  532. package/src/prompt/tools-markdown.ts +29 -0
  533. package/src/prompt/ultrathink.ts +26 -0
  534. package/src/prompt/usage-amounts.ts +99 -0
  535. package/src/prompt/video.ts +47 -0
  536. package/src/prompt/welcome.ts +605 -0
  537. package/src/prompt/workflow.ts +26 -0
  538. package/src/render/code-cell.ts +244 -0
  539. package/src/render/file-list.ts +58 -0
  540. package/src/render/hyperlink.ts +192 -0
  541. package/src/render/index.ts +17 -0
  542. package/src/render/output-block.ts +267 -0
  543. package/src/render/output-pane.ts +299 -0
  544. package/src/render/render-utils.ts +1182 -0
  545. package/src/render/sixel.ts +69 -0
  546. package/src/render/status-line.ts +55 -0
  547. package/src/render/tool-card.ts +272 -0
  548. package/src/render/tree-list.ts +188 -0
  549. package/src/render/types.ts +19 -0
  550. package/src/render/utils.ts +109 -0
  551. package/src/render/width-aware-text.ts +60 -0
  552. package/src/setup/lazy.ts +17 -0
  553. package/src/setup/scenes/composer.ts +127 -0
  554. package/src/setup/scenes/glyph.ts +120 -0
  555. package/src/setup/scenes/model.ts +138 -0
  556. package/src/setup/scenes/outro.ts +24 -0
  557. package/src/setup/scenes/providers.ts +107 -0
  558. package/src/setup/scenes/sign-in.ts +373 -0
  559. package/src/setup/scenes/splash.ts +192 -0
  560. package/src/setup/scenes/theme.ts +343 -0
  561. package/src/setup/scenes/types.ts +111 -0
  562. package/src/setup/scenes/web-search.ts +165 -0
  563. package/src/setup/setup-version.ts +11 -0
  564. package/src/setup/startup-splash.ts +107 -0
  565. package/src/setup/wizard-overlay.ts +319 -0
  566. package/src/setup/wizard.ts +101 -0
  567. package/src/status-line/component.ts +3003 -0
  568. package/src/status-line/context-usage.ts +688 -0
  569. package/src/status-line/footer.ts +323 -0
  570. package/src/status-line/git-utils.ts +42 -0
  571. package/src/status-line/host.ts +97 -0
  572. package/src/status-line/index.ts +6 -0
  573. package/src/status-line/loop.ts +28 -0
  574. package/src/status-line/metrics.ts +94 -0
  575. package/src/status-line/presets.ts +107 -0
  576. package/src/status-line/schema.ts +57 -0
  577. package/src/status-line/segments.ts +934 -0
  578. package/src/status-line/separators.ts +55 -0
  579. package/src/status-line/types.ts +227 -0
  580. package/src/stdin-buffer.ts +4 -2
  581. package/src/theme/color.ts +95 -0
  582. package/src/theme/dark.json +95 -0
  583. package/src/theme/defaults/alabaster.json +93 -0
  584. package/src/theme/defaults/amethyst.json +96 -0
  585. package/src/theme/defaults/anthracite.json +93 -0
  586. package/src/theme/defaults/basalt.json +91 -0
  587. package/src/theme/defaults/birch.json +95 -0
  588. package/src/theme/defaults/dark-abyss.json +91 -0
  589. package/src/theme/defaults/dark-arctic.json +104 -0
  590. package/src/theme/defaults/dark-aurora.json +95 -0
  591. package/src/theme/defaults/dark-catppuccin.json +107 -0
  592. package/src/theme/defaults/dark-cavern.json +91 -0
  593. package/src/theme/defaults/dark-celestial.json +106 -0
  594. package/src/theme/defaults/dark-copper.json +95 -0
  595. package/src/theme/defaults/dark-cosmos.json +90 -0
  596. package/src/theme/defaults/dark-cyberpunk.json +102 -0
  597. package/src/theme/defaults/dark-dracula.json +98 -0
  598. package/src/theme/defaults/dark-eclipse.json +91 -0
  599. package/src/theme/defaults/dark-ember.json +95 -0
  600. package/src/theme/defaults/dark-equinox.json +90 -0
  601. package/src/theme/defaults/dark-forest.json +96 -0
  602. package/src/theme/defaults/dark-github.json +105 -0
  603. package/src/theme/defaults/dark-gruvbox.json +112 -0
  604. package/src/theme/defaults/dark-lavender.json +95 -0
  605. package/src/theme/defaults/dark-lunar.json +89 -0
  606. package/src/theme/defaults/dark-midnight.json +95 -0
  607. package/src/theme/defaults/dark-monochrome.json +94 -0
  608. package/src/theme/defaults/dark-monokai.json +98 -0
  609. package/src/theme/defaults/dark-nebula.json +90 -0
  610. package/src/theme/defaults/dark-nord.json +98 -0
  611. package/src/theme/defaults/dark-ocean.json +101 -0
  612. package/src/theme/defaults/dark-one.json +100 -0
  613. package/src/theme/defaults/dark-poimandres.json +115 -0
  614. package/src/theme/defaults/dark-rainforest.json +91 -0
  615. package/src/theme/defaults/dark-reef.json +91 -0
  616. package/src/theme/defaults/dark-retro.json +92 -0
  617. package/src/theme/defaults/dark-rose-pine.json +96 -0
  618. package/src/theme/defaults/dark-sakura.json +95 -0
  619. package/src/theme/defaults/dark-slate.json +95 -0
  620. package/src/theme/defaults/dark-solarized.json +97 -0
  621. package/src/theme/defaults/dark-solstice.json +90 -0
  622. package/src/theme/defaults/dark-starfall.json +91 -0
  623. package/src/theme/defaults/dark-sunset.json +99 -0
  624. package/src/theme/defaults/dark-swamp.json +90 -0
  625. package/src/theme/defaults/dark-synthwave.json +103 -0
  626. package/src/theme/defaults/dark-taiga.json +91 -0
  627. package/src/theme/defaults/dark-terminal.json +95 -0
  628. package/src/theme/defaults/dark-tokyo-night.json +101 -0
  629. package/src/theme/defaults/dark-tundra.json +91 -0
  630. package/src/theme/defaults/dark-twilight.json +91 -0
  631. package/src/theme/defaults/dark-volcanic.json +91 -0
  632. package/src/theme/defaults/graphite.json +92 -0
  633. package/src/theme/defaults/index.ts +201 -0
  634. package/src/theme/defaults/light-arctic.json +107 -0
  635. package/src/theme/defaults/light-aurora-day.json +91 -0
  636. package/src/theme/defaults/light-canyon.json +91 -0
  637. package/src/theme/defaults/light-catppuccin.json +106 -0
  638. package/src/theme/defaults/light-cirrus.json +90 -0
  639. package/src/theme/defaults/light-coral.json +95 -0
  640. package/src/theme/defaults/light-cyberpunk.json +96 -0
  641. package/src/theme/defaults/light-dawn.json +90 -0
  642. package/src/theme/defaults/light-dunes.json +91 -0
  643. package/src/theme/defaults/light-eucalyptus.json +95 -0
  644. package/src/theme/defaults/light-forest.json +100 -0
  645. package/src/theme/defaults/light-frost.json +95 -0
  646. package/src/theme/defaults/light-github.json +115 -0
  647. package/src/theme/defaults/light-glacier.json +91 -0
  648. package/src/theme/defaults/light-gruvbox.json +108 -0
  649. package/src/theme/defaults/light-haze.json +90 -0
  650. package/src/theme/defaults/light-honeycomb.json +95 -0
  651. package/src/theme/defaults/light-lagoon.json +91 -0
  652. package/src/theme/defaults/light-lavender.json +95 -0
  653. package/src/theme/defaults/light-meadow.json +91 -0
  654. package/src/theme/defaults/light-mint.json +95 -0
  655. package/src/theme/defaults/light-monochrome.json +101 -0
  656. package/src/theme/defaults/light-ocean.json +99 -0
  657. package/src/theme/defaults/light-one.json +99 -0
  658. package/src/theme/defaults/light-opal.json +91 -0
  659. package/src/theme/defaults/light-orchard.json +91 -0
  660. package/src/theme/defaults/light-paper.json +95 -0
  661. package/src/theme/defaults/light-poimandres.json +115 -0
  662. package/src/theme/defaults/light-prism.json +90 -0
  663. package/src/theme/defaults/light-retro.json +98 -0
  664. package/src/theme/defaults/light-sand.json +95 -0
  665. package/src/theme/defaults/light-savanna.json +91 -0
  666. package/src/theme/defaults/light-solarized.json +102 -0
  667. package/src/theme/defaults/light-soleil.json +90 -0
  668. package/src/theme/defaults/light-sunset.json +99 -0
  669. package/src/theme/defaults/light-synthwave.json +98 -0
  670. package/src/theme/defaults/light-tokyo-night.json +111 -0
  671. package/src/theme/defaults/light-wetland.json +91 -0
  672. package/src/theme/defaults/light-zenith.json +89 -0
  673. package/src/theme/defaults/limestone.json +94 -0
  674. package/src/theme/defaults/mahogany.json +97 -0
  675. package/src/theme/defaults/marble.json +93 -0
  676. package/src/theme/defaults/obsidian.json +91 -0
  677. package/src/theme/defaults/onyx.json +91 -0
  678. package/src/theme/defaults/pearl.json +93 -0
  679. package/src/theme/defaults/porcelain.json +91 -0
  680. package/src/theme/defaults/quartz.json +96 -0
  681. package/src/theme/defaults/sandstone.json +95 -0
  682. package/src/theme/defaults/titanium.json +90 -0
  683. package/src/theme/index.ts +5 -0
  684. package/src/theme/light.json +93 -0
  685. package/src/theme/loader.ts +200 -0
  686. package/src/theme/mermaid-cache.ts +92 -0
  687. package/src/theme/schema-validation.ts +119 -0
  688. package/src/theme/schema.ts +168 -0
  689. package/src/theme/session-color.ts +253 -0
  690. package/src/theme/shimmer.ts +307 -0
  691. package/src/theme/symbols.ts +1433 -0
  692. package/src/theme/theme-class.ts +787 -0
  693. package/src/theme/theme-schema.json +463 -0
  694. package/src/theme/theme.ts +810 -0
  695. package/src/theme/tui-adapters.ts +339 -0
  696. package/src/thinking.ts +380 -0
  697. package/src/tools/agent-tree.ts +128 -0
  698. package/src/tools/ask.ts +482 -0
  699. package/src/tools/ast-edit.ts +210 -0
  700. package/src/tools/ast-grep.ts +171 -0
  701. package/src/tools/autoresearch.ts +287 -0
  702. package/src/tools/bash-interactive.ts +295 -0
  703. package/src/tools/bash.ts +468 -0
  704. package/src/tools/conflict-detect.ts +77 -0
  705. package/src/tools/debug.ts +167 -0
  706. package/src/tools/default-renderer.ts +172 -0
  707. package/src/tools/edit.ts +1258 -0
  708. package/src/tools/eval-format/code-mode-declarations.ts +61 -0
  709. package/src/tools/eval-format/index.ts +16 -0
  710. package/src/tools/eval-format/javascript.ts +952 -0
  711. package/src/tools/eval-format/python.ts +544 -0
  712. package/src/tools/eval.ts +835 -0
  713. package/src/tools/fetch.ts +226 -0
  714. package/src/tools/gh-format.ts +18 -0
  715. package/src/tools/github.ts +686 -0
  716. package/src/tools/glob.ts +213 -0
  717. package/src/tools/goal.ts +153 -0
  718. package/src/tools/grep.ts +385 -0
  719. package/src/tools/grouped-file-output.ts +211 -0
  720. package/src/tools/hashline-format.ts +59 -0
  721. package/src/tools/hub.ts +1488 -0
  722. package/src/tools/index.ts +71 -0
  723. package/src/tools/json-tree.ts +388 -0
  724. package/src/tools/line-ranges.ts +98 -0
  725. package/src/tools/list-limit.ts +43 -0
  726. package/src/tools/lsp.ts +702 -0
  727. package/src/tools/match-line-format.ts +20 -0
  728. package/src/tools/mcp.ts +309 -0
  729. package/src/tools/memory.ts +220 -0
  730. package/src/tools/output-meta.ts +367 -0
  731. package/src/tools/read.ts +628 -0
  732. package/src/tools/renderer.ts +107 -0
  733. package/src/tools/report-tool-issue.ts +13 -0
  734. package/src/tools/resolve.ts +139 -0
  735. package/src/tools/streaming-output.ts +1576 -0
  736. package/src/tools/subprocess.ts +39 -0
  737. package/src/tools/task-repair-args.ts +118 -0
  738. package/src/tools/task-yield-assembly.ts +147 -0
  739. package/src/tools/task.ts +2110 -0
  740. package/src/tools/terminal-output.ts +153 -0
  741. package/src/tools/think.ts +28 -0
  742. package/src/tools/todo.ts +580 -0
  743. package/src/tools/tool-errors.ts +15 -0
  744. package/src/tools/vibe.ts +420 -0
  745. package/src/tools/web-search.ts +409 -0
  746. package/src/tools/write.ts +511 -0
  747. package/src/tools/xd-url.ts +28 -0
  748. package/src/tools/xdev.ts +201 -0
  749. package/src/tui.ts +70 -8
  750. package/src/utils.ts +8 -0
@@ -0,0 +1,122 @@
1
+ import type { ImageContent, Model } from "@oh-my-pi/pi-ai";
2
+ import { formatBytes, parseImageMetadata, SUPPORTED_IMAGE_MIME_TYPES } from "@oh-my-pi/pi-utils";
3
+
4
+ export const MAX_IMAGE_INPUT_BYTES = 20 * 1024 * 1024;
5
+
6
+ export const SUPPORTED_INPUT_IMAGE_MIME_TYPES = SUPPORTED_IMAGE_MIME_TYPES;
7
+
8
+ /**
9
+ * Ollama and its local-backend family decode image input through llama.cpp /
10
+ * `stb_image`, which is compiled without WebP support, so a WebP upload fails
11
+ * with an opaque HTTP 400. Detect those models so the resize pipeline encodes
12
+ * to PNG/JPEG instead — the automatic equivalent of `OMP_NO_WEBP=1`.
13
+ */
14
+ export function modelLacksWebpSupport(
15
+ model: Pick<Model, "provider" | "api" | "imageInputDecoder"> | undefined,
16
+ ): boolean {
17
+ if (!model) return false;
18
+ return (
19
+ model.imageInputDecoder === "stb" ||
20
+ model.provider === "ollama" ||
21
+ model.provider === "ollama-cloud" ||
22
+ model.provider === "llama.cpp" ||
23
+ model.provider === "lm-studio" ||
24
+ model.provider === "local-server" ||
25
+ model.api === "ollama-chat"
26
+ );
27
+ }
28
+
29
+ /**
30
+ * `true` when `model` cannot decode WebP, otherwise `undefined` so the
31
+ * `OMP_NO_WEBP` env fallback in {@link resizeImage} still applies. Feed straight
32
+ * into {@link ImageResizeOptions.excludeWebP}.
33
+ */
34
+ export function webpExclusionForModel(model: Pick<Model, "provider" | "api"> | undefined): true | undefined {
35
+ return modelLacksWebpSupport(model) ? true : undefined;
36
+ }
37
+
38
+ export class ImageInputTooLargeError extends Error {
39
+ readonly bytes: number;
40
+ readonly maxBytes: number;
41
+
42
+ constructor(bytes: number, maxBytes: number) {
43
+ super(`Image file too large: ${formatBytes(bytes)} exceeds ${formatBytes(maxBytes)} limit.`);
44
+ this.name = "ImageInputTooLargeError";
45
+ this.bytes = bytes;
46
+ this.maxBytes = maxBytes;
47
+ }
48
+ }
49
+
50
+ /**
51
+ * Raised when image bytes cannot be decoded — a truncated stream, a payload
52
+ * with a hole in the middle, or bytes that are not the container they claim.
53
+ * Failing at ingress keeps them out of the transcript, where they would
54
+ * otherwise be persisted and rejected by the provider on every later request,
55
+ * with no way to resume the session.
56
+ */
57
+ export class InvalidImageDataError extends Error {
58
+ readonly reason: string;
59
+
60
+ constructor(label: string, mimeType: string, reason: string) {
61
+ super(`${label} is not a decodable ${mimeType} image: ${reason}`);
62
+ this.name = "InvalidImageDataError";
63
+ this.reason = reason;
64
+ }
65
+ }
66
+
67
+ /**
68
+ * Smallest raster the decode probe terminates into. The decode is the oracle,
69
+ * so the output size cannot change the verdict — a 1x1 sink keeps the check
70
+ * from allocating a full-size pixel buffer, a full-size PNG, and a base64
71
+ * string for a payload that may be up to {@link MAX_IMAGE_INPUT_BYTES}.
72
+ */
73
+ const DECODE_PROBE_EDGE_PX = 1;
74
+
75
+ /**
76
+ * Why an image cannot be decoded, or `null` when it decodes.
77
+ *
78
+ * A full decode is the only check that matches what vision backends accept: a
79
+ * middle-elided PNG keeps its signature, its header, and even a well-formed
80
+ * `IEND` trailer, so header sniffing and chunk-framing walks both pass it —
81
+ * while real-world images that decoders render happily do have odd framing, so
82
+ * a structural walk rejects payloads providers accept. Decoding is the ground
83
+ * truth on both sides. Callers on hot paths must cache the verdict.
84
+ */
85
+ export async function imageDecodeFailureReason(image: ImageContent): Promise<string | null> {
86
+ if (!/^[A-Za-z0-9+/]*={0,2}$/.test(image.data)) return "invalid base64 image data";
87
+ const normalizedData = image.data.replace(/=+$/, "");
88
+ const bytes = Buffer.from(image.data, "base64");
89
+ if (bytes.length === 0) return "empty image data";
90
+ if (bytes.toString("base64").replace(/=+$/, "") !== normalizedData) return "invalid base64 image data";
91
+ const detected = parseImageMetadata(bytes);
92
+ if (detected && detected.mimeType !== image.mimeType.toLowerCase()) {
93
+ return `declared ${image.mimeType} but contains ${detected.mimeType}`;
94
+ }
95
+ try {
96
+ // Decode in full (that is what catches a hole in the compressed stream),
97
+ // then terminate into a 1x1 raster's bytes instead of re-encoding at the
98
+ // source dimensions and base64-ing a result nobody reads.
99
+ await new Bun.Image(bytes).resize(DECODE_PROBE_EDGE_PX, DECODE_PROBE_EDGE_PX).png().bytes();
100
+ return null;
101
+ } catch (error) {
102
+ return error instanceof Error ? error.message : String(error);
103
+ }
104
+ }
105
+
106
+ /** Converts an image to PNG, rejecting when the runtime cannot decode or encode it. */
107
+ export async function convertImageToPng(image: ImageContent): Promise<ImageContent> {
108
+ const bytes = Buffer.from(image.data, "base64");
109
+ const data = await new Bun.Image(bytes).png().toBase64();
110
+ return { ...image, data, mimeType: "image/png" };
111
+ }
112
+
113
+ export async function ensureSupportedImageInput(image: ImageContent): Promise<ImageContent | null> {
114
+ if (SUPPORTED_INPUT_IMAGE_MIME_TYPES.has(image.mimeType)) {
115
+ return image;
116
+ }
117
+ try {
118
+ return await convertImageToPng(image);
119
+ } catch {
120
+ return null;
121
+ }
122
+ }
@@ -0,0 +1,92 @@
1
+ import { Container } from "../tui";
2
+ import { Disclosure } from "../components/disclosure";
3
+ import { Text } from "../components/text";
4
+ import { formatDiagnostics } from "../render/render-utils";
5
+ import { getLanguageFromPath, theme } from "../theme";
6
+
7
+ const EMPTY_ROWS: readonly string[] = [];
8
+
9
+ /** One file's worth of late LSP diagnostics, as carried on the transcript message. */
10
+ export interface LateDiagnosticsFile {
11
+ path?: string;
12
+ summary?: string;
13
+ errored?: boolean;
14
+ messages?: string[];
15
+ }
16
+
17
+ /**
18
+ * Renders late LSP diagnostics (arrived after edit/write returned) in the
19
+ * transcript, reusing the same tree renderer the edit/write tools use so the
20
+ * styling stays consistent. Supports the global tool-output expand toggle.
21
+ */
22
+ export class LateDiagnosticsMessageComponent extends Container {
23
+ #toolActivityVisible = true;
24
+ // Controlled expansion delegate with no summary: the collapsed and
25
+ // expanded diagnostic trees are mutually exclusive slots, each formatted
26
+ // lazily on its first render. Only the tool-visibility gate stays here.
27
+ #disclosure: Disclosure | undefined;
28
+ readonly #files: LateDiagnosticsFile[];
29
+
30
+ constructor(files: LateDiagnosticsFile[]) {
31
+ super();
32
+ this.#files = files;
33
+
34
+ this.#rebuild();
35
+ }
36
+
37
+ setExpanded(expanded: boolean): void {
38
+ this.#disclosure?.setExpanded(expanded);
39
+ }
40
+
41
+ setToolActivityVisible(visible: boolean): void {
42
+ this.#toolActivityVisible = visible;
43
+ }
44
+
45
+ override render(width: number): readonly string[] {
46
+ if (!this.#toolActivityVisible) return EMPTY_ROWS;
47
+ return super.render(width);
48
+ }
49
+
50
+ override invalidate(): void {
51
+ this.#rebuild();
52
+ }
53
+
54
+ #rebuild(): void {
55
+ // Preserve controlled state across theme-invalidation rebuilds while
56
+ // leaving both diagnostic trees unmaterialized until their next render.
57
+ const expanded = this.#disclosure?.expanded ?? false;
58
+ this.clear();
59
+ this.#disclosure?.dispose();
60
+ this.#disclosure = undefined;
61
+
62
+ const input = this.#diagnosticInput() ?? { errored: false, summary: "", messages: [] };
63
+
64
+ this.#disclosure = new Disclosure({
65
+ collapsedBody: () => new Text(this.#format(input, false), 1, 0),
66
+ body: () => new Text(this.#format(input, true), 1, 0),
67
+ expanded,
68
+ });
69
+ this.addChild(this.#disclosure);
70
+ }
71
+
72
+ /** Aggregate file payloads; undefined when there is nothing to render. */
73
+ #diagnosticInput(): { errored: boolean; summary: string; messages: string[] } | undefined {
74
+ const messages: string[] = [];
75
+ const summaries: string[] = [];
76
+ let errored = false;
77
+ for (const file of this.#files) {
78
+ if (file.messages?.length) messages.push(...file.messages);
79
+ if (file.summary) summaries.push(file.summary);
80
+ if (file.errored) errored = true;
81
+ }
82
+ if (messages.length === 0) return undefined;
83
+ return { errored, summary: summaries.join(", "), messages };
84
+ }
85
+
86
+ /** Render one branch of the diagnostic tree, reusing the tool renderer. */
87
+ #format(input: { errored: boolean; summary: string; messages: string[] }, expanded: boolean): string {
88
+ return formatDiagnostics(input, expanded, theme, fp => theme.getLangIcon(getLanguageFromPath(fp)), {
89
+ title: "Late diagnostics",
90
+ }).replace(/^\n+/, "");
91
+ }
92
+ }
@@ -0,0 +1,305 @@
1
+ import type { AssistantMessage, ImageContent, MessageAttribution, TextContent } from "@oh-my-pi/pi-ai";
2
+ import * as AIError from "@oh-my-pi/pi-ai/error";
3
+ import { COLLAB_PROMPT_MESSAGE_TYPE } from "@oh-my-pi/pi-wire";
4
+ import type { OutputMeta } from "../tools/output-meta";
5
+ import type { BranchSummaryMessage, CompactionSummaryMessage } from "@oh-my-pi/pi-agent-core/compaction/messages";
6
+
7
+ declare module "@oh-my-pi/pi-agent-core" {
8
+ interface CustomAgentMessages {
9
+ bashExecution: BashExecutionMessage;
10
+ pythonExecution: PythonExecutionMessage;
11
+ custom: CustomMessage;
12
+ hookMessage: HookMessage;
13
+ branchSummary: BranchSummaryMessage;
14
+ compactionSummary: CompactionSummaryMessage;
15
+ fileMention: FileMentionMessage;
16
+ }
17
+ }
18
+ export { COLLAB_PROMPT_MESSAGE_TYPE, type CollabPromptDetails } from "@oh-my-pi/pi-wire";
19
+ export type { BranchSummaryMessage, CompactionSummaryMessage } from "@oh-my-pi/pi-agent-core/compaction/messages";
20
+
21
+ export const SKILL_PROMPT_MESSAGE_TYPE = "skill-prompt";
22
+
23
+ export const LSP_LATE_DIAGNOSTIC_MESSAGE_TYPE = "lsp-late-diagnostic";
24
+
25
+ export const BACKGROUND_TAN_DISPATCH_MESSAGE_TYPE = "background-tan-dispatch";
26
+
27
+ export const PREWALK_PLAN_MESSAGE_TYPE = "prewalk-plan";
28
+
29
+ /** Custom message type for the transient Vibe mode directive. */
30
+ export const VIBE_MODE_CONTEXT_MESSAGE_TYPE = "vibe-mode-context";
31
+
32
+ /** Fallback type for extension-injected messages that omit a custom type. */
33
+ export const DEFAULT_CUSTOM_MESSAGE_TYPE = "custom-message";
34
+
35
+ /** Custom message carrying a coding request delegated by the live voice model. */
36
+ export const LIVE_DELEGATION_MESSAGE_TYPE = "live-delegation";
37
+
38
+ /** Content shape accepted for extension-injected messages. */
39
+ export type CustomMessageContent = string | (TextContent | ImageContent)[];
40
+
41
+ /** Public input accepted by `pi.sendMessage` and `AgentSession.sendCustomMessage`. */
42
+ export type CustomMessagePayload<T = unknown> =
43
+ | string
44
+ | Partial<Pick<CustomMessage<T>, "customType" | "content" | "display" | "details" | "attribution">>;
45
+
46
+ /** Custom message payload after applying runtime defaults. */
47
+ export type NormalizedCustomMessagePayload<T = unknown> = Pick<
48
+ CustomMessage<T>,
49
+ "customType" | "content" | "display" | "details" | "attribution"
50
+ >;
51
+
52
+ /** Details persisted on a `/tan` background-dispatch breadcrumb. */
53
+ export interface BackgroundTanDispatchDetails {
54
+ jobId: string;
55
+ work: string;
56
+ /** Forked clone session file, named `<agentId>.jsonl`; the Agent Hub reads its transcript. */
57
+ sessionFile: string;
58
+ }
59
+
60
+ export interface SkillPromptDetails {
61
+ name: string;
62
+ path: string;
63
+ args?: string;
64
+ /** The draft as submitted with its `/skill:<name>` token in place. A leading
65
+ * token renders as a skill callout, a mid-prompt token as an inline chip in
66
+ * a plain user bubble. Absent on sessions recorded before chips existed. */
67
+ prompt?: string;
68
+ lineCount: number;
69
+ /** Internal: compact label shown for a queued custom message. Optional —
70
+ * non-streaming skill prompts never set it. Stripped from persisted
71
+ * `details` by `SessionManager.appendCustomMessageEntry` via the
72
+ * `INTERNAL_DETAILS_FIELDS` allowlist below. */
73
+ __queueChipText?: string;
74
+ }
75
+
76
+ /** Sentinel value for `AssistantMessage.errorMessage` indicating that the abort
77
+ * was an *expected internal transition* (plan-mode → execution compaction)
78
+ * and must NOT surface as a red "Operation aborted" line. Distinct from
79
+ * `undefined` (default) so user-cancel aborts with no errorMessage still
80
+ * render normally. Persists through SessionManager so history replay
81
+ * branches identically.
82
+ *
83
+ * Consumers: `AgentSession.#handleAgentEvent` (stamper) writes this value;
84
+ * `EventController.#handleMessageEnd`, `AssistantMessageComponent`,
85
+ * `ui-helpers.addMessageToChat` (renderers), `AgentHubOverlayComponent
86
+ * #buildTranscriptLines`, `runPrintMode`, and `AcpAgent#replayAssistantMessage`
87
+ * (fallback error emission) read it via `isSilentAbort`. */
88
+ export const SILENT_ABORT_MARKER = "__omp.silent_abort__";
89
+
90
+ /** Type-guard for silent aborts. Renderers MUST call this helper so structured
91
+ * `errorId` and legacy persisted marker messages stay in lockstep. */
92
+ export function isSilentAbort(message: Pick<AssistantMessage, "errorId" | "errorMessage">): boolean {
93
+ return AIError.is(message.errorId, AIError.Flag.SilentAbort) || message.errorMessage === SILENT_ABORT_MARKER;
94
+ }
95
+
96
+ /** Reason threaded through `AbortController.abort(reason)` when the user aborts
97
+ * the turn with Esc (see `AgentSession.abort`). The agent keeps it on the
98
+ * aborted assistant message's `errorMessage` so queued follow-ups/tool-result
99
+ * placeholders can distinguish a deliberate interrupt from a bare lifecycle
100
+ * abort, but interactive renderers suppress this redundant transcript line. */
101
+ export const USER_INTERRUPT_LABEL = "Interrupted by user";
102
+
103
+ export function isUserInterruptAbort(message: Pick<AssistantMessage, "errorId" | "errorMessage">): boolean {
104
+ return AIError.is(message.errorId, AIError.Flag.UserInterrupt) || message.errorMessage === USER_INTERRUPT_LABEL;
105
+ }
106
+
107
+ export function shouldRenderAbortReason(message: Pick<AssistantMessage, "errorId" | "errorMessage">): boolean {
108
+ return !isSilentAbort(message) && !isUserInterruptAbort(message);
109
+ }
110
+
111
+ /** Sentinel `errorMessage` the agent stamps on any abort that carried no custom
112
+ * reason (bare `abort()`). Renderers treat it as "no specific reason given". */
113
+ export const GENERIC_ABORT_SENTINEL = "Request was aborted";
114
+
115
+ /** Resolve the operator-facing label for an aborted assistant turn. A custom
116
+ * abort reason threaded onto `errorMessage` is returned verbatim; aborts with
117
+ * no threaded reason fall back to the retry-aware generic label. Call
118
+ * `shouldRenderAbortReason` before rendering when user interrupts should stay
119
+ * visually quiet. */
120
+ export function resolveAbortLabel(
121
+ message: Pick<AssistantMessage, "errorId" | "errorMessage">,
122
+ retryAttempt = 0,
123
+ ): string {
124
+ const genericAbort =
125
+ AIError.is(message.errorId, AIError.Flag.Abort) ||
126
+ !message.errorMessage ||
127
+ message.errorMessage === GENERIC_ABORT_SENTINEL ||
128
+ isSilentAbort(message);
129
+ if (!genericAbort) {
130
+ return message.errorMessage!;
131
+ }
132
+ if (retryAttempt > 0) {
133
+ return `Aborted after ${retryAttempt} retry attempt${retryAttempt > 1 ? "s" : ""}`;
134
+ }
135
+ return "Operation aborted";
136
+ }
137
+
138
+ /** True when a persisted or extension-supplied value can be sent as custom-message content. */
139
+ export function isCustomMessageContent(content: unknown): content is CustomMessageContent {
140
+ return typeof content === "string" || Array.isArray(content);
141
+ }
142
+
143
+ function normalizeCustomMessageContent(content: unknown): CustomMessageContent {
144
+ return isCustomMessageContent(content) ? content : "";
145
+ }
146
+
147
+ function normalizeCustomMessageType(customType: unknown): string {
148
+ return typeof customType === "string" && customType.length > 0 ? customType : DEFAULT_CUSTOM_MESSAGE_TYPE;
149
+ }
150
+
151
+ function normalizeCustomMessageAttribution(attribution: unknown): MessageAttribution {
152
+ return attribution === "user" ? "user" : "agent";
153
+ }
154
+
155
+ function isCustomMessagePayloadObject<T>(
156
+ payload: unknown,
157
+ ): payload is Partial<Pick<CustomMessage<T>, "customType" | "content" | "display" | "details" | "attribution">> {
158
+ return payload !== null && typeof payload === "object" && !Array.isArray(payload);
159
+ }
160
+
161
+ /** Normalizes extension-provided custom message input before it reaches session state or disk. */
162
+ export function normalizeCustomMessagePayload<T = unknown>(
163
+ payload: CustomMessagePayload<T> | unknown,
164
+ ): NormalizedCustomMessagePayload<T> {
165
+ if (typeof payload === "string") {
166
+ return {
167
+ customType: DEFAULT_CUSTOM_MESSAGE_TYPE,
168
+ content: payload,
169
+ display: true,
170
+ attribution: "agent",
171
+ };
172
+ }
173
+ if (!isCustomMessagePayloadObject<T>(payload)) {
174
+ const content = payload === undefined || payload === null ? "" : String(payload);
175
+ return {
176
+ customType: DEFAULT_CUSTOM_MESSAGE_TYPE,
177
+ content,
178
+ display: content.length > 0,
179
+ attribution: "agent",
180
+ };
181
+ }
182
+ return {
183
+ customType: normalizeCustomMessageType(payload.customType),
184
+ content: normalizeCustomMessageContent(payload.content),
185
+ display: typeof payload.display === "boolean" ? payload.display : false,
186
+ details: payload.details,
187
+ attribution: normalizeCustomMessageAttribution(payload.attribution),
188
+ };
189
+ }
190
+
191
+ /**
192
+ * Message type for bash executions via the ! command.
193
+ */
194
+ export interface BashExecutionMessage {
195
+ role: "bashExecution";
196
+ command: string;
197
+ output: string;
198
+ exitCode: number | undefined;
199
+ cancelled: boolean;
200
+ truncated: boolean;
201
+ /** Images extracted from terminal graphics in the command's stdout. */
202
+ images?: ImageContent[];
203
+ meta?: OutputMeta;
204
+ timestamp: number;
205
+ /** If true, this message is excluded from LLM context (!! prefix) */
206
+ excludeFromContext?: boolean;
207
+ }
208
+
209
+ /**
210
+ * Message type for user-initiated Python executions via the $ command.
211
+ * Shares the same kernel session as eval's Python backend.
212
+ */
213
+ export interface PythonExecutionMessage {
214
+ role: "pythonExecution";
215
+ code: string;
216
+ output: string;
217
+ exitCode: number | undefined;
218
+ cancelled: boolean;
219
+ truncated: boolean;
220
+ meta?: OutputMeta;
221
+ timestamp: number;
222
+ /** If true, this message is excluded from LLM context ($ prefix) */
223
+ excludeFromContext?: boolean;
224
+ }
225
+
226
+ /**
227
+ * Message type for extension-injected messages via sendMessage().
228
+ */
229
+ export interface CustomMessage<T = unknown> {
230
+ role: "custom";
231
+ customType: string;
232
+ content: CustomMessageContent;
233
+ display: boolean;
234
+ details?: T;
235
+ /** Who initiated this message for billing/attribution semantics. */
236
+ attribution?: MessageAttribution;
237
+ timestamp: number;
238
+ }
239
+
240
+ /**
241
+ * Legacy hook message type (pre-extensions). Kept for session migration.
242
+ */
243
+ export interface HookMessage<T = unknown> {
244
+ role: "hookMessage";
245
+ customType: string;
246
+ content: CustomMessageContent;
247
+ display: boolean;
248
+ details?: T;
249
+ /** Who initiated this message for billing/attribution semantics. */
250
+ attribution?: MessageAttribution;
251
+ timestamp: number;
252
+ }
253
+
254
+ /**
255
+ * Message type for auto-read file mentions via @filepath syntax.
256
+ */
257
+ export interface FileMentionMessage {
258
+ role: "fileMention";
259
+ files: Array<{
260
+ path: string;
261
+ content: string;
262
+ lineCount?: number;
263
+ /** File size in bytes, if known. */
264
+ byteSize?: number;
265
+ /** Why the file contents were omitted from auto-read. */
266
+ skippedReason?: "tooLarge" | "binary";
267
+ image?: ImageContent;
268
+ }>;
269
+ timestamp: number;
270
+ }
271
+
272
+ /** True for a `/skill:<name>` prompt the user invoked directly (attribution `user`), as opposed to an agent/autoload injection. */
273
+ export function isUserInvokedSkillPrompt(message: CustomMessage): boolean {
274
+ return message.customType === SKILL_PROMPT_MESSAGE_TYPE && message.attribution === "user";
275
+ }
276
+
277
+ /**
278
+ * True for a custom message that initiates a user-attributed turn: a directly
279
+ * invoked `/skill:` prompt or a writable-collab peer's prompt. Agent redirects,
280
+ * reminders, and auto-continues are not turn starts.
281
+ */
282
+ export function isUserTurnInitiator(message: CustomMessage): boolean {
283
+ return (
284
+ isUserInvokedSkillPrompt(message) ||
285
+ (message.customType === COLLAB_PROMPT_MESSAGE_TYPE && message.attribution === "user")
286
+ );
287
+ }
288
+
289
+ export type AdvisorSeverity = "nit" | "concern" | "blocker";
290
+
291
+ /** One queued advice note. */
292
+ export interface AdvisorNote {
293
+ note: string;
294
+ severity?: AdvisorSeverity;
295
+ /** Which configured advisor produced this note (omitted for the default advisor). */
296
+ advisor?: string;
297
+ }
298
+
299
+ /** Details payload on the batched `advisor` custom message rendered in the transcript. */
300
+ export interface AdvisorMessageDetails {
301
+ notes: AdvisorNote[];
302
+ }
303
+
304
+ /** Custom message type for supervised process completions. */
305
+ export const LAUNCH_COMPLETION_MESSAGE_TYPE = "launch-completion";
@@ -0,0 +1,65 @@
1
+ /**
2
+ * Agent reactions. A reply whose text opens with an emoji is reacting to the
3
+ * transcript block before it: the emoji is lifted out of the prose and shown as
4
+ * a badge on that block instead. While the reply streams, an incomplete opening
5
+ * run is withheld until it either completes an emoji or proves to be ordinary
6
+ * text, so the emoji never flashes inside the reply.
7
+ *
8
+ * Reactions are derived from the persisted assistant text, never stored, so a
9
+ * rebuilt transcript reproduces them exactly.
10
+ */
11
+ import { type Component } from "../tui";
12
+
13
+ /** A transcript block that can display an agent reaction badge. */
14
+ export interface ReactionTarget {
15
+ setReaction(emoji: string): void;
16
+ }
17
+
18
+ /** Whether `component` accepts a reaction badge. */
19
+ export function isReactionTarget(component: Component | undefined): component is Component & ReactionTarget {
20
+ return component !== undefined && "setReaction" in component && typeof component.setReaction === "function";
21
+ }
22
+
23
+ /** Longest emoji grapheme (UTF-16 units) still worth withholding for. */
24
+ const MAX_REACTION_UNITS = 32;
25
+ /** One emoji grapheme: an RGI sequence, or a bare pictograph with optional VS16. */
26
+ const REACTION_HEAD_RE = /^(?:\p{RGI_Emoji}|\p{Extended_Pictographic}\uFE0F?)/v;
27
+ /** Unicode characters that can extend a preceding emoji code point into a longer grapheme. */
28
+ const EMOJI_EXTENSION_RE = /^(?:[\p{Emoji_Modifier}\u{E0020}-\u{E007F}]|\uFE0F|\u200D|\u20E3)/u;
29
+ /** A still-streaming run that can only ever be an emoji grapheme (plus trailing blanks): pictographs, skin tones, flag letters, tag letters, VS16, ZWJ, keycap. */
30
+ const REACTION_PREFIX_RE =
31
+ /^(?:[\p{Extended_Pictographic}\p{Emoji_Modifier}\p{Regional_Indicator}\u{E0020}-\u{E007F}]|\uFE0F|\u200D|\u20E3)*[ \t]*$/u;
32
+ /** Whitespace immediately following the opening emoji to consume: an inline newline or a run of horizontal spaces/tabs. */
33
+ const NEXT_WHITESPACE_RE = /^[ \t]*\r?\n|^[ \t]+/;
34
+
35
+ export interface ReactionSplit {
36
+ /** The reaction emoji when the text opens with an emoji. */
37
+ emoji?: string;
38
+ /** Text with the opening emoji and any following whitespace removed; the input when there is none. */
39
+ body: string;
40
+ /** True while the text could still grow into an emoji. */
41
+ pending: boolean;
42
+ }
43
+
44
+ /**
45
+ * Split an opening reaction emoji off the front of assistant text, consuming
46
+ * the next whitespace if any. Leading whitespace is tolerated.
47
+ */
48
+ export function splitReaction(text: string): ReactionSplit {
49
+ const start = text.length - text.trimStart().length;
50
+ const head = text.slice(start);
51
+ if (head.length === 0) {
52
+ return { body: text, pending: true };
53
+ }
54
+ const match = head.match(REACTION_HEAD_RE);
55
+ if (match) {
56
+ const rest = head.slice(match[0].length);
57
+ if (head.length <= MAX_REACTION_UNITS && EMOJI_EXTENSION_RE.test(rest)) {
58
+ return { body: text, pending: true };
59
+ }
60
+ const wsMatch = rest.match(NEXT_WHITESPACE_RE);
61
+ const body = rest.slice(wsMatch ? wsMatch[0].length : 0);
62
+ return { emoji: match[0], body, pending: false };
63
+ }
64
+ return { body: text, pending: head.length <= MAX_REACTION_UNITS && REACTION_PREFIX_RE.test(head) };
65
+ }
@@ -0,0 +1,7 @@
1
+ /** Host-owned internal protocol classifier used by compact read cards. */
2
+ export let internalReadTargetPredicate: ((target: string) => boolean) | undefined;
3
+
4
+ /** Supply protocol classification without loading the host router in a renderer. */
5
+ export function setInternalReadTargetPredicate(predicate: (target: string) => boolean): void {
6
+ internalReadTargetPredicate = predicate;
7
+ }