@linxiraos/pi-tui 1.1.26 → 1.2.0
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 +51 -491
- package/README.md +13 -7
- package/dist/types/active-terminal.d.ts +30 -0
- package/dist/types/app-keybindings.d.ts +7 -2
- package/dist/types/apps/cleanse-board.d.ts +1 -1
- package/dist/types/apps/debug/log-viewer.d.ts +4 -0
- package/dist/types/apps/debug/raw-sse-buffer.d.ts +2 -0
- package/dist/types/apps/git/git-tui.d.ts +5 -4
- package/dist/types/apps/git/help.d.ts +3 -1
- package/dist/types/apps/if-bench-board.d.ts +2 -2
- package/dist/types/apps/setup-model-picker.d.ts +1 -1
- package/dist/types/autocomplete.d.ts +5 -2
- package/dist/types/charts/chart-plan.d.ts +674 -0
- package/dist/types/charts/chart-svg.d.ts +59 -0
- package/dist/types/charts/table-data.d.ts +175 -0
- package/dist/types/chat/assistant-message.d.ts +11 -1
- package/dist/types/chat/chat-transcript-builder.d.ts +3 -0
- package/dist/types/chat/compaction-summary-message.d.ts +1 -0
- package/dist/types/chat/execution-shared.d.ts +6 -5
- package/dist/types/chat/fence-figure.d.ts +42 -0
- package/dist/types/chat/figure-markdown.d.ts +42 -0
- package/dist/types/chat/messages.d.ts +1 -1
- package/dist/types/chat/svg-figure.d.ts +33 -0
- package/dist/types/chat/svg-source.d.ts +49 -0
- package/dist/types/chat/table-chart.d.ts +89 -0
- package/dist/types/chat/tool-execution.d.ts +2 -0
- package/dist/types/chat/user-message.d.ts +17 -4
- package/dist/types/chrome/shared.d.ts +9 -0
- package/dist/types/chrome/status-notice.d.ts +15 -3
- package/dist/types/chrome/transcript-container.d.ts +6 -0
- package/dist/types/components/box.d.ts +1 -0
- package/dist/types/components/disclosure.d.ts +1 -0
- package/dist/types/components/editor.d.ts +23 -5
- package/dist/types/components/form.d.ts +1 -0
- package/dist/types/components/image.d.ts +26 -44
- package/dist/types/components/input.d.ts +2 -1
- package/dist/types/components/key-value-list.d.ts +1 -0
- package/dist/types/components/layout/row.d.ts +1 -0
- package/dist/types/components/layout/stack.d.ts +1 -0
- package/dist/types/components/loader.d.ts +5 -6
- package/dist/types/components/markdown.d.ts +47 -5
- package/dist/types/components/scroll-view.d.ts +1 -0
- package/dist/types/components/section.d.ts +1 -0
- package/dist/types/components/table.d.ts +1 -0
- package/dist/types/components/text.d.ts +1 -0
- package/dist/types/components/tree-view.d.ts +7 -0
- package/dist/types/components/truncated-text.d.ts +1 -0
- package/dist/types/fuzzy.d.ts +29 -1
- package/dist/types/key-hint-format.d.ts +9 -1
- package/dist/types/keybinding-matchers.d.ts +3 -0
- package/dist/types/keybindings.d.ts +1 -1
- package/dist/types/kitty-graphics.d.ts +2 -2
- package/dist/types/loop-watchdog.d.ts +8 -7
- package/dist/types/multiplexers/cmux.d.ts +16 -0
- package/dist/types/multiplexers/herdr.d.ts +26 -0
- package/dist/types/multiplexers/notify.d.ts +13 -0
- package/dist/types/multiplexers/orca.d.ts +12 -0
- package/dist/types/multiplexers/screen.d.ts +9 -0
- package/dist/types/multiplexers/tmux.d.ts +29 -0
- package/dist/types/multiplexers/types.d.ts +100 -0
- package/dist/types/multiplexers/wmux.d.ts +12 -0
- package/dist/types/multiplexers/zellij.d.ts +12 -0
- package/dist/types/native/apply.d.ts +4 -3
- package/dist/types/native/backend.d.ts +5 -4
- package/dist/types/native/blobs.d.ts +7 -3
- package/dist/types/native/encode.d.ts +8 -6
- package/dist/types/native/node.d.ts +36 -5
- package/dist/types/native/overlay.d.ts +8 -3
- package/dist/types/native/settle.d.ts +4 -3
- package/dist/types/overlays/agent-hub-projection.d.ts +6 -5
- package/dist/types/overlays/agent-hub-types.d.ts +9 -0
- package/dist/types/overlays/agent-hub.d.ts +3 -0
- package/dist/types/overlays/agent-transcript-viewer.d.ts +12 -2
- package/dist/types/overlays/agents-hub.d.ts +9 -0
- package/dist/types/overlays/annotation-overlay.d.ts +19 -2
- package/dist/types/overlays/annotation-types.d.ts +2 -0
- package/dist/types/overlays/ask-dialog.d.ts +5 -2
- package/dist/types/overlays/btw-history-panel.d.ts +13 -1
- package/dist/types/overlays/copy-selector.d.ts +1 -0
- package/dist/types/overlays/history-search.d.ts +10 -0
- package/dist/types/overlays/hook-selector.d.ts +9 -4
- package/dist/types/overlays/hub-frame.d.ts +4 -1
- package/dist/types/overlays/jobs-panel.d.ts +1 -7
- package/dist/types/overlays/model-browser.d.ts +54 -7
- package/dist/types/overlays/model-hub.d.ts +37 -0
- package/dist/types/overlays/oauth-selector.d.ts +0 -1
- package/dist/types/overlays/plan-review-overlay.d.ts +3 -2
- package/dist/types/overlays/report-panel.d.ts +68 -0
- package/dist/types/overlays/rewind-selector.d.ts +1 -0
- package/dist/types/overlays/session-observer-registry.d.ts +2 -0
- package/dist/types/overlays/session-selector.d.ts +6 -2
- package/dist/types/overlays/settings-defs.d.ts +1 -0
- package/dist/types/overlays/thinking-selector.d.ts +2 -2
- package/dist/types/overlays/usage-dashboard.d.ts +12 -8
- package/dist/types/overlays/usage-display.d.ts +3 -1
- package/dist/types/prompt/composer-cache.d.ts +0 -16
- package/dist/types/prompt/composer.d.ts +18 -3
- package/dist/types/prompt/custom-editor.d.ts +25 -13
- package/dist/types/prompt/image-source.d.ts +2 -1
- package/dist/types/prompt/interactive-context-helpers.d.ts +5 -1
- package/dist/types/prompt/model-mention-autocomplete.d.ts +1 -1
- package/dist/types/prompt/welcome.d.ts +7 -2
- package/dist/types/render/composite.d.ts +2 -0
- package/dist/types/render/output-pane.d.ts +1 -0
- package/dist/types/render/render-utils.d.ts +1 -0
- package/dist/types/render/tool-card.d.ts +6 -0
- package/dist/types/render/width-aware-text.d.ts +2 -0
- package/dist/types/setup/scenes/types.d.ts +1 -0
- package/dist/types/space-hold.d.ts +40 -25
- package/dist/types/status-line/component.d.ts +3 -0
- package/dist/types/status-line/context-usage.d.ts +7 -5
- package/dist/types/status-line/host.d.ts +4 -1
- package/dist/types/status-line/segments.d.ts +2 -0
- package/dist/types/status-line/types.d.ts +14 -3
- package/dist/types/terminal-capabilities.d.ts +41 -36
- package/dist/types/terminal-multiplexer.d.ts +127 -14
- package/dist/types/terminal.d.ts +23 -16
- package/dist/types/theme/active-symbols.d.ts +1 -1
- package/dist/types/theme/schema.d.ts +11 -2
- package/dist/types/theme/symbols.d.ts +1 -1
- package/dist/types/theme/theme-class.d.ts +7 -0
- package/dist/types/theme/theme.d.ts +1 -1
- package/dist/types/theme/tui-adapters.d.ts +3 -0
- package/dist/types/thinking.d.ts +1 -1
- package/dist/types/tmux.d.ts +11 -4
- package/dist/types/tools/bash.d.ts +7 -2
- package/dist/types/tools/daemon.d.ts +1 -1
- package/dist/types/tools/eval.d.ts +22 -3
- package/dist/types/tools/glob.d.ts +4 -0
- package/dist/types/tools/native-view.d.ts +47 -0
- package/dist/types/tools/output-meta.d.ts +11 -1
- package/dist/types/tools/renderer.d.ts +37 -2
- package/dist/types/tools/streaming-output.d.ts +20 -1
- package/dist/types/tools/task.d.ts +2 -3
- package/dist/types/tools/write.d.ts +9 -2
- package/dist/types/tools/yield.d.ts +22 -0
- package/dist/types/tui.d.ts +36 -0
- package/dist/types/utils.d.ts +6 -0
- package/dist/types/vim.d.ts +19 -5
- package/dist/types/windows-input-mode.d.ts +33 -1
- package/package.json +13 -9
- package/src/active-terminal.d.ts +30 -0
- package/src/active-terminal.ts +80 -0
- package/src/app-keybindings.d.ts +7 -2
- package/src/app-keybindings.ts +7 -2
- package/src/apps/autoresearch-dashboard.ts +7 -3
- package/src/apps/cleanse-board.ts +2 -2
- package/src/apps/cleanse-picker.ts +1 -1
- package/src/apps/debug/log-viewer.ts +188 -72
- package/src/apps/debug/raw-sse-buffer.ts +8 -0
- package/src/apps/debug/raw-sse.ts +39 -5
- package/src/apps/git/diff-pane.ts +96 -23
- package/src/apps/git/git-tui.ts +23 -16
- package/src/apps/git/help.ts +29 -20
- package/src/apps/git/sidebar.ts +8 -3
- package/src/apps/if-bench-board.ts +2 -2
- package/src/apps/ps-top.ts +2 -2
- package/src/apps/setup-model-picker.ts +1 -1
- package/src/autocomplete.d.ts +5 -2
- package/src/autocomplete.ts +67 -43
- package/src/bracketed-paste.ts +10 -3
- package/src/charts/chart-plan.d.ts +674 -0
- package/src/charts/chart-plan.ts +5081 -0
- package/src/charts/chart-svg.d.ts +59 -0
- package/src/charts/chart-svg.ts +4657 -0
- package/src/charts/table-data.d.ts +175 -0
- package/src/charts/table-data.ts +1478 -0
- package/src/chat/advisor-message.ts +11 -0
- package/src/chat/assistant-message.d.ts +11 -1
- package/src/chat/assistant-message.ts +245 -54
- package/src/chat/chat-transcript-builder.d.ts +3 -0
- package/src/chat/chat-transcript-builder.ts +9 -3
- package/src/chat/compaction-summary-message.d.ts +1 -0
- package/src/chat/compaction-summary-message.ts +8 -0
- package/src/chat/execution-shared.d.ts +6 -5
- package/src/chat/execution-shared.ts +42 -25
- package/src/chat/fence-figure.d.ts +42 -0
- package/src/chat/fence-figure.ts +80 -0
- package/src/chat/figure-markdown.d.ts +42 -0
- package/src/chat/figure-markdown.ts +174 -0
- package/src/chat/messages.d.ts +1 -1
- package/src/chat/messages.ts +1 -1
- package/src/chat/read-tool-group.ts +6 -4
- package/src/chat/skill-message.ts +6 -0
- package/src/chat/svg-figure.d.ts +33 -0
- package/src/chat/svg-figure.ts +399 -0
- package/src/chat/svg-source.d.ts +49 -0
- package/src/chat/svg-source.ts +188 -0
- package/src/chat/table-chart.d.ts +89 -0
- package/src/chat/table-chart.ts +294 -0
- package/src/chat/tool-execution.d.ts +2 -0
- package/src/chat/tool-execution.ts +86 -7
- package/src/chat/user-message.d.ts +17 -4
- package/src/chat/user-message.ts +71 -8
- package/src/chrome/shared.ts +53 -0
- package/src/chrome/status-notice.ts +25 -7
- package/src/chrome/transcript-container.d.ts +6 -0
- package/src/chrome/transcript-container.ts +162 -19
- package/src/components/box.d.ts +1 -0
- package/src/components/box.ts +5 -0
- package/src/components/disclosure.d.ts +1 -0
- package/src/components/disclosure.ts +8 -0
- package/src/components/editor.d.ts +23 -5
- package/src/components/editor.ts +316 -47
- package/src/components/form.d.ts +1 -0
- package/src/components/form.ts +8 -0
- package/src/components/image.d.ts +26 -44
- package/src/components/image.ts +115 -152
- package/src/components/input.d.ts +2 -1
- package/src/components/input.ts +17 -7
- package/src/components/key-value-list.d.ts +1 -0
- package/src/components/key-value-list.ts +4 -0
- package/src/components/layout/row.d.ts +1 -0
- package/src/components/layout/row.ts +7 -0
- package/src/components/layout/stack.d.ts +1 -0
- package/src/components/layout/stack.ts +7 -0
- package/src/components/loader.d.ts +5 -6
- package/src/components/loader.ts +10 -17
- package/src/components/markdown.d.ts +47 -5
- package/src/components/markdown.ts +786 -303
- package/src/components/scroll-view.d.ts +1 -0
- package/src/components/scroll-view.ts +5 -0
- package/src/components/section.d.ts +1 -0
- package/src/components/section.ts +5 -0
- package/src/components/settings-list.ts +2 -0
- package/src/components/table.d.ts +1 -0
- package/src/components/table.ts +4 -0
- package/src/components/text.d.ts +1 -0
- package/src/components/text.ts +7 -0
- package/src/components/tree-view.d.ts +7 -0
- package/src/components/tree-view.ts +38 -8
- package/src/components/truncated-text.d.ts +1 -0
- package/src/components/truncated-text.ts +5 -0
- package/src/desktop-notify.ts +3 -2
- package/src/fuzzy.d.ts +29 -1
- package/src/fuzzy.ts +115 -30
- package/src/hotkeys-markdown.ts +9 -2
- package/src/key-hint-format.d.ts +9 -1
- package/src/key-hint-format.ts +26 -11
- package/src/keybinding-matchers.d.ts +3 -0
- package/src/keybinding-matchers.ts +6 -2
- package/src/keybindings.d.ts +1 -1
- package/src/keybindings.ts +1 -1
- package/src/kitty-graphics.d.ts +2 -2
- package/src/kitty-graphics.ts +11 -5
- package/src/loop-watchdog.d.ts +8 -7
- package/src/loop-watchdog.ts +18 -13
- package/src/multiplexers/cmux.d.ts +16 -0
- package/src/multiplexers/cmux.ts +29 -0
- package/src/multiplexers/herdr.d.ts +26 -0
- package/src/multiplexers/herdr.ts +64 -0
- package/src/multiplexers/notify.d.ts +13 -0
- package/src/multiplexers/notify.ts +24 -0
- package/src/multiplexers/orca.d.ts +12 -0
- package/src/multiplexers/orca.ts +16 -0
- package/src/multiplexers/screen.d.ts +9 -0
- package/src/multiplexers/screen.ts +15 -0
- package/src/multiplexers/tmux.d.ts +29 -0
- package/src/multiplexers/tmux.ts +40 -0
- package/src/multiplexers/types.d.ts +100 -0
- package/src/multiplexers/types.ts +110 -0
- package/src/multiplexers/wmux.d.ts +12 -0
- package/src/multiplexers/wmux.ts +16 -0
- package/src/multiplexers/zellij.d.ts +12 -0
- package/src/multiplexers/zellij.ts +24 -0
- package/src/native/apply.d.ts +4 -3
- package/src/native/apply.ts +4 -3
- package/src/native/backend.d.ts +5 -4
- package/src/native/backend.ts +199 -22
- package/src/native/blobs.d.ts +7 -3
- package/src/native/blobs.ts +47 -12
- package/src/native/encode.d.ts +8 -6
- package/src/native/encode.ts +76 -34
- package/src/native/node.d.ts +36 -5
- package/src/native/node.ts +31 -5
- package/src/native/overlay.d.ts +8 -3
- package/src/native/overlay.ts +17 -4
- package/src/native/reconcile.ts +16 -4
- package/src/native/settle.d.ts +4 -3
- package/src/native/settle.ts +4 -3
- package/src/overlays/agent-hub-projection.d.ts +6 -5
- package/src/overlays/agent-hub-projection.ts +124 -13
- package/src/overlays/agent-hub-types.d.ts +9 -0
- package/src/overlays/agent-hub-types.ts +6 -0
- package/src/overlays/agent-hub.ts +48 -29
- package/src/overlays/agent-transcript-viewer.ts +93 -23
- package/src/overlays/agents-hub.ts +28 -8
- package/src/overlays/annotation-overlay.ts +293 -90
- package/src/overlays/annotation-types.ts +2 -0
- package/src/overlays/ask-dialog.ts +10 -17
- package/src/overlays/btw-history-panel.ts +136 -39
- package/src/overlays/copy-selector.d.ts +1 -0
- package/src/overlays/copy-selector.ts +32 -8
- package/src/overlays/extensions/extension-dashboard.ts +4 -4
- package/src/overlays/extensions/state-manager.ts +52 -12
- package/src/overlays/history-search.ts +100 -7
- package/src/overlays/hook-selector.ts +12 -5
- package/src/overlays/hub-frame.ts +19 -1
- package/src/overlays/jobs-panel.ts +33 -52
- package/src/overlays/model-browser.ts +367 -122
- package/src/overlays/model-hub.ts +435 -59
- package/src/overlays/move-overlay.ts +28 -14
- package/src/overlays/oauth-selector.ts +54 -70
- package/src/overlays/pause-screen.ts +2 -2
- package/src/overlays/plan-review-overlay.ts +208 -70
- package/src/overlays/plugin-settings.ts +3 -3
- package/src/overlays/report-panel.ts +191 -0
- package/src/overlays/rewind-selector.ts +88 -17
- package/src/overlays/session-observer-registry.d.ts +2 -0
- package/src/overlays/session-observer-registry.ts +10 -2
- package/src/overlays/session-selector.ts +64 -26
- package/src/overlays/settings-defs.ts +5 -4
- package/src/overlays/settings-selector.ts +33 -8
- package/src/overlays/snapcompact-shape-preview.ts +2 -3
- package/src/overlays/stats-notice.ts +1 -1
- package/src/overlays/thinking-selector.ts +11 -10
- package/src/overlays/tree-selector.ts +41 -20
- package/src/overlays/usage-dashboard.ts +117 -58
- package/src/overlays/usage-display.ts +10 -4
- package/src/overlays/usage-row.ts +22 -8
- package/src/prompt/attachment-chips.ts +15 -11
- package/src/prompt/composer-attachments.ts +6 -4
- package/src/prompt/composer-cache.ts +7 -86
- package/src/prompt/composer.ts +37 -26
- package/src/prompt/custom-editor.ts +282 -105
- package/src/prompt/image-source.ts +2 -1
- package/src/prompt/interactive-context-helpers.ts +32 -18
- package/src/prompt/macos-spelling.ts +7 -0
- package/src/prompt/magic-keywords.ts +11 -2
- package/src/prompt/model-mention-autocomplete.ts +14 -14
- package/src/prompt/queued-messages.ts +6 -4
- package/src/prompt/tips.txt +13 -9
- package/src/prompt/welcome.ts +64 -46
- package/src/prompt/word-completion.ts +38 -5
- package/src/render/composite.d.ts +2 -0
- package/src/render/composite.ts +64 -0
- package/src/render/output-pane.d.ts +1 -0
- package/src/render/output-pane.ts +6 -0
- package/src/render/render-utils.d.ts +1 -0
- package/src/render/render-utils.ts +16 -1
- package/src/render/tool-card.d.ts +6 -0
- package/src/render/tool-card.ts +15 -0
- package/src/render/width-aware-text.d.ts +2 -0
- package/src/render/width-aware-text.ts +5 -0
- package/src/setup/scenes/model.ts +2 -1
- package/src/setup/scenes/types.ts +1 -0
- package/src/space-hold.d.ts +40 -25
- package/src/space-hold.ts +156 -52
- package/src/status-line/component.ts +292 -78
- package/src/status-line/context-usage.ts +21 -46
- package/src/status-line/host.ts +4 -1
- package/src/status-line/segments.ts +40 -22
- package/src/status-line/types.ts +15 -3
- package/src/terminal-capabilities.d.ts +41 -36
- package/src/terminal-capabilities.ts +137 -213
- package/src/terminal-multiplexer.d.ts +127 -14
- package/src/terminal-multiplexer.ts +112 -33
- package/src/terminal.d.ts +23 -16
- package/src/terminal.ts +203 -99
- package/src/theme/active-symbols.d.ts +1 -1
- package/src/theme/active-symbols.ts +1 -1
- package/src/theme/schema-validation.ts +1 -0
- package/src/theme/schema.d.ts +11 -2
- package/src/theme/schema.ts +14 -1
- package/src/theme/session-color.ts +1 -7
- package/src/theme/symbols.d.ts +1 -1
- package/src/theme/symbols.ts +11 -4
- package/src/theme/theme-class.d.ts +7 -0
- package/src/theme/theme-class.ts +26 -1
- package/src/theme/theme-schema.json +5 -1
- package/src/theme/theme.d.ts +1 -1
- package/src/theme/theme.ts +8 -4
- package/src/theme/tui-adapters.d.ts +3 -0
- package/src/theme/tui-adapters.ts +68 -0
- package/src/thinking.d.ts +1 -1
- package/src/thinking.ts +1 -1
- package/src/tmux.d.ts +11 -4
- package/src/tmux.ts +47 -11
- package/src/tools/ast-edit.ts +59 -35
- package/src/tools/ast-grep.ts +35 -16
- package/src/tools/bash.d.ts +7 -2
- package/src/tools/bash.ts +116 -47
- package/src/tools/daemon.d.ts +1 -1
- package/src/tools/daemon.ts +1 -1
- package/src/tools/default-renderer.ts +35 -19
- package/src/tools/edit.ts +142 -120
- package/src/tools/eval-format/index.ts +28 -2
- package/src/tools/eval-format/javascript.ts +7 -5
- package/src/tools/eval.d.ts +22 -3
- package/src/tools/eval.ts +364 -208
- package/src/tools/fetch.ts +5 -6
- package/src/tools/glob.d.ts +4 -0
- package/src/tools/glob.ts +33 -65
- package/src/tools/grep.ts +81 -48
- package/src/tools/index.ts +2 -0
- package/src/tools/lsp.ts +81 -59
- package/src/tools/mcp.ts +111 -68
- package/src/tools/native-view.d.ts +47 -0
- package/src/tools/native-view.ts +102 -1
- package/src/tools/output-meta.d.ts +11 -1
- package/src/tools/output-meta.ts +23 -3
- package/src/tools/read.ts +7 -5
- package/src/tools/renderer.d.ts +37 -2
- package/src/tools/renderer.ts +42 -2
- package/src/tools/streaming-output.d.ts +20 -1
- package/src/tools/streaming-output.ts +154 -50
- package/src/tools/task.d.ts +2 -3
- package/src/tools/task.ts +115 -62
- package/src/tools/todo.ts +119 -30
- package/src/tools/wait.ts +34 -24
- package/src/tools/web-search.ts +1 -1
- package/src/tools/write.d.ts +9 -2
- package/src/tools/write.ts +147 -95
- package/src/tools/yield.d.ts +22 -0
- package/src/tools/yield.ts +225 -0
- package/src/tui.d.ts +36 -0
- package/src/tui.ts +666 -217
- package/src/utils.d.ts +6 -0
- package/src/utils.ts +19 -0
- package/src/vim.d.ts +19 -5
- package/src/vim.ts +333 -18
- package/src/windows-input-mode.d.ts +33 -1
- package/src/windows-input-mode.ts +212 -6
package/src/autocomplete.ts
CHANGED
|
@@ -263,8 +263,11 @@ export interface AutocompleteProvider {
|
|
|
263
263
|
|
|
264
264
|
/** Get inline hint text to show as dim ghost text after the cursor */
|
|
265
265
|
getInlineHint?(lines: string[], cursorLine: number, cursorCol: number): string | null;
|
|
266
|
-
/**
|
|
267
|
-
|
|
266
|
+
/**
|
|
267
|
+
* Synchronously list slash command-name completions for a leading slash token (no async I/O).
|
|
268
|
+
* Mirrors the command-name branch of {@link getSuggestions}, including the bare `/` listing and
|
|
269
|
+
* the collapsed `/skill:` namespace row. Returns null outside a command-name token or with no match.
|
|
270
|
+
*/
|
|
268
271
|
trySyncSlashCompletion?(textBeforeCursor: string): { items: AutocompleteItem[]; prefix: string } | null;
|
|
269
272
|
/**
|
|
270
273
|
* Synchronously try to expand text immediately before the cursor (no async I/O).
|
|
@@ -589,6 +592,22 @@ function buildMidPromptSkillCompletions(commands: CommandEntry[], lowerPrefix: s
|
|
|
589
592
|
);
|
|
590
593
|
}
|
|
591
594
|
|
|
595
|
+
const DIR_CACHE_MAX = 100;
|
|
596
|
+
const DIR_CACHE_EVICT = 50;
|
|
597
|
+
|
|
598
|
+
/**
|
|
599
|
+
* Drops the `count` oldest entries once `map` exceeds `max`. Callers delete a
|
|
600
|
+
* key before re-setting it, so Map insertion order is refresh order.
|
|
601
|
+
*/
|
|
602
|
+
function evictOldest(map: Map<string, unknown>, max: number, count: number): void {
|
|
603
|
+
if (map.size <= max) return;
|
|
604
|
+
let remaining = count;
|
|
605
|
+
for (const key of map.keys()) {
|
|
606
|
+
if (remaining-- === 0) break;
|
|
607
|
+
map.delete(key);
|
|
608
|
+
}
|
|
609
|
+
}
|
|
610
|
+
|
|
592
611
|
// Combined provider that handles both slash commands and file paths.
|
|
593
612
|
export class CombinedAutocompleteProvider implements AutocompleteProvider {
|
|
594
613
|
#commands: CommandEntry[];
|
|
@@ -598,6 +617,9 @@ export class CombinedAutocompleteProvider implements AutocompleteProvider {
|
|
|
598
617
|
// per-directory readdir fast-path for prefix completions. Global fuzzy
|
|
599
618
|
// discovery continues to use native fuzzyFind + shared scan cache.
|
|
600
619
|
#dirCache: Map<string, { entries: fs.Dirent[]; timestamp: number }> = new Map();
|
|
620
|
+
// Whether a scoped fuzzy query's base (`src/` in `@src/foo`) is a directory;
|
|
621
|
+
// stat'ing it on every keystroke is redundant while the base is unchanged.
|
|
622
|
+
#scopedBaseCache: Map<string, { isDirectory: boolean; timestamp: number }> = new Map();
|
|
601
623
|
readonly #DIR_CACHE_TTL = 2000; // 2 seconds
|
|
602
624
|
|
|
603
625
|
constructor(
|
|
@@ -806,7 +828,7 @@ export class CombinedAutocompleteProvider implements AutocompleteProvider {
|
|
|
806
828
|
};
|
|
807
829
|
}
|
|
808
830
|
|
|
809
|
-
// Slash command suggestions can be accepted before
|
|
831
|
+
// Slash command suggestions can be accepted before an async refresh
|
|
810
832
|
// catches up to newly typed characters. Replace the live command token,
|
|
811
833
|
// not only the prefix captured when the suggestion list was rendered.
|
|
812
834
|
// Absolute-path completions share the leading-slash prefix shape but
|
|
@@ -976,11 +998,21 @@ export class CombinedAutocompleteProvider implements AutocompleteProvider {
|
|
|
976
998
|
baseDir = path.join(this.#basePath, displayBase);
|
|
977
999
|
}
|
|
978
1000
|
|
|
979
|
-
|
|
980
|
-
|
|
981
|
-
|
|
1001
|
+
const now = Date.now();
|
|
1002
|
+
let cachedBase = this.#scopedBaseCache.get(baseDir);
|
|
1003
|
+
if (!cachedBase || now - cachedBase.timestamp >= this.#DIR_CACHE_TTL) {
|
|
1004
|
+
let isDirectory = false;
|
|
1005
|
+
try {
|
|
1006
|
+
isDirectory = (await fs.promises.stat(baseDir)).isDirectory();
|
|
1007
|
+
} catch {
|
|
1008
|
+
// Missing or inaccessible base: not a scope.
|
|
982
1009
|
}
|
|
983
|
-
|
|
1010
|
+
cachedBase = { isDirectory, timestamp: now };
|
|
1011
|
+
this.#scopedBaseCache.delete(baseDir);
|
|
1012
|
+
this.#scopedBaseCache.set(baseDir, cachedBase);
|
|
1013
|
+
evictOldest(this.#scopedBaseCache, DIR_CACHE_MAX, DIR_CACHE_EVICT);
|
|
1014
|
+
}
|
|
1015
|
+
if (!cachedBase.isDirectory) {
|
|
984
1016
|
return null;
|
|
985
1017
|
}
|
|
986
1018
|
|
|
@@ -1003,17 +1035,9 @@ export class CombinedAutocompleteProvider implements AutocompleteProvider {
|
|
|
1003
1035
|
}
|
|
1004
1036
|
|
|
1005
1037
|
const entries = await fs.promises.readdir(searchDir, { withFileTypes: true });
|
|
1038
|
+
this.#dirCache.delete(searchDir);
|
|
1006
1039
|
this.#dirCache.set(searchDir, { entries, timestamp: now });
|
|
1007
|
-
|
|
1008
|
-
if (this.#dirCache.size > 100) {
|
|
1009
|
-
const sortedKeys = [...this.#dirCache.entries()]
|
|
1010
|
-
.sort((a, b) => a[1].timestamp - b[1].timestamp)
|
|
1011
|
-
.slice(0, 50)
|
|
1012
|
-
.map(([key]) => key);
|
|
1013
|
-
for (const key of sortedKeys) {
|
|
1014
|
-
this.#dirCache.delete(key);
|
|
1015
|
-
}
|
|
1016
|
-
}
|
|
1040
|
+
evictOldest(this.#dirCache, DIR_CACHE_MAX, DIR_CACHE_EVICT);
|
|
1017
1041
|
|
|
1018
1042
|
return entries;
|
|
1019
1043
|
}
|
|
@@ -1021,8 +1045,10 @@ export class CombinedAutocompleteProvider implements AutocompleteProvider {
|
|
|
1021
1045
|
invalidateDirCache(dir?: string): void {
|
|
1022
1046
|
if (dir) {
|
|
1023
1047
|
this.#dirCache.delete(dir);
|
|
1048
|
+
this.#scopedBaseCache.delete(dir);
|
|
1024
1049
|
} else {
|
|
1025
1050
|
this.#dirCache.clear();
|
|
1051
|
+
this.#scopedBaseCache.clear();
|
|
1026
1052
|
}
|
|
1027
1053
|
}
|
|
1028
1054
|
|
|
@@ -1087,26 +1113,29 @@ export class CombinedAutocompleteProvider implements AutocompleteProvider {
|
|
|
1087
1113
|
const entries = await this.#getCachedDirEntries(searchDir);
|
|
1088
1114
|
const suggestions: AutocompleteItem[] = [];
|
|
1089
1115
|
|
|
1090
|
-
|
|
1091
|
-
|
|
1092
|
-
|
|
1093
|
-
|
|
1094
|
-
|
|
1095
|
-
|
|
1096
|
-
|
|
1097
|
-
|
|
1116
|
+
const lowerSearchPrefix = searchPrefix.toLowerCase();
|
|
1117
|
+
// Skip .git directory
|
|
1118
|
+
const matched = entries.filter(
|
|
1119
|
+
entry => entry.name !== ".git" && entry.name.toLowerCase().startsWith(lowerSearchPrefix),
|
|
1120
|
+
);
|
|
1121
|
+
// Directory flag per match; symlinks are stat'ed concurrently to learn whether
|
|
1122
|
+
// they point at a directory. `null` drops a broken symlink, a file deleted
|
|
1123
|
+
// between readdir and stat, or a permission error.
|
|
1124
|
+
const directoryFlags = await Promise.all(
|
|
1125
|
+
matched.map(entry =>
|
|
1126
|
+
!entry.isDirectory() && entry.isSymbolicLink()
|
|
1127
|
+
? fs.promises.stat(path.join(searchDir, entry.name)).then(
|
|
1128
|
+
stats => stats.isDirectory(),
|
|
1129
|
+
() => null,
|
|
1130
|
+
)
|
|
1131
|
+
: entry.isDirectory(),
|
|
1132
|
+
),
|
|
1133
|
+
);
|
|
1098
1134
|
|
|
1099
|
-
|
|
1100
|
-
|
|
1101
|
-
if (
|
|
1102
|
-
|
|
1103
|
-
const fullPath = path.join(searchDir, entry.name);
|
|
1104
|
-
isDirectory = (await fs.promises.stat(fullPath)).isDirectory();
|
|
1105
|
-
} catch {
|
|
1106
|
-
// Broken symlink, file deleted between readdir and stat, or permission error
|
|
1107
|
-
continue;
|
|
1108
|
-
}
|
|
1109
|
-
}
|
|
1135
|
+
for (let index = 0; index < matched.length; index++) {
|
|
1136
|
+
const isDirectory = directoryFlags[index];
|
|
1137
|
+
if (typeof isDirectory !== "boolean") continue;
|
|
1138
|
+
const entry = matched[index]!;
|
|
1110
1139
|
|
|
1111
1140
|
let relativePath: string;
|
|
1112
1141
|
const name = entry.name;
|
|
@@ -1300,19 +1329,14 @@ export class CombinedAutocompleteProvider implements AutocompleteProvider {
|
|
|
1300
1329
|
const slashStart = findLeadingSlashCommandStart(textBeforeCursor);
|
|
1301
1330
|
if (slashStart === null) return null;
|
|
1302
1331
|
const commandText = textBeforeCursor.slice(slashStart);
|
|
1303
|
-
if (commandText.length <= 1) return null; // Bare "/" alone, don't auto-complete
|
|
1304
1332
|
if (commandText.includes(" ")) return null; // Only complete command name, not args
|
|
1305
1333
|
|
|
1306
|
-
const
|
|
1307
|
-
const lowerPrefix = prefix.toLowerCase();
|
|
1308
|
-
|
|
1309
|
-
// The `/skill:` namespace row is excluded here: the sync path submits
|
|
1310
|
-
// immediately after applying, and the bare namespace is not a command.
|
|
1334
|
+
const lowerPrefix = commandText.slice(1).toLowerCase();
|
|
1311
1335
|
const matches = buildSlashCommandCompletions(
|
|
1312
1336
|
collapseSkillNamespace(this.#commands, lowerPrefix),
|
|
1313
1337
|
lowerPrefix,
|
|
1314
1338
|
this.#commandUsage,
|
|
1315
|
-
)
|
|
1339
|
+
);
|
|
1316
1340
|
|
|
1317
1341
|
if (matches.length === 0) return null;
|
|
1318
1342
|
// Mirror `getSuggestions`: preserve leading whitespace so the editor's
|
package/src/bracketed-paste.ts
CHANGED
|
@@ -85,10 +85,17 @@ export class BracketedPasteHandler {
|
|
|
85
85
|
* buffer); omitted when still buffering.
|
|
86
86
|
*/
|
|
87
87
|
process(data: string): PasteResult {
|
|
88
|
-
|
|
88
|
+
const start = data.indexOf(PASTE_START);
|
|
89
|
+
const end = data.indexOf(PASTE_END);
|
|
90
|
+
if (start !== -1 && (end === -1 || start < end)) {
|
|
91
|
+
if (!this.#active) this.#buffer = "";
|
|
89
92
|
this.#active = true;
|
|
90
|
-
this
|
|
91
|
-
|
|
93
|
+
// Only strip nested starts before this paste's first end. Later starts
|
|
94
|
+
// belong to the next paste in `remaining`.
|
|
95
|
+
data =
|
|
96
|
+
end === -1
|
|
97
|
+
? data.replaceAll(PASTE_START, "")
|
|
98
|
+
: data.slice(0, end).replaceAll(PASTE_START, "") + data.slice(end);
|
|
92
99
|
}
|
|
93
100
|
|
|
94
101
|
if (!this.#active) return { handled: false };
|