@code-yeongyu/senpi 2026.8.13 → 2026.8.16
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 +142 -0
- package/README.md +1 -0
- package/dist/cli/args.d.ts +1 -0
- package/dist/cli/args.d.ts.map +1 -1
- package/dist/cli/args.js +14 -0
- package/dist/cli/args.js.map +1 -1
- package/dist/cli/auth-command.d.ts.map +1 -1
- package/dist/cli/auth-command.js +5 -4
- package/dist/cli/auth-command.js.map +1 -1
- package/dist/core/agent-session.d.ts +80 -8
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +206 -31
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/auth-storage.d.ts.map +1 -1
- package/dist/core/auth-storage.js +19 -8
- package/dist/core/auth-storage.js.map +1 -1
- package/dist/core/experimental.d.ts +4 -0
- package/dist/core/experimental.d.ts.map +1 -1
- package/dist/core/experimental.js +4 -0
- package/dist/core/experimental.js.map +1 -1
- package/dist/core/export-html/template.js +31 -9
- package/dist/core/extensions/builtin/claude-sdk-oauth/auth-environment.d.ts +4 -0
- package/dist/core/extensions/builtin/claude-sdk-oauth/auth-environment.d.ts.map +1 -0
- package/dist/core/extensions/builtin/claude-sdk-oauth/auth-environment.js +30 -0
- package/dist/core/extensions/builtin/claude-sdk-oauth/auth-environment.js.map +1 -0
- package/dist/core/extensions/builtin/claude-sdk-oauth/auth-lane.d.ts +2 -0
- package/dist/core/extensions/builtin/claude-sdk-oauth/auth-lane.d.ts.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/auth-lane.js +13 -47
- package/dist/core/extensions/builtin/claude-sdk-oauth/auth-lane.js.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/availability.d.ts +18 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/availability.d.ts.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/availability.js +64 -2
- package/dist/core/extensions/builtin/claude-sdk-oauth/availability.js.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/config-dir-credentials.d.ts +3 -0
- package/dist/core/extensions/builtin/claude-sdk-oauth/config-dir-credentials.d.ts.map +1 -0
- package/dist/core/extensions/builtin/claude-sdk-oauth/config-dir-credentials.js +27 -0
- package/dist/core/extensions/builtin/claude-sdk-oauth/config-dir-credentials.js.map +1 -0
- package/dist/core/extensions/builtin/claude-sdk-oauth/oauth-login.d.ts +15 -2
- package/dist/core/extensions/builtin/claude-sdk-oauth/oauth-login.d.ts.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/oauth-login.js +45 -11
- package/dist/core/extensions/builtin/claude-sdk-oauth/oauth-login.js.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/options.d.ts.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/options.js +1 -0
- package/dist/core/extensions/builtin/claude-sdk-oauth/options.js.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-registry-wiring.d.ts.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-registry-wiring.js +3 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-registry-wiring.js.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-stream.js +1 -0
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-stream.js.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-sync.d.ts.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-sync.js +17 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-sync.js.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/stream.d.ts.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/stream.js +1 -0
- package/dist/core/extensions/builtin/claude-sdk-oauth/stream.js.map +1 -1
- package/dist/core/extensions/builtin/compaction/index.d.ts.map +1 -1
- package/dist/core/extensions/builtin/compaction/index.js +225 -75
- package/dist/core/extensions/builtin/compaction/index.js.map +1 -1
- package/dist/core/extensions/builtin/compaction/lane-policy.d.ts +2 -3
- package/dist/core/extensions/builtin/compaction/lane-policy.d.ts.map +1 -1
- package/dist/core/extensions/builtin/compaction/lane-policy.js +2 -3
- package/dist/core/extensions/builtin/compaction/lane-policy.js.map +1 -1
- package/dist/core/extensions/builtin/compaction/log.d.ts +1 -1
- package/dist/core/extensions/builtin/compaction/log.d.ts.map +1 -1
- package/dist/core/extensions/builtin/compaction/log.js +2 -0
- package/dist/core/extensions/builtin/compaction/log.js.map +1 -1
- package/dist/core/extensions/builtin/compaction/overflow-retry.d.ts.map +1 -1
- package/dist/core/extensions/builtin/compaction/overflow-retry.js +38 -4
- package/dist/core/extensions/builtin/compaction/overflow-retry.js.map +1 -1
- package/dist/core/extensions/builtin/compaction/speculative.d.ts.map +1 -1
- package/dist/core/extensions/builtin/compaction/speculative.js +2 -1
- package/dist/core/extensions/builtin/compaction/speculative.js.map +1 -1
- package/dist/core/extensions/builtin/compaction/summarization-turn-order.d.ts +33 -0
- package/dist/core/extensions/builtin/compaction/summarization-turn-order.d.ts.map +1 -0
- package/dist/core/extensions/builtin/compaction/summarization-turn-order.js +67 -0
- package/dist/core/extensions/builtin/compaction/summarization-turn-order.js.map +1 -0
- package/dist/core/extensions/builtin/config-reload/index.d.ts.map +1 -1
- package/dist/core/extensions/builtin/config-reload/index.js +31 -8
- package/dist/core/extensions/builtin/config-reload/index.js.map +1 -1
- package/dist/core/extensions/builtin/config-reload/routine-settings.d.ts.map +1 -1
- package/dist/core/extensions/builtin/config-reload/routine-settings.js +11 -12
- package/dist/core/extensions/builtin/config-reload/routine-settings.js.map +1 -1
- package/dist/core/extensions/builtin/goal/terminal-provider-error.d.ts.map +1 -1
- package/dist/core/extensions/builtin/goal/terminal-provider-error.js +16 -0
- package/dist/core/extensions/builtin/goal/terminal-provider-error.js.map +1 -1
- package/dist/core/extensions/builtin/index.d.ts.map +1 -1
- package/dist/core/extensions/builtin/index.js +4 -0
- package/dist/core/extensions/builtin/index.js.map +1 -1
- package/dist/core/extensions/builtin/mcp/process-tree.js +6 -1
- package/dist/core/extensions/builtin/mcp/process-tree.js.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/glm-5-3.d.ts +3 -0
- package/dist/core/extensions/builtin/prompt-preset/glm-5-3.d.ts.map +1 -0
- package/dist/core/extensions/builtin/prompt-preset/glm-5-3.js +14 -0
- package/dist/core/extensions/builtin/prompt-preset/glm-5-3.js.map +1 -0
- package/dist/core/extensions/builtin/prompt-preset/grok-4.6.d.ts +3 -0
- package/dist/core/extensions/builtin/prompt-preset/grok-4.6.d.ts.map +1 -0
- package/dist/core/extensions/builtin/prompt-preset/grok-4.6.js +91 -0
- package/dist/core/extensions/builtin/prompt-preset/grok-4.6.js.map +1 -0
- package/dist/core/extensions/builtin/prompt-preset/index.d.ts.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/index.js +22 -2
- package/dist/core/extensions/builtin/prompt-preset/index.js.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/presets.d.ts.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/presets.js +25 -0
- package/dist/core/extensions/builtin/prompt-preset/presets.js.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/settings.d.ts +1 -1
- package/dist/core/extensions/builtin/prompt-preset/settings.d.ts.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/settings.js +2 -0
- package/dist/core/extensions/builtin/prompt-preset/settings.js.map +1 -1
- package/dist/core/extensions/builtin/reasoning/index.d.ts +3 -0
- package/dist/core/extensions/builtin/reasoning/index.d.ts.map +1 -0
- package/dist/core/extensions/builtin/reasoning/index.js +211 -0
- package/dist/core/extensions/builtin/reasoning/index.js.map +1 -0
- package/dist/core/extensions/builtin/service-tier.d.ts +44 -1
- package/dist/core/extensions/builtin/service-tier.d.ts.map +1 -1
- package/dist/core/extensions/builtin/service-tier.js +176 -24
- package/dist/core/extensions/builtin/service-tier.js.map +1 -1
- package/dist/core/extensions/runner.d.ts.map +1 -1
- package/dist/core/extensions/runner.js +4 -4
- package/dist/core/extensions/runner.js.map +1 -1
- package/dist/core/extensions/types.d.ts +13 -1
- package/dist/core/extensions/types.d.ts.map +1 -1
- package/dist/core/extensions/types.js.map +1 -1
- package/dist/core/keybindings.d.ts +24 -0
- package/dist/core/keybindings.d.ts.map +1 -1
- package/dist/core/lockfile-policy.d.ts +15 -0
- package/dist/core/lockfile-policy.d.ts.map +1 -0
- package/dist/core/lockfile-policy.js +15 -0
- package/dist/core/lockfile-policy.js.map +1 -0
- package/dist/core/model-config.d.ts.map +1 -1
- package/dist/core/model-config.js +1 -0
- package/dist/core/model-config.js.map +1 -1
- package/dist/core/model-resolver.d.ts +34 -7
- package/dist/core/model-resolver.d.ts.map +1 -1
- package/dist/core/model-resolver.js +115 -27
- package/dist/core/model-resolver.js.map +1 -1
- package/dist/core/model-runtime.d.ts.map +1 -1
- package/dist/core/model-runtime.js +5 -3
- package/dist/core/model-runtime.js.map +1 -1
- package/dist/core/provider-api-key-auth.d.ts.map +1 -1
- package/dist/core/provider-api-key-auth.js +45 -2
- package/dist/core/provider-api-key-auth.js.map +1 -1
- package/dist/core/provider-composer.d.ts +12 -1
- package/dist/core/provider-composer.d.ts.map +1 -1
- package/dist/core/provider-composer.js.map +1 -1
- package/dist/core/provider-display-names.d.ts.map +1 -1
- package/dist/core/provider-display-names.js +1 -0
- package/dist/core/provider-display-names.js.map +1 -1
- package/dist/core/remote-catalog-provider.d.ts +13 -0
- package/dist/core/remote-catalog-provider.d.ts.map +1 -1
- package/dist/core/remote-catalog-provider.js +15 -0
- package/dist/core/remote-catalog-provider.js.map +1 -1
- package/dist/core/retry-fallback/controller.d.ts +1 -1
- package/dist/core/retry-fallback/controller.d.ts.map +1 -1
- package/dist/core/retry-fallback/controller.js +5 -3
- package/dist/core/retry-fallback/controller.js.map +1 -1
- package/dist/core/retry-fallback/settings.d.ts.map +1 -1
- package/dist/core/retry-fallback/settings.js +4 -1
- package/dist/core/retry-fallback/settings.js.map +1 -1
- package/dist/core/sdk.d.ts +5 -3
- package/dist/core/sdk.d.ts.map +1 -1
- package/dist/core/sdk.js +14 -8
- package/dist/core/sdk.js.map +1 -1
- package/dist/core/session-manager.d.ts.map +1 -1
- package/dist/core/session-manager.js +20 -4
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/settings-manager.d.ts +50 -1
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js +258 -15
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/core/system-prompt.js +1 -1
- package/dist/core/system-prompt.js.map +1 -1
- package/dist/core/thinking-levels.d.ts +22 -0
- package/dist/core/thinking-levels.d.ts.map +1 -1
- package/dist/core/thinking-levels.js +29 -0
- package/dist/core/thinking-levels.js.map +1 -1
- package/dist/core/tools/bash.d.ts.map +1 -1
- package/dist/core/tools/bash.js +2 -0
- package/dist/core/tools/bash.js.map +1 -1
- package/dist/core/tools/edit.d.ts.map +1 -1
- package/dist/core/tools/edit.js +2 -0
- package/dist/core/tools/edit.js.map +1 -1
- package/dist/core/tools/find.js +1 -1
- package/dist/core/tools/find.js.map +1 -1
- package/dist/core/tools/grep.js +1 -1
- package/dist/core/tools/grep.js.map +1 -1
- package/dist/core/tools/read.d.ts.map +1 -1
- package/dist/core/tools/read.js +2 -0
- package/dist/core/tools/read.js.map +1 -1
- package/dist/core/tools/write.d.ts.map +1 -1
- package/dist/core/tools/write.js +2 -0
- package/dist/core/tools/write.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +18 -1
- package/dist/main.js.map +1 -1
- package/dist/modes/interactive/components/extension-selector.d.ts +2 -0
- package/dist/modes/interactive/components/extension-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/extension-selector.js +17 -1
- package/dist/modes/interactive/components/extension-selector.js.map +1 -1
- package/dist/modes/interactive/components/model-favorites.d.ts +2 -1
- package/dist/modes/interactive/components/model-favorites.d.ts.map +1 -1
- package/dist/modes/interactive/components/model-favorites.js +72 -6
- package/dist/modes/interactive/components/model-favorites.js.map +1 -1
- package/dist/modes/interactive/components/model-selector.d.ts +5 -1
- package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/model-selector.js +10 -6
- package/dist/modes/interactive/components/model-selector.js.map +1 -1
- package/dist/modes/interactive/components/settings-selector.d.ts +3 -1
- package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/settings-selector.js +10 -0
- package/dist/modes/interactive/components/settings-selector.js.map +1 -1
- package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
- package/dist/modes/interactive/components/tool-execution.js +22 -1
- package/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts +14 -4
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +109 -50
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/modes/interactive/model-catalog-refresh.d.ts +7 -0
- package/dist/modes/interactive/model-catalog-refresh.d.ts.map +1 -0
- package/dist/modes/interactive/model-catalog-refresh.js +36 -0
- package/dist/modes/interactive/model-catalog-refresh.js.map +1 -0
- package/dist/modes/interactive/theme/dark.json +2 -0
- package/dist/modes/interactive/theme/grok-day.json +2 -0
- package/dist/modes/interactive/theme/grok-night.json +2 -0
- package/dist/modes/interactive/theme/light.json +2 -0
- package/dist/modes/interactive/theme/theme-controller.d.ts +10 -2
- package/dist/modes/interactive/theme/theme-controller.d.ts.map +1 -1
- package/dist/modes/interactive/theme/theme-controller.js +23 -10
- package/dist/modes/interactive/theme/theme-controller.js.map +1 -1
- package/dist/modes/interactive/theme/theme-schema.json +9 -1
- package/dist/modes/interactive/theme/theme.d.ts +5 -3
- package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
- package/dist/modes/interactive/theme/theme.js +12 -2
- package/dist/modes/interactive/theme/theme.js.map +1 -1
- package/dist/modes/json-event.d.ts +4 -1
- package/dist/modes/json-event.d.ts.map +1 -1
- package/dist/modes/json-event.js +5 -2
- package/dist/modes/json-event.js.map +1 -1
- package/dist/modes/rpc/connection-handler.d.ts +10 -0
- package/dist/modes/rpc/connection-handler.d.ts.map +1 -1
- package/dist/modes/rpc/connection-handler.js +87 -19
- package/dist/modes/rpc/connection-handler.js.map +1 -1
- package/dist/modes/rpc/multi-session-host.js +3 -3
- package/dist/modes/rpc/multi-session-host.js.map +1 -1
- package/dist/modes/rpc/rpc-client.d.ts +26 -1
- package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-client.js +25 -2
- package/dist/modes/rpc/rpc-client.js.map +1 -1
- package/dist/modes/rpc/rpc-types.d.ts +60 -0
- package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-types.js.map +1 -1
- package/dist/modes/rpc/session-command-router.d.ts.map +1 -1
- package/dist/modes/rpc/session-command-router.js +2 -14
- package/dist/modes/rpc/session-command-router.js.map +1 -1
- package/dist/modes/rpc/session-event-writer.d.ts +29 -10
- package/dist/modes/rpc/session-event-writer.d.ts.map +1 -1
- package/dist/modes/rpc/session-event-writer.js +229 -50
- package/dist/modes/rpc/session-event-writer.js.map +1 -1
- package/dist/server/create-harness.d.ts.map +1 -1
- package/dist/server/create-harness.js +2 -0
- package/dist/server/create-harness.js.map +1 -1
- package/dist/utils/shell.d.ts +27 -0
- package/dist/utils/shell.d.ts.map +1 -1
- package/dist/utils/shell.js +79 -13
- package/dist/utils/shell.js.map +1 -1
- package/dist/utils/tools-manager.d.ts +10 -1
- package/dist/utils/tools-manager.d.ts.map +1 -1
- package/dist/utils/tools-manager.js +14 -19
- package/dist/utils/tools-manager.js.map +1 -1
- package/docs/compaction.md +3 -3
- package/docs/custom-provider.md +1 -1
- package/docs/environment-variables.md +8 -2
- package/docs/extensions.md +13 -1
- package/docs/json.md +9 -5
- package/docs/keybindings.md +8 -2
- package/docs/providers.md +9 -1
- package/docs/rpc.md +128 -6
- package/docs/sdk.md +9 -0
- package/docs/settings.md +93 -1
- package/docs/terminal-setup.md +23 -2
- package/docs/themes.md +24 -3
- package/docs/tui.md +2 -2
- package/docs/usage.md +24 -4
- package/examples/extensions/subagent/agents.ts +40 -9
- package/examples/extensions/subagent/index.ts +26 -3
- package/node_modules/@code-yeongyu/senpi-codemode/CHANGELOG.md +38 -0
- package/node_modules/@code-yeongyu/senpi-codemode/README.md +5 -0
- package/node_modules/@code-yeongyu/senpi-codemode/package.json +5 -4
- package/node_modules/@code-yeongyu/senpi-codemode/src/index.ts +14 -1
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/call-capture.ts +64 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/cell-handler.ts +45 -61
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/cell-runtime.ts +6 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/eval-execution-event.ts +201 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/eval-tool-options.ts +2 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/eval-tool.ts +22 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/env/nodejs.d.ts +25 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/env/nodejs.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/env/nodejs.js +77 -12
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/env/nodejs.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/events.d.ts +43 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/events.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/events.js +67 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/events.js.map +1 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/jsonl/codec.d.ts +4 -2
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/jsonl/codec.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/jsonl/codec.js +127 -88
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/jsonl/codec.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/jsonl/errors.d.ts +5 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/jsonl/errors.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/jsonl/errors.js +9 -2
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/jsonl/errors.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/jsonl/repo.d.ts +12 -3
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/jsonl/repo.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/jsonl/repo.js +88 -45
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/jsonl/repo.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/jsonl/storage.d.ts +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/jsonl/storage.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/jsonl/storage.js +28 -19
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/jsonl/storage.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/jsonl/types.d.ts +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/jsonl/types.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/jsonl/types.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/memory.d.ts +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/memory.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/memory.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/session.d.ts +6 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/session.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/session.js +7 -2
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/session.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/state.d.ts +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/state.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/state.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/testing/conformance.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/testing/conformance.js +19 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/testing/conformance.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/types.d.ts +18 -5
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/types.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/types.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/index.d.ts +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/index.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/index.js +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/index.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/proxy.d.ts +4 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/proxy.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/proxy.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/search/index.d.ts +21 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/search/index.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/search/index.js +2 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/search/index.js.map +1 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/search/scanning.d.ts +29 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/search/scanning.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/search/scanning.js +103 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/search/scanning.js.map +1 -0
- package/node_modules/@earendil-works/pi-agent-core/package.json +3 -3
- package/node_modules/@earendil-works/pi-ai/README.md +2 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-messages.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-messages.js +40 -14
- package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-messages.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/bedrock-converse-stream.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/bedrock-converse-stream.js +16 -4
- package/node_modules/@earendil-works/pi-ai/dist/api/bedrock-converse-stream.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/cloudflare-gateway-binding.d.ts +69 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/cloudflare-gateway-binding.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/cloudflare-gateway-binding.js +159 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/cloudflare-gateway-binding.js.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/constrained-sampling.d.ts +3 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/constrained-sampling.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/constrained-sampling.js +125 -5
- package/node_modules/@earendil-works/pi-ai/dist/api/constrained-sampling.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/google-generative-ai.js +7 -3
- package/node_modules/@earendil-works/pi-ai/dist/api/google-generative-ai.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/google-shared.d.ts +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/google-shared.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/google-shared.js +13 -9
- package/node_modules/@earendil-works/pi-ai/dist/api/google-shared.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/google-vertex.js +7 -3
- package/node_modules/@earendil-works/pi-ai/dist/api/google-vertex.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/mistral-conversations.d.ts +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/mistral-conversations.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/mistral-conversations.js +208 -42
- package/node_modules/@earendil-works/pi-ai/dist/api/mistral-conversations.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-codex-responses.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-codex-responses.js +13 -4
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-codex-responses.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-completions.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-completions.js +10 -7
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-completions.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses-shared.d.ts +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses-shared.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses-shared.js +31 -7
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses-shared.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses.js +8 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/cursor.d.ts +16 -0
- package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/cursor.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/cursor.js +234 -0
- package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/cursor.js.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/github-copilot.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/github-copilot.js +6 -3
- package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/github-copilot.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/load.d.ts +2 -0
- package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/load.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/load.js +5 -0
- package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/load.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/auth/resolve.js +44 -9
- package/node_modules/@earendil-works/pi-ai/dist/auth/resolve.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/auth/types.d.ts +2 -0
- package/node_modules/@earendil-works/pi-ai/dist/auth/types.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/auth/types.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/bun-oauth.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/bun-oauth.js +2 -0
- package/node_modules/@earendil-works/pi-ai/dist/bun-oauth.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/image-models.generated.d.ts +15 -0
- package/node_modules/@earendil-works/pi-ai/dist/image-models.generated.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/image-models.generated.js +15 -0
- package/node_modules/@earendil-works/pi-ai/dist/image-models.generated.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/all.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/all.js +2 -0
- package/node_modules/@earendil-works/pi-ai/dist/providers/all.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/cursor.d.ts +15 -0
- package/node_modules/@earendil-works/pi-ai/dist/providers/cursor.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/providers/cursor.js +32 -0
- package/node_modules/@earendil-works/pi-ai/dist/providers/cursor.js.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/.manifest.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/alibaba-token-plan.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/baseten.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/cloudflare-ai-gateway.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/cloudflare-workers-ai.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/deepseek.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/fireworks.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/github-copilot.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/google-vertex.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/google.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/huggingface.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/kimi-coding.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/nvidia.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/openai-codex.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/openai.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/opencode-go.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/opencode.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/openrouter.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/qwen-token-plan-cn.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/qwen-token-plan.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/vercel-ai-gateway.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/zai-coding-cn.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/zai.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/types.d.ts +14 -3
- package/node_modules/@earendil-works/pi-ai/dist/types.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/types.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/overflow.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/overflow.js +2 -0
- package/node_modules/@earendil-works/pi-ai/dist/utils/overflow.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/pi-user-agent.d.ts +2 -0
- package/node_modules/@earendil-works/pi-ai/dist/utils/pi-user-agent.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/utils/pi-user-agent.js +12 -0
- package/node_modules/@earendil-works/pi-ai/dist/utils/pi-user-agent.js.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/utils/prompt-cache-ttl.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/prompt-cache-ttl.js +3 -2
- package/node_modules/@earendil-works/pi-ai/dist/utils/prompt-cache-ttl.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/retry.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/retry.js +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/utils/retry.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/validation.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/validation.js +34 -0
- package/node_modules/@earendil-works/pi-ai/dist/utils/validation.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/package.json +2 -2
- package/node_modules/@earendil-works/pi-pty/package.json +1 -1
- package/node_modules/@earendil-works/pi-telemetry/package.json +1 -1
- package/node_modules/@earendil-works/pi-tui/README.md +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/alt-screen-search.d.ts +26 -0
- package/node_modules/@earendil-works/pi-tui/dist/alt-screen-search.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-tui/dist/alt-screen-search.js +121 -0
- package/node_modules/@earendil-works/pi-tui/dist/alt-screen-search.js.map +1 -0
- package/node_modules/@earendil-works/pi-tui/dist/components/scroll-view.d.ts +6 -1
- package/node_modules/@earendil-works/pi-tui/dist/components/scroll-view.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/components/scroll-view.js +23 -7
- package/node_modules/@earendil-works/pi-tui/dist/components/scroll-view.js.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/index.d.ts +4 -1
- package/node_modules/@earendil-works/pi-tui/dist/index.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/index.js +7 -1
- package/node_modules/@earendil-works/pi-tui/dist/index.js.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/keybindings.d.ts +30 -0
- package/node_modules/@earendil-works/pi-tui/dist/keybindings.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/keybindings.js +24 -0
- package/node_modules/@earendil-works/pi-tui/dist/keybindings.js.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/layout.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/layout.js +9 -2
- package/node_modules/@earendil-works/pi-tui/dist/layout.js.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/stdin-buffer.d.ts +8 -2
- package/node_modules/@earendil-works/pi-tui/dist/stdin-buffer.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/stdin-buffer.js +6 -2
- package/node_modules/@earendil-works/pi-tui/dist/stdin-buffer.js.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/terminal.d.ts +6 -0
- package/node_modules/@earendil-works/pi-tui/dist/terminal.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/terminal.js +18 -1
- package/node_modules/@earendil-works/pi-tui/dist/terminal.js.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/tui-alt-screen.d.ts +21 -0
- package/node_modules/@earendil-works/pi-tui/dist/tui-alt-screen.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/tui-alt-screen.js +243 -5
- package/node_modules/@earendil-works/pi-tui/dist/tui-alt-screen.js.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/tui.d.ts +2 -0
- package/node_modules/@earendil-works/pi-tui/dist/tui.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/tui.js +33 -8
- package/node_modules/@earendil-works/pi-tui/dist/tui.js.map +1 -1
- package/node_modules/@earendil-works/pi-tui/package.json +1 -1
- package/package.json +7 -7
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/search.d.ts +0 -19
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/search.d.ts.map +0 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/search.js +0 -41
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/search.js.map +0 -1
|
@@ -42,6 +42,7 @@ import { openBrowser } from "../../utils/open-browser.js";
|
|
|
42
42
|
import { getCwdRelativePath } from "../../utils/paths.js";
|
|
43
43
|
import { getPiUserAgent } from "../../utils/pi-user-agent.js";
|
|
44
44
|
import { killTrackedDetachedChildren } from "../../utils/shell.js";
|
|
45
|
+
import { ensureTool } from "../../utils/tools-manager.js";
|
|
45
46
|
import { checkForNewPiVersion, getReleaseChangelogUrl } from "../../utils/version-check.js";
|
|
46
47
|
import { abortedErrorLabel } from "./aborted-error-label.js";
|
|
47
48
|
import { transferCompactionQueue, waitForPromptDisposition, } from "./compaction-queue-transfer.js";
|
|
@@ -86,9 +87,9 @@ import { editFileInExternalEditor, editInExternalEditor } from "./external-edito
|
|
|
86
87
|
import { GrokChrome } from "./grok/chrome.js";
|
|
87
88
|
import { restoreInteractiveStderr, takeOverInteractiveStderr } from "./interactive-stderr-guard.js";
|
|
88
89
|
import { applyKeybindingsFileEdit, seedKeybindingsFile } from "./keybindings-command.js";
|
|
90
|
+
import { refreshModelCatalogs } from "./model-catalog-refresh.js";
|
|
89
91
|
import { getModelSearchText } from "./model-search.js";
|
|
90
92
|
import { isRiskyMainModel, RISKY_MAIN_MODEL_WARNING } from "./risky-main-model-warning.js";
|
|
91
|
-
import { resolveStartupToolPaths } from "./startup-tools.js";
|
|
92
93
|
import { DEFAULT_SMOOTH_FPS, StreamingRevealController } from "./streaming-reveal.js";
|
|
93
94
|
import { getAvailableThemes, getAvailableThemesWithPaths, getEditorTheme, getMarkdownTheme, getThemeByName, onThemeChange, setRegisteredThemes, stopThemeWatcher, Theme, theme, } from "./theme/theme.js";
|
|
94
95
|
import { InteractiveThemeController } from "./theme/theme-controller.js";
|
|
@@ -261,9 +262,21 @@ function formatLoginProviderCompletionDescription(provider) {
|
|
|
261
262
|
export function createInteractiveTui(options) {
|
|
262
263
|
const terminal = options.terminal ?? new ProcessTerminal({ onExternalStdoutWrite: appendHiddenTuiStdout });
|
|
263
264
|
if (options.tuiMode === "fullscreen") {
|
|
265
|
+
const styleSearchMatch = (text) => theme.bg("searchMatchBg", theme.fg("searchMatchText", text));
|
|
264
266
|
return new TuiAltScreen(terminal, options.showHardwareCursor, options.logDirectory, {
|
|
267
|
+
searchMatchStyle: (text) => theme.underline(styleSearchMatch(text)),
|
|
268
|
+
searchCurrentMatchStyle: (text) => theme.bold(theme.inverse(styleSearchMatch(text))),
|
|
265
269
|
openUrl: openBrowser,
|
|
266
270
|
onRightClickPaste: options.onRightClickPaste,
|
|
271
|
+
copySelection: async (text) => {
|
|
272
|
+
try {
|
|
273
|
+
await copyToClipboard(text);
|
|
274
|
+
return true;
|
|
275
|
+
}
|
|
276
|
+
catch {
|
|
277
|
+
return false;
|
|
278
|
+
}
|
|
279
|
+
},
|
|
267
280
|
});
|
|
268
281
|
}
|
|
269
282
|
return new TuiMainScreen(terminal, options.showHardwareCursor, options.logDirectory);
|
|
@@ -359,6 +372,7 @@ export class InteractiveMode {
|
|
|
359
372
|
// Status line tracking (for mutating immediately-sequential status updates)
|
|
360
373
|
this.lastStatusSpacer = undefined;
|
|
361
374
|
this.lastStatusText = undefined;
|
|
375
|
+
this.managedToolStatusStarted = false;
|
|
362
376
|
// Streaming message tracking
|
|
363
377
|
this.streamingComponent = undefined;
|
|
364
378
|
this.streamingMessage = undefined;
|
|
@@ -427,6 +441,7 @@ export class InteractiveMode {
|
|
|
427
441
|
});
|
|
428
442
|
this.runtimeHost.setRebindSession(async () => {
|
|
429
443
|
await this.rebindCurrentSession({ renderBeforeBind: true });
|
|
444
|
+
await this.themeController.applyFromSettings();
|
|
430
445
|
});
|
|
431
446
|
this.version = DISPLAY_VERSION;
|
|
432
447
|
this.renderer = createInteractiveTui({
|
|
@@ -498,7 +513,12 @@ export class InteractiveMode {
|
|
|
498
513
|
this.outputPad = this.settingsManager.getOutputPad();
|
|
499
514
|
// Register themes from resource loader and initialize
|
|
500
515
|
setRegisteredThemes(this.session.resourceLoader.getThemes().themes);
|
|
501
|
-
this.themeController = new InteractiveThemeController(this.ui,
|
|
516
|
+
this.themeController = new InteractiveThemeController(this.ui, {
|
|
517
|
+
getSettingsManager: () => this.settingsManager,
|
|
518
|
+
showError: (message) => this.showError(message),
|
|
519
|
+
onChanged: () => this.updateEditorBorderColor(),
|
|
520
|
+
initialThemeSetting: options.initialThemeSetting,
|
|
521
|
+
});
|
|
502
522
|
}
|
|
503
523
|
getAutocompleteSourceTag(sourceInfo) {
|
|
504
524
|
if (!sourceInfo) {
|
|
@@ -661,14 +681,14 @@ export class InteractiveMode {
|
|
|
661
681
|
tui.setLayoutRoot(this.fullscreenLayoutRoot);
|
|
662
682
|
}
|
|
663
683
|
}
|
|
664
|
-
stopInteractiveTui() {
|
|
665
|
-
if (this.renderer.mode === "fullscreen") {
|
|
684
|
+
stopInteractiveTui(fullscreenExitOutput) {
|
|
685
|
+
if (this.renderer.mode === "fullscreen" && fullscreenExitOutput === "transcript") {
|
|
666
686
|
while (this.renderer.hasOverlayEntries)
|
|
667
687
|
this.renderer.hideOverlay();
|
|
668
688
|
this.switchTuiMode("regular", false, false);
|
|
669
689
|
this.renderer.renderNow();
|
|
670
690
|
}
|
|
671
|
-
this.ui.stop();
|
|
691
|
+
this.ui.stop({ preserveScreen: this.renderer.mode === "fullscreen" });
|
|
672
692
|
}
|
|
673
693
|
switchTuiMode(mode, restoreProgress = true, startRenderer = true) {
|
|
674
694
|
const previousUi = this.renderer;
|
|
@@ -725,9 +745,6 @@ export class InteractiveMode {
|
|
|
725
745
|
this.registerSignalHandlers();
|
|
726
746
|
// Load changelog (only show new entries, skip for resumed sessions)
|
|
727
747
|
this.changelogMarkdown = this.getChangelogForDisplay();
|
|
728
|
-
// Startup should never wait for tool downloads. Missing tools are resolved
|
|
729
|
-
// lazily by the tools that need them.
|
|
730
|
-
this.fdPath = resolveStartupToolPaths().fdPath;
|
|
731
748
|
if (this.session.scopedModels.length > 0 && (this.options.verbose || !this.settingsManager.getQuietStartup())) {
|
|
732
749
|
const modelList = this.session.scopedModels
|
|
733
750
|
.map((sm) => {
|
|
@@ -780,9 +797,14 @@ export class InteractiveMode {
|
|
|
780
797
|
else {
|
|
781
798
|
this.mountInteractiveTui(this.renderer, rootComponents);
|
|
782
799
|
}
|
|
800
|
+
// Accept text while startup completes, but only enable interrupt, exit, and submission feedback.
|
|
801
|
+
// Renderer-only lifecycle hosts may mount the chrome tree without constructing the base editor.
|
|
802
|
+
if (this.defaultEditor) {
|
|
803
|
+
this.defaultEditor.onAction("app.clear", () => this.handleCtrlC());
|
|
804
|
+
this.defaultEditor.onCtrlD = () => this.handleCtrlD();
|
|
805
|
+
this.defaultEditor.onSubmit = (text) => this.handleStartupSubmit(text);
|
|
806
|
+
}
|
|
783
807
|
this.ui.setFocus(this.editor);
|
|
784
|
-
this.setupKeyHandlers();
|
|
785
|
-
this.setupEditorSubmitHandler();
|
|
786
808
|
// Start the UI before initializing extensions so session_start handlers can use interactive dialogs
|
|
787
809
|
try {
|
|
788
810
|
takeOverInteractiveStderr();
|
|
@@ -857,6 +879,18 @@ export class InteractiveMode {
|
|
|
857
879
|
this.headerContainer.addChild(this.builtInHeader);
|
|
858
880
|
}
|
|
859
881
|
this.ui.requestRender();
|
|
882
|
+
// Ensure fd and rg are available after mounting the TUI (downloads if missing, adds to PATH via getBinDir)
|
|
883
|
+
// so slow downloads do not make startup appear frozen.
|
|
884
|
+
// Both are needed: fd for autocomplete, rg for grep tool and bash commands.
|
|
885
|
+
const [fdPath] = await Promise.all([
|
|
886
|
+
ensureTool("fd", (status) => this.showManagedToolStatus(status)),
|
|
887
|
+
ensureTool("rg", (status) => this.showManagedToolStatus(status)),
|
|
888
|
+
]);
|
|
889
|
+
this.fdPath = fdPath;
|
|
890
|
+
// Enable the remaining input handlers only after managed-tool setup completes.
|
|
891
|
+
this.setupKeyHandlers();
|
|
892
|
+
this.setupEditorSubmitHandler();
|
|
893
|
+
this.ui.requestRender();
|
|
860
894
|
// Initialize extensions first so resources are shown before messages
|
|
861
895
|
await this.rebindCurrentSession();
|
|
862
896
|
// Render initial messages AFTER showing loaded resources
|
|
@@ -903,8 +937,7 @@ export class InteractiveMode {
|
|
|
903
937
|
if (!envValue("OFFLINE")) {
|
|
904
938
|
const controller = new AbortController();
|
|
905
939
|
const timeout = setTimeout(() => controller.abort(), 15_000);
|
|
906
|
-
void this.session.modelRuntime
|
|
907
|
-
.refresh({ signal: controller.signal })
|
|
940
|
+
void refreshModelCatalogs(this.session.modelRuntime, controller.signal)
|
|
908
941
|
.then(() => {
|
|
909
942
|
this.updateAvailableProviderCount();
|
|
910
943
|
this.ui.requestRender();
|
|
@@ -1733,7 +1766,7 @@ export class InteractiveMode {
|
|
|
1733
1766
|
const message = error instanceof Error ? error.message : String(error);
|
|
1734
1767
|
this.showError(`${prefix}: ${message}`);
|
|
1735
1768
|
stopThemeWatcher();
|
|
1736
|
-
this.stop();
|
|
1769
|
+
this.stop("transcript");
|
|
1737
1770
|
process.exit(1);
|
|
1738
1771
|
}
|
|
1739
1772
|
renderCurrentSessionState() {
|
|
@@ -2805,6 +2838,10 @@ export class InteractiveMode {
|
|
|
2805
2838
|
this.sessionLogger ??= createSessionLogger(this.runtimeHost.services.agentDir);
|
|
2806
2839
|
return this.sessionLogger;
|
|
2807
2840
|
}
|
|
2841
|
+
handleStartupSubmit(text) {
|
|
2842
|
+
this.editor.setText(text);
|
|
2843
|
+
this.showStatus("Startup is still in progress");
|
|
2844
|
+
}
|
|
2808
2845
|
setupEditorSubmitHandler() {
|
|
2809
2846
|
this.defaultEditor.onSubmit = async (text) => {
|
|
2810
2847
|
this.hideShortcutOverlay();
|
|
@@ -3080,6 +3117,9 @@ export class InteractiveMode {
|
|
|
3080
3117
|
case "high_reasoning_warning":
|
|
3081
3118
|
this.showHighReasoningWarning(event);
|
|
3082
3119
|
break;
|
|
3120
|
+
case "settings_source_selected":
|
|
3121
|
+
this.showSettingsSourceSelected(event);
|
|
3122
|
+
break;
|
|
3083
3123
|
case "message_start":
|
|
3084
3124
|
if (event.message.role === "custom") {
|
|
3085
3125
|
this.addMessageToChat(event.message);
|
|
@@ -3515,6 +3555,19 @@ export class InteractiveMode {
|
|
|
3515
3555
|
: message.content.filter((content) => content.type === "text");
|
|
3516
3556
|
return textBlocks.map((content) => content.text).join("");
|
|
3517
3557
|
}
|
|
3558
|
+
/** Show a managed-tool status update in the chat. */
|
|
3559
|
+
showManagedToolStatus(status) {
|
|
3560
|
+
if (!this.managedToolStatusStarted) {
|
|
3561
|
+
this.chatContainer.addChild(new Spacer(1));
|
|
3562
|
+
this.managedToolStatusStarted = true;
|
|
3563
|
+
}
|
|
3564
|
+
const message = status.type === "warning" ? `Warning: ${status.message}` : status.message;
|
|
3565
|
+
const color = status.type === "warning" ? "warning" : "dim";
|
|
3566
|
+
this.chatContainer.addChild(new Text(theme.fg(color, message), 1, 0));
|
|
3567
|
+
this.lastStatusSpacer = undefined;
|
|
3568
|
+
this.lastStatusText = undefined;
|
|
3569
|
+
this.ui.requestRender();
|
|
3570
|
+
}
|
|
3518
3571
|
/**
|
|
3519
3572
|
* Show a status message in the chat.
|
|
3520
3573
|
*
|
|
@@ -3910,7 +3963,7 @@ export class InteractiveMode {
|
|
|
3910
3963
|
}
|
|
3911
3964
|
catch { }
|
|
3912
3965
|
restoreInteractiveStderr();
|
|
3913
|
-
console.error(
|
|
3966
|
+
console.error(`${APP_NAME} exiting due to uncaughtException:`);
|
|
3914
3967
|
console.error(error);
|
|
3915
3968
|
process.exit(1);
|
|
3916
3969
|
}
|
|
@@ -4210,6 +4263,9 @@ export class InteractiveMode {
|
|
|
4210
4263
|
this.chatContainer.addChild(new DynamicBorder((text) => theme.fg("error", text)));
|
|
4211
4264
|
this.ui.requestRender();
|
|
4212
4265
|
}
|
|
4266
|
+
showSettingsSourceSelected(event) {
|
|
4267
|
+
this.showStatus(`Settings: ${path.basename(event.path)} (${event.format.toUpperCase()})`);
|
|
4268
|
+
}
|
|
4213
4269
|
showHighReasoningWarning(event) {
|
|
4214
4270
|
const { title, body } = buildHighReasoningWarning({ id: event.modelId, provider: event.provider }, event.thinkingLevel);
|
|
4215
4271
|
this.chatContainer.addChild(new Spacer(1));
|
|
@@ -4498,7 +4554,7 @@ export class InteractiveMode {
|
|
|
4498
4554
|
httpIdleTimeoutMs: this.settingsManager.getHttpIdleTimeoutMs(),
|
|
4499
4555
|
thinkingLevel: this.session.thinkingLevel,
|
|
4500
4556
|
availableThinkingLevels: this.session.getAvailableThinkingLevels(),
|
|
4501
|
-
currentTheme: this.
|
|
4557
|
+
currentTheme: this.themeController.getThemeSelection() || "dark",
|
|
4502
4558
|
terminalTheme: this.themeController.getTerminalTheme(),
|
|
4503
4559
|
availableThemes: getAvailableThemes(),
|
|
4504
4560
|
hideThinkingBlock: this.hideThinkingBlock,
|
|
@@ -4519,6 +4575,7 @@ export class InteractiveMode {
|
|
|
4519
4575
|
clearOnShrink: this.settingsManager.getClearOnShrink(),
|
|
4520
4576
|
showTerminalProgress: this.settingsManager.getShowTerminalProgress(),
|
|
4521
4577
|
tuiMode: this.ui.mode,
|
|
4578
|
+
fullscreenExitOutput: this.settingsManager.getFullscreenExitOutput(),
|
|
4522
4579
|
fullscreenScrollbar: this.settingsManager.getFullscreenScrollbar(),
|
|
4523
4580
|
warnings: this.settingsManager.getWarnings(),
|
|
4524
4581
|
}, {
|
|
@@ -4576,7 +4633,7 @@ export class InteractiveMode {
|
|
|
4576
4633
|
},
|
|
4577
4634
|
onThemeChange: (themeSetting) => {
|
|
4578
4635
|
this.settingsManager.setTheme(themeSetting);
|
|
4579
|
-
void this.themeController.
|
|
4636
|
+
void this.themeController.setThemeSetting(themeSetting);
|
|
4580
4637
|
},
|
|
4581
4638
|
onThemePreview: (themeName) => this.themeController.preview(themeName),
|
|
4582
4639
|
onHideThinkingBlockChange: (hidden) => {
|
|
@@ -4702,6 +4759,9 @@ export class InteractiveMode {
|
|
|
4702
4759
|
this.statusContainer.clear();
|
|
4703
4760
|
this.showStatus(`TUI mode: ${mode}`);
|
|
4704
4761
|
},
|
|
4762
|
+
onFullscreenExitOutputChange: (output) => {
|
|
4763
|
+
this.settingsManager.setFullscreenExitOutput(output);
|
|
4764
|
+
},
|
|
4705
4765
|
onFullscreenScrollbarChange: (mode) => {
|
|
4706
4766
|
this.settingsManager.setFullscreenScrollbar(mode);
|
|
4707
4767
|
this.applyFullscreenScrollbarSetting();
|
|
@@ -4744,7 +4804,7 @@ export class InteractiveMode {
|
|
|
4744
4804
|
controller.abort();
|
|
4745
4805
|
}, 15_000);
|
|
4746
4806
|
try {
|
|
4747
|
-
const result = await this.session.modelRuntime
|
|
4807
|
+
const result = await refreshModelCatalogs(this.session.modelRuntime, controller.signal);
|
|
4748
4808
|
if (result.aborted && timedOut) {
|
|
4749
4809
|
this.showWarning("Model refresh timed out; searching cached models.");
|
|
4750
4810
|
}
|
|
@@ -4805,34 +4865,31 @@ export class InteractiveMode {
|
|
|
4805
4865
|
const favoriteModels = await this.resolveFavoriteModelsForUi(patterns, candidateModels);
|
|
4806
4866
|
return favoriteModels.map((favorite) => getModelFullId(favorite.model));
|
|
4807
4867
|
}
|
|
4808
|
-
async
|
|
4809
|
-
const
|
|
4810
|
-
|
|
4811
|
-
|
|
4812
|
-
|
|
4813
|
-
|
|
4814
|
-
}
|
|
4815
|
-
const
|
|
4868
|
+
async captureFavoritePatternSnapshot() {
|
|
4869
|
+
const storedPatterns = this.settingsManager.getFavoriteModels() ?? [];
|
|
4870
|
+
const { patternResolutions } = await resolveModelScopeWithDiagnostics(storedPatterns, this.session.modelRuntime);
|
|
4871
|
+
return { storedPatterns, patternResolutions };
|
|
4872
|
+
}
|
|
4873
|
+
async applyFavoriteSelection(favoriteIds, candidateModels, persist, patternSnapshot) {
|
|
4874
|
+
const { storedPatterns, patternResolutions } = patternSnapshot;
|
|
4875
|
+
const mergedPatterns = mergeFavoritePatternsForPersist({
|
|
4876
|
+
storedPatterns,
|
|
4877
|
+
patternResolutions,
|
|
4878
|
+
selectedIds: favoriteIds,
|
|
4879
|
+
candidateIds: candidateModels.map(getModelFullId),
|
|
4880
|
+
});
|
|
4881
|
+
const newFavoriteModels = mergedPatterns
|
|
4882
|
+
? await resolveModelScope(mergedPatterns, this.session.modelRuntime)
|
|
4883
|
+
: [];
|
|
4816
4884
|
this.session.setFavoriteModels(newFavoriteModels.map((favorite) => ({
|
|
4817
4885
|
model: favorite.model,
|
|
4818
4886
|
thinkingLevel: favorite.thinkingLevel,
|
|
4819
4887
|
serviceTier: favorite.serviceTier,
|
|
4820
4888
|
})));
|
|
4889
|
+
if (persist)
|
|
4890
|
+
this.settingsManager.setFavoriteModels(mergedPatterns);
|
|
4821
4891
|
this.ui.requestRender();
|
|
4822
4892
|
}
|
|
4823
|
-
async persistFavoritePatterns(favoriteIds, candidateModels) {
|
|
4824
|
-
const storedPatterns = this.settingsManager.getFavoriteModels() ?? [];
|
|
4825
|
-
const { diagnostics } = await resolveModelScopeWithDiagnostics(storedPatterns, this.session.modelRuntime);
|
|
4826
|
-
const unresolvedPatterns = diagnostics
|
|
4827
|
-
.filter((diagnostic) => diagnostic.code === "no-match")
|
|
4828
|
-
.map((diagnostic) => diagnostic.pattern);
|
|
4829
|
-
this.settingsManager.setFavoriteModels(mergeFavoritePatternsForPersist({
|
|
4830
|
-
storedPatterns,
|
|
4831
|
-
unresolvedPatterns,
|
|
4832
|
-
selectedIds: favoriteIds,
|
|
4833
|
-
candidateIds: candidateModels.map(getModelFullId),
|
|
4834
|
-
}));
|
|
4835
|
-
}
|
|
4836
4893
|
/** Update the footer's available provider count from the current snapshot without refreshing catalogs. */
|
|
4837
4894
|
updateAvailableProviderCount() {
|
|
4838
4895
|
const models = this.session.scopedModels.length > 0
|
|
@@ -4903,7 +4960,7 @@ export class InteractiveMode {
|
|
|
4903
4960
|
onSelect: (selection) => {
|
|
4904
4961
|
trustStore.setMany(selection.updates);
|
|
4905
4962
|
done();
|
|
4906
|
-
this.showStatus(`Saved trust decision: ${selection.trusted ? "trusted" : "untrusted"}. Restart
|
|
4963
|
+
this.showStatus(`Saved trust decision: ${selection.trusted ? "trusted" : "untrusted"}. Restart ${APP_NAME} for this to take effect.`);
|
|
4907
4964
|
},
|
|
4908
4965
|
onCancel: () => {
|
|
4909
4966
|
done();
|
|
@@ -4914,6 +4971,7 @@ export class InteractiveMode {
|
|
|
4914
4971
|
});
|
|
4915
4972
|
}
|
|
4916
4973
|
showModelSelector(initialSearchInput) {
|
|
4974
|
+
const favoritePatternSnapshot = this.captureFavoritePatternSnapshot();
|
|
4917
4975
|
this.showSelector((done) => {
|
|
4918
4976
|
const favoriteModelIds = this.session.favoriteModels.map((favorite) => getModelFullId(favorite.model));
|
|
4919
4977
|
const selector = new ModelSelectorComponent(this.ui, this.session.model, this.settingsManager, this.session.modelRuntime, this.session.scopedModels, (model) => {
|
|
@@ -4924,8 +4982,7 @@ export class InteractiveMode {
|
|
|
4924
4982
|
}, initialSearchInput, {
|
|
4925
4983
|
favoriteModelIds,
|
|
4926
4984
|
onFavoriteChange: async (favoriteIds, allModels) => {
|
|
4927
|
-
await this.
|
|
4928
|
-
await this.persistFavoritePatterns(favoriteIds, allModels);
|
|
4985
|
+
await this.applyFavoriteSelection(favoriteIds, allModels, true, await favoritePatternSnapshot);
|
|
4929
4986
|
},
|
|
4930
4987
|
});
|
|
4931
4988
|
return { component: selector, focus: selector, dispose: () => selector.dispose() };
|
|
@@ -4938,6 +4995,7 @@ export class InteractiveMode {
|
|
|
4938
4995
|
return;
|
|
4939
4996
|
}
|
|
4940
4997
|
const currentFavoriteIds = await this.getFavoriteModelIdsForUi(allModels);
|
|
4998
|
+
const favoritePatternSnapshot = await this.captureFavoritePatternSnapshot();
|
|
4941
4999
|
this.showSelector((done) => {
|
|
4942
5000
|
const selector = new FavoriteModelsSelectorComponent({
|
|
4943
5001
|
allModels,
|
|
@@ -4945,10 +5003,10 @@ export class InteractiveMode {
|
|
|
4945
5003
|
currentModel: this.session.model,
|
|
4946
5004
|
}, {
|
|
4947
5005
|
onChange: async (favoriteIds) => {
|
|
4948
|
-
await this.
|
|
5006
|
+
await this.applyFavoriteSelection(favoriteIds, allModels, false, favoritePatternSnapshot);
|
|
4949
5007
|
},
|
|
4950
5008
|
onPersist: (favoriteIds) => {
|
|
4951
|
-
void this.
|
|
5009
|
+
void this.applyFavoriteSelection(favoriteIds, allModels, true, favoritePatternSnapshot).then(() => {
|
|
4952
5010
|
this.showStatus("Favorite models saved to settings");
|
|
4953
5011
|
});
|
|
4954
5012
|
},
|
|
@@ -5030,8 +5088,7 @@ export class InteractiveMode {
|
|
|
5030
5088
|
this.ui.requestRender();
|
|
5031
5089
|
},
|
|
5032
5090
|
});
|
|
5033
|
-
void this.session.modelRuntime
|
|
5034
|
-
.refresh({ signal: controller.signal })
|
|
5091
|
+
void refreshModelCatalogs(this.session.modelRuntime, controller.signal)
|
|
5035
5092
|
.then((result) => {
|
|
5036
5093
|
if (disposed)
|
|
5037
5094
|
return;
|
|
@@ -5588,7 +5645,7 @@ export class InteractiveMode {
|
|
|
5588
5645
|
this.ui.requestRender();
|
|
5589
5646
|
};
|
|
5590
5647
|
const dialog = new LoginDialogComponent(this.ui, providerOption.id, () => restoreEditor(), providerOption.name, `${providerOption.name} setup`);
|
|
5591
|
-
dialog.showInfo(`${providerOption.method?.name ?? "Authentication"} is configured outside
|
|
5648
|
+
dialog.showInfo(`${providerOption.method?.name ?? "Authentication"} is configured outside ${APP_NAME}.`, [], true);
|
|
5592
5649
|
this.editorContainer.clear();
|
|
5593
5650
|
this.editorContainer.addChild(dialog);
|
|
5594
5651
|
this.ui.setFocus(dialog);
|
|
@@ -5842,7 +5899,9 @@ export class InteractiveMode {
|
|
|
5842
5899
|
this.showStatus(`Session exported to: ${filePath}`);
|
|
5843
5900
|
}
|
|
5844
5901
|
else {
|
|
5845
|
-
const filePath = await this.session.exportToHtml(outputPath
|
|
5902
|
+
const filePath = await this.session.exportToHtml(outputPath, {
|
|
5903
|
+
themeName: theme.name,
|
|
5904
|
+
});
|
|
5846
5905
|
this.showStatus(`Session exported to: ${filePath}`);
|
|
5847
5906
|
}
|
|
5848
5907
|
}
|
|
@@ -5933,7 +5992,7 @@ export class InteractiveMode {
|
|
|
5933
5992
|
// Export to a temp file
|
|
5934
5993
|
const tmpFile = path.join(os.tmpdir(), "session.html");
|
|
5935
5994
|
try {
|
|
5936
|
-
await this.session.exportToHtml(tmpFile);
|
|
5995
|
+
await this.session.exportToHtml(tmpFile, { themeName: theme.name });
|
|
5937
5996
|
}
|
|
5938
5997
|
catch (error) {
|
|
5939
5998
|
this.showError(`Failed to export session: ${error instanceof Error ? error.message : "Unknown error"}`);
|
|
@@ -6385,7 +6444,7 @@ export class InteractiveMode {
|
|
|
6385
6444
|
// Ignore, will be emitted as an event
|
|
6386
6445
|
}
|
|
6387
6446
|
}
|
|
6388
|
-
stop() {
|
|
6447
|
+
stop(fullscreenExitOutput) {
|
|
6389
6448
|
InteractiveMode.restoreCompactionEscapeOverride(this);
|
|
6390
6449
|
this.streamingReveal.stop();
|
|
6391
6450
|
this.toolResultReveal.stop();
|
|
@@ -6407,7 +6466,7 @@ export class InteractiveMode {
|
|
|
6407
6466
|
}
|
|
6408
6467
|
if (this.isInitialized) {
|
|
6409
6468
|
try {
|
|
6410
|
-
this.stopInteractiveTui();
|
|
6469
|
+
this.stopInteractiveTui(fullscreenExitOutput ?? this.settingsManager.getFullscreenExitOutput());
|
|
6411
6470
|
}
|
|
6412
6471
|
finally {
|
|
6413
6472
|
this.isInitialized = false;
|