@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
|
@@ -107,7 +107,7 @@ export declare const TUI_KEYBINDINGS: {
|
|
|
107
107
|
readonly description: "Delete word backward";
|
|
108
108
|
};
|
|
109
109
|
readonly "tui.editor.deleteWordForward": {
|
|
110
|
-
readonly defaultKeys: ["alt+delete", "alt+d", "super+alt+delete", "super+alt+d"];
|
|
110
|
+
readonly defaultKeys: ["alt+delete", "alt+d", "ctrl+delete", "super+alt+delete", "super+alt+d"];
|
|
111
111
|
readonly description: "Delete word forward";
|
|
112
112
|
};
|
|
113
113
|
readonly "tui.editor.deleteToLineStart": {
|
|
@@ -30,8 +30,8 @@ export interface KittyGraphicsFeatures {
|
|
|
30
30
|
* cannot use cursor-positioned placements because the outer terminal does not
|
|
31
31
|
* know pane scroll/reflow state. An explicit `PI_FORCE_IMAGE_PROTOCOL=kitty`
|
|
32
32
|
* opts into placeholders under any multiplexer — matching `timg -pk`.
|
|
33
|
-
* Automatic
|
|
34
|
-
* that
|
|
33
|
+
* Automatic fallback stays off inside multiplexers whose pane marker does not
|
|
34
|
+
* prove that a Kitty renderer is enabled (Herdr's is experimental).
|
|
35
35
|
*
|
|
36
36
|
* `PI_NO_KITTY_PLACEHOLDERS=1` and `PI_KITTY_PLACEHOLDERS=0` remain hard
|
|
37
37
|
* opt-outs; `PI_KITTY_PLACEHOLDERS=1` explicitly opts in anywhere else.
|
|
@@ -21,13 +21,14 @@ interface LoopWatchdogTimer {
|
|
|
21
21
|
cancel?(): void;
|
|
22
22
|
}
|
|
23
23
|
/**
|
|
24
|
-
* Always-on event-loop lag probe. Each tick is scheduled `intervalMs` ahead
|
|
25
|
-
*
|
|
26
|
-
* the loop was blocked that long. The overshoot is
|
|
27
|
-
* edge (one block ⇒ one line, deduped via
|
|
28
|
-
*
|
|
29
|
-
*
|
|
30
|
-
*
|
|
24
|
+
* Always-on event-loop lag probe. Each tick is scheduled `intervalMs` ahead,
|
|
25
|
+
* with that target recorded as its deadline; a tick that fires `thresholdMs`
|
|
26
|
+
* past its deadline means the loop was blocked that long. The overshoot is
|
|
27
|
+
* logged once on the rising edge (one block ⇒ one line, deduped via
|
|
28
|
+
* `#wasBlocked`). Attribution via
|
|
29
|
+
* {@link takeLoopPhaseAttribution} totals each innermost phase only after the tick's
|
|
30
|
+
* deadline. A phase is named, with `phaseMs`, only when its total outweighs all
|
|
31
|
+
* unlabeled time in that late window; otherwise the block remains "unknown".
|
|
31
32
|
*
|
|
32
33
|
* The handle is `unref`'d so the probe never keeps the process alive, and stop()
|
|
33
34
|
* cancels the armed timer when the handle exposes `cancel` (the default
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export declare const cmuxMultiplexer: {
|
|
2
|
+
readonly id: "cmux";
|
|
3
|
+
readonly precedence: "session";
|
|
4
|
+
readonly sessionEnvKeys: readonly ["CMUX_WORKSPACE_ID", "CMUX_SURFACE_ID", "CMUX_REMOTE_TRANSPORT"];
|
|
5
|
+
readonly ownsScreenGrid: true;
|
|
6
|
+
readonly isInside: (env?: NodeJS.ProcessEnv) => boolean;
|
|
7
|
+
/**
|
|
8
|
+
* Workspace/socket state alone is not enough: only the injected surface UUID
|
|
9
|
+
* identifies the pane that should receive the notification. Without a valid
|
|
10
|
+
* surface, or without the binary, delivery falls through unchanged.
|
|
11
|
+
*/
|
|
12
|
+
readonly notifier: {
|
|
13
|
+
readonly tier: "surface";
|
|
14
|
+
readonly send: ({ message, env }: import("./types.js").TerminalMultiplexerNotificationRequest) => boolean;
|
|
15
|
+
};
|
|
16
|
+
};
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
export declare const herdrMultiplexer: {
|
|
2
|
+
readonly id: "herdr";
|
|
3
|
+
readonly precedence: "session";
|
|
4
|
+
readonly sessionEnvKeys: readonly ["HERDR_ENV", "HERDR_PANE_ID", "HERDR_TAB_ID", "HERDR_WORKSPACE_ID"];
|
|
5
|
+
readonly ownsScreenGrid: true;
|
|
6
|
+
readonly isInside: (env?: NodeJS.ProcessEnv) => boolean;
|
|
7
|
+
/**
|
|
8
|
+
* Herdr multiplexes panes like tmux but swallows bare OSC 9 / OSC 99 and has
|
|
9
|
+
* no DCS passthrough envelope, and its bell relay does not flag a
|
|
10
|
+
* backgrounded tab — so without its CLI a backgrounded pane gets no signal
|
|
11
|
+
* at all that the agent finished or is waiting for input.
|
|
12
|
+
*
|
|
13
|
+
* `sound` maps the notification kind onto what Herdr offers: a question
|
|
14
|
+
* waiting on the user and a turn that stopped with an error both need the
|
|
15
|
+
* human and ring `request`, a settled turn rings `done`, anything else stays
|
|
16
|
+
* silent. The exact pane ID addresses the CLI call; without a valid one, or
|
|
17
|
+
* without the binary, delivery falls through.
|
|
18
|
+
*/
|
|
19
|
+
readonly notifier: {
|
|
20
|
+
readonly tier: "pane";
|
|
21
|
+
readonly send: ({ message, env }: import("./types.js").TerminalMultiplexerNotificationRequest) => boolean;
|
|
22
|
+
};
|
|
23
|
+
readonly hyperlinks: "render";
|
|
24
|
+
readonly honorsSynchronizedOutput: true;
|
|
25
|
+
readonly imagesRequireOverride: true;
|
|
26
|
+
};
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { TerminalNotification } from "../terminal-capabilities.js";
|
|
2
|
+
/** Title for out-of-band multiplexer notifications that carry none of their own. */
|
|
3
|
+
export declare const DEFAULT_NOTIFICATION_TITLE = "omp";
|
|
4
|
+
/** Title and body for an out-of-band multiplexer notification (cmux, Herdr). */
|
|
5
|
+
export declare function notificationTitleAndBody(message: string | TerminalNotification): {
|
|
6
|
+
title: string;
|
|
7
|
+
body: string;
|
|
8
|
+
};
|
|
9
|
+
/**
|
|
10
|
+
* Start a notifier CLI without waiting for or pinning it. Returns false when
|
|
11
|
+
* the binary cannot be spawned, which leaves delivery to the terminal fallback.
|
|
12
|
+
*/
|
|
13
|
+
export declare function spawnNotifier(cmd: string[]): boolean;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Orca is an xterm.js-based IDE whose terminals expose paired pane/worktree IDs.
|
|
3
|
+
* It is recognized for launches, but it ranks below nested multiplexers and keeps
|
|
4
|
+
* the direct-terminal render path it used before it was recognized.
|
|
5
|
+
*/
|
|
6
|
+
export declare const orcaMultiplexer: {
|
|
7
|
+
readonly id: "orca";
|
|
8
|
+
readonly precedence: "outerApp";
|
|
9
|
+
readonly sessionEnvKeys: readonly ["ORCA_PANE_KEY", "ORCA_WORKTREE_ID"];
|
|
10
|
+
readonly ownsScreenGrid: false;
|
|
11
|
+
readonly isInside: (env?: NodeJS.ProcessEnv) => boolean;
|
|
12
|
+
};
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export declare const screenMultiplexer: {
|
|
2
|
+
readonly id: "screen";
|
|
3
|
+
readonly precedence: "session";
|
|
4
|
+
readonly sessionEnvKeys: readonly ["STY"];
|
|
5
|
+
readonly termPrefix: "screen";
|
|
6
|
+
readonly ownsScreenGrid: true;
|
|
7
|
+
readonly isInside: (env?: NodeJS.ProcessEnv) => boolean;
|
|
8
|
+
readonly hyperlinks: "drop";
|
|
9
|
+
};
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/** Wrap a control sequence in tmux's DCS passthrough envelope. */
|
|
2
|
+
export declare function wrapTmuxPassthrough(payload: string): string;
|
|
3
|
+
export declare const tmuxMultiplexer: {
|
|
4
|
+
readonly id: "tmux";
|
|
5
|
+
readonly precedence: "session";
|
|
6
|
+
readonly sessionEnvKeys: readonly ["TMUX"];
|
|
7
|
+
readonly termPrefix: "tmux";
|
|
8
|
+
readonly ownsScreenGrid: true;
|
|
9
|
+
readonly isInside: (env?: NodeJS.ProcessEnv) => boolean;
|
|
10
|
+
readonly notifier: {
|
|
11
|
+
readonly tier: "inBand";
|
|
12
|
+
readonly send: ({ sequence, write }: import("./types.js").TerminalMultiplexerNotificationRequest) => boolean;
|
|
13
|
+
};
|
|
14
|
+
readonly hyperlinks: {
|
|
15
|
+
readonly forward: {
|
|
16
|
+
readonly termProgram: "tmux";
|
|
17
|
+
readonly major: 3;
|
|
18
|
+
readonly minor: 4;
|
|
19
|
+
};
|
|
20
|
+
};
|
|
21
|
+
readonly backgroundColorCache: {
|
|
22
|
+
readonly passthrough: typeof wrapTmuxPassthrough;
|
|
23
|
+
readonly settleMs: 100;
|
|
24
|
+
};
|
|
25
|
+
readonly expandsRepPadding: true;
|
|
26
|
+
readonly expiresSynchronizedOutput: true;
|
|
27
|
+
readonly altRestoreEndsSynchronizedOutput: true;
|
|
28
|
+
readonly growsBeforeSigwinch: true;
|
|
29
|
+
};
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import type { TerminalNotification } from "../terminal-capabilities.js";
|
|
2
|
+
/**
|
|
3
|
+
* Classification tier. `session` markers outrank the TERM fallback; `outerApp`
|
|
4
|
+
* hosts rank below it so a multiplexer nested inside them still wins.
|
|
5
|
+
*/
|
|
6
|
+
export type TerminalMultiplexerPrecedence = "session" | "outerApp";
|
|
7
|
+
/**
|
|
8
|
+
* Notification delivery tier, tried in this order so the innermost target wins:
|
|
9
|
+
* a `pane` notifier addresses the exact pane through the multiplexer's CLI, a
|
|
10
|
+
* `surface` notifier addresses the containing app surface, and an `inBand`
|
|
11
|
+
* notifier rewrites the terminal's own notification sequence.
|
|
12
|
+
*/
|
|
13
|
+
export type TerminalMultiplexerNotificationTier = "pane" | "surface" | "inBand";
|
|
14
|
+
/** One notification offered to a multiplexer notifier. */
|
|
15
|
+
export interface TerminalMultiplexerNotificationRequest {
|
|
16
|
+
readonly message: string | TerminalNotification;
|
|
17
|
+
readonly env: NodeJS.ProcessEnv;
|
|
18
|
+
/** The host terminal's formatted OSC notification, or `null` when it notifies with a bare BEL. */
|
|
19
|
+
readonly sequence: string | null;
|
|
20
|
+
/** Write a sequence through the active terminal. */
|
|
21
|
+
write(data: string): void;
|
|
22
|
+
}
|
|
23
|
+
export interface TerminalMultiplexerNotifier {
|
|
24
|
+
readonly tier: TerminalMultiplexerNotificationTier;
|
|
25
|
+
/** Deliver the notification. `false` leaves it to the next notifier and then the terminal fallback. */
|
|
26
|
+
send(request: TerminalMultiplexerNotificationRequest): boolean;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* OSC 8 handling inside a multiplexer session:
|
|
30
|
+
* - `render`: the multiplexer draws and opens links itself, so links work
|
|
31
|
+
* whatever the outer terminal supports, unless another session with a
|
|
32
|
+
* hyperlink policy sits in the path.
|
|
33
|
+
* - `drop`: never forwards OSC 8; its session anywhere in the path disables links.
|
|
34
|
+
* - `forward`: forwards OSC 8 once it self-reports (`TERM_PROGRAM`/`TERM_PROGRAM_VERSION`)
|
|
35
|
+
* at least `major.minor`; older or unreported versions stay off.
|
|
36
|
+
*/
|
|
37
|
+
export type TerminalMultiplexerHyperlinks = "render" | "drop" | {
|
|
38
|
+
readonly forward: {
|
|
39
|
+
/** Lowercase `TERM_PROGRAM` the multiplexer sets inside its panes. */
|
|
40
|
+
readonly termProgram: string;
|
|
41
|
+
readonly major: number;
|
|
42
|
+
readonly minor: number;
|
|
43
|
+
};
|
|
44
|
+
};
|
|
45
|
+
/** A multiplexer that answers OSC 11 from a cached copy of the outer terminal's background color. */
|
|
46
|
+
export interface TerminalMultiplexerBackgroundColorCache {
|
|
47
|
+
/** Wrap a query so it reaches the outer terminal and refreshes the cache. */
|
|
48
|
+
passthrough(query: string): string;
|
|
49
|
+
/** How long the multiplexer needs to store the outer reply before the cache is re-read. */
|
|
50
|
+
readonly settleMs: number;
|
|
51
|
+
}
|
|
52
|
+
/** Everything omp needs to recognize one terminal multiplexer and adapt to it. */
|
|
53
|
+
export interface TerminalMultiplexerModule<Id extends string = string> {
|
|
54
|
+
readonly id: Id;
|
|
55
|
+
readonly precedence: TerminalMultiplexerPrecedence;
|
|
56
|
+
/** Every environment variable `isInside()` reads. */
|
|
57
|
+
readonly sessionEnvKeys: readonly string[];
|
|
58
|
+
/** Lowercase TERM prefix that identifies the multiplexer when its session markers were stripped. */
|
|
59
|
+
readonly termPrefix?: string;
|
|
60
|
+
/**
|
|
61
|
+
* Whether the multiplexer owns the screen grid. When true, rendering takes the
|
|
62
|
+
* multiplexer path (no scrollback rebuild, anchored resize, skipped probes).
|
|
63
|
+
*/
|
|
64
|
+
readonly ownsScreenGrid: boolean;
|
|
65
|
+
isInside(env?: NodeJS.ProcessEnv): boolean;
|
|
66
|
+
/** Routes notifications the multiplexer would otherwise swallow. */
|
|
67
|
+
readonly notifier?: TerminalMultiplexerNotifier;
|
|
68
|
+
/** OSC 8 policy inside a session; unset defers to the outer terminal. */
|
|
69
|
+
readonly hyperlinks?: TerminalMultiplexerHyperlinks;
|
|
70
|
+
/**
|
|
71
|
+
* The pane's VTE honors DEC 2026 even when DECRQM is unanswered or reports
|
|
72
|
+
* the mode unrecognized (status 0): synchronized output starts on inside a
|
|
73
|
+
* session, and an unrecognized report does not turn it off.
|
|
74
|
+
*/
|
|
75
|
+
readonly honorsSynchronizedOutput?: boolean;
|
|
76
|
+
/**
|
|
77
|
+
* The session does not reveal whether its client renders graphics while
|
|
78
|
+
* outer-terminal identity variables leak in, so images and Kitty
|
|
79
|
+
* placeholders stay off unless the user forces them.
|
|
80
|
+
*/
|
|
81
|
+
readonly imagesRequireOverride?: boolean;
|
|
82
|
+
/** Platforms where the multiplexer breaks OSC 11 passthrough, so host appearance is used instead. */
|
|
83
|
+
readonly backgroundQueryBrokenOn?: readonly NodeJS.Platform[];
|
|
84
|
+
/** Present when OSC 11 replies come from a cache an explicit refresh must update first. */
|
|
85
|
+
readonly backgroundColorCache?: TerminalMultiplexerBackgroundColorCache;
|
|
86
|
+
/** Expands REP into identical styled cells, so destructive replays REP-encode their padding. */
|
|
87
|
+
readonly expandsRepPadding?: boolean;
|
|
88
|
+
/** Expires a synchronized update after a deadline, so large rebuild replays renew DEC 2026 as they stream. */
|
|
89
|
+
readonly expiresSynchronizedOutput?: boolean;
|
|
90
|
+
/**
|
|
91
|
+
* Restoring the alternate buffer schedules a redraw that ends a synchronized
|
|
92
|
+
* update early, so a synchronized resize rebuild stays on the main buffer.
|
|
93
|
+
*/
|
|
94
|
+
readonly altRestoreEndsSynchronizedOutput?: boolean;
|
|
95
|
+
/**
|
|
96
|
+
* May grow its grid before SIGWINCH reaches the app, so a rebuild-mode grow
|
|
97
|
+
* whose full viewport no longer reaches the bottom replays history.
|
|
98
|
+
*/
|
|
99
|
+
readonly growsBeforeSigwinch?: boolean;
|
|
100
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* wmux is a Windows multiplexer (Electron + xterm.js) modeled on cmux/herdr that
|
|
3
|
+
* repaints its pane in place. WMUX_CLI / WMUX_PIPE are CLI path overrides and can
|
|
4
|
+
* be set outside a wmux terminal.
|
|
5
|
+
*/
|
|
6
|
+
export declare const wmuxMultiplexer: {
|
|
7
|
+
readonly id: "wmux";
|
|
8
|
+
readonly precedence: "session";
|
|
9
|
+
readonly sessionEnvKeys: readonly ["WMUX", "WMUX_SURFACE_ID"];
|
|
10
|
+
readonly ownsScreenGrid: true;
|
|
11
|
+
readonly isInside: (env?: NodeJS.ProcessEnv) => boolean;
|
|
12
|
+
};
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export declare const zellijMultiplexer: {
|
|
2
|
+
readonly id: "zellij";
|
|
3
|
+
readonly precedence: "session";
|
|
4
|
+
readonly sessionEnvKeys: readonly ["ZELLIJ"];
|
|
5
|
+
readonly ownsScreenGrid: true;
|
|
6
|
+
readonly isInside: (env?: NodeJS.ProcessEnv) => boolean;
|
|
7
|
+
readonly notifier: {
|
|
8
|
+
readonly tier: "inBand";
|
|
9
|
+
readonly send: ({ sequence, write }: import("./types.js").TerminalMultiplexerNotificationRequest) => boolean;
|
|
10
|
+
};
|
|
11
|
+
readonly backgroundQueryBrokenOn: readonly ["darwin"];
|
|
12
|
+
};
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Reference document applier: applies TSP frames to a node tree the way the
|
|
3
|
-
* spec says the terminal does (
|
|
4
|
-
* one; a rejected op is reported and
|
|
5
|
-
* the frame. `settle` is recorded as a
|
|
3
|
+
* spec says the terminal does (Tern SDK, `protocol/documents.md`, frame ops).
|
|
4
|
+
* Ops are validated and applied one by one; a rejected op is reported and
|
|
5
|
+
* skipped without affecting the rest of the frame. `settle` is recorded as a
|
|
6
|
+
* hint and never restricts later ops.
|
|
6
7
|
*
|
|
7
8
|
* Used by tests, the debug server's `doc` op, and the TSP test harness.
|
|
8
9
|
*/
|
|
@@ -48,8 +48,9 @@ export interface NativeBackendOptions {
|
|
|
48
48
|
/**
|
|
49
49
|
* The reply a v1 terminal is assumed to give before its real `hello` arrives
|
|
50
50
|
* (the `TERM_PROGRAM=tern` optimistic start): the whole vocabulary, the
|
|
51
|
-
* default APC limit and credits, the terminal's width, the appearance
|
|
52
|
-
* already detected, and
|
|
51
|
+
* default APC limit and credits, the terminal's width, the appearance omp
|
|
52
|
+
* already detected, full motion, and `blobs`, so a resumed session's images
|
|
53
|
+
* are asked about rather than resent before the reply comes.
|
|
53
54
|
*/
|
|
54
55
|
export declare function assumedTspHello(terminal: Terminal): TspHello;
|
|
55
56
|
export declare class NativeBackend {
|
|
@@ -83,8 +84,8 @@ export declare class NativeBackend {
|
|
|
83
84
|
* The terminal's real `hello` reply after an optimistic start: adopt its
|
|
84
85
|
* APC limit, credits, cell size, kinds, appearance and motion preference.
|
|
85
86
|
* A width the terminal already reported in a `resize` event wins over the
|
|
86
|
-
* reply's. A different vocabulary
|
|
87
|
-
* component, so kinds the terminal lacks fall back.
|
|
87
|
+
* reply's. A different vocabulary, motion preference or clock re-describes
|
|
88
|
+
* every component, so kinds the terminal lacks fall back.
|
|
88
89
|
*/
|
|
89
90
|
confirm(hello: TspHello): void;
|
|
90
91
|
/** SIGWINCH: refresh the width used for `rows` fallback until the terminal reports one. */
|
|
@@ -2,8 +2,10 @@
|
|
|
2
2
|
* Content-addressed binary blobs (images) for `image` nodes.
|
|
3
3
|
*
|
|
4
4
|
* `describe()` registers the bytes and puts the returned id in `image.p.blob`;
|
|
5
|
-
* the native backend
|
|
6
|
-
*
|
|
5
|
+
* the native backend delivers each referenced blob once per terminal
|
|
6
|
+
* connection (asking the terminal first which it holds, or through its blob
|
|
7
|
+
* cache), else uploads it with verb `b` before the frame that first
|
|
8
|
+
* references it.
|
|
7
9
|
*/
|
|
8
10
|
import type { TspProps } from "@linxiraos/pi-wire";
|
|
9
11
|
import type { NativeNode } from "./node.js";
|
|
@@ -12,10 +14,12 @@ export interface NativeBlob {
|
|
|
12
14
|
readonly mime: string;
|
|
13
15
|
readonly bytes: Uint8Array;
|
|
14
16
|
}
|
|
15
|
-
/** Register
|
|
17
|
+
/** Register bytes for process-lifetime, id-only use. Prefer {@link nativeImageNode} for owned images. */
|
|
16
18
|
export declare function registerNativeBlob(bytes: Uint8Array, mime: string): string;
|
|
17
19
|
/** A registered blob by id. */
|
|
18
20
|
export declare function getNativeBlob(id: string): NativeBlob | undefined;
|
|
21
|
+
/** An image whose props own its bytes, including while hidden, unmounted, or awaiting upload. */
|
|
22
|
+
export declare function nativeImageNode(bytes: Uint8Array, mime: string, p?: Omit<TspProps<"image">, "blob" | "builtin">, key?: string): NativeNode;
|
|
19
23
|
/**
|
|
20
24
|
* An `image` node for a base64 payload: the bytes are registered as a blob and
|
|
21
25
|
* the pixel size probed from the header. Decoding and hashing cost real time,
|
|
@@ -15,19 +15,21 @@ export type TspIncoming = {
|
|
|
15
15
|
};
|
|
16
16
|
/** Message parameters (`k=v`, ASCII, never containing `;`). */
|
|
17
17
|
export type TspParams = Readonly<Record<string, string | number>>;
|
|
18
|
-
/** Split `body` into pieces of at most `limit` UTF-8 bytes, never inside a code point. */
|
|
19
|
-
export declare function splitUtf8(body: string, limit: number): string[];
|
|
20
18
|
/**
|
|
21
|
-
* Encode one logical message, chunked when `body` exceeds `limit` UTF-8 bytes
|
|
22
|
-
*
|
|
19
|
+
* Encode one logical message, chunked when `body` exceeds `limit` UTF-8 bytes:
|
|
20
|
+
* the first chunk carries `params`, every chunk `c=<id>` and all but the last
|
|
21
|
+
* `m=1`. Returns the complete byte string to write (all chunks, in order).
|
|
23
22
|
*/
|
|
24
23
|
export declare function encodeTspMessage(verb: TspVerb, body: string, params?: TspParams, limit?: number): string;
|
|
25
24
|
/** Encode a JSON message body. */
|
|
26
25
|
export declare function encodeTspJson(verb: TspVerb, value: unknown, params?: TspParams, limit?: number): string;
|
|
27
26
|
/**
|
|
28
27
|
* The `hello` query; callers follow it with a DA1 sentinel. `features: ["edit"]`
|
|
29
|
-
|
|
30
|
-
* native selection in zeta's editors;
|
|
28
|
+
#1: * tells the terminal that zeta applies its `edit` events (Tern SDK,
|
|
29
|
+
* `protocol/input.md`), so it may keep a native selection in zeta's editors;
|
|
30
|
+
* without it, every key stays zeta's. `"undo"` says zeta applies `undo` events,
|
|
31
|
+
* so the terminal may turn ⌃Z in a field into one.
|
|
32
|
+
* `"send"` accepts an explicit prompt for a live composer without simulating keys.
|
|
31
33
|
*/
|
|
32
34
|
export declare function encodeTspHelloQuery(version?: string): string;
|
|
33
35
|
/** One decoded APC message: verb, parameters and raw body. */
|
|
@@ -11,7 +11,8 @@
|
|
|
11
11
|
* `rows` fallback node rendered through `render(cx.cols)`.
|
|
12
12
|
*
|
|
13
13
|
* See `packages/wire/src/tsp.ts` for the wire vocabulary and
|
|
14
|
-
* `
|
|
14
|
+
* the Tern SDK's Surface Protocol reference (`docs/sdk/src/protocol` in the
|
|
15
|
+
* Stencil repository, https://docs.stencil.so/tern/protocol/) for the spec.
|
|
15
16
|
*/
|
|
16
17
|
import type { TspEvent, TspKind, TspProps, TspScrollBy, TspSpan } from "@linxiraos/pi-wire";
|
|
17
18
|
import type { Component } from "../tui.js";
|
|
@@ -28,10 +29,12 @@ export type NativeNode = {
|
|
|
28
29
|
*/
|
|
29
30
|
readonly key?: string;
|
|
30
31
|
/**
|
|
31
|
-
* Scroll the node into view, placed like the `reveal` op
|
|
32
|
-
* added
|
|
32
|
+
* Scroll the node into view, placed like the `reveal` op. A placement
|
|
33
|
+
* reveals it when it is added: key a node by what it points at to
|
|
34
|
+
* reveal it again on a move. A {@link NativeReveal} reveals it whenever
|
|
35
|
+
* its `n` differs from the previous description of the same node.
|
|
33
36
|
*/
|
|
34
|
-
readonly reveal?:
|
|
37
|
+
readonly reveal?: NativeRevealAt | NativeReveal;
|
|
35
38
|
/**
|
|
36
39
|
* Keyboard scrolling forwarded to the terminal (PgUp/PgDn/End reach the
|
|
37
40
|
* program): moves the scroller at or above the node by `by` whenever
|
|
@@ -42,6 +45,17 @@ export type NativeNode = {
|
|
|
42
45
|
readonly scroll?: NativeScroll;
|
|
43
46
|
};
|
|
44
47
|
}[TspKind];
|
|
48
|
+
/** Where a revealed node lands in its scroller. */
|
|
49
|
+
export type NativeRevealAt = "start" | "end" | "nearest";
|
|
50
|
+
/**
|
|
51
|
+
* A repeatable {@link NativeNode.reveal}: bump `n` to bring an existing node
|
|
52
|
+
* into view again (a Contents entry jumping to its section). A freshly added
|
|
53
|
+
* node is not revealed.
|
|
54
|
+
*/
|
|
55
|
+
export interface NativeReveal {
|
|
56
|
+
readonly at: NativeRevealAt;
|
|
57
|
+
readonly n: number;
|
|
58
|
+
}
|
|
45
59
|
/** A {@link NativeNode.scroll} request. */
|
|
46
60
|
export interface NativeScroll {
|
|
47
61
|
readonly by: TspScrollBy;
|
|
@@ -57,6 +71,12 @@ export interface DescribeContext {
|
|
|
57
71
|
readonly reduceMotion: boolean;
|
|
58
72
|
/** The terminal's appearance is dark. */
|
|
59
73
|
readonly dark: boolean;
|
|
74
|
+
/**
|
|
75
|
+
* The user's system reads a 12-hour clock (`false`: 24-hour); `undefined`
|
|
76
|
+
* when the terminal doesn't say. Pass it as `hour12` when formatting times:
|
|
77
|
+
* the process's own default locale may not know.
|
|
78
|
+
*/
|
|
79
|
+
readonly hour12?: boolean;
|
|
60
80
|
/** Whether the terminal renders `kind` natively (else describe something simpler or let it fall back). */
|
|
61
81
|
supports(kind: TspKind): boolean;
|
|
62
82
|
/**
|
|
@@ -117,7 +137,18 @@ export type NativeUiEvent = {
|
|
|
117
137
|
| ({
|
|
118
138
|
readonly type: "edit";
|
|
119
139
|
readonly key: string;
|
|
120
|
-
} & NativeTextEdit)
|
|
140
|
+
} & NativeTextEdit)
|
|
141
|
+
/** Undo the last change to an `editor`/`input` node's text (the terminal's ⌃Z); a no-op with no history. */
|
|
142
|
+
| {
|
|
143
|
+
readonly type: "undo";
|
|
144
|
+
readonly key: string;
|
|
145
|
+
}
|
|
146
|
+
/** Submit an explicit prompt through the composer's normal path, preserving the previous draft for recall. */
|
|
147
|
+
| {
|
|
148
|
+
readonly type: "send";
|
|
149
|
+
readonly key: string;
|
|
150
|
+
readonly text: string;
|
|
151
|
+
};
|
|
121
152
|
/**
|
|
122
153
|
* A primitive edit the terminal made over its own text selection (cut,
|
|
123
154
|
* typing, Backspace/Delete or paste over it, or collapsing it). Offsets are
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
* component's root is a `card` whose `head` carries the title.
|
|
8
8
|
*/
|
|
9
9
|
import type { TspProps, TspSpan, TspText } from "@linxiraos/pi-wire";
|
|
10
|
-
import type
|
|
10
|
+
import { type KeyName } from "../key-hint-format.js";
|
|
11
11
|
import { type Keybinding } from "../keybindings.js";
|
|
12
12
|
import type { NativeChild, NativeNode } from "./node.js";
|
|
13
13
|
/** One footer hint: the keys that trigger it and what it does. */
|
|
@@ -44,10 +44,10 @@ export interface ActionButtonOptions {
|
|
|
44
44
|
/** Sibling identity key (defaults to the action id); `leafKey(event.key)` reports it back. */
|
|
45
45
|
readonly key?: string;
|
|
46
46
|
/** Key id of the keyboard path the button mirrors, drawn as a keycap inside it (`"r"`, `"ctrl+g"`). */
|
|
47
|
-
readonly keys?:
|
|
47
|
+
readonly keys?: KeyName;
|
|
48
48
|
/** `accent` = the view's hero action, `error` = destructive. */
|
|
49
49
|
readonly tone?: "accent" | "error";
|
|
50
|
-
/** Tooltip; defaults to the label plus the keycap (`"Refresh r"
|
|
50
|
+
/** Tooltip; defaults to the label plus the keycap (`"Refresh r"`, see {@link formatTooltipKey}). */
|
|
51
51
|
readonly title?: string;
|
|
52
52
|
/** Target of an `open` action (URL or `file://` path). */
|
|
53
53
|
readonly href?: string;
|
|
@@ -58,6 +58,11 @@ export interface ActionButtonOptions {
|
|
|
58
58
|
* which the component routes to the same code path as the key.
|
|
59
59
|
*/
|
|
60
60
|
export declare function actionButton(label: string, act: string, options?: ActionButtonOptions): NativeNode;
|
|
61
|
+
/**
|
|
62
|
+
* A bare `esc` keycap button for a view's top-right corner: a click sends
|
|
63
|
+
* `act` (default `close`), which the component routes to its Esc path.
|
|
64
|
+
*/
|
|
65
|
+
export declare function escCloseButton(act?: string, key?: string): NativeNode;
|
|
61
66
|
/** A row of {@link actionButton}s (role `zeta.actions`); `null` entries become the spacer that end-aligns what follows. */
|
|
62
67
|
export declare function actionBar(buttons: readonly (NativeNode | null)[], key?: string): NativeNode;
|
|
63
68
|
/** Spans of an annotation callout: a dim `label:` then the note. */
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Settling: the frame provider marks finalized transcript blocks so the
|
|
3
|
-
* native reconciler stops keeping their description (
|
|
4
|
-
*
|
|
5
|
-
* targeted ops by id, followed by a fresh `settle`
|
|
3
|
+
* native reconciler stops keeping their description (Tern SDK,
|
|
4
|
+
* `protocol/operations.md`, "Settling"). A settled block stays editable: a
|
|
5
|
+
* later change is sent as targeted ops by id, followed by a fresh `settle`
|
|
6
|
+
* hint.
|
|
6
7
|
*/
|
|
7
8
|
import type { Component } from "../tui.js";
|
|
8
9
|
/** Mark `component` (and everything it describes) as finalized. Idempotent; a no-op outside a TSP terminal. */
|
|
@@ -15,11 +15,12 @@ interface AgentTreeProjection<TRecord extends AgentRecordLike> {
|
|
|
15
15
|
export declare const STATUS_ORDER: Record<AgentStatus, number>;
|
|
16
16
|
/** Exact observer usage for one roster entry. */
|
|
17
17
|
export declare function progressMetrics(observed: ObservableSession | undefined): AgentMetrics | undefined;
|
|
18
|
-
/** Live session
|
|
18
|
+
/** Live session used to cache a row's direct assistant usage, including with observer progress. */
|
|
19
19
|
export declare function hubFallbackStatsSession<TRecord extends AgentRecordLike>(ref: TRecord, observed: ObservableSession | undefined): NonNullable<TRecord["session"]> | undefined;
|
|
20
20
|
/**
|
|
21
|
-
*
|
|
22
|
-
*
|
|
21
|
+
* Preserve progress/history for non-cost metrics, overlaying cumulative direct-session cost.
|
|
22
|
+
* Persisted `history.metrics.cost` is a leaf-scoped snapshot, so it never overrides live
|
|
23
|
+
* progress; only the cumulative direct-cost sources do.
|
|
23
24
|
*/
|
|
24
25
|
export declare function hubRowMetrics<TRecord extends AgentRecordLike>(ref: TRecord, observed: ObservableSession | undefined, sessionMetrics: WeakMap<object, {
|
|
25
26
|
metrics: AgentMetrics | undefined;
|
|
@@ -37,6 +38,6 @@ export declare function aggregateMetrics<TRecord extends AgentRecordLike>(args:
|
|
|
37
38
|
metrics: AggregateMetrics;
|
|
38
39
|
hasFallbackLiveSessions: boolean;
|
|
39
40
|
};
|
|
40
|
-
/** Parent-before-child projection preserving
|
|
41
|
-
export declare function projectAgentTree<TRecord extends AgentRecordLike>(refs: readonly TRecord[]): AgentTreeProjection<TRecord>;
|
|
41
|
+
/** Parent-before-child projection preserving initial subtree rank and prepending new siblings. */
|
|
42
|
+
export declare function projectAgentTree<TRecord extends AgentRecordLike>(refs: readonly TRecord[], rosterRank: ReadonlyMap<TRecord, number> | undefined): AgentTreeProjection<TRecord>;
|
|
42
43
|
export {};
|
|
@@ -28,6 +28,13 @@ export interface AgentHubSession {
|
|
|
28
28
|
messages: AgentMessage[];
|
|
29
29
|
};
|
|
30
30
|
};
|
|
31
|
+
/** Existing session ledger includes off-transcript model usage and nested-task attribution. */
|
|
32
|
+
readonly sessionManager?: {
|
|
33
|
+
getUsageStatistics(): {
|
|
34
|
+
cost: number;
|
|
35
|
+
subagentCost: number;
|
|
36
|
+
};
|
|
37
|
+
};
|
|
31
38
|
getSessionStats(): {
|
|
32
39
|
tokens: {
|
|
33
40
|
input: number;
|
|
@@ -64,6 +71,8 @@ export interface AgentRecordLike {
|
|
|
64
71
|
resolvedModel?: string;
|
|
65
72
|
resolvedModelIsFallback?: boolean;
|
|
66
73
|
metrics?: AgentMetricsSummary;
|
|
74
|
+
/** Cumulative own-session assistant and model_usage cost, excluding nested task results. */
|
|
75
|
+
directCost?: number;
|
|
67
76
|
readOnly?: boolean;
|
|
68
77
|
outputPath?: string;
|
|
69
78
|
patchPath?: string;
|
|
@@ -73,6 +73,7 @@ export interface AgentHubDeps<TRecord extends AgentRecordLike = AgentRecordLike>
|
|
|
73
73
|
/** Mirrors the main transcript's thinking-block visibility. */
|
|
74
74
|
hideThinkingBlock?: () => boolean;
|
|
75
75
|
proseOnlyThinking?: () => boolean;
|
|
76
|
+
expandThinkingBlocks?: () => boolean;
|
|
76
77
|
/** Keys toggling tool output expansion (app.tools.expand). */
|
|
77
78
|
expandKeys?: KeyId[];
|
|
78
79
|
/** Focus the main view on this agent's live session (ctx.focusAgentSession). When absent (collab guest, tests), Enter opens the in-hub chat view instead. */
|
|
@@ -113,6 +114,8 @@ export declare class AgentHubOverlayComponent<TRecord extends AgentRecordLike =
|
|
|
113
114
|
* was raised by that gesture.
|
|
114
115
|
*/
|
|
115
116
|
armCloseTap(): void;
|
|
117
|
+
/** Show `section`, as a slash-command deep link into an already-open hub does. */
|
|
118
|
+
showSection(section: AgentHubSection): void;
|
|
116
119
|
/**
|
|
117
120
|
* Open the fullscreen transcript viewer for an agent id (public for table Enter
|
|
118
121
|
* and tests). Mounts {@link AgentTranscriptViewer} as a `fullscreen` overlay so it
|
|
@@ -23,7 +23,7 @@ import type { AgentHubRegistry } from "./agent-hub-types.js";
|
|
|
23
23
|
import type { SessionMessageEntryLike } from "../chat/transcript-entry.js";
|
|
24
24
|
import type { SessionObserverRegistry } from "./session-observer-registry.js";
|
|
25
25
|
import type { AgentHubRemote } from "./agent-hub.js";
|
|
26
|
-
import type { DescribeContext, NativeNode } from "../native/node.js";
|
|
26
|
+
import type { DescribeContext, NativeNode, NativeUiEvent } from "../native/node.js";
|
|
27
27
|
/** Parsed message and model metadata relevant to a transcript viewer. */
|
|
28
28
|
export type AgentTranscriptEntry = SessionMessageEntryLike | {
|
|
29
29
|
type: "model_change";
|
|
@@ -31,7 +31,14 @@ export type AgentTranscriptEntry = SessionMessageEntryLike | {
|
|
|
31
31
|
};
|
|
32
32
|
/** Local filesystem and session parsing capabilities supplied by the host. */
|
|
33
33
|
export interface AgentTranscriptSource {
|
|
34
|
-
|
|
34
|
+
/**
|
|
35
|
+
* Sync primitives drive the first paint and the incremental tail. When the
|
|
36
|
+
* host also supplies `promises.readFile` (e.g. passes `node:fs` itself), full
|
|
37
|
+
* reloads after rotation/rewrite read the file off the UI thread.
|
|
38
|
+
*/
|
|
39
|
+
fs: Pick<typeof fs, "openSync" | "closeSync" | "readSync" | "readFileSync" | "statSync"> & {
|
|
40
|
+
promises?: Pick<typeof fs.promises, "readFile">;
|
|
41
|
+
};
|
|
35
42
|
parseEntries(text: string): AgentTranscriptEntry[];
|
|
36
43
|
}
|
|
37
44
|
export interface AgentTranscriptViewerDeps {
|
|
@@ -54,6 +61,7 @@ export interface AgentTranscriptViewerDeps {
|
|
|
54
61
|
cwd: string;
|
|
55
62
|
hideThinkingBlock?: () => boolean;
|
|
56
63
|
proseOnlyThinking?: () => boolean;
|
|
64
|
+
expandThinkingBlocks?: () => boolean;
|
|
57
65
|
expandKeys: KeyId[];
|
|
58
66
|
/** Keys that toggle the whole hub closed (app.agents.hub + app.session.observe). */
|
|
59
67
|
hubKeys: KeyId[];
|
|
@@ -69,6 +77,8 @@ export declare class AgentTranscriptViewer implements Component {
|
|
|
69
77
|
dispose(): void;
|
|
70
78
|
handleInput(data: string): void;
|
|
71
79
|
render(width: number): readonly string[];
|
|
80
|
+
/** The top-right `esc` runs Esc. */
|
|
81
|
+
handleNativeEvent(event: NativeUiEvent): void;
|
|
72
82
|
/**
|
|
73
83
|
* Header, transcript body (the builder's container, which describes its own
|
|
74
84
|
* blocks), notice, message editor, stats and key hints. Scrolling is the
|
|
@@ -60,6 +60,15 @@ export interface AgentsHubDeps {
|
|
|
60
60
|
export interface AgentsHubCallbacks {
|
|
61
61
|
onCancel: () => void;
|
|
62
62
|
}
|
|
63
|
+
/**
|
|
64
|
+
* Parse model output into a {@link GeneratedAgentSpec}. Accepts a bare JSON object
|
|
65
|
+
* (tried first) or one wrapped in a code fence. Returns the spec with trimmed fields.
|
|
66
|
+
* Throws if the output is not valid JSON or not an object, if `identifier`, `whenToUse`
|
|
67
|
+
* or `systemPrompt` is missing or not a string, if the identifier is not lowercase
|
|
68
|
+
* kebab-case with 2+ words, if `whenToUse` does not start with "Use this agent when",
|
|
69
|
+
* or if `systemPrompt` is empty.
|
|
70
|
+
*/
|
|
71
|
+
export declare function parseGeneratedAgentSpec(raw: string): GeneratedAgentSpec;
|
|
63
72
|
/**
|
|
64
73
|
* The fullscreen agents hub component. Hosted via
|
|
65
74
|
* `ui.showOverlay(..., { fullscreen: true })`; the host must call
|