@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,122 @@
|
|
|
1
|
+
import type { ImageContent, Model } from "@oh-my-pi/pi-ai";
|
|
2
|
+
import { formatBytes, parseImageMetadata, SUPPORTED_IMAGE_MIME_TYPES } from "@oh-my-pi/pi-utils";
|
|
3
|
+
|
|
4
|
+
export const MAX_IMAGE_INPUT_BYTES = 20 * 1024 * 1024;
|
|
5
|
+
|
|
6
|
+
export const SUPPORTED_INPUT_IMAGE_MIME_TYPES = SUPPORTED_IMAGE_MIME_TYPES;
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Ollama and its local-backend family decode image input through llama.cpp /
|
|
10
|
+
* `stb_image`, which is compiled without WebP support, so a WebP upload fails
|
|
11
|
+
* with an opaque HTTP 400. Detect those models so the resize pipeline encodes
|
|
12
|
+
* to PNG/JPEG instead — the automatic equivalent of `OMP_NO_WEBP=1`.
|
|
13
|
+
*/
|
|
14
|
+
export function modelLacksWebpSupport(
|
|
15
|
+
model: Pick<Model, "provider" | "api" | "imageInputDecoder"> | undefined,
|
|
16
|
+
): boolean {
|
|
17
|
+
if (!model) return false;
|
|
18
|
+
return (
|
|
19
|
+
model.imageInputDecoder === "stb" ||
|
|
20
|
+
model.provider === "ollama" ||
|
|
21
|
+
model.provider === "ollama-cloud" ||
|
|
22
|
+
model.provider === "llama.cpp" ||
|
|
23
|
+
model.provider === "lm-studio" ||
|
|
24
|
+
model.provider === "local-server" ||
|
|
25
|
+
model.api === "ollama-chat"
|
|
26
|
+
);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* `true` when `model` cannot decode WebP, otherwise `undefined` so the
|
|
31
|
+
* `OMP_NO_WEBP` env fallback in {@link resizeImage} still applies. Feed straight
|
|
32
|
+
* into {@link ImageResizeOptions.excludeWebP}.
|
|
33
|
+
*/
|
|
34
|
+
export function webpExclusionForModel(model: Pick<Model, "provider" | "api"> | undefined): true | undefined {
|
|
35
|
+
return modelLacksWebpSupport(model) ? true : undefined;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export class ImageInputTooLargeError extends Error {
|
|
39
|
+
readonly bytes: number;
|
|
40
|
+
readonly maxBytes: number;
|
|
41
|
+
|
|
42
|
+
constructor(bytes: number, maxBytes: number) {
|
|
43
|
+
super(`Image file too large: ${formatBytes(bytes)} exceeds ${formatBytes(maxBytes)} limit.`);
|
|
44
|
+
this.name = "ImageInputTooLargeError";
|
|
45
|
+
this.bytes = bytes;
|
|
46
|
+
this.maxBytes = maxBytes;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Raised when image bytes cannot be decoded — a truncated stream, a payload
|
|
52
|
+
* with a hole in the middle, or bytes that are not the container they claim.
|
|
53
|
+
* Failing at ingress keeps them out of the transcript, where they would
|
|
54
|
+
* otherwise be persisted and rejected by the provider on every later request,
|
|
55
|
+
* with no way to resume the session.
|
|
56
|
+
*/
|
|
57
|
+
export class InvalidImageDataError extends Error {
|
|
58
|
+
readonly reason: string;
|
|
59
|
+
|
|
60
|
+
constructor(label: string, mimeType: string, reason: string) {
|
|
61
|
+
super(`${label} is not a decodable ${mimeType} image: ${reason}`);
|
|
62
|
+
this.name = "InvalidImageDataError";
|
|
63
|
+
this.reason = reason;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Smallest raster the decode probe terminates into. The decode is the oracle,
|
|
69
|
+
* so the output size cannot change the verdict — a 1x1 sink keeps the check
|
|
70
|
+
* from allocating a full-size pixel buffer, a full-size PNG, and a base64
|
|
71
|
+
* string for a payload that may be up to {@link MAX_IMAGE_INPUT_BYTES}.
|
|
72
|
+
*/
|
|
73
|
+
const DECODE_PROBE_EDGE_PX = 1;
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* Why an image cannot be decoded, or `null` when it decodes.
|
|
77
|
+
*
|
|
78
|
+
* A full decode is the only check that matches what vision backends accept: a
|
|
79
|
+
* middle-elided PNG keeps its signature, its header, and even a well-formed
|
|
80
|
+
* `IEND` trailer, so header sniffing and chunk-framing walks both pass it —
|
|
81
|
+
* while real-world images that decoders render happily do have odd framing, so
|
|
82
|
+
* a structural walk rejects payloads providers accept. Decoding is the ground
|
|
83
|
+
* truth on both sides. Callers on hot paths must cache the verdict.
|
|
84
|
+
*/
|
|
85
|
+
export async function imageDecodeFailureReason(image: ImageContent): Promise<string | null> {
|
|
86
|
+
if (!/^[A-Za-z0-9+/]*={0,2}$/.test(image.data)) return "invalid base64 image data";
|
|
87
|
+
const normalizedData = image.data.replace(/=+$/, "");
|
|
88
|
+
const bytes = Buffer.from(image.data, "base64");
|
|
89
|
+
if (bytes.length === 0) return "empty image data";
|
|
90
|
+
if (bytes.toString("base64").replace(/=+$/, "") !== normalizedData) return "invalid base64 image data";
|
|
91
|
+
const detected = parseImageMetadata(bytes);
|
|
92
|
+
if (detected && detected.mimeType !== image.mimeType.toLowerCase()) {
|
|
93
|
+
return `declared ${image.mimeType} but contains ${detected.mimeType}`;
|
|
94
|
+
}
|
|
95
|
+
try {
|
|
96
|
+
// Decode in full (that is what catches a hole in the compressed stream),
|
|
97
|
+
// then terminate into a 1x1 raster's bytes instead of re-encoding at the
|
|
98
|
+
// source dimensions and base64-ing a result nobody reads.
|
|
99
|
+
await new Bun.Image(bytes).resize(DECODE_PROBE_EDGE_PX, DECODE_PROBE_EDGE_PX).png().bytes();
|
|
100
|
+
return null;
|
|
101
|
+
} catch (error) {
|
|
102
|
+
return error instanceof Error ? error.message : String(error);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/** Converts an image to PNG, rejecting when the runtime cannot decode or encode it. */
|
|
107
|
+
export async function convertImageToPng(image: ImageContent): Promise<ImageContent> {
|
|
108
|
+
const bytes = Buffer.from(image.data, "base64");
|
|
109
|
+
const data = await new Bun.Image(bytes).png().toBase64();
|
|
110
|
+
return { ...image, data, mimeType: "image/png" };
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
export async function ensureSupportedImageInput(image: ImageContent): Promise<ImageContent | null> {
|
|
114
|
+
if (SUPPORTED_INPUT_IMAGE_MIME_TYPES.has(image.mimeType)) {
|
|
115
|
+
return image;
|
|
116
|
+
}
|
|
117
|
+
try {
|
|
118
|
+
return await convertImageToPng(image);
|
|
119
|
+
} catch {
|
|
120
|
+
return null;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { Container } from "../tui";
|
|
2
|
+
import { Disclosure } from "../components/disclosure";
|
|
3
|
+
import { Text } from "../components/text";
|
|
4
|
+
import { formatDiagnostics } from "../render/render-utils";
|
|
5
|
+
import { getLanguageFromPath, theme } from "../theme";
|
|
6
|
+
|
|
7
|
+
const EMPTY_ROWS: readonly string[] = [];
|
|
8
|
+
|
|
9
|
+
/** One file's worth of late LSP diagnostics, as carried on the transcript message. */
|
|
10
|
+
export interface LateDiagnosticsFile {
|
|
11
|
+
path?: string;
|
|
12
|
+
summary?: string;
|
|
13
|
+
errored?: boolean;
|
|
14
|
+
messages?: string[];
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Renders late LSP diagnostics (arrived after edit/write returned) in the
|
|
19
|
+
* transcript, reusing the same tree renderer the edit/write tools use so the
|
|
20
|
+
* styling stays consistent. Supports the global tool-output expand toggle.
|
|
21
|
+
*/
|
|
22
|
+
export class LateDiagnosticsMessageComponent extends Container {
|
|
23
|
+
#toolActivityVisible = true;
|
|
24
|
+
// Controlled expansion delegate with no summary: the collapsed and
|
|
25
|
+
// expanded diagnostic trees are mutually exclusive slots, each formatted
|
|
26
|
+
// lazily on its first render. Only the tool-visibility gate stays here.
|
|
27
|
+
#disclosure: Disclosure | undefined;
|
|
28
|
+
readonly #files: LateDiagnosticsFile[];
|
|
29
|
+
|
|
30
|
+
constructor(files: LateDiagnosticsFile[]) {
|
|
31
|
+
super();
|
|
32
|
+
this.#files = files;
|
|
33
|
+
|
|
34
|
+
this.#rebuild();
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
setExpanded(expanded: boolean): void {
|
|
38
|
+
this.#disclosure?.setExpanded(expanded);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
setToolActivityVisible(visible: boolean): void {
|
|
42
|
+
this.#toolActivityVisible = visible;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
override render(width: number): readonly string[] {
|
|
46
|
+
if (!this.#toolActivityVisible) return EMPTY_ROWS;
|
|
47
|
+
return super.render(width);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
override invalidate(): void {
|
|
51
|
+
this.#rebuild();
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
#rebuild(): void {
|
|
55
|
+
// Preserve controlled state across theme-invalidation rebuilds while
|
|
56
|
+
// leaving both diagnostic trees unmaterialized until their next render.
|
|
57
|
+
const expanded = this.#disclosure?.expanded ?? false;
|
|
58
|
+
this.clear();
|
|
59
|
+
this.#disclosure?.dispose();
|
|
60
|
+
this.#disclosure = undefined;
|
|
61
|
+
|
|
62
|
+
const input = this.#diagnosticInput() ?? { errored: false, summary: "", messages: [] };
|
|
63
|
+
|
|
64
|
+
this.#disclosure = new Disclosure({
|
|
65
|
+
collapsedBody: () => new Text(this.#format(input, false), 1, 0),
|
|
66
|
+
body: () => new Text(this.#format(input, true), 1, 0),
|
|
67
|
+
expanded,
|
|
68
|
+
});
|
|
69
|
+
this.addChild(this.#disclosure);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/** Aggregate file payloads; undefined when there is nothing to render. */
|
|
73
|
+
#diagnosticInput(): { errored: boolean; summary: string; messages: string[] } | undefined {
|
|
74
|
+
const messages: string[] = [];
|
|
75
|
+
const summaries: string[] = [];
|
|
76
|
+
let errored = false;
|
|
77
|
+
for (const file of this.#files) {
|
|
78
|
+
if (file.messages?.length) messages.push(...file.messages);
|
|
79
|
+
if (file.summary) summaries.push(file.summary);
|
|
80
|
+
if (file.errored) errored = true;
|
|
81
|
+
}
|
|
82
|
+
if (messages.length === 0) return undefined;
|
|
83
|
+
return { errored, summary: summaries.join(", "), messages };
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/** Render one branch of the diagnostic tree, reusing the tool renderer. */
|
|
87
|
+
#format(input: { errored: boolean; summary: string; messages: string[] }, expanded: boolean): string {
|
|
88
|
+
return formatDiagnostics(input, expanded, theme, fp => theme.getLangIcon(getLanguageFromPath(fp)), {
|
|
89
|
+
title: "Late diagnostics",
|
|
90
|
+
}).replace(/^\n+/, "");
|
|
91
|
+
}
|
|
92
|
+
}
|
|
@@ -0,0 +1,305 @@
|
|
|
1
|
+
import type { AssistantMessage, ImageContent, MessageAttribution, TextContent } from "@oh-my-pi/pi-ai";
|
|
2
|
+
import * as AIError from "@oh-my-pi/pi-ai/error";
|
|
3
|
+
import { COLLAB_PROMPT_MESSAGE_TYPE } from "@oh-my-pi/pi-wire";
|
|
4
|
+
import type { OutputMeta } from "../tools/output-meta";
|
|
5
|
+
import type { BranchSummaryMessage, CompactionSummaryMessage } from "@oh-my-pi/pi-agent-core/compaction/messages";
|
|
6
|
+
|
|
7
|
+
declare module "@oh-my-pi/pi-agent-core" {
|
|
8
|
+
interface CustomAgentMessages {
|
|
9
|
+
bashExecution: BashExecutionMessage;
|
|
10
|
+
pythonExecution: PythonExecutionMessage;
|
|
11
|
+
custom: CustomMessage;
|
|
12
|
+
hookMessage: HookMessage;
|
|
13
|
+
branchSummary: BranchSummaryMessage;
|
|
14
|
+
compactionSummary: CompactionSummaryMessage;
|
|
15
|
+
fileMention: FileMentionMessage;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
export { COLLAB_PROMPT_MESSAGE_TYPE, type CollabPromptDetails } from "@oh-my-pi/pi-wire";
|
|
19
|
+
export type { BranchSummaryMessage, CompactionSummaryMessage } from "@oh-my-pi/pi-agent-core/compaction/messages";
|
|
20
|
+
|
|
21
|
+
export const SKILL_PROMPT_MESSAGE_TYPE = "skill-prompt";
|
|
22
|
+
|
|
23
|
+
export const LSP_LATE_DIAGNOSTIC_MESSAGE_TYPE = "lsp-late-diagnostic";
|
|
24
|
+
|
|
25
|
+
export const BACKGROUND_TAN_DISPATCH_MESSAGE_TYPE = "background-tan-dispatch";
|
|
26
|
+
|
|
27
|
+
export const PREWALK_PLAN_MESSAGE_TYPE = "prewalk-plan";
|
|
28
|
+
|
|
29
|
+
/** Custom message type for the transient Vibe mode directive. */
|
|
30
|
+
export const VIBE_MODE_CONTEXT_MESSAGE_TYPE = "vibe-mode-context";
|
|
31
|
+
|
|
32
|
+
/** Fallback type for extension-injected messages that omit a custom type. */
|
|
33
|
+
export const DEFAULT_CUSTOM_MESSAGE_TYPE = "custom-message";
|
|
34
|
+
|
|
35
|
+
/** Custom message carrying a coding request delegated by the live voice model. */
|
|
36
|
+
export const LIVE_DELEGATION_MESSAGE_TYPE = "live-delegation";
|
|
37
|
+
|
|
38
|
+
/** Content shape accepted for extension-injected messages. */
|
|
39
|
+
export type CustomMessageContent = string | (TextContent | ImageContent)[];
|
|
40
|
+
|
|
41
|
+
/** Public input accepted by `pi.sendMessage` and `AgentSession.sendCustomMessage`. */
|
|
42
|
+
export type CustomMessagePayload<T = unknown> =
|
|
43
|
+
| string
|
|
44
|
+
| Partial<Pick<CustomMessage<T>, "customType" | "content" | "display" | "details" | "attribution">>;
|
|
45
|
+
|
|
46
|
+
/** Custom message payload after applying runtime defaults. */
|
|
47
|
+
export type NormalizedCustomMessagePayload<T = unknown> = Pick<
|
|
48
|
+
CustomMessage<T>,
|
|
49
|
+
"customType" | "content" | "display" | "details" | "attribution"
|
|
50
|
+
>;
|
|
51
|
+
|
|
52
|
+
/** Details persisted on a `/tan` background-dispatch breadcrumb. */
|
|
53
|
+
export interface BackgroundTanDispatchDetails {
|
|
54
|
+
jobId: string;
|
|
55
|
+
work: string;
|
|
56
|
+
/** Forked clone session file, named `<agentId>.jsonl`; the Agent Hub reads its transcript. */
|
|
57
|
+
sessionFile: string;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
export interface SkillPromptDetails {
|
|
61
|
+
name: string;
|
|
62
|
+
path: string;
|
|
63
|
+
args?: string;
|
|
64
|
+
/** The draft as submitted with its `/skill:<name>` token in place. A leading
|
|
65
|
+
* token renders as a skill callout, a mid-prompt token as an inline chip in
|
|
66
|
+
* a plain user bubble. Absent on sessions recorded before chips existed. */
|
|
67
|
+
prompt?: string;
|
|
68
|
+
lineCount: number;
|
|
69
|
+
/** Internal: compact label shown for a queued custom message. Optional —
|
|
70
|
+
* non-streaming skill prompts never set it. Stripped from persisted
|
|
71
|
+
* `details` by `SessionManager.appendCustomMessageEntry` via the
|
|
72
|
+
* `INTERNAL_DETAILS_FIELDS` allowlist below. */
|
|
73
|
+
__queueChipText?: string;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/** Sentinel value for `AssistantMessage.errorMessage` indicating that the abort
|
|
77
|
+
* was an *expected internal transition* (plan-mode → execution compaction)
|
|
78
|
+
* and must NOT surface as a red "Operation aborted" line. Distinct from
|
|
79
|
+
* `undefined` (default) so user-cancel aborts with no errorMessage still
|
|
80
|
+
* render normally. Persists through SessionManager so history replay
|
|
81
|
+
* branches identically.
|
|
82
|
+
*
|
|
83
|
+
* Consumers: `AgentSession.#handleAgentEvent` (stamper) writes this value;
|
|
84
|
+
* `EventController.#handleMessageEnd`, `AssistantMessageComponent`,
|
|
85
|
+
* `ui-helpers.addMessageToChat` (renderers), `AgentHubOverlayComponent
|
|
86
|
+
* #buildTranscriptLines`, `runPrintMode`, and `AcpAgent#replayAssistantMessage`
|
|
87
|
+
* (fallback error emission) read it via `isSilentAbort`. */
|
|
88
|
+
export const SILENT_ABORT_MARKER = "__omp.silent_abort__";
|
|
89
|
+
|
|
90
|
+
/** Type-guard for silent aborts. Renderers MUST call this helper so structured
|
|
91
|
+
* `errorId` and legacy persisted marker messages stay in lockstep. */
|
|
92
|
+
export function isSilentAbort(message: Pick<AssistantMessage, "errorId" | "errorMessage">): boolean {
|
|
93
|
+
return AIError.is(message.errorId, AIError.Flag.SilentAbort) || message.errorMessage === SILENT_ABORT_MARKER;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/** Reason threaded through `AbortController.abort(reason)` when the user aborts
|
|
97
|
+
* the turn with Esc (see `AgentSession.abort`). The agent keeps it on the
|
|
98
|
+
* aborted assistant message's `errorMessage` so queued follow-ups/tool-result
|
|
99
|
+
* placeholders can distinguish a deliberate interrupt from a bare lifecycle
|
|
100
|
+
* abort, but interactive renderers suppress this redundant transcript line. */
|
|
101
|
+
export const USER_INTERRUPT_LABEL = "Interrupted by user";
|
|
102
|
+
|
|
103
|
+
export function isUserInterruptAbort(message: Pick<AssistantMessage, "errorId" | "errorMessage">): boolean {
|
|
104
|
+
return AIError.is(message.errorId, AIError.Flag.UserInterrupt) || message.errorMessage === USER_INTERRUPT_LABEL;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
export function shouldRenderAbortReason(message: Pick<AssistantMessage, "errorId" | "errorMessage">): boolean {
|
|
108
|
+
return !isSilentAbort(message) && !isUserInterruptAbort(message);
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/** Sentinel `errorMessage` the agent stamps on any abort that carried no custom
|
|
112
|
+
* reason (bare `abort()`). Renderers treat it as "no specific reason given". */
|
|
113
|
+
export const GENERIC_ABORT_SENTINEL = "Request was aborted";
|
|
114
|
+
|
|
115
|
+
/** Resolve the operator-facing label for an aborted assistant turn. A custom
|
|
116
|
+
* abort reason threaded onto `errorMessage` is returned verbatim; aborts with
|
|
117
|
+
* no threaded reason fall back to the retry-aware generic label. Call
|
|
118
|
+
* `shouldRenderAbortReason` before rendering when user interrupts should stay
|
|
119
|
+
* visually quiet. */
|
|
120
|
+
export function resolveAbortLabel(
|
|
121
|
+
message: Pick<AssistantMessage, "errorId" | "errorMessage">,
|
|
122
|
+
retryAttempt = 0,
|
|
123
|
+
): string {
|
|
124
|
+
const genericAbort =
|
|
125
|
+
AIError.is(message.errorId, AIError.Flag.Abort) ||
|
|
126
|
+
!message.errorMessage ||
|
|
127
|
+
message.errorMessage === GENERIC_ABORT_SENTINEL ||
|
|
128
|
+
isSilentAbort(message);
|
|
129
|
+
if (!genericAbort) {
|
|
130
|
+
return message.errorMessage!;
|
|
131
|
+
}
|
|
132
|
+
if (retryAttempt > 0) {
|
|
133
|
+
return `Aborted after ${retryAttempt} retry attempt${retryAttempt > 1 ? "s" : ""}`;
|
|
134
|
+
}
|
|
135
|
+
return "Operation aborted";
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
/** True when a persisted or extension-supplied value can be sent as custom-message content. */
|
|
139
|
+
export function isCustomMessageContent(content: unknown): content is CustomMessageContent {
|
|
140
|
+
return typeof content === "string" || Array.isArray(content);
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
function normalizeCustomMessageContent(content: unknown): CustomMessageContent {
|
|
144
|
+
return isCustomMessageContent(content) ? content : "";
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
function normalizeCustomMessageType(customType: unknown): string {
|
|
148
|
+
return typeof customType === "string" && customType.length > 0 ? customType : DEFAULT_CUSTOM_MESSAGE_TYPE;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
function normalizeCustomMessageAttribution(attribution: unknown): MessageAttribution {
|
|
152
|
+
return attribution === "user" ? "user" : "agent";
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
function isCustomMessagePayloadObject<T>(
|
|
156
|
+
payload: unknown,
|
|
157
|
+
): payload is Partial<Pick<CustomMessage<T>, "customType" | "content" | "display" | "details" | "attribution">> {
|
|
158
|
+
return payload !== null && typeof payload === "object" && !Array.isArray(payload);
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
/** Normalizes extension-provided custom message input before it reaches session state or disk. */
|
|
162
|
+
export function normalizeCustomMessagePayload<T = unknown>(
|
|
163
|
+
payload: CustomMessagePayload<T> | unknown,
|
|
164
|
+
): NormalizedCustomMessagePayload<T> {
|
|
165
|
+
if (typeof payload === "string") {
|
|
166
|
+
return {
|
|
167
|
+
customType: DEFAULT_CUSTOM_MESSAGE_TYPE,
|
|
168
|
+
content: payload,
|
|
169
|
+
display: true,
|
|
170
|
+
attribution: "agent",
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
if (!isCustomMessagePayloadObject<T>(payload)) {
|
|
174
|
+
const content = payload === undefined || payload === null ? "" : String(payload);
|
|
175
|
+
return {
|
|
176
|
+
customType: DEFAULT_CUSTOM_MESSAGE_TYPE,
|
|
177
|
+
content,
|
|
178
|
+
display: content.length > 0,
|
|
179
|
+
attribution: "agent",
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
return {
|
|
183
|
+
customType: normalizeCustomMessageType(payload.customType),
|
|
184
|
+
content: normalizeCustomMessageContent(payload.content),
|
|
185
|
+
display: typeof payload.display === "boolean" ? payload.display : false,
|
|
186
|
+
details: payload.details,
|
|
187
|
+
attribution: normalizeCustomMessageAttribution(payload.attribution),
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
/**
|
|
192
|
+
* Message type for bash executions via the ! command.
|
|
193
|
+
*/
|
|
194
|
+
export interface BashExecutionMessage {
|
|
195
|
+
role: "bashExecution";
|
|
196
|
+
command: string;
|
|
197
|
+
output: string;
|
|
198
|
+
exitCode: number | undefined;
|
|
199
|
+
cancelled: boolean;
|
|
200
|
+
truncated: boolean;
|
|
201
|
+
/** Images extracted from terminal graphics in the command's stdout. */
|
|
202
|
+
images?: ImageContent[];
|
|
203
|
+
meta?: OutputMeta;
|
|
204
|
+
timestamp: number;
|
|
205
|
+
/** If true, this message is excluded from LLM context (!! prefix) */
|
|
206
|
+
excludeFromContext?: boolean;
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
/**
|
|
210
|
+
* Message type for user-initiated Python executions via the $ command.
|
|
211
|
+
* Shares the same kernel session as eval's Python backend.
|
|
212
|
+
*/
|
|
213
|
+
export interface PythonExecutionMessage {
|
|
214
|
+
role: "pythonExecution";
|
|
215
|
+
code: string;
|
|
216
|
+
output: string;
|
|
217
|
+
exitCode: number | undefined;
|
|
218
|
+
cancelled: boolean;
|
|
219
|
+
truncated: boolean;
|
|
220
|
+
meta?: OutputMeta;
|
|
221
|
+
timestamp: number;
|
|
222
|
+
/** If true, this message is excluded from LLM context ($ prefix) */
|
|
223
|
+
excludeFromContext?: boolean;
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
/**
|
|
227
|
+
* Message type for extension-injected messages via sendMessage().
|
|
228
|
+
*/
|
|
229
|
+
export interface CustomMessage<T = unknown> {
|
|
230
|
+
role: "custom";
|
|
231
|
+
customType: string;
|
|
232
|
+
content: CustomMessageContent;
|
|
233
|
+
display: boolean;
|
|
234
|
+
details?: T;
|
|
235
|
+
/** Who initiated this message for billing/attribution semantics. */
|
|
236
|
+
attribution?: MessageAttribution;
|
|
237
|
+
timestamp: number;
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
/**
|
|
241
|
+
* Legacy hook message type (pre-extensions). Kept for session migration.
|
|
242
|
+
*/
|
|
243
|
+
export interface HookMessage<T = unknown> {
|
|
244
|
+
role: "hookMessage";
|
|
245
|
+
customType: string;
|
|
246
|
+
content: CustomMessageContent;
|
|
247
|
+
display: boolean;
|
|
248
|
+
details?: T;
|
|
249
|
+
/** Who initiated this message for billing/attribution semantics. */
|
|
250
|
+
attribution?: MessageAttribution;
|
|
251
|
+
timestamp: number;
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
/**
|
|
255
|
+
* Message type for auto-read file mentions via @filepath syntax.
|
|
256
|
+
*/
|
|
257
|
+
export interface FileMentionMessage {
|
|
258
|
+
role: "fileMention";
|
|
259
|
+
files: Array<{
|
|
260
|
+
path: string;
|
|
261
|
+
content: string;
|
|
262
|
+
lineCount?: number;
|
|
263
|
+
/** File size in bytes, if known. */
|
|
264
|
+
byteSize?: number;
|
|
265
|
+
/** Why the file contents were omitted from auto-read. */
|
|
266
|
+
skippedReason?: "tooLarge" | "binary";
|
|
267
|
+
image?: ImageContent;
|
|
268
|
+
}>;
|
|
269
|
+
timestamp: number;
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
/** True for a `/skill:<name>` prompt the user invoked directly (attribution `user`), as opposed to an agent/autoload injection. */
|
|
273
|
+
export function isUserInvokedSkillPrompt(message: CustomMessage): boolean {
|
|
274
|
+
return message.customType === SKILL_PROMPT_MESSAGE_TYPE && message.attribution === "user";
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
/**
|
|
278
|
+
* True for a custom message that initiates a user-attributed turn: a directly
|
|
279
|
+
* invoked `/skill:` prompt or a writable-collab peer's prompt. Agent redirects,
|
|
280
|
+
* reminders, and auto-continues are not turn starts.
|
|
281
|
+
*/
|
|
282
|
+
export function isUserTurnInitiator(message: CustomMessage): boolean {
|
|
283
|
+
return (
|
|
284
|
+
isUserInvokedSkillPrompt(message) ||
|
|
285
|
+
(message.customType === COLLAB_PROMPT_MESSAGE_TYPE && message.attribution === "user")
|
|
286
|
+
);
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
export type AdvisorSeverity = "nit" | "concern" | "blocker";
|
|
290
|
+
|
|
291
|
+
/** One queued advice note. */
|
|
292
|
+
export interface AdvisorNote {
|
|
293
|
+
note: string;
|
|
294
|
+
severity?: AdvisorSeverity;
|
|
295
|
+
/** Which configured advisor produced this note (omitted for the default advisor). */
|
|
296
|
+
advisor?: string;
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
/** Details payload on the batched `advisor` custom message rendered in the transcript. */
|
|
300
|
+
export interface AdvisorMessageDetails {
|
|
301
|
+
notes: AdvisorNote[];
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
/** Custom message type for supervised process completions. */
|
|
305
|
+
export const LAUNCH_COMPLETION_MESSAGE_TYPE = "launch-completion";
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent reactions. A reply whose text opens with an emoji is reacting to the
|
|
3
|
+
* transcript block before it: the emoji is lifted out of the prose and shown as
|
|
4
|
+
* a badge on that block instead. While the reply streams, an incomplete opening
|
|
5
|
+
* run is withheld until it either completes an emoji or proves to be ordinary
|
|
6
|
+
* text, so the emoji never flashes inside the reply.
|
|
7
|
+
*
|
|
8
|
+
* Reactions are derived from the persisted assistant text, never stored, so a
|
|
9
|
+
* rebuilt transcript reproduces them exactly.
|
|
10
|
+
*/
|
|
11
|
+
import { type Component } from "../tui";
|
|
12
|
+
|
|
13
|
+
/** A transcript block that can display an agent reaction badge. */
|
|
14
|
+
export interface ReactionTarget {
|
|
15
|
+
setReaction(emoji: string): void;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/** Whether `component` accepts a reaction badge. */
|
|
19
|
+
export function isReactionTarget(component: Component | undefined): component is Component & ReactionTarget {
|
|
20
|
+
return component !== undefined && "setReaction" in component && typeof component.setReaction === "function";
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/** Longest emoji grapheme (UTF-16 units) still worth withholding for. */
|
|
24
|
+
const MAX_REACTION_UNITS = 32;
|
|
25
|
+
/** One emoji grapheme: an RGI sequence, or a bare pictograph with optional VS16. */
|
|
26
|
+
const REACTION_HEAD_RE = /^(?:\p{RGI_Emoji}|\p{Extended_Pictographic}\uFE0F?)/v;
|
|
27
|
+
/** Unicode characters that can extend a preceding emoji code point into a longer grapheme. */
|
|
28
|
+
const EMOJI_EXTENSION_RE = /^(?:[\p{Emoji_Modifier}\u{E0020}-\u{E007F}]|\uFE0F|\u200D|\u20E3)/u;
|
|
29
|
+
/** A still-streaming run that can only ever be an emoji grapheme (plus trailing blanks): pictographs, skin tones, flag letters, tag letters, VS16, ZWJ, keycap. */
|
|
30
|
+
const REACTION_PREFIX_RE =
|
|
31
|
+
/^(?:[\p{Extended_Pictographic}\p{Emoji_Modifier}\p{Regional_Indicator}\u{E0020}-\u{E007F}]|\uFE0F|\u200D|\u20E3)*[ \t]*$/u;
|
|
32
|
+
/** Whitespace immediately following the opening emoji to consume: an inline newline or a run of horizontal spaces/tabs. */
|
|
33
|
+
const NEXT_WHITESPACE_RE = /^[ \t]*\r?\n|^[ \t]+/;
|
|
34
|
+
|
|
35
|
+
export interface ReactionSplit {
|
|
36
|
+
/** The reaction emoji when the text opens with an emoji. */
|
|
37
|
+
emoji?: string;
|
|
38
|
+
/** Text with the opening emoji and any following whitespace removed; the input when there is none. */
|
|
39
|
+
body: string;
|
|
40
|
+
/** True while the text could still grow into an emoji. */
|
|
41
|
+
pending: boolean;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Split an opening reaction emoji off the front of assistant text, consuming
|
|
46
|
+
* the next whitespace if any. Leading whitespace is tolerated.
|
|
47
|
+
*/
|
|
48
|
+
export function splitReaction(text: string): ReactionSplit {
|
|
49
|
+
const start = text.length - text.trimStart().length;
|
|
50
|
+
const head = text.slice(start);
|
|
51
|
+
if (head.length === 0) {
|
|
52
|
+
return { body: text, pending: true };
|
|
53
|
+
}
|
|
54
|
+
const match = head.match(REACTION_HEAD_RE);
|
|
55
|
+
if (match) {
|
|
56
|
+
const rest = head.slice(match[0].length);
|
|
57
|
+
if (head.length <= MAX_REACTION_UNITS && EMOJI_EXTENSION_RE.test(rest)) {
|
|
58
|
+
return { body: text, pending: true };
|
|
59
|
+
}
|
|
60
|
+
const wsMatch = rest.match(NEXT_WHITESPACE_RE);
|
|
61
|
+
const body = rest.slice(wsMatch ? wsMatch[0].length : 0);
|
|
62
|
+
return { emoji: match[0], body, pending: false };
|
|
63
|
+
}
|
|
64
|
+
return { body: text, pending: head.length <= MAX_REACTION_UNITS && REACTION_PREFIX_RE.test(head) };
|
|
65
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/** Host-owned internal protocol classifier used by compact read cards. */
|
|
2
|
+
export let internalReadTargetPredicate: ((target: string) => boolean) | undefined;
|
|
3
|
+
|
|
4
|
+
/** Supply protocol classification without loading the host router in a renderer. */
|
|
5
|
+
export function setInternalReadTargetPredicate(predicate: (target: string) => boolean): void {
|
|
6
|
+
internalReadTargetPredicate = predicate;
|
|
7
|
+
}
|