@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,261 @@
|
|
|
1
|
+
import { Box } from "../components/box";
|
|
2
|
+
import { Disclosure } from "../components/disclosure";
|
|
3
|
+
import { type Component } from "../tui";
|
|
4
|
+
import { Markdown } from "../components/markdown";
|
|
5
|
+
import { formatNumber } from "@oh-my-pi/pi-utils";
|
|
6
|
+
import { getMarkdownTheme, theme } from "../theme";
|
|
7
|
+
import type { BranchSummaryMessage, CompactionSummaryMessage, CustomMessage } from "./messages";
|
|
8
|
+
|
|
9
|
+
/** Divider labels per compaction method; unknown/legacy methods fall back to "compacted". */
|
|
10
|
+
const COMPACTION_METHOD_LABELS: Record<string, string> = {
|
|
11
|
+
remote: "remote-compacted",
|
|
12
|
+
soft: "soft-compacted",
|
|
13
|
+
handoff: "handed-off",
|
|
14
|
+
snapcompact: "snap-compacted",
|
|
15
|
+
shake: "shaken",
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
/** `256K→20K` amount badge, or undefined when the entry predates `tokensAfter`. */
|
|
19
|
+
function compactionAmount(message: CompactionSummaryMessage): string | undefined {
|
|
20
|
+
if (message.tokensAfter === undefined || message.tokensBefore <= 0) return undefined;
|
|
21
|
+
return `${formatNumber(message.tokensBefore)}→${formatNumber(message.tokensAfter)}`;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
interface SummaryDividerOptions {
|
|
25
|
+
label: () => string;
|
|
26
|
+
detailMarkdown: () => string;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Width-aware divider banner shared as every history-collapse summary row:
|
|
31
|
+
* blank, the labeled rule (or the bare label when too narrow to frame), blank.
|
|
32
|
+
*/
|
|
33
|
+
class DividerSummary implements Component {
|
|
34
|
+
readonly #label: () => string;
|
|
35
|
+
#cache: { width: number; lines: readonly string[] } | undefined;
|
|
36
|
+
|
|
37
|
+
constructor(label: () => string) {
|
|
38
|
+
this.#label = label;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
invalidate(): void {
|
|
42
|
+
this.#cache = undefined;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
render(width: number): readonly string[] {
|
|
46
|
+
width = Math.max(1, width);
|
|
47
|
+
if (this.#cache?.width === width) return this.#cache.lines;
|
|
48
|
+
const lines = ["", this.#divider(width), ""];
|
|
49
|
+
this.#cache = { width, lines };
|
|
50
|
+
return lines;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
#divider(width: number): string {
|
|
54
|
+
const rule = theme.tree.horizontal;
|
|
55
|
+
const label = this.#label();
|
|
56
|
+
// sep.dot ships pre-padded (" · "); trim so the hint joins with single spaces.
|
|
57
|
+
const hint = `${theme.sep.dot.trim()} ctrl+o`;
|
|
58
|
+
const plainWidth = Bun.stringWidth(`${label} ${hint}`, { countAnsiEscapeCodes: false });
|
|
59
|
+
// ` label hint ` framed by rules on both sides.
|
|
60
|
+
const remaining = width - plainWidth - 2;
|
|
61
|
+
if (remaining < 4) {
|
|
62
|
+
// Too narrow for a framed rule — emit the bare label.
|
|
63
|
+
return theme.fg("muted", label);
|
|
64
|
+
}
|
|
65
|
+
const left = Math.floor(remaining / 2);
|
|
66
|
+
const right = remaining - left;
|
|
67
|
+
return (
|
|
68
|
+
theme.fg("dim", rule.repeat(left)) +
|
|
69
|
+
` ${theme.fg("muted", label)} ${theme.fg("dim", hint)} ` +
|
|
70
|
+
theme.fg("dim", rule.repeat(right))
|
|
71
|
+
);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* Common summary/detail delegate behind the compaction, handoff, and branch
|
|
77
|
+
* banners: the width-aware divider is always shown while the Markdown detail
|
|
78
|
+
* box is constructed lazily only on the first expanded render and retained
|
|
79
|
+
* across collapse/re-expand cycles.
|
|
80
|
+
*/
|
|
81
|
+
class SummaryMessageComponent implements Component {
|
|
82
|
+
#disclosure: Disclosure;
|
|
83
|
+
#ignoreTight: boolean | undefined;
|
|
84
|
+
#disposed = false;
|
|
85
|
+
|
|
86
|
+
readonly #options: SummaryDividerOptions;
|
|
87
|
+
|
|
88
|
+
constructor(options: SummaryDividerOptions) {
|
|
89
|
+
this.#options = options;
|
|
90
|
+
this.#disclosure = this.#createDisclosure(false);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
setExpanded(expanded: boolean): void {
|
|
94
|
+
this.#disclosure.setExpanded(expanded);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
setIgnoreTight(ignore: boolean): this {
|
|
98
|
+
if (this.#disposed || this.#ignoreTight === ignore) return this;
|
|
99
|
+
this.#ignoreTight = ignore;
|
|
100
|
+
this.#disclosure.setIgnoreTight(ignore);
|
|
101
|
+
return this;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
invalidate(): void {
|
|
105
|
+
if (this.#disposed) return;
|
|
106
|
+
// Theme may have changed — rebuild the delegate unmaterialized so the
|
|
107
|
+
// detail box picks up fresh styling lazily on its next expanded render.
|
|
108
|
+
const expanded = this.#disclosure.expanded;
|
|
109
|
+
this.#disclosure.dispose();
|
|
110
|
+
this.#disclosure = this.#createDisclosure(expanded);
|
|
111
|
+
if (this.#ignoreTight !== undefined) this.#disclosure.setIgnoreTight(this.#ignoreTight);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
dispose(): void {
|
|
115
|
+
if (this.#disposed) return;
|
|
116
|
+
this.#disposed = true;
|
|
117
|
+
this.#disclosure.dispose();
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
render(width: number): readonly string[] {
|
|
121
|
+
return this.#disclosure.render(width);
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
#createDisclosure(expanded: boolean): Disclosure {
|
|
125
|
+
return new Disclosure({
|
|
126
|
+
summary: new DividerSummary(this.#options.label),
|
|
127
|
+
body: () => this.#detailBox(),
|
|
128
|
+
expanded,
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
#detailBox(): Box {
|
|
133
|
+
const box = new Box(1, 1, t => theme.bg("customMessageBg", t));
|
|
134
|
+
box.setIgnoreTight(true);
|
|
135
|
+
box.addChild(
|
|
136
|
+
new Markdown(this.#options.detailMarkdown(), 0, 0, getMarkdownTheme(), {
|
|
137
|
+
color: (text: string) => theme.fg("customMessageText", text),
|
|
138
|
+
}),
|
|
139
|
+
);
|
|
140
|
+
return box;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
/**
|
|
145
|
+
* Compaction point in the transcript, rendered as a slim horizontal divider:
|
|
146
|
+
*
|
|
147
|
+
* ──────── 📷 remote-compacted · 256K→20K · ctrl+o ────────
|
|
148
|
+
*
|
|
149
|
+
* The label names the maintenance method that fired (remote/soft/handoff/
|
|
150
|
+
* snapcompact; "compacted" for legacy or extension-provided entries) and the
|
|
151
|
+
* before → after context amounts when the entry recorded them. The
|
|
152
|
+
* conversation above the divider stays visible (display transcript keeps
|
|
153
|
+
* full history); only the LLM context was reset. Expanding (ctrl+o) reveals
|
|
154
|
+
* the compaction summary below the divider.
|
|
155
|
+
*/
|
|
156
|
+
export class CompactionSummaryMessageComponent extends SummaryMessageComponent {
|
|
157
|
+
constructor(message: CompactionSummaryMessage) {
|
|
158
|
+
super({
|
|
159
|
+
// A dead-end warning stamped by the progress guard badges the bar;
|
|
160
|
+
// the full text lives in the ctrl+o detail block below.
|
|
161
|
+
label: () => compactionLabel(message),
|
|
162
|
+
detailMarkdown: () => compactionDetailMarkdown(message),
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
function compactionLabel(message: CompactionSummaryMessage): string {
|
|
168
|
+
const name = (message.method && COMPACTION_METHOD_LABELS[message.method]) || "compacted";
|
|
169
|
+
let label = `${theme.icon.camera} ${name}`;
|
|
170
|
+
const amount = compactionAmount(message);
|
|
171
|
+
if (amount) label += `${theme.sep.dot}${amount}`;
|
|
172
|
+
if (message.warning) label += ` ${theme.fg("warning", theme.icon.warning)}`;
|
|
173
|
+
return label;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
function compactionDetailMarkdown(message: CompactionSummaryMessage): string {
|
|
177
|
+
const tokenLine =
|
|
178
|
+
message.tokensBefore > 0
|
|
179
|
+
? message.tokensAfter !== undefined
|
|
180
|
+
? `Compacted from ${message.tokensBefore.toLocaleString()} to ${message.tokensAfter.toLocaleString()} tokens`
|
|
181
|
+
: `Compacted from ${message.tokensBefore.toLocaleString()} tokens`
|
|
182
|
+
: message.tokensAfter !== undefined
|
|
183
|
+
? `Compacted to ${message.tokensAfter.toLocaleString()} tokens`
|
|
184
|
+
: "Compacted context";
|
|
185
|
+
const frameCount = message.images?.length ?? 0;
|
|
186
|
+
const frameNote =
|
|
187
|
+
frameCount > 0 ? `\n\n_${frameCount} snapcompact frame${frameCount === 1 ? "" : "s"} attached_` : "";
|
|
188
|
+
const warningNote = message.warning ? `\n\n${theme.icon.warning} **Warning:** ${message.warning}` : "";
|
|
189
|
+
return `**${tokenLine}**${warningNote}\n\n${message.summary}${frameNote}`;
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
/**
|
|
193
|
+
* Handoff is a compaction strategy too, but it is persisted as a custom message
|
|
194
|
+
* so the LLM sees the handoff-specific developer context. Render it with the
|
|
195
|
+
* same divider affordance as `/compact` instead of the generic `[handoff]` box.
|
|
196
|
+
*/
|
|
197
|
+
export class HandoffSummaryMessageComponent extends SummaryMessageComponent {
|
|
198
|
+
constructor(message: CustomMessage<unknown>) {
|
|
199
|
+
super({
|
|
200
|
+
label: () => `${theme.icon.context} handed-off`,
|
|
201
|
+
detailMarkdown: () => {
|
|
202
|
+
const document = extractHandoffDocument(getCustomMessageText(message));
|
|
203
|
+
return `**Handoff context**\n\n${document || "_No handoff content._"}`;
|
|
204
|
+
},
|
|
205
|
+
});
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
export function createHandoffSummaryMessageComponent(
|
|
210
|
+
message: CustomMessage<unknown>,
|
|
211
|
+
expanded: boolean,
|
|
212
|
+
): HandoffSummaryMessageComponent | undefined {
|
|
213
|
+
if (message.customType !== "handoff" || !message.display) return undefined;
|
|
214
|
+
const component = new HandoffSummaryMessageComponent(message);
|
|
215
|
+
component.setExpanded(expanded);
|
|
216
|
+
return component;
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
/**
|
|
220
|
+
* A branch summary collapses a side branch back into the main line. Render it
|
|
221
|
+
* with the same slim divider as `/compact` and handoff rather than a `[branch]`
|
|
222
|
+
* box, so every history-collapse point reads as one consistent banner.
|
|
223
|
+
*/
|
|
224
|
+
export class BranchSummaryMessageComponent extends SummaryMessageComponent {
|
|
225
|
+
constructor(message: BranchSummaryMessage) {
|
|
226
|
+
super({
|
|
227
|
+
label: () => `${theme.icon.branch} branch`,
|
|
228
|
+
detailMarkdown: () => `**Branch summary**\n\n${message.summary}`,
|
|
229
|
+
});
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
function getCustomMessageText(message: CustomMessage<unknown>): string {
|
|
234
|
+
if (typeof message.content === "string") return message.content;
|
|
235
|
+
let firstText: string | undefined;
|
|
236
|
+
let parts: string[] | undefined;
|
|
237
|
+
for (const content of message.content) {
|
|
238
|
+
if (content.type !== "text") continue;
|
|
239
|
+
if (firstText === undefined) {
|
|
240
|
+
firstText = content.text;
|
|
241
|
+
continue;
|
|
242
|
+
}
|
|
243
|
+
if (parts === undefined) {
|
|
244
|
+
parts = [firstText];
|
|
245
|
+
}
|
|
246
|
+
parts.push(content.text);
|
|
247
|
+
}
|
|
248
|
+
return parts === undefined ? (firstText ?? "") : parts.join("\n");
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
function extractHandoffDocument(text: string): string {
|
|
252
|
+
const openTag = "<handoff-context>";
|
|
253
|
+
const closeTag = "</handoff-context>";
|
|
254
|
+
const openIndex = text.indexOf(openTag);
|
|
255
|
+
if (openIndex === -1) return text.trim();
|
|
256
|
+
|
|
257
|
+
const contentStart = openIndex + openTag.length;
|
|
258
|
+
const closeIndex = text.indexOf(closeTag, contentStart);
|
|
259
|
+
const document = closeIndex === -1 ? text.slice(contentStart) : text.slice(contentStart, closeIndex);
|
|
260
|
+
return document.trim();
|
|
261
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { FramedMessageComponent } from "../chrome/message-frame";
|
|
2
|
+
import type { MessageRenderer } from "./extension-types";
|
|
3
|
+
import { theme } from "../theme";
|
|
4
|
+
import { type CustomMessage, LIVE_DELEGATION_MESSAGE_TYPE } from "./messages";
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Component that renders a custom message entry from extensions.
|
|
8
|
+
* Uses distinct styling to differentiate from user messages.
|
|
9
|
+
*/
|
|
10
|
+
export class CustomMessageComponent extends FramedMessageComponent<CustomMessage<unknown>> {
|
|
11
|
+
constructor(message: CustomMessage<unknown>, customRenderer?: MessageRenderer) {
|
|
12
|
+
const isLiveDelegation = message.customType === LIVE_DELEGATION_MESSAGE_TYPE;
|
|
13
|
+
super({
|
|
14
|
+
message,
|
|
15
|
+
// The transcript dispatch routes both `custom` and legacy `hookMessage` roles here:
|
|
16
|
+
// tag hooks with the hook glyph, other injected messages with a neutral package.
|
|
17
|
+
icon: () => (String(message.role) === "hookMessage" ? theme.icon.extensionHook : theme.icon.package),
|
|
18
|
+
hideHeader: isLiveDelegation,
|
|
19
|
+
borderColor: isLiveDelegation ? "borderAccent" : undefined,
|
|
20
|
+
customRenderer,
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/** Process-wide display preferences applied by the host settings hooks. */
|
|
2
|
+
export interface ChatTranscriptDisplayPreferences {
|
|
3
|
+
hideToolActivity: boolean;
|
|
4
|
+
readToolResultPreview: boolean;
|
|
5
|
+
showImages: boolean;
|
|
6
|
+
cacheMissMarker: boolean;
|
|
7
|
+
showTokenUsage: boolean;
|
|
8
|
+
showTurnTime: boolean;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
/** Current transcript display preferences. */
|
|
12
|
+
export const chatTranscriptDisplayPreferences: ChatTranscriptDisplayPreferences = {
|
|
13
|
+
hideToolActivity: false,
|
|
14
|
+
readToolResultPreview: false,
|
|
15
|
+
showImages: true,
|
|
16
|
+
cacheMissMarker: false,
|
|
17
|
+
showTokenUsage: false,
|
|
18
|
+
showTurnTime: false,
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
/** Apply host display preferences without pulling settings into the renderer. */
|
|
22
|
+
export function setChatTranscriptDisplayPreferences(preferences: Partial<ChatTranscriptDisplayPreferences>): void {
|
|
23
|
+
Object.assign(chatTranscriptDisplayPreferences, preferences);
|
|
24
|
+
}
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Component for displaying user-initiated eval execution with streaming output.
|
|
3
|
+
* Shares the same kernel session as the agent's eval tool.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import type { Loader } from "../components/loader";
|
|
7
|
+
import { Text } from "../components/text";
|
|
8
|
+
import { Container, type TUI } from "../tui";
|
|
9
|
+
import { sanitizeText } from "@oh-my-pi/pi-utils";
|
|
10
|
+
import { highlightCode, theme } from "../theme/theme";
|
|
11
|
+
import type { OutputArtifactError } from "../tools/streaming-output";
|
|
12
|
+
import type { TruncationMeta } from "../tools/output-meta";
|
|
13
|
+
import { OutputPane } from "../render/output-pane";
|
|
14
|
+
import {
|
|
15
|
+
buildExecutionFrame,
|
|
16
|
+
buildStatusFooter,
|
|
17
|
+
clampDisplayLine,
|
|
18
|
+
type ExecutionColorKey,
|
|
19
|
+
type ExecutionStatus,
|
|
20
|
+
PREVIEW_LINES,
|
|
21
|
+
resolveExecutionStatus,
|
|
22
|
+
} from "./execution-shared";
|
|
23
|
+
|
|
24
|
+
export type EvalExecutionLanguage = "python" | "js";
|
|
25
|
+
|
|
26
|
+
export class EvalExecutionComponent extends Container {
|
|
27
|
+
#status: ExecutionStatus = "running";
|
|
28
|
+
#exitCode: number | undefined = undefined;
|
|
29
|
+
#loader: Loader;
|
|
30
|
+
#truncation?: TruncationMeta;
|
|
31
|
+
#artifactError?: OutputArtifactError;
|
|
32
|
+
#expanded = false;
|
|
33
|
+
// Post-finalize mutation counter (FinalizableBlock.getTranscriptBlockVersion):
|
|
34
|
+
// a completed cell's block still mutates on expansion toggles, and the
|
|
35
|
+
// transcript's width-epoch resolution and committed-render bypass must
|
|
36
|
+
// observe that.
|
|
37
|
+
#blockVersion = 0;
|
|
38
|
+
#contentContainer: Container;
|
|
39
|
+
#outputPane: OutputPane;
|
|
40
|
+
readonly #code: string;
|
|
41
|
+
readonly #excludeFromContext: boolean;
|
|
42
|
+
readonly #language: EvalExecutionLanguage;
|
|
43
|
+
|
|
44
|
+
#highlightLang(): "python" | "javascript" {
|
|
45
|
+
return this.#language === "js" ? "javascript" : "python";
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
#formatHeader(colorKey: ExecutionColorKey): Text {
|
|
49
|
+
const prompt = theme.fg(colorKey, theme.bold(">>>"));
|
|
50
|
+
const continuation = theme.fg(colorKey, " ");
|
|
51
|
+
const codeLines = highlightCode(this.#code, this.#highlightLang());
|
|
52
|
+
const headerLines = codeLines.map((line, index) =>
|
|
53
|
+
index === 0 ? `${prompt} ${line}` : `${continuation}${line}`,
|
|
54
|
+
);
|
|
55
|
+
return new Text(headerLines.join("\n"), 1, 0);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
constructor(code: string, ui: TUI, excludeFromContext = false, language: EvalExecutionLanguage = "python") {
|
|
59
|
+
super();
|
|
60
|
+
this.#code = code;
|
|
61
|
+
this.#excludeFromContext = excludeFromContext;
|
|
62
|
+
this.#language = language;
|
|
63
|
+
|
|
64
|
+
const colorKey: ExecutionColorKey = this.#excludeFromContext ? "dim" : "pythonMode";
|
|
65
|
+
const { contentContainer, loader } = buildExecutionFrame(this, ui, colorKey);
|
|
66
|
+
this.#contentContainer = contentContainer;
|
|
67
|
+
this.#loader = loader;
|
|
68
|
+
this.#outputPane = new OutputPane(theme, {
|
|
69
|
+
expanded: false,
|
|
70
|
+
collapsedMaxLines: PREVIEW_LINES,
|
|
71
|
+
edge: "tail",
|
|
72
|
+
visual: true,
|
|
73
|
+
paddingX: 1,
|
|
74
|
+
leadingBlank: true,
|
|
75
|
+
showHiddenMarker: false,
|
|
76
|
+
showExpandHint: false,
|
|
77
|
+
styleLine: line => theme.fg("muted", line),
|
|
78
|
+
normalizeLine: clampDisplayLine,
|
|
79
|
+
});
|
|
80
|
+
|
|
81
|
+
this.#contentContainer.addChild(this.#formatHeader(colorKey));
|
|
82
|
+
this.#contentContainer.addChild(this.#loader);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* Transcript finalization contract (see `FinalizableBlock`): the collapsed
|
|
87
|
+
* streaming preview rewrites its tail window every chunk, so the block must
|
|
88
|
+
* stay out of native scrollback until the cell completes.
|
|
89
|
+
*/
|
|
90
|
+
isTranscriptBlockFinalized(): boolean {
|
|
91
|
+
return this.#status !== "running";
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
getTranscriptBlockVersion(): number {
|
|
95
|
+
return this.#blockVersion;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
setExpanded(expanded: boolean): void {
|
|
99
|
+
if (this.#expanded !== expanded) this.#blockVersion++;
|
|
100
|
+
this.#expanded = expanded;
|
|
101
|
+
this.#outputPane.setExpanded(expanded);
|
|
102
|
+
this.#updateDisplay();
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
override invalidate(): void {
|
|
106
|
+
super.invalidate();
|
|
107
|
+
this.#updateDisplay();
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
appendOutput(chunk: string): void {
|
|
111
|
+
// Chunk is pre-sanitized by OutputSink.push() — no need to sanitize again.
|
|
112
|
+
this.#outputPane.append(chunk);
|
|
113
|
+
this.#updateDisplay();
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
setComplete(
|
|
117
|
+
exitCode: number | undefined,
|
|
118
|
+
cancelled: boolean,
|
|
119
|
+
options?: { output?: string; truncation?: TruncationMeta; artifactError?: OutputArtifactError },
|
|
120
|
+
): void {
|
|
121
|
+
this.#exitCode = exitCode;
|
|
122
|
+
this.#status = resolveExecutionStatus(exitCode, cancelled);
|
|
123
|
+
this.#truncation = options?.truncation;
|
|
124
|
+
this.#artifactError = options?.artifactError;
|
|
125
|
+
this.#outputPane.finish();
|
|
126
|
+
if (options?.output !== undefined) {
|
|
127
|
+
this.#setOutput(options.output);
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
this.#loader.stop();
|
|
131
|
+
this.#updateDisplay();
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
#updateDisplay(): void {
|
|
135
|
+
// Only the collapsed preview hides lines; when expanded the footer must
|
|
136
|
+
// not keep advertising hidden lines / ctrl+o.
|
|
137
|
+
const hiddenLineCount = this.#expanded ? 0 : Math.max(0, this.#outputPane.lineCount - PREVIEW_LINES);
|
|
138
|
+
|
|
139
|
+
this.#contentContainer.clear();
|
|
140
|
+
|
|
141
|
+
const colorKey: ExecutionColorKey = this.#excludeFromContext ? "dim" : "pythonMode";
|
|
142
|
+
this.#contentContainer.addChild(this.#formatHeader(colorKey));
|
|
143
|
+
|
|
144
|
+
if (this.#outputPane.lineCount > 0) this.#contentContainer.addChild(this.#outputPane);
|
|
145
|
+
|
|
146
|
+
if (this.#status === "running") {
|
|
147
|
+
this.#contentContainer.addChild(this.#loader);
|
|
148
|
+
} else {
|
|
149
|
+
const footer = buildStatusFooter({
|
|
150
|
+
status: this.#status,
|
|
151
|
+
exitCode: this.#exitCode,
|
|
152
|
+
truncation: this.#truncation,
|
|
153
|
+
artifactError: this.#artifactError,
|
|
154
|
+
hiddenLineCount,
|
|
155
|
+
});
|
|
156
|
+
if (footer) this.#contentContainer.addChild(footer);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
#setOutput(output: string): void {
|
|
161
|
+
const clean = sanitizeText(output);
|
|
162
|
+
this.#outputPane.setText(clean);
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
getOutput(): string {
|
|
166
|
+
return this.#outputPane.getText();
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
getCode(): string {
|
|
170
|
+
return this.#code;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared rendering primitives for bash/eval execution components.
|
|
3
|
+
*
|
|
4
|
+
* Each helper isolates a piece of structure both components share verbatim
|
|
5
|
+
* (frame layout and post-run status line). Differences in
|
|
6
|
+
* how each component prepares its header, output lines, or sixel masking
|
|
7
|
+
* stay in their respective files.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import { Loader } from "../components/loader";
|
|
11
|
+
import { Text } from "../components/text";
|
|
12
|
+
import { Container, type TUI } from "../tui";
|
|
13
|
+
import { getSymbolTheme, theme } from "../theme/theme";
|
|
14
|
+
import type { OutputArtifactError } from "../tools/streaming-output";
|
|
15
|
+
import { formatArtifactErrorNotice, formatTruncationMetaNotice, type TruncationMeta } from "../tools/output-meta";
|
|
16
|
+
import { DynamicBorder } from "../chrome/dynamic-border";
|
|
17
|
+
import { Ellipsis, truncateToWidth, visibleWidth } from "../utils";
|
|
18
|
+
|
|
19
|
+
/** Output rows shown while an execution is collapsed. */
|
|
20
|
+
export const PREVIEW_LINES = 20;
|
|
21
|
+
|
|
22
|
+
/** Maximum visible columns retained from an execution output line. */
|
|
23
|
+
export const MAX_DISPLAY_LINE_CHARS = 4000;
|
|
24
|
+
|
|
25
|
+
/** Clamp execution output by visible width without splitting ANSI sequences. */
|
|
26
|
+
export function clampDisplayLine(line: string): string {
|
|
27
|
+
const visible = visibleWidth(line);
|
|
28
|
+
if (visible <= MAX_DISPLAY_LINE_CHARS) {
|
|
29
|
+
return line;
|
|
30
|
+
}
|
|
31
|
+
const omitted = visible - MAX_DISPLAY_LINE_CHARS;
|
|
32
|
+
return `${truncateToWidth(line, MAX_DISPLAY_LINE_CHARS, Ellipsis.Omit)}… [${omitted} visible columns omitted]`;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export type ExecutionStatus = "running" | "complete" | "cancelled" | "error";
|
|
36
|
+
|
|
37
|
+
/** Theme color keys valid for an execution frame. */
|
|
38
|
+
export type ExecutionColorKey = "dim" | "bashMode" | "pythonMode";
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Build the spacer + top border + content container + bottom border scaffold
|
|
42
|
+
* that bash and eval execution components share. The caller appends the
|
|
43
|
+
* header (command vs `>>>` prompt) and the returned loader to
|
|
44
|
+
* `contentContainer` so per-mode order is preserved.
|
|
45
|
+
*/
|
|
46
|
+
export function buildExecutionFrame(
|
|
47
|
+
parent: Container,
|
|
48
|
+
ui: TUI,
|
|
49
|
+
colorKey: ExecutionColorKey,
|
|
50
|
+
): { contentContainer: Container; loader: Loader } {
|
|
51
|
+
const borderColor = (str: string) => theme.fg(colorKey, str);
|
|
52
|
+
|
|
53
|
+
parent.addChild(new DynamicBorder(borderColor));
|
|
54
|
+
|
|
55
|
+
const contentContainer = new Container();
|
|
56
|
+
parent.addChild(contentContainer);
|
|
57
|
+
|
|
58
|
+
const loader = new Loader(
|
|
59
|
+
ui,
|
|
60
|
+
spinner => theme.fg(colorKey, spinner),
|
|
61
|
+
text => theme.fg("muted", text),
|
|
62
|
+
`Running… (esc to cancel)`,
|
|
63
|
+
getSymbolTheme().spinnerFrames,
|
|
64
|
+
);
|
|
65
|
+
|
|
66
|
+
parent.addChild(new DynamicBorder(borderColor));
|
|
67
|
+
return { contentContainer, loader };
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Build the post-run status block (hidden-line hint, exit/cancel marker,
|
|
72
|
+
* truncation notice). Returns undefined when there is nothing to display so
|
|
73
|
+
* callers can skip appending a stray Text child.
|
|
74
|
+
*/
|
|
75
|
+
export function buildStatusFooter(opts: {
|
|
76
|
+
status: ExecutionStatus;
|
|
77
|
+
exitCode: number | undefined;
|
|
78
|
+
truncation: TruncationMeta | undefined;
|
|
79
|
+
artifactError?: OutputArtifactError;
|
|
80
|
+
hiddenLineCount: number;
|
|
81
|
+
/** Suppress the "… N more lines" hint (used when sixel passthrough renders the full output). */
|
|
82
|
+
suppressHiddenCount?: boolean;
|
|
83
|
+
}): Text | undefined {
|
|
84
|
+
const parts: string[] = [];
|
|
85
|
+
|
|
86
|
+
if (opts.hiddenLineCount > 0 && !opts.suppressHiddenCount) {
|
|
87
|
+
parts.push(theme.fg("dim", `… ${opts.hiddenLineCount} more lines (ctrl+o to expand)`));
|
|
88
|
+
}
|
|
89
|
+
if (opts.status === "cancelled") {
|
|
90
|
+
parts.push(theme.fg("warning", "(cancelled)"));
|
|
91
|
+
} else if (opts.status === "error") {
|
|
92
|
+
parts.push(theme.fg("error", `(exit ${opts.exitCode})`));
|
|
93
|
+
}
|
|
94
|
+
if (opts.truncation) {
|
|
95
|
+
parts.push(theme.fg("warning", formatTruncationMetaNotice(opts.truncation)));
|
|
96
|
+
}
|
|
97
|
+
if (opts.artifactError) {
|
|
98
|
+
parts.push(theme.fg("warning", formatArtifactErrorNotice(opts.artifactError)));
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
if (parts.length === 0) return undefined;
|
|
102
|
+
return new Text(`\n${parts.join("\n")}`, 1, 0);
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* Derive the post-run status from an exit code + cancellation flag using the
|
|
107
|
+
* same precedence both execution components apply.
|
|
108
|
+
*/
|
|
109
|
+
export function resolveExecutionStatus(exitCode: number | undefined, cancelled: boolean): ExecutionStatus {
|
|
110
|
+
if (cancelled) return "cancelled";
|
|
111
|
+
if (exitCode !== 0 && exitCode !== undefined && exitCode !== null) return "error";
|
|
112
|
+
return "complete";
|
|
113
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import type { Component, TUI } from "../tui";
|
|
2
|
+
import type { Theme } from "../theme/theme";
|
|
3
|
+
import type { CustomMessage, HookMessage } from "./messages";
|
|
4
|
+
|
|
5
|
+
export type ExtensionUiComponent = Component & { dispose?(): void };
|
|
6
|
+
|
|
7
|
+
export type ExtensionUiComponentFactory = (tui: TUI, theme: Theme) => ExtensionUiComponent;
|
|
8
|
+
|
|
9
|
+
export type ExtensionWidgetContent = string[] | ExtensionUiComponentFactory | undefined;
|
|
10
|
+
|
|
11
|
+
export interface MessageRenderOptions {
|
|
12
|
+
expanded: boolean;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export type MessageRenderer<T = unknown> = (
|
|
16
|
+
message: CustomMessage<T>,
|
|
17
|
+
options: MessageRenderOptions,
|
|
18
|
+
theme: Theme,
|
|
19
|
+
) => Component | undefined;
|
|
20
|
+
|
|
21
|
+
export interface AssistantThinkingRenderContext {
|
|
22
|
+
contentIndex: number;
|
|
23
|
+
thinkingIndex: number;
|
|
24
|
+
text: string;
|
|
25
|
+
requestRender(): void;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export type AssistantThinkingRenderer = (
|
|
29
|
+
context: AssistantThinkingRenderContext,
|
|
30
|
+
theme: Theme,
|
|
31
|
+
) => Component | undefined;
|
|
32
|
+
|
|
33
|
+
export interface HookMessageRenderOptions {
|
|
34
|
+
/** Whether the view is expanded */
|
|
35
|
+
expanded: boolean;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Renderer for hook messages.
|
|
40
|
+
* Hooks register these to provide custom TUI rendering for their message types.
|
|
41
|
+
*/
|
|
42
|
+
export type HookMessageRenderer<T = unknown> = (
|
|
43
|
+
message: HookMessage<T>,
|
|
44
|
+
options: HookMessageRenderOptions,
|
|
45
|
+
theme: Theme,
|
|
46
|
+
) => Component | undefined;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { FramedMessageComponent } from "../chrome/message-frame";
|
|
2
|
+
import type { HookMessageRenderer } from "./extension-types";
|
|
3
|
+
import type { HookMessage } from "./messages";
|
|
4
|
+
|
|
5
|
+
/** Lines of default markdown body shown before the "…" fold when collapsed. */
|
|
6
|
+
const HOOK_COLLAPSED_LINES = 5;
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Component that renders a custom message entry from hooks.
|
|
10
|
+
* Uses distinct styling to differentiate from user messages.
|
|
11
|
+
*/
|
|
12
|
+
export class HookMessageComponent extends FramedMessageComponent<HookMessage<unknown>> {
|
|
13
|
+
constructor(message: HookMessage<unknown>, customRenderer?: HookMessageRenderer) {
|
|
14
|
+
super({
|
|
15
|
+
message,
|
|
16
|
+
collapseAfterLines: HOOK_COLLAPSED_LINES,
|
|
17
|
+
customRenderer,
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
}
|