@imdigitalashish/zpi 0.1.1
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 +2801 -0
- package/README.md +95 -0
- package/dist/cli/args.d.ts +47 -0
- package/dist/cli/args.d.ts.map +1 -0
- package/dist/cli/args.js +293 -0
- package/dist/cli/args.js.map +1 -0
- package/dist/cli/config-selector.d.ts +14 -0
- package/dist/cli/config-selector.d.ts.map +1 -0
- package/dist/cli/config-selector.js +31 -0
- package/dist/cli/config-selector.js.map +1 -0
- package/dist/cli/file-processor.d.ts +15 -0
- package/dist/cli/file-processor.d.ts.map +1 -0
- package/dist/cli/file-processor.js +79 -0
- package/dist/cli/file-processor.js.map +1 -0
- package/dist/cli/list-models.d.ts +9 -0
- package/dist/cli/list-models.d.ts.map +1 -0
- package/dist/cli/list-models.js +92 -0
- package/dist/cli/list-models.js.map +1 -0
- package/dist/cli/session-picker.d.ts +9 -0
- package/dist/cli/session-picker.d.ts.map +1 -0
- package/dist/cli/session-picker.js +34 -0
- package/dist/cli/session-picker.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +11 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +68 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +203 -0
- package/dist/config.js.map +1 -0
- package/dist/core/agent-session.d.ts +571 -0
- package/dist/core/agent-session.d.ts.map +1 -0
- package/dist/core/agent-session.js +2353 -0
- package/dist/core/agent-session.js.map +1 -0
- package/dist/core/auth-storage.d.ts +129 -0
- package/dist/core/auth-storage.d.ts.map +1 -0
- package/dist/core/auth-storage.js +394 -0
- package/dist/core/auth-storage.js.map +1 -0
- package/dist/core/bash-executor.d.ts +47 -0
- package/dist/core/bash-executor.d.ts.map +1 -0
- package/dist/core/bash-executor.js +212 -0
- package/dist/core/bash-executor.js.map +1 -0
- package/dist/core/compaction/branch-summarization.d.ts +86 -0
- package/dist/core/compaction/branch-summarization.d.ts.map +1 -0
- package/dist/core/compaction/branch-summarization.js +242 -0
- package/dist/core/compaction/branch-summarization.js.map +1 -0
- package/dist/core/compaction/compaction.d.ts +121 -0
- package/dist/core/compaction/compaction.d.ts.map +1 -0
- package/dist/core/compaction/compaction.js +607 -0
- package/dist/core/compaction/compaction.js.map +1 -0
- package/dist/core/compaction/index.d.ts +7 -0
- package/dist/core/compaction/index.d.ts.map +1 -0
- package/dist/core/compaction/index.js +7 -0
- package/dist/core/compaction/index.js.map +1 -0
- package/dist/core/compaction/utils.d.ts +35 -0
- package/dist/core/compaction/utils.d.ts.map +1 -0
- package/dist/core/compaction/utils.js +138 -0
- package/dist/core/compaction/utils.js.map +1 -0
- package/dist/core/defaults.d.ts +3 -0
- package/dist/core/defaults.d.ts.map +1 -0
- package/dist/core/defaults.js +2 -0
- package/dist/core/defaults.js.map +1 -0
- package/dist/core/diagnostics.d.ts +15 -0
- package/dist/core/diagnostics.d.ts.map +1 -0
- package/dist/core/diagnostics.js +2 -0
- package/dist/core/diagnostics.js.map +1 -0
- package/dist/core/event-bus.d.ts +9 -0
- package/dist/core/event-bus.d.ts.map +1 -0
- package/dist/core/event-bus.js +25 -0
- package/dist/core/event-bus.js.map +1 -0
- package/dist/core/exec.d.ts +29 -0
- package/dist/core/exec.d.ts.map +1 -0
- package/dist/core/exec.js +71 -0
- package/dist/core/exec.js.map +1 -0
- package/dist/core/export-html/ansi-to-html.d.ts +22 -0
- package/dist/core/export-html/ansi-to-html.d.ts.map +1 -0
- package/dist/core/export-html/ansi-to-html.js +249 -0
- package/dist/core/export-html/ansi-to-html.js.map +1 -0
- package/dist/core/export-html/index.d.ts +34 -0
- package/dist/core/export-html/index.d.ts.map +1 -0
- package/dist/core/export-html/index.js +222 -0
- package/dist/core/export-html/index.js.map +1 -0
- package/dist/core/export-html/template.css +971 -0
- package/dist/core/export-html/template.html +54 -0
- package/dist/core/export-html/template.js +1586 -0
- package/dist/core/export-html/tool-renderer.d.ts +35 -0
- package/dist/core/export-html/tool-renderer.d.ts.map +1 -0
- package/dist/core/export-html/tool-renderer.js +57 -0
- package/dist/core/export-html/tool-renderer.js.map +1 -0
- package/dist/core/export-html/vendor/highlight.min.js +1213 -0
- package/dist/core/export-html/vendor/marked.min.js +6 -0
- package/dist/core/extensions/index.d.ts +11 -0
- package/dist/core/extensions/index.d.ts.map +1 -0
- package/dist/core/extensions/index.js +9 -0
- package/dist/core/extensions/index.js.map +1 -0
- package/dist/core/extensions/loader.d.ts +25 -0
- package/dist/core/extensions/loader.d.ts.map +1 -0
- package/dist/core/extensions/loader.js +402 -0
- package/dist/core/extensions/loader.js.map +1 -0
- package/dist/core/extensions/runner.d.ts +146 -0
- package/dist/core/extensions/runner.d.ts.map +1 -0
- package/dist/core/extensions/runner.js +626 -0
- package/dist/core/extensions/runner.js.map +1 -0
- package/dist/core/extensions/types.d.ts +984 -0
- package/dist/core/extensions/types.d.ts.map +1 -0
- package/dist/core/extensions/types.js +35 -0
- package/dist/core/extensions/types.js.map +1 -0
- package/dist/core/extensions/wrapper.d.ts +27 -0
- package/dist/core/extensions/wrapper.d.ts.map +1 -0
- package/dist/core/extensions/wrapper.js +102 -0
- package/dist/core/extensions/wrapper.js.map +1 -0
- package/dist/core/footer-data-provider.d.ts +32 -0
- package/dist/core/footer-data-provider.d.ts.map +1 -0
- package/dist/core/footer-data-provider.js +134 -0
- package/dist/core/footer-data-provider.js.map +1 -0
- package/dist/core/index.d.ts +9 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +9 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/keybindings.d.ts +55 -0
- package/dist/core/keybindings.d.ts.map +1 -0
- package/dist/core/keybindings.js +153 -0
- package/dist/core/keybindings.js.map +1 -0
- package/dist/core/memory.d.ts +64 -0
- package/dist/core/memory.d.ts.map +1 -0
- package/dist/core/memory.js +247 -0
- package/dist/core/memory.js.map +1 -0
- package/dist/core/messages.d.ts +77 -0
- package/dist/core/messages.d.ts.map +1 -0
- package/dist/core/messages.js +149 -0
- package/dist/core/messages.js.map +1 -0
- package/dist/core/model-registry.d.ts +102 -0
- package/dist/core/model-registry.d.ts.map +1 -0
- package/dist/core/model-registry.js +515 -0
- package/dist/core/model-registry.js.map +1 -0
- package/dist/core/model-resolver.d.ts +104 -0
- package/dist/core/model-resolver.d.ts.map +1 -0
- package/dist/core/model-resolver.js +403 -0
- package/dist/core/model-resolver.js.map +1 -0
- package/dist/core/package-manager.d.ts +151 -0
- package/dist/core/package-manager.d.ts.map +1 -0
- package/dist/core/package-manager.js +1426 -0
- package/dist/core/package-manager.js.map +1 -0
- package/dist/core/prompt-templates.d.ts +50 -0
- package/dist/core/prompt-templates.d.ts.map +1 -0
- package/dist/core/prompt-templates.js +251 -0
- package/dist/core/prompt-templates.js.map +1 -0
- package/dist/core/resolve-config-value.d.ts +17 -0
- package/dist/core/resolve-config-value.d.ts.map +1 -0
- package/dist/core/resolve-config-value.js +59 -0
- package/dist/core/resolve-config-value.js.map +1 -0
- package/dist/core/resource-loader.d.ts +184 -0
- package/dist/core/resource-loader.d.ts.map +1 -0
- package/dist/core/resource-loader.js +673 -0
- package/dist/core/resource-loader.js.map +1 -0
- package/dist/core/sdk.d.ts +90 -0
- package/dist/core/sdk.d.ts.map +1 -0
- package/dist/core/sdk.js +238 -0
- package/dist/core/sdk.js.map +1 -0
- package/dist/core/session-manager.d.ts +323 -0
- package/dist/core/session-manager.d.ts.map +1 -0
- package/dist/core/session-manager.js +1091 -0
- package/dist/core/session-manager.js.map +1 -0
- package/dist/core/settings-manager.d.ts +230 -0
- package/dist/core/settings-manager.d.ts.map +1 -0
- package/dist/core/settings-manager.js +656 -0
- package/dist/core/settings-manager.js.map +1 -0
- package/dist/core/skills.d.ts +58 -0
- package/dist/core/skills.d.ts.map +1 -0
- package/dist/core/skills.js +364 -0
- package/dist/core/skills.js.map +1 -0
- package/dist/core/slash-commands.d.ts +15 -0
- package/dist/core/slash-commands.d.ts.map +1 -0
- package/dist/core/slash-commands.js +23 -0
- package/dist/core/slash-commands.js.map +1 -0
- package/dist/core/system-prompt.d.ts +26 -0
- package/dist/core/system-prompt.d.ts.map +1 -0
- package/dist/core/system-prompt.js +150 -0
- package/dist/core/system-prompt.js.map +1 -0
- package/dist/core/timings.d.ts +7 -0
- package/dist/core/timings.d.ts.map +1 -0
- package/dist/core/timings.js +25 -0
- package/dist/core/timings.js.map +1 -0
- package/dist/core/tools/bash.d.ts +55 -0
- package/dist/core/tools/bash.d.ts.map +1 -0
- package/dist/core/tools/bash.js +242 -0
- package/dist/core/tools/bash.js.map +1 -0
- package/dist/core/tools/edit-diff.d.ts +63 -0
- package/dist/core/tools/edit-diff.d.ts.map +1 -0
- package/dist/core/tools/edit-diff.js +243 -0
- package/dist/core/tools/edit-diff.js.map +1 -0
- package/dist/core/tools/edit.d.ts +39 -0
- package/dist/core/tools/edit.d.ts.map +1 -0
- package/dist/core/tools/edit.js +146 -0
- package/dist/core/tools/edit.js.map +1 -0
- package/dist/core/tools/find.d.ts +39 -0
- package/dist/core/tools/find.d.ts.map +1 -0
- package/dist/core/tools/find.js +206 -0
- package/dist/core/tools/find.js.map +1 -0
- package/dist/core/tools/grep.d.ts +45 -0
- package/dist/core/tools/grep.d.ts.map +1 -0
- package/dist/core/tools/grep.js +239 -0
- package/dist/core/tools/grep.js.map +1 -0
- package/dist/core/tools/index.d.ts +102 -0
- package/dist/core/tools/index.d.ts.map +1 -0
- package/dist/core/tools/index.js +71 -0
- package/dist/core/tools/index.js.map +1 -0
- package/dist/core/tools/ls.d.ts +40 -0
- package/dist/core/tools/ls.d.ts.map +1 -0
- package/dist/core/tools/ls.js +118 -0
- package/dist/core/tools/ls.js.map +1 -0
- package/dist/core/tools/memory.d.ts +45 -0
- package/dist/core/tools/memory.d.ts.map +1 -0
- package/dist/core/tools/memory.js +346 -0
- package/dist/core/tools/memory.js.map +1 -0
- package/dist/core/tools/path-utils.d.ts +8 -0
- package/dist/core/tools/path-utils.d.ts.map +1 -0
- package/dist/core/tools/path-utils.js +81 -0
- package/dist/core/tools/path-utils.js.map +1 -0
- package/dist/core/tools/read.d.ts +39 -0
- package/dist/core/tools/read.d.ts.map +1 -0
- package/dist/core/tools/read.js +166 -0
- package/dist/core/tools/read.js.map +1 -0
- package/dist/core/tools/truncate.d.ts +70 -0
- package/dist/core/tools/truncate.d.ts.map +1 -0
- package/dist/core/tools/truncate.js +205 -0
- package/dist/core/tools/truncate.js.map +1 -0
- package/dist/core/tools/write.d.ts +29 -0
- package/dist/core/tools/write.d.ts.map +1 -0
- package/dist/core/tools/write.js +78 -0
- package/dist/core/tools/write.js.map +1 -0
- package/dist/index.d.ts +28 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +43 -0
- package/dist/index.js.map +1 -0
- package/dist/main.d.ts +8 -0
- package/dist/main.d.ts.map +1 -0
- package/dist/main.js +651 -0
- package/dist/main.js.map +1 -0
- package/dist/migrations.d.ts +33 -0
- package/dist/migrations.d.ts.map +1 -0
- package/dist/migrations.js +261 -0
- package/dist/migrations.js.map +1 -0
- package/dist/modes/index.d.ts +9 -0
- package/dist/modes/index.d.ts.map +1 -0
- package/dist/modes/index.js +8 -0
- package/dist/modes/index.js.map +1 -0
- package/dist/modes/interactive/components/armin.d.ts +34 -0
- package/dist/modes/interactive/components/armin.d.ts.map +1 -0
- package/dist/modes/interactive/components/armin.js +333 -0
- package/dist/modes/interactive/components/armin.js.map +1 -0
- package/dist/modes/interactive/components/assistant-message.d.ts +16 -0
- package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -0
- package/dist/modes/interactive/components/assistant-message.js +96 -0
- package/dist/modes/interactive/components/assistant-message.js.map +1 -0
- package/dist/modes/interactive/components/bash-execution.d.ts +35 -0
- package/dist/modes/interactive/components/bash-execution.d.ts.map +1 -0
- package/dist/modes/interactive/components/bash-execution.js +162 -0
- package/dist/modes/interactive/components/bash-execution.js.map +1 -0
- package/dist/modes/interactive/components/bordered-loader.d.ts +16 -0
- package/dist/modes/interactive/components/bordered-loader.d.ts.map +1 -0
- package/dist/modes/interactive/components/bordered-loader.js +51 -0
- package/dist/modes/interactive/components/bordered-loader.js.map +1 -0
- package/dist/modes/interactive/components/branch-summary-message.d.ts +16 -0
- package/dist/modes/interactive/components/branch-summary-message.d.ts.map +1 -0
- package/dist/modes/interactive/components/branch-summary-message.js +44 -0
- package/dist/modes/interactive/components/branch-summary-message.js.map +1 -0
- package/dist/modes/interactive/components/compaction-summary-message.d.ts +16 -0
- package/dist/modes/interactive/components/compaction-summary-message.d.ts.map +1 -0
- package/dist/modes/interactive/components/compaction-summary-message.js +45 -0
- package/dist/modes/interactive/components/compaction-summary-message.js.map +1 -0
- package/dist/modes/interactive/components/config-selector.d.ts +71 -0
- package/dist/modes/interactive/components/config-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/config-selector.js +479 -0
- package/dist/modes/interactive/components/config-selector.js.map +1 -0
- package/dist/modes/interactive/components/countdown-timer.d.ts +14 -0
- package/dist/modes/interactive/components/countdown-timer.d.ts.map +1 -0
- package/dist/modes/interactive/components/countdown-timer.js +33 -0
- package/dist/modes/interactive/components/countdown-timer.js.map +1 -0
- package/dist/modes/interactive/components/custom-editor.d.ts +21 -0
- package/dist/modes/interactive/components/custom-editor.d.ts.map +1 -0
- package/dist/modes/interactive/components/custom-editor.js +70 -0
- package/dist/modes/interactive/components/custom-editor.js.map +1 -0
- package/dist/modes/interactive/components/custom-message.d.ts +20 -0
- package/dist/modes/interactive/components/custom-message.d.ts.map +1 -0
- package/dist/modes/interactive/components/custom-message.js +79 -0
- package/dist/modes/interactive/components/custom-message.js.map +1 -0
- package/dist/modes/interactive/components/daxnuts.d.ts +23 -0
- package/dist/modes/interactive/components/daxnuts.d.ts.map +1 -0
- package/dist/modes/interactive/components/daxnuts.js +140 -0
- package/dist/modes/interactive/components/daxnuts.js.map +1 -0
- package/dist/modes/interactive/components/diff.d.ts +12 -0
- package/dist/modes/interactive/components/diff.d.ts.map +1 -0
- package/dist/modes/interactive/components/diff.js +133 -0
- package/dist/modes/interactive/components/diff.js.map +1 -0
- package/dist/modes/interactive/components/dynamic-border.d.ts +15 -0
- package/dist/modes/interactive/components/dynamic-border.d.ts.map +1 -0
- package/dist/modes/interactive/components/dynamic-border.js +21 -0
- package/dist/modes/interactive/components/dynamic-border.js.map +1 -0
- package/dist/modes/interactive/components/extension-editor.d.ts +17 -0
- package/dist/modes/interactive/components/extension-editor.d.ts.map +1 -0
- package/dist/modes/interactive/components/extension-editor.js +102 -0
- package/dist/modes/interactive/components/extension-editor.js.map +1 -0
- package/dist/modes/interactive/components/extension-input.d.ts +23 -0
- package/dist/modes/interactive/components/extension-input.d.ts.map +1 -0
- package/dist/modes/interactive/components/extension-input.js +61 -0
- package/dist/modes/interactive/components/extension-input.js.map +1 -0
- package/dist/modes/interactive/components/extension-selector.d.ts +24 -0
- package/dist/modes/interactive/components/extension-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/extension-selector.js +78 -0
- package/dist/modes/interactive/components/extension-selector.js.map +1 -0
- package/dist/modes/interactive/components/footer.d.ts +26 -0
- package/dist/modes/interactive/components/footer.d.ts.map +1 -0
- package/dist/modes/interactive/components/footer.js +213 -0
- package/dist/modes/interactive/components/footer.js.map +1 -0
- package/dist/modes/interactive/components/index.d.ts +32 -0
- package/dist/modes/interactive/components/index.d.ts.map +1 -0
- package/dist/modes/interactive/components/index.js +33 -0
- package/dist/modes/interactive/components/index.js.map +1 -0
- package/dist/modes/interactive/components/keybinding-hints.d.ts +41 -0
- package/dist/modes/interactive/components/keybinding-hints.d.ts.map +1 -0
- package/dist/modes/interactive/components/keybinding-hints.js +61 -0
- package/dist/modes/interactive/components/keybinding-hints.js.map +1 -0
- package/dist/modes/interactive/components/login-dialog.d.ts +42 -0
- package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -0
- package/dist/modes/interactive/components/login-dialog.js +145 -0
- package/dist/modes/interactive/components/login-dialog.js.map +1 -0
- package/dist/modes/interactive/components/model-selector.d.ts +47 -0
- package/dist/modes/interactive/components/model-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/model-selector.js +271 -0
- package/dist/modes/interactive/components/model-selector.js.map +1 -0
- package/dist/modes/interactive/components/oauth-selector.d.ts +19 -0
- package/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/oauth-selector.js +97 -0
- package/dist/modes/interactive/components/oauth-selector.js.map +1 -0
- package/dist/modes/interactive/components/scoped-models-selector.d.ts +49 -0
- package/dist/modes/interactive/components/scoped-models-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/scoped-models-selector.js +275 -0
- package/dist/modes/interactive/components/scoped-models-selector.js.map +1 -0
- package/dist/modes/interactive/components/session-selector-search.d.ts +23 -0
- package/dist/modes/interactive/components/session-selector-search.d.ts.map +1 -0
- package/dist/modes/interactive/components/session-selector-search.js +155 -0
- package/dist/modes/interactive/components/session-selector-search.js.map +1 -0
- package/dist/modes/interactive/components/session-selector.d.ts +95 -0
- package/dist/modes/interactive/components/session-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/session-selector.js +851 -0
- package/dist/modes/interactive/components/session-selector.js.map +1 -0
- package/dist/modes/interactive/components/settings-selector.d.ts +58 -0
- package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/settings-selector.js +299 -0
- package/dist/modes/interactive/components/settings-selector.js.map +1 -0
- package/dist/modes/interactive/components/show-images-selector.d.ts +10 -0
- package/dist/modes/interactive/components/show-images-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/show-images-selector.js +35 -0
- package/dist/modes/interactive/components/show-images-selector.js.map +1 -0
- package/dist/modes/interactive/components/skill-invocation-message.d.ts +17 -0
- package/dist/modes/interactive/components/skill-invocation-message.d.ts.map +1 -0
- package/dist/modes/interactive/components/skill-invocation-message.js +47 -0
- package/dist/modes/interactive/components/skill-invocation-message.js.map +1 -0
- package/dist/modes/interactive/components/theme-selector.d.ts +11 -0
- package/dist/modes/interactive/components/theme-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/theme-selector.js +46 -0
- package/dist/modes/interactive/components/theme-selector.js.map +1 -0
- package/dist/modes/interactive/components/thinking-selector.d.ts +11 -0
- package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/thinking-selector.js +47 -0
- package/dist/modes/interactive/components/thinking-selector.js.map +1 -0
- package/dist/modes/interactive/components/tool-execution.d.ts +70 -0
- package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -0
- package/dist/modes/interactive/components/tool-execution.js +636 -0
- package/dist/modes/interactive/components/tool-execution.js.map +1 -0
- package/dist/modes/interactive/components/tree-selector.d.ts +68 -0
- package/dist/modes/interactive/components/tree-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/tree-selector.js +934 -0
- package/dist/modes/interactive/components/tree-selector.js.map +1 -0
- package/dist/modes/interactive/components/user-message-selector.d.ts +30 -0
- package/dist/modes/interactive/components/user-message-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/user-message-selector.js +113 -0
- package/dist/modes/interactive/components/user-message-selector.js.map +1 -0
- package/dist/modes/interactive/components/user-message.d.ts +8 -0
- package/dist/modes/interactive/components/user-message.d.ts.map +1 -0
- package/dist/modes/interactive/components/user-message.js +16 -0
- package/dist/modes/interactive/components/user-message.js.map +1 -0
- package/dist/modes/interactive/components/visual-truncate.d.ts +24 -0
- package/dist/modes/interactive/components/visual-truncate.d.ts.map +1 -0
- package/dist/modes/interactive/components/visual-truncate.js +33 -0
- package/dist/modes/interactive/components/visual-truncate.js.map +1 -0
- package/dist/modes/interactive/interactive-mode.d.ts +316 -0
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -0
- package/dist/modes/interactive/interactive-mode.js +3848 -0
- package/dist/modes/interactive/interactive-mode.js.map +1 -0
- package/dist/modes/interactive/theme/dark.json +85 -0
- package/dist/modes/interactive/theme/light.json +84 -0
- package/dist/modes/interactive/theme/theme-schema.json +335 -0
- package/dist/modes/interactive/theme/theme.d.ts +78 -0
- package/dist/modes/interactive/theme/theme.d.ts.map +1 -0
- package/dist/modes/interactive/theme/theme.js +944 -0
- package/dist/modes/interactive/theme/theme.js.map +1 -0
- package/dist/modes/print-mode.d.ts +28 -0
- package/dist/modes/print-mode.d.ts.map +1 -0
- package/dist/modes/print-mode.js +101 -0
- package/dist/modes/print-mode.js.map +1 -0
- package/dist/modes/rpc/rpc-client.d.ts +217 -0
- package/dist/modes/rpc/rpc-client.d.ts.map +1 -0
- package/dist/modes/rpc/rpc-client.js +405 -0
- package/dist/modes/rpc/rpc-client.js.map +1 -0
- package/dist/modes/rpc/rpc-mode.d.ts +20 -0
- package/dist/modes/rpc/rpc-mode.d.ts.map +1 -0
- package/dist/modes/rpc/rpc-mode.js +511 -0
- package/dist/modes/rpc/rpc-mode.js.map +1 -0
- package/dist/modes/rpc/rpc-types.d.ts +409 -0
- package/dist/modes/rpc/rpc-types.d.ts.map +1 -0
- package/dist/modes/rpc/rpc-types.js +8 -0
- package/dist/modes/rpc/rpc-types.js.map +1 -0
- package/dist/utils/changelog.d.ts +21 -0
- package/dist/utils/changelog.d.ts.map +1 -0
- package/dist/utils/changelog.js +87 -0
- package/dist/utils/changelog.js.map +1 -0
- package/dist/utils/clipboard-image.d.ts +11 -0
- package/dist/utils/clipboard-image.d.ts.map +1 -0
- package/dist/utils/clipboard-image.js +162 -0
- package/dist/utils/clipboard-image.js.map +1 -0
- package/dist/utils/clipboard-native.d.ts +7 -0
- package/dist/utils/clipboard-native.d.ts.map +1 -0
- package/dist/utils/clipboard-native.js +14 -0
- package/dist/utils/clipboard-native.js.map +1 -0
- package/dist/utils/clipboard.d.ts +2 -0
- package/dist/utils/clipboard.d.ts.map +1 -0
- package/dist/utils/clipboard.js +67 -0
- package/dist/utils/clipboard.js.map +1 -0
- package/dist/utils/frontmatter.d.ts +8 -0
- package/dist/utils/frontmatter.d.ts.map +1 -0
- package/dist/utils/frontmatter.js +26 -0
- package/dist/utils/frontmatter.js.map +1 -0
- package/dist/utils/git.d.ts +26 -0
- package/dist/utils/git.d.ts.map +1 -0
- package/dist/utils/git.js +163 -0
- package/dist/utils/git.js.map +1 -0
- package/dist/utils/image-convert.d.ts +9 -0
- package/dist/utils/image-convert.d.ts.map +1 -0
- package/dist/utils/image-convert.js +35 -0
- package/dist/utils/image-convert.js.map +1 -0
- package/dist/utils/image-resize.d.ts +36 -0
- package/dist/utils/image-resize.d.ts.map +1 -0
- package/dist/utils/image-resize.js +181 -0
- package/dist/utils/image-resize.js.map +1 -0
- package/dist/utils/mime.d.ts +2 -0
- package/dist/utils/mime.d.ts.map +1 -0
- package/dist/utils/mime.js +26 -0
- package/dist/utils/mime.js.map +1 -0
- package/dist/utils/photon.d.ts +21 -0
- package/dist/utils/photon.d.ts.map +1 -0
- package/dist/utils/photon.js +121 -0
- package/dist/utils/photon.js.map +1 -0
- package/dist/utils/shell.d.ts +26 -0
- package/dist/utils/shell.d.ts.map +1 -0
- package/dist/utils/shell.js +186 -0
- package/dist/utils/shell.js.map +1 -0
- package/dist/utils/sleep.d.ts +5 -0
- package/dist/utils/sleep.d.ts.map +1 -0
- package/dist/utils/sleep.js +17 -0
- package/dist/utils/sleep.js.map +1 -0
- package/dist/utils/tools-manager.d.ts +3 -0
- package/dist/utils/tools-manager.d.ts.map +1 -0
- package/dist/utils/tools-manager.js +207 -0
- package/dist/utils/tools-manager.js.map +1 -0
- package/docs/compaction.md +390 -0
- package/docs/custom-provider.md +548 -0
- package/docs/development.md +69 -0
- package/docs/extensions.md +1935 -0
- package/docs/images/doom-extension.png +0 -0
- package/docs/images/exy.png +0 -0
- package/docs/images/interactive-mode.png +0 -0
- package/docs/images/tree-view.png +0 -0
- package/docs/json.md +79 -0
- package/docs/keybindings.md +174 -0
- package/docs/models.md +293 -0
- package/docs/packages.md +209 -0
- package/docs/prompt-templates.md +67 -0
- package/docs/providers.md +186 -0
- package/docs/rpc.md +1317 -0
- package/docs/sdk.md +968 -0
- package/docs/session.md +412 -0
- package/docs/settings.md +223 -0
- package/docs/shell-aliases.md +13 -0
- package/docs/skills.md +231 -0
- package/docs/terminal-setup.md +70 -0
- package/docs/termux.md +127 -0
- package/docs/themes.md +295 -0
- package/docs/tree.md +219 -0
- package/docs/tui.md +887 -0
- package/docs/windows.md +17 -0
- package/examples/README.md +25 -0
- package/examples/extensions/README.md +203 -0
- package/examples/extensions/antigravity-image-gen.ts +413 -0
- package/examples/extensions/auto-commit-on-exit.ts +49 -0
- package/examples/extensions/bash-spawn-hook.ts +30 -0
- package/examples/extensions/bookmark.ts +50 -0
- package/examples/extensions/claude-rules.ts +86 -0
- package/examples/extensions/commands.ts +72 -0
- package/examples/extensions/confirm-destructive.ts +59 -0
- package/examples/extensions/custom-compaction.ts +114 -0
- package/examples/extensions/custom-footer.ts +64 -0
- package/examples/extensions/custom-header.ts +73 -0
- package/examples/extensions/custom-provider-anthropic/index.ts +604 -0
- package/examples/extensions/custom-provider-anthropic/package-lock.json +24 -0
- package/examples/extensions/custom-provider-anthropic/package.json +19 -0
- package/examples/extensions/custom-provider-gitlab-duo/index.ts +349 -0
- package/examples/extensions/custom-provider-gitlab-duo/package.json +16 -0
- package/examples/extensions/custom-provider-gitlab-duo/test.ts +82 -0
- package/examples/extensions/custom-provider-qwen-cli/index.ts +345 -0
- package/examples/extensions/custom-provider-qwen-cli/package.json +16 -0
- package/examples/extensions/dirty-repo-guard.ts +56 -0
- package/examples/extensions/doom-overlay/README.md +46 -0
- package/examples/extensions/doom-overlay/doom/build/doom.js +21 -0
- package/examples/extensions/doom-overlay/doom/build/doom.wasm +0 -0
- package/examples/extensions/doom-overlay/doom/build.sh +152 -0
- package/examples/extensions/doom-overlay/doom/doomgeneric_pi.c +72 -0
- package/examples/extensions/doom-overlay/doom-component.ts +132 -0
- package/examples/extensions/doom-overlay/doom-engine.ts +173 -0
- package/examples/extensions/doom-overlay/doom-keys.ts +104 -0
- package/examples/extensions/doom-overlay/index.ts +74 -0
- package/examples/extensions/doom-overlay/wad-finder.ts +51 -0
- package/examples/extensions/dynamic-resources/SKILL.md +8 -0
- package/examples/extensions/dynamic-resources/dynamic.json +79 -0
- package/examples/extensions/dynamic-resources/dynamic.md +5 -0
- package/examples/extensions/dynamic-resources/index.ts +15 -0
- package/examples/extensions/event-bus.ts +43 -0
- package/examples/extensions/file-trigger.ts +41 -0
- package/examples/extensions/git-checkpoint.ts +53 -0
- package/examples/extensions/handoff.ts +150 -0
- package/examples/extensions/hello.ts +25 -0
- package/examples/extensions/inline-bash.ts +94 -0
- package/examples/extensions/input-transform.ts +43 -0
- package/examples/extensions/interactive-shell.ts +196 -0
- package/examples/extensions/mac-system-theme.ts +47 -0
- package/examples/extensions/message-renderer.ts +59 -0
- package/examples/extensions/minimal-mode.ts +426 -0
- package/examples/extensions/modal-editor.ts +85 -0
- package/examples/extensions/model-status.ts +31 -0
- package/examples/extensions/notify.ts +55 -0
- package/examples/extensions/overlay-qa-tests.ts +881 -0
- package/examples/extensions/overlay-test.ts +150 -0
- package/examples/extensions/permission-gate.ts +34 -0
- package/examples/extensions/pirate.ts +47 -0
- package/examples/extensions/plan-mode/README.md +65 -0
- package/examples/extensions/plan-mode/index.ts +340 -0
- package/examples/extensions/plan-mode/utils.ts +168 -0
- package/examples/extensions/preset.ts +398 -0
- package/examples/extensions/protected-paths.ts +30 -0
- package/examples/extensions/qna.ts +119 -0
- package/examples/extensions/question.ts +264 -0
- package/examples/extensions/questionnaire.ts +427 -0
- package/examples/extensions/rainbow-editor.ts +88 -0
- package/examples/extensions/reload-runtime.ts +37 -0
- package/examples/extensions/rpc-demo.ts +124 -0
- package/examples/extensions/sandbox/index.ts +318 -0
- package/examples/extensions/sandbox/package-lock.json +92 -0
- package/examples/extensions/sandbox/package.json +19 -0
- package/examples/extensions/send-user-message.ts +97 -0
- package/examples/extensions/session-name.ts +27 -0
- package/examples/extensions/shutdown-command.ts +63 -0
- package/examples/extensions/snake.ts +343 -0
- package/examples/extensions/space-invaders.ts +560 -0
- package/examples/extensions/ssh.ts +220 -0
- package/examples/extensions/status-line.ts +40 -0
- package/examples/extensions/subagent/README.md +172 -0
- package/examples/extensions/subagent/agents/planner.md +37 -0
- package/examples/extensions/subagent/agents/reviewer.md +35 -0
- package/examples/extensions/subagent/agents/scout.md +50 -0
- package/examples/extensions/subagent/agents/worker.md +24 -0
- package/examples/extensions/subagent/agents.ts +127 -0
- package/examples/extensions/subagent/index.ts +964 -0
- package/examples/extensions/subagent/prompts/implement-and-review.md +10 -0
- package/examples/extensions/subagent/prompts/implement.md +10 -0
- package/examples/extensions/subagent/prompts/scout-and-plan.md +9 -0
- package/examples/extensions/summarize.ts +195 -0
- package/examples/extensions/system-prompt-header.ts +17 -0
- package/examples/extensions/timed-confirm.ts +70 -0
- package/examples/extensions/titlebar-spinner.ts +58 -0
- package/examples/extensions/todo.ts +299 -0
- package/examples/extensions/tool-override.ts +143 -0
- package/examples/extensions/tools.ts +146 -0
- package/examples/extensions/trigger-compact.ts +40 -0
- package/examples/extensions/truncated-tool.ts +192 -0
- package/examples/extensions/widget-placement.ts +17 -0
- package/examples/extensions/with-deps/index.ts +36 -0
- package/examples/extensions/with-deps/package-lock.json +31 -0
- package/examples/extensions/with-deps/package.json +22 -0
- package/examples/rpc-extension-ui.ts +632 -0
- package/examples/sdk/01-minimal.ts +22 -0
- package/examples/sdk/02-custom-model.ts +49 -0
- package/examples/sdk/03-custom-prompt.ts +55 -0
- package/examples/sdk/04-skills.ts +46 -0
- package/examples/sdk/05-tools.ts +56 -0
- package/examples/sdk/06-extensions.ts +88 -0
- package/examples/sdk/07-context-files.ts +40 -0
- package/examples/sdk/08-prompt-templates.ts +47 -0
- package/examples/sdk/09-api-keys-and-oauth.ts +48 -0
- package/examples/sdk/10-settings.ts +51 -0
- package/examples/sdk/11-sessions.ts +48 -0
- package/examples/sdk/12-full-control.ts +82 -0
- package/examples/sdk/README.md +144 -0
- package/package.json +96 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-selector.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/session-selector.ts"],"names":[],"mappings":"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","sourcesContent":["import { spawnSync } from \"node:child_process\";\r\nimport { existsSync } from \"node:fs\";\r\nimport { unlink } from \"node:fs/promises\";\r\nimport * as os from \"node:os\";\r\nimport {\r\n\ttype Component,\r\n\tContainer,\r\n\ttype Focusable,\r\n\tgetEditorKeybindings,\r\n\tInput,\r\n\tmatchesKey,\r\n\tSpacer,\r\n\tText,\r\n\ttruncateToWidth,\r\n\tvisibleWidth,\r\n} from \"@mariozechner/pi-tui\";\r\nimport { KeybindingsManager } from \"../../../core/keybindings.js\";\r\nimport type { SessionInfo, SessionListProgress } from \"../../../core/session-manager.js\";\r\nimport { theme } from \"../theme/theme.js\";\r\nimport { DynamicBorder } from \"./dynamic-border.js\";\r\nimport { appKey, appKeyHint, keyHint } from \"./keybinding-hints.js\";\r\nimport { filterAndSortSessions, hasSessionName, type NameFilter, type SortMode } from \"./session-selector-search.js\";\r\n\r\ntype SessionScope = \"current\" | \"all\";\r\n\r\nfunction shortenPath(path: string): string {\r\n\tconst home = os.homedir();\r\n\tif (!path) return path;\r\n\tif (path.startsWith(home)) {\r\n\t\treturn `~${path.slice(home.length)}`;\r\n\t}\r\n\treturn path;\r\n}\r\n\r\nfunction formatSessionDate(date: Date): string {\r\n\tconst now = new Date();\r\n\tconst diffMs = now.getTime() - date.getTime();\r\n\tconst diffMins = Math.floor(diffMs / 60000);\r\n\tconst diffHours = Math.floor(diffMs / 3600000);\r\n\tconst diffDays = Math.floor(diffMs / 86400000);\r\n\r\n\tif (diffMins < 1) return \"now\";\r\n\tif (diffMins < 60) return `${diffMins}m`;\r\n\tif (diffHours < 24) return `${diffHours}h`;\r\n\tif (diffDays < 7) return `${diffDays}d`;\r\n\tif (diffDays < 30) return `${Math.floor(diffDays / 7)}w`;\r\n\tif (diffDays < 365) return `${Math.floor(diffDays / 30)}mo`;\r\n\treturn `${Math.floor(diffDays / 365)}y`;\r\n}\r\n\r\nclass SessionSelectorHeader implements Component {\r\n\tprivate scope: SessionScope;\r\n\tprivate sortMode: SortMode;\r\n\tprivate nameFilter: NameFilter;\r\n\tprivate keybindings: KeybindingsManager;\r\n\tprivate requestRender: () => void;\r\n\tprivate loading = false;\r\n\tprivate loadProgress: { loaded: number; total: number } | null = null;\r\n\tprivate showPath = false;\r\n\tprivate confirmingDeletePath: string | null = null;\r\n\tprivate statusMessage: { type: \"info\" | \"error\"; message: string } | null = null;\r\n\tprivate statusTimeout: ReturnType<typeof setTimeout> | null = null;\r\n\tprivate showRenameHint = false;\r\n\r\n\tconstructor(\r\n\t\tscope: SessionScope,\r\n\t\tsortMode: SortMode,\r\n\t\tnameFilter: NameFilter,\r\n\t\tkeybindings: KeybindingsManager,\r\n\t\trequestRender: () => void,\r\n\t) {\r\n\t\tthis.scope = scope;\r\n\t\tthis.sortMode = sortMode;\r\n\t\tthis.nameFilter = nameFilter;\r\n\t\tthis.keybindings = keybindings;\r\n\t\tthis.requestRender = requestRender;\r\n\t}\r\n\r\n\tsetScope(scope: SessionScope): void {\r\n\t\tthis.scope = scope;\r\n\t}\r\n\r\n\tsetSortMode(sortMode: SortMode): void {\r\n\t\tthis.sortMode = sortMode;\r\n\t}\r\n\r\n\tsetNameFilter(nameFilter: NameFilter): void {\r\n\t\tthis.nameFilter = nameFilter;\r\n\t}\r\n\r\n\tsetLoading(loading: boolean): void {\r\n\t\tthis.loading = loading;\r\n\t\t// Progress is scoped to the current load; clear whenever the loading state is set\r\n\t\tthis.loadProgress = null;\r\n\t}\r\n\r\n\tsetProgress(loaded: number, total: number): void {\r\n\t\tthis.loadProgress = { loaded, total };\r\n\t}\r\n\r\n\tsetShowPath(showPath: boolean): void {\r\n\t\tthis.showPath = showPath;\r\n\t}\r\n\r\n\tsetShowRenameHint(show: boolean): void {\r\n\t\tthis.showRenameHint = show;\r\n\t}\r\n\r\n\tsetConfirmingDeletePath(path: string | null): void {\r\n\t\tthis.confirmingDeletePath = path;\r\n\t}\r\n\r\n\tprivate clearStatusTimeout(): void {\r\n\t\tif (!this.statusTimeout) return;\r\n\t\tclearTimeout(this.statusTimeout);\r\n\t\tthis.statusTimeout = null;\r\n\t}\r\n\r\n\tsetStatusMessage(msg: { type: \"info\" | \"error\"; message: string } | null, autoHideMs?: number): void {\r\n\t\tthis.clearStatusTimeout();\r\n\t\tthis.statusMessage = msg;\r\n\t\tif (!msg || !autoHideMs) return;\r\n\r\n\t\tthis.statusTimeout = setTimeout(() => {\r\n\t\t\tthis.statusMessage = null;\r\n\t\t\tthis.statusTimeout = null;\r\n\t\t\tthis.requestRender();\r\n\t\t}, autoHideMs);\r\n\t}\r\n\r\n\tinvalidate(): void {}\r\n\r\n\trender(width: number): string[] {\r\n\t\tconst title = this.scope === \"current\" ? \"Resume Session (Current Folder)\" : \"Resume Session (All)\";\r\n\t\tconst leftText = theme.bold(title);\r\n\r\n\t\tconst sortLabel = this.sortMode === \"threaded\" ? \"Threaded\" : this.sortMode === \"recent\" ? \"Recent\" : \"Fuzzy\";\r\n\t\tconst sortText = theme.fg(\"muted\", \"Sort: \") + theme.fg(\"accent\", sortLabel);\r\n\r\n\t\tconst nameLabel = this.nameFilter === \"all\" ? \"All\" : \"Named\";\r\n\t\tconst nameText = theme.fg(\"muted\", \"Name: \") + theme.fg(\"accent\", nameLabel);\r\n\r\n\t\tlet scopeText: string;\r\n\t\tif (this.loading) {\r\n\t\t\tconst progressText = this.loadProgress ? `${this.loadProgress.loaded}/${this.loadProgress.total}` : \"...\";\r\n\t\t\tscopeText = `${theme.fg(\"muted\", \"○ Current Folder | \")}${theme.fg(\"accent\", `Loading ${progressText}`)}`;\r\n\t\t} else if (this.scope === \"current\") {\r\n\t\t\tscopeText = `${theme.fg(\"accent\", \"◉ Current Folder\")}${theme.fg(\"muted\", \" | ○ All\")}`;\r\n\t\t} else {\r\n\t\t\tscopeText = `${theme.fg(\"muted\", \"○ Current Folder | \")}${theme.fg(\"accent\", \"◉ All\")}`;\r\n\t\t}\r\n\r\n\t\tconst rightText = truncateToWidth(`${scopeText} ${nameText} ${sortText}`, width, \"\");\r\n\t\tconst availableLeft = Math.max(0, width - visibleWidth(rightText) - 1);\r\n\t\tconst left = truncateToWidth(leftText, availableLeft, \"\");\r\n\t\tconst spacing = Math.max(0, width - visibleWidth(left) - visibleWidth(rightText));\r\n\r\n\t\t// Build hint lines - changes based on state (all branches truncate to width)\r\n\t\tlet hintLine1: string;\r\n\t\tlet hintLine2: string;\r\n\t\tif (this.confirmingDeletePath !== null) {\r\n\t\t\tconst confirmHint = \"Delete session? [Enter] confirm · [Esc/Ctrl+C] cancel\";\r\n\t\t\thintLine1 = theme.fg(\"error\", truncateToWidth(confirmHint, width, \"…\"));\r\n\t\t\thintLine2 = \"\";\r\n\t\t} else if (this.statusMessage) {\r\n\t\t\tconst color = this.statusMessage.type === \"error\" ? \"error\" : \"accent\";\r\n\t\t\thintLine1 = theme.fg(color, truncateToWidth(this.statusMessage.message, width, \"…\"));\r\n\t\t\thintLine2 = \"\";\r\n\t\t} else {\r\n\t\t\tconst pathState = this.showPath ? \"(on)\" : \"(off)\";\r\n\t\t\tconst sep = theme.fg(\"muted\", \" · \");\r\n\t\t\tconst hint1 = keyHint(\"tab\", \"scope\") + sep + theme.fg(\"muted\", 're:<pattern> regex · \"phrase\" exact');\r\n\t\t\tconst hint2Parts = [\r\n\t\t\t\tkeyHint(\"toggleSessionSort\", \"sort\"),\r\n\t\t\t\tappKeyHint(this.keybindings, \"toggleSessionNamedFilter\", \"named\"),\r\n\t\t\t\tkeyHint(\"deleteSession\", \"delete\"),\r\n\t\t\t\tkeyHint(\"toggleSessionPath\", `path ${pathState}`),\r\n\t\t\t];\r\n\t\t\tif (this.showRenameHint) {\r\n\t\t\t\thint2Parts.push(keyHint(\"renameSession\", \"rename\"));\r\n\t\t\t}\r\n\t\t\tconst hint2 = hint2Parts.join(sep);\r\n\t\t\thintLine1 = truncateToWidth(hint1, width, \"…\");\r\n\t\t\thintLine2 = truncateToWidth(hint2, width, \"…\");\r\n\t\t}\r\n\r\n\t\treturn [`${left}${\" \".repeat(spacing)}${rightText}`, hintLine1, hintLine2];\r\n\t}\r\n}\r\n\r\n/** A session tree node for hierarchical display */\r\ninterface SessionTreeNode {\r\n\tsession: SessionInfo;\r\n\tchildren: SessionTreeNode[];\r\n}\r\n\r\n/** Flattened node for display with tree structure info */\r\ninterface FlatSessionNode {\r\n\tsession: SessionInfo;\r\n\tdepth: number;\r\n\tisLast: boolean;\r\n\t/** For each ancestor level, whether there are more siblings after it */\r\n\tancestorContinues: boolean[];\r\n}\r\n\r\n/**\r\n * Build a tree structure from sessions based on parentSessionPath.\r\n * Returns root nodes sorted by modified date (descending).\r\n */\r\nfunction buildSessionTree(sessions: SessionInfo[]): SessionTreeNode[] {\r\n\tconst byPath = new Map<string, SessionTreeNode>();\r\n\r\n\tfor (const session of sessions) {\r\n\t\tbyPath.set(session.path, { session, children: [] });\r\n\t}\r\n\r\n\tconst roots: SessionTreeNode[] = [];\r\n\r\n\tfor (const session of sessions) {\r\n\t\tconst node = byPath.get(session.path)!;\r\n\t\tconst parentPath = session.parentSessionPath;\r\n\r\n\t\tif (parentPath && byPath.has(parentPath)) {\r\n\t\t\tbyPath.get(parentPath)!.children.push(node);\r\n\t\t} else {\r\n\t\t\troots.push(node);\r\n\t\t}\r\n\t}\r\n\r\n\t// Sort children and roots by modified date (descending)\r\n\tconst sortNodes = (nodes: SessionTreeNode[]): void => {\r\n\t\tnodes.sort((a, b) => b.session.modified.getTime() - a.session.modified.getTime());\r\n\t\tfor (const node of nodes) {\r\n\t\t\tsortNodes(node.children);\r\n\t\t}\r\n\t};\r\n\tsortNodes(roots);\r\n\r\n\treturn roots;\r\n}\r\n\r\n/**\r\n * Flatten tree into display list with tree structure metadata.\r\n */\r\nfunction flattenSessionTree(roots: SessionTreeNode[]): FlatSessionNode[] {\r\n\tconst result: FlatSessionNode[] = [];\r\n\r\n\tconst walk = (node: SessionTreeNode, depth: number, ancestorContinues: boolean[], isLast: boolean): void => {\r\n\t\tresult.push({ session: node.session, depth, isLast, ancestorContinues });\r\n\r\n\t\tfor (let i = 0; i < node.children.length; i++) {\r\n\t\t\tconst childIsLast = i === node.children.length - 1;\r\n\t\t\t// Only show continuation line for non-root ancestors\r\n\t\t\tconst continues = depth > 0 ? !isLast : false;\r\n\t\t\twalk(node.children[i]!, depth + 1, [...ancestorContinues, continues], childIsLast);\r\n\t\t}\r\n\t};\r\n\r\n\tfor (let i = 0; i < roots.length; i++) {\r\n\t\twalk(roots[i]!, 0, [], i === roots.length - 1);\r\n\t}\r\n\r\n\treturn result;\r\n}\r\n\r\n/**\r\n * Custom session list component with multi-line items and search\r\n */\r\nclass SessionList implements Component, Focusable {\r\n\tpublic getSelectedSessionPath(): string | undefined {\r\n\t\tconst selected = this.filteredSessions[this.selectedIndex];\r\n\t\treturn selected?.session.path;\r\n\t}\r\n\tprivate allSessions: SessionInfo[] = [];\r\n\tprivate filteredSessions: FlatSessionNode[] = [];\r\n\tprivate selectedIndex: number = 0;\r\n\tprivate searchInput: Input;\r\n\tprivate showCwd = false;\r\n\tprivate sortMode: SortMode = \"threaded\";\r\n\tprivate nameFilter: NameFilter = \"all\";\r\n\tprivate keybindings: KeybindingsManager;\r\n\tprivate showPath = false;\r\n\tprivate confirmingDeletePath: string | null = null;\r\n\tprivate currentSessionFilePath?: string;\r\n\tpublic onSelect?: (sessionPath: string) => void;\r\n\tpublic onCancel?: () => void;\r\n\tpublic onExit: () => void = () => {};\r\n\tpublic onToggleScope?: () => void;\r\n\tpublic onToggleSort?: () => void;\r\n\tpublic onToggleNameFilter?: () => void;\r\n\tpublic onTogglePath?: (showPath: boolean) => void;\r\n\tpublic onDeleteConfirmationChange?: (path: string | null) => void;\r\n\tpublic onDeleteSession?: (sessionPath: string) => Promise<void>;\r\n\tpublic onRenameSession?: (sessionPath: string) => void;\r\n\tpublic onError?: (message: string) => void;\r\n\tprivate maxVisible: number = 10; // Max sessions visible (one line each)\r\n\r\n\t// Focusable implementation - propagate to searchInput for IME cursor positioning\r\n\tprivate _focused = false;\r\n\tget focused(): boolean {\r\n\t\treturn this._focused;\r\n\t}\r\n\tset focused(value: boolean) {\r\n\t\tthis._focused = value;\r\n\t\tthis.searchInput.focused = value;\r\n\t}\r\n\r\n\tconstructor(\r\n\t\tsessions: SessionInfo[],\r\n\t\tshowCwd: boolean,\r\n\t\tsortMode: SortMode,\r\n\t\tnameFilter: NameFilter,\r\n\t\tkeybindings: KeybindingsManager,\r\n\t\tcurrentSessionFilePath?: string,\r\n\t) {\r\n\t\tthis.allSessions = sessions;\r\n\t\tthis.filteredSessions = [];\r\n\t\tthis.searchInput = new Input();\r\n\t\tthis.showCwd = showCwd;\r\n\t\tthis.sortMode = sortMode;\r\n\t\tthis.nameFilter = nameFilter;\r\n\t\tthis.keybindings = keybindings;\r\n\t\tthis.currentSessionFilePath = currentSessionFilePath;\r\n\t\tthis.filterSessions(\"\");\r\n\r\n\t\t// Handle Enter in search input - select current item\r\n\t\tthis.searchInput.onSubmit = () => {\r\n\t\t\tif (this.filteredSessions[this.selectedIndex]) {\r\n\t\t\t\tconst selected = this.filteredSessions[this.selectedIndex];\r\n\t\t\t\tif (this.onSelect) {\r\n\t\t\t\t\tthis.onSelect(selected.session.path);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t};\r\n\t}\r\n\r\n\tsetSortMode(sortMode: SortMode): void {\r\n\t\tthis.sortMode = sortMode;\r\n\t\tthis.filterSessions(this.searchInput.getValue());\r\n\t}\r\n\r\n\tsetNameFilter(nameFilter: NameFilter): void {\r\n\t\tthis.nameFilter = nameFilter;\r\n\t\tthis.filterSessions(this.searchInput.getValue());\r\n\t}\r\n\r\n\tsetSessions(sessions: SessionInfo[], showCwd: boolean): void {\r\n\t\tthis.allSessions = sessions;\r\n\t\tthis.showCwd = showCwd;\r\n\t\tthis.filterSessions(this.searchInput.getValue());\r\n\t}\r\n\r\n\tprivate filterSessions(query: string): void {\r\n\t\tconst trimmed = query.trim();\r\n\t\tconst nameFiltered =\r\n\t\t\tthis.nameFilter === \"all\" ? this.allSessions : this.allSessions.filter((session) => hasSessionName(session));\r\n\r\n\t\tif (this.sortMode === \"threaded\" && !trimmed) {\r\n\t\t\t// Threaded mode without search: show tree structure\r\n\t\t\tconst roots = buildSessionTree(nameFiltered);\r\n\t\t\tthis.filteredSessions = flattenSessionTree(roots);\r\n\t\t} else {\r\n\t\t\t// Other modes or with search: flat list\r\n\t\t\tconst filtered = filterAndSortSessions(nameFiltered, query, this.sortMode, \"all\");\r\n\t\t\tthis.filteredSessions = filtered.map((session) => ({\r\n\t\t\t\tsession,\r\n\t\t\t\tdepth: 0,\r\n\t\t\t\tisLast: true,\r\n\t\t\t\tancestorContinues: [],\r\n\t\t\t}));\r\n\t\t}\r\n\t\tthis.selectedIndex = Math.min(this.selectedIndex, Math.max(0, this.filteredSessions.length - 1));\r\n\t}\r\n\r\n\tprivate setConfirmingDeletePath(path: string | null): void {\r\n\t\tthis.confirmingDeletePath = path;\r\n\t\tthis.onDeleteConfirmationChange?.(path);\r\n\t}\r\n\r\n\tprivate startDeleteConfirmationForSelectedSession(): void {\r\n\t\tconst selected = this.filteredSessions[this.selectedIndex];\r\n\t\tif (!selected) return;\r\n\r\n\t\t// Prevent deleting current session\r\n\t\tif (this.currentSessionFilePath && selected.session.path === this.currentSessionFilePath) {\r\n\t\t\tthis.onError?.(\"Cannot delete the currently active session\");\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis.setConfirmingDeletePath(selected.session.path);\r\n\t}\r\n\r\n\tinvalidate(): void {}\r\n\r\n\trender(width: number): string[] {\r\n\t\tconst lines: string[] = [];\r\n\r\n\t\t// Render search input\r\n\t\tlines.push(...this.searchInput.render(width));\r\n\t\tlines.push(\"\"); // Blank line after search\r\n\r\n\t\tif (this.filteredSessions.length === 0) {\r\n\t\t\tlet emptyMessage: string;\r\n\t\t\tif (this.nameFilter === \"named\") {\r\n\t\t\t\tconst toggleKey = appKey(this.keybindings, \"toggleSessionNamedFilter\");\r\n\t\t\t\tif (this.showCwd) {\r\n\t\t\t\t\temptyMessage = ` No named sessions found. Press ${toggleKey} to show all.`;\r\n\t\t\t\t} else {\r\n\t\t\t\t\temptyMessage = ` No named sessions in current folder. Press ${toggleKey} to show all, or Tab to view all.`;\r\n\t\t\t\t}\r\n\t\t\t} else if (this.showCwd) {\r\n\t\t\t\t// \"All\" scope - no sessions anywhere that match filter\r\n\t\t\t\temptyMessage = \" No sessions found\";\r\n\t\t\t} else {\r\n\t\t\t\t// \"Current folder\" scope - hint to try \"all\"\r\n\t\t\t\temptyMessage = \" No sessions in current folder. Press Tab to view all.\";\r\n\t\t\t}\r\n\t\t\tlines.push(theme.fg(\"muted\", truncateToWidth(emptyMessage, width, \"…\")));\r\n\t\t\treturn lines;\r\n\t\t}\r\n\r\n\t\t// Calculate visible range with scrolling\r\n\t\tconst startIndex = Math.max(\r\n\t\t\t0,\r\n\t\t\tMath.min(this.selectedIndex - Math.floor(this.maxVisible / 2), this.filteredSessions.length - this.maxVisible),\r\n\t\t);\r\n\t\tconst endIndex = Math.min(startIndex + this.maxVisible, this.filteredSessions.length);\r\n\r\n\t\t// Render visible sessions (one line each with tree structure)\r\n\t\tfor (let i = startIndex; i < endIndex; i++) {\r\n\t\t\tconst node = this.filteredSessions[i]!;\r\n\t\t\tconst session = node.session;\r\n\t\t\tconst isSelected = i === this.selectedIndex;\r\n\t\t\tconst isConfirmingDelete = session.path === this.confirmingDeletePath;\r\n\t\t\tconst isCurrent = this.currentSessionFilePath === session.path;\r\n\r\n\t\t\t// Build tree prefix\r\n\t\t\tconst prefix = this.buildTreePrefix(node);\r\n\r\n\t\t\t// Session display text (name or first message)\r\n\t\t\tconst hasName = !!session.name;\r\n\t\t\tconst displayText = session.name ?? session.firstMessage;\r\n\t\t\tconst normalizedMessage = displayText.replace(/\\n/g, \" \").trim();\r\n\r\n\t\t\t// Right side: message count and age\r\n\t\t\tconst age = formatSessionDate(session.modified);\r\n\t\t\tconst msgCount = String(session.messageCount);\r\n\t\t\tlet rightPart = `${msgCount} ${age}`;\r\n\t\t\tif (this.showCwd && session.cwd) {\r\n\t\t\t\trightPart = `${shortenPath(session.cwd)} ${rightPart}`;\r\n\t\t\t}\r\n\t\t\tif (this.showPath) {\r\n\t\t\t\trightPart = `${shortenPath(session.path)} ${rightPart}`;\r\n\t\t\t}\r\n\r\n\t\t\t// Cursor\r\n\t\t\tconst cursor = isSelected ? theme.fg(\"accent\", \"› \") : \" \";\r\n\r\n\t\t\t// Calculate available width for message\r\n\t\t\tconst prefixWidth = visibleWidth(prefix);\r\n\t\t\tconst rightWidth = visibleWidth(rightPart) + 2; // +2 for spacing\r\n\t\t\tconst availableForMsg = width - 2 - prefixWidth - rightWidth; // -2 for cursor\r\n\r\n\t\t\tconst truncatedMsg = truncateToWidth(normalizedMessage, Math.max(10, availableForMsg), \"…\");\r\n\r\n\t\t\t// Style message\r\n\t\t\tlet messageColor: \"error\" | \"warning\" | \"accent\" | null = null;\r\n\t\t\tif (isConfirmingDelete) {\r\n\t\t\t\tmessageColor = \"error\";\r\n\t\t\t} else if (isCurrent) {\r\n\t\t\t\tmessageColor = \"accent\";\r\n\t\t\t} else if (hasName) {\r\n\t\t\t\tmessageColor = \"warning\";\r\n\t\t\t}\r\n\t\t\tlet styledMsg = messageColor ? theme.fg(messageColor, truncatedMsg) : truncatedMsg;\r\n\t\t\tif (isSelected) {\r\n\t\t\t\tstyledMsg = theme.bold(styledMsg);\r\n\t\t\t}\r\n\r\n\t\t\t// Build line\r\n\t\t\tconst leftPart = cursor + theme.fg(\"dim\", prefix) + styledMsg;\r\n\t\t\tconst leftWidth = visibleWidth(leftPart);\r\n\t\t\tconst spacing = Math.max(1, width - leftWidth - visibleWidth(rightPart));\r\n\t\t\tconst styledRight = theme.fg(isConfirmingDelete ? \"error\" : \"dim\", rightPart);\r\n\r\n\t\t\tlet line = leftPart + \" \".repeat(spacing) + styledRight;\r\n\t\t\tif (isSelected) {\r\n\t\t\t\tline = theme.bg(\"selectedBg\", line);\r\n\t\t\t}\r\n\t\t\tlines.push(truncateToWidth(line, width));\r\n\t\t}\r\n\r\n\t\t// Add scroll indicator if needed\r\n\t\tif (startIndex > 0 || endIndex < this.filteredSessions.length) {\r\n\t\t\tconst scrollText = ` (${this.selectedIndex + 1}/${this.filteredSessions.length})`;\r\n\t\t\tconst scrollInfo = theme.fg(\"muted\", truncateToWidth(scrollText, width, \"\"));\r\n\t\t\tlines.push(scrollInfo);\r\n\t\t}\r\n\r\n\t\treturn lines;\r\n\t}\r\n\r\n\tprivate buildTreePrefix(node: FlatSessionNode): string {\r\n\t\tif (node.depth === 0) {\r\n\t\t\treturn \"\";\r\n\t\t}\r\n\r\n\t\tconst parts = node.ancestorContinues.map((continues) => (continues ? \"│ \" : \" \"));\r\n\t\tconst branch = node.isLast ? \"└─ \" : \"├─ \";\r\n\t\treturn parts.join(\"\") + branch;\r\n\t}\r\n\r\n\thandleInput(keyData: string): void {\r\n\t\tconst kb = getEditorKeybindings();\r\n\r\n\t\t// Handle delete confirmation state first - intercept all keys\r\n\t\tif (this.confirmingDeletePath !== null) {\r\n\t\t\tif (kb.matches(keyData, \"selectConfirm\")) {\r\n\t\t\t\tconst pathToDelete = this.confirmingDeletePath;\r\n\t\t\t\tthis.setConfirmingDeletePath(null);\r\n\t\t\t\tvoid this.onDeleteSession?.(pathToDelete);\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\t// Allow both Escape and Ctrl+C to cancel (consistent with pi UX)\r\n\t\t\tif (kb.matches(keyData, \"selectCancel\") || matchesKey(keyData, \"ctrl+c\")) {\r\n\t\t\t\tthis.setConfirmingDeletePath(null);\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\t// Ignore all other keys while confirming\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (kb.matches(keyData, \"tab\")) {\r\n\t\t\tif (this.onToggleScope) {\r\n\t\t\t\tthis.onToggleScope();\r\n\t\t\t}\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (kb.matches(keyData, \"toggleSessionSort\")) {\r\n\t\t\tthis.onToggleSort?.();\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (this.keybindings.matches(keyData, \"toggleSessionNamedFilter\")) {\r\n\t\t\tthis.onToggleNameFilter?.();\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t// Ctrl+P: toggle path display\r\n\t\tif (kb.matches(keyData, \"toggleSessionPath\")) {\r\n\t\t\tthis.showPath = !this.showPath;\r\n\t\t\tthis.onTogglePath?.(this.showPath);\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t// Ctrl+D: initiate delete confirmation (useful on terminals that don't distinguish Ctrl+Backspace from Backspace)\r\n\t\tif (kb.matches(keyData, \"deleteSession\")) {\r\n\t\t\tthis.startDeleteConfirmationForSelectedSession();\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t// Ctrl+R: rename selected session\r\n\t\tif (matchesKey(keyData, \"ctrl+r\")) {\r\n\t\t\tconst selected = this.filteredSessions[this.selectedIndex];\r\n\t\t\tif (selected) {\r\n\t\t\t\tthis.onRenameSession?.(selected.session.path);\r\n\t\t\t}\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t// Ctrl+Backspace: non-invasive convenience alias for delete\r\n\t\t// Only triggers deletion when the query is empty; otherwise it is forwarded to the input\r\n\t\tif (kb.matches(keyData, \"deleteSessionNoninvasive\")) {\r\n\t\t\tif (this.searchInput.getValue().length > 0) {\r\n\t\t\t\tthis.searchInput.handleInput(keyData);\r\n\t\t\t\tthis.filterSessions(this.searchInput.getValue());\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tthis.startDeleteConfirmationForSelectedSession();\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t// Up arrow\r\n\t\tif (kb.matches(keyData, \"selectUp\")) {\r\n\t\t\tthis.selectedIndex = Math.max(0, this.selectedIndex - 1);\r\n\t\t}\r\n\t\t// Down arrow\r\n\t\telse if (kb.matches(keyData, \"selectDown\")) {\r\n\t\t\tthis.selectedIndex = Math.min(this.filteredSessions.length - 1, this.selectedIndex + 1);\r\n\t\t}\r\n\t\t// Page up - jump up by maxVisible items\r\n\t\telse if (kb.matches(keyData, \"selectPageUp\")) {\r\n\t\t\tthis.selectedIndex = Math.max(0, this.selectedIndex - this.maxVisible);\r\n\t\t}\r\n\t\t// Page down - jump down by maxVisible items\r\n\t\telse if (kb.matches(keyData, \"selectPageDown\")) {\r\n\t\t\tthis.selectedIndex = Math.min(this.filteredSessions.length - 1, this.selectedIndex + this.maxVisible);\r\n\t\t}\r\n\t\t// Enter\r\n\t\telse if (kb.matches(keyData, \"selectConfirm\")) {\r\n\t\t\tconst selected = this.filteredSessions[this.selectedIndex];\r\n\t\t\tif (selected && this.onSelect) {\r\n\t\t\t\tthis.onSelect(selected.session.path);\r\n\t\t\t}\r\n\t\t}\r\n\t\t// Escape - cancel\r\n\t\telse if (kb.matches(keyData, \"selectCancel\")) {\r\n\t\t\tif (this.onCancel) {\r\n\t\t\t\tthis.onCancel();\r\n\t\t\t}\r\n\t\t}\r\n\t\t// Pass everything else to search input\r\n\t\telse {\r\n\t\t\tthis.searchInput.handleInput(keyData);\r\n\t\t\tthis.filterSessions(this.searchInput.getValue());\r\n\t\t}\r\n\t}\r\n}\r\n\r\ntype SessionsLoader = (onProgress?: SessionListProgress) => Promise<SessionInfo[]>;\r\n\r\n/**\r\n * Delete a session file, trying the `trash` CLI first, then falling back to unlink\r\n */\r\nasync function deleteSessionFile(\r\n\tsessionPath: string,\r\n): Promise<{ ok: boolean; method: \"trash\" | \"unlink\"; error?: string }> {\r\n\t// Try `trash` first (if installed)\r\n\tconst trashArgs = sessionPath.startsWith(\"-\") ? [\"--\", sessionPath] : [sessionPath];\r\n\tconst trashResult = spawnSync(\"trash\", trashArgs, { encoding: \"utf-8\" });\r\n\r\n\tconst getTrashErrorHint = (): string | null => {\r\n\t\tconst parts: string[] = [];\r\n\t\tif (trashResult.error) {\r\n\t\t\tparts.push(trashResult.error.message);\r\n\t\t}\r\n\t\tconst stderr = trashResult.stderr?.trim();\r\n\t\tif (stderr) {\r\n\t\t\tparts.push(stderr.split(\"\\n\")[0] ?? stderr);\r\n\t\t}\r\n\t\tif (parts.length === 0) return null;\r\n\t\treturn `trash: ${parts.join(\" · \").slice(0, 200)}`;\r\n\t};\r\n\r\n\t// If trash reports success, or the file is gone afterwards, treat it as successful\r\n\tif (trashResult.status === 0 || !existsSync(sessionPath)) {\r\n\t\treturn { ok: true, method: \"trash\" };\r\n\t}\r\n\r\n\t// Fallback to permanent deletion\r\n\ttry {\r\n\t\tawait unlink(sessionPath);\r\n\t\treturn { ok: true, method: \"unlink\" };\r\n\t} catch (err) {\r\n\t\tconst unlinkError = err instanceof Error ? err.message : String(err);\r\n\t\tconst trashErrorHint = getTrashErrorHint();\r\n\t\tconst error = trashErrorHint ? `${unlinkError} (${trashErrorHint})` : unlinkError;\r\n\t\treturn { ok: false, method: \"unlink\", error };\r\n\t}\r\n}\r\n\r\n/**\r\n * Component that renders a session selector\r\n */\r\nexport class SessionSelectorComponent extends Container implements Focusable {\r\n\thandleInput(data: string): void {\r\n\t\tif (this.mode === \"rename\") {\r\n\t\t\tconst kb = getEditorKeybindings();\r\n\t\t\tif (kb.matches(data, \"selectCancel\") || matchesKey(data, \"ctrl+c\")) {\r\n\t\t\t\tthis.exitRenameMode();\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tthis.renameInput.handleInput(data);\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis.sessionList.handleInput(data);\r\n\t}\r\n\r\n\tprivate canRename = true;\r\n\tprivate sessionList: SessionList;\r\n\tprivate header: SessionSelectorHeader;\r\n\tprivate keybindings: KeybindingsManager;\r\n\tprivate scope: SessionScope = \"current\";\r\n\tprivate sortMode: SortMode = \"threaded\";\r\n\tprivate nameFilter: NameFilter = \"all\";\r\n\tprivate currentSessions: SessionInfo[] | null = null;\r\n\tprivate allSessions: SessionInfo[] | null = null;\r\n\tprivate currentSessionsLoader: SessionsLoader;\r\n\tprivate allSessionsLoader: SessionsLoader;\r\n\tprivate onCancel: () => void;\r\n\tprivate requestRender: () => void;\r\n\tprivate renameSession?: (sessionPath: string, currentName: string | undefined) => Promise<void>;\r\n\tprivate currentLoading = false;\r\n\tprivate allLoading = false;\r\n\tprivate allLoadSeq = 0;\r\n\r\n\tprivate mode: \"list\" | \"rename\" = \"list\";\r\n\tprivate renameInput = new Input();\r\n\tprivate renameTargetPath: string | null = null;\r\n\r\n\t// Focusable implementation - propagate to sessionList for IME cursor positioning\r\n\tprivate _focused = false;\r\n\tget focused(): boolean {\r\n\t\treturn this._focused;\r\n\t}\r\n\tset focused(value: boolean) {\r\n\t\tthis._focused = value;\r\n\t\tthis.sessionList.focused = value;\r\n\t\tthis.renameInput.focused = value;\r\n\t\tif (value && this.mode === \"rename\") {\r\n\t\t\tthis.renameInput.focused = true;\r\n\t\t}\r\n\t}\r\n\r\n\tprivate buildBaseLayout(content: Component, options?: { showHeader?: boolean }): void {\r\n\t\tthis.clear();\r\n\t\tthis.addChild(new Spacer(1));\r\n\t\tthis.addChild(new DynamicBorder((s) => theme.fg(\"accent\", s)));\r\n\t\tthis.addChild(new Spacer(1));\r\n\t\tif (options?.showHeader ?? true) {\r\n\t\t\tthis.addChild(this.header);\r\n\t\t\tthis.addChild(new Spacer(1));\r\n\t\t}\r\n\t\tthis.addChild(content);\r\n\t\tthis.addChild(new Spacer(1));\r\n\t\tthis.addChild(new DynamicBorder((s) => theme.fg(\"accent\", s)));\r\n\t}\r\n\r\n\tconstructor(\r\n\t\tcurrentSessionsLoader: SessionsLoader,\r\n\t\tallSessionsLoader: SessionsLoader,\r\n\t\tonSelect: (sessionPath: string) => void,\r\n\t\tonCancel: () => void,\r\n\t\tonExit: () => void,\r\n\t\trequestRender: () => void,\r\n\t\toptions?: {\r\n\t\t\trenameSession?: (sessionPath: string, currentName: string | undefined) => Promise<void>;\r\n\t\t\tshowRenameHint?: boolean;\r\n\t\t\tkeybindings?: KeybindingsManager;\r\n\t\t},\r\n\t\tcurrentSessionFilePath?: string,\r\n\t) {\r\n\t\tsuper();\r\n\t\tthis.keybindings = options?.keybindings ?? KeybindingsManager.create();\r\n\t\tthis.currentSessionsLoader = currentSessionsLoader;\r\n\t\tthis.allSessionsLoader = allSessionsLoader;\r\n\t\tthis.onCancel = onCancel;\r\n\t\tthis.requestRender = requestRender;\r\n\t\tthis.header = new SessionSelectorHeader(\r\n\t\t\tthis.scope,\r\n\t\t\tthis.sortMode,\r\n\t\t\tthis.nameFilter,\r\n\t\t\tthis.keybindings,\r\n\t\t\tthis.requestRender,\r\n\t\t);\r\n\t\tconst renameSession = options?.renameSession;\r\n\t\tthis.renameSession = renameSession;\r\n\t\tthis.canRename = !!renameSession;\r\n\t\tthis.header.setShowRenameHint(options?.showRenameHint ?? this.canRename);\r\n\r\n\t\t// Create session list (starts empty, will be populated after load)\r\n\t\tthis.sessionList = new SessionList(\r\n\t\t\t[],\r\n\t\t\tfalse,\r\n\t\t\tthis.sortMode,\r\n\t\t\tthis.nameFilter,\r\n\t\t\tthis.keybindings,\r\n\t\t\tcurrentSessionFilePath,\r\n\t\t);\r\n\r\n\t\tthis.buildBaseLayout(this.sessionList);\r\n\r\n\t\tthis.renameInput.onSubmit = (value) => {\r\n\t\t\tvoid this.confirmRename(value);\r\n\t\t};\r\n\r\n\t\t// Ensure header status timeouts are cleared when leaving the selector\r\n\t\tconst clearStatusMessage = () => this.header.setStatusMessage(null);\r\n\t\tthis.sessionList.onSelect = (sessionPath) => {\r\n\t\t\tclearStatusMessage();\r\n\t\t\tonSelect(sessionPath);\r\n\t\t};\r\n\t\tthis.sessionList.onCancel = () => {\r\n\t\t\tclearStatusMessage();\r\n\t\t\tonCancel();\r\n\t\t};\r\n\t\tthis.sessionList.onExit = () => {\r\n\t\t\tclearStatusMessage();\r\n\t\t\tonExit();\r\n\t\t};\r\n\t\tthis.sessionList.onToggleScope = () => this.toggleScope();\r\n\t\tthis.sessionList.onToggleSort = () => this.toggleSortMode();\r\n\t\tthis.sessionList.onToggleNameFilter = () => this.toggleNameFilter();\r\n\t\tthis.sessionList.onRenameSession = (sessionPath) => {\r\n\t\t\tif (!renameSession) return;\r\n\t\t\tif (this.scope === \"current\" && this.currentLoading) return;\r\n\t\t\tif (this.scope === \"all\" && this.allLoading) return;\r\n\r\n\t\t\tconst sessions = this.scope === \"all\" ? (this.allSessions ?? []) : (this.currentSessions ?? []);\r\n\t\t\tconst session = sessions.find((s) => s.path === sessionPath);\r\n\t\t\tthis.enterRenameMode(sessionPath, session?.name);\r\n\t\t};\r\n\r\n\t\t// Sync list events to header\r\n\t\tthis.sessionList.onTogglePath = (showPath) => {\r\n\t\t\tthis.header.setShowPath(showPath);\r\n\t\t\tthis.requestRender();\r\n\t\t};\r\n\t\tthis.sessionList.onDeleteConfirmationChange = (path) => {\r\n\t\t\tthis.header.setConfirmingDeletePath(path);\r\n\t\t\tthis.requestRender();\r\n\t\t};\r\n\t\tthis.sessionList.onError = (msg) => {\r\n\t\t\tthis.header.setStatusMessage({ type: \"error\", message: msg }, 3000);\r\n\t\t\tthis.requestRender();\r\n\t\t};\r\n\r\n\t\t// Handle session deletion\r\n\t\tthis.sessionList.onDeleteSession = async (sessionPath: string) => {\r\n\t\t\tconst result = await deleteSessionFile(sessionPath);\r\n\r\n\t\t\tif (result.ok) {\r\n\t\t\t\tif (this.currentSessions) {\r\n\t\t\t\t\tthis.currentSessions = this.currentSessions.filter((s) => s.path !== sessionPath);\r\n\t\t\t\t}\r\n\t\t\t\tif (this.allSessions) {\r\n\t\t\t\t\tthis.allSessions = this.allSessions.filter((s) => s.path !== sessionPath);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tconst sessions = this.scope === \"all\" ? (this.allSessions ?? []) : (this.currentSessions ?? []);\r\n\t\t\t\tconst showCwd = this.scope === \"all\";\r\n\t\t\t\tthis.sessionList.setSessions(sessions, showCwd);\r\n\r\n\t\t\t\tconst msg = result.method === \"trash\" ? \"Session moved to trash\" : \"Session deleted\";\r\n\t\t\t\tthis.header.setStatusMessage({ type: \"info\", message: msg }, 2000);\r\n\t\t\t\tawait this.refreshSessionsAfterMutation();\r\n\t\t\t} else {\r\n\t\t\t\tconst errorMessage = result.error ?? \"Unknown error\";\r\n\t\t\t\tthis.header.setStatusMessage({ type: \"error\", message: `Failed to delete: ${errorMessage}` }, 3000);\r\n\t\t\t}\r\n\r\n\t\t\tthis.requestRender();\r\n\t\t};\r\n\r\n\t\t// Start loading current sessions immediately\r\n\t\tthis.loadCurrentSessions();\r\n\t}\r\n\r\n\tprivate loadCurrentSessions(): void {\r\n\t\tvoid this.loadScope(\"current\", \"initial\");\r\n\t}\r\n\r\n\tprivate enterRenameMode(sessionPath: string, currentName: string | undefined): void {\r\n\t\tthis.mode = \"rename\";\r\n\t\tthis.renameTargetPath = sessionPath;\r\n\t\tthis.renameInput.setValue(currentName ?? \"\");\r\n\t\tthis.renameInput.focused = true;\r\n\r\n\t\tconst panel = new Container();\r\n\t\tpanel.addChild(new Text(theme.bold(\"Rename Session\"), 1, 0));\r\n\t\tpanel.addChild(new Spacer(1));\r\n\t\tpanel.addChild(this.renameInput);\r\n\t\tpanel.addChild(new Spacer(1));\r\n\t\tpanel.addChild(new Text(theme.fg(\"muted\", \"Enter to save · Esc/Ctrl+C to cancel\"), 1, 0));\r\n\r\n\t\tthis.buildBaseLayout(panel, { showHeader: false });\r\n\t\tthis.requestRender();\r\n\t}\r\n\r\n\tprivate exitRenameMode(): void {\r\n\t\tthis.mode = \"list\";\r\n\t\tthis.renameTargetPath = null;\r\n\r\n\t\tthis.buildBaseLayout(this.sessionList);\r\n\r\n\t\tthis.requestRender();\r\n\t}\r\n\r\n\tprivate async confirmRename(value: string): Promise<void> {\r\n\t\tconst next = value.trim();\r\n\t\tif (!next) return;\r\n\t\tconst target = this.renameTargetPath;\r\n\t\tif (!target) {\r\n\t\t\tthis.exitRenameMode();\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t// Find current name for callback\r\n\t\tconst renameSession = this.renameSession;\r\n\t\tif (!renameSession) {\r\n\t\t\tthis.exitRenameMode();\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\ttry {\r\n\t\t\tawait renameSession(target, next);\r\n\t\t\tawait this.refreshSessionsAfterMutation();\r\n\t\t} finally {\r\n\t\t\tthis.exitRenameMode();\r\n\t\t}\r\n\t}\r\n\r\n\tprivate async loadScope(scope: SessionScope, reason: \"initial\" | \"refresh\" | \"toggle\"): Promise<void> {\r\n\t\tconst showCwd = scope === \"all\";\r\n\r\n\t\t// Mark loading\r\n\t\tif (scope === \"current\") {\r\n\t\t\tthis.currentLoading = true;\r\n\t\t} else {\r\n\t\t\tthis.allLoading = true;\r\n\t\t}\r\n\r\n\t\tconst seq = scope === \"all\" ? ++this.allLoadSeq : undefined;\r\n\t\tthis.header.setScope(scope);\r\n\t\tthis.header.setLoading(true);\r\n\t\tthis.requestRender();\r\n\r\n\t\tconst onProgress = (loaded: number, total: number) => {\r\n\t\t\tif (scope !== this.scope) return;\r\n\t\t\tif (seq !== undefined && seq !== this.allLoadSeq) return;\r\n\t\t\tthis.header.setProgress(loaded, total);\r\n\t\t\tthis.requestRender();\r\n\t\t};\r\n\r\n\t\ttry {\r\n\t\t\tconst sessions = await (scope === \"current\"\r\n\t\t\t\t? this.currentSessionsLoader(onProgress)\r\n\t\t\t\t: this.allSessionsLoader(onProgress));\r\n\r\n\t\t\tif (scope === \"current\") {\r\n\t\t\t\tthis.currentSessions = sessions;\r\n\t\t\t\tthis.currentLoading = false;\r\n\t\t\t} else {\r\n\t\t\t\tthis.allSessions = sessions;\r\n\t\t\t\tthis.allLoading = false;\r\n\t\t\t}\r\n\r\n\t\t\tif (scope !== this.scope) return;\r\n\t\t\tif (seq !== undefined && seq !== this.allLoadSeq) return;\r\n\r\n\t\t\tthis.header.setLoading(false);\r\n\t\t\tthis.sessionList.setSessions(sessions, showCwd);\r\n\t\t\tthis.requestRender();\r\n\r\n\t\t\tif (scope === \"all\" && sessions.length === 0 && (this.currentSessions?.length ?? 0) === 0) {\r\n\t\t\t\tthis.onCancel();\r\n\t\t\t}\r\n\t\t} catch (err) {\r\n\t\t\tif (scope === \"current\") {\r\n\t\t\t\tthis.currentLoading = false;\r\n\t\t\t} else {\r\n\t\t\t\tthis.allLoading = false;\r\n\t\t\t}\r\n\r\n\t\t\tif (scope !== this.scope) return;\r\n\t\t\tif (seq !== undefined && seq !== this.allLoadSeq) return;\r\n\r\n\t\t\tconst message = err instanceof Error ? err.message : String(err);\r\n\t\t\tthis.header.setLoading(false);\r\n\t\t\tthis.header.setStatusMessage({ type: \"error\", message: `Failed to load sessions: ${message}` }, 4000);\r\n\r\n\t\t\tif (reason === \"initial\") {\r\n\t\t\t\tthis.sessionList.setSessions([], showCwd);\r\n\t\t\t}\r\n\t\t\tthis.requestRender();\r\n\t\t}\r\n\t}\r\n\r\n\tprivate toggleSortMode(): void {\r\n\t\t// Cycle: threaded -> recent -> relevance -> threaded\r\n\t\tthis.sortMode = this.sortMode === \"threaded\" ? \"recent\" : this.sortMode === \"recent\" ? \"relevance\" : \"threaded\";\r\n\t\tthis.header.setSortMode(this.sortMode);\r\n\t\tthis.sessionList.setSortMode(this.sortMode);\r\n\t\tthis.requestRender();\r\n\t}\r\n\r\n\tprivate toggleNameFilter(): void {\r\n\t\tthis.nameFilter = this.nameFilter === \"all\" ? \"named\" : \"all\";\r\n\t\tthis.header.setNameFilter(this.nameFilter);\r\n\t\tthis.sessionList.setNameFilter(this.nameFilter);\r\n\t\tthis.requestRender();\r\n\t}\r\n\r\n\tprivate async refreshSessionsAfterMutation(): Promise<void> {\r\n\t\tawait this.loadScope(this.scope, \"refresh\");\r\n\t}\r\n\r\n\tprivate toggleScope(): void {\r\n\t\tif (this.scope === \"current\") {\r\n\t\t\tthis.scope = \"all\";\r\n\t\t\tthis.header.setScope(this.scope);\r\n\r\n\t\t\tif (this.allSessions !== null) {\r\n\t\t\t\tthis.header.setLoading(false);\r\n\t\t\t\tthis.sessionList.setSessions(this.allSessions, true);\r\n\t\t\t\tthis.requestRender();\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tif (!this.allLoading) {\r\n\t\t\t\tvoid this.loadScope(\"all\", \"toggle\");\r\n\t\t\t}\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis.scope = \"current\";\r\n\t\tthis.header.setScope(this.scope);\r\n\t\tthis.header.setLoading(this.currentLoading);\r\n\t\tthis.sessionList.setSessions(this.currentSessions ?? [], false);\r\n\t\tthis.requestRender();\r\n\t}\r\n\r\n\tgetSessionList(): SessionList {\r\n\t\treturn this.sessionList;\r\n\t}\r\n}\r\n"]}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import type { ThinkingLevel } from "@mariozechner/pi-agent-core";
|
|
2
|
+
import type { Transport } from "@mariozechner/pi-ai";
|
|
3
|
+
import { Container, SettingsList } from "@mariozechner/pi-tui";
|
|
4
|
+
export interface SettingsConfig {
|
|
5
|
+
autoCompact: boolean;
|
|
6
|
+
showImages: boolean;
|
|
7
|
+
autoResizeImages: boolean;
|
|
8
|
+
blockImages: boolean;
|
|
9
|
+
enableSkillCommands: boolean;
|
|
10
|
+
steeringMode: "all" | "one-at-a-time";
|
|
11
|
+
followUpMode: "all" | "one-at-a-time";
|
|
12
|
+
transport: Transport;
|
|
13
|
+
thinkingLevel: ThinkingLevel;
|
|
14
|
+
availableThinkingLevels: ThinkingLevel[];
|
|
15
|
+
currentTheme: string;
|
|
16
|
+
availableThemes: string[];
|
|
17
|
+
hideThinkingBlock: boolean;
|
|
18
|
+
collapseChangelog: boolean;
|
|
19
|
+
doubleEscapeAction: "fork" | "tree" | "none";
|
|
20
|
+
showHardwareCursor: boolean;
|
|
21
|
+
editorPaddingX: number;
|
|
22
|
+
autocompleteMaxVisible: number;
|
|
23
|
+
quietStartup: boolean;
|
|
24
|
+
clearOnShrink: boolean;
|
|
25
|
+
memoryEnabled: boolean;
|
|
26
|
+
}
|
|
27
|
+
export interface SettingsCallbacks {
|
|
28
|
+
onAutoCompactChange: (enabled: boolean) => void;
|
|
29
|
+
onShowImagesChange: (enabled: boolean) => void;
|
|
30
|
+
onAutoResizeImagesChange: (enabled: boolean) => void;
|
|
31
|
+
onBlockImagesChange: (blocked: boolean) => void;
|
|
32
|
+
onEnableSkillCommandsChange: (enabled: boolean) => void;
|
|
33
|
+
onSteeringModeChange: (mode: "all" | "one-at-a-time") => void;
|
|
34
|
+
onFollowUpModeChange: (mode: "all" | "one-at-a-time") => void;
|
|
35
|
+
onTransportChange: (transport: Transport) => void;
|
|
36
|
+
onThinkingLevelChange: (level: ThinkingLevel) => void;
|
|
37
|
+
onThemeChange: (theme: string) => void;
|
|
38
|
+
onThemePreview?: (theme: string) => void;
|
|
39
|
+
onHideThinkingBlockChange: (hidden: boolean) => void;
|
|
40
|
+
onCollapseChangelogChange: (collapsed: boolean) => void;
|
|
41
|
+
onDoubleEscapeActionChange: (action: "fork" | "tree" | "none") => void;
|
|
42
|
+
onShowHardwareCursorChange: (enabled: boolean) => void;
|
|
43
|
+
onEditorPaddingXChange: (padding: number) => void;
|
|
44
|
+
onAutocompleteMaxVisibleChange: (maxVisible: number) => void;
|
|
45
|
+
onQuietStartupChange: (enabled: boolean) => void;
|
|
46
|
+
onClearOnShrinkChange: (enabled: boolean) => void;
|
|
47
|
+
onMemoryEnabledChange: (enabled: boolean) => void;
|
|
48
|
+
onCancel: () => void;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Main settings selector component.
|
|
52
|
+
*/
|
|
53
|
+
export declare class SettingsSelectorComponent extends Container {
|
|
54
|
+
private settingsList;
|
|
55
|
+
constructor(config: SettingsConfig, callbacks: SettingsCallbacks);
|
|
56
|
+
getSettingsList(): SettingsList;
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=settings-selector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"settings-selector.d.ts","sourceRoot":"","sources":["../../../../src/modes/interactive/components/settings-selector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AACjE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EACN,SAAS,EAKT,YAAY,EAGZ,MAAM,sBAAsB,CAAC;AAa9B,MAAM,WAAW,cAAc;IAC9B,WAAW,EAAE,OAAO,CAAC;IACrB,UAAU,EAAE,OAAO,CAAC;IACpB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,WAAW,EAAE,OAAO,CAAC;IACrB,mBAAmB,EAAE,OAAO,CAAC;IAC7B,YAAY,EAAE,KAAK,GAAG,eAAe,CAAC;IACtC,YAAY,EAAE,KAAK,GAAG,eAAe,CAAC;IACtC,SAAS,EAAE,SAAS,CAAC;IACrB,aAAa,EAAE,aAAa,CAAC;IAC7B,uBAAuB,EAAE,aAAa,EAAE,CAAC;IACzC,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,iBAAiB,EAAE,OAAO,CAAC;IAC3B,iBAAiB,EAAE,OAAO,CAAC;IAC3B,kBAAkB,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;IAC7C,kBAAkB,EAAE,OAAO,CAAC;IAC5B,cAAc,EAAE,MAAM,CAAC;IACvB,sBAAsB,EAAE,MAAM,CAAC;IAC/B,YAAY,EAAE,OAAO,CAAC;IACtB,aAAa,EAAE,OAAO,CAAC;IACvB,aAAa,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,iBAAiB;IACjC,mBAAmB,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IAChD,kBAAkB,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IAC/C,wBAAwB,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IACrD,mBAAmB,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IAChD,2BAA2B,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IACxD,oBAAoB,EAAE,CAAC,IAAI,EAAE,KAAK,GAAG,eAAe,KAAK,IAAI,CAAC;IAC9D,oBAAoB,EAAE,CAAC,IAAI,EAAE,KAAK,GAAG,eAAe,KAAK,IAAI,CAAC;IAC9D,iBAAiB,EAAE,CAAC,SAAS,EAAE,SAAS,KAAK,IAAI,CAAC;IAClD,qBAAqB,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,CAAC;IACtD,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACzC,yBAAyB,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;IACrD,yBAAyB,EAAE,CAAC,SAAS,EAAE,OAAO,KAAK,IAAI,CAAC;IACxD,0BAA0B,EAAE,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,KAAK,IAAI,CAAC;IACvE,0BAA0B,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IACvD,sBAAsB,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAClD,8BAA8B,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7D,oBAAoB,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IACjD,qBAAqB,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IAClD,qBAAqB,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IAClD,QAAQ,EAAE,MAAM,IAAI,CAAC;CACrB;AAgED;;GAEG;AACH,qBAAa,yBAA0B,SAAQ,SAAS;IACvD,OAAO,CAAC,YAAY,CAAe;IAEnC,YAAY,MAAM,EAAE,cAAc,EAAE,SAAS,EAAE,iBAAiB,EAoR/D;IAED,eAAe,IAAI,YAAY,CAE9B;CACD","sourcesContent":["import type { ThinkingLevel } from \"@mariozechner/pi-agent-core\";\r\nimport type { Transport } from \"@mariozechner/pi-ai\";\r\nimport {\r\n\tContainer,\r\n\tgetCapabilities,\r\n\ttype SelectItem,\r\n\tSelectList,\r\n\ttype SettingItem,\r\n\tSettingsList,\r\n\tSpacer,\r\n\tText,\r\n} from \"@mariozechner/pi-tui\";\r\nimport { getSelectListTheme, getSettingsListTheme, theme } from \"../theme/theme.js\";\r\nimport { DynamicBorder } from \"./dynamic-border.js\";\r\n\r\nconst THINKING_DESCRIPTIONS: Record<ThinkingLevel, string> = {\r\n\toff: \"No reasoning\",\r\n\tminimal: \"Very brief reasoning (~1k tokens)\",\r\n\tlow: \"Light reasoning (~2k tokens)\",\r\n\tmedium: \"Moderate reasoning (~8k tokens)\",\r\n\thigh: \"Deep reasoning (~16k tokens)\",\r\n\txhigh: \"Maximum reasoning (~32k tokens)\",\r\n};\r\n\r\nexport interface SettingsConfig {\r\n\tautoCompact: boolean;\r\n\tshowImages: boolean;\r\n\tautoResizeImages: boolean;\r\n\tblockImages: boolean;\r\n\tenableSkillCommands: boolean;\r\n\tsteeringMode: \"all\" | \"one-at-a-time\";\r\n\tfollowUpMode: \"all\" | \"one-at-a-time\";\r\n\ttransport: Transport;\r\n\tthinkingLevel: ThinkingLevel;\r\n\tavailableThinkingLevels: ThinkingLevel[];\r\n\tcurrentTheme: string;\r\n\tavailableThemes: string[];\r\n\thideThinkingBlock: boolean;\r\n\tcollapseChangelog: boolean;\r\n\tdoubleEscapeAction: \"fork\" | \"tree\" | \"none\";\r\n\tshowHardwareCursor: boolean;\r\n\teditorPaddingX: number;\r\n\tautocompleteMaxVisible: number;\r\n\tquietStartup: boolean;\r\n\tclearOnShrink: boolean;\r\n\tmemoryEnabled: boolean;\r\n}\r\n\r\nexport interface SettingsCallbacks {\r\n\tonAutoCompactChange: (enabled: boolean) => void;\r\n\tonShowImagesChange: (enabled: boolean) => void;\r\n\tonAutoResizeImagesChange: (enabled: boolean) => void;\r\n\tonBlockImagesChange: (blocked: boolean) => void;\r\n\tonEnableSkillCommandsChange: (enabled: boolean) => void;\r\n\tonSteeringModeChange: (mode: \"all\" | \"one-at-a-time\") => void;\r\n\tonFollowUpModeChange: (mode: \"all\" | \"one-at-a-time\") => void;\r\n\tonTransportChange: (transport: Transport) => void;\r\n\tonThinkingLevelChange: (level: ThinkingLevel) => void;\r\n\tonThemeChange: (theme: string) => void;\r\n\tonThemePreview?: (theme: string) => void;\r\n\tonHideThinkingBlockChange: (hidden: boolean) => void;\r\n\tonCollapseChangelogChange: (collapsed: boolean) => void;\r\n\tonDoubleEscapeActionChange: (action: \"fork\" | \"tree\" | \"none\") => void;\r\n\tonShowHardwareCursorChange: (enabled: boolean) => void;\r\n\tonEditorPaddingXChange: (padding: number) => void;\r\n\tonAutocompleteMaxVisibleChange: (maxVisible: number) => void;\r\n\tonQuietStartupChange: (enabled: boolean) => void;\r\n\tonClearOnShrinkChange: (enabled: boolean) => void;\r\n\tonMemoryEnabledChange: (enabled: boolean) => void;\r\n\tonCancel: () => void;\r\n}\r\n\r\n/**\r\n * A submenu component for selecting from a list of options.\r\n */\r\nclass SelectSubmenu extends Container {\r\n\tprivate selectList: SelectList;\r\n\r\n\tconstructor(\r\n\t\ttitle: string,\r\n\t\tdescription: string,\r\n\t\toptions: SelectItem[],\r\n\t\tcurrentValue: string,\r\n\t\tonSelect: (value: string) => void,\r\n\t\tonCancel: () => void,\r\n\t\tonSelectionChange?: (value: string) => void,\r\n\t) {\r\n\t\tsuper();\r\n\r\n\t\t// Title\r\n\t\tthis.addChild(new Text(theme.bold(theme.fg(\"accent\", title)), 0, 0));\r\n\r\n\t\t// Description\r\n\t\tif (description) {\r\n\t\t\tthis.addChild(new Spacer(1));\r\n\t\t\tthis.addChild(new Text(theme.fg(\"muted\", description), 0, 0));\r\n\t\t}\r\n\r\n\t\t// Spacer\r\n\t\tthis.addChild(new Spacer(1));\r\n\r\n\t\t// Select list\r\n\t\tthis.selectList = new SelectList(options, Math.min(options.length, 10), getSelectListTheme());\r\n\r\n\t\t// Pre-select current value\r\n\t\tconst currentIndex = options.findIndex((o) => o.value === currentValue);\r\n\t\tif (currentIndex !== -1) {\r\n\t\t\tthis.selectList.setSelectedIndex(currentIndex);\r\n\t\t}\r\n\r\n\t\tthis.selectList.onSelect = (item) => {\r\n\t\t\tonSelect(item.value);\r\n\t\t};\r\n\r\n\t\tthis.selectList.onCancel = onCancel;\r\n\r\n\t\tif (onSelectionChange) {\r\n\t\t\tthis.selectList.onSelectionChange = (item) => {\r\n\t\t\t\tonSelectionChange(item.value);\r\n\t\t\t};\r\n\t\t}\r\n\r\n\t\tthis.addChild(this.selectList);\r\n\r\n\t\t// Hint\r\n\t\tthis.addChild(new Spacer(1));\r\n\t\tthis.addChild(new Text(theme.fg(\"dim\", \" Enter to select · Esc to go back\"), 0, 0));\r\n\t}\r\n\r\n\thandleInput(data: string): void {\r\n\t\tthis.selectList.handleInput(data);\r\n\t}\r\n}\r\n\r\n/**\r\n * Main settings selector component.\r\n */\r\nexport class SettingsSelectorComponent extends Container {\r\n\tprivate settingsList: SettingsList;\r\n\r\n\tconstructor(config: SettingsConfig, callbacks: SettingsCallbacks) {\r\n\t\tsuper();\r\n\r\n\t\tconst supportsImages = getCapabilities().images;\r\n\r\n\t\tconst items: SettingItem[] = [\r\n\t\t\t{\r\n\t\t\t\tid: \"autocompact\",\r\n\t\t\t\tlabel: \"Auto-compact\",\r\n\t\t\t\tdescription: \"Automatically compact context when it gets too large\",\r\n\t\t\t\tcurrentValue: config.autoCompact ? \"true\" : \"false\",\r\n\t\t\t\tvalues: [\"true\", \"false\"],\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\tid: \"steering-mode\",\r\n\t\t\t\tlabel: \"Steering mode\",\r\n\t\t\t\tdescription:\r\n\t\t\t\t\t\"Enter while streaming queues steering messages. 'one-at-a-time': deliver one, wait for response. 'all': deliver all at once.\",\r\n\t\t\t\tcurrentValue: config.steeringMode,\r\n\t\t\t\tvalues: [\"one-at-a-time\", \"all\"],\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\tid: \"follow-up-mode\",\r\n\t\t\t\tlabel: \"Follow-up mode\",\r\n\t\t\t\tdescription:\r\n\t\t\t\t\t\"Alt+Enter queues follow-up messages until agent stops. 'one-at-a-time': deliver one, wait for response. 'all': deliver all at once.\",\r\n\t\t\t\tcurrentValue: config.followUpMode,\r\n\t\t\t\tvalues: [\"one-at-a-time\", \"all\"],\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\tid: \"transport\",\r\n\t\t\t\tlabel: \"Transport\",\r\n\t\t\t\tdescription: \"Preferred transport for providers that support multiple transports\",\r\n\t\t\t\tcurrentValue: config.transport,\r\n\t\t\t\tvalues: [\"sse\", \"websocket\", \"auto\"],\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\tid: \"hide-thinking\",\r\n\t\t\t\tlabel: \"Hide thinking\",\r\n\t\t\t\tdescription: \"Hide thinking blocks in assistant responses\",\r\n\t\t\t\tcurrentValue: config.hideThinkingBlock ? \"true\" : \"false\",\r\n\t\t\t\tvalues: [\"true\", \"false\"],\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\tid: \"collapse-changelog\",\r\n\t\t\t\tlabel: \"Collapse changelog\",\r\n\t\t\t\tdescription: \"Show condensed changelog after updates\",\r\n\t\t\t\tcurrentValue: config.collapseChangelog ? \"true\" : \"false\",\r\n\t\t\t\tvalues: [\"true\", \"false\"],\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\tid: \"quiet-startup\",\r\n\t\t\t\tlabel: \"Quiet startup\",\r\n\t\t\t\tdescription: \"Disable verbose printing at startup\",\r\n\t\t\t\tcurrentValue: config.quietStartup ? \"true\" : \"false\",\r\n\t\t\t\tvalues: [\"true\", \"false\"],\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\tid: \"double-escape-action\",\r\n\t\t\t\tlabel: \"Double-escape action\",\r\n\t\t\t\tdescription: \"Action when pressing Escape twice with empty editor\",\r\n\t\t\t\tcurrentValue: config.doubleEscapeAction,\r\n\t\t\t\tvalues: [\"tree\", \"fork\", \"none\"],\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\tid: \"thinking\",\r\n\t\t\t\tlabel: \"Thinking level\",\r\n\t\t\t\tdescription: \"Reasoning depth for thinking-capable models\",\r\n\t\t\t\tcurrentValue: config.thinkingLevel,\r\n\t\t\t\tsubmenu: (currentValue, done) =>\r\n\t\t\t\t\tnew SelectSubmenu(\r\n\t\t\t\t\t\t\"Thinking Level\",\r\n\t\t\t\t\t\t\"Select reasoning depth for thinking-capable models\",\r\n\t\t\t\t\t\tconfig.availableThinkingLevels.map((level) => ({\r\n\t\t\t\t\t\t\tvalue: level,\r\n\t\t\t\t\t\t\tlabel: level,\r\n\t\t\t\t\t\t\tdescription: THINKING_DESCRIPTIONS[level],\r\n\t\t\t\t\t\t})),\r\n\t\t\t\t\t\tcurrentValue,\r\n\t\t\t\t\t\t(value) => {\r\n\t\t\t\t\t\t\tcallbacks.onThinkingLevelChange(value as ThinkingLevel);\r\n\t\t\t\t\t\t\tdone(value);\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\t() => done(),\r\n\t\t\t\t\t),\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\tid: \"theme\",\r\n\t\t\t\tlabel: \"Theme\",\r\n\t\t\t\tdescription: \"Color theme for the interface\",\r\n\t\t\t\tcurrentValue: config.currentTheme,\r\n\t\t\t\tsubmenu: (currentValue, done) =>\r\n\t\t\t\t\tnew SelectSubmenu(\r\n\t\t\t\t\t\t\"Theme\",\r\n\t\t\t\t\t\t\"Select color theme\",\r\n\t\t\t\t\t\tconfig.availableThemes.map((t) => ({\r\n\t\t\t\t\t\t\tvalue: t,\r\n\t\t\t\t\t\t\tlabel: t,\r\n\t\t\t\t\t\t})),\r\n\t\t\t\t\t\tcurrentValue,\r\n\t\t\t\t\t\t(value) => {\r\n\t\t\t\t\t\t\tcallbacks.onThemeChange(value);\r\n\t\t\t\t\t\t\tdone(value);\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\t() => {\r\n\t\t\t\t\t\t\t// Restore original theme on cancel\r\n\t\t\t\t\t\t\tcallbacks.onThemePreview?.(currentValue);\r\n\t\t\t\t\t\t\tdone();\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\t(value) => {\r\n\t\t\t\t\t\t\t// Preview theme on selection change\r\n\t\t\t\t\t\t\tcallbacks.onThemePreview?.(value);\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t),\r\n\t\t\t},\r\n\t\t];\r\n\r\n\t\t// Only show image toggle if terminal supports it\r\n\t\tif (supportsImages) {\r\n\t\t\t// Insert after autocompact\r\n\t\t\titems.splice(1, 0, {\r\n\t\t\t\tid: \"show-images\",\r\n\t\t\t\tlabel: \"Show images\",\r\n\t\t\t\tdescription: \"Render images inline in terminal\",\r\n\t\t\t\tcurrentValue: config.showImages ? \"true\" : \"false\",\r\n\t\t\t\tvalues: [\"true\", \"false\"],\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\t// Image auto-resize toggle (always available, affects both attached and read images)\r\n\t\titems.splice(supportsImages ? 2 : 1, 0, {\r\n\t\t\tid: \"auto-resize-images\",\r\n\t\t\tlabel: \"Auto-resize images\",\r\n\t\t\tdescription: \"Resize large images to 2000x2000 max for better model compatibility\",\r\n\t\t\tcurrentValue: config.autoResizeImages ? \"true\" : \"false\",\r\n\t\t\tvalues: [\"true\", \"false\"],\r\n\t\t});\r\n\r\n\t\t// Block images toggle (always available, insert after auto-resize-images)\r\n\t\tconst autoResizeIndex = items.findIndex((item) => item.id === \"auto-resize-images\");\r\n\t\titems.splice(autoResizeIndex + 1, 0, {\r\n\t\t\tid: \"block-images\",\r\n\t\t\tlabel: \"Block images\",\r\n\t\t\tdescription: \"Prevent images from being sent to LLM providers\",\r\n\t\t\tcurrentValue: config.blockImages ? \"true\" : \"false\",\r\n\t\t\tvalues: [\"true\", \"false\"],\r\n\t\t});\r\n\r\n\t\t// Skill commands toggle (insert after block-images)\r\n\t\tconst blockImagesIndex = items.findIndex((item) => item.id === \"block-images\");\r\n\t\titems.splice(blockImagesIndex + 1, 0, {\r\n\t\t\tid: \"skill-commands\",\r\n\t\t\tlabel: \"Skill commands\",\r\n\t\t\tdescription: \"Register skills as /skill:name commands\",\r\n\t\t\tcurrentValue: config.enableSkillCommands ? \"true\" : \"false\",\r\n\t\t\tvalues: [\"true\", \"false\"],\r\n\t\t});\r\n\r\n\t\t// Hardware cursor toggle (insert after skill-commands)\r\n\t\tconst skillCommandsIndex = items.findIndex((item) => item.id === \"skill-commands\");\r\n\t\titems.splice(skillCommandsIndex + 1, 0, {\r\n\t\t\tid: \"show-hardware-cursor\",\r\n\t\t\tlabel: \"Show hardware cursor\",\r\n\t\t\tdescription: \"Show the terminal cursor while still positioning it for IME support\",\r\n\t\t\tcurrentValue: config.showHardwareCursor ? \"true\" : \"false\",\r\n\t\t\tvalues: [\"true\", \"false\"],\r\n\t\t});\r\n\r\n\t\t// Editor padding toggle (insert after show-hardware-cursor)\r\n\t\tconst hardwareCursorIndex = items.findIndex((item) => item.id === \"show-hardware-cursor\");\r\n\t\titems.splice(hardwareCursorIndex + 1, 0, {\r\n\t\t\tid: \"editor-padding\",\r\n\t\t\tlabel: \"Editor padding\",\r\n\t\t\tdescription: \"Horizontal padding for input editor (0-3)\",\r\n\t\t\tcurrentValue: String(config.editorPaddingX),\r\n\t\t\tvalues: [\"0\", \"1\", \"2\", \"3\"],\r\n\t\t});\r\n\r\n\t\t// Autocomplete max visible toggle (insert after editor-padding)\r\n\t\tconst editorPaddingIndex = items.findIndex((item) => item.id === \"editor-padding\");\r\n\t\titems.splice(editorPaddingIndex + 1, 0, {\r\n\t\t\tid: \"autocomplete-max-visible\",\r\n\t\t\tlabel: \"Autocomplete max items\",\r\n\t\t\tdescription: \"Max visible items in autocomplete dropdown (3-20)\",\r\n\t\t\tcurrentValue: String(config.autocompleteMaxVisible),\r\n\t\t\tvalues: [\"3\", \"5\", \"7\", \"10\", \"15\", \"20\"],\r\n\t\t});\r\n\r\n\t\t// Clear on shrink toggle (insert after autocomplete-max-visible)\r\n\t\tconst autocompleteIndex = items.findIndex((item) => item.id === \"autocomplete-max-visible\");\r\n\t\titems.splice(autocompleteIndex + 1, 0, {\r\n\t\t\tid: \"clear-on-shrink\",\r\n\t\t\tlabel: \"Clear on shrink\",\r\n\t\t\tdescription: \"Clear empty rows when content shrinks (may cause flicker)\",\r\n\t\t\tcurrentValue: config.clearOnShrink ? \"true\" : \"false\",\r\n\t\t\tvalues: [\"true\", \"false\"],\r\n\t\t});\r\n\r\n\t\t// Memory system toggle (insert after clear-on-shrink)\r\n\t\tconst clearOnShrinkIndex = items.findIndex((item) => item.id === \"clear-on-shrink\");\r\n\t\titems.splice(clearOnShrinkIndex + 1, 0, {\r\n\t\t\tid: \"memory-enabled\",\r\n\t\t\tlabel: \"Memory system\",\r\n\t\t\tdescription: \"Persistent memory across sessions (procedural, episodic, semantic)\",\r\n\t\t\tcurrentValue: config.memoryEnabled ? \"true\" : \"false\",\r\n\t\t\tvalues: [\"true\", \"false\"],\r\n\t\t});\r\n\r\n\t\t// Add borders\r\n\t\tthis.addChild(new DynamicBorder());\r\n\r\n\t\tthis.settingsList = new SettingsList(\r\n\t\t\titems,\r\n\t\t\t10,\r\n\t\t\tgetSettingsListTheme(),\r\n\t\t\t(id, newValue) => {\r\n\t\t\t\tswitch (id) {\r\n\t\t\t\t\tcase \"autocompact\":\r\n\t\t\t\t\t\tcallbacks.onAutoCompactChange(newValue === \"true\");\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase \"show-images\":\r\n\t\t\t\t\t\tcallbacks.onShowImagesChange(newValue === \"true\");\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase \"auto-resize-images\":\r\n\t\t\t\t\t\tcallbacks.onAutoResizeImagesChange(newValue === \"true\");\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase \"block-images\":\r\n\t\t\t\t\t\tcallbacks.onBlockImagesChange(newValue === \"true\");\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase \"skill-commands\":\r\n\t\t\t\t\t\tcallbacks.onEnableSkillCommandsChange(newValue === \"true\");\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase \"steering-mode\":\r\n\t\t\t\t\t\tcallbacks.onSteeringModeChange(newValue as \"all\" | \"one-at-a-time\");\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase \"follow-up-mode\":\r\n\t\t\t\t\t\tcallbacks.onFollowUpModeChange(newValue as \"all\" | \"one-at-a-time\");\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase \"transport\":\r\n\t\t\t\t\t\tcallbacks.onTransportChange(newValue as Transport);\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase \"hide-thinking\":\r\n\t\t\t\t\t\tcallbacks.onHideThinkingBlockChange(newValue === \"true\");\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase \"collapse-changelog\":\r\n\t\t\t\t\t\tcallbacks.onCollapseChangelogChange(newValue === \"true\");\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase \"quiet-startup\":\r\n\t\t\t\t\t\tcallbacks.onQuietStartupChange(newValue === \"true\");\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase \"double-escape-action\":\r\n\t\t\t\t\t\tcallbacks.onDoubleEscapeActionChange(newValue as \"fork\" | \"tree\");\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase \"show-hardware-cursor\":\r\n\t\t\t\t\t\tcallbacks.onShowHardwareCursorChange(newValue === \"true\");\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase \"editor-padding\":\r\n\t\t\t\t\t\tcallbacks.onEditorPaddingXChange(parseInt(newValue, 10));\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase \"autocomplete-max-visible\":\r\n\t\t\t\t\t\tcallbacks.onAutocompleteMaxVisibleChange(parseInt(newValue, 10));\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase \"clear-on-shrink\":\r\n\t\t\t\t\t\tcallbacks.onClearOnShrinkChange(newValue === \"true\");\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase \"memory-enabled\":\r\n\t\t\t\t\t\tcallbacks.onMemoryEnabledChange(newValue === \"true\");\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\tcallbacks.onCancel,\r\n\t\t\t{ enableSearch: true },\r\n\t\t);\r\n\r\n\t\tthis.addChild(this.settingsList);\r\n\t\tthis.addChild(new DynamicBorder());\r\n\t}\r\n\r\n\tgetSettingsList(): SettingsList {\r\n\t\treturn this.settingsList;\r\n\t}\r\n}\r\n"]}
|
|
@@ -0,0 +1,299 @@
|
|
|
1
|
+
import { Container, getCapabilities, SelectList, SettingsList, Spacer, Text, } from "@mariozechner/pi-tui";
|
|
2
|
+
import { getSelectListTheme, getSettingsListTheme, theme } from "../theme/theme.js";
|
|
3
|
+
import { DynamicBorder } from "./dynamic-border.js";
|
|
4
|
+
const THINKING_DESCRIPTIONS = {
|
|
5
|
+
off: "No reasoning",
|
|
6
|
+
minimal: "Very brief reasoning (~1k tokens)",
|
|
7
|
+
low: "Light reasoning (~2k tokens)",
|
|
8
|
+
medium: "Moderate reasoning (~8k tokens)",
|
|
9
|
+
high: "Deep reasoning (~16k tokens)",
|
|
10
|
+
xhigh: "Maximum reasoning (~32k tokens)",
|
|
11
|
+
};
|
|
12
|
+
/**
|
|
13
|
+
* A submenu component for selecting from a list of options.
|
|
14
|
+
*/
|
|
15
|
+
class SelectSubmenu extends Container {
|
|
16
|
+
selectList;
|
|
17
|
+
constructor(title, description, options, currentValue, onSelect, onCancel, onSelectionChange) {
|
|
18
|
+
super();
|
|
19
|
+
// Title
|
|
20
|
+
this.addChild(new Text(theme.bold(theme.fg("accent", title)), 0, 0));
|
|
21
|
+
// Description
|
|
22
|
+
if (description) {
|
|
23
|
+
this.addChild(new Spacer(1));
|
|
24
|
+
this.addChild(new Text(theme.fg("muted", description), 0, 0));
|
|
25
|
+
}
|
|
26
|
+
// Spacer
|
|
27
|
+
this.addChild(new Spacer(1));
|
|
28
|
+
// Select list
|
|
29
|
+
this.selectList = new SelectList(options, Math.min(options.length, 10), getSelectListTheme());
|
|
30
|
+
// Pre-select current value
|
|
31
|
+
const currentIndex = options.findIndex((o) => o.value === currentValue);
|
|
32
|
+
if (currentIndex !== -1) {
|
|
33
|
+
this.selectList.setSelectedIndex(currentIndex);
|
|
34
|
+
}
|
|
35
|
+
this.selectList.onSelect = (item) => {
|
|
36
|
+
onSelect(item.value);
|
|
37
|
+
};
|
|
38
|
+
this.selectList.onCancel = onCancel;
|
|
39
|
+
if (onSelectionChange) {
|
|
40
|
+
this.selectList.onSelectionChange = (item) => {
|
|
41
|
+
onSelectionChange(item.value);
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
this.addChild(this.selectList);
|
|
45
|
+
// Hint
|
|
46
|
+
this.addChild(new Spacer(1));
|
|
47
|
+
this.addChild(new Text(theme.fg("dim", " Enter to select · Esc to go back"), 0, 0));
|
|
48
|
+
}
|
|
49
|
+
handleInput(data) {
|
|
50
|
+
this.selectList.handleInput(data);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Main settings selector component.
|
|
55
|
+
*/
|
|
56
|
+
export class SettingsSelectorComponent extends Container {
|
|
57
|
+
settingsList;
|
|
58
|
+
constructor(config, callbacks) {
|
|
59
|
+
super();
|
|
60
|
+
const supportsImages = getCapabilities().images;
|
|
61
|
+
const items = [
|
|
62
|
+
{
|
|
63
|
+
id: "autocompact",
|
|
64
|
+
label: "Auto-compact",
|
|
65
|
+
description: "Automatically compact context when it gets too large",
|
|
66
|
+
currentValue: config.autoCompact ? "true" : "false",
|
|
67
|
+
values: ["true", "false"],
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
id: "steering-mode",
|
|
71
|
+
label: "Steering mode",
|
|
72
|
+
description: "Enter while streaming queues steering messages. 'one-at-a-time': deliver one, wait for response. 'all': deliver all at once.",
|
|
73
|
+
currentValue: config.steeringMode,
|
|
74
|
+
values: ["one-at-a-time", "all"],
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
id: "follow-up-mode",
|
|
78
|
+
label: "Follow-up mode",
|
|
79
|
+
description: "Alt+Enter queues follow-up messages until agent stops. 'one-at-a-time': deliver one, wait for response. 'all': deliver all at once.",
|
|
80
|
+
currentValue: config.followUpMode,
|
|
81
|
+
values: ["one-at-a-time", "all"],
|
|
82
|
+
},
|
|
83
|
+
{
|
|
84
|
+
id: "transport",
|
|
85
|
+
label: "Transport",
|
|
86
|
+
description: "Preferred transport for providers that support multiple transports",
|
|
87
|
+
currentValue: config.transport,
|
|
88
|
+
values: ["sse", "websocket", "auto"],
|
|
89
|
+
},
|
|
90
|
+
{
|
|
91
|
+
id: "hide-thinking",
|
|
92
|
+
label: "Hide thinking",
|
|
93
|
+
description: "Hide thinking blocks in assistant responses",
|
|
94
|
+
currentValue: config.hideThinkingBlock ? "true" : "false",
|
|
95
|
+
values: ["true", "false"],
|
|
96
|
+
},
|
|
97
|
+
{
|
|
98
|
+
id: "collapse-changelog",
|
|
99
|
+
label: "Collapse changelog",
|
|
100
|
+
description: "Show condensed changelog after updates",
|
|
101
|
+
currentValue: config.collapseChangelog ? "true" : "false",
|
|
102
|
+
values: ["true", "false"],
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
id: "quiet-startup",
|
|
106
|
+
label: "Quiet startup",
|
|
107
|
+
description: "Disable verbose printing at startup",
|
|
108
|
+
currentValue: config.quietStartup ? "true" : "false",
|
|
109
|
+
values: ["true", "false"],
|
|
110
|
+
},
|
|
111
|
+
{
|
|
112
|
+
id: "double-escape-action",
|
|
113
|
+
label: "Double-escape action",
|
|
114
|
+
description: "Action when pressing Escape twice with empty editor",
|
|
115
|
+
currentValue: config.doubleEscapeAction,
|
|
116
|
+
values: ["tree", "fork", "none"],
|
|
117
|
+
},
|
|
118
|
+
{
|
|
119
|
+
id: "thinking",
|
|
120
|
+
label: "Thinking level",
|
|
121
|
+
description: "Reasoning depth for thinking-capable models",
|
|
122
|
+
currentValue: config.thinkingLevel,
|
|
123
|
+
submenu: (currentValue, done) => new SelectSubmenu("Thinking Level", "Select reasoning depth for thinking-capable models", config.availableThinkingLevels.map((level) => ({
|
|
124
|
+
value: level,
|
|
125
|
+
label: level,
|
|
126
|
+
description: THINKING_DESCRIPTIONS[level],
|
|
127
|
+
})), currentValue, (value) => {
|
|
128
|
+
callbacks.onThinkingLevelChange(value);
|
|
129
|
+
done(value);
|
|
130
|
+
}, () => done()),
|
|
131
|
+
},
|
|
132
|
+
{
|
|
133
|
+
id: "theme",
|
|
134
|
+
label: "Theme",
|
|
135
|
+
description: "Color theme for the interface",
|
|
136
|
+
currentValue: config.currentTheme,
|
|
137
|
+
submenu: (currentValue, done) => new SelectSubmenu("Theme", "Select color theme", config.availableThemes.map((t) => ({
|
|
138
|
+
value: t,
|
|
139
|
+
label: t,
|
|
140
|
+
})), currentValue, (value) => {
|
|
141
|
+
callbacks.onThemeChange(value);
|
|
142
|
+
done(value);
|
|
143
|
+
}, () => {
|
|
144
|
+
// Restore original theme on cancel
|
|
145
|
+
callbacks.onThemePreview?.(currentValue);
|
|
146
|
+
done();
|
|
147
|
+
}, (value) => {
|
|
148
|
+
// Preview theme on selection change
|
|
149
|
+
callbacks.onThemePreview?.(value);
|
|
150
|
+
}),
|
|
151
|
+
},
|
|
152
|
+
];
|
|
153
|
+
// Only show image toggle if terminal supports it
|
|
154
|
+
if (supportsImages) {
|
|
155
|
+
// Insert after autocompact
|
|
156
|
+
items.splice(1, 0, {
|
|
157
|
+
id: "show-images",
|
|
158
|
+
label: "Show images",
|
|
159
|
+
description: "Render images inline in terminal",
|
|
160
|
+
currentValue: config.showImages ? "true" : "false",
|
|
161
|
+
values: ["true", "false"],
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
// Image auto-resize toggle (always available, affects both attached and read images)
|
|
165
|
+
items.splice(supportsImages ? 2 : 1, 0, {
|
|
166
|
+
id: "auto-resize-images",
|
|
167
|
+
label: "Auto-resize images",
|
|
168
|
+
description: "Resize large images to 2000x2000 max for better model compatibility",
|
|
169
|
+
currentValue: config.autoResizeImages ? "true" : "false",
|
|
170
|
+
values: ["true", "false"],
|
|
171
|
+
});
|
|
172
|
+
// Block images toggle (always available, insert after auto-resize-images)
|
|
173
|
+
const autoResizeIndex = items.findIndex((item) => item.id === "auto-resize-images");
|
|
174
|
+
items.splice(autoResizeIndex + 1, 0, {
|
|
175
|
+
id: "block-images",
|
|
176
|
+
label: "Block images",
|
|
177
|
+
description: "Prevent images from being sent to LLM providers",
|
|
178
|
+
currentValue: config.blockImages ? "true" : "false",
|
|
179
|
+
values: ["true", "false"],
|
|
180
|
+
});
|
|
181
|
+
// Skill commands toggle (insert after block-images)
|
|
182
|
+
const blockImagesIndex = items.findIndex((item) => item.id === "block-images");
|
|
183
|
+
items.splice(blockImagesIndex + 1, 0, {
|
|
184
|
+
id: "skill-commands",
|
|
185
|
+
label: "Skill commands",
|
|
186
|
+
description: "Register skills as /skill:name commands",
|
|
187
|
+
currentValue: config.enableSkillCommands ? "true" : "false",
|
|
188
|
+
values: ["true", "false"],
|
|
189
|
+
});
|
|
190
|
+
// Hardware cursor toggle (insert after skill-commands)
|
|
191
|
+
const skillCommandsIndex = items.findIndex((item) => item.id === "skill-commands");
|
|
192
|
+
items.splice(skillCommandsIndex + 1, 0, {
|
|
193
|
+
id: "show-hardware-cursor",
|
|
194
|
+
label: "Show hardware cursor",
|
|
195
|
+
description: "Show the terminal cursor while still positioning it for IME support",
|
|
196
|
+
currentValue: config.showHardwareCursor ? "true" : "false",
|
|
197
|
+
values: ["true", "false"],
|
|
198
|
+
});
|
|
199
|
+
// Editor padding toggle (insert after show-hardware-cursor)
|
|
200
|
+
const hardwareCursorIndex = items.findIndex((item) => item.id === "show-hardware-cursor");
|
|
201
|
+
items.splice(hardwareCursorIndex + 1, 0, {
|
|
202
|
+
id: "editor-padding",
|
|
203
|
+
label: "Editor padding",
|
|
204
|
+
description: "Horizontal padding for input editor (0-3)",
|
|
205
|
+
currentValue: String(config.editorPaddingX),
|
|
206
|
+
values: ["0", "1", "2", "3"],
|
|
207
|
+
});
|
|
208
|
+
// Autocomplete max visible toggle (insert after editor-padding)
|
|
209
|
+
const editorPaddingIndex = items.findIndex((item) => item.id === "editor-padding");
|
|
210
|
+
items.splice(editorPaddingIndex + 1, 0, {
|
|
211
|
+
id: "autocomplete-max-visible",
|
|
212
|
+
label: "Autocomplete max items",
|
|
213
|
+
description: "Max visible items in autocomplete dropdown (3-20)",
|
|
214
|
+
currentValue: String(config.autocompleteMaxVisible),
|
|
215
|
+
values: ["3", "5", "7", "10", "15", "20"],
|
|
216
|
+
});
|
|
217
|
+
// Clear on shrink toggle (insert after autocomplete-max-visible)
|
|
218
|
+
const autocompleteIndex = items.findIndex((item) => item.id === "autocomplete-max-visible");
|
|
219
|
+
items.splice(autocompleteIndex + 1, 0, {
|
|
220
|
+
id: "clear-on-shrink",
|
|
221
|
+
label: "Clear on shrink",
|
|
222
|
+
description: "Clear empty rows when content shrinks (may cause flicker)",
|
|
223
|
+
currentValue: config.clearOnShrink ? "true" : "false",
|
|
224
|
+
values: ["true", "false"],
|
|
225
|
+
});
|
|
226
|
+
// Memory system toggle (insert after clear-on-shrink)
|
|
227
|
+
const clearOnShrinkIndex = items.findIndex((item) => item.id === "clear-on-shrink");
|
|
228
|
+
items.splice(clearOnShrinkIndex + 1, 0, {
|
|
229
|
+
id: "memory-enabled",
|
|
230
|
+
label: "Memory system",
|
|
231
|
+
description: "Persistent memory across sessions (procedural, episodic, semantic)",
|
|
232
|
+
currentValue: config.memoryEnabled ? "true" : "false",
|
|
233
|
+
values: ["true", "false"],
|
|
234
|
+
});
|
|
235
|
+
// Add borders
|
|
236
|
+
this.addChild(new DynamicBorder());
|
|
237
|
+
this.settingsList = new SettingsList(items, 10, getSettingsListTheme(), (id, newValue) => {
|
|
238
|
+
switch (id) {
|
|
239
|
+
case "autocompact":
|
|
240
|
+
callbacks.onAutoCompactChange(newValue === "true");
|
|
241
|
+
break;
|
|
242
|
+
case "show-images":
|
|
243
|
+
callbacks.onShowImagesChange(newValue === "true");
|
|
244
|
+
break;
|
|
245
|
+
case "auto-resize-images":
|
|
246
|
+
callbacks.onAutoResizeImagesChange(newValue === "true");
|
|
247
|
+
break;
|
|
248
|
+
case "block-images":
|
|
249
|
+
callbacks.onBlockImagesChange(newValue === "true");
|
|
250
|
+
break;
|
|
251
|
+
case "skill-commands":
|
|
252
|
+
callbacks.onEnableSkillCommandsChange(newValue === "true");
|
|
253
|
+
break;
|
|
254
|
+
case "steering-mode":
|
|
255
|
+
callbacks.onSteeringModeChange(newValue);
|
|
256
|
+
break;
|
|
257
|
+
case "follow-up-mode":
|
|
258
|
+
callbacks.onFollowUpModeChange(newValue);
|
|
259
|
+
break;
|
|
260
|
+
case "transport":
|
|
261
|
+
callbacks.onTransportChange(newValue);
|
|
262
|
+
break;
|
|
263
|
+
case "hide-thinking":
|
|
264
|
+
callbacks.onHideThinkingBlockChange(newValue === "true");
|
|
265
|
+
break;
|
|
266
|
+
case "collapse-changelog":
|
|
267
|
+
callbacks.onCollapseChangelogChange(newValue === "true");
|
|
268
|
+
break;
|
|
269
|
+
case "quiet-startup":
|
|
270
|
+
callbacks.onQuietStartupChange(newValue === "true");
|
|
271
|
+
break;
|
|
272
|
+
case "double-escape-action":
|
|
273
|
+
callbacks.onDoubleEscapeActionChange(newValue);
|
|
274
|
+
break;
|
|
275
|
+
case "show-hardware-cursor":
|
|
276
|
+
callbacks.onShowHardwareCursorChange(newValue === "true");
|
|
277
|
+
break;
|
|
278
|
+
case "editor-padding":
|
|
279
|
+
callbacks.onEditorPaddingXChange(parseInt(newValue, 10));
|
|
280
|
+
break;
|
|
281
|
+
case "autocomplete-max-visible":
|
|
282
|
+
callbacks.onAutocompleteMaxVisibleChange(parseInt(newValue, 10));
|
|
283
|
+
break;
|
|
284
|
+
case "clear-on-shrink":
|
|
285
|
+
callbacks.onClearOnShrinkChange(newValue === "true");
|
|
286
|
+
break;
|
|
287
|
+
case "memory-enabled":
|
|
288
|
+
callbacks.onMemoryEnabledChange(newValue === "true");
|
|
289
|
+
break;
|
|
290
|
+
}
|
|
291
|
+
}, callbacks.onCancel, { enableSearch: true });
|
|
292
|
+
this.addChild(this.settingsList);
|
|
293
|
+
this.addChild(new DynamicBorder());
|
|
294
|
+
}
|
|
295
|
+
getSettingsList() {
|
|
296
|
+
return this.settingsList;
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
//# sourceMappingURL=settings-selector.js.map
|