@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
|
@@ -37,6 +37,7 @@ import { DEFAULT_THINKING_LEVEL } from "./defaults.js";
|
|
|
37
37
|
import { buildDynamicSystemPrompt } from "./dynamic-prompt/index.js";
|
|
38
38
|
import { exportSessionToHtml } from "./export-html/index.js";
|
|
39
39
|
import { createToolHtmlRenderer } from "./export-html/tool-renderer.js";
|
|
40
|
+
import { CODEX_RESPONSES_API } from "./extensions/builtin/service-tier.js";
|
|
40
41
|
import { deriveExtensionRegistrationId } from "./extensions/builtin/tool-search/engine/marker.js";
|
|
41
42
|
import { getToolSearchService } from "./extensions/builtin/tool-search/service.js";
|
|
42
43
|
import { ExecuteToolError, ExtensionRunner, wrapRegisteredTools, } from "./extensions/index.js";
|
|
@@ -70,19 +71,48 @@ import { createAllToolDefinitions } from "./tools/index.js";
|
|
|
70
71
|
import { createToolDefinitionFromAgentTool } from "./tools/tool-definition-wrapper.js";
|
|
71
72
|
import { addUsageToTotals, createUsageTotals } from "./usage-totals.js";
|
|
72
73
|
const TURN_RETRY_SUPPRESSION_PREFIX = "senpi:no-turn-retry:";
|
|
74
|
+
/** Format the user-attributed payload for one or more explicit skill invocations. */
|
|
75
|
+
export function formatSkillInvocationPrompt(skills, userRequest) {
|
|
76
|
+
const skillBlocks = skills.map((skill) => `The user explicitly invoked the "${skill.name}" skill. Follow the instructions in <skill-instruction> as binding for this request, while respecting higher-priority instructions.\n\n<skill-instruction name="${skill.name}" location="${skill.filePath}">\nReferences are relative to ${skill.baseDir}.\n\n${skill.body}\n</skill-instruction>`);
|
|
77
|
+
const expandedSkills = skillBlocks.join("\n\n");
|
|
78
|
+
const trimmedRequest = userRequest?.trim();
|
|
79
|
+
return trimmedRequest ? `${expandedSkills}\n\n<user-request>\n${trimmedRequest}\n</user-request>` : expandedSkills;
|
|
80
|
+
}
|
|
73
81
|
/**
|
|
74
82
|
* Parse a skill block from message text.
|
|
75
83
|
* Returns null if the text doesn't contain a skill block.
|
|
76
84
|
*/
|
|
77
85
|
export function parseSkillBlock(text) {
|
|
78
|
-
const
|
|
79
|
-
|
|
86
|
+
const instructionPattern = /^The user explicitly invoked the "([^"]+)" skill\. Follow the instructions in <skill-instruction> as binding for this request, while respecting higher-priority instructions\.\n\n<skill-instruction name="([^"]+)" location="([^"]+)">\n([\s\S]*?)\n<\/skill-instruction>/;
|
|
87
|
+
const instructionMatch = text.match(instructionPattern);
|
|
88
|
+
if (instructionMatch) {
|
|
89
|
+
if (instructionMatch[1] !== instructionMatch[2])
|
|
90
|
+
return null;
|
|
91
|
+
let remainder = text.slice(instructionMatch[0].length);
|
|
92
|
+
while (remainder.startsWith("\n\nThe user explicitly invoked the ")) {
|
|
93
|
+
const chainedMatch = remainder.slice(2).match(instructionPattern);
|
|
94
|
+
if (!chainedMatch || chainedMatch[1] !== chainedMatch[2])
|
|
95
|
+
return null;
|
|
96
|
+
remainder = remainder.slice(chainedMatch[0].length + 2);
|
|
97
|
+
}
|
|
98
|
+
const requestMatch = remainder.match(/^\n\n<user-request>\n([\s\S]*?)\n<\/user-request>$/);
|
|
99
|
+
if (remainder && !requestMatch)
|
|
100
|
+
return null;
|
|
101
|
+
return {
|
|
102
|
+
name: instructionMatch[1],
|
|
103
|
+
location: instructionMatch[3],
|
|
104
|
+
content: instructionMatch[4],
|
|
105
|
+
userMessage: requestMatch?.[1].trim() || undefined,
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
const legacyMatch = text.match(/^<skill name="([^"]+)" location="([^"]+)">\n([\s\S]*?)\n<\/skill>(?:\n\n([\s\S]+))?$/);
|
|
109
|
+
if (!legacyMatch)
|
|
80
110
|
return null;
|
|
81
111
|
return {
|
|
82
|
-
name:
|
|
83
|
-
location:
|
|
84
|
-
content:
|
|
85
|
-
userMessage:
|
|
112
|
+
name: legacyMatch[1],
|
|
113
|
+
location: legacyMatch[2],
|
|
114
|
+
content: legacyMatch[3],
|
|
115
|
+
userMessage: legacyMatch[4]?.trim() || undefined,
|
|
86
116
|
};
|
|
87
117
|
}
|
|
88
118
|
// ============================================================================
|
|
@@ -114,6 +144,8 @@ function describeCompactionRejection(cause) {
|
|
|
114
144
|
return "Compaction rejected: the produced summary would still overflow the model context window. Reduce context (e.g. /new, drop attachments) or switch to a larger-context model.";
|
|
115
145
|
case "cancelled-by-extension":
|
|
116
146
|
return "Compaction rejected: cancelled by an extension.";
|
|
147
|
+
case "external-owner":
|
|
148
|
+
return "Compaction rejected: the active provider owns compaction for this session.";
|
|
117
149
|
case "circuit-breaker":
|
|
118
150
|
return "Compaction rejected: the compaction circuit breaker is open after repeated failures. Wait for the cooldown and retry.";
|
|
119
151
|
case "per-turn-cap":
|
|
@@ -326,6 +358,9 @@ export class AgentSession {
|
|
|
326
358
|
this.agent = config.agent;
|
|
327
359
|
this.sessionManager = config.sessionManager;
|
|
328
360
|
this.settingsManager = config.settingsManager;
|
|
361
|
+
this._unsubscribeSettingsSource = this.settingsManager.subscribeToSourceSelection((source) => {
|
|
362
|
+
this._emit({ type: "settings_source_selected", ...source });
|
|
363
|
+
});
|
|
329
364
|
const noModelFallback = config.resourceLoader.getExtensions().runtime.flagValues.get("no-model-fallback") === true ||
|
|
330
365
|
envValue("NO_FALLBACK") === "1";
|
|
331
366
|
if (noModelFallback) {
|
|
@@ -379,6 +414,7 @@ export class AgentSession {
|
|
|
379
414
|
});
|
|
380
415
|
this._extensionRunnerRef = config.extensionRunnerRef;
|
|
381
416
|
this._initialActiveToolNames = config.initialActiveToolNames;
|
|
417
|
+
this._defaultToolNames = config.defaultToolNames ? new Set(config.defaultToolNames) : undefined;
|
|
382
418
|
this._allowedToolNames = config.allowedToolNames ? new Set(config.allowedToolNames) : undefined;
|
|
383
419
|
this._excludedToolNames = config.excludedToolNames ? new Set(config.excludedToolNames) : undefined;
|
|
384
420
|
this._baseToolsOverride = config.baseToolsOverride;
|
|
@@ -786,6 +822,13 @@ export class AgentSession {
|
|
|
786
822
|
get agentDir() {
|
|
787
823
|
return this._agentDir;
|
|
788
824
|
}
|
|
825
|
+
/**
|
|
826
|
+
* Working directory this session resolves settings against — the same value extensions
|
|
827
|
+
* receive as `ctx.cwd`, so a host surface (RPC) reads project settings identically.
|
|
828
|
+
*/
|
|
829
|
+
get cwd() {
|
|
830
|
+
return this._cwd;
|
|
831
|
+
}
|
|
789
832
|
async _waitForSettledSessionWork() {
|
|
790
833
|
await this._sessionWorkBarrier.waitForSettled(() => this._agentEventQueue);
|
|
791
834
|
}
|
|
@@ -1215,7 +1258,7 @@ export class AgentSession {
|
|
|
1215
1258
|
!(requiredAutoCompaction === "threshold" && this._hasPendingPostCompactionUsageExemption(msg))) {
|
|
1216
1259
|
this._retireFailedRetryAssistant(msg);
|
|
1217
1260
|
compactedBeforeRetry = await this._runPrePromptCompaction(msg, true, "threshold", true);
|
|
1218
|
-
retryContinuationBlocked = !compactedBeforeRetry;
|
|
1261
|
+
retryContinuationBlocked = !compactedBeforeRetry && !this._isCompactionDelegated();
|
|
1219
1262
|
}
|
|
1220
1263
|
let retryOutcome = "not-handled";
|
|
1221
1264
|
if (!retryContinuationBlocked && !userAbortSuppressedQueuedContinuation) {
|
|
@@ -1543,6 +1586,9 @@ export class AgentSession {
|
|
|
1543
1586
|
*/
|
|
1544
1587
|
subscribe(listener) {
|
|
1545
1588
|
this._eventListeners.push(listener);
|
|
1589
|
+
for (const source of this.settingsManager.getSelectedSettingsSources()) {
|
|
1590
|
+
listener({ type: "settings_source_selected", ...source });
|
|
1591
|
+
}
|
|
1546
1592
|
// Return unsubscribe function for this specific listener
|
|
1547
1593
|
return () => {
|
|
1548
1594
|
const index = this._eventListeners.indexOf(listener);
|
|
@@ -1590,6 +1636,8 @@ export class AgentSession {
|
|
|
1590
1636
|
}
|
|
1591
1637
|
this._extensionRunner.invalidate("This extension ctx is stale after session replacement or reload. Do not use a captured pi or command ctx after ctx.newSession(), ctx.fork(), ctx.switchSession(), or ctx.reload(). For newSession, fork, and switchSession, move post-replacement work into withSession and use the ctx passed to withSession. For reload, do not use the old ctx after await ctx.reload().");
|
|
1592
1638
|
this._disconnectFromAgent();
|
|
1639
|
+
this._unsubscribeSettingsSource?.();
|
|
1640
|
+
this._unsubscribeSettingsSource = undefined;
|
|
1593
1641
|
this._eventListeners = [];
|
|
1594
1642
|
cleanupSessionResources(this.sessionId);
|
|
1595
1643
|
}
|
|
@@ -1623,13 +1671,54 @@ export class AgentSession {
|
|
|
1623
1671
|
isFastModeActive() {
|
|
1624
1672
|
return this._sessionFastMode || this._currentServiceTier === "priority";
|
|
1625
1673
|
}
|
|
1626
|
-
/**
|
|
1674
|
+
/**
|
|
1675
|
+
* The tier a request would carry right now: `serviceTier`, promoted to `"priority"` while
|
|
1676
|
+
* session fast mode is on (which is exactly what the service-tier extension puts on the
|
|
1677
|
+
* wire). Reported to clients so `serviceTier` and `fastMode` can never disagree.
|
|
1678
|
+
*/
|
|
1679
|
+
get effectiveServiceTier() {
|
|
1680
|
+
return this.isFastModeActive() ? "priority" : this._currentServiceTier;
|
|
1681
|
+
}
|
|
1682
|
+
/**
|
|
1683
|
+
* Session-scoped fast-mode indicator; never persisted, reset on session start.
|
|
1684
|
+
*
|
|
1685
|
+
* Turning fast OFF also clears the cached priority tier: `/fast off` writes a remembered
|
|
1686
|
+
* `"auto"` that must override an inherited catalog-priority tier immediately (display and
|
|
1687
|
+
* request side), not only on the next session. Only codex-response models are touched, and
|
|
1688
|
+
* never when an explicit scoped/favorite `:priority` pin is in force — those are pinned by
|
|
1689
|
+
* the user's model selection, not by `/fast`.
|
|
1690
|
+
*/
|
|
1627
1691
|
setSessionFastMode(enabled) {
|
|
1692
|
+
const previousFastMode = this.isFastModeActive();
|
|
1693
|
+
const previousTier = this._currentServiceTier;
|
|
1628
1694
|
this._sessionFastMode = enabled;
|
|
1695
|
+
if (!enabled && this._currentServiceTier === "priority" && this.model?.api === CODEX_RESPONSES_API) {
|
|
1696
|
+
// Only an INHERITED (catalog) priority is cleared. A priority the catalog does not
|
|
1697
|
+
// explain came from an explicit scoped/favorite `:priority` pin, which `/fast` must not undo.
|
|
1698
|
+
if (this._modelRuntime.getCompatibilityRequestConfig(this.model).serviceTier === "priority") {
|
|
1699
|
+
this._currentServiceTier = undefined;
|
|
1700
|
+
}
|
|
1701
|
+
}
|
|
1702
|
+
this._emitServiceTierChangeIfNeeded(previousTier, previousFastMode);
|
|
1703
|
+
}
|
|
1704
|
+
/**
|
|
1705
|
+
* Emit `service_tier_changed` when the effective tier or the fast-mode indicator actually
|
|
1706
|
+
* moved. Both are observable state for RPC clients (`get_state.serviceTier` / `.fastMode`),
|
|
1707
|
+
* and they can move independently: a session fast-mode toggle need not change the resolved
|
|
1708
|
+
* tier, and a model switch can change the tier with fast mode untouched.
|
|
1709
|
+
*/
|
|
1710
|
+
_emitServiceTierChangeIfNeeded(previousTier, previousFastMode) {
|
|
1711
|
+
const fastMode = this.isFastModeActive();
|
|
1712
|
+
if (previousTier === this._currentServiceTier && previousFastMode === fastMode)
|
|
1713
|
+
return;
|
|
1714
|
+
this._emit({ type: "service_tier_changed", tier: this.effectiveServiceTier, fastMode });
|
|
1629
1715
|
}
|
|
1630
1716
|
/**
|
|
1631
1717
|
* Explicit scoped/favorite tiers win; otherwise fall back to the model's
|
|
1632
|
-
* configured serviceTier from models.json/extension compatibility config.
|
|
1718
|
+
* configured serviceTier from models.json/extension compatibility config. The per-model
|
|
1719
|
+
* `/fast` memory is honored by the service-tier extension (`liveMemoryTier` + the session
|
|
1720
|
+
* flag in `before_provider_request`), not cached here: caching it would survive a same-session
|
|
1721
|
+
* `/fast off` (no model switch to re-resolve) and leak an inherited priority onto the wire.
|
|
1633
1722
|
*/
|
|
1634
1723
|
_resolveServiceTier(model, explicit) {
|
|
1635
1724
|
if (explicit)
|
|
@@ -1911,6 +2000,8 @@ export class AgentSession {
|
|
|
1911
2000
|
selectedTools: validToolNames,
|
|
1912
2001
|
toolSnippets,
|
|
1913
2002
|
promptGuidelines,
|
|
2003
|
+
customPrompt: loaderSystemPrompt,
|
|
2004
|
+
appendSystemPrompt: loaderAppendSystemPrompt.length > 0 ? loaderAppendSystemPrompt.join("\n\n") : undefined,
|
|
1914
2005
|
};
|
|
1915
2006
|
const basePrompt = loaderSystemPrompt ?? buildDynamicSystemPrompt(this._baseSystemPromptOptions);
|
|
1916
2007
|
return loaderAppendSystemPrompt.length > 0
|
|
@@ -2304,7 +2395,12 @@ export class AgentSession {
|
|
|
2304
2395
|
try {
|
|
2305
2396
|
const content = readFileSync(skill.filePath, "utf-8");
|
|
2306
2397
|
const body = stripFrontmatter(content).trim();
|
|
2307
|
-
skillBlocks.push(
|
|
2398
|
+
skillBlocks.push({
|
|
2399
|
+
name: skill.name,
|
|
2400
|
+
filePath: skill.filePath,
|
|
2401
|
+
baseDir: skill.baseDir,
|
|
2402
|
+
body,
|
|
2403
|
+
});
|
|
2308
2404
|
expandedSkillNames.add(skill.name);
|
|
2309
2405
|
}
|
|
2310
2406
|
catch (err) {
|
|
@@ -2324,8 +2420,7 @@ export class AgentSession {
|
|
|
2324
2420
|
if (skillBlocks.length === 0)
|
|
2325
2421
|
return text;
|
|
2326
2422
|
const args = text.slice(tokenStart).trim();
|
|
2327
|
-
|
|
2328
|
-
return args ? `${expandedSkills}\n\n${args}` : expandedSkills;
|
|
2423
|
+
return formatSkillInvocationPrompt(skillBlocks, args);
|
|
2329
2424
|
}
|
|
2330
2425
|
/**
|
|
2331
2426
|
* Queue a steering message while the agent is running.
|
|
@@ -2530,7 +2625,7 @@ export class AgentSession {
|
|
|
2530
2625
|
if (options?.deliverAs === "nextTurn") {
|
|
2531
2626
|
this._pendingNextTurnMessages.push(appMessage);
|
|
2532
2627
|
}
|
|
2533
|
-
else if (this.isStreaming) {
|
|
2628
|
+
else if (this.isStreaming && options?.triggerTurn !== false) {
|
|
2534
2629
|
if (options?.deliverAs === "followUp") {
|
|
2535
2630
|
this.agent.followUp(appMessage);
|
|
2536
2631
|
}
|
|
@@ -2591,6 +2686,7 @@ export class AgentSession {
|
|
|
2591
2686
|
*
|
|
2592
2687
|
* @param content User message content (string or content array)
|
|
2593
2688
|
* @param options.deliverAs Delivery mode when streaming: "steer" or "followUp"
|
|
2689
|
+
* @param options.expandPromptTemplates Whether to dispatch extension commands and expand skill commands and prompt templates. Default: false.
|
|
2594
2690
|
*/
|
|
2595
2691
|
async sendUserMessage(content, options) {
|
|
2596
2692
|
const bindingPromptReadiness = this._extensionBindingPromptReadiness;
|
|
@@ -2629,9 +2725,8 @@ export class AgentSession {
|
|
|
2629
2725
|
let finishSessionWork;
|
|
2630
2726
|
let disposition;
|
|
2631
2727
|
try {
|
|
2632
|
-
// Use prompt() with expandPromptTemplates: false to skip command handling and template expansion
|
|
2633
2728
|
await this.prompt(text, {
|
|
2634
|
-
expandPromptTemplates: false,
|
|
2729
|
+
expandPromptTemplates: options?.expandPromptTemplates ?? false,
|
|
2635
2730
|
streamingBehavior: options?.deliverAs,
|
|
2636
2731
|
images,
|
|
2637
2732
|
source: "extension",
|
|
@@ -2838,7 +2933,7 @@ export class AgentSession {
|
|
|
2838
2933
|
if (opts.invalidateCompaction && this._modelSelectionChangesContext(previousModel, model)) {
|
|
2839
2934
|
this._invalidateCompactionForModelSelection();
|
|
2840
2935
|
}
|
|
2841
|
-
const thinkingLevel = this._getThinkingLevelForModelSwitch(opts.ephemeralThinkingLevel);
|
|
2936
|
+
const thinkingLevel = this._getThinkingLevelForModelSwitch(model, opts.ephemeralThinkingLevel);
|
|
2842
2937
|
this.agent.state.model = model;
|
|
2843
2938
|
this.agent.abortServerSideFallback =
|
|
2844
2939
|
this.settingsManager.getAbortServerSideFallback() && this._retryFallback.hasConfiguredChain();
|
|
@@ -2849,6 +2944,8 @@ export class AgentSession {
|
|
|
2849
2944
|
this.settingsManager.setDefaultModelAndProvider(model.provider, model.id);
|
|
2850
2945
|
}
|
|
2851
2946
|
const scopedMatch = this._scopedModels.find((sm) => modelsAreEqual(sm.model, model));
|
|
2947
|
+
const previousTier = this._currentServiceTier;
|
|
2948
|
+
const previousFastMode = this.isFastModeActive();
|
|
2852
2949
|
this._currentServiceTier = this._resolveServiceTier(model, scopedMatch?.serviceTier);
|
|
2853
2950
|
if (opts.ephemeralThinkingLevel !== undefined) {
|
|
2854
2951
|
this._applyEphemeralThinkingLevel(thinkingLevel);
|
|
@@ -2857,6 +2954,15 @@ export class AgentSession {
|
|
|
2857
2954
|
this.setSessionThinkingLevel(thinkingLevel);
|
|
2858
2955
|
}
|
|
2859
2956
|
this._emitHighReasoningWarningIfNeeded();
|
|
2957
|
+
// Post-switch: the level reported here is the one actually in force (clamped, or restored
|
|
2958
|
+
// from this model's memory), not the level requested for the previous model.
|
|
2959
|
+
this._emit({
|
|
2960
|
+
type: "model_changed",
|
|
2961
|
+
model,
|
|
2962
|
+
thinkingLevel: this.thinkingLevel,
|
|
2963
|
+
source: opts.modelSelectSource,
|
|
2964
|
+
});
|
|
2965
|
+
this._emitServiceTierChangeIfNeeded(previousTier, previousFastMode);
|
|
2860
2966
|
if (!opts.emitModelSelect)
|
|
2861
2967
|
return undefined;
|
|
2862
2968
|
return await this._emitModelSelect(model, previousModel, opts.modelSelectSource);
|
|
@@ -2901,16 +3007,26 @@ export class AgentSession {
|
|
|
2901
3007
|
}
|
|
2902
3008
|
this._probeBackScheduler.cancel("manual-model-change");
|
|
2903
3009
|
this._retryFallback.clearForManualModelChange(next.model);
|
|
2904
|
-
const thinkingLevel = this._getThinkingLevelForModelSwitch(next.thinkingLevel);
|
|
3010
|
+
const thinkingLevel = this._getThinkingLevelForModelSwitch(next.model, next.thinkingLevel);
|
|
2905
3011
|
this.agent.state.model = next.model;
|
|
2906
3012
|
this.sessionManager.appendModelChange(next.model.provider, next.model.id);
|
|
2907
3013
|
this.settingsManager.setDefaultModelAndProvider(next.model.provider, next.model.id);
|
|
3014
|
+
const previousTier = this._currentServiceTier;
|
|
3015
|
+
const previousFastMode = this.isFastModeActive();
|
|
2908
3016
|
this._currentServiceTier = this._resolveServiceTier(next.model, next.serviceTier);
|
|
2909
3017
|
// Apply thinking level.
|
|
2910
3018
|
// - Explicit favorite model thinking level overrides the effective session level
|
|
2911
3019
|
// - Undefined favorite model thinking level restores the remembered user preference
|
|
2912
3020
|
// setSessionThinkingLevel clamps without replacing that preference.
|
|
2913
3021
|
this.setSessionThinkingLevel(thinkingLevel);
|
|
3022
|
+
// Post-switch, same contract as _switchActiveModel: the level in force AFTER the cycle.
|
|
3023
|
+
this._emit({
|
|
3024
|
+
type: "model_changed",
|
|
3025
|
+
model: next.model,
|
|
3026
|
+
thinkingLevel: this.thinkingLevel,
|
|
3027
|
+
source: "cycle",
|
|
3028
|
+
});
|
|
3029
|
+
this._emitServiceTierChangeIfNeeded(previousTier, previousFastMode);
|
|
2914
3030
|
const systemPromptChange = await this._emitModelSelect(next.model, currentModel, "cycle");
|
|
2915
3031
|
const cycleResult = { model: next.model, thinkingLevel: this.thinkingLevel, isScoped: true };
|
|
2916
3032
|
if (systemPromptChange) {
|
|
@@ -2924,7 +3040,7 @@ export class AgentSession {
|
|
|
2924
3040
|
/**
|
|
2925
3041
|
* Set thinking level.
|
|
2926
3042
|
* Clamps to model capabilities based on available thinking levels.
|
|
2927
|
-
*
|
|
3043
|
+
* Persistent calls refresh per-model memory; session entries and events are emitted only on change.
|
|
2928
3044
|
*/
|
|
2929
3045
|
setThinkingLevel(level) {
|
|
2930
3046
|
this._setThinkingLevel(level, true);
|
|
@@ -2946,6 +3062,12 @@ export class AgentSession {
|
|
|
2946
3062
|
this._retryFallback.noteManualThinkingLevel();
|
|
2947
3063
|
}
|
|
2948
3064
|
this.agent.state.thinkingLevel = effectiveLevel;
|
|
3065
|
+
if (updateGlobalDefault) {
|
|
3066
|
+
const model = this.model;
|
|
3067
|
+
if (model) {
|
|
3068
|
+
this.settingsManager.setModelThinkingLevel(model.provider, model.id, effectiveLevel);
|
|
3069
|
+
}
|
|
3070
|
+
}
|
|
2949
3071
|
if (isChanging) {
|
|
2950
3072
|
this.sessionManager.appendThinkingLevelChange(effectiveLevel);
|
|
2951
3073
|
if (updateGlobalDefault && (this.supportsThinking() || effectiveLevel !== "off")) {
|
|
@@ -3017,11 +3139,12 @@ export class AgentSession {
|
|
|
3017
3139
|
supportsThinking() {
|
|
3018
3140
|
return !!this.model?.reasoning;
|
|
3019
3141
|
}
|
|
3020
|
-
_getThinkingLevelForModelSwitch(explicitLevel) {
|
|
3021
|
-
|
|
3022
|
-
|
|
3023
|
-
|
|
3024
|
-
|
|
3142
|
+
_getThinkingLevelForModelSwitch(model, explicitLevel) {
|
|
3143
|
+
const requestedLevel = explicitLevel ??
|
|
3144
|
+
this.settingsManager.getModelThinkingLevel(model.provider, model.id) ??
|
|
3145
|
+
this.settingsManager.getDefaultThinkingLevel() ??
|
|
3146
|
+
DEFAULT_THINKING_LEVEL;
|
|
3147
|
+
return this._clampThinkingLevel(requestedLevel, getSupportedThinkingLevels(model));
|
|
3025
3148
|
}
|
|
3026
3149
|
_clampThinkingLevel(level, availableLevels) {
|
|
3027
3150
|
const available = new Set(availableLevels);
|
|
@@ -3685,8 +3808,9 @@ export class AgentSession {
|
|
|
3685
3808
|
if (compacted)
|
|
3686
3809
|
return true;
|
|
3687
3810
|
}
|
|
3688
|
-
if (this._isCompactionOnCooldown())
|
|
3811
|
+
if (this._isCompactionOnCooldown() || this._isCompactionDelegated() || this._hasSupersedingCompactionClaim()) {
|
|
3689
3812
|
return false;
|
|
3813
|
+
}
|
|
3690
3814
|
throw new RequiredCompactionError();
|
|
3691
3815
|
}
|
|
3692
3816
|
/**
|
|
@@ -3725,6 +3849,10 @@ export class AgentSession {
|
|
|
3725
3849
|
throw new RequiredCompactionError();
|
|
3726
3850
|
}
|
|
3727
3851
|
const compacted = await this._runPrePromptCompaction(lastAssistantMessage, false, "pre_prompt");
|
|
3852
|
+
if (!compacted && this._isCompactionDelegated())
|
|
3853
|
+
return;
|
|
3854
|
+
if (!compacted && this._hasSupersedingCompactionClaim())
|
|
3855
|
+
return;
|
|
3728
3856
|
if (!compacted && !isOversized() && this._isCompactionOnCooldown())
|
|
3729
3857
|
return;
|
|
3730
3858
|
if (!compacted || isOversized()) {
|
|
@@ -3774,6 +3902,7 @@ export class AgentSession {
|
|
|
3774
3902
|
const compacted = await this._runAutoCompaction("overflow", false);
|
|
3775
3903
|
if (!compacted &&
|
|
3776
3904
|
this._compactionLifecycle.state.status === "failed" &&
|
|
3905
|
+
this._compactionLifecycle.state.rejectionCause !== "external-owner" &&
|
|
3777
3906
|
getLatestCompactionEntry(this.sessionManager.getBranch()) !== null) {
|
|
3778
3907
|
this._blockedPostCompactionAssistant = {
|
|
3779
3908
|
assistant: assistantMessage,
|
|
@@ -3814,7 +3943,7 @@ export class AgentSession {
|
|
|
3814
3943
|
this._restoreAgentMessagesFromSession();
|
|
3815
3944
|
this._incrementMessageRevision();
|
|
3816
3945
|
}
|
|
3817
|
-
if (!compacted && inlineReason) {
|
|
3946
|
+
if (!compacted && inlineReason && !this._isCompactionDelegated() && !this._hasSupersedingCompactionClaim()) {
|
|
3818
3947
|
throw new RequiredCompactionError();
|
|
3819
3948
|
}
|
|
3820
3949
|
return compacted;
|
|
@@ -3867,6 +3996,7 @@ export class AgentSession {
|
|
|
3867
3996
|
const compacted = await this._runAutoCompaction("threshold", retryAfterCompaction);
|
|
3868
3997
|
if (!compacted &&
|
|
3869
3998
|
this._compactionLifecycle.state.status === "failed" &&
|
|
3999
|
+
this._compactionLifecycle.state.rejectionCause !== "external-owner" &&
|
|
3870
4000
|
getLatestCompactionEntry(this.sessionManager.getBranch()) !== null) {
|
|
3871
4001
|
this._blockedPostCompactionAssistant = {
|
|
3872
4002
|
assistant: assistantMessage,
|
|
@@ -3882,6 +4012,26 @@ export class AgentSession {
|
|
|
3882
4012
|
const state = this._compactionLifecycle.state;
|
|
3883
4013
|
return state.status === "failed" && state.rejectionCause === "circuit-breaker";
|
|
3884
4014
|
}
|
|
4015
|
+
/**
|
|
4016
|
+
* Compaction claims are last-writer-wins: a newer admission aborts the
|
|
4017
|
+
* incumbent controller (_claimCompactionController). When the failed attempt
|
|
4018
|
+
* lost that race, a live claimant now owns the route and re-gates admission
|
|
4019
|
+
* itself, so the loser must not surface RequiredCompactionError (issue #886).
|
|
4020
|
+
* A user abort leaves no live claimant behind and keeps throwing.
|
|
4021
|
+
*/
|
|
4022
|
+
_hasSupersedingCompactionClaim() {
|
|
4023
|
+
const claimant = this._compactionAbortController ?? this._autoCompactionAbortController;
|
|
4024
|
+
return claimant !== undefined && !claimant.signal.aborted;
|
|
4025
|
+
}
|
|
4026
|
+
_isCompactionDelegated() {
|
|
4027
|
+
const state = this._compactionLifecycle.state;
|
|
4028
|
+
const model = this.model;
|
|
4029
|
+
return (state.status === "failed" &&
|
|
4030
|
+
state.rejectionCause === "external-owner" &&
|
|
4031
|
+
state.model !== undefined &&
|
|
4032
|
+
model !== undefined &&
|
|
4033
|
+
state.model.provider === model.provider);
|
|
4034
|
+
}
|
|
3885
4035
|
async _runPrePromptCompaction(lastAssistantMessage, skipAbortedCheck, reason = "pre_prompt", willRetry = false, allowSummaryOnly = false) {
|
|
3886
4036
|
const controller = new AbortController();
|
|
3887
4037
|
const requestId = randomUUID();
|
|
@@ -3946,8 +4096,9 @@ export class AgentSession {
|
|
|
3946
4096
|
return;
|
|
3947
4097
|
const compacted = await this._runPrePromptCompaction(this._findLastAssistantMessage(), true, "pre_prompt");
|
|
3948
4098
|
if (!compacted) {
|
|
3949
|
-
if (this._isCompactionOnCooldown())
|
|
4099
|
+
if (this._isCompactionOnCooldown() || this._isCompactionDelegated() || this._hasSupersedingCompactionClaim()) {
|
|
3950
4100
|
return;
|
|
4101
|
+
}
|
|
3951
4102
|
throw new RequiredCompactionError();
|
|
3952
4103
|
}
|
|
3953
4104
|
this._scheduledContinuationRecompacted = true;
|
|
@@ -4193,6 +4344,7 @@ export class AgentSession {
|
|
|
4193
4344
|
this._applyExtensionBindings(this._extensionRunner);
|
|
4194
4345
|
this.syncPromptCacheSafeWaitEnv();
|
|
4195
4346
|
await this._extensionRunner.emit(this._sessionStartEvent);
|
|
4347
|
+
this._enforceConfiguredDefaultTools();
|
|
4196
4348
|
await this.extendResourcesFromExtensions(this._sessionStartEvent.reason === "reload" ? "reload" : "startup");
|
|
4197
4349
|
}
|
|
4198
4350
|
finally {
|
|
@@ -4526,6 +4678,22 @@ export class AgentSession {
|
|
|
4526
4678
|
get fallbackValidationWarnings() {
|
|
4527
4679
|
return this._fallbackValidationWarnings;
|
|
4528
4680
|
}
|
|
4681
|
+
_isBuiltinExtensionPath(path) {
|
|
4682
|
+
return path.startsWith("<builtin:") || /[\\/]senpi-codemode[\\/]/u.test(path);
|
|
4683
|
+
}
|
|
4684
|
+
_enforceConfiguredDefaultTools() {
|
|
4685
|
+
const defaultToolNames = this._defaultToolNames;
|
|
4686
|
+
if (defaultToolNames === undefined)
|
|
4687
|
+
return;
|
|
4688
|
+
this.setActiveToolsByName(this.getActiveToolNames().filter((name) => {
|
|
4689
|
+
if (defaultToolNames.has(name))
|
|
4690
|
+
return true;
|
|
4691
|
+
const entry = this._toolDefinitions.get(name);
|
|
4692
|
+
return (entry !== undefined &&
|
|
4693
|
+
!this._isBuiltinExtensionPath(entry.sourceInfo.path) &&
|
|
4694
|
+
entry.sourceInfo.source !== "builtin");
|
|
4695
|
+
}));
|
|
4696
|
+
}
|
|
4529
4697
|
_refreshToolRegistry(options) {
|
|
4530
4698
|
const previousRegistryNames = new Set(this._toolRegistry.keys());
|
|
4531
4699
|
const previousActiveToolNames = this.getActiveToolNames();
|
|
@@ -4533,8 +4701,12 @@ export class AgentSession {
|
|
|
4533
4701
|
const excludedToolNames = this._excludedToolNames;
|
|
4534
4702
|
const isAllowedTool = (name) => (!allowedToolNames || allowedToolNames.has(name)) && !excludedToolNames?.has(name);
|
|
4535
4703
|
const registeredTools = this._extensionRunner.getAllRegisteredTools();
|
|
4704
|
+
const defaultToolNames = this._defaultToolNames;
|
|
4705
|
+
const isConfiguredBuiltinTool = (tool) => (tool.sourceInfo.source !== "builtin" && !this._isBuiltinExtensionPath(tool.sourceInfo.path)) ||
|
|
4706
|
+
defaultToolNames === undefined ||
|
|
4707
|
+
defaultToolNames.has(tool.definition.name);
|
|
4536
4708
|
const allCustomTools = [
|
|
4537
|
-
...registeredTools,
|
|
4709
|
+
...registeredTools.filter(isConfiguredBuiltinTool),
|
|
4538
4710
|
...this._customTools.map((definition) => ({
|
|
4539
4711
|
definition,
|
|
4540
4712
|
sourceInfo: createSyntheticSourceInfo(`<sdk:${definition.name}>`, { source: "sdk" }),
|
|
@@ -5177,7 +5349,10 @@ export class AgentSession {
|
|
|
5177
5349
|
model &&
|
|
5178
5350
|
shouldCompact(contextTokens, model.contextWindow, compactionSettings)) {
|
|
5179
5351
|
const preRetryCompaction = await this._runPrePromptCompaction(message, true, "threshold", true, true);
|
|
5180
|
-
if (!preRetryCompaction &&
|
|
5352
|
+
if (!preRetryCompaction &&
|
|
5353
|
+
!this._isCompactionOnCooldown() &&
|
|
5354
|
+
!this._isCompactionDelegated() &&
|
|
5355
|
+
!this._hasSupersedingCompactionClaim()) {
|
|
5181
5356
|
const attempt = this._retryAttempt;
|
|
5182
5357
|
this._retryAttempt = 0;
|
|
5183
5358
|
this._resetHintTierState();
|
|
@@ -5666,11 +5841,11 @@ export class AgentSession {
|
|
|
5666
5841
|
/**
|
|
5667
5842
|
* Export session to HTML.
|
|
5668
5843
|
* @param outputPath Optional output path (defaults to session directory)
|
|
5844
|
+
* @param options Optional export presentation settings
|
|
5669
5845
|
* @returns Path to exported file
|
|
5670
5846
|
*/
|
|
5671
|
-
async exportToHtml(outputPath) {
|
|
5672
|
-
const
|
|
5673
|
-
const themeName = configuredThemeName && getThemeByName(configuredThemeName) ? configuredThemeName : undefined;
|
|
5847
|
+
async exportToHtml(outputPath, options = {}) {
|
|
5848
|
+
const themeName = [options.themeName, this.settingsManager.getTheme()].find((candidate) => candidate !== undefined && getThemeByName(candidate) !== undefined);
|
|
5674
5849
|
// Create tool renderer if we have an extension runner (for custom tool HTML rendering)
|
|
5675
5850
|
const toolRenderer = createToolHtmlRenderer({
|
|
5676
5851
|
getToolDefinition: (name) => this.getToolDefinition(name),
|