@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,337 @@
1
+ import {
2
+ type AutocompleteItem,
3
+ type AutocompleteProvider,
4
+ CombinedAutocompleteProvider,
5
+ findLeadingSlashCommandStart,
6
+ getKeybindings,
7
+ type SlashCommand,
8
+ } from "../index";
9
+ import { formatKeyHints, type KeybindingsManager } from "../app-keybindings";
10
+ import { applyEmojiCompletion, getEmojiSuggestions, isEmojiPrefix, tryEmojiInlineReplace } from "./emoji-autocomplete";
11
+ import { getGithubRefContext, getGithubRefSuggestions } from "./github-ref-autocomplete";
12
+ import {
13
+ applyInternalUrlCompletion,
14
+ getInternalUrlSuggestions,
15
+ type InternalUrlCallerContext,
16
+ isInternalUrlPrefix,
17
+ } from "./internal-url-autocomplete";
18
+ import {
19
+ applyModelMentionCompletion,
20
+ getModelMentionSuggestions,
21
+ isModelMentionPrefix,
22
+ type ModelMentionCandidateSource,
23
+ } from "./model-mention-autocomplete";
24
+ import { subsequenceMatch, subsequenceScore } from "../autocomplete";
25
+
26
+ let emojiAutocompleteEnabled = true;
27
+
28
+ /** Set the process-wide emoji completion preference. */
29
+ export function setEmojiAutocompleteEnabled(enabled: boolean): void {
30
+ emojiAutocompleteEnabled = enabled;
31
+ }
32
+
33
+ interface PromptActionDefinition {
34
+ id: string;
35
+ label: string;
36
+ description: string;
37
+ keywords: string[];
38
+ execute: (prefix: string) => void;
39
+ }
40
+
41
+ interface PromptActionAutocompleteItem extends AutocompleteItem {
42
+ actionId: string;
43
+ execute: (prefix: string) => void;
44
+ }
45
+
46
+ interface PromptActionAutocompleteOptions {
47
+ commands: SlashCommand[];
48
+ basePath: string;
49
+ /** Usage count per command name for frequency-ranked slash completions. */
50
+ commandUsage?: (name: string) => number;
51
+ /** Read the receiving session at lookup time, following focus and session replacement. */
52
+ internalUrlCaller?: () => InternalUrlCallerContext;
53
+ /** Session-scoped models available for `^` mentions. */
54
+ modelMentions?: ModelMentionCandidateSource;
55
+ keybindings: KeybindingsManager;
56
+ copyCurrentLine: () => void;
57
+ copyPrompt: () => void;
58
+ undo: (prefix: string) => void;
59
+ moveCursorToMessageEnd: () => void;
60
+ moveCursorToMessageStart: () => void;
61
+ moveCursorToLineStart: () => void;
62
+ moveCursorToLineEnd: () => void;
63
+ }
64
+
65
+ function isPromptActionItem(item: AutocompleteItem): item is PromptActionAutocompleteItem {
66
+ return "actionId" in item && "execute" in item && typeof item.execute === "function";
67
+ }
68
+
69
+ function getPromptActionPrefix(textBeforeCursor: string): string | null {
70
+ const hashIndex = textBeforeCursor.lastIndexOf("#");
71
+ if (hashIndex === -1) return null;
72
+
73
+ const query = textBeforeCursor.slice(hashIndex + 1);
74
+ if (/[\s]/.test(query)) {
75
+ return null;
76
+ }
77
+
78
+ return textBeforeCursor.slice(hashIndex);
79
+ }
80
+
81
+ function applyGithubRefCompletion(
82
+ lines: string[],
83
+ cursorLine: number,
84
+ cursorCol: number,
85
+ item: AutocompleteItem,
86
+ prefix: string,
87
+ ): { lines: string[]; cursorLine: number; cursorCol: number } | null {
88
+ if (!getGithubRefContext(prefix)) return null;
89
+ const scheme: "pr" | "issue" | null = item.value.startsWith("pr://")
90
+ ? "pr"
91
+ : item.value.startsWith("issue://")
92
+ ? "issue"
93
+ : null;
94
+ if (!scheme) return { lines, cursorLine, cursorCol };
95
+
96
+ const currentLine = lines[cursorLine] || "";
97
+ const liveContext = getGithubRefContext(currentLine.slice(0, cursorCol));
98
+ if (!liveContext || (liveContext.qualifier && liveContext.qualifier !== scheme)) {
99
+ return { lines, cursorLine, cursorCol };
100
+ }
101
+
102
+ return applyInternalUrlCompletion(
103
+ lines,
104
+ cursorLine,
105
+ cursorCol,
106
+ { ...item, value: `${scheme}://${liveContext.number}` },
107
+ liveContext.prefix,
108
+ );
109
+ }
110
+
111
+ export class PromptActionAutocompleteProvider implements AutocompleteProvider {
112
+ #commands: SlashCommand[];
113
+ #baseProvider: CombinedAutocompleteProvider;
114
+ #actions: PromptActionDefinition[];
115
+ #internalUrlCaller: () => InternalUrlCallerContext;
116
+ #modelMentions: ModelMentionCandidateSource | undefined;
117
+
118
+ constructor(
119
+ commands: SlashCommand[],
120
+ basePath: string,
121
+ actions: PromptActionDefinition[],
122
+ commandUsage?: (name: string) => number,
123
+ internalUrlCaller?: () => InternalUrlCallerContext,
124
+ modelMentions?: ModelMentionCandidateSource,
125
+ ) {
126
+ this.#commands = commands;
127
+ this.#baseProvider = new CombinedAutocompleteProvider(commands, basePath, { commandUsage });
128
+ this.#internalUrlCaller = internalUrlCaller ?? (() => ({ cwd: basePath }));
129
+ this.#modelMentions = modelMentions;
130
+ this.#actions = actions;
131
+ }
132
+
133
+ async getSuggestions(
134
+ lines: string[],
135
+ cursorLine: number,
136
+ cursorCol: number,
137
+ signal?: AbortSignal,
138
+ ): Promise<{ items: AutocompleteItem[]; prefix: string } | null> {
139
+ if (signal?.aborted) return null;
140
+ const currentLine = lines[cursorLine] || "";
141
+ const textBeforeCursor = currentLine.slice(0, cursorCol);
142
+ const leadingSlashStart = findLeadingSlashCommandStart(textBeforeCursor);
143
+ const hasPromptTextBeforeCursorLine = lines.slice(0, cursorLine).some(line => (line || "").trim() !== "");
144
+ const commandText =
145
+ leadingSlashStart !== null && !hasPromptTextBeforeCursorLine
146
+ ? textBeforeCursor.slice(leadingSlashStart)
147
+ : null;
148
+ const spaceIndex = commandText?.indexOf(" ") ?? -1;
149
+ if (commandText !== null && spaceIndex !== -1) {
150
+ const commandName = commandText.slice(1, spaceIndex);
151
+ const command = this.#commands.find(cmd => cmd.name === commandName || cmd.aliases?.includes(commandName));
152
+ if (command && (!("allowArgs" in command) || command.allowArgs !== false)) {
153
+ const argumentSuggestions = await this.#baseProvider.getSuggestions(lines, cursorLine, cursorCol, signal);
154
+ if (argumentSuggestions) return argumentSuggestions;
155
+ const modelMentionSuggestions = getModelMentionSuggestions(textBeforeCursor, this.#modelMentions);
156
+ if (modelMentionSuggestions) return modelMentionSuggestions;
157
+ // No slash-argument completion for this input: preserve numeric
158
+ // GitHub references and internal URLs while keeping prompt-action
159
+ // tokens such as `#copy` literal.
160
+ const githubRefSuggestions = getGithubRefSuggestions(textBeforeCursor);
161
+ if (githubRefSuggestions) return githubRefSuggestions;
162
+ return getInternalUrlSuggestions(textBeforeCursor, undefined, signal, this.#internalUrlCaller);
163
+ }
164
+ }
165
+
166
+ const githubRefSuggestions = getGithubRefSuggestions(textBeforeCursor);
167
+ if (githubRefSuggestions) return githubRefSuggestions;
168
+ const promptActionPrefix = getPromptActionPrefix(textBeforeCursor);
169
+ if (promptActionPrefix) {
170
+ const query = promptActionPrefix.slice(1).toLowerCase();
171
+ const items = this.#actions
172
+ .map(action => {
173
+ const searchable = [action.label, action.description, ...action.keywords].join(" ").toLowerCase();
174
+ if (!subsequenceMatch(query, searchable)) return null;
175
+ return {
176
+ value: action.label,
177
+ label: action.label,
178
+ description: action.description,
179
+ actionId: action.id,
180
+ execute: action.execute,
181
+ score: subsequenceScore(query, searchable),
182
+ } satisfies PromptActionAutocompleteItem & { score: number };
183
+ })
184
+ .filter(item => item !== null)
185
+ .sort((a, b) => b.score - a.score)
186
+ .map(({ score: _score, ...item }) => item);
187
+ if (items.length > 0) {
188
+ return { items, prefix: promptActionPrefix };
189
+ }
190
+ }
191
+
192
+ const modelMentionSuggestions = getModelMentionSuggestions(textBeforeCursor, this.#modelMentions);
193
+ if (modelMentionSuggestions) return modelMentionSuggestions;
194
+
195
+ const urlSuggestions = await getInternalUrlSuggestions(
196
+ textBeforeCursor,
197
+ undefined,
198
+ signal,
199
+ this.#internalUrlCaller,
200
+ );
201
+ if (urlSuggestions) return urlSuggestions;
202
+
203
+ if (emojiAutocompleteEnabled) {
204
+ const emojiSuggestions = getEmojiSuggestions(textBeforeCursor);
205
+ if (emojiSuggestions) return emojiSuggestions;
206
+ }
207
+
208
+ return this.#baseProvider.getSuggestions(lines, cursorLine, cursorCol, signal);
209
+ }
210
+
211
+ applyCompletion(
212
+ lines: string[],
213
+ cursorLine: number,
214
+ cursorCol: number,
215
+ item: AutocompleteItem,
216
+ prefix: string,
217
+ ): {
218
+ lines: string[];
219
+ cursorLine: number;
220
+ cursorCol: number;
221
+ onApplied?: () => void;
222
+ } {
223
+ const githubRefCompletion = applyGithubRefCompletion(lines, cursorLine, cursorCol, item, prefix);
224
+ if (githubRefCompletion) return githubRefCompletion;
225
+ if (prefix.startsWith("#") && isPromptActionItem(item)) {
226
+ if (item.actionId === "undo") {
227
+ return {
228
+ lines,
229
+ cursorLine,
230
+ cursorCol,
231
+ onApplied: () => item.execute(prefix),
232
+ };
233
+ }
234
+ const currentLine = lines[cursorLine] || "";
235
+ const beforePrefix = currentLine.slice(0, cursorCol - prefix.length);
236
+ const afterCursor = currentLine.slice(cursorCol);
237
+ const newLines = [...lines];
238
+ newLines[cursorLine] = beforePrefix + afterCursor;
239
+ return {
240
+ lines: newLines,
241
+ cursorLine,
242
+ cursorCol: beforePrefix.length,
243
+ onApplied: () => item.execute(prefix),
244
+ };
245
+ }
246
+
247
+ if (isModelMentionPrefix(prefix)) {
248
+ return applyModelMentionCompletion(lines, cursorLine, cursorCol, item, prefix);
249
+ }
250
+
251
+ if (isInternalUrlPrefix(prefix)) {
252
+ return applyInternalUrlCompletion(lines, cursorLine, cursorCol, item, prefix);
253
+ }
254
+
255
+ if (isEmojiPrefix(prefix)) {
256
+ return applyEmojiCompletion(lines, cursorLine, cursorCol, item, prefix);
257
+ }
258
+ return this.#baseProvider.applyCompletion(lines, cursorLine, cursorCol, item, prefix);
259
+ }
260
+
261
+ getInlineHint(lines: string[], cursorLine: number, cursorCol: number): string | null {
262
+ return this.#baseProvider.getInlineHint?.(lines, cursorLine, cursorCol) ?? null;
263
+ }
264
+ trySyncSlashCompletion(textBeforeCursor: string): { items: AutocompleteItem[]; prefix: string } | null {
265
+ return this.#baseProvider.trySyncSlashCompletion?.(textBeforeCursor) ?? null;
266
+ }
267
+ trySyncInlineReplace(textBeforeCursor: string): { replaceLen: number; insert: string } | null {
268
+ if (!emojiAutocompleteEnabled) return null;
269
+ return tryEmojiInlineReplace(textBeforeCursor);
270
+ }
271
+ }
272
+
273
+ export function createPromptActionAutocompleteProvider(
274
+ options: PromptActionAutocompleteOptions,
275
+ ): PromptActionAutocompleteProvider {
276
+ const editorKeybindings = getKeybindings();
277
+ const actions: PromptActionDefinition[] = [
278
+ {
279
+ id: "copy-line",
280
+ label: "Copy current line",
281
+ description: formatKeyHints(options.keybindings.getKeys("app.clipboard.copyLine")),
282
+ keywords: ["copy", "line", "clipboard", "current"],
283
+ execute: options.copyCurrentLine,
284
+ },
285
+ {
286
+ id: "copy-prompt",
287
+ label: "Copy whole prompt",
288
+ description: formatKeyHints(options.keybindings.getKeys("app.clipboard.copyPrompt")),
289
+ keywords: ["copy", "prompt", "clipboard", "message"],
290
+ execute: options.copyPrompt,
291
+ },
292
+ {
293
+ id: "undo",
294
+ label: "Undo",
295
+ description: formatKeyHints(editorKeybindings.getKeys("tui.editor.undo")),
296
+ keywords: ["undo", "revert", "edit", "history"],
297
+ execute: options.undo,
298
+ },
299
+ {
300
+ id: "cursor-message-end",
301
+ label: "Move cursor to message end",
302
+ description: "Current message",
303
+ keywords: ["move", "cursor", "message", "end", "prompt", "last", "bottom"],
304
+ execute: options.moveCursorToMessageEnd,
305
+ },
306
+ {
307
+ id: "cursor-message-start",
308
+ label: "Move cursor to message start",
309
+ description: "Current message",
310
+ keywords: ["move", "cursor", "message", "start", "beginning", "prompt", "first", "top"],
311
+ execute: options.moveCursorToMessageStart,
312
+ },
313
+ {
314
+ id: "cursor-line-start",
315
+ label: "Move cursor to line start",
316
+ description: formatKeyHints(editorKeybindings.getKeys("tui.editor.cursorLineStart")),
317
+ keywords: ["move", "cursor", "line", "start", "beginning", "home"],
318
+ execute: options.moveCursorToLineStart,
319
+ },
320
+ {
321
+ id: "cursor-line-end",
322
+ label: "Move cursor to line end",
323
+ description: formatKeyHints(editorKeybindings.getKeys("tui.editor.cursorLineEnd")),
324
+ keywords: ["move", "cursor", "line", "end"],
325
+ execute: options.moveCursorToLineEnd,
326
+ },
327
+ ];
328
+
329
+ return new PromptActionAutocompleteProvider(
330
+ options.commands,
331
+ options.basePath,
332
+ actions,
333
+ options.commandUsage,
334
+ options.internalUrlCaller,
335
+ options.modelMentions,
336
+ );
337
+ }
@@ -0,0 +1,132 @@
1
+ const QUEUE_PREFIXES: readonly string[] = ["->", "=>"];
2
+ /** Prefix matcher shared by queue-list parsing and editor highlighting. */
3
+ export const QUEUE_LIST_MARKER_RE = /^([\t ]*)(\d+|[A-Za-z]+)([.)])(?=[\t ]|$)/;
4
+ const CANONICAL_ROMAN_RE = /^(?=[MDCLXVI])M{0,3}(?:CM|CD|D?C{0,3})(?:XC|XL|L?X{0,3})(?:IX|IV|V?I{0,3})$/i;
5
+
6
+ interface EnumeratedItem {
7
+ line: number;
8
+ indent: string;
9
+ marker: string;
10
+ punctuation: string;
11
+ content: string;
12
+ }
13
+
14
+ interface EnumeratedList {
15
+ source: string;
16
+ lines: string[];
17
+ items: EnumeratedItem[];
18
+ }
19
+
20
+ /** Extract the message body from the `->` / `=>` yield-queue shorthand. */
21
+ export function parseQueueShorthand(text: string): string | undefined {
22
+ const prefix = QUEUE_PREFIXES.find(candidate => text.startsWith(candidate));
23
+ return prefix ? text.slice(prefix.length).trim() : undefined;
24
+ }
25
+
26
+ function parseEnumeratedItem(line: string, lineIndex: number): EnumeratedItem | undefined {
27
+ const match = QUEUE_LIST_MARKER_RE.exec(line);
28
+ if (!match) return undefined;
29
+ const [matched, indent, marker, punctuation] = match;
30
+ if (indent === undefined || marker === undefined || punctuation === undefined) return undefined;
31
+ return { line: lineIndex, indent, marker, punctuation, content: line.slice(matched.length).trimStart() };
32
+ }
33
+
34
+ function decodeDecimal(marker: string): number | undefined {
35
+ if (!/^\d+$/.test(marker)) return undefined;
36
+ const value = Number(marker);
37
+ return Number.isSafeInteger(value) ? value : undefined;
38
+ }
39
+
40
+ function decodeRoman(marker: string): number | undefined {
41
+ if (!CANONICAL_ROMAN_RE.test(marker)) return undefined;
42
+ const values: Readonly<Record<string, number>> = {
43
+ I: 1,
44
+ V: 5,
45
+ X: 10,
46
+ L: 50,
47
+ C: 100,
48
+ D: 500,
49
+ M: 1000,
50
+ };
51
+ const upper = marker.toUpperCase();
52
+ let value = 0;
53
+ for (let index = 0; index < upper.length; index++) {
54
+ const current = values[upper[index] ?? ""];
55
+ if (current === undefined) return undefined;
56
+ const next = values[upper[index + 1] ?? ""] ?? 0;
57
+ value += current < next ? -current : current;
58
+ }
59
+ return value;
60
+ }
61
+
62
+ function decodeAlpha(marker: string): number | undefined {
63
+ if (!/^[A-Za-z]+$/.test(marker)) return undefined;
64
+ let value = 0;
65
+ for (const char of marker.toUpperCase()) {
66
+ value = value * 26 + char.charCodeAt(0) - 64;
67
+ if (!Number.isSafeInteger(value)) return undefined;
68
+ }
69
+ return value;
70
+ }
71
+
72
+ function isSequential(markers: readonly string[], decode: (marker: string) => number | undefined): boolean {
73
+ let previous = decode(markers[0] ?? "");
74
+ if (previous === undefined) return false;
75
+ for (let index = 1; index < markers.length; index++) {
76
+ const current = decode(markers[index] ?? "");
77
+ if (current === undefined || current !== previous + 1) return false;
78
+ previous = current;
79
+ }
80
+ return true;
81
+ }
82
+
83
+ function isEnumeratedSequence(items: readonly EnumeratedItem[]): boolean {
84
+ const markers = items.map(item => item.marker);
85
+ if (markers.every(marker => /^\d+$/.test(marker))) return isSequential(markers, decodeDecimal);
86
+ if (
87
+ !markers.every(marker => marker === marker.toUpperCase()) &&
88
+ !markers.every(marker => marker === marker.toLowerCase())
89
+ ) {
90
+ return false;
91
+ }
92
+ return isSequential(markers, decodeRoman) || isSequential(markers, decodeAlpha);
93
+ }
94
+
95
+ function parseEnumeratedList(text: string): EnumeratedList | undefined {
96
+ const source = text.trim();
97
+ if (!source) return undefined;
98
+ const lines = source.split(/\r?\n/);
99
+ const first = parseEnumeratedItem(lines[0] ?? "", 0);
100
+ if (!first) return undefined;
101
+
102
+ const items = [first];
103
+ for (let lineIndex = 1; lineIndex < lines.length; lineIndex++) {
104
+ const item = parseEnumeratedItem(lines[lineIndex] ?? "", lineIndex);
105
+ if (item?.indent === first.indent) items.push(item);
106
+ }
107
+ if (items.length < 2 || items.some(item => item.punctuation !== first.punctuation) || !isEnumeratedSequence(items)) {
108
+ return undefined;
109
+ }
110
+ return { source, lines, items };
111
+ }
112
+
113
+ /** Whether text currently forms a sequential queue list, including an unfinished trailing item. */
114
+ export function isQueuedMessageList(text: string): boolean {
115
+ return parseEnumeratedList(text) !== undefined;
116
+ }
117
+
118
+ /** Split a sequential numeric, Roman-numeral, or alphabetic list into queue entries. */
119
+ export function splitQueuedMessages(text: string): string[] {
120
+ const list = parseEnumeratedList(text);
121
+ if (!list) {
122
+ const source = text.trim();
123
+ return source ? [source] : [];
124
+ }
125
+
126
+ const messages = list.items.map((item, index) => {
127
+ const nextLine = list.items[index + 1]?.line ?? list.lines.length;
128
+ return [item.content, ...list.lines.slice(item.line + 1, nextLine)].join("\n").trim();
129
+ });
130
+ while (messages.at(-1) === "") messages.pop();
131
+ return messages.length > 0 && messages.every(Boolean) ? messages : [list.source];
132
+ }
@@ -0,0 +1,36 @@
1
+ /**
2
+ * One `/skill:<name>` token delimited by whitespace or line edges. Group 1 is
3
+ * the leading delimiter (empty at line start), group 2 the bare skill name.
4
+ * Global so callers can walk every token; reset `lastIndex` before reuse.
5
+ */
6
+ export const SKILL_TOKEN_RE = /(^|\s)\/skill:([^\s/]+)(?=\s|$)/g;
7
+
8
+ /**
9
+ * Whether the (already left-trimmed) draft begins with a TUI local-execution
10
+ * sigil that downstream branches consume verbatim.
11
+ */
12
+ function startsWithLocalExecutionPrefix(trimmedStart: string): boolean {
13
+ if (trimmedStart.startsWith("!")) return true;
14
+ if (trimmedStart.charCodeAt(0) !== 36 /* $ */) return false;
15
+ if (trimmedStart.charCodeAt(1) === 123 /* { */) return false;
16
+ const sigilLength = trimmedStart.charCodeAt(1) === 36 /* $ */ ? 2 : 1;
17
+ const next = trimmedStart.charCodeAt(sigilLength);
18
+ if (Number.isNaN(next)) return true;
19
+ return next === 32 /* space */ || next === 9 /* tab */ || next === 10 /* LF */ || next === 13; /* CR */
20
+ }
21
+
22
+ /**
23
+ * Whether `/skill:<name>` tokens in `text` are invocations rather than content
24
+ * belonging to another slash command or local-execution sigil.
25
+ */
26
+ export function allowsSkillTokens(text: string): boolean {
27
+ const trimmedStart = text.trimStart();
28
+ if (trimmedStart.startsWith("/skill:")) return true;
29
+ if (trimmedStart.startsWith("/")) return false;
30
+ return !startsWithLocalExecutionPrefix(trimmedStart);
31
+ }
32
+
33
+ /** Whether model mentions may collapse in this draft; local execution consumes its body verbatim. */
34
+ export function allowsModelMentions(text: string): boolean {
35
+ return !startsWithLocalExecutionPrefix(text.trimStart());
36
+ }
@@ -0,0 +1,27 @@
1
+ Tired of typing "keep going"? Just send a '.'
2
+ You can /btw to ask a side question
3
+ Use /tan to fork the current conversation into a background agent
4
+ With default keybindings, Ctrl+D deletes the character under the cursor instead of quitting your draft — see /hotkeys for your exit key
5
+ Find out which model you emotionally abuse the most with `omp stats`
6
+ Try task isolation to create CoW worktrees
7
+ Need a cheap nested model call? Use `completion(x...)`. Have a big batch of tasks? Ask clanker to use it!
8
+ Spaghetti code? Try complaining with /omfg
9
+ Did you know? Each kitty/tmux/cmux/zellij/wezterm split keeps its own session — `omp -c` resumes the right one
10
+ Drop the word `ultrathink` in your message for harder multi-step reasoning — watch it glow rainbow as you type
11
+ Say `orchestrate` in your message to drive a multi-phase task with parallel subagents — watch it glow as you type
12
+ Say `workflowz` in your message to drive the task with parallel subagents in eval — watch it glow as you type
13
+ Log in to several accounts of the same provider — `/login` again — and omp load-balances across them automatically
14
+ Run `omp auth-broker serve` once and every machine pulls live tokens over the wire — refresh keys never leave the host; `omp auth-gateway` fronts it as a drop-in proxy any OpenAI-compatible client can hit
15
+ Press alt+p (or /switch) to switch provider, and ctrl+p to cycle role models smol -> slow -> etc
16
+ Press ctrl+r to search your prompt history and reuse a past message
17
+ `/force read` pins the next turn to one specific tool when the model keeps reaching for the wrong one
18
+ `/copy code` grabs the last code block to your clipboard — `/copy cmd` grabs the last shell/python command
19
+ `/shake` rips heavy tool results out of context to reclaim tokens without a full /compact — `/shake images` drops just images
20
+ Pair up live: `/collab` shares your session through an end-to-end encrypted relay link — a teammate runs `/join <link>` to watch tool calls stream and prompt the agent from their own omp
21
+ Press ← ← to drill into a running or finished agent and inspect its tool calls and transcript
22
+ Hit a Codex rate limit? `/usage reset` spends a saved reset credit to immediately restore your quota
23
+ No native tool_calling? Inference provider botches parsing them? `PI_DIALECT=glm|kimi|anthropic…` rolls it locally for them!
24
+ Turn on `/advisor` to attach a second model that reviews every turn and quietly injects advice
25
+ Try starting your prompt with a ->, and writing a list (1. Do X, 2. Do Y)
26
+ Press shift+tab to cycle through reasoning effort levels
27
+ Lint/type errors piling up? `omp cleanse` (or /cleanse right here) hunts project diagnostics and fixes them with parallel subagents — esc cancels
@@ -0,0 +1,29 @@
1
+ export interface ToolsMarkdownBindings {
2
+ tools: ReadonlyArray<{ description: string; name: string }>;
3
+ /** Tools mounted under `xd://` URLs, listed after the active set. */
4
+ xdevTools?: ReadonlyArray<{ name: string; summary: string }>;
5
+ }
6
+
7
+ function escapeTableCell(value: string): string {
8
+ return value
9
+ .replace(/\|/g, "\\|")
10
+ .replace(/\r?\n+/g, " ")
11
+ .trim();
12
+ }
13
+
14
+ export function buildToolsMarkdown(bindings: ToolsMarkdownBindings): string {
15
+ if (bindings.tools.length === 0 && !bindings.xdevTools?.length) {
16
+ return "No tools are currently visible to the agent.";
17
+ }
18
+
19
+ const rows: string[] = [];
20
+ for (const tool of bindings.tools) {
21
+ const description = escapeTableCell(tool.description) || "No description provided.";
22
+ rows.push(`| \`${tool.name}\` | ${description} |`);
23
+ }
24
+ for (const mounted of bindings.xdevTools ?? []) {
25
+ rows.push(`| \`xd://${mounted.name}\` | ${escapeTableCell(mounted.summary) || "No description provided."} |`);
26
+ }
27
+
28
+ return ["| Tool | Description |", "|------|-------------|", ...rows].join("\n");
29
+ }
@@ -0,0 +1,26 @@
1
+ import { createGradientHighlighter, type KeywordHighlighter } from "./gradient-highlight";
2
+ import { magicKeywordRegex } from "./magic-keyword-boundary";
3
+ import { keywordInProse } from "./markdown-prose";
4
+
5
+ const ULTRATHINK_WORD = magicKeywordRegex("ultrathink");
6
+
7
+ /**
8
+ * Whether `text` contains the standalone keyword "ultrathink" (lowercase,
9
+ * prose-delimited) in prose — never inside a code block, inline code span,
10
+ * or XML/HTML section.
11
+ */
12
+ export function containsUltrathink(text: string): boolean {
13
+ return keywordInProse(text, ULTRATHINK_WORD);
14
+ }
15
+
16
+ /**
17
+ * Rainbow-highlight every standalone "ultrathink" in `text` for editor display.
18
+ * Sweeps red→violet (hue 0..330), stopping short of the wrap back to red so the
19
+ * gradient resolves smoothly regardless of casing or match length.
20
+ */
21
+ export const highlightUltrathink: KeywordHighlighter = createGradientHighlighter({
22
+ probe: /ultrathink/,
23
+ highlight: magicKeywordRegex("ultrathink", "g"),
24
+ stops: 14,
25
+ hue: t => t * 330,
26
+ });
@@ -0,0 +1,99 @@
1
+ import { resolveUsedFraction, type UsageLimit } from "@oh-my-pi/pi-ai/usage";
2
+
3
+ /**
4
+ * Formatting for usage limits that carry an absolute amount but no fraction,
5
+ * shared by the `/usage` TUI report and the fullscreen dashboard so both
6
+ * surfaces agree on what a bucket is worth.
7
+ *
8
+ * Providers report one of two one-sided shapes: spend-to-date with no
9
+ * allowance (`used` only), or a prepaid balance with no total (`remaining`
10
+ * only). Neither can fill a quota bar, so each renders as text instead.
11
+ */
12
+ function isAbsoluteUnit(limit: UsageLimit): boolean {
13
+ return limit.amount.unit !== "percent" && limit.amount.unit !== "unknown";
14
+ }
15
+
16
+ export function isUsedOnlyAbsoluteAmount(limit: UsageLimit): boolean {
17
+ const amount = limit.amount;
18
+ return (
19
+ isAbsoluteUnit(limit) &&
20
+ amount.used !== undefined &&
21
+ Number.isFinite(amount.used) &&
22
+ amount.limit === undefined &&
23
+ amount.remaining === undefined &&
24
+ resolveUsedFraction(limit) === undefined
25
+ );
26
+ }
27
+
28
+ export function isRemainingOnlyAbsoluteAmount(limit: UsageLimit): boolean {
29
+ const amount = limit.amount;
30
+ return (
31
+ isAbsoluteUnit(limit) &&
32
+ amount.remaining !== undefined &&
33
+ Number.isFinite(amount.remaining) &&
34
+ amount.limit === undefined &&
35
+ amount.used === undefined &&
36
+ resolveUsedFraction(limit) === undefined
37
+ );
38
+ }
39
+
40
+ function formatQuantity(value: number, unit: UsageLimit["amount"]["unit"], suffix: string): string {
41
+ if (unit === "usd") return `$${value.toFixed(2)} ${suffix}`;
42
+ const formatted = new Intl.NumberFormat("en-US", { notation: "compact", maximumFractionDigits: 1 }).format(value);
43
+ return `${formatted} ${unit} ${suffix}`;
44
+ }
45
+
46
+ /**
47
+ * Total the prepaid headroom a set of limits actually represents.
48
+ *
49
+ * A `scope.shared` limit is one account-wide pool observed once per stored
50
+ * credential, so N keys on the same account yield N identical rows that must
51
+ * collapse to a single value — summing them would claim several times the
52
+ * credits a single request can draw on. Limits without the flag are genuinely
53
+ * per-account and do add up. Returns `undefined` unless every limit is
54
+ * remaining-only and agrees on a unit, so mixed buckets fall through to the
55
+ * caller's own handling.
56
+ */
57
+ export function totalRemainingOnly(
58
+ limits: readonly UsageLimit[],
59
+ ): { value: number; unit: UsageLimit["amount"]["unit"] } | undefined {
60
+ const first = limits[0];
61
+ if (first === undefined || !limits.every(isRemainingOnlyAbsoluteAmount)) return undefined;
62
+ const unit = first.amount.unit;
63
+ if (!limits.every(limit => limit.amount.unit === unit)) return undefined;
64
+
65
+ let total = 0;
66
+ let sharedMax: number | undefined;
67
+ for (const limit of limits) {
68
+ const remaining = limit.amount.remaining ?? 0;
69
+ if (limit.scope.shared === true) {
70
+ sharedMax = sharedMax === undefined ? remaining : Math.max(sharedMax, remaining);
71
+ continue;
72
+ }
73
+ total += remaining;
74
+ }
75
+ return { value: total + (sharedMax ?? 0), unit };
76
+ }
77
+
78
+ /** `"100 credits left"` for a bucket of remaining-only limits, else `undefined`. */
79
+ export function formatRemainingOnlyTotal(limits: readonly UsageLimit[]): string | undefined {
80
+ const total = totalRemainingOnly(limits);
81
+ return total === undefined ? undefined : formatQuantity(total.value, total.unit, "left");
82
+ }
83
+
84
+ /**
85
+ * Text for a bucket no quota bar can draw: spend-to-date or prepaid headroom.
86
+ * Used-only limits report the worst (highest) spend; remaining-only limits go
87
+ * through {@link totalRemainingOnly} so shared pools are not double-counted.
88
+ */
89
+ export function formatAbsoluteOnlyAmount(limits: readonly UsageLimit[]): string | undefined {
90
+ const first = limits[0];
91
+ if (first === undefined) return undefined;
92
+ if (limits.every(isUsedOnlyAbsoluteAmount)) {
93
+ const unit = first.amount.unit;
94
+ if (!limits.every(limit => limit.amount.unit === unit)) return undefined;
95
+ const used = limits.reduce((max, limit) => Math.max(max, limit.amount.used ?? 0), 0);
96
+ return formatQuantity(used, unit, "used");
97
+ }
98
+ return formatRemainingOnlyTotal(limits);
99
+ }