@oh-my-pi/pi-tui 18.4.2 → 18.4.4
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 +56 -0
- package/dist/types/apps/cleanse-board.d.ts +17 -0
- package/dist/types/apps/git/help.d.ts +16 -0
- package/dist/types/apps/git/sidebar.d.ts +18 -0
- package/dist/types/apps/live-visualizer.d.ts +10 -0
- package/dist/types/apps/ps-top.d.ts +15 -0
- package/dist/types/apps/standalone-picker.d.ts +3 -0
- package/dist/types/autocomplete.d.ts +8 -0
- package/dist/types/chat/advisor-message.d.ts +12 -2
- package/dist/types/chat/assistant-message.d.ts +20 -0
- package/dist/types/chat/bash-execution.d.ts +9 -0
- package/dist/types/chat/chat-transcript-builder.d.ts +6 -1
- package/dist/types/chat/collab-prompt-message.d.ts +4 -0
- package/dist/types/chat/compaction-summary-message.d.ts +15 -0
- package/dist/types/chat/eval-execution.d.ts +8 -0
- package/dist/types/chat/execution-shared.d.ts +58 -0
- package/dist/types/chat/late-diagnostics-message.d.ts +15 -1
- package/dist/types/chat/read-tool-group.d.ts +15 -0
- package/dist/types/chat/skill-message.d.ts +9 -0
- package/dist/types/chat/stripped-tool-calls-placeholder.d.ts +3 -0
- package/dist/types/chat/thinking-display.d.ts +2 -0
- package/dist/types/chat/todo-reminder.d.ts +4 -1
- package/dist/types/chat/tool-execution.d.ts +25 -1
- package/dist/types/chat/transcript-actions.d.ts +37 -0
- package/dist/types/chat/transcript-entry.d.ts +3 -1
- package/dist/types/chat/user-message.d.ts +25 -0
- package/dist/types/chrome/collab-qrcode.d.ts +7 -0
- package/dist/types/chrome/context-thresholds.d.ts +11 -0
- package/dist/types/chrome/countdown-timer.d.ts +9 -3
- package/dist/types/chrome/diff.d.ts +12 -0
- package/dist/types/chrome/dynamic-border.d.ts +3 -0
- package/dist/types/chrome/format.d.ts +6 -0
- package/dist/types/chrome/message-divider.d.ts +13 -0
- package/dist/types/chrome/message-frame.d.ts +10 -0
- package/dist/types/chrome/message-notice.d.ts +23 -0
- package/dist/types/chrome/overlay-box.d.ts +11 -2
- package/dist/types/chrome/qrcode.d.ts +7 -0
- package/dist/types/chrome/segment-track.d.ts +7 -0
- package/dist/types/chrome/selector-helpers.d.ts +0 -6
- package/dist/types/chrome/status-notice.d.ts +14 -0
- package/dist/types/chrome/streaming-panel.d.ts +3 -0
- package/dist/types/chrome/tool-activity.d.ts +3 -0
- package/dist/types/chrome/transcript-container.d.ts +13 -0
- package/dist/types/chrome/transcript-status.d.ts +15 -3
- package/dist/types/components/box.d.ts +7 -0
- package/dist/types/components/disclosure.d.ts +9 -0
- package/dist/types/components/editor.d.ts +42 -0
- package/dist/types/components/form.d.ts +14 -0
- package/dist/types/components/image.d.ts +7 -0
- package/dist/types/components/input.d.ts +20 -1
- package/dist/types/components/key-value-list.d.ts +3 -0
- package/dist/types/components/layout/geometry.d.ts +16 -0
- package/dist/types/components/layout/row.d.ts +7 -0
- package/dist/types/components/layout/split-pane.d.ts +8 -0
- package/dist/types/components/layout/stack.d.ts +6 -0
- package/dist/types/components/loader.d.ts +48 -0
- package/dist/types/components/markdown.d.ts +8 -0
- package/dist/types/components/metric.d.ts +7 -0
- package/dist/types/components/progress-bar.d.ts +3 -0
- package/dist/types/components/scroll-view.d.ts +6 -0
- package/dist/types/components/section.d.ts +3 -0
- package/dist/types/components/select-list.d.ts +33 -0
- package/dist/types/components/settings-list.d.ts +68 -0
- package/dist/types/components/spacer.d.ts +4 -0
- package/dist/types/components/tab-bar.d.ts +9 -0
- package/dist/types/components/table.d.ts +7 -0
- package/dist/types/components/text.d.ts +6 -0
- package/dist/types/components/tree-view.d.ts +9 -0
- package/dist/types/components/truncated-text.d.ts +3 -0
- package/dist/types/components/wizard-step.d.ts +6 -0
- package/dist/types/hotkeys-markdown.d.ts +24 -0
- package/dist/types/index.d.ts +5 -0
- package/dist/types/latex-block.d.ts +7 -0
- package/dist/types/loop-watchdog.d.ts +9 -0
- package/dist/types/native/apply.d.ts +39 -0
- package/dist/types/native/backend.d.ts +94 -0
- package/dist/types/native/blobs.d.ts +29 -0
- package/dist/types/native/describe.d.ts +56 -0
- package/dist/types/native/encode.d.ts +50 -0
- package/dist/types/native/icons.d.ts +18 -0
- package/dist/types/native/memo.d.ts +27 -0
- package/dist/types/native/node.d.ts +107 -0
- package/dist/types/native/overlay.d.ts +64 -0
- package/dist/types/native/picker.d.ts +124 -0
- package/dist/types/native/reconcile.d.ts +41 -0
- package/dist/types/native/settle.d.ts +11 -0
- package/dist/types/native/spans.d.ts +21 -0
- package/dist/types/native/state.d.ts +6 -0
- package/dist/types/native/tone.d.ts +24 -0
- package/dist/types/overlays/advisor-config.d.ts +20 -0
- package/dist/types/overlays/agent-hub-renderer.d.ts +27 -11
- package/dist/types/overlays/agent-hub.d.ts +10 -0
- package/dist/types/overlays/agent-transcript-viewer.d.ts +7 -0
- package/dist/types/overlays/agents-hub.d.ts +8 -0
- package/dist/types/overlays/annotation-overlay.d.ts +3 -0
- package/dist/types/overlays/ask-dialog.d.ts +23 -0
- package/dist/types/overlays/bordered-loader.d.ts +3 -0
- package/dist/types/overlays/btw-history-panel.d.ts +9 -0
- package/dist/types/overlays/btw-panel.d.ts +3 -0
- package/dist/types/overlays/cleanse-panel.d.ts +5 -2
- package/dist/types/overlays/composer-shape-preview.d.ts +7 -1
- package/dist/types/overlays/copy-selector.d.ts +38 -0
- package/dist/types/overlays/error-banner.d.ts +9 -0
- package/dist/types/overlays/extensions/extension-list.d.ts +1 -0
- package/dist/types/overlays/history-search.d.ts +18 -0
- package/dist/types/overlays/hook-editor.d.ts +28 -1
- package/dist/types/overlays/hook-input.d.ts +3 -0
- package/dist/types/overlays/hook-selector.d.ts +10 -0
- package/dist/types/overlays/hub-frame.d.ts +18 -0
- package/dist/types/overlays/jobs-panel.d.ts +24 -0
- package/dist/types/overlays/login-dialog.d.ts +10 -0
- package/dist/types/overlays/logout-account-selector.d.ts +4 -0
- package/dist/types/overlays/mcp-add-wizard.d.ts +4 -0
- package/dist/types/overlays/model-browser.d.ts +69 -0
- package/dist/types/overlays/model-hub.d.ts +7 -0
- package/dist/types/overlays/model-picker.d.ts +9 -1
- package/dist/types/overlays/move-overlay.d.ts +3 -0
- package/dist/types/overlays/oauth-selector.d.ts +4 -0
- package/dist/types/overlays/omfg-panel.d.ts +3 -0
- package/dist/types/overlays/pause-screen.d.ts +12 -0
- package/dist/types/overlays/plan-review-overlay.d.ts +5 -0
- package/dist/types/overlays/plan-save-overlay.d.ts +10 -0
- package/dist/types/overlays/plugin-selector.d.ts +4 -0
- package/dist/types/overlays/plugin-settings.d.ts +30 -0
- package/dist/types/overlays/queue-mode-selector.d.ts +4 -0
- package/dist/types/overlays/reset-usage-selector.d.ts +8 -0
- package/dist/types/overlays/rewind-selector.d.ts +5 -0
- package/dist/types/overlays/session-info-overlay.d.ts +19 -1
- package/dist/types/overlays/session-selector.d.ts +64 -1
- package/dist/types/overlays/settings-defs.d.ts +14 -0
- package/dist/types/overlays/settings-selector.d.ts +21 -0
- package/dist/types/overlays/show-images-selector.d.ts +4 -0
- package/dist/types/overlays/snapcompact-shape-preview.d.ts +2 -0
- package/dist/types/overlays/stats-notice.d.ts +8 -0
- package/dist/types/overlays/theme-selector.d.ts +11 -0
- package/dist/types/overlays/thinking-selector.d.ts +4 -0
- package/dist/types/overlays/tree-selector.d.ts +60 -2
- package/dist/types/overlays/usage-dashboard.d.ts +26 -3
- package/dist/types/overlays/usage-row.d.ts +36 -2
- package/dist/types/prompt/attachment-chips.d.ts +8 -0
- package/dist/types/prompt/composer-attachments.d.ts +15 -3
- package/dist/types/prompt/composer.d.ts +18 -1
- package/dist/types/prompt/custom-editor.d.ts +48 -2
- package/dist/types/prompt/editor-top-gap.d.ts +2 -0
- package/dist/types/prompt/macos-spelling.d.ts +6 -0
- package/dist/types/prompt/magic-keywords.d.ts +9 -0
- package/dist/types/prompt/queued-messages.d.ts +23 -0
- package/dist/types/prompt/skill-tokens.d.ts +4 -2
- package/dist/types/prompt/welcome.d.ts +16 -0
- package/dist/types/render/code-cell.d.ts +10 -0
- package/dist/types/render/file-list.d.ts +8 -0
- package/dist/types/render/hyperlink.d.ts +14 -0
- package/dist/types/render/output-block.d.ts +43 -0
- package/dist/types/render/output-pane.d.ts +17 -0
- package/dist/types/render/tool-card.d.ts +8 -0
- package/dist/types/render/tree-list.d.ts +8 -0
- package/dist/types/render/width-aware-text.d.ts +7 -0
- package/dist/types/setup/scenes/outro.d.ts +7 -0
- package/dist/types/setup/scenes/sign-in.d.ts +16 -9
- package/dist/types/setup/scenes/splash.d.ts +8 -0
- package/dist/types/setup/scenes/types.d.ts +6 -27
- package/dist/types/setup/wizard-overlay.d.ts +9 -0
- package/dist/types/status-line/component.d.ts +49 -5
- package/dist/types/status-line/context-usage.d.ts +20 -0
- package/dist/types/status-line/footer.d.ts +8 -0
- package/dist/types/status-line/metrics.d.ts +1 -2
- package/dist/types/status-line/segments.d.ts +10 -1
- package/dist/types/status-line/types.d.ts +40 -1
- package/dist/types/stdin-buffer.d.ts +10 -7
- package/dist/types/terminal-capabilities.d.ts +1 -1
- package/dist/types/terminal.d.ts +36 -0
- package/dist/types/theme/defaults/index.d.ts +100 -0
- package/dist/types/theme/schema.d.ts +2 -0
- package/dist/types/theme/shimmer.d.ts +8 -0
- package/dist/types/theme/theme-class.d.ts +2 -0
- package/dist/types/theme/theme.d.ts +33 -1
- package/dist/types/tools/ask.d.ts +3 -0
- package/dist/types/tools/ast-edit.d.ts +10 -1
- package/dist/types/tools/ast-grep.d.ts +10 -1
- package/dist/types/tools/autoresearch.d.ts +21 -4
- package/dist/types/tools/bash.d.ts +30 -1
- package/dist/types/tools/cfg-render.d.ts +5 -1
- package/dist/types/tools/debug.d.ts +3 -1
- package/dist/types/tools/default-renderer.d.ts +6 -1
- package/dist/types/tools/edit.d.ts +14 -1
- package/dist/types/tools/eval.d.ts +12 -1
- package/dist/types/tools/fetch.d.ts +16 -1
- package/dist/types/tools/find.d.ts +15 -1
- package/dist/types/tools/github.d.ts +3 -0
- package/dist/types/tools/glob.d.ts +14 -1
- package/dist/types/tools/goal.d.ts +3 -1
- package/dist/types/tools/grep.d.ts +14 -1
- package/dist/types/tools/grouped-file-output.d.ts +58 -0
- package/dist/types/tools/json-tree.d.ts +20 -0
- package/dist/types/tools/lsp.d.ts +3 -10
- package/dist/types/tools/mcp.d.ts +16 -1
- package/dist/types/tools/memory.d.ts +26 -0
- package/dist/types/tools/native-view.d.ts +90 -0
- package/dist/types/tools/proc-render.d.ts +7 -1
- package/dist/types/tools/read.d.ts +23 -1
- package/dist/types/tools/renderer.d.ts +57 -0
- package/dist/types/tools/report-tool-issue.d.ts +3 -0
- package/dist/types/tools/resolve.d.ts +14 -1
- package/dist/types/tools/task.d.ts +3 -0
- package/dist/types/tools/think.d.ts +3 -0
- package/dist/types/tools/todo.d.ts +12 -0
- package/dist/types/tools/vibe.d.ts +3 -1
- package/dist/types/tools/wait.d.ts +3 -0
- package/dist/types/tools/web-search-types.d.ts +90 -0
- package/dist/types/tools/web-search.d.ts +9 -168
- package/dist/types/tools/write.d.ts +14 -1
- package/dist/types/tools/xdev.d.ts +13 -0
- package/dist/types/tui.d.ts +49 -0
- package/package.json +9 -9
- package/src/apps/autoresearch-dashboard.ts +362 -4
- package/src/apps/cleanse-board.ts +219 -1
- package/src/apps/cleanse-picker.ts +9 -1
- package/src/apps/debug/log-viewer.ts +15 -15
- package/src/apps/debug/protocol-probe.ts +2 -20
- package/src/apps/git/avatar.ts +2 -22
- package/src/apps/git/git-tui.ts +406 -59
- package/src/apps/git/help.ts +130 -0
- package/src/apps/git/sidebar.ts +491 -0
- package/src/apps/live-visualizer.ts +65 -0
- package/src/apps/ps-top.ts +448 -17
- package/src/apps/session-picker.ts +1 -0
- package/src/apps/setup-model-picker.ts +5 -1
- package/src/apps/standalone-picker.ts +55 -1
- package/src/autocomplete.ts +44 -1
- package/src/chat/advisor-message.ts +72 -3
- package/src/chat/assistant-message.ts +538 -51
- package/src/chat/background-tan-message.ts +4 -4
- package/src/chat/bash-execution.ts +81 -0
- package/src/chat/cache-invalidation-marker.ts +8 -0
- package/src/chat/chat-transcript-builder.ts +37 -6
- package/src/chat/collab-prompt-message.ts +15 -3
- package/src/chat/compaction-summary-message.ts +74 -1
- package/src/chat/custom-message.ts +3 -1
- package/src/chat/eval-execution.ts +57 -0
- package/src/chat/execution-shared.ts +153 -1
- package/src/chat/hook-message.ts +1 -0
- package/src/chat/late-diagnostics-message.ts +85 -2
- package/src/chat/read-tool-group.ts +341 -1
- package/src/chat/served-model-marker.ts +8 -0
- package/src/chat/skill-message.ts +63 -0
- package/src/chat/stripped-tool-calls-placeholder.ts +18 -10
- package/src/chat/thinking-display.ts +73 -11
- package/src/chat/todo-reminder.ts +34 -4
- package/src/chat/tool-execution.ts +385 -10
- package/src/chat/transcript-actions.ts +38 -0
- package/src/chat/transcript-browser.ts +2 -9
- package/src/chat/transcript-entry.ts +10 -1
- package/src/chat/transcript-render-helpers.ts +16 -15
- package/src/chat/ttsr-notification.ts +38 -1
- package/src/chat/user-message.ts +167 -4
- package/src/chrome/collab-qrcode.ts +27 -2
- package/src/chrome/context-thresholds.ts +34 -0
- package/src/chrome/countdown-timer.ts +24 -1
- package/src/chrome/diff.ts +60 -1
- package/src/chrome/dynamic-border.ts +7 -0
- package/src/chrome/format.ts +12 -0
- package/src/chrome/message-divider.ts +33 -1
- package/src/chrome/message-frame.ts +53 -10
- package/src/chrome/message-notice.ts +71 -0
- package/src/chrome/overlay-box.ts +45 -2
- package/src/chrome/qrcode.ts +28 -0
- package/src/chrome/segment-track.ts +26 -0
- package/src/chrome/selector-helpers.ts +1 -17
- package/src/chrome/status-notice.ts +46 -0
- package/src/chrome/streaming-panel.ts +25 -1
- package/src/chrome/tool-activity.ts +20 -0
- package/src/chrome/transcript-container.ts +139 -17
- package/src/chrome/transcript-status.ts +40 -11
- package/src/components/box.ts +51 -0
- package/src/components/disclosure.ts +33 -0
- package/src/components/editor.ts +239 -36
- package/src/components/form.ts +93 -9
- package/src/components/image.ts +30 -0
- package/src/components/input.ts +77 -26
- package/src/components/key-value-list.ts +18 -0
- package/src/components/layout/geometry.ts +44 -0
- package/src/components/layout/row.ts +30 -0
- package/src/components/layout/split-pane.ts +65 -0
- package/src/components/layout/stack.ts +27 -0
- package/src/components/loader.ts +183 -1
- package/src/components/markdown.ts +131 -56
- package/src/components/metric.ts +39 -0
- package/src/components/progress-bar.ts +28 -0
- package/src/components/scroll-view.ts +23 -0
- package/src/components/section.ts +16 -0
- package/src/components/select-list.ts +174 -25
- package/src/components/settings-list.ts +264 -7
- package/src/components/spacer.ts +17 -0
- package/src/components/tab-bar.ts +42 -0
- package/src/components/table.ts +34 -0
- package/src/components/text.ts +23 -0
- package/src/components/tree-view.ts +65 -0
- package/src/components/truncated-text.ts +14 -0
- package/src/components/wizard-step.ts +18 -9
- package/src/debug-server.ts +14 -7
- package/src/hotkeys-markdown.ts +251 -69
- package/src/index.ts +6 -0
- package/src/latex-block.ts +11 -0
- package/src/loop-watchdog.ts +38 -10
- package/src/native/apply.ts +275 -0
- package/src/native/backend.ts +682 -0
- package/src/native/blobs.ts +70 -0
- package/src/native/describe.ts +124 -0
- package/src/native/encode.ts +233 -0
- package/src/native/icons.ts +184 -0
- package/src/native/memo.ts +64 -0
- package/src/native/node.ts +112 -0
- package/src/native/overlay.ts +131 -0
- package/src/native/picker.ts +333 -0
- package/src/native/reconcile.ts +1063 -0
- package/src/native/settle.ts +23 -0
- package/src/native/spans.ts +308 -0
- package/src/native/state.ts +28 -0
- package/src/native/tone.ts +79 -0
- package/src/overlays/advisor-config.ts +420 -0
- package/src/overlays/agent-hub-renderer.ts +155 -18
- package/src/overlays/agent-hub.ts +1037 -44
- package/src/overlays/agent-transcript-viewer.ts +129 -0
- package/src/overlays/agents-hub.ts +688 -53
- package/src/overlays/annotation-overlay.ts +391 -52
- package/src/overlays/ask-dialog.ts +435 -24
- package/src/overlays/bordered-loader.ts +17 -0
- package/src/overlays/btw-history-panel.ts +182 -0
- package/src/overlays/btw-panel.ts +68 -2
- package/src/overlays/cleanse-panel.ts +105 -15
- package/src/overlays/codex-reset-fireworks.ts +65 -5
- package/src/overlays/composer-shape-preview.ts +26 -1
- package/src/overlays/copy-selector.ts +545 -23
- package/src/overlays/error-banner.ts +44 -0
- package/src/overlays/extensions/extension-list.ts +23 -17
- package/src/overlays/history-search.ts +175 -33
- package/src/overlays/hook-editor.ts +113 -6
- package/src/overlays/hook-input.ts +22 -1
- package/src/overlays/hook-selector.ts +311 -22
- package/src/overlays/hub-frame.ts +80 -0
- package/src/overlays/jobs-panel.ts +112 -0
- package/src/overlays/login-dialog.ts +183 -1
- package/src/overlays/logout-account-selector.ts +102 -4
- package/src/overlays/mcp-add-wizard.ts +232 -53
- package/src/overlays/model-browser.ts +681 -22
- package/src/overlays/model-hub.ts +1402 -78
- package/src/overlays/model-picker.ts +184 -7
- package/src/overlays/move-overlay.ts +45 -0
- package/src/overlays/oauth-selector.ts +227 -23
- package/src/overlays/omfg-panel.ts +86 -2
- package/src/overlays/pause-screen.ts +55 -4
- package/src/overlays/plan-review-overlay.ts +352 -0
- package/src/overlays/plan-save-overlay.ts +45 -0
- package/src/overlays/plugin-selector.ts +21 -1
- package/src/overlays/plugin-settings.ts +195 -5
- package/src/overlays/queue-mode-selector.ts +19 -1
- package/src/overlays/reset-usage-selector.ts +110 -40
- package/src/overlays/rewind-selector.ts +458 -44
- package/src/overlays/session-account-selector.ts +1 -1
- package/src/overlays/session-info-overlay.ts +137 -1
- package/src/overlays/session-selector.ts +807 -46
- package/src/overlays/settings-defs.ts +41 -0
- package/src/overlays/settings-selector.ts +585 -33
- package/src/overlays/show-images-selector.ts +18 -1
- package/src/overlays/snapcompact-shape-preview.ts +48 -3
- package/src/overlays/stats-notice.ts +31 -0
- package/src/overlays/theme-selector.ts +31 -1
- package/src/overlays/thinking-selector.ts +22 -1
- package/src/overlays/tree-selector.ts +570 -110
- package/src/overlays/usage-dashboard.ts +587 -12
- package/src/overlays/usage-row.ts +161 -25
- package/src/prompt/attachment-chips.ts +60 -0
- package/src/prompt/composer-attachments.ts +31 -9
- package/src/prompt/composer.ts +55 -2
- package/src/prompt/custom-editor.ts +302 -4
- package/src/prompt/editor-top-gap.ts +8 -0
- package/src/prompt/macos-spelling.ts +24 -9
- package/src/prompt/magic-keywords.ts +22 -1
- package/src/prompt/model-mention-autocomplete.ts +1 -0
- package/src/prompt/queued-messages.ts +101 -0
- package/src/prompt/skill-tokens.ts +5 -3
- package/src/prompt/welcome.ts +213 -6
- package/src/render/code-cell.ts +103 -2
- package/src/render/file-list.ts +29 -0
- package/src/render/hyperlink.ts +32 -0
- package/src/render/output-block.ts +110 -0
- package/src/render/output-pane.ts +37 -0
- package/src/render/tool-card.ts +137 -0
- package/src/render/tree-list.ts +39 -0
- package/src/render/width-aware-text.ts +20 -0
- package/src/setup/scenes/composer.ts +29 -0
- package/src/setup/scenes/glyph.ts +15 -0
- package/src/setup/scenes/model.ts +36 -8
- package/src/setup/scenes/outro.ts +28 -1
- package/src/setup/scenes/sign-in.ts +138 -24
- package/src/setup/scenes/splash.ts +28 -1
- package/src/setup/scenes/theme.ts +88 -3
- package/src/setup/scenes/types.ts +7 -28
- package/src/setup/startup-splash.ts +46 -9
- package/src/setup/wizard-overlay.ts +140 -23
- package/src/setup/wizard.ts +1 -1
- package/src/status-line/component.ts +414 -18
- package/src/status-line/context-usage.ts +279 -50
- package/src/status-line/footer.ts +94 -1
- package/src/status-line/metrics.ts +3 -6
- package/src/status-line/segments.ts +463 -97
- package/src/status-line/separators.ts +3 -16
- package/src/status-line/types.ts +43 -1
- package/src/stdin-buffer.ts +27 -21
- package/src/terminal-capabilities.ts +7 -0
- package/src/terminal.ts +153 -11
- package/src/theme/defaults/dark-neon-noir.json +100 -0
- package/src/theme/defaults/index.ts +2 -0
- package/src/theme/defaults/light-prism.json +5 -5
- package/src/theme/defaults/onyx.json +62 -62
- package/src/theme/mermaid-cache.ts +10 -1
- package/src/theme/schema.ts +15 -0
- package/src/theme/shimmer.ts +33 -0
- package/src/theme/theme-class.ts +24 -19
- package/src/theme/theme.ts +111 -9
- package/src/theme/tui-adapters.ts +14 -1
- package/src/tools/ask.ts +157 -1
- package/src/tools/ast-edit.ts +174 -1
- package/src/tools/ast-grep.ts +82 -2
- package/src/tools/autoresearch.ts +149 -1
- package/src/tools/bash.ts +233 -62
- package/src/tools/cfg-render.ts +66 -1
- package/src/tools/debug.ts +78 -1
- package/src/tools/default-renderer.ts +35 -1
- package/src/tools/edit.ts +357 -31
- package/src/tools/eval.ts +257 -1
- package/src/tools/fetch.ts +102 -3
- package/src/tools/find.ts +127 -1
- package/src/tools/github.ts +119 -10
- package/src/tools/glob.ts +116 -1
- package/src/tools/goal.ts +56 -1
- package/src/tools/grep.ts +83 -2
- package/src/tools/grouped-file-output.ts +205 -0
- package/src/tools/json-tree.ts +116 -1
- package/src/tools/lsp.ts +318 -1
- package/src/tools/mcp.ts +80 -1
- package/src/tools/memory.ts +93 -11
- package/src/tools/native-view.ts +292 -0
- package/src/tools/proc-render.ts +221 -1
- package/src/tools/read.ts +199 -4
- package/src/tools/renderer.ts +61 -0
- package/src/tools/report-tool-issue.ts +7 -1
- package/src/tools/resolve.ts +63 -1
- package/src/tools/streaming-output.ts +79 -16
- package/src/tools/task.ts +406 -4
- package/src/tools/think.ts +19 -1
- package/src/tools/todo.ts +89 -0
- package/src/tools/vibe.ts +230 -2
- package/src/tools/wait.ts +181 -1
- package/src/tools/web-search-types.ts +99 -0
- package/src/tools/web-search.ts +111 -170
- package/src/tools/write.ts +144 -5
- package/src/tools/xdev.ts +64 -1
- package/src/tui.ts +295 -4
- package/dist/types/setup/scenes/providers.d.ts +0 -3
- package/dist/types/setup/scenes/web-search.d.ts +0 -22
- package/src/setup/scenes/providers.ts +0 -110
- package/src/setup/scenes/web-search.ts +0 -165
|
@@ -14,7 +14,11 @@ import { Markdown } from "../components/markdown";
|
|
|
14
14
|
import { Spacer } from "../components/spacer";
|
|
15
15
|
import { Text } from "../components/text";
|
|
16
16
|
import { type Component, Container } from "../tui";
|
|
17
|
-
import { getMarkdownTheme, type Theme, type ThemeColor, theme } from "../theme/index";
|
|
17
|
+
import { getMarkdownTheme, getThemeEpoch, type Theme, type ThemeColor, theme } from "../theme/index";
|
|
18
|
+
import { card, col, md, span } from "../native/describe";
|
|
19
|
+
import { type NativeNode, type NativeUiEvent, rootToggleExpanded } from "../native/node";
|
|
20
|
+
import { Memo } from "../native/memo";
|
|
21
|
+
import { colorTone } from "../native/tone";
|
|
18
22
|
/** Message shape consumed by the shared frame. */
|
|
19
23
|
export interface FramedMessage {
|
|
20
24
|
customType: string;
|
|
@@ -44,6 +48,8 @@ export interface FramedMessageOptions<M extends FramedMessage> {
|
|
|
44
48
|
/** Collapse the markdown body to this many lines when `expanded` is false. Omit to never collapse. */
|
|
45
49
|
readonly collapseAfterLines?: number;
|
|
46
50
|
readonly customRenderer?: FramedRenderer<M>;
|
|
51
|
+
/** Semantic role of the native card. */
|
|
52
|
+
readonly role: string;
|
|
47
53
|
}
|
|
48
54
|
|
|
49
55
|
/**
|
|
@@ -57,6 +63,8 @@ export class FramedMessageComponent<M extends FramedMessage> extends Container {
|
|
|
57
63
|
#customComponent: Component | undefined;
|
|
58
64
|
#expanded = false;
|
|
59
65
|
#disposed = false;
|
|
66
|
+
#version = 0;
|
|
67
|
+
readonly #native = new Memo();
|
|
60
68
|
|
|
61
69
|
constructor(options: FramedMessageOptions<M>) {
|
|
62
70
|
super();
|
|
@@ -86,8 +94,51 @@ export class FramedMessageComponent<M extends FramedMessage> extends Container {
|
|
|
86
94
|
this.#customComponent = undefined;
|
|
87
95
|
}
|
|
88
96
|
|
|
97
|
+
/**
|
|
98
|
+
* The extension renderer's component when it supplied one; otherwise a
|
|
99
|
+
* card with the type tag as its head and the markdown body, clamped by the
|
|
100
|
+
* terminal while collapsed.
|
|
101
|
+
*/
|
|
102
|
+
override describe(): NativeNode {
|
|
103
|
+
const key = [this.#version, this.#expanded, getThemeEpoch()];
|
|
104
|
+
return this.#native.get(key, () => {
|
|
105
|
+
if (this.#customComponent) return col([this.#customComponent], { role: this.#options.role });
|
|
106
|
+
const hideHeader =
|
|
107
|
+
typeof this.#options.hideHeader === "function" ? this.#options.hideHeader() : this.#options.hideHeader;
|
|
108
|
+
// The role icon (Tern's named icon) replaces the nerd glyph.
|
|
109
|
+
const tag = this.#options.message.customType;
|
|
110
|
+
const collapseAfterLines = this.#options.collapseAfterLines;
|
|
111
|
+
return card(
|
|
112
|
+
{
|
|
113
|
+
role: this.#options.role,
|
|
114
|
+
tone: colorTone(this.#options.borderColor),
|
|
115
|
+
head: hideHeader ? undefined : [span(tag, "customMessageLabel strong")],
|
|
116
|
+
collapsible: collapseAfterLines !== undefined,
|
|
117
|
+
collapsed: collapseAfterLines !== undefined ? !this.#expanded : undefined,
|
|
118
|
+
preview: collapseAfterLines !== undefined ? { lines: collapseAfterLines } : undefined,
|
|
119
|
+
},
|
|
120
|
+
[md(this.#messageText())],
|
|
121
|
+
);
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
handleNativeEvent(event: NativeUiEvent): void {
|
|
126
|
+
const expanded = rootToggleExpanded(event);
|
|
127
|
+
if (expanded !== undefined) this.setExpanded(expanded);
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
#messageText(): string {
|
|
131
|
+
const content = this.#options.message.content;
|
|
132
|
+
if (typeof content === "string") return content;
|
|
133
|
+
return content
|
|
134
|
+
.filter((part): part is TextContent => part.type === "text")
|
|
135
|
+
.map(part => part.text)
|
|
136
|
+
.join("\n");
|
|
137
|
+
}
|
|
138
|
+
|
|
89
139
|
#rebuild(): void {
|
|
90
140
|
if (this.#disposed) return;
|
|
141
|
+
this.#version++;
|
|
91
142
|
let nextCustomComponent: Component | undefined;
|
|
92
143
|
const customRenderer = this.#options.customRenderer;
|
|
93
144
|
if (customRenderer) {
|
|
@@ -138,15 +189,7 @@ export class FramedMessageComponent<M extends FramedMessage> extends Container {
|
|
|
138
189
|
this.#box.addChild(new Spacer(1));
|
|
139
190
|
}
|
|
140
191
|
|
|
141
|
-
let text
|
|
142
|
-
if (typeof this.#options.message.content === "string") {
|
|
143
|
-
text = this.#options.message.content;
|
|
144
|
-
} else {
|
|
145
|
-
text = this.#options.message.content
|
|
146
|
-
.filter((content): content is TextContent => content.type === "text")
|
|
147
|
-
.map(content => content.text)
|
|
148
|
-
.join("\n");
|
|
149
|
-
}
|
|
192
|
+
let text = this.#messageText();
|
|
150
193
|
|
|
151
194
|
const collapseAfterLines = this.#options.collapseAfterLines;
|
|
152
195
|
if (!this.#expanded && collapseAfterLines !== undefined) {
|
|
@@ -1,8 +1,13 @@
|
|
|
1
1
|
import { Box } from "../components/box";
|
|
2
2
|
import { Spacer } from "../components/spacer";
|
|
3
3
|
import { Text } from "../components/text";
|
|
4
|
+
import type { TspPreview, TspText } from "@oh-my-pi/pi-wire";
|
|
4
5
|
import { type Component, Container } from "../tui";
|
|
5
6
|
import { type ThemeColor, theme } from "../theme";
|
|
7
|
+
import { card, node, text, withHidden } from "../native/describe";
|
|
8
|
+
import { type NativeChild, type NativeNode, type NativeUiEvent, rootToggleExpanded } from "../native/node";
|
|
9
|
+
import { Memo } from "../native/memo";
|
|
10
|
+
import { colorTone } from "../native/tone";
|
|
6
11
|
|
|
7
12
|
const NO_LINES: readonly string[] = [];
|
|
8
13
|
|
|
@@ -18,6 +23,19 @@ export interface MessageNoticePresentation {
|
|
|
18
23
|
readonly body?: Component | readonly Component[];
|
|
19
24
|
}
|
|
20
25
|
|
|
26
|
+
/** Semantic notice content for native terminals: the card head and body, never pre-styled rows. */
|
|
27
|
+
export interface MessageNoticeNativePresentation {
|
|
28
|
+
readonly head: TspText;
|
|
29
|
+
readonly body?: readonly NativeChild[];
|
|
30
|
+
/** Body clamp while collapsed; set to make the notice collapsible. */
|
|
31
|
+
readonly preview?: TspPreview;
|
|
32
|
+
/**
|
|
33
|
+
* Draw as an inline notice (a named icon and one line, the body a
|
|
34
|
+
* disclosure below it) instead of a toned card.
|
|
35
|
+
*/
|
|
36
|
+
readonly inline?: { readonly icon: string };
|
|
37
|
+
}
|
|
38
|
+
|
|
21
39
|
function isComponentList(value: Component | readonly Component[]): value is readonly Component[] {
|
|
22
40
|
return Array.isArray(value);
|
|
23
41
|
}
|
|
@@ -25,6 +43,10 @@ function isComponentList(value: Component | readonly Component[]): value is read
|
|
|
25
43
|
/** Presentation policy for a transcript notice. */
|
|
26
44
|
export interface MessageNoticeOptions {
|
|
27
45
|
readonly presentation: (context: MessageNoticeContext) => MessageNoticePresentation;
|
|
46
|
+
/** Card content for native terminals; the full content, since collapse is the terminal's. */
|
|
47
|
+
readonly nativePresentation: () => MessageNoticeNativePresentation;
|
|
48
|
+
/** Semantic role of the native card (`omp.notice.<name>`). */
|
|
49
|
+
readonly role: string;
|
|
28
50
|
readonly severity?: ThemeColor;
|
|
29
51
|
readonly background?: (text: string) => string;
|
|
30
52
|
readonly leadingSpace?: boolean;
|
|
@@ -39,6 +61,8 @@ export class MessageNoticeComponent extends Container {
|
|
|
39
61
|
readonly #box: Box;
|
|
40
62
|
#expanded = false;
|
|
41
63
|
#toolActivityVisible = true;
|
|
64
|
+
#version = 0;
|
|
65
|
+
readonly #native = new Memo();
|
|
42
66
|
|
|
43
67
|
constructor(options: MessageNoticeOptions) {
|
|
44
68
|
super();
|
|
@@ -69,6 +93,7 @@ export class MessageNoticeComponent extends Container {
|
|
|
69
93
|
|
|
70
94
|
/** Rebuild the presentation after controller-owned state changes. */
|
|
71
95
|
refresh(): void {
|
|
96
|
+
this.#version++;
|
|
72
97
|
for (const child of this.#box.children) child.dispose?.();
|
|
73
98
|
this.#box.clear();
|
|
74
99
|
const presentation = this.#options.presentation({ expanded: this.#expanded });
|
|
@@ -100,4 +125,50 @@ export class MessageNoticeComponent extends Container {
|
|
|
100
125
|
if (!this.#toolActivityVisible) return NO_LINES;
|
|
101
126
|
return super.render(width);
|
|
102
127
|
}
|
|
128
|
+
|
|
129
|
+
/** A severity-toned card; collapse is local to the terminal and mirrored through {@link handleNativeEvent}. */
|
|
130
|
+
override describe(): NativeNode {
|
|
131
|
+
const key = [this.#version, this.#expanded, this.#toolActivityVisible];
|
|
132
|
+
return this.#native.get(key, () => {
|
|
133
|
+
const presentation = this.#options.nativePresentation();
|
|
134
|
+
if (presentation.inline) {
|
|
135
|
+
const body = presentation.body ?? [];
|
|
136
|
+
const head = node(
|
|
137
|
+
"row",
|
|
138
|
+
{ gap: "sm" },
|
|
139
|
+
[node("icon", { name: presentation.inline.icon }), text(presentation.head, { truncate: "end" })],
|
|
140
|
+
"head",
|
|
141
|
+
);
|
|
142
|
+
const notice = node(
|
|
143
|
+
"section",
|
|
144
|
+
{
|
|
145
|
+
role: this.#options.role,
|
|
146
|
+
tone: colorTone(this.#options.severity ?? "warning"),
|
|
147
|
+
collapsible: body.length > 0,
|
|
148
|
+
collapsed: body.length > 0 ? !this.#expanded : undefined,
|
|
149
|
+
},
|
|
150
|
+
[head, ...body],
|
|
151
|
+
);
|
|
152
|
+
return withHidden(notice, !this.#toolActivityVisible);
|
|
153
|
+
}
|
|
154
|
+
const collapsible = presentation.preview !== undefined;
|
|
155
|
+
const notice = card(
|
|
156
|
+
{
|
|
157
|
+
role: this.#options.role,
|
|
158
|
+
tone: colorTone(this.#options.severity ?? "warning"),
|
|
159
|
+
head: presentation.head,
|
|
160
|
+
collapsible,
|
|
161
|
+
collapsed: collapsible ? !this.#expanded : undefined,
|
|
162
|
+
preview: presentation.preview,
|
|
163
|
+
},
|
|
164
|
+
presentation.body ?? [],
|
|
165
|
+
);
|
|
166
|
+
return withHidden(notice, !this.#toolActivityVisible);
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
handleNativeEvent(event: NativeUiEvent): void {
|
|
171
|
+
const expanded = rootToggleExpanded(event);
|
|
172
|
+
if (expanded !== undefined) this.setExpanded(expanded);
|
|
173
|
+
}
|
|
103
174
|
}
|
|
@@ -6,6 +6,9 @@
|
|
|
6
6
|
* (rounded corners, sharp tee/cross junctions) and the `border`/`accent` theme
|
|
7
7
|
* colors so all outlined overlays read identically.
|
|
8
8
|
*/
|
|
9
|
+
import type { DescribeContext, NativeChild, NativeNode } from "../native/node";
|
|
10
|
+
import { node } from "../native/describe";
|
|
11
|
+
import { overlayCard } from "../native/overlay";
|
|
9
12
|
import { type Component, visibleWidth } from "../tui";
|
|
10
13
|
import { Ellipsis, truncateToWidth } from "../utils";
|
|
11
14
|
import { padToWidth } from "../render/utils";
|
|
@@ -169,11 +172,23 @@ export class PanelRows implements Component {
|
|
|
169
172
|
}
|
|
170
173
|
}
|
|
171
174
|
|
|
172
|
-
|
|
175
|
+
const RULE_NODE: NativeNode = node("rule");
|
|
176
|
+
|
|
177
|
+
/** Sentinel child rendered by {@link OverlayPanel} as a `├───┤` section rule (a `rule` natively). */
|
|
173
178
|
export class PanelDivider implements Component {
|
|
174
179
|
render(): readonly string[] {
|
|
175
180
|
return NO_LINES;
|
|
176
181
|
}
|
|
182
|
+
|
|
183
|
+
describe(): NativeNode {
|
|
184
|
+
return RULE_NODE;
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
interface OverlayPanelNativeMemo {
|
|
189
|
+
title: string;
|
|
190
|
+
children: readonly Component[];
|
|
191
|
+
node: NativeNode;
|
|
177
192
|
}
|
|
178
193
|
|
|
179
194
|
interface OverlayPanelMemo {
|
|
@@ -195,14 +210,26 @@ function collapseTitle(title: string): string {
|
|
|
195
210
|
* so inline overlays share the chrome of fullscreen overlays. The top border
|
|
196
211
|
* is exactly one row — `routeMouse` offsets written for a one-line top rule
|
|
197
212
|
* stay valid — and content is inset two columns on each side.
|
|
213
|
+
*
|
|
214
|
+
* Natively the panel is a root `card` (`head` = title, `role` =
|
|
215
|
+
* `omp.overlay.<name>`) over its children; the frame is the terminal's.
|
|
216
|
+
* Subclasses whose body is not a plain child list override `describe`.
|
|
198
217
|
*/
|
|
199
218
|
export class OverlayPanel implements Component {
|
|
200
219
|
children: Component[] = [];
|
|
201
220
|
#title: string;
|
|
221
|
+
readonly #role: string;
|
|
202
222
|
#memo: OverlayPanelMemo | undefined;
|
|
223
|
+
#nativeMemo: OverlayPanelNativeMemo | undefined;
|
|
203
224
|
|
|
204
|
-
constructor(title = "") {
|
|
225
|
+
constructor(title = "", role = "omp.overlay") {
|
|
205
226
|
this.#title = collapseTitle(title);
|
|
227
|
+
this.#role = role;
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
/** The `role` of the panel's native root card. */
|
|
231
|
+
get nativeRole(): string {
|
|
232
|
+
return this.#role;
|
|
206
233
|
}
|
|
207
234
|
|
|
208
235
|
get title(): string {
|
|
@@ -263,6 +290,22 @@ export class OverlayPanel implements Component {
|
|
|
263
290
|
return result;
|
|
264
291
|
}
|
|
265
292
|
|
|
293
|
+
describe(_cx: DescribeContext): NativeNode | null {
|
|
294
|
+
const memo = this.#nativeMemo;
|
|
295
|
+
if (
|
|
296
|
+
memo !== undefined &&
|
|
297
|
+
memo.title === this.#title &&
|
|
298
|
+
memo.children.length === this.children.length &&
|
|
299
|
+
this.children.every((child, i) => memo.children[i] === child)
|
|
300
|
+
) {
|
|
301
|
+
return memo.node;
|
|
302
|
+
}
|
|
303
|
+
const children: NativeChild[] = [...this.children];
|
|
304
|
+
const result = overlayCard(this.#role, this.#title, children);
|
|
305
|
+
this.#nativeMemo = { title: this.#title, children: [...this.children], node: result };
|
|
306
|
+
return result;
|
|
307
|
+
}
|
|
308
|
+
|
|
266
309
|
render(width: number): readonly string[] {
|
|
267
310
|
width = Number.isFinite(width) ? Math.max(0, Math.trunc(width)) : 0;
|
|
268
311
|
const innerWidth = Math.max(1, width - 4);
|
package/src/chrome/qrcode.ts
CHANGED
|
@@ -510,6 +510,34 @@ export interface QrRenderOptions {
|
|
|
510
510
|
const ANSI_RESET = "\x1b[0m";
|
|
511
511
|
const ANSI_QR_ROW_PREFIX = "\x1b[47m\x1b[30m"; // white background, black foreground
|
|
512
512
|
|
|
513
|
+
/**
|
|
514
|
+
* Render a QR symbol as plain half-block rows (no escapes) for a terminal that
|
|
515
|
+
* draws text in its own foreground color. `inkLight` draws the *light*
|
|
516
|
+
* modules (quiet zone included) as ink: on a dark background with a light
|
|
517
|
+
* foreground that yields the dark-on-light symbol cameras expect.
|
|
518
|
+
*/
|
|
519
|
+
export function renderQrText(qr: QrCode, inkLight: boolean, options?: QrRenderOptions): string[] {
|
|
520
|
+
const margin = Math.max(0, options?.margin ?? 4);
|
|
521
|
+
const dim = qr.size + margin * 2;
|
|
522
|
+
const ink = (gx: number, gy: number): boolean => {
|
|
523
|
+
const x = gx - margin;
|
|
524
|
+
const y = gy - margin;
|
|
525
|
+
const dark = x >= 0 && x < qr.size && y >= 0 && y < qr.size && qr.module(x, y);
|
|
526
|
+
return gy < dim && dark !== inkLight;
|
|
527
|
+
};
|
|
528
|
+
const lines: string[] = [];
|
|
529
|
+
for (let gy = 0; gy < dim; gy += 2) {
|
|
530
|
+
let row = "";
|
|
531
|
+
for (let gx = 0; gx < dim; gx++) {
|
|
532
|
+
const top = ink(gx, gy);
|
|
533
|
+
const bottom = ink(gx, gy + 1);
|
|
534
|
+
row += top ? (bottom ? "█" : "▀") : bottom ? "▄" : " ";
|
|
535
|
+
}
|
|
536
|
+
lines.push(row);
|
|
537
|
+
}
|
|
538
|
+
return lines;
|
|
539
|
+
}
|
|
540
|
+
|
|
513
541
|
/**
|
|
514
542
|
* Render a QR symbol as ANSI half-block rows: each text row packs two module
|
|
515
543
|
* rows via `▀`/`▄`/`█`, drawn black-on-white so a phone camera reads dark
|
|
@@ -10,6 +10,8 @@
|
|
|
10
10
|
*/
|
|
11
11
|
import { type ThemeColor, theme } from "../theme/index";
|
|
12
12
|
import { BG_RESET, FG_RESET } from "../theme/color";
|
|
13
|
+
import type { NativeNode } from "../native/node";
|
|
14
|
+
import { node, row } from "../native/describe";
|
|
13
15
|
export interface TrackSegment {
|
|
14
16
|
label: string;
|
|
15
17
|
}
|
|
@@ -52,6 +54,30 @@ export function resolveSegmentPalette(count: number): ThemeColor[] {
|
|
|
52
54
|
return palette;
|
|
53
55
|
}
|
|
54
56
|
|
|
57
|
+
/**
|
|
58
|
+
* Native {@link renderSegmentTrack}: a row of position-colored labels, the
|
|
59
|
+
* active one roled `omp.track.active` so the terminal fills it as a chip in
|
|
60
|
+
* its own color. No caps or separators travel; the terminal draws them.
|
|
61
|
+
*/
|
|
62
|
+
export function describeSegmentTrack(segments: readonly TrackSegment[], activeIndex: number): NativeNode {
|
|
63
|
+
const palette = resolveSegmentPalette(segments.length);
|
|
64
|
+
return row(
|
|
65
|
+
segments.map((segment, index) =>
|
|
66
|
+
node(
|
|
67
|
+
"text",
|
|
68
|
+
{
|
|
69
|
+
spans: [{ t: segment.label, s: palette[index % palette.length] }],
|
|
70
|
+
wrap: "none",
|
|
71
|
+
role: index === activeIndex ? "omp.track.active" : "omp.track.item",
|
|
72
|
+
},
|
|
73
|
+
undefined,
|
|
74
|
+
`${index}`,
|
|
75
|
+
),
|
|
76
|
+
),
|
|
77
|
+
{ gap: "sm", align: "center", role: "omp.track" },
|
|
78
|
+
);
|
|
79
|
+
}
|
|
80
|
+
|
|
55
81
|
/**
|
|
56
82
|
* Render `segments` as a colored chip track with `activeIndex` filled. Returns
|
|
57
83
|
* a single line of styled text with no surrounding caption or arrows — callers
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
* replace.
|
|
7
7
|
*/
|
|
8
8
|
import { centeredViewportRange, scrollOffsetForRow, viewportOverflows } from "../components/scroll-viewport";
|
|
9
|
-
import {
|
|
9
|
+
import { matchesKey } from "../keys";
|
|
10
10
|
import { ScrollView } from "../components/scroll-view";
|
|
11
11
|
import { theme } from "../theme/index";
|
|
12
12
|
/**
|
|
@@ -72,22 +72,6 @@ export function clampSelection(
|
|
|
72
72
|
return { selectedIndex: selected, scrollOffset: scroll };
|
|
73
73
|
}
|
|
74
74
|
|
|
75
|
-
/**
|
|
76
|
-
* Classify a key event for search-query text entry. Returns the single
|
|
77
|
-
* printable character to append to the query, or `null` when the key is not a
|
|
78
|
-
* searchable character: non-printable or multi-byte.
|
|
79
|
-
*/
|
|
80
|
-
export function searchableChar(data: string): string | null {
|
|
81
|
-
const printableText = extractPrintableText(data);
|
|
82
|
-
if (printableText && printableText.length === 1) {
|
|
83
|
-
const printableCharCode = printableText.charCodeAt(0);
|
|
84
|
-
if (printableCharCode > 32 && printableCharCode < 127) {
|
|
85
|
-
return printableText;
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
return null;
|
|
89
|
-
}
|
|
90
|
-
|
|
91
75
|
/**
|
|
92
76
|
* Handle the shared tab-cycling keys: Tab/Right advance to the next tab,
|
|
93
77
|
* Shift+Tab/Left to the previous. Invokes `switchTab` with the direction and
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { Spacer } from "../components/spacer";
|
|
2
|
+
import { Text } from "../components/text";
|
|
3
|
+
import { node } from "../native/describe";
|
|
4
|
+
import type { NativeNode } from "../native/node";
|
|
5
|
+
import { styledSpans } from "../native/spans";
|
|
6
|
+
import { Container } from "../tui";
|
|
7
|
+
|
|
8
|
+
/** How long a native status toast stays up (ms). */
|
|
9
|
+
const TOAST_TTL = 2400;
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* A transient status notice (`showStatus`: "Thinking blocks: hidden", "Copied
|
|
13
|
+
* to clipboard"). The ANSI render appends a blank row and the dim line to the
|
|
14
|
+
* transcript; a native terminal shows it as a toast instead, so notices never
|
|
15
|
+
* pile up in the history. Updating the text re-shows the toast.
|
|
16
|
+
*/
|
|
17
|
+
export class StatusNotice extends Container {
|
|
18
|
+
readonly #text: Text;
|
|
19
|
+
#message: string;
|
|
20
|
+
#native: NativeNode | undefined;
|
|
21
|
+
|
|
22
|
+
constructor(message: string, styleFn?: (text: string) => string) {
|
|
23
|
+
super();
|
|
24
|
+
this.#message = message;
|
|
25
|
+
this.#text = new Text(message, 1, 0).setStyleFn(styleFn);
|
|
26
|
+
this.addChild(new Spacer(1));
|
|
27
|
+
this.addChild(this.#text);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
setMessage(message: string, styleFn?: (text: string) => string): void {
|
|
31
|
+
this.#text.setStyleFn(styleFn);
|
|
32
|
+
this.#text.setText(message);
|
|
33
|
+
if (message !== this.#message) this.#native = undefined;
|
|
34
|
+
this.#message = message;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
override describe(): NativeNode {
|
|
38
|
+
if (this.#native) return this.#native;
|
|
39
|
+
// Callers may pass pre-styled text; a toast takes plain text.
|
|
40
|
+
const plain = styledSpans(this.#message)
|
|
41
|
+
.map(run => run.t)
|
|
42
|
+
.join("");
|
|
43
|
+
this.#native = node("toast", { text: plain, ttl: TOAST_TTL, role: "omp.toast.status" });
|
|
44
|
+
return this.#native;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
import { Spacer } from "../components/spacer";
|
|
2
2
|
import { Text } from "../components/text";
|
|
3
3
|
import { type Component, Container } from "../tui";
|
|
4
|
+
import { col, span, text } from "../native/describe";
|
|
5
|
+
import type { NativeChild, NativeNode } from "../native/node";
|
|
6
|
+
import { plainText } from "../native/spans";
|
|
4
7
|
|
|
5
8
|
/** One refresh of a streaming overlay's presentation. */
|
|
6
9
|
export interface StreamingPanelPresentation {
|
|
@@ -18,11 +21,21 @@ class StreamingPanelFooter implements Component {
|
|
|
18
21
|
readonly #line: string | (() => string);
|
|
19
22
|
#renderedLine: string | undefined;
|
|
20
23
|
#text: Text | undefined;
|
|
24
|
+
#native: { line: string; node: NativeNode } | undefined;
|
|
21
25
|
|
|
22
26
|
constructor(line: string | (() => string)) {
|
|
23
27
|
this.#line = line;
|
|
24
28
|
}
|
|
25
29
|
|
|
30
|
+
/** The footer line as muted text, re-read each describe because action availability can change. */
|
|
31
|
+
describe(): NativeNode {
|
|
32
|
+
const line = plainText(typeof this.#line === "function" ? this.#line() : this.#line);
|
|
33
|
+
if (this.#native?.line !== line) {
|
|
34
|
+
this.#native = { line, node: text([span(line, "muted")], { wrap: "word", role: "omp.panel.footer" }) };
|
|
35
|
+
}
|
|
36
|
+
return this.#native.node;
|
|
37
|
+
}
|
|
38
|
+
|
|
26
39
|
render(width: number): readonly string[] {
|
|
27
40
|
const line = typeof this.#line === "function" ? this.#line() : this.#line;
|
|
28
41
|
if (!this.#text || line !== this.#renderedLine) {
|
|
@@ -44,6 +57,7 @@ class StreamingPanelFooter implements Component {
|
|
|
44
57
|
*/
|
|
45
58
|
export class StreamingPanelContent extends Container {
|
|
46
59
|
readonly #presentation: () => StreamingPanelPresentation;
|
|
60
|
+
#native: NativeNode = col([]);
|
|
47
61
|
|
|
48
62
|
constructor(presentation: () => StreamingPanelPresentation) {
|
|
49
63
|
super();
|
|
@@ -56,14 +70,24 @@ export class StreamingPanelContent extends Container {
|
|
|
56
70
|
this.disposeChildren();
|
|
57
71
|
this.addChild(new Spacer(1));
|
|
58
72
|
const presentation = this.#presentation();
|
|
73
|
+
const sections: NativeChild[] = [];
|
|
59
74
|
for (const section of presentation.sections) {
|
|
60
75
|
if (!section) continue;
|
|
61
76
|
const children = isComponentList(section) ? section : [section];
|
|
62
77
|
if (children.length === 0) continue;
|
|
63
78
|
for (const child of children) this.addChild(child);
|
|
64
79
|
this.addChild(new Spacer(1));
|
|
80
|
+
sections.push(col(children));
|
|
65
81
|
}
|
|
66
|
-
|
|
82
|
+
const footer = new StreamingPanelFooter(presentation.footer);
|
|
83
|
+
this.addChild(footer);
|
|
84
|
+
sections.push(footer);
|
|
85
|
+
this.#native = col(sections, { gap: "sm" });
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/** The sections as a spaced stack followed by the footer; spacing is the terminal's. */
|
|
89
|
+
override describe(): NativeNode {
|
|
90
|
+
return this.#native;
|
|
67
91
|
}
|
|
68
92
|
|
|
69
93
|
override invalidate(): void {
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import { type Component, Container } from "../tui";
|
|
2
|
+
import { col } from "../native/describe";
|
|
3
|
+
import type { NativeNode } from "../native/node";
|
|
2
4
|
export interface ToolActivityComponent {
|
|
3
5
|
setToolActivityVisible(visible: boolean): void;
|
|
4
6
|
}
|
|
@@ -9,6 +11,7 @@ export function isToolActivityComponent(component: Component): component is Comp
|
|
|
9
11
|
|
|
10
12
|
export class ToolActivityContainer extends Container implements ToolActivityComponent {
|
|
11
13
|
#visible = true;
|
|
14
|
+
#native: { children: readonly Component[]; visible: boolean; node: NativeNode } | undefined;
|
|
12
15
|
|
|
13
16
|
constructor(component: Component | Component[]) {
|
|
14
17
|
super();
|
|
@@ -41,4 +44,21 @@ export class ToolActivityContainer extends Container implements ToolActivityComp
|
|
|
41
44
|
if (!this.#visible) return [];
|
|
42
45
|
return super.render(width);
|
|
43
46
|
}
|
|
47
|
+
|
|
48
|
+
/** The wrapped children; hidden tool activity stays mounted so toggling it is one prop change. */
|
|
49
|
+
override describe(): NativeNode {
|
|
50
|
+
const cached = this.#native;
|
|
51
|
+
const children = this.children;
|
|
52
|
+
if (
|
|
53
|
+
cached?.visible === this.#visible &&
|
|
54
|
+
cached.children.length === children.length &&
|
|
55
|
+
cached.children.every((child, index) => child === children[index])
|
|
56
|
+
) {
|
|
57
|
+
return cached.node;
|
|
58
|
+
}
|
|
59
|
+
const snapshot = children.slice();
|
|
60
|
+
const node = col(snapshot, this.#visible ? { role: "omp.activity" } : { role: "omp.activity", hidden: true });
|
|
61
|
+
this.#native = { children: snapshot, visible: this.#visible, node };
|
|
62
|
+
return node;
|
|
63
|
+
}
|
|
44
64
|
}
|