@vandeepunk/pi-coding-agent 0.0.6 → 1.0.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 +814 -16
- package/README.md +66 -27
- package/dist/bun/cli.d.ts +3 -0
- package/dist/bun/cli.d.ts.map +1 -0
- package/dist/bun/cli.js +7 -0
- package/dist/bun/cli.js.map +1 -0
- package/dist/bun/register-bedrock.d.ts +2 -0
- package/dist/bun/register-bedrock.d.ts.map +1 -0
- package/dist/bun/register-bedrock.js +4 -0
- package/dist/bun/register-bedrock.js.map +1 -0
- package/dist/cli/args.d.ts +9 -4
- package/dist/cli/args.d.ts.map +1 -1
- package/dist/cli/args.js +61 -22
- package/dist/cli/args.js.map +1 -1
- package/dist/cli/file-processor.d.ts.map +1 -1
- package/dist/cli/file-processor.js +4 -0
- package/dist/cli/file-processor.js.map +1 -1
- package/dist/cli/initial-message.d.ts +18 -0
- package/dist/cli/initial-message.d.ts.map +1 -0
- package/dist/cli/initial-message.js +22 -0
- package/dist/cli/initial-message.js.map +1 -0
- package/dist/cli/session-picker.d.ts.map +1 -1
- package/dist/cli/session-picker.js +2 -1
- package/dist/cli/session-picker.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +3 -0
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +1 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +2 -2
- package/dist/config.js.map +1 -1
- package/dist/core/agent-session-runtime.d.ts +83 -0
- package/dist/core/agent-session-runtime.d.ts.map +1 -0
- package/dist/core/agent-session-runtime.js +236 -0
- package/dist/core/agent-session-runtime.js.map +1 -0
- package/dist/core/agent-session-services.d.ts +86 -0
- package/dist/core/agent-session-services.d.ts.map +1 -0
- package/dist/core/agent-session-services.js +116 -0
- package/dist/core/agent-session-services.js.map +1 -0
- package/dist/core/agent-session.d.ts +63 -49
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +599 -370
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/auth-storage.d.ts +38 -8
- package/dist/core/auth-storage.d.ts.map +1 -1
- package/dist/core/auth-storage.js +220 -96
- package/dist/core/auth-storage.js.map +1 -1
- package/dist/core/bash-executor.d.ts +6 -7
- package/dist/core/bash-executor.d.ts.map +1 -1
- package/dist/core/bash-executor.js +27 -114
- package/dist/core/bash-executor.js.map +1 -1
- package/dist/core/compaction/branch-summarization.d.ts +2 -0
- package/dist/core/compaction/branch-summarization.d.ts.map +1 -1
- package/dist/core/compaction/branch-summarization.js +3 -2
- package/dist/core/compaction/branch-summarization.js.map +1 -1
- package/dist/core/compaction/compaction.d.ts +3 -3
- package/dist/core/compaction/compaction.d.ts.map +1 -1
- package/dist/core/compaction/compaction.js +31 -25
- package/dist/core/compaction/compaction.js.map +1 -1
- package/dist/core/compaction/utils.d.ts +3 -0
- package/dist/core/compaction/utils.d.ts.map +1 -1
- package/dist/core/compaction/utils.js +16 -1
- package/dist/core/compaction/utils.js.map +1 -1
- package/dist/core/exec.d.ts.map +1 -1
- package/dist/core/exec.js +7 -3
- package/dist/core/exec.js.map +1 -1
- package/dist/core/export-html/index.d.ts +7 -4
- package/dist/core/export-html/index.d.ts.map +1 -1
- package/dist/core/export-html/index.js +10 -8
- package/dist/core/export-html/index.js.map +1 -1
- package/dist/core/export-html/template.css +43 -13
- package/dist/core/export-html/template.html +1 -0
- package/dist/core/export-html/template.js +118 -14
- package/dist/core/export-html/tool-renderer.d.ts +9 -4
- package/dist/core/export-html/tool-renderer.d.ts.map +1 -1
- package/dist/core/export-html/tool-renderer.js +48 -10
- package/dist/core/export-html/tool-renderer.js.map +1 -1
- package/dist/core/extensions/index.d.ts +5 -4
- package/dist/core/extensions/index.d.ts.map +1 -1
- package/dist/core/extensions/index.js +2 -2
- package/dist/core/extensions/index.js.map +1 -1
- package/dist/core/extensions/loader.d.ts.map +1 -1
- package/dist/core/extensions/loader.js +49 -13
- package/dist/core/extensions/loader.js.map +1 -1
- package/dist/core/extensions/runner.d.ts +13 -11
- package/dist/core/extensions/runner.d.ts.map +1 -1
- package/dist/core/extensions/runner.js +139 -64
- package/dist/core/extensions/runner.js.map +1 -1
- package/dist/core/extensions/types.d.ts +174 -34
- package/dist/core/extensions/types.d.ts.map +1 -1
- package/dist/core/extensions/types.js +10 -0
- package/dist/core/extensions/types.js.map +1 -1
- package/dist/core/extensions/wrapper.d.ts +4 -11
- package/dist/core/extensions/wrapper.d.ts.map +1 -1
- package/dist/core/extensions/wrapper.js +6 -86
- package/dist/core/extensions/wrapper.js.map +1 -1
- package/dist/core/footer-data-provider.d.ts +18 -2
- package/dist/core/footer-data-provider.d.ts.map +1 -1
- package/dist/core/footer-data-provider.js +220 -40
- package/dist/core/footer-data-provider.js.map +1 -1
- package/dist/core/index.d.ts +4 -1
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +4 -1
- package/dist/core/index.js.map +1 -1
- package/dist/core/keybindings.d.ts +283 -50
- package/dist/core/keybindings.d.ts.map +1 -1
- package/dist/core/keybindings.js +221 -134
- package/dist/core/keybindings.js.map +1 -1
- package/dist/core/model-registry.d.ts +33 -3
- package/dist/core/model-registry.d.ts.map +1 -1
- package/dist/core/model-registry.js +165 -97
- package/dist/core/model-registry.js.map +1 -1
- package/dist/core/model-resolver.d.ts +35 -1
- package/dist/core/model-resolver.d.ts.map +1 -1
- package/dist/core/model-resolver.js +205 -32
- package/dist/core/model-resolver.js.map +1 -1
- package/dist/core/output-guard.d.ts +6 -0
- package/dist/core/output-guard.d.ts.map +1 -0
- package/dist/core/output-guard.js +59 -0
- package/dist/core/output-guard.js.map +1 -0
- package/dist/core/package-manager.d.ts +43 -2
- package/dist/core/package-manager.d.ts.map +1 -1
- package/dist/core/package-manager.js +541 -102
- package/dist/core/package-manager.js.map +1 -1
- package/dist/core/prompt-templates.d.ts +5 -4
- package/dist/core/prompt-templates.d.ts.map +1 -1
- package/dist/core/prompt-templates.js +35 -37
- package/dist/core/prompt-templates.js.map +1 -1
- package/dist/core/resolve-config-value.d.ts +6 -0
- package/dist/core/resolve-config-value.d.ts.map +1 -1
- package/dist/core/resolve-config-value.js +75 -8
- package/dist/core/resolve-config-value.js.map +1 -1
- package/dist/core/resource-loader.d.ts +6 -5
- package/dist/core/resource-loader.d.ts.map +1 -1
- package/dist/core/resource-loader.js +166 -119
- package/dist/core/resource-loader.js.map +1 -1
- package/dist/core/sdk.d.ts +11 -8
- package/dist/core/sdk.d.ts.map +1 -1
- package/dist/core/sdk.js +31 -29
- package/dist/core/sdk.js.map +1 -1
- package/dist/core/session-cwd.d.ts +19 -0
- package/dist/core/session-cwd.d.ts.map +1 -0
- package/dist/core/session-cwd.js +38 -0
- package/dist/core/session-cwd.js.map +1 -0
- package/dist/core/session-manager.d.ts +11 -1
- package/dist/core/session-manager.d.ts.map +1 -1
- package/dist/core/session-manager.js +39 -25
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/settings-manager.d.ts +60 -10
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js +291 -140
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/core/skills.d.ts +5 -3
- package/dist/core/skills.d.ts.map +1 -1
- package/dist/core/skills.js +54 -9
- package/dist/core/skills.js.map +1 -1
- package/dist/core/slash-commands.d.ts +2 -3
- package/dist/core/slash-commands.d.ts.map +1 -1
- package/dist/core/slash-commands.js +3 -2
- package/dist/core/slash-commands.js.map +1 -1
- package/dist/core/source-info.d.ts +18 -0
- package/dist/core/source-info.d.ts.map +1 -0
- package/dist/core/source-info.js +19 -0
- package/dist/core/source-info.js.map +1 -0
- package/dist/core/system-prompt.d.ts +4 -0
- package/dist/core/system-prompt.d.ts.map +1 -1
- package/dist/core/system-prompt.js +31 -52
- package/dist/core/system-prompt.js.map +1 -1
- package/dist/core/timings.d.ts +1 -0
- package/dist/core/timings.d.ts.map +1 -1
- package/dist/core/timings.js +6 -0
- package/dist/core/timings.js.map +1 -1
- package/dist/core/tools/bash.d.ts +24 -6
- package/dist/core/tools/bash.d.ts.map +1 -1
- package/dist/core/tools/bash.js +225 -115
- package/dist/core/tools/bash.js.map +1 -1
- package/dist/core/tools/edit-diff.d.ts +23 -1
- package/dist/core/tools/edit-diff.d.ts.map +1 -1
- package/dist/core/tools/edit-diff.js +151 -57
- package/dist/core/tools/edit-diff.js.map +1 -1
- package/dist/core/tools/edit.d.ts +20 -6
- package/dist/core/tools/edit.d.ts.map +1 -1
- package/dist/core/tools/edit.js +111 -61
- package/dist/core/tools/edit.js.map +1 -1
- package/dist/core/tools/file-mutation-queue.d.ts +6 -0
- package/dist/core/tools/file-mutation-queue.d.ts.map +1 -0
- package/dist/core/tools/file-mutation-queue.js +37 -0
- package/dist/core/tools/file-mutation-queue.js.map +1 -0
- package/dist/core/tools/find.d.ts +11 -4
- package/dist/core/tools/find.d.ts.map +1 -1
- package/dist/core/tools/find.js +82 -30
- package/dist/core/tools/find.js.map +1 -1
- package/dist/core/tools/grep.d.ts +15 -4
- package/dist/core/tools/grep.d.ts.map +1 -1
- package/dist/core/tools/grep.js +83 -29
- package/dist/core/tools/grep.js.map +1 -1
- package/dist/core/tools/index.d.ts +63 -21
- package/dist/core/tools/index.d.ts.map +1 -1
- package/dist/core/tools/index.js +51 -26
- package/dist/core/tools/index.js.map +1 -1
- package/dist/core/tools/ls.d.ts +9 -3
- package/dist/core/tools/ls.d.ts.map +1 -1
- package/dist/core/tools/ls.js +67 -13
- package/dist/core/tools/ls.js.map +1 -1
- package/dist/core/tools/read.d.ts +10 -3
- package/dist/core/tools/read.d.ts.map +1 -1
- package/dist/core/tools/read.js +110 -51
- package/dist/core/tools/read.js.map +1 -1
- package/dist/core/tools/render-utils.d.ts +21 -0
- package/dist/core/tools/render-utils.d.ts.map +1 -0
- package/dist/core/tools/render-utils.js +49 -0
- package/dist/core/tools/render-utils.js.map +1 -0
- package/dist/core/tools/tool-definition-wrapper.d.ts +14 -0
- package/dist/core/tools/tool-definition-wrapper.d.ts.map +1 -0
- package/dist/core/tools/tool-definition-wrapper.js +32 -0
- package/dist/core/tools/tool-definition-wrapper.js.map +1 -0
- package/dist/core/tools/write.d.ts +9 -3
- package/dist/core/tools/write.d.ts.map +1 -1
- package/dist/core/tools/write.js +168 -30
- package/dist/core/tools/write.js.map +1 -1
- package/dist/index.d.ts +7 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -6
- package/dist/index.js.map +1 -1
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +354 -379
- package/dist/main.js.map +1 -1
- package/dist/migrations.d.ts.map +1 -1
- package/dist/migrations.js +31 -11
- package/dist/migrations.js.map +1 -1
- package/dist/modes/interactive/components/assistant-message.d.ts +3 -1
- package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/assistant-message.js +14 -3
- package/dist/modes/interactive/components/assistant-message.js.map +1 -1
- package/dist/modes/interactive/components/bash-execution.d.ts +0 -1
- package/dist/modes/interactive/components/bash-execution.d.ts.map +1 -1
- package/dist/modes/interactive/components/bash-execution.js +22 -9
- package/dist/modes/interactive/components/bash-execution.js.map +1 -1
- package/dist/modes/interactive/components/bordered-loader.d.ts.map +1 -1
- package/dist/modes/interactive/components/bordered-loader.js +1 -1
- package/dist/modes/interactive/components/bordered-loader.js.map +1 -1
- package/dist/modes/interactive/components/branch-summary-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/branch-summary-message.js +2 -2
- package/dist/modes/interactive/components/branch-summary-message.js.map +1 -1
- package/dist/modes/interactive/components/compaction-summary-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/compaction-summary-message.js +2 -2
- package/dist/modes/interactive/components/compaction-summary-message.js.map +1 -1
- package/dist/modes/interactive/components/config-selector.d.ts +1 -1
- package/dist/modes/interactive/components/config-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/config-selector.js +14 -14
- package/dist/modes/interactive/components/config-selector.js.map +1 -1
- package/dist/modes/interactive/components/custom-editor.d.ts +3 -3
- package/dist/modes/interactive/components/custom-editor.d.ts.map +1 -1
- package/dist/modes/interactive/components/custom-editor.js +6 -6
- package/dist/modes/interactive/components/custom-editor.js.map +1 -1
- package/dist/modes/interactive/components/extension-editor.d.ts +5 -2
- package/dist/modes/interactive/components/extension-editor.d.ts.map +1 -1
- package/dist/modes/interactive/components/extension-editor.js +18 -9
- package/dist/modes/interactive/components/extension-editor.js.map +1 -1
- package/dist/modes/interactive/components/extension-input.d.ts.map +1 -1
- package/dist/modes/interactive/components/extension-input.js +5 -5
- package/dist/modes/interactive/components/extension-input.js.map +1 -1
- package/dist/modes/interactive/components/extension-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/extension-selector.js +8 -8
- package/dist/modes/interactive/components/extension-selector.js.map +1 -1
- package/dist/modes/interactive/components/footer.d.ts +1 -0
- package/dist/modes/interactive/components/footer.d.ts.map +1 -1
- package/dist/modes/interactive/components/footer.js +21 -40
- package/dist/modes/interactive/components/footer.js.map +1 -1
- package/dist/modes/interactive/components/index.d.ts +1 -1
- package/dist/modes/interactive/components/index.d.ts.map +1 -1
- package/dist/modes/interactive/components/index.js +1 -1
- package/dist/modes/interactive/components/index.js.map +1 -1
- package/dist/modes/interactive/components/keybinding-hints.d.ts +3 -36
- package/dist/modes/interactive/components/keybinding-hints.d.ts.map +1 -1
- package/dist/modes/interactive/components/keybinding-hints.js +5 -44
- package/dist/modes/interactive/components/keybinding-hints.js.map +1 -1
- package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
- package/dist/modes/interactive/components/login-dialog.js +7 -7
- package/dist/modes/interactive/components/login-dialog.js.map +1 -1
- package/dist/modes/interactive/components/model-selector.d.ts +1 -1
- package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/model-selector.js +13 -9
- package/dist/modes/interactive/components/model-selector.js.map +1 -1
- package/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/oauth-selector.js +7 -7
- package/dist/modes/interactive/components/oauth-selector.js.map +1 -1
- package/dist/modes/interactive/components/scoped-models-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/scoped-models-selector.js +4 -4
- package/dist/modes/interactive/components/scoped-models-selector.js.map +1 -1
- package/dist/modes/interactive/components/session-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/session-selector.js +33 -36
- package/dist/modes/interactive/components/session-selector.js.map +1 -1
- package/dist/modes/interactive/components/settings-selector.d.ts +5 -0
- package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/settings-selector.js +25 -1
- package/dist/modes/interactive/components/settings-selector.js.map +1 -1
- package/dist/modes/interactive/components/show-images-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/show-images-selector.js +5 -1
- package/dist/modes/interactive/components/show-images-selector.js.map +1 -1
- package/dist/modes/interactive/components/skill-invocation-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/skill-invocation-message.js +2 -2
- package/dist/modes/interactive/components/skill-invocation-message.js.map +1 -1
- package/dist/modes/interactive/components/theme-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/theme-selector.js +5 -1
- package/dist/modes/interactive/components/theme-selector.js.map +1 -1
- package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/thinking-selector.js +5 -1
- package/dist/modes/interactive/components/thinking-selector.js.map +1 -1
- package/dist/modes/interactive/components/tool-execution.d.ts +17 -29
- package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
- package/dist/modes/interactive/components/tool-execution.js +139 -501
- package/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/dist/modes/interactive/components/tree-selector.d.ts +25 -4
- package/dist/modes/interactive/components/tree-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/tree-selector.js +184 -34
- package/dist/modes/interactive/components/tree-selector.js.map +1 -1
- package/dist/modes/interactive/components/user-message-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/user-message-selector.js +6 -6
- package/dist/modes/interactive/components/user-message-selector.js.map +1 -1
- package/dist/modes/interactive/components/user-message.d.ts +1 -0
- package/dist/modes/interactive/components/user-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/user-message.js +12 -0
- package/dist/modes/interactive/components/user-message.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts +25 -17
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +669 -385
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/modes/interactive/theme/theme.d.ts +3 -0
- package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
- package/dist/modes/interactive/theme/theme.js +83 -48
- package/dist/modes/interactive/theme/theme.js.map +1 -1
- package/dist/modes/print-mode.d.ts +2 -2
- package/dist/modes/print-mode.d.ts.map +1 -1
- package/dist/modes/print-mode.js +90 -79
- package/dist/modes/print-mode.js.map +1 -1
- package/dist/modes/rpc/jsonl.d.ts +17 -0
- package/dist/modes/rpc/jsonl.d.ts.map +1 -0
- package/dist/modes/rpc/jsonl.js +49 -0
- package/dist/modes/rpc/jsonl.js.map +1 -0
- package/dist/modes/rpc/rpc-client.d.ts +1 -1
- package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-client.js +8 -11
- package/dist/modes/rpc/rpc-client.js.map +1 -1
- package/dist/modes/rpc/rpc-mode.d.ts +2 -2
- package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-mode.js +130 -87
- package/dist/modes/rpc/rpc-mode.js.map +1 -1
- package/dist/modes/rpc/rpc-types.d.ts +3 -4
- package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-types.js.map +1 -1
- package/dist/package-manager-cli.d.ts +4 -0
- package/dist/package-manager-cli.d.ts.map +1 -0
- package/dist/package-manager-cli.js +234 -0
- package/dist/package-manager-cli.js.map +1 -0
- package/dist/utils/child-process.d.ts +11 -0
- package/dist/utils/child-process.d.ts.map +1 -0
- package/dist/utils/child-process.js +78 -0
- package/dist/utils/child-process.js.map +1 -0
- package/dist/utils/clipboard-image.d.ts.map +1 -1
- package/dist/utils/clipboard-image.js +94 -11
- package/dist/utils/clipboard-image.js.map +1 -1
- package/dist/utils/clipboard-native.d.ts +1 -0
- package/dist/utils/clipboard-native.d.ts.map +1 -1
- package/dist/utils/clipboard-native.js.map +1 -1
- package/dist/utils/clipboard.d.ts +1 -1
- package/dist/utils/clipboard.d.ts.map +1 -1
- package/dist/utils/clipboard.js +27 -16
- package/dist/utils/clipboard.js.map +1 -1
- package/dist/utils/exif-orientation.d.ts +5 -0
- package/dist/utils/exif-orientation.d.ts.map +1 -0
- package/dist/utils/exif-orientation.js +158 -0
- package/dist/utils/exif-orientation.js.map +1 -0
- package/dist/utils/git.d.ts +5 -1
- package/dist/utils/git.d.ts.map +1 -1
- package/dist/utils/git.js +14 -3
- package/dist/utils/git.js.map +1 -1
- package/dist/utils/image-convert.d.ts.map +1 -1
- package/dist/utils/image-convert.js +5 -1
- package/dist/utils/image-convert.js.map +1 -1
- package/dist/utils/image-resize.d.ts +5 -5
- package/dist/utils/image-resize.d.ts.map +1 -1
- package/dist/utils/image-resize.js +51 -95
- package/dist/utils/image-resize.js.map +1 -1
- package/dist/utils/paths.d.ts +7 -0
- package/dist/utils/paths.d.ts.map +1 -0
- package/dist/utils/paths.js +19 -0
- package/dist/utils/paths.js.map +1 -0
- package/dist/utils/tools-manager.d.ts.map +1 -1
- package/dist/utils/tools-manager.js +67 -22
- package/dist/utils/tools-manager.js.map +1 -1
- package/docs/compaction.md +6 -2
- package/docs/custom-provider.md +57 -9
- package/docs/development.md +3 -1
- package/docs/extensions.md +437 -67
- package/docs/json.md +5 -2
- package/docs/keybindings.md +108 -107
- package/docs/models.md +50 -2
- package/docs/packages.md +17 -10
- package/docs/prompt-templates.md +6 -6
- package/docs/providers.md +10 -1
- package/docs/rpc.md +78 -18
- package/docs/sdk.md +261 -96
- package/docs/settings.md +28 -3
- package/docs/skills.md +9 -4
- package/docs/terminal-setup.md +39 -3
- package/docs/tmux.md +61 -0
- package/docs/tree.md +15 -3
- package/docs/tui.md +2 -2
- package/examples/extensions/README.md +3 -0
- package/examples/extensions/antigravity-image-gen.ts +12 -7
- package/examples/extensions/built-in-tool-renderer.ts +246 -0
- package/examples/extensions/commands.ts +3 -3
- package/examples/extensions/custom-compaction.ts +17 -4
- package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
- package/examples/extensions/custom-provider-anthropic/package.json +1 -1
- package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
- package/examples/extensions/custom-provider-gitlab-duo/test.ts +2 -2
- package/examples/extensions/custom-provider-qwen-cli/package.json +1 -1
- package/examples/extensions/doom-overlay/doom/build.sh +2 -2
- package/examples/extensions/dynamic-tools.ts +74 -0
- package/examples/extensions/handoff.ts +5 -2
- package/examples/extensions/hello.ts +18 -17
- package/examples/extensions/hidden-thinking-label.ts +53 -0
- package/examples/extensions/minimal-mode.ts +14 -14
- package/examples/extensions/overlay-qa-tests.ts +468 -1
- package/examples/extensions/preset.ts +2 -3
- package/examples/extensions/provider-payload.ts +14 -0
- package/examples/extensions/qna.ts +5 -2
- package/examples/extensions/question.ts +2 -2
- package/examples/extensions/questionnaire.ts +2 -2
- package/examples/extensions/rpc-demo.ts +3 -9
- package/examples/extensions/sandbox/index.ts +6 -3
- package/examples/extensions/status-line.ts +0 -8
- package/examples/extensions/subagent/README.md +4 -4
- package/examples/extensions/subagent/agents.ts +2 -3
- package/examples/extensions/subagent/index.ts +30 -8
- package/examples/extensions/summarize.ts +15 -4
- package/examples/extensions/todo.ts +2 -4
- package/examples/extensions/tool-override.ts +10 -9
- package/examples/extensions/tools.ts +0 -5
- package/examples/extensions/trigger-compact.ts +11 -1
- package/examples/extensions/truncated-tool.ts +8 -5
- package/examples/extensions/widget-placement.ts +4 -12
- package/examples/extensions/with-deps/index.ts +1 -5
- package/examples/extensions/with-deps/package-lock.json +2 -2
- package/examples/extensions/with-deps/package.json +1 -1
- package/examples/sdk/02-custom-model.ts +2 -2
- package/examples/sdk/04-skills.ts +8 -2
- package/examples/sdk/08-prompt-templates.ts +4 -3
- package/examples/sdk/09-api-keys-and-oauth.ts +5 -5
- package/examples/sdk/10-settings.ts +13 -0
- package/examples/sdk/12-full-control.ts +2 -3
- package/examples/sdk/13-session-runtime.ts +67 -0
- package/examples/sdk/README.md +10 -7
- package/package.json +98 -94
- /package/examples/extensions/subagent/{commands → prompts}/implement-and-review.md +0 -0
- /package/examples/extensions/subagent/{commands → prompts}/implement.md +0 -0
- /package/examples/extensions/subagent/{commands → prompts}/scout-and-plan.md +0 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { Container,
|
|
1
|
+
import { Container, getKeybindings, Input, matchesKey, Spacer, Text, TruncatedText, truncateToWidth, } from "@mariozechner/pi-tui";
|
|
2
2
|
import { theme } from "../theme/theme.js";
|
|
3
3
|
import { DynamicBorder } from "./dynamic-border.js";
|
|
4
|
-
import { keyHint } from "./keybinding-hints.js";
|
|
4
|
+
import { keyHint, keyText } from "./keybinding-hints.js";
|
|
5
5
|
class TreeList {
|
|
6
6
|
flatNodes = [];
|
|
7
7
|
filteredNodes = [];
|
|
@@ -12,14 +12,19 @@ class TreeList {
|
|
|
12
12
|
searchQuery = "";
|
|
13
13
|
toolCallMap = new Map();
|
|
14
14
|
multipleRoots = false;
|
|
15
|
+
showLabelTimestamps = false;
|
|
15
16
|
activePathIds = new Set();
|
|
17
|
+
visibleParentMap = new Map();
|
|
18
|
+
visibleChildrenMap = new Map();
|
|
16
19
|
lastSelectedId = null;
|
|
20
|
+
foldedNodes = new Set();
|
|
17
21
|
onSelect;
|
|
18
22
|
onCancel;
|
|
19
23
|
onLabelEdit;
|
|
20
|
-
constructor(tree, currentLeafId, maxVisibleLines, initialSelectedId) {
|
|
24
|
+
constructor(tree, currentLeafId, maxVisibleLines, initialSelectedId, initialFilterMode) {
|
|
21
25
|
this.currentLeafId = currentLeafId;
|
|
22
26
|
this.maxVisibleLines = maxVisibleLines;
|
|
27
|
+
this.filterMode = initialFilterMode ?? "default";
|
|
23
28
|
this.multipleRoots = tree.length > 1;
|
|
24
29
|
this.flatNodes = this.flattenTree(tree);
|
|
25
30
|
this.buildActivePath();
|
|
@@ -217,7 +222,8 @@ class TreeList {
|
|
|
217
222
|
const isSettingsEntry = entry.type === "label" ||
|
|
218
223
|
entry.type === "custom" ||
|
|
219
224
|
entry.type === "model_change" ||
|
|
220
|
-
entry.type === "thinking_level_change"
|
|
225
|
+
entry.type === "thinking_level_change" ||
|
|
226
|
+
entry.type === "session_info";
|
|
221
227
|
switch (this.filterMode) {
|
|
222
228
|
case "user-only":
|
|
223
229
|
// Just user messages
|
|
@@ -249,6 +255,17 @@ class TreeList {
|
|
|
249
255
|
}
|
|
250
256
|
return true;
|
|
251
257
|
});
|
|
258
|
+
// Filter out descendants of folded nodes.
|
|
259
|
+
if (this.foldedNodes.size > 0) {
|
|
260
|
+
const skipSet = new Set();
|
|
261
|
+
for (const flatNode of this.flatNodes) {
|
|
262
|
+
const { id, parentId } = flatNode.node.entry;
|
|
263
|
+
if (parentId != null && (this.foldedNodes.has(parentId) || skipSet.has(parentId))) {
|
|
264
|
+
skipSet.add(id);
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
this.filteredNodes = this.filteredNodes.filter((flatNode) => !skipSet.has(flatNode.node.entry.id));
|
|
268
|
+
}
|
|
252
269
|
// Recalculate visual structure (indent, connectors, gutters) based on visible tree
|
|
253
270
|
this.recalculateVisualStructure();
|
|
254
271
|
// Try to preserve cursor on the same node, or find nearest visible ancestor
|
|
@@ -373,6 +390,9 @@ class TreeList {
|
|
|
373
390
|
]);
|
|
374
391
|
}
|
|
375
392
|
}
|
|
393
|
+
// Store visible tree maps for ancestor/descendant lookups in navigation
|
|
394
|
+
this.visibleParentMap = visibleParent;
|
|
395
|
+
this.visibleChildrenMap = visibleChildren;
|
|
376
396
|
}
|
|
377
397
|
/** Get searchable text content from a node */
|
|
378
398
|
getSearchableText(node) {
|
|
@@ -411,6 +431,11 @@ class TreeList {
|
|
|
411
431
|
case "branch_summary":
|
|
412
432
|
parts.push("branch summary", entry.summary);
|
|
413
433
|
break;
|
|
434
|
+
case "session_info":
|
|
435
|
+
parts.push("title");
|
|
436
|
+
if (entry.name)
|
|
437
|
+
parts.push(entry.name);
|
|
438
|
+
break;
|
|
414
439
|
case "model_change":
|
|
415
440
|
parts.push("model", entry.modelId);
|
|
416
441
|
break;
|
|
@@ -433,33 +458,41 @@ class TreeList {
|
|
|
433
458
|
getSelectedNode() {
|
|
434
459
|
return this.filteredNodes[this.selectedIndex]?.node;
|
|
435
460
|
}
|
|
436
|
-
updateNodeLabel(entryId, label) {
|
|
461
|
+
updateNodeLabel(entryId, label, labelTimestamp) {
|
|
437
462
|
for (const flatNode of this.flatNodes) {
|
|
438
463
|
if (flatNode.node.entry.id === entryId) {
|
|
439
464
|
flatNode.node.label = label;
|
|
465
|
+
flatNode.node.labelTimestamp = label ? (labelTimestamp ?? new Date().toISOString()) : undefined;
|
|
440
466
|
break;
|
|
441
467
|
}
|
|
442
468
|
}
|
|
443
469
|
}
|
|
444
|
-
|
|
470
|
+
getStatusLabels() {
|
|
471
|
+
let labels = "";
|
|
445
472
|
switch (this.filterMode) {
|
|
446
473
|
case "no-tools":
|
|
447
|
-
|
|
474
|
+
labels += " [no-tools]";
|
|
475
|
+
break;
|
|
448
476
|
case "user-only":
|
|
449
|
-
|
|
477
|
+
labels += " [user]";
|
|
478
|
+
break;
|
|
450
479
|
case "labeled-only":
|
|
451
|
-
|
|
480
|
+
labels += " [labeled]";
|
|
481
|
+
break;
|
|
452
482
|
case "all":
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
483
|
+
labels += " [all]";
|
|
484
|
+
break;
|
|
485
|
+
}
|
|
486
|
+
if (this.showLabelTimestamps) {
|
|
487
|
+
labels += " [+label time]";
|
|
456
488
|
}
|
|
489
|
+
return labels;
|
|
457
490
|
}
|
|
458
491
|
render(width) {
|
|
459
492
|
const lines = [];
|
|
460
493
|
if (this.filteredNodes.length === 0) {
|
|
461
494
|
lines.push(truncateToWidth(theme.fg("muted", " No entries found"), width));
|
|
462
|
-
lines.push(truncateToWidth(theme.fg("muted", ` (0/0)${this.
|
|
495
|
+
lines.push(truncateToWidth(theme.fg("muted", ` (0/0)${this.getStatusLabels()}`), width));
|
|
463
496
|
return lines;
|
|
464
497
|
}
|
|
465
498
|
const startIndex = Math.max(0, Math.min(this.selectedIndex - Math.floor(this.maxVisibleLines / 2), this.filteredNodes.length - this.maxVisibleLines));
|
|
@@ -479,6 +512,7 @@ class TreeList {
|
|
|
479
512
|
// Build prefix char by char, placing gutters and connector at their positions
|
|
480
513
|
const totalChars = displayIndent * 3;
|
|
481
514
|
const prefixChars = [];
|
|
515
|
+
const isFolded = this.foldedNodes.has(entry.id);
|
|
482
516
|
for (let i = 0; i < totalChars; i++) {
|
|
483
517
|
const level = Math.floor(i / 3);
|
|
484
518
|
const posInLevel = i % 3;
|
|
@@ -493,12 +527,13 @@ class TreeList {
|
|
|
493
527
|
}
|
|
494
528
|
}
|
|
495
529
|
else if (connector && level === connectorPosition) {
|
|
496
|
-
// Connector at this level
|
|
530
|
+
// Connector at this level, with fold indicator
|
|
497
531
|
if (posInLevel === 0) {
|
|
498
532
|
prefixChars.push(flatNode.isLast ? "└" : "├");
|
|
499
533
|
}
|
|
500
534
|
else if (posInLevel === 1) {
|
|
501
|
-
|
|
535
|
+
const foldable = this.isFoldable(entry.id);
|
|
536
|
+
prefixChars.push(isFolded ? "⊞" : foldable ? "⊟" : "─");
|
|
502
537
|
}
|
|
503
538
|
else {
|
|
504
539
|
prefixChars.push(" ");
|
|
@@ -509,18 +544,24 @@ class TreeList {
|
|
|
509
544
|
}
|
|
510
545
|
}
|
|
511
546
|
const prefix = prefixChars.join("");
|
|
547
|
+
// Fold marker for nodes without connectors (roots)
|
|
548
|
+
const showsFoldInConnector = flatNode.showConnector && !flatNode.isVirtualRootChild;
|
|
549
|
+
const foldMarker = isFolded && !showsFoldInConnector ? theme.fg("accent", "⊞ ") : "";
|
|
512
550
|
// Active path marker - shown right before the entry text
|
|
513
551
|
const isOnActivePath = this.activePathIds.has(entry.id);
|
|
514
552
|
const pathMarker = isOnActivePath ? theme.fg("accent", "• ") : "";
|
|
515
553
|
const label = flatNode.node.label ? theme.fg("warning", `[${flatNode.node.label}] `) : "";
|
|
554
|
+
const labelTimestamp = this.showLabelTimestamps && flatNode.node.label && flatNode.node.labelTimestamp
|
|
555
|
+
? theme.fg("muted", `${this.formatLabelTimestamp(flatNode.node.labelTimestamp)} `)
|
|
556
|
+
: "";
|
|
516
557
|
const content = this.getEntryDisplayText(flatNode.node, isSelected);
|
|
517
|
-
let line = cursor + theme.fg("dim", prefix) + pathMarker + label + content;
|
|
558
|
+
let line = cursor + theme.fg("dim", prefix) + foldMarker + pathMarker + label + labelTimestamp + content;
|
|
518
559
|
if (isSelected) {
|
|
519
560
|
line = theme.bg("selectedBg", line);
|
|
520
561
|
}
|
|
521
562
|
lines.push(truncateToWidth(line, width));
|
|
522
563
|
}
|
|
523
|
-
lines.push(truncateToWidth(theme.fg("muted", ` (${this.selectedIndex + 1}/${this.filteredNodes.length})${this.
|
|
564
|
+
lines.push(truncateToWidth(theme.fg("muted", ` (${this.selectedIndex + 1}/${this.filteredNodes.length})${this.getStatusLabels()}`), width));
|
|
524
565
|
return lines;
|
|
525
566
|
}
|
|
526
567
|
getEntryDisplayText(node, isSelected) {
|
|
@@ -602,11 +643,35 @@ class TreeList {
|
|
|
602
643
|
case "label":
|
|
603
644
|
result = theme.fg("dim", `[label: ${entry.label ?? "(cleared)"}]`);
|
|
604
645
|
break;
|
|
646
|
+
case "session_info":
|
|
647
|
+
result = entry.name
|
|
648
|
+
? [theme.fg("dim", "[title: "), theme.fg("dim", entry.name), theme.fg("dim", "]")].join("")
|
|
649
|
+
: [theme.fg("dim", "[title: "), theme.italic(theme.fg("dim", "empty")), theme.fg("dim", "]")].join("");
|
|
650
|
+
break;
|
|
605
651
|
default:
|
|
606
652
|
result = "";
|
|
607
653
|
}
|
|
608
654
|
return isSelected ? theme.bold(result) : result;
|
|
609
655
|
}
|
|
656
|
+
formatLabelTimestamp(timestamp) {
|
|
657
|
+
const date = new Date(timestamp);
|
|
658
|
+
const now = new Date();
|
|
659
|
+
const hours = date.getHours().toString().padStart(2, "0");
|
|
660
|
+
const minutes = date.getMinutes().toString().padStart(2, "0");
|
|
661
|
+
const time = `${hours}:${minutes}`;
|
|
662
|
+
if (date.getFullYear() === now.getFullYear() &&
|
|
663
|
+
date.getMonth() === now.getMonth() &&
|
|
664
|
+
date.getDate() === now.getDate()) {
|
|
665
|
+
return time;
|
|
666
|
+
}
|
|
667
|
+
const month = date.getMonth() + 1;
|
|
668
|
+
const day = date.getDate();
|
|
669
|
+
if (date.getFullYear() === now.getFullYear()) {
|
|
670
|
+
return `${month}/${day} ${time}`;
|
|
671
|
+
}
|
|
672
|
+
const year = date.getFullYear().toString().slice(-2);
|
|
673
|
+
return `${year}/${month}/${day} ${time}`;
|
|
674
|
+
}
|
|
610
675
|
extractContent(content) {
|
|
611
676
|
const maxLen = 200;
|
|
612
677
|
if (typeof content === "string")
|
|
@@ -696,30 +761,51 @@ class TreeList {
|
|
|
696
761
|
}
|
|
697
762
|
}
|
|
698
763
|
handleInput(keyData) {
|
|
699
|
-
const kb =
|
|
700
|
-
if (kb.matches(keyData, "
|
|
764
|
+
const kb = getKeybindings();
|
|
765
|
+
if (kb.matches(keyData, "tui.select.up")) {
|
|
701
766
|
this.selectedIndex = this.selectedIndex === 0 ? this.filteredNodes.length - 1 : this.selectedIndex - 1;
|
|
702
767
|
}
|
|
703
|
-
else if (kb.matches(keyData, "
|
|
768
|
+
else if (kb.matches(keyData, "tui.select.down")) {
|
|
704
769
|
this.selectedIndex = this.selectedIndex === this.filteredNodes.length - 1 ? 0 : this.selectedIndex + 1;
|
|
705
770
|
}
|
|
706
|
-
else if (kb.matches(keyData, "
|
|
771
|
+
else if (kb.matches(keyData, "app.tree.foldOrUp")) {
|
|
772
|
+
const currentId = this.filteredNodes[this.selectedIndex]?.node.entry.id;
|
|
773
|
+
if (currentId && this.isFoldable(currentId) && !this.foldedNodes.has(currentId)) {
|
|
774
|
+
this.foldedNodes.add(currentId);
|
|
775
|
+
this.applyFilter();
|
|
776
|
+
}
|
|
777
|
+
else {
|
|
778
|
+
this.selectedIndex = this.findBranchSegmentStart("up");
|
|
779
|
+
}
|
|
780
|
+
}
|
|
781
|
+
else if (kb.matches(keyData, "app.tree.unfoldOrDown")) {
|
|
782
|
+
const currentId = this.filteredNodes[this.selectedIndex]?.node.entry.id;
|
|
783
|
+
if (currentId && this.foldedNodes.has(currentId)) {
|
|
784
|
+
this.foldedNodes.delete(currentId);
|
|
785
|
+
this.applyFilter();
|
|
786
|
+
}
|
|
787
|
+
else {
|
|
788
|
+
this.selectedIndex = this.findBranchSegmentStart("down");
|
|
789
|
+
}
|
|
790
|
+
}
|
|
791
|
+
else if (kb.matches(keyData, "tui.editor.cursorLeft") || kb.matches(keyData, "tui.select.pageUp")) {
|
|
707
792
|
// Page up
|
|
708
793
|
this.selectedIndex = Math.max(0, this.selectedIndex - this.maxVisibleLines);
|
|
709
794
|
}
|
|
710
|
-
else if (kb.matches(keyData, "cursorRight")) {
|
|
795
|
+
else if (kb.matches(keyData, "tui.editor.cursorRight") || kb.matches(keyData, "tui.select.pageDown")) {
|
|
711
796
|
// Page down
|
|
712
797
|
this.selectedIndex = Math.min(this.filteredNodes.length - 1, this.selectedIndex + this.maxVisibleLines);
|
|
713
798
|
}
|
|
714
|
-
else if (kb.matches(keyData, "
|
|
799
|
+
else if (kb.matches(keyData, "tui.select.confirm")) {
|
|
715
800
|
const selected = this.filteredNodes[this.selectedIndex];
|
|
716
801
|
if (selected && this.onSelect) {
|
|
717
802
|
this.onSelect(selected.node.entry.id);
|
|
718
803
|
}
|
|
719
804
|
}
|
|
720
|
-
else if (kb.matches(keyData, "
|
|
805
|
+
else if (kb.matches(keyData, "tui.select.cancel")) {
|
|
721
806
|
if (this.searchQuery) {
|
|
722
807
|
this.searchQuery = "";
|
|
808
|
+
this.foldedNodes.clear();
|
|
723
809
|
this.applyFilter();
|
|
724
810
|
}
|
|
725
811
|
else {
|
|
@@ -729,26 +815,31 @@ class TreeList {
|
|
|
729
815
|
else if (matchesKey(keyData, "ctrl+d")) {
|
|
730
816
|
// Direct filter: default
|
|
731
817
|
this.filterMode = "default";
|
|
818
|
+
this.foldedNodes.clear();
|
|
732
819
|
this.applyFilter();
|
|
733
820
|
}
|
|
734
821
|
else if (matchesKey(keyData, "ctrl+t")) {
|
|
735
822
|
// Toggle filter: no-tools ↔ default
|
|
736
823
|
this.filterMode = this.filterMode === "no-tools" ? "default" : "no-tools";
|
|
824
|
+
this.foldedNodes.clear();
|
|
737
825
|
this.applyFilter();
|
|
738
826
|
}
|
|
739
827
|
else if (matchesKey(keyData, "ctrl+u")) {
|
|
740
828
|
// Toggle filter: user-only ↔ default
|
|
741
829
|
this.filterMode = this.filterMode === "user-only" ? "default" : "user-only";
|
|
830
|
+
this.foldedNodes.clear();
|
|
742
831
|
this.applyFilter();
|
|
743
832
|
}
|
|
744
833
|
else if (matchesKey(keyData, "ctrl+l")) {
|
|
745
834
|
// Toggle filter: labeled-only ↔ default
|
|
746
835
|
this.filterMode = this.filterMode === "labeled-only" ? "default" : "labeled-only";
|
|
836
|
+
this.foldedNodes.clear();
|
|
747
837
|
this.applyFilter();
|
|
748
838
|
}
|
|
749
839
|
else if (matchesKey(keyData, "ctrl+a")) {
|
|
750
840
|
// Toggle filter: all ↔ default
|
|
751
841
|
this.filterMode = this.filterMode === "all" ? "default" : "all";
|
|
842
|
+
this.foldedNodes.clear();
|
|
752
843
|
this.applyFilter();
|
|
753
844
|
}
|
|
754
845
|
else if (matchesKey(keyData, "shift+ctrl+o")) {
|
|
@@ -756,6 +847,7 @@ class TreeList {
|
|
|
756
847
|
const modes = ["default", "no-tools", "user-only", "labeled-only", "all"];
|
|
757
848
|
const currentIndex = modes.indexOf(this.filterMode);
|
|
758
849
|
this.filterMode = modes[(currentIndex - 1 + modes.length) % modes.length];
|
|
850
|
+
this.foldedNodes.clear();
|
|
759
851
|
this.applyFilter();
|
|
760
852
|
}
|
|
761
853
|
else if (matchesKey(keyData, "ctrl+o")) {
|
|
@@ -763,20 +855,25 @@ class TreeList {
|
|
|
763
855
|
const modes = ["default", "no-tools", "user-only", "labeled-only", "all"];
|
|
764
856
|
const currentIndex = modes.indexOf(this.filterMode);
|
|
765
857
|
this.filterMode = modes[(currentIndex + 1) % modes.length];
|
|
858
|
+
this.foldedNodes.clear();
|
|
766
859
|
this.applyFilter();
|
|
767
860
|
}
|
|
768
|
-
else if (kb.matches(keyData, "deleteCharBackward")) {
|
|
861
|
+
else if (kb.matches(keyData, "tui.editor.deleteCharBackward")) {
|
|
769
862
|
if (this.searchQuery.length > 0) {
|
|
770
863
|
this.searchQuery = this.searchQuery.slice(0, -1);
|
|
864
|
+
this.foldedNodes.clear();
|
|
771
865
|
this.applyFilter();
|
|
772
866
|
}
|
|
773
867
|
}
|
|
774
|
-
else if (
|
|
868
|
+
else if (kb.matches(keyData, "app.tree.editLabel")) {
|
|
775
869
|
const selected = this.filteredNodes[this.selectedIndex];
|
|
776
870
|
if (selected && this.onLabelEdit) {
|
|
777
871
|
this.onLabelEdit(selected.node.entry.id, selected.node.label);
|
|
778
872
|
}
|
|
779
873
|
}
|
|
874
|
+
else if (kb.matches(keyData, "app.tree.toggleLabelTimestamp")) {
|
|
875
|
+
this.showLabelTimestamps = !this.showLabelTimestamps;
|
|
876
|
+
}
|
|
780
877
|
else {
|
|
781
878
|
const hasControlChars = [...keyData].some((ch) => {
|
|
782
879
|
const code = ch.charCodeAt(0);
|
|
@@ -784,10 +881,64 @@ class TreeList {
|
|
|
784
881
|
});
|
|
785
882
|
if (!hasControlChars && keyData.length > 0) {
|
|
786
883
|
this.searchQuery += keyData;
|
|
884
|
+
this.foldedNodes.clear();
|
|
787
885
|
this.applyFilter();
|
|
788
886
|
}
|
|
789
887
|
}
|
|
790
888
|
}
|
|
889
|
+
/**
|
|
890
|
+
* Whether a node can be folded. A node is foldable if it has visible children
|
|
891
|
+
* and is either a root (no visible parent) or a segment start (visible parent
|
|
892
|
+
* has multiple visible children).
|
|
893
|
+
*/
|
|
894
|
+
isFoldable(entryId) {
|
|
895
|
+
const children = this.visibleChildrenMap.get(entryId);
|
|
896
|
+
if (!children || children.length === 0)
|
|
897
|
+
return false;
|
|
898
|
+
const parentId = this.visibleParentMap.get(entryId);
|
|
899
|
+
if (parentId === null || parentId === undefined)
|
|
900
|
+
return true;
|
|
901
|
+
const siblings = this.visibleChildrenMap.get(parentId);
|
|
902
|
+
return siblings !== undefined && siblings.length > 1;
|
|
903
|
+
}
|
|
904
|
+
/**
|
|
905
|
+
* Find the index of the next branch segment start in the given direction.
|
|
906
|
+
* A segment start is the first child of a branch point.
|
|
907
|
+
*
|
|
908
|
+
* "up" walks the visible parent chain; "down" walks visible children
|
|
909
|
+
* (always following the first child).
|
|
910
|
+
*/
|
|
911
|
+
findBranchSegmentStart(direction) {
|
|
912
|
+
const selectedId = this.filteredNodes[this.selectedIndex]?.node.entry.id;
|
|
913
|
+
if (!selectedId)
|
|
914
|
+
return this.selectedIndex;
|
|
915
|
+
const indexByEntryId = new Map(this.filteredNodes.map((node, i) => [node.node.entry.id, i]));
|
|
916
|
+
let currentId = selectedId;
|
|
917
|
+
if (direction === "down") {
|
|
918
|
+
while (true) {
|
|
919
|
+
const children = this.visibleChildrenMap.get(currentId) ?? [];
|
|
920
|
+
if (children.length === 0)
|
|
921
|
+
return indexByEntryId.get(currentId);
|
|
922
|
+
if (children.length > 1)
|
|
923
|
+
return indexByEntryId.get(children[0]);
|
|
924
|
+
currentId = children[0];
|
|
925
|
+
}
|
|
926
|
+
}
|
|
927
|
+
// direction === "up"
|
|
928
|
+
while (true) {
|
|
929
|
+
const parentId = this.visibleParentMap.get(currentId) ?? null;
|
|
930
|
+
if (parentId === null)
|
|
931
|
+
return indexByEntryId.get(currentId);
|
|
932
|
+
const children = this.visibleChildrenMap.get(parentId) ?? [];
|
|
933
|
+
if (children.length > 1) {
|
|
934
|
+
const segmentStart = indexByEntryId.get(currentId);
|
|
935
|
+
if (segmentStart < this.selectedIndex) {
|
|
936
|
+
return segmentStart;
|
|
937
|
+
}
|
|
938
|
+
}
|
|
939
|
+
currentId = parentId;
|
|
940
|
+
}
|
|
941
|
+
}
|
|
791
942
|
}
|
|
792
943
|
/** Component that displays the current search query */
|
|
793
944
|
class SearchLine {
|
|
@@ -834,16 +985,16 @@ class LabelInput {
|
|
|
834
985
|
const availableWidth = width - indent.length;
|
|
835
986
|
lines.push(truncateToWidth(`${indent}${theme.fg("muted", "Label (empty to remove):")}`, width));
|
|
836
987
|
lines.push(...this.input.render(availableWidth).map((line) => truncateToWidth(`${indent}${line}`, width)));
|
|
837
|
-
lines.push(truncateToWidth(`${indent}${keyHint("
|
|
988
|
+
lines.push(truncateToWidth(`${indent}${keyHint("tui.select.confirm", "save")} ${keyHint("tui.select.cancel", "cancel")}`, width));
|
|
838
989
|
return lines;
|
|
839
990
|
}
|
|
840
991
|
handleInput(keyData) {
|
|
841
|
-
const kb =
|
|
842
|
-
if (kb.matches(keyData, "
|
|
992
|
+
const kb = getKeybindings();
|
|
993
|
+
if (kb.matches(keyData, "tui.select.confirm")) {
|
|
843
994
|
const value = this.input.getValue().trim();
|
|
844
995
|
this.onSubmit?.(this.entryId, value || undefined);
|
|
845
996
|
}
|
|
846
|
-
else if (kb.matches(keyData, "
|
|
997
|
+
else if (kb.matches(keyData, "tui.select.cancel")) {
|
|
847
998
|
this.onCancel?.();
|
|
848
999
|
}
|
|
849
1000
|
else {
|
|
@@ -872,11 +1023,11 @@ export class TreeSelectorComponent extends Container {
|
|
|
872
1023
|
this.labelInput.focused = value;
|
|
873
1024
|
}
|
|
874
1025
|
}
|
|
875
|
-
constructor(tree, currentLeafId, terminalHeight, onSelect, onCancel, onLabelChange, initialSelectedId) {
|
|
1026
|
+
constructor(tree, currentLeafId, terminalHeight, onSelect, onCancel, onLabelChange, initialSelectedId, initialFilterMode) {
|
|
876
1027
|
super();
|
|
877
1028
|
this.onLabelChangeCallback = onLabelChange;
|
|
878
1029
|
const maxVisibleLines = Math.max(5, Math.floor(terminalHeight / 2));
|
|
879
|
-
this.treeList = new TreeList(tree, currentLeafId, maxVisibleLines, initialSelectedId);
|
|
1030
|
+
this.treeList = new TreeList(tree, currentLeafId, maxVisibleLines, initialSelectedId, initialFilterMode);
|
|
880
1031
|
this.treeList.onSelect = onSelect;
|
|
881
1032
|
this.treeList.onCancel = onCancel;
|
|
882
1033
|
this.treeList.onLabelEdit = (entryId, currentLabel) => this.showLabelInput(entryId, currentLabel);
|
|
@@ -886,8 +1037,7 @@ export class TreeSelectorComponent extends Container {
|
|
|
886
1037
|
this.addChild(new Spacer(1));
|
|
887
1038
|
this.addChild(new DynamicBorder());
|
|
888
1039
|
this.addChild(new Text(theme.bold(" Session Tree"), 1, 0));
|
|
889
|
-
this.addChild(new TruncatedText(theme.fg("muted",
|
|
890
|
-
theme.fg("muted", "^D/^T/^U/^L/^A: filters (^O/⇧^O cycle)"), 0, 0));
|
|
1040
|
+
this.addChild(new TruncatedText(theme.fg("muted", ` ↑/↓: move. ←/→: page. ^←/^→ or Alt+←/Alt+→: fold/branch. ${keyText("app.tree.editLabel")}: label. ^D/^T/^U/^L/^A: filters (^O/⇧^O cycle). ${keyText("app.tree.toggleLabelTimestamp")}: label time`), 0, 0));
|
|
891
1041
|
this.addChild(new SearchLine(this.treeList));
|
|
892
1042
|
this.addChild(new DynamicBorder());
|
|
893
1043
|
this.addChild(new Spacer(1));
|