@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.
- package/CHANGELOG.md +29 -0
- package/README.md +43 -0
- package/dist/types/app-keybindings.d.ts +395 -0
- package/dist/types/apps/autoresearch-dashboard.d.ts +43 -0
- package/dist/types/apps/autoresearch-data.d.ts +15 -0
- package/dist/types/apps/cleanse-board.d.ts +66 -0
- package/dist/types/apps/cleanse-picker.d.ts +23 -0
- package/dist/types/apps/debug/log-formatting.d.ts +6 -0
- package/dist/types/apps/debug/log-viewer.d.ts +81 -0
- package/dist/types/apps/debug/protocol-probe.d.ts +42 -0
- package/dist/types/apps/debug/raw-sse-buffer.d.ts +58 -0
- package/dist/types/apps/debug/raw-sse.d.ts +26 -0
- package/dist/types/apps/debug/terminal-info.d.ts +34 -0
- package/dist/types/apps/debug/viewer-frame.d.ts +52 -0
- package/dist/types/apps/git/avatar.d.ts +9 -0
- package/dist/types/apps/git/colors.d.ts +49 -0
- package/dist/types/apps/git/diff-pane.d.ts +188 -0
- package/dist/types/apps/git/git-tui.d.ts +66 -0
- package/dist/types/apps/git/sidebar.d.ts +149 -0
- package/dist/types/apps/git/state.d.ts +117 -0
- package/dist/types/apps/if-bench-board.d.ts +75 -0
- package/dist/types/apps/live-visualizer.d.ts +33 -0
- package/dist/types/apps/ps-data.d.ts +51 -0
- package/dist/types/apps/ps-top.d.ts +33 -0
- package/dist/types/apps/session-picker.d.ts +26 -0
- package/dist/types/apps/setup-model-picker.d.ts +13 -0
- package/dist/types/apps/standalone-picker.d.ts +42 -0
- package/dist/types/autocomplete.d.ts +4 -0
- package/dist/types/chat/advisor-message.d.ts +11 -0
- package/dist/types/chat/assistant-message.d.ts +106 -0
- package/dist/types/chat/background-tan-message.d.ts +9 -0
- package/dist/types/chat/bash-execution.d.ts +47 -0
- package/dist/types/chat/cache-invalidation-marker.d.ts +50 -0
- package/dist/types/chat/chat-transcript-builder.d.ts +50 -0
- package/dist/types/chat/collab-prompt-message.d.ts +10 -0
- package/dist/types/chat/compaction-summary-message.d.ts +54 -0
- package/dist/types/chat/custom-message.d.ts +10 -0
- package/dist/types/chat/display-preferences.d.ts +13 -0
- package/dist/types/chat/eval-execution.d.ts +29 -0
- package/dist/types/chat/execution-shared.d.ts +51 -0
- package/dist/types/chat/extension-types.d.ts +28 -0
- package/dist/types/chat/hook-message.d.ts +10 -0
- package/dist/types/chat/image-loading.d.ts +46 -0
- package/dist/types/chat/late-diagnostics-message.d.ts +21 -0
- package/dist/types/chat/messages.d.ts +189 -0
- package/dist/types/chat/reaction.d.ts +30 -0
- package/dist/types/chat/read-target.d.ts +4 -0
- package/dist/types/chat/read-tool-group.d.ts +67 -0
- package/dist/types/chat/served-model-marker.d.ts +47 -0
- package/dist/types/chat/skill-message.d.ts +33 -0
- package/dist/types/chat/skill-title-input.d.ts +14 -0
- package/dist/types/chat/stripped-tool-calls-placeholder.d.ts +12 -0
- package/dist/types/chat/thinking-display.d.ts +12 -0
- package/dist/types/chat/todo-reminder.d.ts +13 -0
- package/dist/types/chat/tool-execution.d.ts +138 -0
- package/dist/types/chat/transcript-browser.d.ts +93 -0
- package/dist/types/chat/transcript-entry.d.ts +45 -0
- package/dist/types/chat/transcript-outline.d.ts +86 -0
- package/dist/types/chat/transcript-render-helpers.d.ts +92 -0
- package/dist/types/chat/ttsr-notification.d.ts +23 -0
- package/dist/types/chat/user-message.d.ts +52 -0
- package/dist/types/chrome/chat-block.d.ts +64 -0
- package/dist/types/chrome/collab-qrcode.d.ts +28 -0
- package/dist/types/chrome/context-thresholds.d.ts +10 -0
- package/dist/types/chrome/countdown-timer.d.ts +14 -0
- package/dist/types/chrome/diff.d.ts +14 -0
- package/dist/types/chrome/dynamic-border.d.ts +16 -0
- package/dist/types/chrome/error-block.d.ts +17 -0
- package/dist/types/chrome/form-theme.d.ts +3 -0
- package/dist/types/chrome/format.d.ts +12 -0
- package/dist/types/chrome/index.d.ts +20 -0
- package/dist/types/chrome/keybinding-hints.d.ts +40 -0
- package/dist/types/chrome/live-board.d.ts +23 -0
- package/dist/types/chrome/local-date.d.ts +4 -0
- package/dist/types/chrome/message-divider.d.ts +22 -0
- package/dist/types/chrome/message-frame.d.ts +52 -0
- package/dist/types/chrome/message-notice.d.ts +35 -0
- package/dist/types/chrome/overlay-box.d.ts +74 -0
- package/dist/types/chrome/qrcode.d.ts +48 -0
- package/dist/types/chrome/segment-track.d.ts +27 -0
- package/dist/types/chrome/select-list-mouse-routing.d.ts +4 -0
- package/dist/types/chrome/selector-helpers.d.ts +52 -0
- package/dist/types/chrome/shared.d.ts +5 -0
- package/dist/types/chrome/streaming-panel.d.ts +19 -0
- package/dist/types/chrome/tool-activity.d.ts +17 -0
- package/dist/types/chrome/transcript-container.d.ts +129 -0
- package/dist/types/chrome/transcript-status.d.ts +12 -0
- package/dist/types/chrome/visual-truncate.d.ts +19 -0
- package/dist/types/components/disclosure.d.ts +42 -0
- package/dist/types/components/form.d.ts +130 -0
- package/dist/types/components/image.d.ts +18 -16
- package/dist/types/components/key-value-list.d.ts +24 -0
- package/dist/types/components/layout/geometry.d.ts +73 -0
- package/dist/types/components/layout/row.d.ts +55 -0
- package/dist/types/components/layout/split-pane.d.ts +80 -0
- package/dist/types/components/layout/stack.d.ts +50 -0
- package/dist/types/components/menu-selection.d.ts +71 -0
- package/dist/types/components/metric.d.ts +44 -0
- package/dist/types/components/progress-bar.d.ts +36 -0
- package/dist/types/components/scroll-view.d.ts +53 -19
- package/dist/types/components/scroll-viewport.d.ts +46 -0
- package/dist/types/components/section.d.ts +19 -0
- package/dist/types/components/select-list.d.ts +46 -2
- package/dist/types/components/settings-list.d.ts +20 -0
- package/dist/types/components/table.d.ts +32 -0
- package/dist/types/components/tree-view.d.ts +130 -0
- package/dist/types/components/wizard-step.d.ts +60 -0
- package/dist/types/hotkeys-markdown.d.ts +7 -0
- package/dist/types/index.d.ts +17 -0
- package/dist/types/keybinding-matchers.d.ts +35 -0
- package/dist/types/keys.d.ts +2 -2
- package/dist/types/lang-from-path.d.ts +9 -0
- package/dist/types/overlays/advisor-config.d.ts +114 -0
- package/dist/types/overlays/agent-activity.d.ts +41 -0
- package/dist/types/overlays/agent-hub-projection.d.ts +33 -0
- package/dist/types/overlays/agent-hub-renderer.d.ts +53 -0
- package/dist/types/overlays/agent-hub-types.d.ts +99 -0
- package/dist/types/overlays/agent-hub.d.ts +126 -0
- package/dist/types/overlays/agent-transcript-viewer.d.ts +71 -0
- package/dist/types/overlays/agents-hub.d.ts +72 -0
- package/dist/types/overlays/ask-dialog.d.ts +88 -0
- package/dist/types/overlays/bordered-loader.d.ts +11 -0
- package/dist/types/overlays/btw-history-panel.d.ts +29 -0
- package/dist/types/overlays/btw-history.d.ts +17 -0
- package/dist/types/overlays/btw-panel.d.ts +26 -0
- package/dist/types/overlays/cleanse-panel.d.ts +36 -0
- package/dist/types/overlays/codex-reset-fireworks.d.ts +52 -0
- package/dist/types/overlays/composer-shape-preview.d.ts +47 -0
- package/dist/types/overlays/composer-shape-registry.d.ts +50 -0
- package/dist/types/overlays/copy-selector.d.ts +48 -0
- package/dist/types/overlays/copy-targets.d.ts +63 -0
- package/dist/types/overlays/error-banner.d.ts +13 -0
- package/dist/types/overlays/extensions/display-text.d.ts +10 -0
- package/dist/types/overlays/extensions/extension-dashboard.d.ts +63 -0
- package/dist/types/overlays/extensions/extension-list.d.ts +54 -0
- package/dist/types/overlays/extensions/inspector-model.d.ts +109 -0
- package/dist/types/overlays/extensions/inspector-panel.d.ts +17 -0
- package/dist/types/overlays/extensions/live-tool-session.d.ts +28 -0
- package/dist/types/overlays/extensions/mcp-runtime.d.ts +107 -0
- package/dist/types/overlays/extensions/state-manager.d.ts +42 -0
- package/dist/types/overlays/extensions/types.d.ts +165 -0
- package/dist/types/overlays/history-search.d.ts +16 -0
- package/dist/types/overlays/hook-editor.d.ts +44 -0
- package/dist/types/overlays/hook-input.d.ts +20 -0
- package/dist/types/overlays/hook-selector.d.ts +71 -0
- package/dist/types/overlays/hub-frame.d.ts +77 -0
- package/dist/types/overlays/login-dialog.d.ts +43 -0
- package/dist/types/overlays/logout-account-selector.d.ts +15 -0
- package/dist/types/overlays/mcp-add-wizard.d.ts +87 -0
- package/dist/types/overlays/model-browser.d.ts +213 -0
- package/dist/types/overlays/model-hub.d.ts +72 -0
- package/dist/types/overlays/model-picker.d.ts +74 -0
- package/dist/types/overlays/model-selector.d.ts +52 -0
- package/dist/types/overlays/move-overlay.d.ts +39 -0
- package/dist/types/overlays/oauth-selector.d.ts +41 -0
- package/dist/types/overlays/omfg-panel.d.ts +20 -0
- package/dist/types/overlays/pause-screen.d.ts +43 -0
- package/dist/types/overlays/plan-review-overlay.d.ts +89 -0
- package/dist/types/overlays/plan-save-overlay.d.ts +19 -0
- package/dist/types/overlays/plan-toc.d.ts +41 -0
- package/dist/types/overlays/plugin-selector.d.ts +28 -0
- package/dist/types/overlays/plugin-settings.d.ts +180 -0
- package/dist/types/overlays/queue-mode-selector.d.ts +11 -0
- package/dist/types/overlays/reset-usage-selector.d.ts +23 -0
- package/dist/types/overlays/rewind-selector.d.ts +61 -0
- package/dist/types/overlays/running-subagent-badge.d.ts +6 -0
- package/dist/types/overlays/session-account-selector.d.ts +24 -0
- package/dist/types/overlays/session-info-overlay.d.ts +17 -0
- package/dist/types/overlays/session-observer-registry.d.ts +77 -0
- package/dist/types/overlays/session-selector.d.ts +131 -0
- package/dist/types/overlays/settings-defs.d.ts +119 -0
- package/dist/types/overlays/settings-selector.d.ts +73 -0
- package/dist/types/overlays/show-images-selector.d.ts +11 -0
- package/dist/types/overlays/snapcompact-shape-preview.d.ts +31 -0
- package/dist/types/overlays/theme-selector.d.ts +12 -0
- package/dist/types/overlays/thinking-selector.d.ts +12 -0
- package/dist/types/overlays/tiny-title-download-progress.d.ts +21 -0
- package/dist/types/overlays/tree-selector.d.ts +92 -0
- package/dist/types/overlays/usage-dashboard.d.ts +94 -0
- package/dist/types/overlays/usage-display.d.ts +5 -0
- package/dist/types/overlays/usage-row.d.ts +17 -0
- package/dist/types/prompt/attachment-chips.d.ts +19 -0
- package/dist/types/prompt/composer-attachments.d.ts +71 -0
- package/dist/types/prompt/composer-cache.d.ts +37 -0
- package/dist/types/prompt/composer.d.ts +159 -0
- package/dist/types/prompt/custom-editor.d.ts +261 -0
- package/dist/types/prompt/editor-top-gap.d.ts +18 -0
- package/dist/types/prompt/emoji-autocomplete.d.ts +16 -0
- package/dist/types/prompt/github-ref-autocomplete.d.ts +35 -0
- package/dist/types/prompt/gradient-highlight.d.ts +32 -0
- package/dist/types/prompt/image-format.d.ts +4 -0
- package/dist/types/prompt/image-references.d.ts +26 -0
- package/dist/types/prompt/interactive-context-helpers.d.ts +43 -0
- package/dist/types/prompt/internal-url-autocomplete.d.ts +56 -0
- package/dist/types/prompt/macos-spelling.d.ts +44 -0
- package/dist/types/prompt/magic-keyword-boundary.d.ts +9 -0
- package/dist/types/prompt/magic-keywords.d.ts +26 -0
- package/dist/types/prompt/markdown-prose.d.ts +15 -0
- package/dist/types/prompt/model-mention-autocomplete.d.ts +25 -0
- package/dist/types/prompt/model-mention-syntax.d.ts +24 -0
- package/dist/types/prompt/orchestrate.d.ts +13 -0
- package/dist/types/prompt/prompt-action-autocomplete.d.ts +56 -0
- package/dist/types/prompt/queue-input.d.ts +8 -0
- package/dist/types/prompt/skill-tokens.d.ts +13 -0
- package/dist/types/prompt/tools-markdown.d.ts +12 -0
- package/dist/types/prompt/ultrathink.d.ts +13 -0
- package/dist/types/prompt/usage-amounts.d.ts +26 -0
- package/dist/types/prompt/video.d.ts +18 -0
- package/dist/types/prompt/welcome.d.ts +83 -0
- package/dist/types/prompt/workflow.d.ts +13 -0
- package/dist/types/render/code-cell.d.ts +51 -0
- package/dist/types/render/file-list.d.ts +22 -0
- package/dist/types/render/hyperlink.d.ts +80 -0
- package/dist/types/render/index.d.ts +16 -0
- package/dist/types/render/output-block.d.ts +54 -0
- package/dist/types/render/output-pane.d.ts +80 -0
- package/dist/types/render/render-utils.d.ts +312 -0
- package/dist/types/render/sixel.d.ts +21 -0
- package/dist/types/render/status-line.d.ts +23 -0
- package/dist/types/render/tool-card.d.ts +71 -0
- package/dist/types/render/tree-list.d.ts +29 -0
- package/dist/types/render/types.d.ts +17 -0
- package/dist/types/render/utils.d.ts +43 -0
- package/dist/types/render/width-aware-text.d.ts +23 -0
- package/dist/types/setup/lazy.d.ts +3 -0
- package/dist/types/setup/scenes/composer.d.ts +3 -0
- package/dist/types/setup/scenes/glyph.d.ts +3 -0
- package/dist/types/setup/scenes/model.d.ts +3 -0
- package/dist/types/setup/scenes/outro.d.ts +2 -0
- package/dist/types/setup/scenes/providers.d.ts +3 -0
- package/dist/types/setup/scenes/sign-in.d.ts +21 -0
- package/dist/types/setup/scenes/splash.d.ts +11 -0
- package/dist/types/setup/scenes/theme.d.ts +3 -0
- package/dist/types/setup/scenes/types.d.ts +110 -0
- package/dist/types/setup/scenes/web-search.d.ts +22 -0
- package/dist/types/setup/setup-version.d.ts +11 -0
- package/dist/types/setup/startup-splash.d.ts +9 -0
- package/dist/types/setup/wizard-overlay.d.ts +16 -0
- package/dist/types/setup/wizard.d.ts +25 -0
- package/dist/types/status-line/component.d.ts +182 -0
- package/dist/types/status-line/context-usage.d.ts +156 -0
- package/dist/types/status-line/footer.d.ts +30 -0
- package/dist/types/status-line/git-utils.d.ts +22 -0
- package/dist/types/status-line/host.d.ts +129 -0
- package/dist/types/status-line/index.d.ts +6 -0
- package/dist/types/status-line/loop.d.ts +18 -0
- package/dist/types/status-line/metrics.d.ts +21 -0
- package/dist/types/status-line/presets.d.ts +3 -0
- package/dist/types/status-line/schema.d.ts +15 -0
- package/dist/types/status-line/segments.d.ts +5 -0
- package/dist/types/status-line/separators.d.ts +3 -0
- package/dist/types/status-line/types.d.ts +236 -0
- package/dist/types/stdin-buffer.d.ts +4 -0
- package/dist/types/theme/color.d.ts +24 -0
- package/dist/types/theme/defaults/index.d.ts +9489 -0
- package/dist/types/theme/index.d.ts +4 -0
- package/dist/types/theme/loader.d.ts +23 -0
- package/dist/types/theme/mermaid-cache.d.ts +26 -0
- package/dist/types/theme/schema-validation.d.ts +3 -0
- package/dist/types/theme/schema.d.ts +25 -0
- package/dist/types/theme/session-color.d.ts +43 -0
- package/dist/types/theme/shimmer.d.ts +44 -0
- package/dist/types/theme/symbols.d.ts +34 -0
- package/dist/types/theme/theme-class.d.ts +299 -0
- package/dist/types/theme/theme.d.ts +111 -0
- package/dist/types/theme/tui-adapters.d.ts +30 -0
- package/dist/types/thinking.d.ts +165 -0
- package/dist/types/tools/agent-tree.d.ts +36 -0
- package/dist/types/tools/ask.d.ts +67 -0
- package/dist/types/tools/ast-edit.d.ts +53 -0
- package/dist/types/tools/ast-grep.d.ts +52 -0
- package/dist/types/tools/autoresearch.d.ts +156 -0
- package/dist/types/tools/bash-interactive.d.ts +28 -0
- package/dist/types/tools/bash.d.ts +103 -0
- package/dist/types/tools/conflict-detect.d.ts +43 -0
- package/dist/types/tools/debug.d.ts +60 -0
- package/dist/types/tools/default-renderer.d.ts +24 -0
- package/dist/types/tools/edit.d.ts +158 -0
- package/dist/types/tools/eval-format/code-mode-declarations.d.ts +5 -0
- package/dist/types/tools/eval-format/index.d.ts +5 -0
- package/dist/types/tools/eval-format/javascript.d.ts +2 -0
- package/dist/types/tools/eval-format/python.d.ts +2 -0
- package/dist/types/tools/eval.d.ts +94 -0
- package/dist/types/tools/fetch.d.ts +42 -0
- package/dist/types/tools/gh-format.d.ts +8 -0
- package/dist/types/tools/github.d.ts +144 -0
- package/dist/types/tools/glob.d.ts +44 -0
- package/dist/types/tools/goal.d.ts +42 -0
- package/dist/types/tools/grep.d.ts +64 -0
- package/dist/types/tools/grouped-file-output.d.ts +71 -0
- package/dist/types/tools/hashline-format.d.ts +28 -0
- package/dist/types/tools/hub.d.ts +340 -0
- package/dist/types/tools/index.d.ts +4 -0
- package/dist/types/tools/json-tree.d.ts +59 -0
- package/dist/types/tools/line-ranges.d.ts +29 -0
- package/dist/types/tools/list-limit.d.ts +15 -0
- package/dist/types/tools/lsp.d.ts +72 -0
- package/dist/types/tools/match-line-format.d.ts +11 -0
- package/dist/types/tools/mcp.d.ts +81 -0
- package/dist/types/tools/memory.d.ts +67 -0
- package/dist/types/tools/output-meta.d.ts +151 -0
- package/dist/types/tools/read.d.ts +139 -0
- package/dist/types/tools/renderer.d.ts +98 -0
- package/dist/types/tools/report-tool-issue.d.ts +8 -0
- package/dist/types/tools/resolve.d.ts +47 -0
- package/dist/types/tools/streaming-output.d.ts +282 -0
- package/dist/types/tools/subprocess.d.ts +24 -0
- package/dist/types/tools/task-repair-args.d.ts +53 -0
- package/dist/types/tools/task-yield-assembly.d.ts +20 -0
- package/dist/types/tools/task.d.ts +425 -0
- package/dist/types/tools/terminal-output.d.ts +8 -0
- package/dist/types/tools/think.d.ts +13 -0
- package/dist/types/tools/todo.d.ts +118 -0
- package/dist/types/tools/tool-errors.d.ts +7 -0
- package/dist/types/tools/vibe.d.ts +120 -0
- package/dist/types/tools/web-search.d.ts +195 -0
- package/dist/types/tools/write.d.ts +76 -0
- package/dist/types/tools/xd-url.d.ts +13 -0
- package/dist/types/tools/xdev.d.ts +52 -0
- package/dist/types/tui.d.ts +18 -0
- package/dist/types/utils.d.ts +2 -0
- package/package.json +37 -3
- package/src/app-keybindings.ts +760 -0
- package/src/apps/autoresearch-dashboard.ts +500 -0
- package/src/apps/autoresearch-data.ts +64 -0
- package/src/apps/cleanse-board.ts +341 -0
- package/src/apps/cleanse-picker.ts +57 -0
- package/src/apps/debug/log-formatting.ts +53 -0
- package/src/apps/debug/log-viewer.ts +868 -0
- package/src/apps/debug/protocol-probe.ts +267 -0
- package/src/apps/debug/raw-sse-buffer.ts +449 -0
- package/src/apps/debug/raw-sse.ts +282 -0
- package/src/apps/debug/terminal-info.ts +115 -0
- package/src/apps/debug/viewer-frame.ts +174 -0
- package/src/apps/git/avatar.ts +52 -0
- package/src/apps/git/colors.ts +109 -0
- package/src/apps/git/diff-pane.ts +1512 -0
- package/src/apps/git/git-tui.ts +889 -0
- package/src/apps/git/sidebar.ts +1204 -0
- package/src/apps/git/state.ts +113 -0
- package/src/apps/if-bench-board.ts +324 -0
- package/src/apps/live-visualizer.ts +238 -0
- package/src/apps/ps-data.ts +116 -0
- package/src/apps/ps-top.ts +422 -0
- package/src/apps/session-picker.ts +95 -0
- package/src/apps/setup-model-picker.ts +21 -0
- package/src/apps/standalone-picker.ts +111 -0
- package/src/autocomplete.ts +9 -13
- package/src/chat/advisor-message.ts +175 -0
- package/src/chat/assistant-message.ts +1214 -0
- package/src/chat/background-tan-message.ts +35 -0
- package/src/chat/bash-execution.ts +394 -0
- package/src/chat/cache-invalidation-marker.ts +94 -0
- package/src/chat/chat-transcript-builder.ts +593 -0
- package/src/chat/collab-prompt-message.ts +34 -0
- package/src/chat/compaction-summary-message.ts +261 -0
- package/src/chat/custom-message.ts +23 -0
- package/src/chat/display-preferences.ts +24 -0
- package/src/chat/eval-execution.ts +172 -0
- package/src/chat/execution-shared.ts +113 -0
- package/src/chat/extension-types.ts +46 -0
- package/src/chat/hook-message.ts +20 -0
- package/src/chat/image-loading.ts +122 -0
- package/src/chat/late-diagnostics-message.ts +92 -0
- package/src/chat/messages.ts +305 -0
- package/src/chat/reaction.ts +65 -0
- package/src/chat/read-target.ts +7 -0
- package/src/chat/read-tool-group.ts +873 -0
- package/src/chat/served-model-marker.ts +91 -0
- package/src/chat/skill-message.ts +220 -0
- package/src/chat/skill-title-input.ts +41 -0
- package/src/chat/stripped-tool-calls-placeholder.ts +35 -0
- package/src/chat/thinking-display.ts +312 -0
- package/src/chat/todo-reminder.ts +33 -0
- package/src/chat/tool-execution.ts +1395 -0
- package/src/chat/transcript-browser.ts +268 -0
- package/src/chat/transcript-entry.ts +96 -0
- package/src/chat/transcript-outline.ts +260 -0
- package/src/chat/transcript-render-helpers.ts +315 -0
- package/src/chat/ttsr-notification.ts +123 -0
- package/src/chat/user-message.ts +287 -0
- package/src/chrome/chat-block.ts +110 -0
- package/src/chrome/collab-qrcode.ts +74 -0
- package/src/chrome/context-thresholds.ts +85 -0
- package/src/chrome/countdown-timer.ts +74 -0
- package/src/chrome/diff.ts +266 -0
- package/src/chrome/dynamic-border.ts +36 -0
- package/src/chrome/error-block.ts +63 -0
- package/src/chrome/form-theme.ts +10 -0
- package/src/chrome/format.ts +66 -0
- package/src/chrome/index.ts +21 -0
- package/src/chrome/keybinding-hints.ts +55 -0
- package/src/chrome/live-board.ts +123 -0
- package/src/chrome/local-date.ts +20 -0
- package/src/chrome/message-divider.ts +51 -0
- package/src/chrome/message-frame.ts +164 -0
- package/src/chrome/message-notice.ts +103 -0
- package/src/chrome/overlay-box.ts +301 -0
- package/src/chrome/qrcode.ts +539 -0
- package/src/chrome/segment-track.ts +86 -0
- package/src/chrome/select-list-mouse-routing.ts +11 -0
- package/src/chrome/selector-helpers.ts +119 -0
- package/src/chrome/shared.ts +27 -0
- package/src/chrome/streaming-panel.ts +72 -0
- package/src/chrome/tool-activity.ts +44 -0
- package/src/chrome/transcript-container.ts +902 -0
- package/src/chrome/transcript-status.ts +27 -0
- package/src/chrome/visual-truncate.ts +70 -0
- package/src/components/disclosure.ts +235 -0
- package/src/components/editor.ts +10 -12
- package/src/components/form.ts +566 -0
- package/src/components/image.ts +80 -53
- package/src/components/input.ts +6 -27
- package/src/components/key-value-list.ts +88 -0
- package/src/components/layout/geometry.ts +202 -0
- package/src/components/layout/row.ts +283 -0
- package/src/components/layout/split-pane.ts +349 -0
- package/src/components/layout/stack.ts +261 -0
- package/src/components/markdown.ts +16 -12
- package/src/components/menu-selection.ts +248 -0
- package/src/components/metric.ts +132 -0
- package/src/components/progress-bar.ts +140 -0
- package/src/components/scroll-view.ts +372 -70
- package/src/components/scroll-viewport.ts +154 -0
- package/src/components/section.ts +77 -0
- package/src/components/select-list.ts +238 -159
- package/src/components/settings-list.ts +103 -80
- package/src/components/table.ts +127 -0
- package/src/components/tree-view.ts +481 -0
- package/src/components/wizard-step.ts +229 -0
- package/src/deccara.ts +1 -3
- package/src/hotkeys-markdown.ts +100 -0
- package/src/index.ts +18 -0
- package/src/keybinding-matchers.ts +99 -0
- package/src/keys.ts +2 -2
- package/src/lang-from-path.ts +252 -0
- package/src/overlays/advisor-config.ts +761 -0
- package/src/overlays/agent-activity.ts +113 -0
- package/src/overlays/agent-hub-projection.ts +250 -0
- package/src/overlays/agent-hub-renderer.ts +281 -0
- package/src/overlays/agent-hub-types.ts +74 -0
- package/src/overlays/agent-hub.ts +1562 -0
- package/src/overlays/agent-transcript-viewer.ts +669 -0
- package/src/overlays/agents-hub.ts +1203 -0
- package/src/overlays/ask-dialog.ts +1202 -0
- package/src/overlays/bordered-loader.ts +41 -0
- package/src/overlays/btw-history-panel.ts +591 -0
- package/src/overlays/btw-history.ts +33 -0
- package/src/overlays/btw-panel.ts +167 -0
- package/src/overlays/cleanse-panel.ts +167 -0
- package/src/overlays/codex-reset-fireworks.ts +375 -0
- package/src/overlays/composer-shape-preview.ts +137 -0
- package/src/overlays/composer-shape-registry.ts +82 -0
- package/src/overlays/copy-selector.ts +618 -0
- package/src/overlays/copy-targets.ts +210 -0
- package/src/overlays/error-banner.ts +39 -0
- package/src/overlays/extensions/display-text.ts +39 -0
- package/src/overlays/extensions/extension-dashboard.ts +645 -0
- package/src/overlays/extensions/extension-list.ts +667 -0
- package/src/overlays/extensions/inspector-model.ts +484 -0
- package/src/overlays/extensions/inspector-panel.ts +669 -0
- package/src/overlays/extensions/live-tool-session.ts +67 -0
- package/src/overlays/extensions/mcp-runtime.ts +289 -0
- package/src/overlays/extensions/state-manager.ts +337 -0
- package/src/overlays/extensions/types.ts +208 -0
- package/src/overlays/history-search.ts +268 -0
- package/src/overlays/hook-editor.ts +272 -0
- package/src/overlays/hook-input.ts +84 -0
- package/src/overlays/hook-selector.ts +635 -0
- package/src/overlays/hub-frame.ts +262 -0
- package/src/overlays/login-dialog.ts +231 -0
- package/src/overlays/logout-account-selector.ts +115 -0
- package/src/overlays/mcp-add-wizard.ts +1436 -0
- package/src/overlays/model-browser.ts +1176 -0
- package/src/overlays/model-hub.ts +2279 -0
- package/src/overlays/model-picker.ts +285 -0
- package/src/overlays/model-selector.ts +107 -0
- package/src/overlays/move-overlay.ts +197 -0
- package/src/overlays/oauth-selector.ts +446 -0
- package/src/overlays/omfg-panel.ts +136 -0
- package/src/overlays/pause-screen.ts +198 -0
- package/src/overlays/plan-review-overlay.ts +1227 -0
- package/src/overlays/plan-save-overlay.ts +74 -0
- package/src/overlays/plan-toc.ts +139 -0
- package/src/overlays/plugin-selector.ts +97 -0
- package/src/overlays/plugin-settings.ts +839 -0
- package/src/overlays/queue-mode-selector.ts +55 -0
- package/src/overlays/reset-usage-selector.ts +170 -0
- package/src/overlays/rewind-selector.ts +499 -0
- package/src/overlays/running-subagent-badge.ts +19 -0
- package/src/overlays/session-account-selector.ts +68 -0
- package/src/overlays/session-info-overlay.ts +96 -0
- package/src/overlays/session-observer-registry.ts +289 -0
- package/src/overlays/session-selector.ts +1137 -0
- package/src/overlays/settings-defs.ts +315 -0
- package/src/overlays/settings-selector.ts +1415 -0
- package/src/overlays/show-images-selector.ts +44 -0
- package/src/overlays/snapcompact-shape-preview-doc.md +14 -0
- package/src/overlays/snapcompact-shape-preview.ts +192 -0
- package/src/overlays/theme-selector.ts +62 -0
- package/src/overlays/thinking-selector.ts +51 -0
- package/src/overlays/tiny-title-download-progress.ts +102 -0
- package/src/overlays/tree-selector.ts +1121 -0
- package/src/overlays/usage-dashboard.ts +629 -0
- package/src/overlays/usage-display.ts +45 -0
- package/src/overlays/usage-row.ts +118 -0
- package/src/prompt/attachment-chips.ts +201 -0
- package/src/prompt/composer-attachments.ts +280 -0
- package/src/prompt/composer-cache.ts +304 -0
- package/src/prompt/composer.ts +934 -0
- package/src/prompt/custom-editor.ts +1392 -0
- package/src/prompt/data/emojis.json +1 -0
- package/src/prompt/editor-top-gap.ts +28 -0
- package/src/prompt/emoji-autocomplete.ts +285 -0
- package/src/prompt/github-ref-autocomplete.ts +75 -0
- package/src/prompt/gradient-highlight.ts +101 -0
- package/src/prompt/image-format.ts +28 -0
- package/src/prompt/image-references.ts +102 -0
- package/src/prompt/interactive-context-helpers.ts +126 -0
- package/src/prompt/internal-url-autocomplete.ts +155 -0
- package/src/prompt/macos-spelling.ts +456 -0
- package/src/prompt/magic-keyword-boundary.ts +23 -0
- package/src/prompt/magic-keywords.ts +42 -0
- package/src/prompt/markdown-prose.ts +245 -0
- package/src/prompt/model-mention-autocomplete.ts +94 -0
- package/src/prompt/model-mention-syntax.ts +41 -0
- package/src/prompt/orchestrate.ts +26 -0
- package/src/prompt/prompt-action-autocomplete.ts +337 -0
- package/src/prompt/queue-input.ts +132 -0
- package/src/prompt/skill-tokens.ts +36 -0
- package/src/prompt/tips.txt +27 -0
- package/src/prompt/tools-markdown.ts +29 -0
- package/src/prompt/ultrathink.ts +26 -0
- package/src/prompt/usage-amounts.ts +99 -0
- package/src/prompt/video.ts +47 -0
- package/src/prompt/welcome.ts +605 -0
- package/src/prompt/workflow.ts +26 -0
- package/src/render/code-cell.ts +244 -0
- package/src/render/file-list.ts +58 -0
- package/src/render/hyperlink.ts +192 -0
- package/src/render/index.ts +17 -0
- package/src/render/output-block.ts +267 -0
- package/src/render/output-pane.ts +299 -0
- package/src/render/render-utils.ts +1182 -0
- package/src/render/sixel.ts +69 -0
- package/src/render/status-line.ts +55 -0
- package/src/render/tool-card.ts +272 -0
- package/src/render/tree-list.ts +188 -0
- package/src/render/types.ts +19 -0
- package/src/render/utils.ts +109 -0
- package/src/render/width-aware-text.ts +60 -0
- package/src/setup/lazy.ts +17 -0
- package/src/setup/scenes/composer.ts +127 -0
- package/src/setup/scenes/glyph.ts +120 -0
- package/src/setup/scenes/model.ts +138 -0
- package/src/setup/scenes/outro.ts +24 -0
- package/src/setup/scenes/providers.ts +107 -0
- package/src/setup/scenes/sign-in.ts +373 -0
- package/src/setup/scenes/splash.ts +192 -0
- package/src/setup/scenes/theme.ts +343 -0
- package/src/setup/scenes/types.ts +111 -0
- package/src/setup/scenes/web-search.ts +165 -0
- package/src/setup/setup-version.ts +11 -0
- package/src/setup/startup-splash.ts +107 -0
- package/src/setup/wizard-overlay.ts +319 -0
- package/src/setup/wizard.ts +101 -0
- package/src/status-line/component.ts +3003 -0
- package/src/status-line/context-usage.ts +688 -0
- package/src/status-line/footer.ts +323 -0
- package/src/status-line/git-utils.ts +42 -0
- package/src/status-line/host.ts +97 -0
- package/src/status-line/index.ts +6 -0
- package/src/status-line/loop.ts +28 -0
- package/src/status-line/metrics.ts +94 -0
- package/src/status-line/presets.ts +107 -0
- package/src/status-line/schema.ts +57 -0
- package/src/status-line/segments.ts +934 -0
- package/src/status-line/separators.ts +55 -0
- package/src/status-line/types.ts +227 -0
- package/src/stdin-buffer.ts +4 -2
- package/src/theme/color.ts +95 -0
- package/src/theme/dark.json +95 -0
- package/src/theme/defaults/alabaster.json +93 -0
- package/src/theme/defaults/amethyst.json +96 -0
- package/src/theme/defaults/anthracite.json +93 -0
- package/src/theme/defaults/basalt.json +91 -0
- package/src/theme/defaults/birch.json +95 -0
- package/src/theme/defaults/dark-abyss.json +91 -0
- package/src/theme/defaults/dark-arctic.json +104 -0
- package/src/theme/defaults/dark-aurora.json +95 -0
- package/src/theme/defaults/dark-catppuccin.json +107 -0
- package/src/theme/defaults/dark-cavern.json +91 -0
- package/src/theme/defaults/dark-celestial.json +106 -0
- package/src/theme/defaults/dark-copper.json +95 -0
- package/src/theme/defaults/dark-cosmos.json +90 -0
- package/src/theme/defaults/dark-cyberpunk.json +102 -0
- package/src/theme/defaults/dark-dracula.json +98 -0
- package/src/theme/defaults/dark-eclipse.json +91 -0
- package/src/theme/defaults/dark-ember.json +95 -0
- package/src/theme/defaults/dark-equinox.json +90 -0
- package/src/theme/defaults/dark-forest.json +96 -0
- package/src/theme/defaults/dark-github.json +105 -0
- package/src/theme/defaults/dark-gruvbox.json +112 -0
- package/src/theme/defaults/dark-lavender.json +95 -0
- package/src/theme/defaults/dark-lunar.json +89 -0
- package/src/theme/defaults/dark-midnight.json +95 -0
- package/src/theme/defaults/dark-monochrome.json +94 -0
- package/src/theme/defaults/dark-monokai.json +98 -0
- package/src/theme/defaults/dark-nebula.json +90 -0
- package/src/theme/defaults/dark-nord.json +98 -0
- package/src/theme/defaults/dark-ocean.json +101 -0
- package/src/theme/defaults/dark-one.json +100 -0
- package/src/theme/defaults/dark-poimandres.json +115 -0
- package/src/theme/defaults/dark-rainforest.json +91 -0
- package/src/theme/defaults/dark-reef.json +91 -0
- package/src/theme/defaults/dark-retro.json +92 -0
- package/src/theme/defaults/dark-rose-pine.json +96 -0
- package/src/theme/defaults/dark-sakura.json +95 -0
- package/src/theme/defaults/dark-slate.json +95 -0
- package/src/theme/defaults/dark-solarized.json +97 -0
- package/src/theme/defaults/dark-solstice.json +90 -0
- package/src/theme/defaults/dark-starfall.json +91 -0
- package/src/theme/defaults/dark-sunset.json +99 -0
- package/src/theme/defaults/dark-swamp.json +90 -0
- package/src/theme/defaults/dark-synthwave.json +103 -0
- package/src/theme/defaults/dark-taiga.json +91 -0
- package/src/theme/defaults/dark-terminal.json +95 -0
- package/src/theme/defaults/dark-tokyo-night.json +101 -0
- package/src/theme/defaults/dark-tundra.json +91 -0
- package/src/theme/defaults/dark-twilight.json +91 -0
- package/src/theme/defaults/dark-volcanic.json +91 -0
- package/src/theme/defaults/graphite.json +92 -0
- package/src/theme/defaults/index.ts +201 -0
- package/src/theme/defaults/light-arctic.json +107 -0
- package/src/theme/defaults/light-aurora-day.json +91 -0
- package/src/theme/defaults/light-canyon.json +91 -0
- package/src/theme/defaults/light-catppuccin.json +106 -0
- package/src/theme/defaults/light-cirrus.json +90 -0
- package/src/theme/defaults/light-coral.json +95 -0
- package/src/theme/defaults/light-cyberpunk.json +96 -0
- package/src/theme/defaults/light-dawn.json +90 -0
- package/src/theme/defaults/light-dunes.json +91 -0
- package/src/theme/defaults/light-eucalyptus.json +95 -0
- package/src/theme/defaults/light-forest.json +100 -0
- package/src/theme/defaults/light-frost.json +95 -0
- package/src/theme/defaults/light-github.json +115 -0
- package/src/theme/defaults/light-glacier.json +91 -0
- package/src/theme/defaults/light-gruvbox.json +108 -0
- package/src/theme/defaults/light-haze.json +90 -0
- package/src/theme/defaults/light-honeycomb.json +95 -0
- package/src/theme/defaults/light-lagoon.json +91 -0
- package/src/theme/defaults/light-lavender.json +95 -0
- package/src/theme/defaults/light-meadow.json +91 -0
- package/src/theme/defaults/light-mint.json +95 -0
- package/src/theme/defaults/light-monochrome.json +101 -0
- package/src/theme/defaults/light-ocean.json +99 -0
- package/src/theme/defaults/light-one.json +99 -0
- package/src/theme/defaults/light-opal.json +91 -0
- package/src/theme/defaults/light-orchard.json +91 -0
- package/src/theme/defaults/light-paper.json +95 -0
- package/src/theme/defaults/light-poimandres.json +115 -0
- package/src/theme/defaults/light-prism.json +90 -0
- package/src/theme/defaults/light-retro.json +98 -0
- package/src/theme/defaults/light-sand.json +95 -0
- package/src/theme/defaults/light-savanna.json +91 -0
- package/src/theme/defaults/light-solarized.json +102 -0
- package/src/theme/defaults/light-soleil.json +90 -0
- package/src/theme/defaults/light-sunset.json +99 -0
- package/src/theme/defaults/light-synthwave.json +98 -0
- package/src/theme/defaults/light-tokyo-night.json +111 -0
- package/src/theme/defaults/light-wetland.json +91 -0
- package/src/theme/defaults/light-zenith.json +89 -0
- package/src/theme/defaults/limestone.json +94 -0
- package/src/theme/defaults/mahogany.json +97 -0
- package/src/theme/defaults/marble.json +93 -0
- package/src/theme/defaults/obsidian.json +91 -0
- package/src/theme/defaults/onyx.json +91 -0
- package/src/theme/defaults/pearl.json +93 -0
- package/src/theme/defaults/porcelain.json +91 -0
- package/src/theme/defaults/quartz.json +96 -0
- package/src/theme/defaults/sandstone.json +95 -0
- package/src/theme/defaults/titanium.json +90 -0
- package/src/theme/index.ts +5 -0
- package/src/theme/light.json +93 -0
- package/src/theme/loader.ts +200 -0
- package/src/theme/mermaid-cache.ts +92 -0
- package/src/theme/schema-validation.ts +119 -0
- package/src/theme/schema.ts +168 -0
- package/src/theme/session-color.ts +253 -0
- package/src/theme/shimmer.ts +307 -0
- package/src/theme/symbols.ts +1433 -0
- package/src/theme/theme-class.ts +787 -0
- package/src/theme/theme-schema.json +463 -0
- package/src/theme/theme.ts +810 -0
- package/src/theme/tui-adapters.ts +339 -0
- package/src/thinking.ts +380 -0
- package/src/tools/agent-tree.ts +128 -0
- package/src/tools/ask.ts +482 -0
- package/src/tools/ast-edit.ts +210 -0
- package/src/tools/ast-grep.ts +171 -0
- package/src/tools/autoresearch.ts +287 -0
- package/src/tools/bash-interactive.ts +295 -0
- package/src/tools/bash.ts +468 -0
- package/src/tools/conflict-detect.ts +77 -0
- package/src/tools/debug.ts +167 -0
- package/src/tools/default-renderer.ts +172 -0
- package/src/tools/edit.ts +1258 -0
- package/src/tools/eval-format/code-mode-declarations.ts +61 -0
- package/src/tools/eval-format/index.ts +16 -0
- package/src/tools/eval-format/javascript.ts +952 -0
- package/src/tools/eval-format/python.ts +544 -0
- package/src/tools/eval.ts +835 -0
- package/src/tools/fetch.ts +226 -0
- package/src/tools/gh-format.ts +18 -0
- package/src/tools/github.ts +686 -0
- package/src/tools/glob.ts +213 -0
- package/src/tools/goal.ts +153 -0
- package/src/tools/grep.ts +385 -0
- package/src/tools/grouped-file-output.ts +211 -0
- package/src/tools/hashline-format.ts +59 -0
- package/src/tools/hub.ts +1488 -0
- package/src/tools/index.ts +71 -0
- package/src/tools/json-tree.ts +388 -0
- package/src/tools/line-ranges.ts +98 -0
- package/src/tools/list-limit.ts +43 -0
- package/src/tools/lsp.ts +702 -0
- package/src/tools/match-line-format.ts +20 -0
- package/src/tools/mcp.ts +309 -0
- package/src/tools/memory.ts +220 -0
- package/src/tools/output-meta.ts +367 -0
- package/src/tools/read.ts +628 -0
- package/src/tools/renderer.ts +107 -0
- package/src/tools/report-tool-issue.ts +13 -0
- package/src/tools/resolve.ts +139 -0
- package/src/tools/streaming-output.ts +1576 -0
- package/src/tools/subprocess.ts +39 -0
- package/src/tools/task-repair-args.ts +118 -0
- package/src/tools/task-yield-assembly.ts +147 -0
- package/src/tools/task.ts +2110 -0
- package/src/tools/terminal-output.ts +153 -0
- package/src/tools/think.ts +28 -0
- package/src/tools/todo.ts +580 -0
- package/src/tools/tool-errors.ts +15 -0
- package/src/tools/vibe.ts +420 -0
- package/src/tools/web-search.ts +409 -0
- package/src/tools/write.ts +511 -0
- package/src/tools/xd-url.ts +28 -0
- package/src/tools/xdev.ts +201 -0
- package/src/tui.ts +70 -8
- 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
|
+
}
|