@oh-my-pi/pi-tui 18.2.4 → 18.2.6
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 +23 -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/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/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 +57 -4
- package/src/utils.ts +8 -0
|
@@ -0,0 +1,244 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Render a code or markdown cell with optional output section.
|
|
3
|
+
*/
|
|
4
|
+
import { Markdown } from "../components/markdown";
|
|
5
|
+
import { getMarkdownTheme, highlightCode, type Theme } from "../theme/theme";
|
|
6
|
+
import { formatDuration, formatExpandHint, formatMoreItems, formatStatusIcon, replaceTabs } from "./render-utils";
|
|
7
|
+
import { outputBlockContentWidth, renderOutputBlock } from "./output-block";
|
|
8
|
+
import { formatOutputPaneLines, splitTerminalOutputLines, styleToolOutputLine } from "./output-pane";
|
|
9
|
+
import type { State } from "./types";
|
|
10
|
+
|
|
11
|
+
/** Content and display limits for a code preview with optional output. */
|
|
12
|
+
export interface CodeCellOptions {
|
|
13
|
+
code: string;
|
|
14
|
+
language?: string;
|
|
15
|
+
index?: number;
|
|
16
|
+
total?: number;
|
|
17
|
+
title?: string;
|
|
18
|
+
status?: "pending" | "running" | "warning" | "complete" | "error";
|
|
19
|
+
spinnerFrame?: number;
|
|
20
|
+
duration?: number;
|
|
21
|
+
output?: string;
|
|
22
|
+
outputMaxLines?: number;
|
|
23
|
+
codeMaxLines?: number;
|
|
24
|
+
/**
|
|
25
|
+
* Show the LAST `codeMaxLines` rows (the live streaming edge) instead of the
|
|
26
|
+
* first, with a "… N earlier lines" marker on top. Lets a pending preview
|
|
27
|
+
* follow code as it is written while staying bounded. Ignored when `expanded`.
|
|
28
|
+
*/
|
|
29
|
+
codeTail?: boolean;
|
|
30
|
+
expanded?: boolean;
|
|
31
|
+
/**
|
|
32
|
+
* Prefix the header with the cell's language icon (resolved through the
|
|
33
|
+
* active symbol preset: nerd-font devicon, unicode emoji, or ascii
|
|
34
|
+
* shorthand). Opt-in so only the eval kernel renderer labels each cell;
|
|
35
|
+
* read/write/browser code cells stay icon-free.
|
|
36
|
+
*/
|
|
37
|
+
showLanguage?: boolean;
|
|
38
|
+
width: number;
|
|
39
|
+
codeStartLine?: number;
|
|
40
|
+
codeLineNumbers?: Array<number | null>;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
function getState(status?: CodeCellOptions["status"]): State | undefined {
|
|
44
|
+
if (!status) return undefined;
|
|
45
|
+
if (status === "complete") return "success";
|
|
46
|
+
if (status === "error") return "error";
|
|
47
|
+
if (status === "warning") return "warning";
|
|
48
|
+
if (status === "running") return "running";
|
|
49
|
+
return "pending";
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
function formatHeader(options: CodeCellOptions, theme: Theme): { title: string; meta?: string } {
|
|
53
|
+
const { index, total, title, status, spinnerFrame, duration, language, showLanguage } = options;
|
|
54
|
+
const parts: string[] = [];
|
|
55
|
+
if (showLanguage && language) {
|
|
56
|
+
const langIcon = theme.getLangIconStyled(language);
|
|
57
|
+
if (langIcon) parts.push(langIcon);
|
|
58
|
+
}
|
|
59
|
+
if (status) {
|
|
60
|
+
const icon = formatStatusIcon(
|
|
61
|
+
status === "complete"
|
|
62
|
+
? "done"
|
|
63
|
+
: status === "error"
|
|
64
|
+
? "error"
|
|
65
|
+
: status === "warning"
|
|
66
|
+
? "warning"
|
|
67
|
+
: status === "running"
|
|
68
|
+
? "running"
|
|
69
|
+
: "pending",
|
|
70
|
+
theme,
|
|
71
|
+
spinnerFrame,
|
|
72
|
+
);
|
|
73
|
+
if (status === "pending" || status === "running") {
|
|
74
|
+
parts.push(`${icon} ${theme.fg("muted", status)}`);
|
|
75
|
+
} else {
|
|
76
|
+
parts.push(icon);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
if (index !== undefined && total !== undefined && total > 1) {
|
|
80
|
+
parts.push(theme.fg("accent", `[${index + 1}/${total}]`));
|
|
81
|
+
}
|
|
82
|
+
if (title) {
|
|
83
|
+
parts.push(theme.fg("toolTitle", title));
|
|
84
|
+
}
|
|
85
|
+
const headerTitle = parts.length > 0 ? parts.join(" ") : theme.fg("toolTitle", "Code");
|
|
86
|
+
|
|
87
|
+
const metaParts: string[] = [];
|
|
88
|
+
if (duration !== undefined) {
|
|
89
|
+
metaParts.push(theme.fg("dim", `(${formatDuration(duration)})`));
|
|
90
|
+
}
|
|
91
|
+
if (metaParts.length === 0) return { title: headerTitle };
|
|
92
|
+
return { title: headerTitle, meta: metaParts.join(theme.fg("dim", theme.sep.dot)) };
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
function renderCellOutput(
|
|
96
|
+
output: string | undefined,
|
|
97
|
+
expanded: boolean,
|
|
98
|
+
outputMaxLines: number,
|
|
99
|
+
theme: Theme,
|
|
100
|
+
): readonly string[] {
|
|
101
|
+
if (!output?.trim()) return [];
|
|
102
|
+
return formatOutputPaneLines(
|
|
103
|
+
{
|
|
104
|
+
lines: splitTerminalOutputLines(output),
|
|
105
|
+
expanded,
|
|
106
|
+
collapsedMaxLines: outputMaxLines,
|
|
107
|
+
edge: "head",
|
|
108
|
+
styleLine: line => styleToolOutputLine(line, theme),
|
|
109
|
+
formatHidden: hidden => formatMoreItems(hidden, "line"),
|
|
110
|
+
},
|
|
111
|
+
theme,
|
|
112
|
+
).lines;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
/** Render a syntax-highlighted code preview and its optional output block. */
|
|
116
|
+
export function renderCodeCell(options: CodeCellOptions, theme: Theme): string[] {
|
|
117
|
+
const {
|
|
118
|
+
code,
|
|
119
|
+
language,
|
|
120
|
+
output,
|
|
121
|
+
expanded = false,
|
|
122
|
+
outputMaxLines = 6,
|
|
123
|
+
codeMaxLines = 12,
|
|
124
|
+
width,
|
|
125
|
+
codeStartLine,
|
|
126
|
+
codeLineNumbers,
|
|
127
|
+
} = options;
|
|
128
|
+
const { title, meta } = formatHeader(options, theme);
|
|
129
|
+
const state = getState(options.status);
|
|
130
|
+
|
|
131
|
+
const normalizedCode = replaceTabs(code ?? "");
|
|
132
|
+
const rawCodeLines = splitTerminalOutputLines(normalizedCode);
|
|
133
|
+
const maxCodeLines = expanded ? rawCodeLines.length : Math.min(rawCodeLines.length, codeMaxLines);
|
|
134
|
+
const hiddenCodeLines = rawCodeLines.length - maxCodeLines;
|
|
135
|
+
const tail = options.codeTail === true && !expanded && hiddenCodeLines > 0;
|
|
136
|
+
const startIndex = tail ? rawCodeLines.length - maxCodeLines : 0;
|
|
137
|
+
const visibleCode = rawCodeLines.slice(startIndex, startIndex + maxCodeLines).join("\n");
|
|
138
|
+
const codeLines = highlightCode(visibleCode, language);
|
|
139
|
+
|
|
140
|
+
let visibleLineNumbers: Array<number | null> | undefined;
|
|
141
|
+
let lineNumberWidth = 0;
|
|
142
|
+
if (codeLineNumbers) {
|
|
143
|
+
visibleLineNumbers = codeLineNumbers.slice(startIndex, startIndex + maxCodeLines);
|
|
144
|
+
} else if (codeStartLine !== undefined) {
|
|
145
|
+
visibleLineNumbers = Array.from({ length: maxCodeLines }, (_, i) => codeStartLine + startIndex + i);
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
if (visibleLineNumbers) {
|
|
149
|
+
const validLineNums = visibleLineNumbers.filter((n): n is number => n !== null && n !== undefined);
|
|
150
|
+
const maxVal = validLineNums.length > 0 ? Math.max(...validLineNums) : 0;
|
|
151
|
+
if (maxVal > 0) {
|
|
152
|
+
lineNumberWidth = Math.max(2, String(maxVal).length);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
if (lineNumberWidth > 0 && visibleLineNumbers) {
|
|
157
|
+
for (let i = 0; i < codeLines.length; i++) {
|
|
158
|
+
const lineNum = visibleLineNumbers[i];
|
|
159
|
+
const gutter =
|
|
160
|
+
lineNum !== null && lineNum !== undefined
|
|
161
|
+
? String(lineNum).padStart(lineNumberWidth, " ")
|
|
162
|
+
: " ".repeat(lineNumberWidth);
|
|
163
|
+
codeLines[i] = theme.fg("dim", `${gutter} `) + codeLines[i];
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
if (hiddenCodeLines > 0) {
|
|
168
|
+
const hint = formatExpandHint(theme, expanded, hiddenCodeLines > 0);
|
|
169
|
+
const gutterPad = lineNumberWidth > 0 ? " ".repeat(lineNumberWidth + 1) : "";
|
|
170
|
+
if (tail) {
|
|
171
|
+
// Earlier rows scrolled above the live tail window — mark them on top so
|
|
172
|
+
// the newest streamed line stays pinned to the bottom of the box.
|
|
173
|
+
const earlier = `… ${hiddenCodeLines} earlier line${hiddenCodeLines === 1 ? "" : "s"}${hint ? ` ${hint}` : ""}`;
|
|
174
|
+
codeLines.unshift(theme.fg("dim", gutterPad + earlier));
|
|
175
|
+
} else {
|
|
176
|
+
const moreLine = `${formatMoreItems(hiddenCodeLines, "line")}${hint ? ` ${hint}` : ""}`;
|
|
177
|
+
codeLines.push(theme.fg("dim", gutterPad + moreLine));
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
const outputLines = renderCellOutput(output, expanded, outputMaxLines, theme);
|
|
182
|
+
|
|
183
|
+
const sections: Array<{ label?: string; lines: readonly string[] }> = [{ lines: codeLines }];
|
|
184
|
+
if (outputLines.length > 0) {
|
|
185
|
+
sections.push({ label: theme.fg("toolTitle", "Output"), lines: outputLines });
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
return renderOutputBlock({ header: title, headerMeta: meta, state, sections, width }, theme);
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
/** Content and display limits for a Markdown preview with optional output. */
|
|
192
|
+
export interface MarkdownCellOptions {
|
|
193
|
+
content: string;
|
|
194
|
+
index?: number;
|
|
195
|
+
total?: number;
|
|
196
|
+
title?: string;
|
|
197
|
+
status?: "pending" | "running" | "warning" | "complete" | "error";
|
|
198
|
+
spinnerFrame?: number;
|
|
199
|
+
duration?: number;
|
|
200
|
+
output?: string;
|
|
201
|
+
outputMaxLines?: number;
|
|
202
|
+
contentMaxLines?: number;
|
|
203
|
+
expanded?: boolean;
|
|
204
|
+
width: number;
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
/** Render a Markdown preview and its optional output block. */
|
|
208
|
+
export function renderMarkdownCell(options: MarkdownCellOptions, theme: Theme): string[] {
|
|
209
|
+
const { content, output, expanded = false, outputMaxLines = 6, contentMaxLines = 12, width } = options;
|
|
210
|
+
const codeOptions: CodeCellOptions = {
|
|
211
|
+
code: "",
|
|
212
|
+
index: options.index,
|
|
213
|
+
total: options.total,
|
|
214
|
+
title: options.title,
|
|
215
|
+
status: options.status,
|
|
216
|
+
spinnerFrame: options.spinnerFrame,
|
|
217
|
+
duration: options.duration,
|
|
218
|
+
width,
|
|
219
|
+
};
|
|
220
|
+
const { title, meta } = formatHeader(codeOptions, theme);
|
|
221
|
+
const state = getState(options.status);
|
|
222
|
+
|
|
223
|
+
// Markdown component manages its own wrapping at the same inner width as
|
|
224
|
+
// `renderOutputBlock`, so collapsed row caps are applied after final wrapping.
|
|
225
|
+
const innerWidth = Math.max(20, outputBlockContentWidth(width));
|
|
226
|
+
const allLines = content.trim() ? new Markdown(content, 0, 0, getMarkdownTheme()).render(innerWidth) : [];
|
|
227
|
+
const maxContentLines = expanded ? allLines.length : Math.min(allLines.length, contentMaxLines);
|
|
228
|
+
const contentLines = allLines.slice(0, maxContentLines);
|
|
229
|
+
const hiddenContentLines = allLines.length - maxContentLines;
|
|
230
|
+
if (hiddenContentLines > 0) {
|
|
231
|
+
const hint = formatExpandHint(theme, expanded, hiddenContentLines > 0);
|
|
232
|
+
const moreLine = `${formatMoreItems(hiddenContentLines, "line")}${hint ? ` ${hint}` : ""}`;
|
|
233
|
+
contentLines.push(theme.fg("dim", moreLine));
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
const outputLines = renderCellOutput(output, expanded, outputMaxLines, theme);
|
|
237
|
+
|
|
238
|
+
const sections: Array<{ label?: string; lines: readonly string[] }> = [{ lines: contentLines }];
|
|
239
|
+
if (outputLines.length > 0) {
|
|
240
|
+
sections.push({ label: theme.fg("toolTitle", "Output"), lines: outputLines });
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
return renderOutputBlock({ header: title, headerMeta: meta, state, sections, width }, theme);
|
|
244
|
+
}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Render file listings with optional icons and metadata.
|
|
3
|
+
*/
|
|
4
|
+
import { getLanguageFromPath } from "../lang-from-path";
|
|
5
|
+
import type { Theme } from "../theme/theme";
|
|
6
|
+
import { renderTreeList } from "./tree-list";
|
|
7
|
+
|
|
8
|
+
/** A file-list item with optional display metadata. */
|
|
9
|
+
export interface FileEntry {
|
|
10
|
+
path: string;
|
|
11
|
+
/** Absolute filesystem path. When provided together with {@link FileListOptions.hyperlinkFn}, the
|
|
12
|
+
* rendered path text is wrapped in an OSC 8 hyperlink. */
|
|
13
|
+
absPath?: string;
|
|
14
|
+
isDirectory?: boolean;
|
|
15
|
+
meta?: string;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/** Files and presentation options for a tree-style listing. */
|
|
19
|
+
export interface FileListOptions {
|
|
20
|
+
files: FileEntry[];
|
|
21
|
+
expanded?: boolean;
|
|
22
|
+
maxCollapsed?: number;
|
|
23
|
+
showIcons?: boolean;
|
|
24
|
+
/** When provided, called with the entry's absolute path and the ANSI-styled display string to
|
|
25
|
+
* optionally wrap the path in an OSC 8 hyperlink. Only invoked when {@link FileEntry.absPath} is set. */
|
|
26
|
+
hyperlinkFn?: (absPath: string, displayText: string) => string;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/** Render file entries as a themed tree listing. */
|
|
30
|
+
export function renderFileList(options: FileListOptions, theme: Theme): string[] {
|
|
31
|
+
const { files, expanded = false, maxCollapsed = 8, showIcons = true, hyperlinkFn } = options;
|
|
32
|
+
|
|
33
|
+
return renderTreeList(
|
|
34
|
+
{
|
|
35
|
+
items: files,
|
|
36
|
+
expanded,
|
|
37
|
+
maxCollapsed,
|
|
38
|
+
itemType: "file",
|
|
39
|
+
renderItem: entry => {
|
|
40
|
+
const isDirectory = entry.isDirectory ?? entry.path.endsWith("/");
|
|
41
|
+
const displayPath = entry.path;
|
|
42
|
+
const lang = isDirectory ? undefined : getLanguageFromPath(displayPath);
|
|
43
|
+
const icon = !showIcons
|
|
44
|
+
? ""
|
|
45
|
+
: isDirectory
|
|
46
|
+
? theme.fg("accent", theme.icon.folder)
|
|
47
|
+
: theme.fg("muted", theme.getLangIcon(lang));
|
|
48
|
+
const labelColor = isDirectory ? "accent" : "toolOutput";
|
|
49
|
+
const meta = entry.meta ? ` ${theme.fg("dim", entry.meta)}` : "";
|
|
50
|
+
const iconPrefix = icon ? `${icon} ` : "";
|
|
51
|
+
const pathStr = theme.fg(labelColor, displayPath);
|
|
52
|
+
const linkedPath = entry.absPath && hyperlinkFn ? hyperlinkFn(entry.absPath, pathStr) : pathStr;
|
|
53
|
+
return `${iconPrefix}${linkedPath}${meta}`;
|
|
54
|
+
},
|
|
55
|
+
},
|
|
56
|
+
theme,
|
|
57
|
+
);
|
|
58
|
+
}
|
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OSC 8 terminal hyperlink support for paths and URLs.
|
|
3
|
+
*
|
|
4
|
+
* Wraps display text in `ESC ] 8 ; id=HASH ; URI ESC \ TEXT ESC ] 8 ; ; ESC \`
|
|
5
|
+
* sequences when the active terminal supports hyperlinks and the user setting
|
|
6
|
+
* permits it. Falls back to plain text when disabled.
|
|
7
|
+
*/
|
|
8
|
+
import * as url from "node:url";
|
|
9
|
+
import { setTerminalHyperlinks, TERMINAL, type TerminalId } from "../terminal-capabilities";
|
|
10
|
+
|
|
11
|
+
const OSC = "\x1b]";
|
|
12
|
+
const ST = "\x1b\\";
|
|
13
|
+
const BEL = "\x07";
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* The terminal's detected OSC 8 capability, captured once at import before any
|
|
17
|
+
* policy application mutates {@link TERMINAL}.hyperlinks. `auto` resolves against
|
|
18
|
+
* this immutable value so a prior `always`/`off` selection can never poison
|
|
19
|
+
* detection when the user switches back to `auto`.
|
|
20
|
+
*/
|
|
21
|
+
const DETECTED_TERMINAL_HYPERLINKS = TERMINAL.hyperlinks;
|
|
22
|
+
type HyperlinkMode = "off" | "auto" | "always";
|
|
23
|
+
let hyperlinkMode: HyperlinkMode = "auto";
|
|
24
|
+
|
|
25
|
+
/** Stable 8-char hex ID derived from a URI — hints terminals to coalesce identical adjacent links. */
|
|
26
|
+
function buildLinkId(uri: string): string {
|
|
27
|
+
let h = 0;
|
|
28
|
+
for (let i = 0; i < uri.length; i++) {
|
|
29
|
+
// FNV-1a-inspired mix — good enough for a UI hint, no deps
|
|
30
|
+
h = (Math.imul(31, h) + uri.charCodeAt(i)) | 0;
|
|
31
|
+
}
|
|
32
|
+
return (h >>> 0).toString(16).padStart(8, "0");
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Build the OSC 8 target for a file path on `terminalId`.
|
|
37
|
+
*
|
|
38
|
+
* A `file:` URI handed to an editor has to be a plain path. `Paths.get(URI)`
|
|
39
|
+
* rejects one carrying a query or a fragment outright — `IllegalArgumentException:
|
|
40
|
+
* URI has a query component` / `URI has a fragment component` — so appending
|
|
41
|
+
* `?line=` made every JVM-based language server (Kotlin LSP, Eclipse JDT LS)
|
|
42
|
+
* fail *every* request for the resulting document, and VS Code reads the query
|
|
43
|
+
* as part of the resource identity rather than as a cursor position: a blank
|
|
44
|
+
* editor tab that navigates nowhere and persists across window reloads (#12109).
|
|
45
|
+
*
|
|
46
|
+
* The VS Code family instead navigates the documented
|
|
47
|
+
* `vscode://file/<path>:<line>:<col>` form. Everywhere else the plain `file:`
|
|
48
|
+
* URI is right, with the location left in the visible text — terminals that
|
|
49
|
+
* parse a `path:line:col` suffix resolve that on their own.
|
|
50
|
+
*/
|
|
51
|
+
export function fileUriForTerminal(
|
|
52
|
+
filePath: string,
|
|
53
|
+
opts: { line?: number; col?: number } | undefined,
|
|
54
|
+
terminalId: TerminalId,
|
|
55
|
+
): string {
|
|
56
|
+
if (terminalId !== "vscode") return url.pathToFileURL(filePath).href;
|
|
57
|
+
// vscode:// takes a filesystem path with forward slashes. Encode each
|
|
58
|
+
// segment independently so separators and a Windows drive colon stay
|
|
59
|
+
// structural while reserved bytes in file names cannot become URI syntax.
|
|
60
|
+
const asPath = filePath.replace(/\\/gu, "/");
|
|
61
|
+
const encodedPath = asPath
|
|
62
|
+
.split("/")
|
|
63
|
+
.map((segment, index) => (index === 0 && /^[a-z]:$/iu.test(segment) ? segment : encodeURIComponent(segment)))
|
|
64
|
+
.join("/");
|
|
65
|
+
const position =
|
|
66
|
+
opts?.line === undefined ? "" : opts.col === undefined ? `:${opts.line}` : `:${opts.line}:${opts.col}`;
|
|
67
|
+
return `vscode://file${encodedPath.startsWith("/") ? "" : "/"}${encodedPath}${position}`;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/** Build the OSC 8 target for `filePath` on this terminal. */
|
|
71
|
+
function buildFileUri(filePath: string, opts?: { line?: number; col?: number }): string {
|
|
72
|
+
return fileUriForTerminal(filePath, opts, TERMINAL.id);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* Returns true when OSC 8 hyperlinks should be emitted.
|
|
77
|
+
*
|
|
78
|
+
* Respects `tui.hyperlinks` setting:
|
|
79
|
+
* - `"off"`: never
|
|
80
|
+
* - `"auto"`: when `process.stdout.isTTY`, `NO_COLOR` is unset, and the detected terminal reports hyperlink support
|
|
81
|
+
* - `"always"`: unconditionally (useful for viewers that support OSC 8 without advertising it)
|
|
82
|
+
* Uses the last policy pushed by the host, defaulting to `"auto"`.
|
|
83
|
+
*/
|
|
84
|
+
export function isHyperlinkEnabled(): boolean {
|
|
85
|
+
return resolveHyperlinkMode(hyperlinkMode);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
function resolveHyperlinkMode(mode: HyperlinkMode): boolean {
|
|
89
|
+
if (mode === "off") return false;
|
|
90
|
+
if (mode === "always") return true;
|
|
91
|
+
// auto: respect the detected capability (immutable snapshot, not the mutable
|
|
92
|
+
// runtime flag that applyHyperlinkSetting overwrites) and NO_COLOR.
|
|
93
|
+
if (Bun.env.NO_COLOR) return false;
|
|
94
|
+
if (!process.stdout.isTTY) return false;
|
|
95
|
+
return DETECTED_TERMINAL_HYPERLINKS;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* Push the resolved `tui.hyperlinks` policy into {@link TERMINAL}.hyperlinks, the
|
|
100
|
+
* effective flag that pi-tui renderers gating on it directly — the Markdown
|
|
101
|
+
* component's `[text](url)`/bare-URL links and the status-line PR link — consult.
|
|
102
|
+
*
|
|
103
|
+
* Detection stays immutable in {@link DETECTED_TERMINAL_HYPERLINKS}, so this only
|
|
104
|
+
* ever writes the effective decision; `auto` transitions restore real detection
|
|
105
|
+
* via {@link isHyperlinkEnabled}. Called at TUI startup and whenever the setting
|
|
106
|
+
* changes at runtime.
|
|
107
|
+
* Accepts the raw (unvalidated) setting value; anything but a known mode falls
|
|
108
|
+
* back to the last policy pushed by the host.
|
|
109
|
+
*/
|
|
110
|
+
export function applyHyperlinkSetting(mode?: unknown): void {
|
|
111
|
+
if (mode === "off" || mode === "auto" || mode === "always") hyperlinkMode = mode;
|
|
112
|
+
setTerminalHyperlinks(isHyperlinkEnabled());
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
function safeHyperlinkUri(uri: string): string | undefined {
|
|
116
|
+
if (!uri || /[\x00-\x1f\x7f]/.test(uri)) return undefined;
|
|
117
|
+
return uri;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
function wrapHyperlinkCore(uri: string, displayText: string, terminator: typeof ST | typeof BEL): string {
|
|
121
|
+
// Do not double-wrap if the text already embeds an OSC 8 sequence.
|
|
122
|
+
if (displayText.includes("\x1b]8;")) return displayText;
|
|
123
|
+
const safeUri = safeHyperlinkUri(uri);
|
|
124
|
+
if (!safeUri) return displayText;
|
|
125
|
+
const id = buildLinkId(safeUri);
|
|
126
|
+
return `${OSC}8;id=${id};${safeUri}${terminator}${displayText}${OSC}8;;${terminator}`;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
function wrapHyperlink(uri: string, displayText: string): string {
|
|
130
|
+
if (!isHyperlinkEnabled()) return displayText;
|
|
131
|
+
return wrapHyperlinkCore(uri, displayText, ST);
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
/**
|
|
135
|
+
* Wrap `displayText` in an OSC 8 hyperlink pointing at `uri`.
|
|
136
|
+
*
|
|
137
|
+
* Returns `displayText` unchanged when hyperlinks are disabled, `uri` contains
|
|
138
|
+
* terminal control bytes, or `displayText` already contains an OSC 8 sequence.
|
|
139
|
+
*/
|
|
140
|
+
export function uriHyperlink(uri: string, displayText: string): string {
|
|
141
|
+
return wrapHyperlink(uri, displayText);
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
/**
|
|
145
|
+
* Wrap `displayText` in an OSC 8 hyperlink pointing at an HTTP(S) URL.
|
|
146
|
+
* `www.example.com` inputs are linked as `https://www.example.com`.
|
|
147
|
+
*/
|
|
148
|
+
export function urlHyperlink(url: string, displayText: string): string {
|
|
149
|
+
const normalized = url.match(/^www\./i) ? `https://${url}` : url;
|
|
150
|
+
try {
|
|
151
|
+
const parsed = new URL(normalized);
|
|
152
|
+
if (parsed.protocol !== "http:" && parsed.protocol !== "https:") return displayText;
|
|
153
|
+
return wrapHyperlink(parsed.href, displayText);
|
|
154
|
+
} catch {
|
|
155
|
+
return displayText;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
/**
|
|
160
|
+
* Wrap `displayText` in an OSC 8 hyperlink pointing at an HTTP(S) URL,
|
|
161
|
+
* bypassing terminal capability auto-detection. Used for auth prompts where
|
|
162
|
+
* an inert "click" label blocks login on terminals whose capabilities are
|
|
163
|
+
* not advertised. Still returns plain text when the host has explicitly opted
|
|
164
|
+
* out by pushing the `"off"` policy.
|
|
165
|
+
*/
|
|
166
|
+
export function urlHyperlinkAlways(url: string, displayText: string): string {
|
|
167
|
+
if (hyperlinkMode === "off") return displayText;
|
|
168
|
+
const normalized = url.match(/^www\./i) ? `https://${url}` : url;
|
|
169
|
+
try {
|
|
170
|
+
const parsed = new URL(normalized);
|
|
171
|
+
if (parsed.protocol !== "http:" && parsed.protocol !== "https:") return displayText;
|
|
172
|
+
return wrapHyperlinkCore(parsed.href, displayText, BEL);
|
|
173
|
+
} catch {
|
|
174
|
+
return displayText;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
/**
|
|
179
|
+
* Wrap `displayText` in an OSC 8 hyperlink pointing at a filesystem path.
|
|
180
|
+
*
|
|
181
|
+
* Returns `displayText` unchanged when hyperlinks are disabled or when
|
|
182
|
+
* the text already contains an OSC 8 sequence (prevents double-wrapping).
|
|
183
|
+
* Relative paths resolve against the current working directory before URI
|
|
184
|
+
* encoding so the OSC 8 target is always a valid `file://` URL.
|
|
185
|
+
*
|
|
186
|
+
* @param filePath - Filesystem path
|
|
187
|
+
* @param displayText - Text to render as the hyperlink anchor (may contain ANSI codes)
|
|
188
|
+
* @param opts - Optional line/col position appended as `?line=N&col=M` query params
|
|
189
|
+
*/
|
|
190
|
+
export function fileHyperlink(filePath: string, displayText: string, opts?: { line?: number; col?: number }): string {
|
|
191
|
+
return wrapHyperlink(buildFileUri(filePath, opts), displayText);
|
|
192
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Public exports for shared TUI components.
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
export * from "./code-cell";
|
|
6
|
+
export * from "./file-list";
|
|
7
|
+
export * from "./hyperlink";
|
|
8
|
+
export * from "./output-block";
|
|
9
|
+
export * from "./output-pane";
|
|
10
|
+
export * from "./render-utils";
|
|
11
|
+
export * from "./sixel";
|
|
12
|
+
export * from "./status-line";
|
|
13
|
+
export * from "./tool-card";
|
|
14
|
+
export * from "./tree-list";
|
|
15
|
+
export * from "./types";
|
|
16
|
+
export * from "./utils";
|
|
17
|
+
export * from "./width-aware-text";
|