@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
|
@@ -165,6 +165,9 @@ export const COMPOSER_TOKEN_REGEX = new RegExp(
|
|
|
165
165
|
"gu",
|
|
166
166
|
);
|
|
167
167
|
|
|
168
|
+
/** Last compiled {@link referencedAttachments} scanner, keyed by its source (labels and glyphs rarely change). */
|
|
169
|
+
let cachedScanner: { source: string; scanner: RegExp } | undefined;
|
|
170
|
+
|
|
168
171
|
/**
|
|
169
172
|
* Attachment indices referenced by a composer buffer, per kind. Image/video count compact chips
|
|
170
173
|
* and expanded markers; paste counts compact chips only, since `[Paste #N]` markers number the
|
|
@@ -182,10 +185,9 @@ export function referencedAttachments(
|
|
|
182
185
|
const icons = [...kindByIcon.keys()].sort((a, b) => b.length - a.length).map(glyphSource);
|
|
183
186
|
const labels = [...recorded.keys()].sort((a, b) => b.length - a.length).map(label => RegExp.escape(label));
|
|
184
187
|
const recordedSource = labels.length > 0 ? labels.join("|") : "(?!)";
|
|
185
|
-
const
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
);
|
|
188
|
+
const source = `${PLACEHOLDER_REGEX.source}|(${recordedSource})(?!\\d)|(${icons.join("|")}) #([1-9]\\d*)`;
|
|
189
|
+
if (cachedScanner?.source !== source) cachedScanner = { source, scanner: new RegExp(source, "gu") };
|
|
190
|
+
const { scanner } = cachedScanner;
|
|
189
191
|
|
|
190
192
|
const refs: Record<ChipKind, Set<number>> = { image: new Set(), video: new Set(), paste: new Set() };
|
|
191
193
|
for (const match of text.matchAll(scanner)) {
|
|
@@ -35,7 +35,6 @@ import { isWordCompletionMethod } from "./word-completion";
|
|
|
35
35
|
const FORMAT_VERSION = 1;
|
|
36
36
|
/** Project key of rows that serve every project lacking its own. */
|
|
37
37
|
const ANY_PROJECT = "";
|
|
38
|
-
const RECENT_SESSION_LIMIT = 4;
|
|
39
38
|
|
|
40
39
|
const SCHEMA = `
|
|
41
40
|
PRAGMA journal_mode=WAL;
|
|
@@ -48,9 +47,8 @@ CREATE TABLE IF NOT EXISTS entries (
|
|
|
48
47
|
) WITHOUT ROWID;
|
|
49
48
|
`;
|
|
50
49
|
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
type SharedEntryKind = "ui" | "welcome" | "status";
|
|
50
|
+
/** Every kind is mirrored under {@link ANY_PROJECT} as the fallback for projects without their own row. */
|
|
51
|
+
type EntryKind = "ui" | "status";
|
|
54
52
|
|
|
55
53
|
/** Theme inputs cached from the last resolved settings load for stable prepaint colors. */
|
|
56
54
|
export interface ComposerThemePreferences {
|
|
@@ -60,20 +58,10 @@ export interface ComposerThemePreferences {
|
|
|
60
58
|
readonly lightTheme?: string;
|
|
61
59
|
}
|
|
62
60
|
|
|
63
|
-
/** Last authoritative model labels shown in the welcome component. */
|
|
64
|
-
export interface ComposerWelcomeCache {
|
|
65
|
-
readonly modelName: string;
|
|
66
|
-
readonly providerName: string;
|
|
67
|
-
}
|
|
68
|
-
|
|
69
61
|
/** Speculative composer state read before the settings/session graph is available. */
|
|
70
62
|
export interface ComposerStartupCache {
|
|
71
63
|
readonly preferences?: ComposerPreferences;
|
|
72
64
|
readonly theme?: ComposerThemePreferences;
|
|
73
|
-
readonly welcome?: ComposerWelcomeCache;
|
|
74
|
-
readonly recentSessions: RecentSession[];
|
|
75
|
-
/** `null` when the last run had LSP disabled. */
|
|
76
|
-
readonly lspServers: LspServerInfo[] | null;
|
|
77
65
|
readonly status?: ComposerStatusCache;
|
|
78
66
|
}
|
|
79
67
|
|
|
@@ -86,44 +74,6 @@ function parseJson(value: string | undefined): unknown {
|
|
|
86
74
|
}
|
|
87
75
|
}
|
|
88
76
|
|
|
89
|
-
function parseRecentSessions(value: unknown): RecentSession[] {
|
|
90
|
-
if (!Array.isArray(value)) return [];
|
|
91
|
-
const sessions: RecentSession[] = [];
|
|
92
|
-
for (const item of value) {
|
|
93
|
-
if (!isRecord(item)) continue;
|
|
94
|
-
const { name, timeAgo } = item;
|
|
95
|
-
if (typeof name === "string" && typeof timeAgo === "string") sessions.push({ name, timeAgo });
|
|
96
|
-
if (sessions.length === RECENT_SESSION_LIMIT) break;
|
|
97
|
-
}
|
|
98
|
-
return sessions;
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
function parseLspServers(value: unknown): LspServerInfo[] | null {
|
|
102
|
-
if (value === null) return null;
|
|
103
|
-
if (!Array.isArray(value)) return [];
|
|
104
|
-
const servers: LspServerInfo[] = [];
|
|
105
|
-
for (const item of value) {
|
|
106
|
-
if (!isRecord(item)) continue;
|
|
107
|
-
const { name, status, fileTypes } = item;
|
|
108
|
-
if (
|
|
109
|
-
typeof name !== "string" ||
|
|
110
|
-
(status !== "ready" && status !== "error" && status !== "connecting" && status !== "available") ||
|
|
111
|
-
!Array.isArray(fileTypes) ||
|
|
112
|
-
!fileTypes.every(fileType => typeof fileType === "string")
|
|
113
|
-
) {
|
|
114
|
-
continue;
|
|
115
|
-
}
|
|
116
|
-
servers.push({ name, status, fileTypes });
|
|
117
|
-
}
|
|
118
|
-
return servers;
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
function parseWelcome(value: unknown): ComposerWelcomeCache | undefined {
|
|
122
|
-
if (!isRecord(value)) return undefined;
|
|
123
|
-
const { modelName, providerName } = value;
|
|
124
|
-
return typeof modelName === "string" && typeof providerName === "string" ? { modelName, providerName } : undefined;
|
|
125
|
-
}
|
|
126
|
-
|
|
127
77
|
function parseStatus(value: unknown): ComposerStatusCache | undefined {
|
|
128
78
|
if (!isRecord(value)) return undefined;
|
|
129
79
|
const statusLine = readStatusLineStartupData(value.statusLine);
|
|
@@ -275,9 +225,6 @@ export class ComposerCache {
|
|
|
275
225
|
return {
|
|
276
226
|
preferences: ui?.preferences,
|
|
277
227
|
theme: ui?.theme,
|
|
278
|
-
welcome: parseWelcome(parseJson(own.welcome)) ?? parseWelcome(parseJson(anyProject.welcome)),
|
|
279
|
-
recentSessions: parseRecentSessions(parseJson(own["recent-sessions"])),
|
|
280
|
-
lspServers: own["lsp-servers"] === undefined ? [] : parseLspServers(parseJson(own["lsp-servers"])),
|
|
281
228
|
status: parseStatus(parseJson(own.status)) ?? parseStatus(parseJson(anyProject.status)),
|
|
282
229
|
};
|
|
283
230
|
}
|
|
@@ -287,21 +234,6 @@ export class ComposerCache {
|
|
|
287
234
|
this.#putShared(cwd, "ui", { preferences, theme });
|
|
288
235
|
}
|
|
289
236
|
|
|
290
|
-
/** Authoritative model/provider labels for the next welcome prepaint. */
|
|
291
|
-
writeWelcome(cwd: string, welcome: ComposerWelcomeCache): void {
|
|
292
|
-
this.#putShared(cwd, "welcome", welcome);
|
|
293
|
-
}
|
|
294
|
-
|
|
295
|
-
/** The latest recent-session rows (first four). */
|
|
296
|
-
writeRecentSessions(cwd: string, sessions: readonly RecentSession[]): void {
|
|
297
|
-
this.#put(cwd, "recent-sessions", sessions.slice(0, RECENT_SESSION_LIMIT));
|
|
298
|
-
}
|
|
299
|
-
|
|
300
|
-
/** The latest detected project LSP rows; `null` records that LSP is disabled. */
|
|
301
|
-
writeLspServers(cwd: string, servers: readonly LspServerInfo[] | null): void {
|
|
302
|
-
this.#put(cwd, "lsp-servers", servers);
|
|
303
|
-
}
|
|
304
|
-
|
|
305
237
|
/** Status-bar inputs for the next prepaint's startup status line. */
|
|
306
238
|
writeStatus(cwd: string, status: ComposerStatusCache): void {
|
|
307
239
|
this.#putShared(cwd, "status", status);
|
|
@@ -314,22 +246,11 @@ export class ComposerCache {
|
|
|
314
246
|
this.#db.close();
|
|
315
247
|
}
|
|
316
248
|
|
|
317
|
-
/**
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
if (this.#known.get(key) === json) return;
|
|
323
|
-
try {
|
|
324
|
-
this.#upsert.run(project, kind, json);
|
|
325
|
-
this.#known.set(key, json);
|
|
326
|
-
} catch (error) {
|
|
327
|
-
logger.debug("composer cache write failed", { kind, error: String(error) });
|
|
328
|
-
}
|
|
329
|
-
}
|
|
330
|
-
|
|
331
|
-
/** {@link #put} for this project plus the any-project fallback row, atomically. */
|
|
332
|
-
#putShared(cwd: string, kind: SharedEntryKind, value: unknown): void {
|
|
249
|
+
/**
|
|
250
|
+
* Best-effort upsert of this project's row plus the any-project fallback row,
|
|
251
|
+
* atomically: a failed write only costs the next launch its speculation.
|
|
252
|
+
*/
|
|
253
|
+
#putShared(cwd: string, kind: EntryKind, value: unknown): void {
|
|
333
254
|
const project = path.resolve(cwd);
|
|
334
255
|
const json = JSON.stringify(value);
|
|
335
256
|
const ownKey = `${project}\0${kind}`;
|
package/src/prompt/composer.ts
CHANGED
|
@@ -15,14 +15,14 @@ import {
|
|
|
15
15
|
type TUIOptions,
|
|
16
16
|
type ViewportSize,
|
|
17
17
|
} from "../tui";
|
|
18
|
-
import {
|
|
18
|
+
import { wrapLiteralLine } from "../utils";
|
|
19
19
|
import type { NativeChild, NativeSurface, NativeSurfaceProvider } from "../native/node";
|
|
20
20
|
import { sameItems } from "../native/memo";
|
|
21
21
|
import { postmortem } from "@linxiraos/pi-utils";
|
|
22
22
|
import { CustomEditor } from "./custom-editor";
|
|
23
23
|
import type { WordCompletionMethod } from "./word-completion";
|
|
24
24
|
import { type AnimationFrame, TranscriptContainer } from "../chrome/transcript-container";
|
|
25
|
-
import {
|
|
25
|
+
import { WelcomeComponent, type RecentSession, type LspServerInfo } from "./welcome";
|
|
26
26
|
import { ensureThemeSync, getEditorTheme, theme } from "../theme/theme";
|
|
27
27
|
|
|
28
28
|
const DOUBLE_INTERRUPT_MS = 500;
|
|
@@ -82,7 +82,7 @@ export interface ComposerStatusCache {
|
|
|
82
82
|
/** Optional dependencies and initial state for a standalone composer. */
|
|
83
83
|
export interface ComposerOptions {
|
|
84
84
|
readonly terminal?: Terminal;
|
|
85
|
-
/** Extra TUI construction options (render scheduler injection for tests and `
|
|
85
|
+
/** Extra TUI construction options (render scheduler injection for tests and `zetacode render`). */
|
|
86
86
|
readonly tuiOptions?: TUIOptions;
|
|
87
87
|
readonly preferences?: Partial<ComposerPreferences>;
|
|
88
88
|
readonly welcome?: ComposerWelcomeUpdate;
|
|
@@ -279,6 +279,8 @@ export class Composer implements TerminalFrameProvider, NativeSurfaceProvider {
|
|
|
279
279
|
#transientChrome: ReadonlySet<Component> = new Set();
|
|
280
280
|
#transientChromeFloor: number | undefined;
|
|
281
281
|
#anchorAfterInlineRetirement = false;
|
|
282
|
+
/** Rows the chrome below each below-transcript root took in the last frame (see {@link rowsBelow}). */
|
|
283
|
+
#rowsBelow = new Map<Component, number>();
|
|
282
284
|
#lastInterruptAt = 0;
|
|
283
285
|
/** Last described surface; its arrays are reused while their children are unchanged. */
|
|
284
286
|
#nativeSurface: NativeSurface = { main: [], dock: [] };
|
|
@@ -347,6 +349,27 @@ export class Composer implements TerminalFrameProvider, NativeSurfaceProvider {
|
|
|
347
349
|
this.ui.addChild(this.#statusHost);
|
|
348
350
|
this.ui.setFocus(this.editor);
|
|
349
351
|
}
|
|
352
|
+
/**
|
|
353
|
+
* Rows the below-transcript chrome under `root` (editor, status line, …)
|
|
354
|
+
* took in the last frame, so a root that grows upward can cap itself to
|
|
355
|
+
* the screen rows left above them; `undefined` before `root` was laid out.
|
|
356
|
+
*/
|
|
357
|
+
rowsBelow(root: Component): number | undefined {
|
|
358
|
+
return this.#rowsBelow.get(root);
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
/**
|
|
362
|
+
* Keep the input on the bottom row while the live rows cannot fill the
|
|
363
|
+
* screen, as after an inline decision panel closes. A tall block that just
|
|
364
|
+
* left the chrome above the editor (a command report) may have scrolled
|
|
365
|
+
* rows into native history that cannot be pulled back; without the pin the
|
|
366
|
+
* editor would jump up to where the shorter frame now ends. The pin lifts
|
|
367
|
+
* once live rows fill the screen again.
|
|
368
|
+
*/
|
|
369
|
+
pinInputToBottom(): void {
|
|
370
|
+
this.#anchorAfterInlineRetirement = true;
|
|
371
|
+
}
|
|
372
|
+
|
|
350
373
|
/** Compose the bounded mutable viewport and the next ordered history append. */
|
|
351
374
|
renderFrame(viewport: ViewportSize): TerminalFramePlan {
|
|
352
375
|
if (!this.#started || this.#stopped) return { viewport: [] };
|
|
@@ -373,10 +396,12 @@ export class Composer implements TerminalFrameProvider, NativeSurfaceProvider {
|
|
|
373
396
|
let transientRows = 0;
|
|
374
397
|
let displacingRows = 0;
|
|
375
398
|
let decisionPanelOpen = false;
|
|
399
|
+
const ends: { root: Component; end: number }[] = [];
|
|
376
400
|
for (const root of afterRoots) {
|
|
377
401
|
const chrome: Component = root;
|
|
378
402
|
const start = after.length;
|
|
379
403
|
this.#renderBelowRoot(root, width, after, afterSpans);
|
|
404
|
+
ends.push({ root, end: after.length });
|
|
380
405
|
if (this.#transientChrome.has(root)) transientRows += after.length - start;
|
|
381
406
|
if (
|
|
382
407
|
chrome.retireDisplacedTranscript ||
|
|
@@ -386,6 +411,7 @@ export class Composer implements TerminalFrameProvider, NativeSurfaceProvider {
|
|
|
386
411
|
decisionPanelOpen = true;
|
|
387
412
|
}
|
|
388
413
|
}
|
|
414
|
+
this.#rowsBelow = new Map(ends.map(({ root, end }) => [root, after.length - end]));
|
|
389
415
|
// Offer history under capacity pressure only: blocks stay live (and keep
|
|
390
416
|
// reflowing to the current width) while the screen has room. A batch
|
|
391
417
|
// leaves the mutable viewport in the same frame it is appended, so its
|
|
@@ -786,20 +812,8 @@ export class Composer implements TerminalFrameProvider, NativeSurfaceProvider {
|
|
|
786
812
|
if (!lines) return [];
|
|
787
813
|
if (isInsideTerminalMultiplexer()) return lines.slice(start);
|
|
788
814
|
const reflowed: string[] = [];
|
|
789
|
-
const columns = Math.max(1, width);
|
|
790
815
|
for (let index = start; index < lines.length; index++) {
|
|
791
|
-
|
|
792
|
-
const lineWidth = visibleWidth(line);
|
|
793
|
-
if (lineWidth === 0) {
|
|
794
|
-
reflowed.push("");
|
|
795
|
-
continue;
|
|
796
|
-
}
|
|
797
|
-
for (let column = 0; column < lineWidth;) {
|
|
798
|
-
let slice = sliceWithWidth(line, column, columns, true);
|
|
799
|
-
if (slice.width === 0) slice = sliceWithWidth(line, column, columns);
|
|
800
|
-
reflowed.push(slice.text);
|
|
801
|
-
column += Math.max(1, slice.width);
|
|
802
|
-
}
|
|
816
|
+
reflowed.push(...wrapLiteralLine(lines[index]!, width));
|
|
803
817
|
}
|
|
804
818
|
return reflowed;
|
|
805
819
|
}
|
|
@@ -871,7 +885,7 @@ export class Composer implements TerminalFrameProvider, NativeSurfaceProvider {
|
|
|
871
885
|
this.ui.requestRender();
|
|
872
886
|
}
|
|
873
887
|
|
|
874
|
-
/** Patch welcome data in place as
|
|
888
|
+
/** Patch welcome data in place as version, session, and project discovery complete. */
|
|
875
889
|
updateWelcome(update: ComposerWelcomeUpdate): void {
|
|
876
890
|
if (this.#stopped) return;
|
|
877
891
|
this.#applyWelcomeUpdate(update);
|
|
@@ -880,11 +894,7 @@ export class Composer implements TerminalFrameProvider, NativeSurfaceProvider {
|
|
|
880
894
|
const welcome = this.#welcome;
|
|
881
895
|
if (!welcome) return;
|
|
882
896
|
if (update.version !== undefined) welcome.setVersion(this.#version);
|
|
883
|
-
|
|
884
|
-
welcome.setModel(this.#modelName, this.#providerName);
|
|
885
|
-
}
|
|
886
|
-
if (update.recentSessions !== undefined) welcome.setRecentSessions(this.#recentSessions);
|
|
887
|
-
if (update.lspServers !== undefined) welcome.setLspServers(this.#lspServers);
|
|
897
|
+
welcome.setModel(this.#modelName, this.#providerName);
|
|
888
898
|
this.ui.requestRender();
|
|
889
899
|
}
|
|
890
900
|
|
|
@@ -899,6 +909,7 @@ export class Composer implements TerminalFrameProvider, NativeSurfaceProvider {
|
|
|
899
909
|
|
|
900
910
|
/** Update the canonical editor reference after InteractiveMode remounts a custom editor. */
|
|
901
911
|
setEditor(editor: CustomEditor): void {
|
|
912
|
+
this.ui.replaceHeldFocus(this.#editor, editor);
|
|
902
913
|
this.#editor = editor;
|
|
903
914
|
}
|
|
904
915
|
|
|
@@ -965,10 +976,10 @@ export class Composer implements TerminalFrameProvider, NativeSurfaceProvider {
|
|
|
965
976
|
|
|
966
977
|
#applyWelcomeUpdate(update: ComposerWelcomeUpdate): void {
|
|
967
978
|
if (update.version !== undefined) this.#version = update.version;
|
|
968
|
-
if (update.modelName !== undefined
|
|
969
|
-
|
|
970
|
-
|
|
971
|
-
|
|
979
|
+
if (update.modelName !== undefined || update.providerName !== undefined) {
|
|
980
|
+
this.#modelName = update.modelName ?? this.#modelName;
|
|
981
|
+
this.#providerName = update.providerName ?? this.#providerName;
|
|
982
|
+
}
|
|
972
983
|
}
|
|
973
984
|
|
|
974
985
|
#ensureWelcome(): void {
|