@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
package/src/tools/edit.ts
CHANGED
|
@@ -6,9 +6,22 @@ import { type EditInspection, editInspect } from "@oh-my-pi/pi-natives";
|
|
|
6
6
|
import type { Component } from "../tui";
|
|
7
7
|
import { sliceWithWidth, visibleWidth, wrapTextWithAnsi } from "../utils";
|
|
8
8
|
import { sanitizeText } from "@oh-my-pi/pi-utils";
|
|
9
|
-
import type { RenderResultOptions, ToolRenderer } from "./renderer";
|
|
9
|
+
import type { NativeToolHead, NativeToolView, RenderResultOptions, ToolRenderer } from "./renderer";
|
|
10
|
+
import { code, compact, node, span } from "../native/describe";
|
|
11
|
+
import type { NativeChild, NativeNode } from "../native/node";
|
|
12
|
+
import {
|
|
13
|
+
diagnosticsBadge,
|
|
14
|
+
diagnosticsSection,
|
|
15
|
+
diffStatsMeta,
|
|
16
|
+
displayPath,
|
|
17
|
+
errorText,
|
|
18
|
+
fileDiffSection,
|
|
19
|
+
fileHref,
|
|
20
|
+
noteText,
|
|
21
|
+
resultText,
|
|
22
|
+
} from "./native-view";
|
|
10
23
|
import type { FileDiagnosticsResult } from "./lsp";
|
|
11
|
-
import { renderDiff as renderDiffColored } from "../chrome/diff";
|
|
24
|
+
import { nativeDiff, renderDiff as renderDiffColored } from "../chrome/diff";
|
|
12
25
|
import { getLanguageFromPath } from "../lang-from-path";
|
|
13
26
|
import type { Theme } from "../theme/theme";
|
|
14
27
|
import type { OutputMeta } from "./output-meta";
|
|
@@ -239,16 +252,14 @@ function decodePartialJsonStringFragment(fragment: string): string {
|
|
|
239
252
|
}
|
|
240
253
|
}
|
|
241
254
|
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
const pattern = new RegExp(`"${key}"\\s*:\\s*"((?:\\\\.|[^"\\\\])*)`, "u");
|
|
245
|
-
const match = pattern.exec(partialJson);
|
|
246
|
-
if (!match) return undefined;
|
|
247
|
-
return decodePartialJsonStringFragment(match[1]);
|
|
248
|
-
}
|
|
255
|
+
// `"path": "<possibly unterminated string>` in a raw streamed args buffer.
|
|
256
|
+
const PARTIAL_JSON_PATH_RE = /"path"\s*:\s*"((?:\\.|[^"\\])*)/u;
|
|
249
257
|
|
|
250
258
|
function getPartialJsonEditPath(args: EditRenderArgs): string | undefined {
|
|
251
|
-
|
|
259
|
+
const partialJson = args.__partialJson;
|
|
260
|
+
if (!partialJson) return undefined;
|
|
261
|
+
const match = PARTIAL_JSON_PATH_RE.exec(partialJson);
|
|
262
|
+
return match ? decodePartialJsonStringFragment(match[1]!) : undefined;
|
|
252
263
|
}
|
|
253
264
|
|
|
254
265
|
/** Count distinct file paths in an edits array. */
|
|
@@ -427,8 +438,33 @@ function hasEditCallPayload(args: EditRenderArgs, renderContext: EditRenderConte
|
|
|
427
438
|
return false;
|
|
428
439
|
}
|
|
429
440
|
|
|
441
|
+
/**
|
|
442
|
+
* Head-window preview of streamed replacement text. Only the displayed head is
|
|
443
|
+
* sanitized and split; the hidden-line count comes from a raw newline scan.
|
|
444
|
+
* That matches sanitizing the whole text because, on ESC-free input,
|
|
445
|
+
* `sanitizeText` only deletes individual code units and never a `\n`: the
|
|
446
|
+
* cut sits on a `\n`, so it cannot split a surrogate pair. The one non-local
|
|
447
|
+
* rule — a lone surrogate anywhere drops every U+FFFD — is replayed on the
|
|
448
|
+
* head. ESC-bearing text (ANSI stripping can span lines) takes the full path.
|
|
449
|
+
*/
|
|
430
450
|
function renderPlainTextPreview(text: string, uiTheme: Theme, _filePath?: string): string {
|
|
431
|
-
|
|
451
|
+
let previewLines: { lines: readonly string[]; hidden: number };
|
|
452
|
+
let headEnd = -1;
|
|
453
|
+
if (!text.includes("\x1b")) {
|
|
454
|
+
for (let newlines = 0; newlines < CALL_TEXT_PREVIEW_LINES; newlines++) {
|
|
455
|
+
headEnd = text.indexOf("\n", headEnd + 1);
|
|
456
|
+
if (headEnd === -1) break;
|
|
457
|
+
}
|
|
458
|
+
}
|
|
459
|
+
if (headEnd === -1) {
|
|
460
|
+
previewLines = cappedHeadLines(sanitizeText(text).split("\n"), CALL_TEXT_PREVIEW_LINES);
|
|
461
|
+
} else {
|
|
462
|
+
let head = sanitizeText(text.slice(0, headEnd));
|
|
463
|
+
if (head.includes("\ufffd") && !text.isWellFormed()) head = head.replaceAll("\ufffd", "");
|
|
464
|
+
let hidden = 1;
|
|
465
|
+
for (let i = text.indexOf("\n", headEnd + 1); i !== -1; i = text.indexOf("\n", i + 1)) hidden++;
|
|
466
|
+
previewLines = { lines: head.split("\n"), hidden };
|
|
467
|
+
}
|
|
432
468
|
let preview = "\n\n";
|
|
433
469
|
for (const line of previewLines.lines) {
|
|
434
470
|
preview += `${uiTheme.fg("toolOutput", truncateToWidth(replaceTabs(line), CALL_TEXT_PREVIEW_WIDTH))}\n`;
|
|
@@ -751,17 +787,30 @@ interface EditCallFacts {
|
|
|
751
787
|
* fields tolerate a small lag) or when the payload shrinks (rewind). The
|
|
752
788
|
* final frame (`isPartial === false`) always recomputes. This turns the
|
|
753
789
|
* per-frame O(n) stringify+parse+scan into O(n^2/K) total per call.
|
|
790
|
+
*
|
|
791
|
+
* The reveal hands over a fresh args object on every frame, so the gate
|
|
792
|
+
* keys on the streamed raw payload (`__partialJson`) rather than on args
|
|
793
|
+
* identity: a frame reuses the facts only when its payload extends, byte for
|
|
794
|
+
* byte, the payload the facts were derived from, and every direct field the
|
|
795
|
+
* facts read (path, file_path, rename, op, edits) is unchanged. Final args
|
|
796
|
+
* carry no `__partialJson`, so the completed call always derives exact facts.
|
|
754
797
|
*/
|
|
755
798
|
const EDIT_FACTS_MIN_GROWTH = 512;
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
|
|
759
|
-
|
|
760
|
-
|
|
761
|
-
|
|
762
|
-
|
|
763
|
-
|
|
764
|
-
|
|
799
|
+
interface EditFactsCacheEntry {
|
|
800
|
+
editArgs: EditRenderArgs;
|
|
801
|
+
isPartial: boolean;
|
|
802
|
+
editMode: EditMode | undefined;
|
|
803
|
+
length: number;
|
|
804
|
+
/** Streamed raw payload the facts were derived from; set only for streamed `input` payloads. */
|
|
805
|
+
streamedPayload: string | undefined;
|
|
806
|
+
filePath: unknown;
|
|
807
|
+
path: unknown;
|
|
808
|
+
rename: unknown;
|
|
809
|
+
op: Operation | undefined;
|
|
810
|
+
edits: EditRenderEntry[] | undefined;
|
|
811
|
+
facts: EditCallFacts;
|
|
812
|
+
}
|
|
813
|
+
let lastFactsCache: EditFactsCacheEntry | undefined;
|
|
765
814
|
|
|
766
815
|
function editFactsInputLength(editArgs: EditRenderArgs): number {
|
|
767
816
|
const input = editArgs.input ?? editArgs._input;
|
|
@@ -772,27 +821,72 @@ function editFactsInputLength(editArgs: EditRenderArgs): number {
|
|
|
772
821
|
return Array.isArray(editArgs.edits) ? editArgs.edits.length : 0;
|
|
773
822
|
}
|
|
774
823
|
|
|
824
|
+
/**
|
|
825
|
+
* Raw streamed payload of a mid-stream `input` edit, or undefined when the
|
|
826
|
+
* args are final (no `__partialJson`) or carry no `input` string — only the
|
|
827
|
+
* `input` payloads pay the expensive whole-payload inspect per frame.
|
|
828
|
+
*/
|
|
829
|
+
function streamedInputPayload(editArgs: EditRenderArgs): string | undefined {
|
|
830
|
+
if (typeof (editArgs.input ?? editArgs._input) !== "string") return undefined;
|
|
831
|
+
const payload = editArgs.__partialJson;
|
|
832
|
+
return typeof payload === "string" ? payload : undefined;
|
|
833
|
+
}
|
|
834
|
+
|
|
835
|
+
/**
|
|
836
|
+
* Whether a fresh streamed frame continues the payload `cached` was derived
|
|
837
|
+
* from within the growth gate. Exact: the cached payload must be a verbatim
|
|
838
|
+
* prefix of the new one, so a rewind or another call's payload never reuses.
|
|
839
|
+
*/
|
|
840
|
+
function continuesCachedPayload(cached: EditFactsCacheEntry, editArgs: EditRenderArgs): boolean {
|
|
841
|
+
const base = cached.streamedPayload;
|
|
842
|
+
if (base === undefined) return false;
|
|
843
|
+
const payload = streamedInputPayload(editArgs);
|
|
844
|
+
if (payload === undefined || payload.length < base.length) return false;
|
|
845
|
+
if (payload.length - base.length >= EDIT_FACTS_MIN_GROWTH) return false;
|
|
846
|
+
if (
|
|
847
|
+
editArgs.file_path !== cached.filePath ||
|
|
848
|
+
editArgs.path !== cached.path ||
|
|
849
|
+
editArgs.rename !== cached.rename ||
|
|
850
|
+
editArgs.op !== cached.op ||
|
|
851
|
+
editArgs.edits !== cached.edits
|
|
852
|
+
) {
|
|
853
|
+
return false;
|
|
854
|
+
}
|
|
855
|
+
return payload.startsWith(base);
|
|
856
|
+
}
|
|
857
|
+
|
|
775
858
|
function resolveEditCallFacts(
|
|
776
859
|
editArgs: EditRenderArgs,
|
|
777
860
|
isPartial: boolean,
|
|
778
861
|
editMode: EditMode | undefined,
|
|
779
862
|
): EditCallFacts {
|
|
780
863
|
const cached = lastFactsCache;
|
|
781
|
-
if (
|
|
782
|
-
cached
|
|
783
|
-
|
|
784
|
-
|
|
785
|
-
|
|
786
|
-
|
|
787
|
-
|
|
788
|
-
|
|
789
|
-
|
|
790
|
-
if (isPartial && length >= cached.length && length - cached.length < EDIT_FACTS_MIN_GROWTH) {
|
|
864
|
+
if (cached !== undefined && isPartial && cached.isPartial && cached.editMode === editMode) {
|
|
865
|
+
if (cached.editArgs === editArgs) {
|
|
866
|
+
const length = editFactsInputLength(editArgs);
|
|
867
|
+
// Same args object, still growing gradually: reuse. A rewind
|
|
868
|
+
// (shorter), a jump past the gate, or the final frame recomputes.
|
|
869
|
+
if (length >= cached.length && length - cached.length < EDIT_FACTS_MIN_GROWTH) {
|
|
870
|
+
return cached.facts;
|
|
871
|
+
}
|
|
872
|
+
} else if (continuesCachedPayload(cached, editArgs)) {
|
|
791
873
|
return cached.facts;
|
|
792
874
|
}
|
|
793
875
|
}
|
|
794
876
|
const facts = resolveEditCallFactsUncached(editArgs, isPartial, editMode);
|
|
795
|
-
lastFactsCache = {
|
|
877
|
+
lastFactsCache = {
|
|
878
|
+
editArgs,
|
|
879
|
+
isPartial,
|
|
880
|
+
editMode,
|
|
881
|
+
length: editFactsInputLength(editArgs),
|
|
882
|
+
streamedPayload: streamedInputPayload(editArgs),
|
|
883
|
+
filePath: editArgs.file_path,
|
|
884
|
+
path: editArgs.path,
|
|
885
|
+
rename: editArgs.rename,
|
|
886
|
+
op: editArgs.op,
|
|
887
|
+
edits: editArgs.edits,
|
|
888
|
+
facts,
|
|
889
|
+
};
|
|
796
890
|
return facts;
|
|
797
891
|
}
|
|
798
892
|
|
|
@@ -1030,6 +1124,116 @@ export const editToolRenderer = {
|
|
|
1030
1124
|
});
|
|
1031
1125
|
},
|
|
1032
1126
|
|
|
1127
|
+
describeCall(
|
|
1128
|
+
args: EditRenderArgs,
|
|
1129
|
+
options: RenderResultOptions & { renderContext?: EditRenderContext },
|
|
1130
|
+
): NativeToolView {
|
|
1131
|
+
const renderContext = options.renderContext;
|
|
1132
|
+
const { rawPath, rename, op, fileCount, applyPatchError } = resolveEditCallFacts(
|
|
1133
|
+
args,
|
|
1134
|
+
options.isPartial,
|
|
1135
|
+
renderContext?.editMode,
|
|
1136
|
+
);
|
|
1137
|
+
const body: NativeChild[] = [];
|
|
1138
|
+
let tool: NativeToolHead;
|
|
1139
|
+
const multi = renderContext?.perFileDiffPreview;
|
|
1140
|
+
if (multi && multi.length > 1 && multi.some(p => p.diff || p.error)) {
|
|
1141
|
+
let added = 0;
|
|
1142
|
+
let removed = 0;
|
|
1143
|
+
for (const preview of multi) {
|
|
1144
|
+
const stats = preview.diff ? getDiffStats(preview.diff) : undefined;
|
|
1145
|
+
added += stats?.added ?? 0;
|
|
1146
|
+
removed += stats?.removed ?? 0;
|
|
1147
|
+
body.push(
|
|
1148
|
+
fileDiffSection(
|
|
1149
|
+
{ path: preview.path, added: stats?.added, removed: stats?.removed },
|
|
1150
|
+
[preview.error ? errorText(preview.error) : editDiff(preview.diff ?? "", preview.path)],
|
|
1151
|
+
{ role: "omp.tool.edit.file", tone: preview.error ? "error" : undefined },
|
|
1152
|
+
),
|
|
1153
|
+
);
|
|
1154
|
+
}
|
|
1155
|
+
tool = editToolHead({ op, files: Math.max(fileCount, multi.length), added, removed });
|
|
1156
|
+
} else {
|
|
1157
|
+
let diffText: string | undefined;
|
|
1158
|
+
let firstChangedLine: number | undefined;
|
|
1159
|
+
if (args.previewDiff || (args.diff && args.op)) {
|
|
1160
|
+
diffText = args.previewDiff ?? args.diff ?? "";
|
|
1161
|
+
body.push(editDiff(diffText, rawPath));
|
|
1162
|
+
} else if (args.diff || args.newText || args.patch) {
|
|
1163
|
+
body.push(code(args.diff ?? args.newText ?? args.patch ?? "", { lang: getLanguageFromPath(rawPath) }));
|
|
1164
|
+
} else if (renderContext?.editDiffPreview) {
|
|
1165
|
+
const preview = renderContext.editDiffPreview;
|
|
1166
|
+
if ("error" in preview && preview.error) body.push(errorText(preview.error));
|
|
1167
|
+
else if (preview.diff) {
|
|
1168
|
+
diffText = preview.diff;
|
|
1169
|
+
firstChangedLine = preview.firstChangedLine;
|
|
1170
|
+
body.push(editDiff(preview.diff, rawPath));
|
|
1171
|
+
}
|
|
1172
|
+
}
|
|
1173
|
+
const stats = diffText ? getDiffStats(diffText) : undefined;
|
|
1174
|
+
tool = editToolHead({
|
|
1175
|
+
op,
|
|
1176
|
+
path: rawPath,
|
|
1177
|
+
files: fileCount,
|
|
1178
|
+
line: firstChangedLine,
|
|
1179
|
+
rename,
|
|
1180
|
+
added: stats?.added ?? 0,
|
|
1181
|
+
removed: stats?.removed ?? 0,
|
|
1182
|
+
});
|
|
1183
|
+
}
|
|
1184
|
+
if (applyPatchError) body.push(errorText(applyPatchError));
|
|
1185
|
+
return { tool, body, tone: applyPatchError ? "error" : undefined };
|
|
1186
|
+
},
|
|
1187
|
+
|
|
1188
|
+
describeResult(
|
|
1189
|
+
result: { content: Array<{ type: string; text?: string }>; details?: EditToolDetails; isError?: boolean },
|
|
1190
|
+
options: RenderResultOptions & { renderContext?: EditRenderContext },
|
|
1191
|
+
args?: EditRenderArgs,
|
|
1192
|
+
): NativeToolView {
|
|
1193
|
+
const edits = Array.isArray(args?.edits) ? args.edits : undefined;
|
|
1194
|
+
const perFileResults = result.details?.perFileResults;
|
|
1195
|
+
const totalFiles = edits ? countEditFiles(edits) : 0;
|
|
1196
|
+
if (perFileResults && (perFileResults.length > 1 || totalFiles > 1)) {
|
|
1197
|
+
const remaining = Math.max(0, totalFiles - perFileResults.length);
|
|
1198
|
+
let added = 0;
|
|
1199
|
+
let removed = 0;
|
|
1200
|
+
// Files are borderless sections inside the one tool frame.
|
|
1201
|
+
const body: NativeChild[] = perFileResults.map(fileResult => {
|
|
1202
|
+
const file = editFileParts({ content: [], details: fileResult, isError: fileResult.isError }, options);
|
|
1203
|
+
added += file.added;
|
|
1204
|
+
removed += file.removed;
|
|
1205
|
+
return fileDiffSection(file, file.body, {
|
|
1206
|
+
role: "omp.tool.edit.file",
|
|
1207
|
+
tone: file.isError ? "error" : undefined,
|
|
1208
|
+
});
|
|
1209
|
+
});
|
|
1210
|
+
if (remaining > 0) {
|
|
1211
|
+
body.push(
|
|
1212
|
+
node("spinner", {
|
|
1213
|
+
label: [span(`${remaining} more file${remaining > 1 ? "s" : ""} pending…`, "muted")],
|
|
1214
|
+
}),
|
|
1215
|
+
);
|
|
1216
|
+
}
|
|
1217
|
+
const failed = perFileResults.some(file => file.isError);
|
|
1218
|
+
return {
|
|
1219
|
+
tool: editToolHead({
|
|
1220
|
+
files: Math.max(totalFiles, perFileResults.length),
|
|
1221
|
+
added,
|
|
1222
|
+
removed,
|
|
1223
|
+
diagnostics: perFileResults.map(file => file.diagnostics),
|
|
1224
|
+
}),
|
|
1225
|
+
body,
|
|
1226
|
+
tone: failed ? "error" : undefined,
|
|
1227
|
+
};
|
|
1228
|
+
}
|
|
1229
|
+
const file = editFileParts(result, options, args);
|
|
1230
|
+
return {
|
|
1231
|
+
tool: editToolHead({ ...file, href: fileHref(file.resolvedPath), diagnostics: [file.fileDiagnostics] }),
|
|
1232
|
+
body: file.body,
|
|
1233
|
+
tone: file.isError ? "error" : undefined,
|
|
1234
|
+
};
|
|
1235
|
+
},
|
|
1236
|
+
|
|
1033
1237
|
renderResult(
|
|
1034
1238
|
result: { content: Array<{ type: string; text?: string }>; details?: EditToolDetails; isError?: boolean },
|
|
1035
1239
|
options: RenderResultOptions & { renderContext?: EditRenderContext },
|
|
@@ -1046,6 +1250,128 @@ export const editToolRenderer = {
|
|
|
1046
1250
|
},
|
|
1047
1251
|
} satisfies ToolRenderer<EditRenderArgs, EditToolDetails>;
|
|
1048
1252
|
|
|
1253
|
+
/** Facts behind a native edit head: one file (path, first changed line, rename) or a file count. */
|
|
1254
|
+
interface EditHeadFacts {
|
|
1255
|
+
op?: Operation;
|
|
1256
|
+
path?: string;
|
|
1257
|
+
/** Distinct files in the call; more than one heads the call as `N files`. */
|
|
1258
|
+
files?: number;
|
|
1259
|
+
line?: number;
|
|
1260
|
+
href?: string;
|
|
1261
|
+
rename?: string;
|
|
1262
|
+
added: number;
|
|
1263
|
+
removed: number;
|
|
1264
|
+
diagnostics?: readonly (FileDiagnosticsResult | undefined)[];
|
|
1265
|
+
}
|
|
1266
|
+
|
|
1267
|
+
/**
|
|
1268
|
+
* Native edit head (§7.3): `Edit · path:line · +8 −1 · → new/path` for one
|
|
1269
|
+
* file, `Edit · 3 files · +21 −4` for several; a diagnostics chip when LSP reported.
|
|
1270
|
+
*/
|
|
1271
|
+
function editToolHead(facts: EditHeadFacts): NativeToolHead {
|
|
1272
|
+
const multi = (facts.files ?? 0) > 1;
|
|
1273
|
+
const meta = compact([
|
|
1274
|
+
diffStatsMeta(facts.added, facts.removed),
|
|
1275
|
+
!multi && facts.rename ? `→ ${displayPath(facts.rename)}` : undefined,
|
|
1276
|
+
]);
|
|
1277
|
+
const badge = facts.diagnostics && diagnosticsBadge(facts.diagnostics);
|
|
1278
|
+
const target = multi
|
|
1279
|
+
? `${facts.files} files`
|
|
1280
|
+
: facts.path
|
|
1281
|
+
? `${displayPath(facts.path)}${facts.line ? `:${facts.line}` : ""}`
|
|
1282
|
+
: undefined;
|
|
1283
|
+
return {
|
|
1284
|
+
title: multi ? "Edit" : getOperationTitle(facts.op),
|
|
1285
|
+
target,
|
|
1286
|
+
targetKind: multi ? "text" : "path",
|
|
1287
|
+
href: multi ? undefined : facts.href,
|
|
1288
|
+
meta: meta.length > 0 ? meta : undefined,
|
|
1289
|
+
badges: badge ? [badge] : undefined,
|
|
1290
|
+
};
|
|
1291
|
+
}
|
|
1292
|
+
|
|
1293
|
+
/** A file's diff: hunks highlighted by the path's language, no path header (the head or section names the file). */
|
|
1294
|
+
function editDiff(diffText: string, filePath: string): NativeNode {
|
|
1295
|
+
return nativeDiff(diffText, { lang: filePath ? getLanguageFromPath(filePath) : undefined });
|
|
1296
|
+
}
|
|
1297
|
+
|
|
1298
|
+
/** One file's edit result for native views: head facts plus its body (diff or error, then diagnostics). */
|
|
1299
|
+
interface EditFileParts extends Omit<EditHeadFacts, "diagnostics"> {
|
|
1300
|
+
path: string;
|
|
1301
|
+
/** Absolute path the edit resolved to, when known. */
|
|
1302
|
+
resolvedPath?: string;
|
|
1303
|
+
isError: boolean;
|
|
1304
|
+
fileDiagnostics?: FileDiagnosticsResult;
|
|
1305
|
+
body: NativeChild[];
|
|
1306
|
+
}
|
|
1307
|
+
|
|
1308
|
+
function editFileParts(
|
|
1309
|
+
result: {
|
|
1310
|
+
content: Array<{ type: string; text?: string }>;
|
|
1311
|
+
details?: EditToolDetails | EditToolPerFileResult;
|
|
1312
|
+
isError?: boolean;
|
|
1313
|
+
},
|
|
1314
|
+
options: RenderResultOptions & { renderContext?: EditRenderContext },
|
|
1315
|
+
args?: EditRenderArgs,
|
|
1316
|
+
): EditFileParts {
|
|
1317
|
+
const details = result.details;
|
|
1318
|
+
const isError = result.isError ?? (details && "isError" in details ? details.isError : false) ?? false;
|
|
1319
|
+
const firstEdit = Array.isArray(args?.edits) ? args.edits[0] : undefined;
|
|
1320
|
+
const firstHashlineInputEntry = getHashlineInputRenderSummary(args ?? {}, options.renderContext?.editMode)
|
|
1321
|
+
?.entries[0];
|
|
1322
|
+
const moveSource =
|
|
1323
|
+
details && "sourcePath" in details && typeof details.sourcePath === "string" ? details.sourcePath : undefined;
|
|
1324
|
+
const detailPath = details && "path" in details && typeof details.path === "string" ? details.path : undefined;
|
|
1325
|
+
const rawPath =
|
|
1326
|
+
moveSource ??
|
|
1327
|
+
(typeof args?.file_path === "string"
|
|
1328
|
+
? args.file_path
|
|
1329
|
+
: typeof args?.path === "string"
|
|
1330
|
+
? args.path
|
|
1331
|
+
: (filePathFromEditEntry(firstEdit?.path) ?? detailPath ?? firstHashlineInputEntry?.path ?? ""));
|
|
1332
|
+
const op = args?.op || firstEdit?.op || details?.op;
|
|
1333
|
+
const rename =
|
|
1334
|
+
(typeof args?.rename === "string" ? args.rename : undefined) ??
|
|
1335
|
+
filePathFromEditEntry(firstEdit?.rename) ??
|
|
1336
|
+
filePathFromEditEntry(firstEdit?.move) ??
|
|
1337
|
+
(details && "move" in details && typeof details.move === "string" ? details.move : undefined);
|
|
1338
|
+
const editDiffPreview = details ? undefined : options.renderContext?.editDiffPreview;
|
|
1339
|
+
const previewDiff = editDiffPreview && !("error" in editDiffPreview) ? editDiffPreview.diff : undefined;
|
|
1340
|
+
const diffText = isError ? undefined : details?.diff || previewDiff;
|
|
1341
|
+
const firstChangedLine =
|
|
1342
|
+
(editDiffPreview && "firstChangedLine" in editDiffPreview ? editDiffPreview.firstChangedLine : undefined) ||
|
|
1343
|
+
(details && !isError ? details.firstChangedLine : undefined);
|
|
1344
|
+
const shownPath = displayPath(detailPath ?? rawPath);
|
|
1345
|
+
const body: NativeChild[] = [];
|
|
1346
|
+
if (isError) {
|
|
1347
|
+
const displayErrorText = details && "displayErrorText" in details ? details.displayErrorText : undefined;
|
|
1348
|
+
const message =
|
|
1349
|
+
displayErrorText || (details && "errorText" in details && details.errorText) || resultText(result);
|
|
1350
|
+
if (message) body.push(errorText(message));
|
|
1351
|
+
} else if (diffText) {
|
|
1352
|
+
body.push(editDiff(diffText, detailPath ?? rawPath));
|
|
1353
|
+
} else if (editDiffPreview && "error" in editDiffPreview) {
|
|
1354
|
+
body.push(errorText(editDiffPreview.error));
|
|
1355
|
+
} else if (details && op !== "delete" && op !== "create" && !rename) {
|
|
1356
|
+
body.push(noteText(`No changes were made${shownPath ? ` to ${shownPath}` : ""}.`));
|
|
1357
|
+
}
|
|
1358
|
+
const diagnostics = diagnosticsSection(details?.diagnostics);
|
|
1359
|
+
if (diagnostics) body.push(diagnostics);
|
|
1360
|
+
const stats = diffText ? getDiffStats(diffText) : undefined;
|
|
1361
|
+
return {
|
|
1362
|
+
op,
|
|
1363
|
+
path: rawPath,
|
|
1364
|
+
line: firstChangedLine,
|
|
1365
|
+
rename,
|
|
1366
|
+
resolvedPath: detailPath,
|
|
1367
|
+
added: stats?.added ?? 0,
|
|
1368
|
+
removed: stats?.removed ?? 0,
|
|
1369
|
+
isError: Boolean(isError),
|
|
1370
|
+
fileDiagnostics: details?.diagnostics,
|
|
1371
|
+
body,
|
|
1372
|
+
};
|
|
1373
|
+
}
|
|
1374
|
+
|
|
1049
1375
|
function renderSingleFileResult(
|
|
1050
1376
|
result: {
|
|
1051
1377
|
content: Array<{ type: string; text?: string }>;
|