@bastani/atomic 0.9.40 → 0.9.41-alpha.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +50 -0
- package/README.md +1 -1
- package/dist/builtin/intercom/CHANGELOG.md +12 -0
- package/dist/builtin/intercom/README.md +1 -1
- package/dist/builtin/intercom/broker/broker.ts +24 -21
- package/dist/builtin/intercom/broker/client.ts +97 -6
- package/dist/builtin/intercom/broker/list-reply.ts +53 -0
- package/dist/builtin/intercom/index.bundle.mjs +278 -46
- package/dist/builtin/intercom/package.json +1 -1
- package/dist/builtin/intercom/recoverable-disconnect.ts +27 -1
- package/dist/builtin/intercom/types.ts +8 -1
- package/dist/builtin/mcp/package.json +1 -1
- package/dist/builtin/subagents/CHANGELOG.md +14 -0
- package/dist/builtin/subagents/README.md +14 -0
- package/dist/builtin/subagents/package.json +1 -1
- package/dist/builtin/subagents/src/extension/index.bundle.mjs +99 -19
- package/dist/builtin/web-access/package.json +1 -1
- package/dist/builtin/workflows/CHANGELOG.md +25 -0
- package/dist/builtin/workflows/README.md +2 -0
- package/dist/builtin/workflows/package.json +1 -1
- package/dist/builtin/workflows/src/authoring.d.ts +1 -1
- package/dist/builtin/workflows/src/durable/journal/internal.d.ts +16 -0
- package/dist/builtin/workflows/src/durable/journal/legacy-journal-tables.d.ts +9 -0
- package/dist/builtin/workflows/src/durable/journal/sql-run-journal.d.ts +6 -0
- package/dist/builtin/workflows/src/extension/index.bundle.mjs +441 -90
- package/dist/builtin/workflows/src/index.js +226 -34
- package/dist/builtin/workflows/src/shared/authoring-contract-stage.d.ts +17 -1
- package/dist/cli/credential-print.d.ts.map +1 -1
- package/dist/cli/credential-print.js +1 -1
- package/dist/cli/credential-print.js.map +1 -1
- package/dist/config.d.ts +1 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +1 -0
- package/dist/config.js.map +1 -1
- package/dist/core/agent-session-extension-bindings.d.ts +2 -1
- package/dist/core/agent-session-extension-bindings.d.ts.map +1 -1
- package/dist/core/agent-session-extension-bindings.js +33 -18
- package/dist/core/agent-session-extension-bindings.js.map +1 -1
- package/dist/core/agent-session-methods.d.ts +2 -1
- package/dist/core/agent-session-methods.d.ts.map +1 -1
- package/dist/core/agent-session-methods.js.map +1 -1
- package/dist/core/agent-session-prompt.d.ts.map +1 -1
- package/dist/core/agent-session-prompt.js +114 -21
- package/dist/core/agent-session-prompt.js.map +1 -1
- package/dist/core/agent-session-runtime.d.ts +1 -1
- package/dist/core/agent-session-runtime.d.ts.map +1 -1
- package/dist/core/agent-session-runtime.js +6 -0
- package/dist/core/agent-session-runtime.js.map +1 -1
- package/dist/core/agent-session-state.d.ts +19 -1
- package/dist/core/agent-session-state.d.ts.map +1 -1
- package/dist/core/agent-session-state.js +41 -6
- package/dist/core/agent-session-state.js.map +1 -1
- package/dist/core/auth-storage-backends.d.ts +3 -1
- package/dist/core/auth-storage-backends.d.ts.map +1 -1
- package/dist/core/auth-storage-backends.js +79 -12
- package/dist/core/auth-storage-backends.js.map +1 -1
- package/dist/core/client-identity.d.ts +8 -0
- package/dist/core/client-identity.d.ts.map +1 -0
- package/dist/core/client-identity.js +16 -0
- package/dist/core/client-identity.js.map +1 -0
- package/dist/core/compaction/planner-outcome.d.ts.map +1 -1
- package/dist/core/compaction/planner-outcome.js +2 -1
- package/dist/core/compaction/planner-outcome.js.map +1 -1
- package/dist/core/execution-model-router.d.ts +18 -0
- package/dist/core/execution-model-router.d.ts.map +1 -1
- package/dist/core/execution-model-router.js +14 -8
- package/dist/core/execution-model-router.js.map +1 -1
- package/dist/core/extension-oauth-refresh-rejection.d.ts +12 -0
- package/dist/core/extension-oauth-refresh-rejection.d.ts.map +1 -0
- package/dist/core/extension-oauth-refresh-rejection.js +70 -0
- package/dist/core/extension-oauth-refresh-rejection.js.map +1 -0
- package/dist/core/extension-startup-failure.d.ts +30 -0
- package/dist/core/extension-startup-failure.d.ts.map +1 -0
- package/dist/core/extension-startup-failure.js +62 -0
- package/dist/core/extension-startup-failure.js.map +1 -0
- package/dist/core/extensions/context-types.d.ts +2 -0
- package/dist/core/extensions/context-types.d.ts.map +1 -1
- package/dist/core/extensions/context-types.js.map +1 -1
- package/dist/core/extensions/provider-types.d.ts +2 -0
- package/dist/core/extensions/provider-types.d.ts.map +1 -1
- package/dist/core/extensions/provider-types.js.map +1 -1
- package/dist/core/extensions/runner-context.d.ts +1 -0
- package/dist/core/extensions/runner-context.d.ts.map +1 -1
- package/dist/core/extensions/runner-context.js +8 -0
- package/dist/core/extensions/runner-context.js.map +1 -1
- package/dist/core/extensions/runner.d.ts +1 -0
- package/dist/core/extensions/runner.d.ts.map +1 -1
- package/dist/core/extensions/runner.js +3 -0
- package/dist/core/extensions/runner.js.map +1 -1
- package/dist/core/extensions/runtime-types.d.ts +1 -0
- package/dist/core/extensions/runtime-types.d.ts.map +1 -1
- package/dist/core/extensions/runtime-types.js.map +1 -1
- package/dist/core/extensions/workflow-run-control-hub.d.ts +1 -0
- package/dist/core/extensions/workflow-run-control-hub.d.ts.map +1 -1
- package/dist/core/extensions/workflow-run-control-hub.js +3 -0
- package/dist/core/extensions/workflow-run-control-hub.js.map +1 -1
- package/dist/core/extensions/workflow-run-control.d.ts +8 -0
- package/dist/core/extensions/workflow-run-control.d.ts.map +1 -1
- package/dist/core/extensions/workflow-run-control.js.map +1 -1
- package/dist/core/model-fallback-failures.d.ts.map +1 -1
- package/dist/core/model-fallback-failures.js +12 -0
- package/dist/core/model-fallback-failures.js.map +1 -1
- package/dist/core/model-resolver-defaults.js +1 -1
- package/dist/core/model-resolver-defaults.js.map +1 -1
- package/dist/core/model-runtime-streaming.d.ts.map +1 -1
- package/dist/core/model-runtime-streaming.js +9 -3
- package/dist/core/model-runtime-streaming.js.map +1 -1
- package/dist/core/model-runtime.d.ts +5 -0
- package/dist/core/model-runtime.d.ts.map +1 -1
- package/dist/core/model-runtime.js +6 -0
- package/dist/core/model-runtime.js.map +1 -1
- package/dist/core/provider-composer-internal.d.ts +6 -5
- package/dist/core/provider-composer-internal.d.ts.map +1 -1
- package/dist/core/provider-composer-internal.js +13 -2
- package/dist/core/provider-composer-internal.js.map +1 -1
- package/dist/core/sdk.d.ts.map +1 -1
- package/dist/core/sdk.js +12 -4
- package/dist/core/sdk.js.map +1 -1
- package/dist/core/storage/session/sql-session-store.d.ts +35 -0
- package/dist/core/storage/session/sql-session-store.d.ts.map +1 -1
- package/dist/core/storage/session/sql-session-store.js +158 -42
- package/dist/core/storage/session/sql-session-store.js.map +1 -1
- package/dist/core/structured-output/deadline.d.ts +40 -0
- package/dist/core/structured-output/deadline.d.ts.map +1 -0
- package/dist/core/structured-output/deadline.js +110 -0
- package/dist/core/structured-output/deadline.js.map +1 -0
- package/dist/core/structured-output/index.d.ts.map +1 -1
- package/dist/core/structured-output/index.js +103 -47
- package/dist/core/structured-output/index.js.map +1 -1
- package/dist/core/structured-output/rejection-detail.d.ts +9 -0
- package/dist/core/structured-output/rejection-detail.d.ts.map +1 -0
- package/dist/core/structured-output/rejection-detail.js +129 -0
- package/dist/core/structured-output/rejection-detail.js.map +1 -0
- package/dist/core/structured-output/types.d.ts +8 -1
- package/dist/core/structured-output/types.d.ts.map +1 -1
- package/dist/core/structured-output/types.js.map +1 -1
- package/dist/core/tasks/completion.d.ts +7 -1
- package/dist/core/tasks/completion.d.ts.map +1 -1
- package/dist/core/tasks/completion.js +28 -6
- package/dist/core/tasks/completion.js.map +1 -1
- package/dist/core/tasks/contracts.d.ts +6 -1
- package/dist/core/tasks/contracts.d.ts.map +1 -1
- package/dist/core/tasks/contracts.js.map +1 -1
- package/dist/core/tasks/pause.d.ts +2 -1
- package/dist/core/tasks/pause.d.ts.map +1 -1
- package/dist/core/tasks/pause.js +3 -2
- package/dist/core/tasks/pause.js.map +1 -1
- package/dist/core/tools/bash-pty-native.d.ts.map +1 -1
- package/dist/core/tools/bash-pty-native.js +10 -5
- package/dist/core/tools/bash-pty-native.js.map +1 -1
- package/dist/core/tools/bash.d.ts.map +1 -1
- package/dist/core/tools/bash.js +16 -32
- package/dist/core/tools/bash.js.map +1 -1
- package/dist/core/tools/kill.d.ts.map +1 -1
- package/dist/core/tools/kill.js +17 -3
- package/dist/core/tools/kill.js.map +1 -1
- package/dist/core/tools/shell-task-render.d.ts +55 -0
- package/dist/core/tools/shell-task-render.d.ts.map +1 -0
- package/dist/core/tools/shell-task-render.js +123 -0
- package/dist/core/tools/shell-task-render.js.map +1 -0
- package/dist/core/tools/shell-task-status.d.ts +52 -0
- package/dist/core/tools/shell-task-status.d.ts.map +1 -0
- package/dist/core/tools/shell-task-status.js +184 -0
- package/dist/core/tools/shell-task-status.js.map +1 -0
- package/dist/core/tools/structured-output.d.ts +5 -0
- package/dist/core/tools/structured-output.d.ts.map +1 -1
- package/dist/core/tools/structured-output.js +3 -0
- package/dist/core/tools/structured-output.js.map +1 -1
- package/dist/extensions/codemode/execute.d.ts.map +1 -1
- package/dist/extensions/codemode/execute.js +134 -57
- package/dist/extensions/codemode/execute.js.map +1 -1
- package/dist/extensions/mcp/config.d.ts.map +1 -1
- package/dist/extensions/mcp/config.js +3 -2
- package/dist/extensions/mcp/config.js.map +1 -1
- package/dist/index-extensions.d.ts +1 -0
- package/dist/index-extensions.d.ts.map +1 -1
- package/dist/index-extensions.js +3 -0
- package/dist/index-extensions.js.map +1 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +19 -6
- package/dist/main.js.map +1 -1
- package/dist/modes/interactive/components/task-row.d.ts.map +1 -1
- package/dist/modes/interactive/components/task-row.js +11 -1
- package/dist/modes/interactive/components/task-row.js.map +1 -1
- package/dist/modes/interactive/interactive-auth-routing.js +12 -10
- package/dist/modes/interactive/interactive-auth-routing.js.map +1 -1
- package/dist/modes/interactive/interactive-extension-custom-ui.js +20 -30
- package/dist/modes/interactive/interactive-extension-custom-ui.js.map +1 -1
- package/dist/modes/interactive/interactive-extension-dialogs.js +23 -96
- package/dist/modes/interactive/interactive-extension-dialogs.js.map +1 -1
- package/dist/modes/interactive/interactive-extension-runtime.js +7 -8
- package/dist/modes/interactive/interactive-extension-runtime.js.map +1 -1
- package/dist/modes/interactive/interactive-input-handling.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-input-handling.js +27 -4
- package/dist/modes/interactive/interactive-input-handling.js.map +1 -1
- package/dist/modes/interactive/interactive-mode-base.d.ts +20 -10
- package/dist/modes/interactive/interactive-mode-base.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode-base.js +40 -5
- package/dist/modes/interactive/interactive-mode-base.js.map +1 -1
- package/dist/modes/interactive/interactive-mode-deps.d.ts +1 -1
- package/dist/modes/interactive/interactive-mode-deps.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode-deps.js +1 -1
- package/dist/modes/interactive/interactive-mode-deps.js.map +1 -1
- package/dist/modes/interactive/interactive-mode-surface.d.ts +2 -4
- package/dist/modes/interactive/interactive-mode-surface.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode-surface.js.map +1 -1
- package/dist/modes/interactive/interactive-mode-types.d.ts +4 -1
- package/dist/modes/interactive/interactive-mode-types.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode-types.js.map +1 -1
- package/dist/modes/interactive/interactive-prompt-restore.d.ts +3 -0
- package/dist/modes/interactive/interactive-prompt-restore.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-prompt-restore.js +9 -1
- package/dist/modes/interactive/interactive-prompt-restore.js.map +1 -1
- package/dist/modes/interactive/interactive-prompt-turn.js +30 -2
- package/dist/modes/interactive/interactive-prompt-turn.js.map +1 -1
- package/dist/modes/interactive/interactive-queueing.js +43 -8
- package/dist/modes/interactive/interactive-queueing.js.map +1 -1
- package/dist/modes/interactive/interactive-startup.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-startup.js +12 -3
- package/dist/modes/interactive/interactive-startup.js.map +1 -1
- package/dist/modes/interactive/theme/color-utils.d.ts +6 -1
- package/dist/modes/interactive/theme/color-utils.d.ts.map +1 -1
- package/dist/modes/interactive/theme/color-utils.js +39 -17
- package/dist/modes/interactive/theme/color-utils.js.map +1 -1
- package/dist/modes/interactive/theme/theme-class.d.ts.map +1 -1
- package/dist/modes/interactive/theme/theme-class.js +2 -2
- package/dist/modes/interactive/theme/theme-class.js.map +1 -1
- package/dist/modes/interactive/theme/theme-tokens.d.ts +6 -0
- package/dist/modes/interactive/theme/theme-tokens.d.ts.map +1 -1
- package/dist/modes/interactive/theme/theme-tokens.js +7 -3
- package/dist/modes/interactive/theme/theme-tokens.js.map +1 -1
- package/dist/modes/interactive-engine/isolated-auth.d.ts +3 -0
- package/dist/modes/interactive-engine/isolated-auth.d.ts.map +1 -1
- package/dist/modes/interactive-engine/isolated-auth.js +13 -1
- package/dist/modes/interactive-engine/isolated-auth.js.map +1 -1
- package/dist/modes/interactive-engine/isolated-runtime.d.ts.map +1 -1
- package/dist/modes/interactive-engine/isolated-runtime.js +11 -2
- package/dist/modes/interactive-engine/isolated-runtime.js.map +1 -1
- package/dist/modes/interactive-engine/remote-model-catalog.d.ts +8 -0
- package/dist/modes/interactive-engine/remote-model-catalog.d.ts.map +1 -1
- package/dist/modes/interactive-engine/remote-model-catalog.js +54 -0
- package/dist/modes/interactive-engine/remote-model-catalog.js.map +1 -1
- package/dist/modes/rpc/rpc-command-handler.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-command-handler.js +4 -13
- package/dist/modes/rpc/rpc-command-handler.js.map +1 -1
- package/dist/modes/rpc/rpc-model-catalog.d.ts +9 -0
- package/dist/modes/rpc/rpc-model-catalog.d.ts.map +1 -0
- package/dist/modes/rpc/rpc-model-catalog.js +19 -0
- package/dist/modes/rpc/rpc-model-catalog.js.map +1 -0
- package/dist/modes/rpc/rpc-provider-auth.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-provider-auth.js +2 -6
- package/dist/modes/rpc/rpc-provider-auth.js.map +1 -1
- package/dist/modes/rpc/rpc-types.d.ts +6 -0
- package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-types.js.map +1 -1
- package/dist/utils/changelog.d.ts +6 -0
- package/dist/utils/changelog.d.ts.map +1 -1
- package/dist/utils/changelog.js +11 -0
- package/dist/utils/changelog.js.map +1 -1
- package/dist/utils/clipboard.d.ts.map +1 -1
- package/dist/utils/clipboard.js +4 -0
- package/dist/utils/clipboard.js.map +1 -1
- package/dist/utils/tools-manager.d.ts.map +1 -1
- package/dist/utils/tools-manager.js +3 -2
- package/dist/utils/tools-manager.js.map +1 -1
- package/docs/background-tasks.md +5 -3
- package/docs/codemode.md +2 -2
- package/docs/custom-provider/oauth.md +42 -1
- package/docs/custom-provider/registration.md +2 -0
- package/docs/environment-variables.md +1 -0
- package/docs/extensions/api-reference.md +3 -4
- package/docs/extensions/authoring.md +1 -1
- package/docs/extensions/events.md +1 -1
- package/docs/providers.md +3 -3
- package/docs/rpc/protocol.md +4 -2
- package/docs/sdk/reference.md +2 -0
- package/docs/sdk/structured-decisions.md +7 -5
- package/docs/sdk.md +5 -2
- package/docs/settings.md +4 -2
- package/docs/subagents/reference.md +1 -1
- package/docs/subagents.md +15 -1
- package/docs/themes/reference.md +3 -1
- package/docs/usage.md +3 -1
- package/docs/workflows/api-reference.md +28 -0
- package/docs/workflows/operations.md +2 -2
- package/npm-shrinkwrap.json +32 -32
- package/package.json +3 -3
- package/dist/core/provider-attribution.d.ts +0 -4
- package/dist/core/provider-attribution.d.ts.map +0 -1
- package/dist/core/provider-attribution.js +0 -87
- package/dist/core/provider-attribution.js.map +0 -1
package/dist/core/sdk.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sdk.js","sourceRoot":"","sources":["../../src/core/sdk.ts"],"names":[],"mappings":"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","sourcesContent":["import { basename, join, relative, sep } from \"node:path\";\nimport { clampThinkingLevel, type Message, type ProviderHeaders, streamSimple } from \"@bastani/pi-ai/compat\";\nimport { getProviderEnvValue } from \"@bastani/pi-ai/utils/provider-env\";\nimport { Agent, type AgentMessage, setDefaultStreamFn, type ThinkingLevel } from \"@earendil-works/pi-agent-core\";\nimport { getAgentDir } from \"../config.js\";\nimport { resolvePath } from \"../utils/paths.ts\";\nimport { AgentSession } from \"./agent-session.js\";\nimport type { AgentSessionInternalSurface } from \"./agent-session-methods.ts\";\nimport { restoreAnthropicReplayThinkingBlocks } from \"./anthropic-thinking-guard.ts\";\nimport { formatNoModelsAvailableMessage } from \"./auth-guidance.ts\";\nimport { getBuiltinPackageLocations, getBuiltinPackagePaths } from \"./builtin-packages.ts\";\nimport { withBuiltinResourceLoader } from \"./builtin-resource-loader.ts\";\nimport { getDefaultCacheRetention } from \"./cache-retention.ts\";\nimport { CacheWarmer } from \"./cache-warmer.ts\";\nimport { inheritChildSessionOptions } from \"./child-session-options.ts\";\nimport { DEFAULT_THINKING_LEVEL } from \"./defaults.ts\";\nimport type { ExtensionRunner } from \"./extensions/index.js\";\nimport {\n\tfactoryAcquisitions,\n\tfactoryRollbackError,\n\trollbackFactoryAcquisitions,\n} from \"./extensions/loader-rollback.ts\";\nimport { getModelFastRoute, streamWithFastRoute, withFastRouteStreamOptions } from \"./fast-model-routing.ts\";\nimport { markLifecycleTiming } from \"./lifecycle-timings.ts\";\nimport {\n\tisMandatoryResourceLoader,\n\tisolateMandatoryResourceLoader,\n\twithMandatoryResourceLoader,\n} from \"./mandatory-resource-loader.ts\";\nimport { convertToLlm, repairOrphanToolResults } from \"./messages.ts\";\nimport { findInitialModel, resolveRestoredModelReference } from \"./model-resolver.ts\";\nimport { ModelRuntime } from \"./model-runtime.js\";\nimport { type ModelRuntimeSimpleStreamOptions, mergeHeaders } from \"./model-runtime-streaming.ts\";\nimport { sanitizeOpenAIResponsesPayload } from \"./openai-responses-payload-sanitizer.ts\";\nimport { mergeProviderAttributionHeaders } from \"./provider-attribution.ts\";\nimport { scrubPreCompactionAssistantUsage } from \"./provider-context-usage.ts\";\nimport { canCloneDefaultResourceDiscovery, DefaultResourceLoader } from \"./resource-loader.ts\";\nimport type { CreateAgentSessionOptions, CreateAgentSessionResult } from \"./sdk-types.ts\";\nimport { sessionLifecycleCreation, sessionLifecycleScopes } from \"./session-lifecycle-scope.ts\";\nimport {\n\townedSessionManagerStores,\n\townedSessionStores,\n\tsessionGenerationClosing,\n\tsessionLifetime,\n\ttrackSessionWork,\n} from \"./session-lifecycle-work.ts\";\nimport { SessionManager } from \"./session-manager.ts\";\nimport { registerStartupRollback, rollbackStartup } from \"./session-startup-rollback.ts\";\nimport { resolveSessionStore } from \"./session-storage.js\";\nimport { SettingsManager } from \"./settings-manager.ts\";\nimport { applyToolModifiers, getToolListError, isToolModifier } from \"./settings-merge.js\";\nimport { ownedSettingsManagers } from \"./settings-write-ownership.ts\";\nimport { validateProcessStorage } from \"./storage/process-selection.js\";\nimport type { SessionStore } from \"./storage/session/types.js\";\nimport { createChildCommandTaskOwner } from \"./tasks/child-command-owner.js\";\nimport { time } from \"./timings.ts\";\nimport { createToolNameMatcher } from \"./tool-selection.ts\";\nimport { allToolNames, getDefaultToolNames } from \"./tools/index.js\";\n\nexport type { ModelFallbackReason } from \"./model-resolver-types.ts\";\nexport * from \"./sdk-exports.ts\";\nexport type { AtomicBuiltin, CreateAgentSessionOptions, CreateAgentSessionResult } from \"./sdk-types.ts\";\n\n// Preserve the pre-0.81 fallback for extensions that construct Agent instances\n// or invoke low-level agent loops without supplying streamFn.\nsetDefaultStreamFn(streamSimple);\n\n// Helper Functions\n\nfunction getDefaultAgentDir(): string {\n\treturn getAgentDir();\n}\n\n/** Keep static model headers visible to hooks without promoting unchanged defaults to request overrides. */\nfunction removeUnownedModelHeaders(\n\theaders: ProviderHeaders | undefined,\n\tmodelHeaders: ProviderHeaders | undefined,\n\trequestHeaders: ProviderHeaders | undefined,\n): ProviderHeaders | undefined {\n\tif (!headers || !modelHeaders) return headers;\n\tconst requestOwned = new Set(Object.keys(requestHeaders ?? {}).map((name) => name.toLowerCase()));\n\tconst filtered = { ...headers };\n\tfor (const [modelName, modelValue] of Object.entries(modelHeaders)) {\n\t\tconst lowerName = modelName.toLowerCase();\n\t\tif (requestOwned.has(lowerName)) continue;\n\t\tfor (const [name, value] of Object.entries(filtered)) {\n\t\t\tif (name.toLowerCase() === lowerName && value === modelValue) delete filtered[name];\n\t\t}\n\t}\n\treturn Object.keys(filtered).length > 0 ? filtered : undefined;\n}\n\n/**\n * Create an AgentSession with the specified options.\n *\n * @example\n * ```typescript\n * // Minimal - uses defaults\n * const { session } = await createAgentSession();\n *\n * // With explicit model\n * import { getModel } from '@bastani/pi-ai/compat';\n * const { session } = await createAgentSession({\n * model: getModel('anthropic', 'claude-opus-4-5'),\n * thinkingLevel: 'high',\n * });\n *\n * // Continue previous session\n * const { session, modelFallbackMessage } = await createAgentSession({\n * continueSession: true,\n * });\n *\n * // Full control\n * const loader = new DefaultResourceLoader({\n * cwd: process.cwd(),\n * agentDir: getAgentDir(),\n * settingsManager: SettingsManager.create(),\n * });\n * await loader.reload();\n * const { session } = await createAgentSession({\n * model: myModel,\n * tools: [\"read\", \"bash\"],\n * resourceLoader: loader,\n * sessionManager: SessionManager.inMemory(),\n * });\n * ```\n */\nexport async function createAgentSession(options: CreateAgentSessionOptions = {}): Promise<CreateAgentSessionResult> {\n\treturn createScopedSession(options, false);\n}\n\n/** Internal CLI assembly seam. Not exported from the package entrypoint. */\nexport function createUnstartedAgentSession(\n\toptions: CreateAgentSessionOptions,\n\tpersistInitialState = true,\n): Promise<CreateAgentSessionResult> {\n\treturn createScopedSession(options, true, persistInitialState);\n}\n\nfunction createScopedSession(\n\toptions: CreateAgentSessionOptions,\n\tdeferStart: boolean,\n\tpersistInitialState = true,\n): Promise<CreateAgentSessionResult> {\n\tconst inherited = sessionLifecycleCreation.getStore();\n\tconst context = inherited && !inherited.claimed ? inherited : { scope: {} };\n\treturn sessionLifecycleCreation.run({ ...context, claimed: true }, async () => {\n\t\tconst result = await factoryAcquisitions.run(\n\t\t\t{ pending: new Map(), replacement: context.replacement },\n\t\t\tasync () => {\n\t\t\t\tconst acquisition: { store?: SessionStore } = {\n\t\t\t\t\tstore: options.sessionManager ? ownedSessionManagerStores.get(options.sessionManager) : undefined,\n\t\t\t\t};\n\t\t\t\tif (options.sessionManager) ownedSessionManagerStores.delete(options.sessionManager);\n\t\t\t\ttry {\n\t\t\t\t\treturn await constructAgentSession(\n\t\t\t\t\t\t{ ...options, extensionBindings: options.extensionBindings ?? context.bindings },\n\t\t\t\t\t\tdeferStart,\n\t\t\t\t\t\tpersistInitialState,\n\t\t\t\t\t\tacquisition,\n\t\t\t\t\t);\n\t\t\t\t} catch (error) {\n\t\t\t\t\tconst failures = await rollbackFactoryAcquisitions();\n\t\t\t\t\tif (acquisition.store) {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tawait acquisition.store.close();\n\t\t\t\t\t\t} catch (cause) {\n\t\t\t\t\t\t\tfailures.push(cause);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tthrow factoryRollbackError(error, failures);\n\t\t\t\t}\n\t\t\t},\n\t\t);\n\t\tsessionLifecycleScopes.set(result.session, context.scope);\n\t\treturn result;\n\t});\n}\n\nasync function constructAgentSession(\n\toptions: CreateAgentSessionOptions,\n\tdeferStart: boolean,\n\tpersistInitialState: boolean,\n\tacquisition: { store?: SessionStore },\n): Promise<CreateAgentSessionResult> {\n\tconst cwd = resolvePath(options.cwd ?? options.sessionManager?.getCwd() ?? process.cwd());\n\tconst agentDir = options.agentDir ? resolvePath(options.agentDir) : getDefaultAgentDir();\n\tvalidateProcessStorage(agentDir);\n\tlet resourceLoader = options.resourceLoader;\n\t// The concrete default can rediscover into private storage (including deferred\n\t// CLI configuration). Custom discovery stays delegated; composition instantiates\n\t// its extensions independently without replacing overridden resource policy.\n\tif (canCloneDefaultResourceDiscovery(resourceLoader)) {\n\t\tresourceLoader = await resourceLoader.createSessionLoader(sessionLifecycleCreation.getStore()!.scope);\n\t}\n\tif (resourceLoader) resourceLoader = await isolateMandatoryResourceLoader(resourceLoader);\n\n\tconst authPath = options.agentDir ? join(agentDir, \"auth.json\") : undefined;\n\tconst modelsPath = options.agentDir ? join(agentDir, \"models.json\") : undefined;\n\tconst modelRuntime = options.modelRuntime ?? (await ModelRuntime.create({ authPath, modelsPath }));\n\tawait modelRuntime.refresh({ allowNetwork: false });\n\n\tconst settingsManager = options.settingsManager ?? SettingsManager.create(cwd, agentDir);\n\tlet sessionManager = options.sessionManager;\n\tif (!sessionManager) {\n\t\tconst store = await resolveSessionStore(cwd, {\n\t\t\tagentDir,\n\t\t\tsettings: settingsManager.getSettings(),\n\t\t\tsessionStore: options.sessionStore,\n\t\t});\n\t\tif (store !== options.sessionStore) acquisition.store = store;\n\t\tsessionManager = await SessionManager.create(store, cwd);\n\t}\n\n\t// Mark workflow-created sessions as internal so they are excluded from the\n\t// standard `/resume` history while remaining resumable via `/workflow resume`.\n\t// Only stamped when the orchestration context identifies a workflow stage;\n\t// reattaching to an already-marked session preserves its existing marker.\n\tif (options.orchestrationContext?.kind === \"workflow-stage\") {\n\t\tconst ctx = options.orchestrationContext;\n\t\tawait sessionManager.markSessionInternal({\n\t\t\trunId: ctx.workflowRunId,\n\t\t\tstageId: ctx.workflowStageId,\n\t\t\tstageName: ctx.workflowStageName,\n\t\t});\n\t}\n\n\tconst disableWorkflowExtension =\n\t\toptions.orchestrationContext?.kind === \"workflow-stage\" || options.subagentPolicy !== undefined;\n\tif (!resourceLoader) {\n\t\tresourceLoader = new DefaultResourceLoader({\n\t\t\tcwd,\n\t\t\tagentDir,\n\t\t\tsettingsManager,\n\t\t\tbuiltinPackagePaths: getBuiltinPackagePaths(options.builtins).map((source) =>\n\t\t\t\tdisableWorkflowExtension && basename(source) === \"workflows\" ? { source, extensions: [] } : source,\n\t\t\t),\n\t\t});\n\t\tawait resourceLoader.reload();\n\t\ttime(\"resourceLoader.reload\");\n\t}\n\tif (\n\t\t(options.resourceLoader || options.builtins || disableWorkflowExtension) &&\n\t\t(!isMandatoryResourceLoader(resourceLoader) || options.builtins || disableWorkflowExtension)\n\t) {\n\t\tresourceLoader = await withBuiltinResourceLoader(\n\t\t\tresourceLoader,\n\t\t\tcwd,\n\t\t\tagentDir,\n\t\t\toptions.builtins,\n\t\t\tdisableWorkflowExtension,\n\t\t);\n\t}\n\tif (options.builtins?.intercom !== false) {\n\t\tresourceLoader = await withMandatoryResourceLoader(resourceLoader, cwd);\n\t}\n\n\t// Check if session has existing data to restore\n\tconst existingSession = sessionManager.buildSessionContext();\n\tconst repairedMessages = repairOrphanToolResults(existingSession.messages, { repairTrailing: true });\n\tconst existingMessages = options.initialContextTransform\n\t\t? options.initialContextTransform(repairedMessages)\n\t\t: repairedMessages;\n\tconst hasExistingSession = existingMessages.length > 0;\n\tconst hasThinkingEntry = sessionManager.getBranch().some((entry) => entry.type === \"thinking_level_change\");\n\n\tlet model = options.model;\n\tlet modelFallbackMessage: string | undefined;\n\tlet modelFallbackReason: import(\"./model-resolver-types.ts\").ModelFallbackReason | undefined;\n\n\t// If session has data, try to restore model from it\n\tif (!model && hasExistingSession && existingSession.model) {\n\t\tmodel = await resolveRestoredModelReference(\n\t\t\texistingSession.model.provider,\n\t\t\texistingSession.model.modelId,\n\t\t\tmodelRuntime,\n\t\t);\n\t\tif (!model) {\n\t\t\tmodelFallbackMessage = `Could not restore model ${existingSession.model.provider}/${existingSession.model.modelId}`;\n\t\t\tmodelFallbackReason = \"session-restore\";\n\t\t}\n\t}\n\tif (!model) {\n\t\tconst result = await findInitialModel({\n\t\t\tscopedModels: [],\n\t\t\tisContinuing: hasExistingSession,\n\t\t\tdefaultProvider: settingsManager.getDefaultProvider(),\n\t\t\tdefaultModelId: settingsManager.getDefaultModel(),\n\t\t\tdefaultThinkingLevel: settingsManager.getDefaultThinkingLevel(),\n\t\t\tmodelThinkingLevels: settingsManager.getAllModelThinkingLevels(),\n\t\t\tmodelRuntime,\n\t\t});\n\t\tmodel = result.model;\n\t\tif (!model) {\n\t\t\tif (result.fallbackReason === \"configured-provider-unsupported\") {\n\t\t\t\tmodelFallbackMessage = result.fallbackMessage;\n\t\t\t\tmodelFallbackReason = result.fallbackReason;\n\t\t\t} else if (!modelFallbackMessage) {\n\t\t\t\tmodelFallbackMessage = result.fallbackMessage ?? formatNoModelsAvailableMessage();\n\t\t\t\tmodelFallbackReason = result.fallbackReason ?? \"no-models-available\";\n\t\t\t}\n\t\t} else if (modelFallbackMessage) {\n\t\t\tmodelFallbackMessage += `. Using ${model.provider}/${model.id}`;\n\t\t}\n\t}\n\n\tlet thinkingLevel = options.thinkingLevel;\n\n\t// If session has data, restore thinking level from it\n\tif (thinkingLevel === undefined && hasExistingSession) {\n\t\tthinkingLevel = hasThinkingEntry\n\t\t\t? (existingSession.thinkingLevel as ThinkingLevel)\n\t\t\t: (settingsManager.getDefaultThinkingLevel() ?? DEFAULT_THINKING_LEVEL);\n\t}\n\n\t// Fall back to per-model override, then global default\n\tif (thinkingLevel === undefined && model) {\n\t\tthinkingLevel = settingsManager.getModelThinkingLevel(model.provider, model.id);\n\t}\n\tif (thinkingLevel === undefined) {\n\t\tthinkingLevel = settingsManager.getDefaultThinkingLevel() ?? DEFAULT_THINKING_LEVEL;\n\t}\n\n\t// Clamp to model capabilities\n\tif (!model) {\n\t\tthinkingLevel = \"off\";\n\t} else {\n\t\tthinkingLevel = clampThinkingLevel(model, thinkingLevel) as ThinkingLevel;\n\t}\n\n\t// `defaultTools` narrows only the initial BUILT-IN selection. It must not\n\t// narrow `allowedToolNames`: a narrow allowlist would drop every extension\n\t// and SDK custom tool (workflow, subagent, intercom, mcp, web_search, ...)\n\t// for any user who configures it (upstream 4d9aa837 + companion fix 541045ae).\n\tconst toolListError = options.tools ? getToolListError(options.tools) : undefined;\n\tif (toolListError) throw new Error(`Invalid tools option: ${toolListError}`);\n\tconst defaultToolNames = options.noTools ? [] : (settingsManager.getDefaultTools() ?? getDefaultToolNames());\n\tconst toolModifiers = options.tools?.some(isToolModifier) ? options.tools : undefined;\n\tconst selectedToolNames = toolModifiers ? applyToolModifiers(defaultToolNames, toolModifiers) : options.tools;\n\tconst allowedToolNames =\n\t\toptions.noTools === \"all\"\n\t\t\t? []\n\t\t\t: toolModifiers\n\t\t\t\t? undefined\n\t\t\t\t: options.tools === undefined\n\t\t\t\t\t? undefined\n\t\t\t\t\t: [...options.tools];\n\tconst subagentPolicy =\n\t\toptions.subagentPolicy && (options.subagentPolicy.depth ?? 0) >= 1\n\t\t\t? {\n\t\t\t\t\t...options.subagentPolicy,\n\t\t\t\t\ttools: allowedToolNames,\n\t\t\t\t\tmcpDirectTools:\n\t\t\t\t\t\toptions.noTools === \"all\"\n\t\t\t\t\t\t\t? []\n\t\t\t\t\t\t\t: (options.subagentPolicy.mcpDirectTools ?? (allowedToolNames === undefined ? undefined : [])),\n\t\t\t\t}\n\t\t\t: options.subagentPolicy;\n\tconst isExcludedTool = options.excludedTools ? createToolNameMatcher(options.excludedTools) : undefined;\n\tconst initialActiveToolNames = (options.noTools === \"all\" ? [] : (selectedToolNames ?? defaultToolNames)).filter(\n\t\t(name) => !isExcludedTool?.(name),\n\t);\n\tconst childBuiltins = { ...options.builtins };\n\tconst childExcludedTools = [\n\t\t...(options.excludedTools ?? []),\n\t\t...(allowedToolNames === undefined\n\t\t\t? [...allToolNames].filter((name) => !initialActiveToolNames.includes(name))\n\t\t\t: []),\n\t];\n\n\tlet agent: Agent;\n\n\tlet lastConvertedLlmMessages: Message[] | undefined;\n\n\t// Create convertToLlm wrapper that filters images if blockImages is enabled (defense-in-depth)\n\tconst convertToLlmWithBlockImages = (messages: AgentMessage[]): Message[] => {\n\t\tconst converted = convertToLlm(messages);\n\t\t// Check setting dynamically so mid-session changes take effect\n\t\tif (!settingsManager.getBlockImages()) {\n\t\t\tlastConvertedLlmMessages = converted;\n\t\t\treturn converted;\n\t\t}\n\t\t// Filter out ImageContent from all messages, replacing with text placeholder\n\t\tconst filtered = converted.map((msg): Message => {\n\t\t\tif (msg.role === \"user\" || msg.role === \"toolResult\") {\n\t\t\t\tconst content = msg.content;\n\t\t\t\tif (Array.isArray(content)) {\n\t\t\t\t\tconst hasImages = content.some((c) => c.type === \"image\");\n\t\t\t\t\tif (hasImages) {\n\t\t\t\t\t\tconst filteredContent = content\n\t\t\t\t\t\t\t.map((c) =>\n\t\t\t\t\t\t\t\tc.type === \"image\"\n\t\t\t\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t\t\t\ttype: \"text\" as const,\n\t\t\t\t\t\t\t\t\t\t\ttext: \"Image reading is disabled.\",\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t: c,\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t.filter(\n\t\t\t\t\t\t\t\t(c, i, arr) =>\n\t\t\t\t\t\t\t\t\t// Dedupe consecutive \"Image reading is disabled.\" texts\n\t\t\t\t\t\t\t\t\t!(\n\t\t\t\t\t\t\t\t\t\tc.type === \"text\" &&\n\t\t\t\t\t\t\t\t\t\tc.text === \"Image reading is disabled.\" &&\n\t\t\t\t\t\t\t\t\t\ti > 0 &&\n\t\t\t\t\t\t\t\t\t\tarr[i - 1].type === \"text\" &&\n\t\t\t\t\t\t\t\t\t\t(arr[i - 1] as { type: \"text\"; text: string }).text === \"Image reading is disabled.\"\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t// `user` and `toolResult` carry different content unions, and mapping them in one\n\t\t\t\t\t\t// branch widens both to their union. Only image blocks are rewritten here, so each\n\t\t\t\t\t\t// message keeps its own shape at runtime.\n\t\t\t\t\t\treturn { ...msg, content: filteredContent } as Message;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn msg;\n\t\t});\n\t\tlastConvertedLlmMessages = filtered;\n\t\treturn filtered;\n\t};\n\n\tconst extensionRunnerRef: { current?: ExtensionRunner } = {};\n\tconst cacheWarmer = new CacheWarmer(\n\t\t{\n\t\t\tstreamSimple: (model, context, requestOptions) => {\n\t\t\t\tconst extension = modelRuntime.getRegisteredProviderConfig(model.provider);\n\t\t\t\treturn getModelFastRoute(model)?.serviceTier !== undefined &&\n\t\t\t\t\textension?.aliasOf === undefined &&\n\t\t\t\t\t!(extension?.streamSimple && extension.api === model.api)\n\t\t\t\t\t? streamWithFastRoute(model, context, requestOptions)\n\t\t\t\t\t: modelRuntime.streamSimple(model, context, requestOptions);\n\t\t\t},\n\t\t},\n\t\tsessionManager,\n\t\t() => settingsManager.getCacheWarmingMode(),\n\t\tasync (event) => {\n\t\t\tconst runner = extensionRunnerRef.current;\n\t\t\tif (!runner) {\n\t\t\t\treturn event.action;\n\t\t\t}\n\t\t\treturn (await runner.emitCacheWarmingDecision(event)) ?? event.action;\n\t\t},\n\t\t(refresh) => trackSessionWork(session, refresh),\n\t);\n\n\tconst handleProviderStreamEvent: NonNullable<ModelRuntimeSimpleStreamOptions[\"onProviderStreamEvent\"]> = async (\n\t\tdata,\n\t\tmodel,\n\t) => {\n\t\tconst runner = extensionRunnerRef.current;\n\t\tif (!runner?.hasHandlers(\"provider_stream_event\")) return;\n\t\tawait runner.emit({\n\t\t\ttype: \"provider_stream_event\",\n\t\t\tprovider: model.provider,\n\t\t\tapi: model.api,\n\t\t\tmodel: model.id,\n\t\t\tdata,\n\t\t});\n\t};\n\n\tagent = new Agent({\n\t\tinitialState: {\n\t\t\tsystemPrompt: \"\",\n\t\t\tmodel,\n\t\t\tthinkingLevel,\n\t\t\ttools: [],\n\t\t\tmessages: existingMessages,\n\t\t},\n\t\tconvertToLlm: convertToLlmWithBlockImages,\n\t\tstreamFn: async (model, context, streamOptions) => {\n\t\t\tconst onProviderStreamEvent = streamOptions?.onProviderStreamEvent ?? handleProviderStreamEvent;\n\t\t\tconst prepare = async () => {\n\t\t\t\tconst authResult = await modelRuntime.getRequestAuth(model, {\n\t\t\t\t\tapiKey: streamOptions?.apiKey,\n\t\t\t\t\tenv: streamOptions?.env,\n\t\t\t\t\tsignal: streamOptions?.signal,\n\t\t\t\t});\n\t\t\t\tconst compatibility = authResult ? undefined : modelRuntime.getCompatibilityRequestConfig(model);\n\t\t\t\tif (!authResult && compatibility?.authHeader) {\n\t\t\t\t\tthrow new Error(`No API key found for \"${model.provider}\"`);\n\t\t\t\t}\n\t\t\t\tconst auth = {\n\t\t\t\t\tapiKey: authResult?.auth.apiKey,\n\t\t\t\t\theaders: authResult?.auth.headers ?? compatibility?.headers,\n\t\t\t\t\tbaseUrl: authResult?.auth.baseUrl,\n\t\t\t\t\tenv: authResult?.env,\n\t\t\t\t};\n\t\t\t\tconst requestModel =\n\t\t\t\t\tauth.baseUrl !== undefined && auth.baseUrl !== model.baseUrl\n\t\t\t\t\t\t? { ...model, baseUrl: auth.baseUrl }\n\t\t\t\t\t\t: model;\n\t\t\t\tconst providerRetrySettings = settingsManager.getProviderRetrySettings();\n\t\t\t\tconst httpIdleTimeoutMs = settingsManager.getHttpIdleTimeoutMs();\n\t\t\t\t// SDKs treat timeout=0 as 0ms (immediate timeout), not \"no timeout\".\n\t\t\t\t// Use max int32 to effectively disable the timeout.\n\t\t\t\tconst effectiveTimeoutMs = httpIdleTimeoutMs === 0 ? 2147483647 : httpIdleTimeoutMs;\n\t\t\t\tconst timeoutMs = streamOptions?.timeoutMs ?? providerRetrySettings.timeoutMs ?? effectiveTimeoutMs;\n\t\t\t\tconst websocketConnectTimeoutMs =\n\t\t\t\t\tstreamOptions?.websocketConnectTimeoutMs ?? settingsManager.getWebSocketConnectTimeoutMs();\n\t\t\t\tconst streamDeadlineMs = streamOptions?.streamDeadlineMs ?? settingsManager.getStreamDeadlineMs();\n\t\t\t\tconst requestHeaders = mergeProviderAttributionHeaders(\n\t\t\t\t\tmodel,\n\t\t\t\t\tsettingsManager,\n\t\t\t\t\tstreamOptions?.sessionId,\n\t\t\t\t\tauth.headers,\n\t\t\t\t\tstreamOptions?.headers,\n\t\t\t\t);\n\t\t\t\tconst mergedHeaders = mergeHeaders(model.headers, requestHeaders);\n\t\t\t\tconst headerRunner = extensionRunnerRef.current;\n\t\t\t\tconst assembledHeaders = headerRunner?.hasHandlers(\"before_provider_headers\")\n\t\t\t\t\t? await headerRunner.emitBeforeProviderHeaders(mergedHeaders ?? {})\n\t\t\t\t\t: mergedHeaders;\n\t\t\t\tconst extensionProvider = modelRuntime.getRegisteredProviderConfig(requestModel.provider);\n\t\t\t\tconst usesExtensionStream =\n\t\t\t\t\textensionProvider?.streamSimple !== undefined && requestModel.api === extensionProvider.api;\n\t\t\t\tconst transportHeaders = usesExtensionStream\n\t\t\t\t\t? assembledHeaders\n\t\t\t\t\t: removeUnownedModelHeaders(assembledHeaders, model.headers, requestHeaders);\n\t\t\t\t// Fast-vs-normal is the selected model's own identity, so the canonical `-fast` model is what\n\t\t\t\t// dispatch, the recorded assistant message, session state, and usage all see. The provider\n\t\t\t\t// adapter reads `fastRoute.upstreamModelId` when it serializes the outbound request.\n\t\t\t\tconst fastRoute = getModelFastRoute(requestModel);\n\t\t\t\tif (fastRoute?.serviceTier !== undefined && !usesExtensionStream && !authResult) {\n\t\t\t\t\tthrow new Error(`No API key found for \"${model.provider}\"`);\n\t\t\t\t}\n\t\t\t\tconst env = auth.env || streamOptions?.env ? { ...auth.env, ...streamOptions?.env } : undefined;\n\t\t\t\tconst cacheRetentionEnv = getProviderEnvValue(\"PI_CACHE_RETENTION\", env);\n\t\t\t\t// Shared by main chat, workflow stages and subagents; provider capability gates still apply.\n\t\t\t\tconst cacheRetention =\n\t\t\t\t\tstreamOptions?.cacheRetention ??\n\t\t\t\t\t(cacheRetentionEnv === \"none\"\n\t\t\t\t\t\t? \"none\"\n\t\t\t\t\t\t: !cacheRetentionEnv\n\t\t\t\t\t\t\t? getDefaultCacheRetention(requestModel)\n\t\t\t\t\t\t\t: cacheRetentionEnv === \"long\"\n\t\t\t\t\t\t\t\t? \"long\"\n\t\t\t\t\t\t\t\t: \"short\");\n\t\t\t\tconst fastRouteStreamOptions = withFastRouteStreamOptions(fastRoute, {\n\t\t\t\t\t...streamOptions,\n\t\t\t\t\tapiKey: auth.apiKey,\n\t\t\t\t\tenv,\n\t\t\t\t\tcacheRetention,\n\t\t\t\t\ttimeoutMs,\n\t\t\t\t\twebsocketConnectTimeoutMs,\n\t\t\t\t\tstreamDeadlineMs,\n\t\t\t\t\tmaxRetries: streamOptions?.maxRetries ?? providerRetrySettings.maxRetries,\n\t\t\t\t\tmaxRetryDelayMs: streamOptions?.maxRetryDelayMs ?? providerRetrySettings.maxRetryDelayMs,\n\t\t\t\t\theaders: transportHeaders,\n\t\t\t\t});\n\t\t\t\tconst nativeFastRoute =\n\t\t\t\t\tfastRoute?.serviceTier !== undefined && !usesExtensionStream && extensionProvider?.aliasOf === undefined;\n\t\t\t\tconst requestOptions: ModelRuntimeSimpleStreamOptions = {\n\t\t\t\t\t...fastRouteStreamOptions,\n\t\t\t\t\tonProviderStreamEvent,\n\t\t\t\t\tpreparedRequestAuth: {\n\t\t\t\t\t\tresolution: authResult,\n\t\t\t\t\t\treprepare: async () => {\n\t\t\t\t\t\t\tconst next = await prepare();\n\t\t\t\t\t\t\treturn { model: next.requestModel, options: next.requestOptions };\n\t\t\t\t\t\t},\n\t\t\t\t\t\tstreamSimple: nativeFastRoute\n\t\t\t\t\t\t\t? (routeModel, routeContext, routeOptions) =>\n\t\t\t\t\t\t\t\t\tstreamWithFastRoute(routeModel, routeContext, routeOptions)\n\t\t\t\t\t\t\t: undefined,\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t\treturn { authResult, requestModel, fastRouteStreamOptions, requestOptions };\n\t\t\t};\n\t\t\tconst { authResult, requestModel, fastRouteStreamOptions, requestOptions } = await prepare();\n\t\t\tif (streamOptions?.sessionId === sessionManager.getSessionId()) {\n\t\t\t\tconst prefix = [...agent.state.messages];\n\t\t\t\tconst warmOptions: ModelRuntimeSimpleStreamOptions = {\n\t\t\t\t\t...fastRouteStreamOptions,\n\t\t\t\t\tpreparedRequestAuth: {\n\t\t\t\t\t\tresolution: authResult,\n\t\t\t\t\t\treprepare: requestOptions.preparedRequestAuth?.reprepare,\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t\tcacheWarmer.start({ model: requestModel, context, options: warmOptions }, () => {\n\t\t\t\t\tconst current = agent.state.model;\n\t\t\t\t\treturn (\n\t\t\t\t\t\t!sessionLifetime(session).aborted &&\n\t\t\t\t\t\t!sessionGenerationClosing.has(session) &&\n\t\t\t\t\t\t!(session as unknown as AgentSessionInternalSurface)._agentRunAbortRequested &&\n\t\t\t\t\t\tcurrent?.provider === model.provider &&\n\t\t\t\t\t\tcurrent.id === model.id &&\n\t\t\t\t\t\tprefix.every((message, index) => agent.state.messages[index] === message)\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t\t}\n\t\t\t// The Codex routing identity is attached by ModelRuntimeStreaming, after auth headers are\n\t\t\t// merged. Applying it here would be inert: `mergeHeaders` copies the header object the\n\t\t\t// wrapper mutates.\n\t\t\treturn modelRuntime.streamSimple(requestModel, context, requestOptions);\n\t\t},\n\t\tonPayload: async (payload, model) => {\n\t\t\tconst sourceMessages = lastConvertedLlmMessages;\n\t\t\tconst replayGuardedPayload = sourceMessages\n\t\t\t\t? restoreAnthropicReplayThinkingBlocks(payload, sourceMessages, model)\n\t\t\t\t: payload;\n\t\t\tconst runner = extensionRunnerRef.current;\n\t\t\tlet finalPayload: unknown;\n\t\t\tif (!runner?.hasHandlers(\"before_provider_request\")) {\n\t\t\t\tfinalPayload = replayGuardedPayload;\n\t\t\t} else {\n\t\t\t\tconst extensionPayload = await runner.emitBeforeProviderRequest(replayGuardedPayload);\n\t\t\t\tfinalPayload = sourceMessages\n\t\t\t\t\t? restoreAnthropicReplayThinkingBlocks(extensionPayload, sourceMessages, model)\n\t\t\t\t\t: extensionPayload;\n\t\t\t}\n\t\t\tconst sanitizedPayload = sanitizeOpenAIResponsesPayload(finalPayload, model);\n\t\t\tmarkLifecycleTiming(\"before-provider-request\");\n\t\t\treturn sanitizedPayload;\n\t\t},\n\t\tonResponse: async (response, _model) => {\n\t\t\tconst runner = extensionRunnerRef.current;\n\t\t\tif (!runner?.hasHandlers(\"after_provider_response\")) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tawait runner.emit({\n\t\t\t\ttype: \"after_provider_response\",\n\t\t\t\tstatus: response.status,\n\t\t\t\theaders: response.headers,\n\t\t\t});\n\t\t},\n\t\tsessionId: sessionManager.getSessionId(),\n\t\ttransformContext: async (messages) => {\n\t\t\tconst runner = extensionRunnerRef.current;\n\t\t\tconst transformed = runner ? await runner.emitContext(messages) : messages;\n\t\t\treturn scrubPreCompactionAssistantUsage(transformed, sessionManager.getBranch());\n\t\t},\n\t\tsteeringMode: settingsManager.getSteeringMode(),\n\t\tfollowUpMode: settingsManager.getFollowUpMode(),\n\t\ttransport: settingsManager.getTransport(),\n\t\tthinkingBudgets: settingsManager.getThinkingBudgets(),\n\t\tmaxRetryDelayMs: settingsManager.getProviderRetrySettings().maxRetryDelayMs,\n\t});\n\n\t// The isolated host mirrors child-owned storage without writing startup metadata.\n\tif (persistInitialState) {\n\t\tif (hasExistingSession) {\n\t\t\tif (!hasThinkingEntry) {\n\t\t\t\tawait sessionManager.appendThinkingLevelChange(thinkingLevel);\n\t\t\t}\n\t\t} else {\n\t\t\tif (model) {\n\t\t\t\tawait sessionManager.appendModelChange(model.provider, model.id);\n\t\t\t}\n\t\t\tawait sessionManager.appendThinkingLevelChange(thinkingLevel);\n\t\t}\n\t}\n\n\tconst providerRollback = modelRuntime.createExtensionProviderTransaction();\n\tlet session: AgentSession;\n\tconst childCommandTaskOwner = createChildCommandTaskOwner(() => session.getAgentTaskHost());\n\ttry {\n\t\tsession = new AgentSession({\n\t\t\tagent,\n\t\t\tsessionManager,\n\t\t\tsettingsManager,\n\t\t\tcwd,\n\t\t\tworkflowJournal: options.journal,\n\t\t\tstorageAgentDir: agentDir,\n\t\t\tchildSessionOptions: (child) =>\n\t\t\t\tinheritChildSessionOptions(\n\t\t\t\t\t{\n\t\t\t\t\t\tcwd,\n\t\t\t\t\t\tagentDir,\n\t\t\t\t\t\tmodelRuntime,\n\t\t\t\t\t\tsettingsManager,\n\t\t\t\t\t\tmodel: session.model,\n\t\t\t\t\t\tthinkingLevel: session.thinkingLevel,\n\t\t\t\t\t\tfallbackModels: options.fallbackModels ?? settingsManager.getFallbackModels(),\n\t\t\t\t\t\tisFallbackModelAllowed: options.isFallbackModelAllowed,\n\t\t\t\t\t\tbuiltins: childBuiltins,\n\t\t\t\t\t\ttools: allowedToolNames,\n\t\t\t\t\t\tnoTools: options.noTools,\n\t\t\t\t\t\texcludedTools: childExcludedTools,\n\t\t\t\t\t\tcustomTools: options.customTools,\n\t\t\t\t\t\textensionBindings: session.extensionRunner.getChildHostBindings(),\n\t\t\t\t\t\tparentCommandTaskOwner: childCommandTaskOwner,\n\t\t\t\t\t},\n\t\t\t\t\tchild,\n\t\t\t\t\tsession.getAllTools().map((tool) => tool.name),\n\t\t\t\t),\n\t\t\tscopedModels: options.scopedModels,\n\t\t\tfallbackModels: options.fallbackModels ?? settingsManager.getFallbackModels(),\n\t\t\tisFallbackModelAllowed: options.isFallbackModelAllowed,\n\t\t\tresourceLoader,\n\t\t\tcustomTools: options.customTools,\n\t\t\tmodelRuntime,\n\t\t\tcacheWarmer,\n\t\t\tinitialActiveToolNames,\n\t\t\tusesDefaultTools: (options.tools === undefined || toolModifiers !== undefined) && !options.noTools,\n\t\t\tdefaultToolModifiers: toolModifiers,\n\t\t\tallowedToolNames,\n\t\t\texcludedToolNames: options.excludedTools,\n\t\t\textensionRunnerRef,\n\t\t\tsessionStartEvent: options.sessionStartEvent,\n\t\t\torchestrationContext: options.orchestrationContext,\n\t\t\tsubagentPolicy,\n\t\t\tparentCommandTaskOwner: options.parentCommandTaskOwner,\n\t\t\tsystemPromptTransform: options.systemPromptTransform,\n\t\t\tcontextProjectionTransform: options.initialContextTransform,\n\t\t});\n\t} catch (error) {\n\t\t// The constructor releases its own leases/subscriptions; restore borrowed provider state here.\n\t\tconst cleanup = await Promise.allSettled([providerRollback.commit(), settingsManager.flush()]);\n\t\tconst failures = cleanup.flatMap((result) => (result.status === \"rejected\" ? [result.reason] : []));\n\t\tif (failures.length)\n\t\t\tthrow new AggregateError([error, ...failures], \"Session construction failed and rollback reported errors\");\n\t\tthrow error;\n\t}\n\t// Only the selected factories transfer. Discovery may have acquired omitted factories.\n\tconst acquisitions = factoryAcquisitions.getStore();\n\tconst selected = resourceLoader.getExtensions();\n\tfor (const extension of selected.extensions) acquisitions?.pending?.delete(extension);\n\tif (!options.settingsManager) ownedSettingsManagers.set(settingsManager, session);\n\tconst rollbackReason = sessionLifecycleCreation.getStore()?.replacement ? \"new\" : \"quit\";\n\tregisterStartupRollback(session.extensionRunner, async (error) => {\n\t\tconst results = await Promise.allSettled([\n\t\t\t(session as unknown as AgentSessionInternalSurface)._close({\n\t\t\t\ttype: \"session_shutdown\",\n\t\t\t\treason: rollbackReason,\n\t\t\t}),\n\t\t\tproviderRollback.commit(),\n\t\t]);\n\t\tconst cleanupErrors = results.flatMap((result) => (result.status === \"rejected\" ? [result.reason] : []));\n\t\tif (cleanupErrors.length)\n\t\t\tthrow new AggregateError([error, ...cleanupErrors], \"Extension startup failed and rollback reported errors\");\n\t\tthrow error;\n\t});\n\tif (acquisition.store) {\n\t\townedSessionStores.set(session, acquisition.store);\n\t\tacquisition.store = undefined;\n\t}\n\ttry {\n\t\t// Omitted factories may share the selected runtime: release their acquisitions,\n\t\t// but leave that runtime and its selected subscriptions owned by the runner.\n\t\tconst failures = await rollbackFactoryAcquisitions(new Set([selected.runtime]));\n\t\tif (failures.length)\n\t\t\tthrow Object.assign(new AggregateError(failures, \"Unselected extension cleanup failed\"), {\n\t\t\t\tcode: \"ShutdownFailed\",\n\t\t\t});\n\t\tconst extensionsResult = resourceLoader.getExtensions();\n\t\tfor (const failure of extensionsResult.errors) {\n\t\t\tconst builtin = getBuiltinPackageLocations().find(({ packageDir }) => {\n\t\t\t\tconst path = relative(packageDir, failure.path);\n\t\t\t\treturn path !== \"..\" && !path.startsWith(`..${sep}`) && !path.startsWith(sep);\n\t\t\t});\n\t\t\tif (builtin)\n\t\t\t\tthrow Object.assign(new Error(`Builtin unavailable: ${builtin.packageName}: ${failure.error}`), {\n\t\t\t\t\tcode: \"BuiltinUnavailable\",\n\t\t\t\t});\n\t\t}\n\t\tif (!deferStart) await session.bindExtensions(options.extensionBindings ?? {});\n\t\treturn { session, extensionsResult, modelFallbackMessage, modelFallbackReason };\n\t} catch (error) {\n\t\treturn rollbackStartup(session.extensionRunner, error instanceof Error ? error : new Error(String(error)));\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"sdk.js","sourceRoot":"","sources":["../../src/core/sdk.ts"],"names":[],"mappings":"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","sourcesContent":["import { basename, join, relative, sep } from \"node:path\";\nimport { getOpenCodeSessionHeaders } from \"@bastani/pi-ai\";\nimport { clampThinkingLevel, type Message, type ProviderHeaders, streamSimple } from \"@bastani/pi-ai/compat\";\nimport { getProviderEnvValue } from \"@bastani/pi-ai/utils/provider-env\";\nimport { Agent, type AgentMessage, setDefaultStreamFn, type ThinkingLevel } from \"@earendil-works/pi-agent-core\";\nimport { getAgentDir } from \"../config.js\";\nimport { resolvePath } from \"../utils/paths.ts\";\nimport { AgentSession } from \"./agent-session.js\";\nimport type { AgentSessionInternalSurface } from \"./agent-session-methods.ts\";\nimport { restoreAnthropicReplayThinkingBlocks } from \"./anthropic-thinking-guard.ts\";\nimport { formatNoModelsAvailableMessage } from \"./auth-guidance.ts\";\nimport { getBuiltinPackageLocations, getBuiltinPackagePaths } from \"./builtin-packages.ts\";\nimport { withBuiltinResourceLoader } from \"./builtin-resource-loader.ts\";\nimport { getDefaultCacheRetention } from \"./cache-retention.ts\";\nimport { CacheWarmer } from \"./cache-warmer.ts\";\nimport { inheritChildSessionOptions } from \"./child-session-options.ts\";\nimport { getClientIdentity } from \"./client-identity.ts\";\nimport { DEFAULT_THINKING_LEVEL } from \"./defaults.ts\";\nimport { startupCleanupFailureMessage } from \"./extension-startup-failure.ts\";\nimport type { ExtensionRunner } from \"./extensions/index.js\";\nimport {\n\tfactoryAcquisitions,\n\tfactoryRollbackError,\n\trollbackFactoryAcquisitions,\n} from \"./extensions/loader-rollback.ts\";\nimport { getModelFastRoute, streamWithFastRoute, withFastRouteStreamOptions } from \"./fast-model-routing.ts\";\nimport { markLifecycleTiming } from \"./lifecycle-timings.ts\";\nimport {\n\tisMandatoryResourceLoader,\n\tisolateMandatoryResourceLoader,\n\twithMandatoryResourceLoader,\n} from \"./mandatory-resource-loader.ts\";\nimport { convertToLlm, repairOrphanToolResults } from \"./messages.ts\";\nimport { findInitialModel, resolveRestoredModelReference } from \"./model-resolver.ts\";\nimport { ModelRuntime } from \"./model-runtime.js\";\nimport { type ModelRuntimeSimpleStreamOptions, mergeHeaders } from \"./model-runtime-streaming.ts\";\nimport { sanitizeOpenAIResponsesPayload } from \"./openai-responses-payload-sanitizer.ts\";\nimport { scrubPreCompactionAssistantUsage } from \"./provider-context-usage.ts\";\nimport { canCloneDefaultResourceDiscovery, DefaultResourceLoader } from \"./resource-loader.ts\";\nimport type { CreateAgentSessionOptions, CreateAgentSessionResult } from \"./sdk-types.ts\";\nimport { sessionLifecycleCreation, sessionLifecycleScopes } from \"./session-lifecycle-scope.ts\";\nimport {\n\townedSessionManagerStores,\n\townedSessionStores,\n\tsessionGenerationClosing,\n\tsessionLifetime,\n\ttrackSessionWork,\n} from \"./session-lifecycle-work.ts\";\nimport { SessionManager } from \"./session-manager.ts\";\nimport { registerStartupRollback, rollbackStartup } from \"./session-startup-rollback.ts\";\nimport { resolveSessionStore } from \"./session-storage.js\";\nimport { SettingsManager } from \"./settings-manager.ts\";\nimport { applyToolModifiers, getToolListError, isToolModifier } from \"./settings-merge.js\";\nimport { ownedSettingsManagers } from \"./settings-write-ownership.ts\";\nimport { validateProcessStorage } from \"./storage/process-selection.js\";\nimport type { SessionStore } from \"./storage/session/types.js\";\nimport { createChildCommandTaskOwner } from \"./tasks/child-command-owner.js\";\nimport { time } from \"./timings.ts\";\nimport { createToolNameMatcher } from \"./tool-selection.ts\";\nimport { allToolNames, getDefaultToolNames } from \"./tools/index.js\";\n\nexport type { ModelFallbackReason } from \"./model-resolver-types.ts\";\nexport * from \"./sdk-exports.ts\";\nexport type { AtomicBuiltin, CreateAgentSessionOptions, CreateAgentSessionResult } from \"./sdk-types.ts\";\n\n// Preserve the pre-0.81 fallback for extensions that construct Agent instances\n// or invoke low-level agent loops without supplying streamFn.\nsetDefaultStreamFn(streamSimple);\n\n// Helper Functions\n\nfunction getDefaultAgentDir(): string {\n\treturn getAgentDir();\n}\n\n/** Keep static model headers visible to hooks without promoting unchanged defaults to request overrides. */\nfunction removeUnownedModelHeaders(\n\theaders: ProviderHeaders | undefined,\n\tmodelHeaders: ProviderHeaders | undefined,\n\trequestHeaders: ProviderHeaders | undefined,\n): ProviderHeaders | undefined {\n\tif (!headers || !modelHeaders) return headers;\n\tconst requestOwned = new Set(Object.keys(requestHeaders ?? {}).map((name) => name.toLowerCase()));\n\tconst filtered = { ...headers };\n\tfor (const [modelName, modelValue] of Object.entries(modelHeaders)) {\n\t\tconst lowerName = modelName.toLowerCase();\n\t\tif (requestOwned.has(lowerName)) continue;\n\t\tfor (const [name, value] of Object.entries(filtered)) {\n\t\t\tif (name.toLowerCase() === lowerName && value === modelValue) delete filtered[name];\n\t\t}\n\t}\n\treturn Object.keys(filtered).length > 0 ? filtered : undefined;\n}\n\n/**\n * Create an AgentSession with the specified options.\n *\n * @example\n * ```typescript\n * // Minimal - uses defaults\n * const { session } = await createAgentSession();\n *\n * // With explicit model\n * import { getModel } from '@bastani/pi-ai/compat';\n * const { session } = await createAgentSession({\n * model: getModel('anthropic', 'claude-opus-4-5'),\n * thinkingLevel: 'high',\n * });\n *\n * // Continue previous session\n * const { session, modelFallbackMessage } = await createAgentSession({\n * continueSession: true,\n * });\n *\n * // Full control\n * const loader = new DefaultResourceLoader({\n * cwd: process.cwd(),\n * agentDir: getAgentDir(),\n * settingsManager: SettingsManager.create(),\n * });\n * await loader.reload();\n * const { session } = await createAgentSession({\n * model: myModel,\n * tools: [\"read\", \"bash\"],\n * resourceLoader: loader,\n * sessionManager: SessionManager.inMemory(),\n * });\n * ```\n */\nexport async function createAgentSession(options: CreateAgentSessionOptions = {}): Promise<CreateAgentSessionResult> {\n\treturn createScopedSession(options, false);\n}\n\n/** Internal CLI assembly seam. Not exported from the package entrypoint. */\nexport function createUnstartedAgentSession(\n\toptions: CreateAgentSessionOptions,\n\tpersistInitialState = true,\n): Promise<CreateAgentSessionResult> {\n\treturn createScopedSession(options, true, persistInitialState);\n}\n\nfunction createScopedSession(\n\toptions: CreateAgentSessionOptions,\n\tdeferStart: boolean,\n\tpersistInitialState = true,\n): Promise<CreateAgentSessionResult> {\n\tconst inherited = sessionLifecycleCreation.getStore();\n\tconst context = inherited && !inherited.claimed ? inherited : { scope: {} };\n\treturn sessionLifecycleCreation.run({ ...context, claimed: true }, async () => {\n\t\tconst result = await factoryAcquisitions.run(\n\t\t\t{ pending: new Map(), replacement: context.replacement },\n\t\t\tasync () => {\n\t\t\t\tconst acquisition: { store?: SessionStore } = {\n\t\t\t\t\tstore: options.sessionManager ? ownedSessionManagerStores.get(options.sessionManager) : undefined,\n\t\t\t\t};\n\t\t\t\tif (options.sessionManager) ownedSessionManagerStores.delete(options.sessionManager);\n\t\t\t\ttry {\n\t\t\t\t\treturn await constructAgentSession(\n\t\t\t\t\t\t{ ...options, extensionBindings: options.extensionBindings ?? context.bindings },\n\t\t\t\t\t\tdeferStart,\n\t\t\t\t\t\tpersistInitialState,\n\t\t\t\t\t\tacquisition,\n\t\t\t\t\t);\n\t\t\t\t} catch (error) {\n\t\t\t\t\tconst failures = await rollbackFactoryAcquisitions();\n\t\t\t\t\tif (acquisition.store) {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tawait acquisition.store.close();\n\t\t\t\t\t\t} catch (cause) {\n\t\t\t\t\t\t\tfailures.push(cause);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tthrow factoryRollbackError(error, failures);\n\t\t\t\t}\n\t\t\t},\n\t\t);\n\t\tsessionLifecycleScopes.set(result.session, context.scope);\n\t\treturn result;\n\t});\n}\n\nasync function constructAgentSession(\n\toptions: CreateAgentSessionOptions,\n\tdeferStart: boolean,\n\tpersistInitialState: boolean,\n\tacquisition: { store?: SessionStore },\n): Promise<CreateAgentSessionResult> {\n\tconst cwd = resolvePath(options.cwd ?? options.sessionManager?.getCwd() ?? process.cwd());\n\tconst agentDir = options.agentDir ? resolvePath(options.agentDir) : getDefaultAgentDir();\n\tvalidateProcessStorage(agentDir);\n\tlet resourceLoader = options.resourceLoader;\n\t// The concrete default can rediscover into private storage (including deferred\n\t// CLI configuration). Custom discovery stays delegated; composition instantiates\n\t// its extensions independently without replacing overridden resource policy.\n\tif (canCloneDefaultResourceDiscovery(resourceLoader)) {\n\t\tresourceLoader = await resourceLoader.createSessionLoader(sessionLifecycleCreation.getStore()!.scope);\n\t}\n\tif (resourceLoader) resourceLoader = await isolateMandatoryResourceLoader(resourceLoader);\n\n\tconst authPath = options.agentDir ? join(agentDir, \"auth.json\") : undefined;\n\tconst modelsPath = options.agentDir ? join(agentDir, \"models.json\") : undefined;\n\tconst modelRuntime = options.modelRuntime ?? (await ModelRuntime.create({ authPath, modelsPath }));\n\tawait modelRuntime.refresh({ allowNetwork: false });\n\n\tconst settingsManager = options.settingsManager ?? SettingsManager.create(cwd, agentDir);\n\tlet sessionManager = options.sessionManager;\n\tif (!sessionManager) {\n\t\tconst store = await resolveSessionStore(cwd, {\n\t\t\tagentDir,\n\t\t\tsettings: settingsManager.getSettings(),\n\t\t\tsessionStore: options.sessionStore,\n\t\t});\n\t\tif (store !== options.sessionStore) acquisition.store = store;\n\t\tsessionManager = await SessionManager.create(store, cwd);\n\t}\n\n\t// Mark workflow-created sessions as internal so they are excluded from the\n\t// standard `/resume` history while remaining resumable via `/workflow resume`.\n\t// Only stamped when the orchestration context identifies a workflow stage;\n\t// reattaching to an already-marked session preserves its existing marker.\n\tif (options.orchestrationContext?.kind === \"workflow-stage\") {\n\t\tconst ctx = options.orchestrationContext;\n\t\tawait sessionManager.markSessionInternal({\n\t\t\trunId: ctx.workflowRunId,\n\t\t\tstageId: ctx.workflowStageId,\n\t\t\tstageName: ctx.workflowStageName,\n\t\t});\n\t}\n\n\tconst disableWorkflowExtension =\n\t\toptions.orchestrationContext?.kind === \"workflow-stage\" || options.subagentPolicy !== undefined;\n\tif (!resourceLoader) {\n\t\tresourceLoader = new DefaultResourceLoader({\n\t\t\tcwd,\n\t\t\tagentDir,\n\t\t\tsettingsManager,\n\t\t\tbuiltinPackagePaths: getBuiltinPackagePaths(options.builtins).map((source) =>\n\t\t\t\tdisableWorkflowExtension && basename(source) === \"workflows\" ? { source, extensions: [] } : source,\n\t\t\t),\n\t\t});\n\t\tawait resourceLoader.reload();\n\t\ttime(\"resourceLoader.reload\");\n\t}\n\tif (\n\t\t(options.resourceLoader || options.builtins || disableWorkflowExtension) &&\n\t\t(!isMandatoryResourceLoader(resourceLoader) || options.builtins || disableWorkflowExtension)\n\t) {\n\t\tresourceLoader = await withBuiltinResourceLoader(\n\t\t\tresourceLoader,\n\t\t\tcwd,\n\t\t\tagentDir,\n\t\t\toptions.builtins,\n\t\t\tdisableWorkflowExtension,\n\t\t);\n\t}\n\tif (options.builtins?.intercom !== false) {\n\t\tresourceLoader = await withMandatoryResourceLoader(resourceLoader, cwd);\n\t}\n\n\t// Check if session has existing data to restore\n\tconst existingSession = sessionManager.buildSessionContext();\n\tconst repairedMessages = repairOrphanToolResults(existingSession.messages, { repairTrailing: true });\n\tconst existingMessages = options.initialContextTransform\n\t\t? options.initialContextTransform(repairedMessages)\n\t\t: repairedMessages;\n\tconst hasExistingSession = existingMessages.length > 0;\n\tconst hasThinkingEntry = sessionManager.getBranch().some((entry) => entry.type === \"thinking_level_change\");\n\n\tlet model = options.model;\n\tlet modelFallbackMessage: string | undefined;\n\tlet modelFallbackReason: import(\"./model-resolver-types.ts\").ModelFallbackReason | undefined;\n\n\t// If session has data, try to restore model from it\n\tif (!model && hasExistingSession && existingSession.model) {\n\t\tmodel = await resolveRestoredModelReference(\n\t\t\texistingSession.model.provider,\n\t\t\texistingSession.model.modelId,\n\t\t\tmodelRuntime,\n\t\t);\n\t\tif (!model) {\n\t\t\tmodelFallbackMessage = `Could not restore model ${existingSession.model.provider}/${existingSession.model.modelId}`;\n\t\t\tmodelFallbackReason = \"session-restore\";\n\t\t}\n\t}\n\tif (!model) {\n\t\tconst result = await findInitialModel({\n\t\t\tscopedModels: [],\n\t\t\tisContinuing: hasExistingSession,\n\t\t\tdefaultProvider: settingsManager.getDefaultProvider(),\n\t\t\tdefaultModelId: settingsManager.getDefaultModel(),\n\t\t\tdefaultThinkingLevel: settingsManager.getDefaultThinkingLevel(),\n\t\t\tmodelThinkingLevels: settingsManager.getAllModelThinkingLevels(),\n\t\t\tmodelRuntime,\n\t\t});\n\t\tmodel = result.model;\n\t\tif (!model) {\n\t\t\tif (result.fallbackReason === \"configured-provider-unsupported\") {\n\t\t\t\tmodelFallbackMessage = result.fallbackMessage;\n\t\t\t\tmodelFallbackReason = result.fallbackReason;\n\t\t\t} else if (!modelFallbackMessage) {\n\t\t\t\tmodelFallbackMessage = result.fallbackMessage ?? formatNoModelsAvailableMessage();\n\t\t\t\tmodelFallbackReason = result.fallbackReason ?? \"no-models-available\";\n\t\t\t}\n\t\t} else if (modelFallbackMessage) {\n\t\t\tmodelFallbackMessage += `. Using ${model.provider}/${model.id}`;\n\t\t}\n\t}\n\n\tlet thinkingLevel = options.thinkingLevel;\n\n\t// If session has data, restore thinking level from it\n\tif (thinkingLevel === undefined && hasExistingSession) {\n\t\tthinkingLevel = hasThinkingEntry\n\t\t\t? (existingSession.thinkingLevel as ThinkingLevel)\n\t\t\t: (settingsManager.getDefaultThinkingLevel() ?? DEFAULT_THINKING_LEVEL);\n\t}\n\n\t// Fall back to per-model override, then global default\n\tif (thinkingLevel === undefined && model) {\n\t\tthinkingLevel = settingsManager.getModelThinkingLevel(model.provider, model.id);\n\t}\n\tif (thinkingLevel === undefined) {\n\t\tthinkingLevel = settingsManager.getDefaultThinkingLevel() ?? DEFAULT_THINKING_LEVEL;\n\t}\n\n\t// Clamp to model capabilities\n\tif (!model) {\n\t\tthinkingLevel = \"off\";\n\t} else {\n\t\tthinkingLevel = clampThinkingLevel(model, thinkingLevel) as ThinkingLevel;\n\t}\n\n\t// `defaultTools` narrows only the initial BUILT-IN selection. It must not\n\t// narrow `allowedToolNames`: a narrow allowlist would drop every extension\n\t// and SDK custom tool (workflow, subagent, intercom, mcp, web_search, ...)\n\t// for any user who configures it (upstream 4d9aa837 + companion fix 541045ae).\n\tconst toolListError = options.tools ? getToolListError(options.tools) : undefined;\n\tif (toolListError) throw new Error(`Invalid tools option: ${toolListError}`);\n\tconst defaultToolNames = options.noTools ? [] : (settingsManager.getDefaultTools() ?? getDefaultToolNames());\n\tconst toolModifiers = options.tools?.some(isToolModifier) ? options.tools : undefined;\n\tconst selectedToolNames = toolModifiers ? applyToolModifiers(defaultToolNames, toolModifiers) : options.tools;\n\tconst allowedToolNames =\n\t\toptions.noTools === \"all\"\n\t\t\t? []\n\t\t\t: toolModifiers\n\t\t\t\t? undefined\n\t\t\t\t: options.tools === undefined\n\t\t\t\t\t? undefined\n\t\t\t\t\t: [...options.tools];\n\tconst subagentPolicy =\n\t\toptions.subagentPolicy && (options.subagentPolicy.depth ?? 0) >= 1\n\t\t\t? {\n\t\t\t\t\t...options.subagentPolicy,\n\t\t\t\t\ttools: allowedToolNames,\n\t\t\t\t\tmcpDirectTools:\n\t\t\t\t\t\toptions.noTools === \"all\"\n\t\t\t\t\t\t\t? []\n\t\t\t\t\t\t\t: (options.subagentPolicy.mcpDirectTools ?? (allowedToolNames === undefined ? undefined : [])),\n\t\t\t\t}\n\t\t\t: options.subagentPolicy;\n\tconst isExcludedTool = options.excludedTools ? createToolNameMatcher(options.excludedTools) : undefined;\n\tconst initialActiveToolNames = (options.noTools === \"all\" ? [] : (selectedToolNames ?? defaultToolNames)).filter(\n\t\t(name) => !isExcludedTool?.(name),\n\t);\n\tconst childBuiltins = { ...options.builtins };\n\tconst childExcludedTools = [\n\t\t...(options.excludedTools ?? []),\n\t\t...(allowedToolNames === undefined\n\t\t\t? [...allToolNames].filter((name) => !initialActiveToolNames.includes(name))\n\t\t\t: []),\n\t];\n\n\tlet agent: Agent;\n\n\tlet lastConvertedLlmMessages: Message[] | undefined;\n\n\t// Create convertToLlm wrapper that filters images if blockImages is enabled (defense-in-depth)\n\tconst convertToLlmWithBlockImages = (messages: AgentMessage[]): Message[] => {\n\t\tconst converted = convertToLlm(messages);\n\t\t// Check setting dynamically so mid-session changes take effect\n\t\tif (!settingsManager.getBlockImages()) {\n\t\t\tlastConvertedLlmMessages = converted;\n\t\t\treturn converted;\n\t\t}\n\t\t// Filter out ImageContent from all messages, replacing with text placeholder\n\t\tconst filtered = converted.map((msg): Message => {\n\t\t\tif (msg.role === \"user\" || msg.role === \"toolResult\") {\n\t\t\t\tconst content = msg.content;\n\t\t\t\tif (Array.isArray(content)) {\n\t\t\t\t\tconst hasImages = content.some((c) => c.type === \"image\");\n\t\t\t\t\tif (hasImages) {\n\t\t\t\t\t\tconst filteredContent = content\n\t\t\t\t\t\t\t.map((c) =>\n\t\t\t\t\t\t\t\tc.type === \"image\"\n\t\t\t\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t\t\t\ttype: \"text\" as const,\n\t\t\t\t\t\t\t\t\t\t\ttext: \"Image reading is disabled.\",\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t: c,\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t.filter(\n\t\t\t\t\t\t\t\t(c, i, arr) =>\n\t\t\t\t\t\t\t\t\t// Dedupe consecutive \"Image reading is disabled.\" texts\n\t\t\t\t\t\t\t\t\t!(\n\t\t\t\t\t\t\t\t\t\tc.type === \"text\" &&\n\t\t\t\t\t\t\t\t\t\tc.text === \"Image reading is disabled.\" &&\n\t\t\t\t\t\t\t\t\t\ti > 0 &&\n\t\t\t\t\t\t\t\t\t\tarr[i - 1].type === \"text\" &&\n\t\t\t\t\t\t\t\t\t\t(arr[i - 1] as { type: \"text\"; text: string }).text === \"Image reading is disabled.\"\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t// `user` and `toolResult` carry different content unions, and mapping them in one\n\t\t\t\t\t\t// branch widens both to their union. Only image blocks are rewritten here, so each\n\t\t\t\t\t\t// message keeps its own shape at runtime.\n\t\t\t\t\t\treturn { ...msg, content: filteredContent } as Message;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn msg;\n\t\t});\n\t\tlastConvertedLlmMessages = filtered;\n\t\treturn filtered;\n\t};\n\n\tconst extensionRunnerRef: { current?: ExtensionRunner } = {};\n\tconst cacheWarmer = new CacheWarmer(\n\t\t{\n\t\t\tstreamSimple: (model, context, requestOptions) => {\n\t\t\t\tconst extension = modelRuntime.getRegisteredProviderConfig(model.provider);\n\t\t\t\treturn getModelFastRoute(model)?.serviceTier !== undefined &&\n\t\t\t\t\textension?.aliasOf === undefined &&\n\t\t\t\t\t!(extension?.streamSimple && extension.api === model.api)\n\t\t\t\t\t? streamWithFastRoute(model, context, requestOptions)\n\t\t\t\t\t: modelRuntime.streamSimple(model, context, requestOptions);\n\t\t\t},\n\t\t},\n\t\tsessionManager,\n\t\t() => settingsManager.getCacheWarmingMode(),\n\t\tasync (event) => {\n\t\t\tconst runner = extensionRunnerRef.current;\n\t\t\tif (!runner) {\n\t\t\t\treturn event.action;\n\t\t\t}\n\t\t\treturn (await runner.emitCacheWarmingDecision(event)) ?? event.action;\n\t\t},\n\t\t(refresh) => trackSessionWork(session, refresh),\n\t);\n\n\tconst handleProviderStreamEvent: NonNullable<ModelRuntimeSimpleStreamOptions[\"onProviderStreamEvent\"]> = async (\n\t\tdata,\n\t\tmodel,\n\t) => {\n\t\tconst runner = extensionRunnerRef.current;\n\t\tif (!runner?.hasHandlers(\"provider_stream_event\")) return;\n\t\tawait runner.emit({\n\t\t\ttype: \"provider_stream_event\",\n\t\t\tprovider: model.provider,\n\t\t\tapi: model.api,\n\t\t\tmodel: model.id,\n\t\t\tdata,\n\t\t});\n\t};\n\n\tagent = new Agent({\n\t\tinitialState: {\n\t\t\tsystemPrompt: \"\",\n\t\t\tmodel,\n\t\t\tthinkingLevel,\n\t\t\ttools: [],\n\t\t\tmessages: existingMessages,\n\t\t},\n\t\tconvertToLlm: convertToLlmWithBlockImages,\n\t\tstreamFn: async (model, context, streamOptions) => {\n\t\t\tconst onProviderStreamEvent = streamOptions?.onProviderStreamEvent ?? handleProviderStreamEvent;\n\t\t\tconst prepare = async () => {\n\t\t\t\tconst authResult = await modelRuntime.getRequestAuth(model, {\n\t\t\t\t\tapiKey: streamOptions?.apiKey,\n\t\t\t\t\tenv: streamOptions?.env,\n\t\t\t\t\tsignal: streamOptions?.signal,\n\t\t\t\t});\n\t\t\t\tconst compatibility = authResult ? undefined : modelRuntime.getCompatibilityRequestConfig(model);\n\t\t\t\tif (!authResult && compatibility?.authHeader) {\n\t\t\t\t\tthrow new Error(`No API key found for \"${model.provider}\"`);\n\t\t\t\t}\n\t\t\t\tconst auth = {\n\t\t\t\t\tapiKey: authResult?.auth.apiKey,\n\t\t\t\t\theaders: authResult?.auth.headers ?? compatibility?.headers,\n\t\t\t\t\tbaseUrl: authResult?.auth.baseUrl,\n\t\t\t\t\tenv: authResult?.env,\n\t\t\t\t};\n\t\t\t\tconst requestModel =\n\t\t\t\t\tauth.baseUrl !== undefined && auth.baseUrl !== model.baseUrl\n\t\t\t\t\t\t? { ...model, baseUrl: auth.baseUrl }\n\t\t\t\t\t\t: model;\n\t\t\t\tconst providerRetrySettings = settingsManager.getProviderRetrySettings();\n\t\t\t\tconst httpIdleTimeoutMs = settingsManager.getHttpIdleTimeoutMs();\n\t\t\t\t// SDKs treat timeout=0 as 0ms (immediate timeout), not \"no timeout\".\n\t\t\t\t// Use max int32 to effectively disable the timeout.\n\t\t\t\tconst effectiveTimeoutMs = httpIdleTimeoutMs === 0 ? 2147483647 : httpIdleTimeoutMs;\n\t\t\t\tconst timeoutMs = streamOptions?.timeoutMs ?? providerRetrySettings.timeoutMs ?? effectiveTimeoutMs;\n\t\t\t\tconst websocketConnectTimeoutMs =\n\t\t\t\t\tstreamOptions?.websocketConnectTimeoutMs ?? settingsManager.getWebSocketConnectTimeoutMs();\n\t\t\t\tconst streamDeadlineMs = streamOptions?.streamDeadlineMs ?? settingsManager.getStreamDeadlineMs();\n\t\t\t\t// The OpenCode session header joins here, not in `ModelRuntimeStreaming`, so `before_provider_headers`\n\t\t\t\t// handlers see it and can change or remove it.\n\t\t\t\tconst requestHeaders = mergeHeaders(\n\t\t\t\t\tmergeHeaders(getOpenCodeSessionHeaders(requestModel, streamOptions?.sessionId), auth.headers),\n\t\t\t\t\tstreamOptions?.headers,\n\t\t\t\t);\n\t\t\t\tconst mergedHeaders = mergeHeaders(model.headers, requestHeaders);\n\t\t\t\tconst headerRunner = extensionRunnerRef.current;\n\t\t\t\tconst assembledHeaders = headerRunner?.hasHandlers(\"before_provider_headers\")\n\t\t\t\t\t? await headerRunner.emitBeforeProviderHeaders(mergedHeaders ?? {})\n\t\t\t\t\t: mergedHeaders;\n\t\t\t\tconst extensionProvider = modelRuntime.getRegisteredProviderConfig(requestModel.provider);\n\t\t\t\tconst usesExtensionStream =\n\t\t\t\t\textensionProvider?.streamSimple !== undefined && requestModel.api === extensionProvider.api;\n\t\t\t\tconst transportHeaders = usesExtensionStream\n\t\t\t\t\t? assembledHeaders\n\t\t\t\t\t: removeUnownedModelHeaders(assembledHeaders, model.headers, requestHeaders);\n\t\t\t\t// Fast-vs-normal is the selected model's own identity, so the canonical `-fast` model is what\n\t\t\t\t// dispatch, the recorded assistant message, session state, and usage all see. The provider\n\t\t\t\t// adapter reads `fastRoute.upstreamModelId` when it serializes the outbound request.\n\t\t\t\tconst fastRoute = getModelFastRoute(requestModel);\n\t\t\t\tif (fastRoute?.serviceTier !== undefined && !usesExtensionStream && !authResult) {\n\t\t\t\t\tthrow new Error(`No API key found for \"${model.provider}\"`);\n\t\t\t\t}\n\t\t\t\tconst env = auth.env || streamOptions?.env ? { ...auth.env, ...streamOptions?.env } : undefined;\n\t\t\t\tconst cacheRetentionEnv = getProviderEnvValue(\"PI_CACHE_RETENTION\", env);\n\t\t\t\t// Shared by main chat, workflow stages and subagents; provider capability gates still apply.\n\t\t\t\tconst cacheRetention =\n\t\t\t\t\tstreamOptions?.cacheRetention ??\n\t\t\t\t\t(cacheRetentionEnv === \"none\"\n\t\t\t\t\t\t? \"none\"\n\t\t\t\t\t\t: !cacheRetentionEnv\n\t\t\t\t\t\t\t? getDefaultCacheRetention(requestModel)\n\t\t\t\t\t\t\t: cacheRetentionEnv === \"long\"\n\t\t\t\t\t\t\t\t? \"long\"\n\t\t\t\t\t\t\t\t: \"short\");\n\t\t\t\tconst fastRouteStreamOptions = withFastRouteStreamOptions(fastRoute, {\n\t\t\t\t\t...streamOptions,\n\t\t\t\t\tapiKey: auth.apiKey,\n\t\t\t\t\tenv,\n\t\t\t\t\tcacheRetention,\n\t\t\t\t\ttimeoutMs,\n\t\t\t\t\twebsocketConnectTimeoutMs,\n\t\t\t\t\tstreamDeadlineMs,\n\t\t\t\t\t// Replaces the agent loop's default identity; read per request so telemetry changes apply at once.\n\t\t\t\t\tidentity: getClientIdentity(settingsManager),\n\t\t\t\t\tmaxRetries: streamOptions?.maxRetries ?? providerRetrySettings.maxRetries,\n\t\t\t\t\tmaxRetryDelayMs: streamOptions?.maxRetryDelayMs ?? providerRetrySettings.maxRetryDelayMs,\n\t\t\t\t\theaders: transportHeaders,\n\t\t\t\t});\n\t\t\t\tconst nativeFastRoute =\n\t\t\t\t\tfastRoute?.serviceTier !== undefined && !usesExtensionStream && extensionProvider?.aliasOf === undefined;\n\t\t\t\tconst requestOptions: ModelRuntimeSimpleStreamOptions = {\n\t\t\t\t\t...fastRouteStreamOptions,\n\t\t\t\t\tonProviderStreamEvent,\n\t\t\t\t\tpreparedRequestAuth: {\n\t\t\t\t\t\tresolution: authResult,\n\t\t\t\t\t\treprepare: async () => {\n\t\t\t\t\t\t\tconst next = await prepare();\n\t\t\t\t\t\t\treturn { model: next.requestModel, options: next.requestOptions };\n\t\t\t\t\t\t},\n\t\t\t\t\t\tstreamSimple: nativeFastRoute\n\t\t\t\t\t\t\t? (routeModel, routeContext, routeOptions) =>\n\t\t\t\t\t\t\t\t\tstreamWithFastRoute(routeModel, routeContext, routeOptions)\n\t\t\t\t\t\t\t: undefined,\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t\treturn { authResult, requestModel, fastRouteStreamOptions, requestOptions };\n\t\t\t};\n\t\t\tconst { authResult, requestModel, fastRouteStreamOptions, requestOptions } = await prepare();\n\t\t\tif (streamOptions?.sessionId === sessionManager.getSessionId()) {\n\t\t\t\tconst prefix = [...agent.state.messages];\n\t\t\t\tconst warmOptions: ModelRuntimeSimpleStreamOptions = {\n\t\t\t\t\t...fastRouteStreamOptions,\n\t\t\t\t\tpreparedRequestAuth: {\n\t\t\t\t\t\tresolution: authResult,\n\t\t\t\t\t\treprepare: requestOptions.preparedRequestAuth?.reprepare,\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t\tcacheWarmer.start({ model: requestModel, context, options: warmOptions }, () => {\n\t\t\t\t\tconst current = agent.state.model;\n\t\t\t\t\treturn (\n\t\t\t\t\t\t!sessionLifetime(session).aborted &&\n\t\t\t\t\t\t!sessionGenerationClosing.has(session) &&\n\t\t\t\t\t\t!(session as unknown as AgentSessionInternalSurface)._agentRunAbortRequested &&\n\t\t\t\t\t\tcurrent?.provider === model.provider &&\n\t\t\t\t\t\tcurrent.id === model.id &&\n\t\t\t\t\t\tprefix.every((message, index) => agent.state.messages[index] === message)\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t\t}\n\t\t\t// The Codex routing identity is attached by ModelRuntimeStreaming, after auth headers are\n\t\t\t// merged. Applying it here would be inert: `mergeHeaders` copies the header object the\n\t\t\t// wrapper mutates.\n\t\t\treturn modelRuntime.streamSimple(requestModel, context, requestOptions);\n\t\t},\n\t\tonPayload: async (payload, model) => {\n\t\t\tconst sourceMessages = lastConvertedLlmMessages;\n\t\t\tconst replayGuardedPayload = sourceMessages\n\t\t\t\t? restoreAnthropicReplayThinkingBlocks(payload, sourceMessages, model)\n\t\t\t\t: payload;\n\t\t\tconst runner = extensionRunnerRef.current;\n\t\t\tlet finalPayload: unknown;\n\t\t\tif (!runner?.hasHandlers(\"before_provider_request\")) {\n\t\t\t\tfinalPayload = replayGuardedPayload;\n\t\t\t} else {\n\t\t\t\tconst extensionPayload = await runner.emitBeforeProviderRequest(replayGuardedPayload);\n\t\t\t\tfinalPayload = sourceMessages\n\t\t\t\t\t? restoreAnthropicReplayThinkingBlocks(extensionPayload, sourceMessages, model)\n\t\t\t\t\t: extensionPayload;\n\t\t\t}\n\t\t\tconst sanitizedPayload = sanitizeOpenAIResponsesPayload(finalPayload, model);\n\t\t\tmarkLifecycleTiming(\"before-provider-request\");\n\t\t\treturn sanitizedPayload;\n\t\t},\n\t\tonResponse: async (response, _model) => {\n\t\t\tconst runner = extensionRunnerRef.current;\n\t\t\tif (!runner?.hasHandlers(\"after_provider_response\")) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tawait runner.emit({\n\t\t\t\ttype: \"after_provider_response\",\n\t\t\t\tstatus: response.status,\n\t\t\t\theaders: response.headers,\n\t\t\t});\n\t\t},\n\t\tsessionId: sessionManager.getSessionId(),\n\t\ttransformContext: async (messages) => {\n\t\t\tconst runner = extensionRunnerRef.current;\n\t\t\tconst transformed = runner ? await runner.emitContext(messages) : messages;\n\t\t\treturn scrubPreCompactionAssistantUsage(transformed, sessionManager.getBranch());\n\t\t},\n\t\tsteeringMode: settingsManager.getSteeringMode(),\n\t\tfollowUpMode: settingsManager.getFollowUpMode(),\n\t\ttransport: settingsManager.getTransport(),\n\t\tthinkingBudgets: settingsManager.getThinkingBudgets(),\n\t\tmaxRetryDelayMs: settingsManager.getProviderRetrySettings().maxRetryDelayMs,\n\t});\n\n\t// The isolated host mirrors child-owned storage without writing startup metadata.\n\tif (persistInitialState) {\n\t\tif (hasExistingSession) {\n\t\t\tif (!hasThinkingEntry) {\n\t\t\t\tawait sessionManager.appendThinkingLevelChange(thinkingLevel);\n\t\t\t}\n\t\t} else {\n\t\t\tif (model) {\n\t\t\t\tawait sessionManager.appendModelChange(model.provider, model.id);\n\t\t\t}\n\t\t\tawait sessionManager.appendThinkingLevelChange(thinkingLevel);\n\t\t}\n\t}\n\n\tconst providerRollback = modelRuntime.createExtensionProviderTransaction();\n\tlet session: AgentSession;\n\tconst childCommandTaskOwner = createChildCommandTaskOwner(() => session.getAgentTaskHost());\n\ttry {\n\t\tsession = new AgentSession({\n\t\t\tagent,\n\t\t\tsessionManager,\n\t\t\tsettingsManager,\n\t\t\tcwd,\n\t\t\tworkflowJournal: options.journal,\n\t\t\tstorageAgentDir: agentDir,\n\t\t\tchildSessionOptions: (child) =>\n\t\t\t\tinheritChildSessionOptions(\n\t\t\t\t\t{\n\t\t\t\t\t\tcwd,\n\t\t\t\t\t\tagentDir,\n\t\t\t\t\t\tmodelRuntime,\n\t\t\t\t\t\tsettingsManager,\n\t\t\t\t\t\tmodel: session.model,\n\t\t\t\t\t\tthinkingLevel: session.thinkingLevel,\n\t\t\t\t\t\tfallbackModels: options.fallbackModels ?? settingsManager.getFallbackModels(),\n\t\t\t\t\t\tisFallbackModelAllowed: options.isFallbackModelAllowed,\n\t\t\t\t\t\tbuiltins: childBuiltins,\n\t\t\t\t\t\ttools: allowedToolNames,\n\t\t\t\t\t\tnoTools: options.noTools,\n\t\t\t\t\t\texcludedTools: childExcludedTools,\n\t\t\t\t\t\tcustomTools: options.customTools,\n\t\t\t\t\t\textensionBindings: session.extensionRunner.getChildHostBindings(),\n\t\t\t\t\t\tparentCommandTaskOwner: childCommandTaskOwner,\n\t\t\t\t\t},\n\t\t\t\t\tchild,\n\t\t\t\t\tsession.getAllTools().map((tool) => tool.name),\n\t\t\t\t),\n\t\t\tscopedModels: options.scopedModels,\n\t\t\tfallbackModels: options.fallbackModels ?? settingsManager.getFallbackModels(),\n\t\t\tisFallbackModelAllowed: options.isFallbackModelAllowed,\n\t\t\tresourceLoader,\n\t\t\tcustomTools: options.customTools,\n\t\t\tmodelRuntime,\n\t\t\tcacheWarmer,\n\t\t\tinitialActiveToolNames,\n\t\t\tusesDefaultTools: (options.tools === undefined || toolModifiers !== undefined) && !options.noTools,\n\t\t\tdefaultToolModifiers: toolModifiers,\n\t\t\tallowedToolNames,\n\t\t\texcludedToolNames: options.excludedTools,\n\t\t\textensionRunnerRef,\n\t\t\tsessionStartEvent: options.sessionStartEvent,\n\t\t\torchestrationContext: options.orchestrationContext,\n\t\t\tsubagentPolicy,\n\t\t\tparentCommandTaskOwner: options.parentCommandTaskOwner,\n\t\t\tsystemPromptTransform: options.systemPromptTransform,\n\t\t\tcontextProjectionTransform: options.initialContextTransform,\n\t\t});\n\t} catch (error) {\n\t\t// The constructor releases its own leases/subscriptions; restore borrowed provider state here.\n\t\tconst cleanup = await Promise.allSettled([providerRollback.commit(), settingsManager.flush()]);\n\t\tconst failures = cleanup.flatMap((result) => (result.status === \"rejected\" ? [result.reason] : []));\n\t\tif (failures.length)\n\t\t\tthrow new AggregateError([error, ...failures], \"Session construction failed and rollback reported errors\");\n\t\tthrow error;\n\t}\n\t// Only the selected factories transfer. Discovery may have acquired omitted factories.\n\tconst acquisitions = factoryAcquisitions.getStore();\n\tconst selected = resourceLoader.getExtensions();\n\tfor (const extension of selected.extensions) acquisitions?.pending?.delete(extension);\n\tif (!options.settingsManager) ownedSettingsManagers.set(settingsManager, session);\n\tconst rollbackReason = sessionLifecycleCreation.getStore()?.replacement ? \"new\" : \"quit\";\n\tregisterStartupRollback(session.extensionRunner, async (error) => {\n\t\tconst results = await Promise.allSettled([\n\t\t\t(session as unknown as AgentSessionInternalSurface)._close({\n\t\t\t\ttype: \"session_shutdown\",\n\t\t\t\treason: rollbackReason,\n\t\t\t}),\n\t\t\tproviderRollback.commit(),\n\t\t]);\n\t\tconst cleanupErrors = results.flatMap((result) => (result.status === \"rejected\" ? [result.reason] : []));\n\t\tif (cleanupErrors.length) {\n\t\t\tconst errors = [error, ...cleanupErrors];\n\t\t\tthrow new AggregateError(\n\t\t\t\terrors,\n\t\t\t\tstartupCleanupFailureMessage(\"Extension startup failed and rollback reported errors\", errors),\n\t\t\t);\n\t\t}\n\t\tthrow error;\n\t});\n\tif (acquisition.store) {\n\t\townedSessionStores.set(session, acquisition.store);\n\t\tacquisition.store = undefined;\n\t}\n\ttry {\n\t\t// Omitted factories may share the selected runtime: release their acquisitions,\n\t\t// but leave that runtime and its selected subscriptions owned by the runner.\n\t\tconst failures = await rollbackFactoryAcquisitions(new Set([selected.runtime]));\n\t\tif (failures.length)\n\t\t\tthrow Object.assign(new AggregateError(failures, \"Unselected extension cleanup failed\"), {\n\t\t\t\tcode: \"ShutdownFailed\",\n\t\t\t});\n\t\tconst extensionsResult = resourceLoader.getExtensions();\n\t\tfor (const failure of extensionsResult.errors) {\n\t\t\tconst builtin = getBuiltinPackageLocations().find(({ packageDir }) => {\n\t\t\t\tconst path = relative(packageDir, failure.path);\n\t\t\t\treturn path !== \"..\" && !path.startsWith(`..${sep}`) && !path.startsWith(sep);\n\t\t\t});\n\t\t\tif (builtin)\n\t\t\t\tthrow Object.assign(new Error(`Builtin unavailable: ${builtin.packageName}: ${failure.error}`), {\n\t\t\t\t\tcode: \"BuiltinUnavailable\",\n\t\t\t\t});\n\t\t}\n\t\tif (!deferStart) await session.bindExtensions(options.extensionBindings ?? {});\n\t\treturn { session, extensionsResult, modelFallbackMessage, modelFallbackReason };\n\t} catch (error) {\n\t\treturn rollbackStartup(session.extensionRunner, error instanceof Error ? error : new Error(String(error)));\n\t}\n}\n"]}
|
|
@@ -8,12 +8,23 @@ export declare const SESSION_TABLES: Readonly<{
|
|
|
8
8
|
entries: "entries";
|
|
9
9
|
searchTexts: "search_texts";
|
|
10
10
|
}>;
|
|
11
|
+
/** Rows whose search text is read per query; well under SQLite's bound-parameter limit. */
|
|
12
|
+
export declare const LISTING_FETCH_BATCH = 500;
|
|
11
13
|
export declare class SqlSessionStore implements SessionStore {
|
|
12
14
|
private readonly database;
|
|
13
15
|
private readonly tables;
|
|
14
16
|
private readonly prefix;
|
|
15
17
|
private closed;
|
|
16
18
|
private readonly cwdMatcher?;
|
|
19
|
+
/** Session ids of each recently listed scope, valid while the store's change token is unchanged. */
|
|
20
|
+
private readonly scopes;
|
|
21
|
+
/** Listed summaries of sessions that still exist at the cached version; never more than the store holds. */
|
|
22
|
+
private readonly summaries;
|
|
23
|
+
/**
|
|
24
|
+
* Settles when the latest listing has read and updated the caches. Listings take turns, so one listing's
|
|
25
|
+
* pruning never drops summaries that another has fetched but not yet recorded under its scope.
|
|
26
|
+
*/
|
|
27
|
+
private listing;
|
|
17
28
|
private constructor();
|
|
18
29
|
static open(database: SqliteDatabase, options?: {
|
|
19
30
|
readonly prefix?: string;
|
|
@@ -32,12 +43,36 @@ export declare class SqlSessionStore implements SessionStore {
|
|
|
32
43
|
load(sessionId: string): Promise<SessionSnapshot>;
|
|
33
44
|
readHeader(sessionId: string): Promise<SessionRecordHeader | undefined>;
|
|
34
45
|
delete(sessionId: string): Promise<void>;
|
|
46
|
+
/**
|
|
47
|
+
* Lists from a per-scope cache revalidated on every call. A cheap change token, which moves on any commit
|
|
48
|
+
* from this or another connection, decides whether the scope is re-read. A scope listed for the first time
|
|
49
|
+
* is read exactly as an uncached listing; afterwards only its light columns are re-read and search text is
|
|
50
|
+
* read only for sessions whose stored listing columns changed. Listings of the same store take turns
|
|
51
|
+
* reading and updating the caches; the yielding below runs outside that turn.
|
|
52
|
+
*/
|
|
35
53
|
list(query: SessionListQuery): AsyncIterable<SessionSummary>;
|
|
54
|
+
/** Revalidates one scope's cache and resolves its summaries; called for one listing at a time. */
|
|
55
|
+
private listScope;
|
|
36
56
|
findMostRecent(query: {
|
|
37
57
|
readonly cwd: string;
|
|
38
58
|
readonly includeInternal?: boolean;
|
|
39
59
|
}): Promise<SessionSummary | undefined>;
|
|
40
60
|
close(): Promise<void>;
|
|
61
|
+
/**
|
|
62
|
+
* `data_version` moves when another connection commits and `total_changes()` when this one writes, so
|
|
63
|
+
* together they cover writers in every process; the table aggregates also catch a change to the sessions
|
|
64
|
+
* table if the adapter does not serve every statement from one connection.
|
|
65
|
+
*/
|
|
66
|
+
private changeToken;
|
|
67
|
+
/** The scope's session ids in store order, with a current summary cached for each. */
|
|
68
|
+
private readScope;
|
|
69
|
+
/** Reads full listing rows, search text included, and caches their summaries. */
|
|
70
|
+
private readSummaries;
|
|
71
|
+
/**
|
|
72
|
+
* Keeps only summaries some cached scope still lists, so memory follows the live sessions. Runs in a
|
|
73
|
+
* listing's turn after it records its scope, when no other listing holds summaries it has not recorded.
|
|
74
|
+
*/
|
|
75
|
+
private pruneSummaries;
|
|
41
76
|
private assertOpen;
|
|
42
77
|
private assertListing;
|
|
43
78
|
private read;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sql-session-store.d.ts","sourceRoot":"","sources":["../../../../src/core/storage/session/sql-session-store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AACnE,OAAO,KAAK,EAAE,cAAc,
|
|
1
|
+
{"version":3,"file":"sql-session-store.d.ts","sourceRoot":"","sources":["../../../../src/core/storage/session/sql-session-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -11,12 +11,50 @@ export const SESSION_TABLES = Object.freeze({
|
|
|
11
11
|
entries: "entries",
|
|
12
12
|
searchTexts: "search_texts",
|
|
13
13
|
});
|
|
14
|
+
/** Every listing column except search text, so an unchanged row keeps its cached summary. */
|
|
15
|
+
const LISTING_COLUMNS = "id, cwd, internal, header_json, last_seq, modified_at, message_count, first_message, name, has_name, summary, summarized_through_id, revision";
|
|
16
|
+
/** Rows whose search text is read per query; well under SQLite's bound-parameter limit. */
|
|
17
|
+
export const LISTING_FETCH_BATCH = 500;
|
|
18
|
+
/** Listing scopes (visibility and project) kept at once; the picker uses two. */
|
|
19
|
+
const LISTING_SCOPES = 8;
|
|
20
|
+
function summaryFromRow(row) {
|
|
21
|
+
const header = JSON.parse(row.header_json);
|
|
22
|
+
return {
|
|
23
|
+
id: header.id,
|
|
24
|
+
cwd: header.cwd,
|
|
25
|
+
...(header.parentSessionId !== undefined ? { parentSessionId: header.parentSessionId } : {}),
|
|
26
|
+
internal: header.internal === true,
|
|
27
|
+
...(header.workflow !== undefined ? { workflow: header.workflow } : {}),
|
|
28
|
+
...(row.name !== null ? { name: JSON.parse(row.name) } : {}),
|
|
29
|
+
hasName: row.has_name === 1,
|
|
30
|
+
createdAt: header.createdAt,
|
|
31
|
+
modifiedAt: row.modified_at,
|
|
32
|
+
messageCount: row.message_count,
|
|
33
|
+
firstMessage: JSON.parse(row.first_message),
|
|
34
|
+
...(row.summary !== null ? { summary: JSON.parse(row.summary) } : {}),
|
|
35
|
+
...(row.summarized_through_id !== null ? { summarizedThroughId: row.summarized_through_id } : {}),
|
|
36
|
+
searchText: JSON.parse(row.search_texts_json).join(" "),
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
/** Changes on every write: `revision` catches a rewrite that leaves every other listed column as it was. */
|
|
40
|
+
function listingVersion(row) {
|
|
41
|
+
return `${row.revision}\u0000${row.last_seq}\u0000${row.modified_at}\u0000${row.message_count}\u0000${row.has_name}\u0000${row.name}\u0000${row.summarized_through_id}\u0000${row.summary}\u0000${row.first_message}\u0000${row.header_json}`;
|
|
42
|
+
}
|
|
14
43
|
export class SqlSessionStore {
|
|
15
44
|
database;
|
|
16
45
|
tables;
|
|
17
46
|
prefix;
|
|
18
47
|
closed = false;
|
|
19
48
|
cwdMatcher;
|
|
49
|
+
/** Session ids of each recently listed scope, valid while the store's change token is unchanged. */
|
|
50
|
+
scopes = new Map();
|
|
51
|
+
/** Listed summaries of sessions that still exist at the cached version; never more than the store holds. */
|
|
52
|
+
summaries = new Map();
|
|
53
|
+
/**
|
|
54
|
+
* Settles when the latest listing has read and updated the caches. Listings take turns, so one listing's
|
|
55
|
+
* pruning never drops summaries that another has fetched but not yet recorded under its scope.
|
|
56
|
+
*/
|
|
57
|
+
listing = Promise.resolve();
|
|
20
58
|
constructor(database, tables, prefix = "", cwdMatcher) {
|
|
21
59
|
this.database = database;
|
|
22
60
|
this.tables = tables;
|
|
@@ -42,7 +80,7 @@ export class SqlSessionStore {
|
|
|
42
80
|
first_message TEXT NOT NULL CHECK(json_valid(first_message)),
|
|
43
81
|
name TEXT CHECK(name IS NULL OR json_valid(name)), has_name INTEGER NOT NULL,
|
|
44
82
|
summary TEXT CHECK(summary IS NULL OR json_valid(summary)), summarized_through_id TEXT,
|
|
45
|
-
summary_state TEXT NOT NULL CHECK(json_valid(summary_state))
|
|
83
|
+
summary_state TEXT NOT NULL CHECK(json_valid(summary_state)), revision TEXT NOT NULL DEFAULT ''
|
|
46
84
|
) STRICT;
|
|
47
85
|
CREATE TABLE IF NOT EXISTS ${tables.entries} (
|
|
48
86
|
session_id TEXT NOT NULL, seq INTEGER NOT NULL, entry_id TEXT NOT NULL,
|
|
@@ -53,6 +91,11 @@ export class SqlSessionStore {
|
|
|
53
91
|
text_json TEXT NOT NULL CHECK(json_valid(text_json)), PRIMARY KEY(session_id, seq)
|
|
54
92
|
) STRICT;
|
|
55
93
|
`);
|
|
94
|
+
// Sessions tables created before the write revision gain it; their rows pick one up on the next write.
|
|
95
|
+
const revision = await tx.get("SELECT name FROM pragma_table_info(?) WHERE name = 'revision'", tables.sessions);
|
|
96
|
+
if (!revision) {
|
|
97
|
+
await tx.exec(`ALTER TABLE ${tables.sessions} ADD COLUMN revision TEXT NOT NULL DEFAULT ''`);
|
|
98
|
+
}
|
|
56
99
|
});
|
|
57
100
|
return new SqlSessionStore(database, tables, options.prefix, options.cwdMatcher);
|
|
58
101
|
}
|
|
@@ -120,53 +163,52 @@ export class SqlSessionStore {
|
|
|
120
163
|
await tx.run(`DELETE FROM ${this.tables.sessions} WHERE id = ?`, sessionId);
|
|
121
164
|
});
|
|
122
165
|
}
|
|
166
|
+
/**
|
|
167
|
+
* Lists from a per-scope cache revalidated on every call. A cheap change token, which moves on any commit
|
|
168
|
+
* from this or another connection, decides whether the scope is re-read. A scope listed for the first time
|
|
169
|
+
* is read exactly as an uncached listing; afterwards only its light columns are re-read and search text is
|
|
170
|
+
* read only for sessions whose stored listing columns changed. Listings of the same store take turns
|
|
171
|
+
* reading and updating the caches; the yielding below runs outside that turn.
|
|
172
|
+
*/
|
|
123
173
|
async *list(query) {
|
|
124
174
|
this.assertListing(query);
|
|
125
175
|
// Validate the original query before binding only matching stored spellings below.
|
|
126
176
|
if (query.cwd?.includes("\0"))
|
|
127
177
|
throw new StorageInvalidTextError(0);
|
|
128
|
-
const
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
const projects = await this.database.all(`SELECT DISTINCT cwd FROM ${this.tables.sessions}`);
|
|
134
|
-
projectCwds = projects.map((project) => project.cwd).filter(matchesCwd);
|
|
178
|
+
const listed = this.listing.then(() => this.listScope(query));
|
|
179
|
+
this.listing = listed.then(() => { }, () => { });
|
|
180
|
+
// Resolve before yielding so a concurrent listing cannot change what this one returns.
|
|
181
|
+
const summaries = await listed;
|
|
182
|
+
for (const summary of summaries) {
|
|
135
183
|
this.assertListing(query);
|
|
136
|
-
|
|
137
|
-
return;
|
|
138
|
-
}
|
|
139
|
-
const projectFilter = projectCwds ? ` AND cwd IN (${projectCwds.map(() => "?").join(", ")})` : "";
|
|
140
|
-
// Combine encoded strings only at read time, preserving NUL and lone surrogates verbatim.
|
|
141
|
-
const rows = await this.database.all(`SELECT s.*, (
|
|
142
|
-
SELECT COALESCE('[' || group_concat(text_json, ',') || ']', '[]')
|
|
143
|
-
FROM (SELECT text_json FROM ${this.tables.searchTexts} WHERE session_id = s.id ORDER BY seq)
|
|
144
|
-
) AS search_texts_json
|
|
145
|
-
FROM ${this.tables.sessions} AS s WHERE (? = 1 OR internal = 0)${projectFilter}`, query.includeInternal ? 1 : 0, ...(projectCwds ?? []));
|
|
146
|
-
for (const row of rows) {
|
|
147
|
-
this.assertListing(query);
|
|
148
|
-
const header = JSON.parse(row.header_json);
|
|
149
|
-
if (matchesCwd && !matchesCwd(header.cwd))
|
|
150
|
-
continue;
|
|
151
|
-
yield {
|
|
152
|
-
id: header.id,
|
|
153
|
-
cwd: header.cwd,
|
|
154
|
-
...(header.parentSessionId !== undefined ? { parentSessionId: header.parentSessionId } : {}),
|
|
155
|
-
internal: header.internal === true,
|
|
156
|
-
...(header.workflow !== undefined ? { workflow: header.workflow } : {}),
|
|
157
|
-
...(row.name !== null ? { name: JSON.parse(row.name) } : {}),
|
|
158
|
-
hasName: row.has_name === 1,
|
|
159
|
-
createdAt: header.createdAt,
|
|
160
|
-
modifiedAt: row.modified_at,
|
|
161
|
-
messageCount: row.message_count,
|
|
162
|
-
firstMessage: JSON.parse(row.first_message),
|
|
163
|
-
...(row.summary !== null ? { summary: JSON.parse(row.summary) } : {}),
|
|
164
|
-
...(row.summarized_through_id !== null ? { summarizedThroughId: row.summarized_through_id } : {}),
|
|
165
|
-
searchText: JSON.parse(row.search_texts_json).join(" "),
|
|
166
|
-
};
|
|
184
|
+
yield summary;
|
|
167
185
|
}
|
|
168
186
|
this.assertListing(query);
|
|
169
187
|
}
|
|
188
|
+
/** Revalidates one scope's cache and resolves its summaries; called for one listing at a time. */
|
|
189
|
+
async listScope(query) {
|
|
190
|
+
// The store may have closed, or the caller given up, while an earlier listing held the turn.
|
|
191
|
+
this.assertListing(query);
|
|
192
|
+
// Read the token first: a commit racing the reads below moves it again before the next call.
|
|
193
|
+
const token = await this.changeToken();
|
|
194
|
+
const key = JSON.stringify([query.includeInternal === true, query.cwd ?? null]);
|
|
195
|
+
const cached = this.scopes.get(key);
|
|
196
|
+
// A cached id without a summary is never expected; re-reading the scope repairs it instead of dropping it.
|
|
197
|
+
const scope = cached?.token === token && cached.ids.every((id) => this.summaries.has(id))
|
|
198
|
+
? cached
|
|
199
|
+
: { token, ids: await this.readScope(query, cached !== undefined) };
|
|
200
|
+
// Map order is recency order: re-inserting marks the scope as used, and the oldest scope is evicted first.
|
|
201
|
+
this.scopes.delete(key);
|
|
202
|
+
this.scopes.set(key, scope);
|
|
203
|
+
for (const oldest of this.scopes.keys()) {
|
|
204
|
+
if (this.scopes.size <= LISTING_SCOPES)
|
|
205
|
+
break;
|
|
206
|
+
this.scopes.delete(oldest);
|
|
207
|
+
}
|
|
208
|
+
if (scope !== cached)
|
|
209
|
+
this.pruneSummaries();
|
|
210
|
+
return scope.ids.flatMap((id) => this.summaries.get(id)?.summary ?? []);
|
|
211
|
+
}
|
|
170
212
|
async findMostRecent(query) {
|
|
171
213
|
let latest;
|
|
172
214
|
for await (const summary of this.list(query)) {
|
|
@@ -178,6 +220,80 @@ export class SqlSessionStore {
|
|
|
178
220
|
async close() {
|
|
179
221
|
this.assertOpen();
|
|
180
222
|
this.closed = true;
|
|
223
|
+
this.scopes.clear();
|
|
224
|
+
this.summaries.clear();
|
|
225
|
+
}
|
|
226
|
+
/**
|
|
227
|
+
* `data_version` moves when another connection commits and `total_changes()` when this one writes, so
|
|
228
|
+
* together they cover writers in every process; the table aggregates also catch a change to the sessions
|
|
229
|
+
* table if the adapter does not serve every statement from one connection.
|
|
230
|
+
*/
|
|
231
|
+
async changeToken() {
|
|
232
|
+
const row = await this.database.get(`SELECT data_version, total_changes() AS changes,
|
|
233
|
+
(SELECT count(*) FROM ${this.tables.sessions}) AS sessions,
|
|
234
|
+
(SELECT max(rowid) FROM ${this.tables.sessions}) AS last_row
|
|
235
|
+
FROM pragma_data_version`);
|
|
236
|
+
return JSON.stringify(Object.values(row ?? {}).map(String));
|
|
237
|
+
}
|
|
238
|
+
/** The scope's session ids in store order, with a current summary cached for each. */
|
|
239
|
+
async readScope(query, listedBefore) {
|
|
240
|
+
const matchesCwd = query.cwd === undefined
|
|
241
|
+
? undefined
|
|
242
|
+
: (this.cwdMatcher?.(query.cwd) ?? ((candidate) => candidate === query.cwd));
|
|
243
|
+
let projectCwds;
|
|
244
|
+
if (matchesCwd) {
|
|
245
|
+
const projects = await this.database.all(`SELECT DISTINCT cwd FROM ${this.tables.sessions}`);
|
|
246
|
+
projectCwds = projects.map((project) => project.cwd).filter(matchesCwd);
|
|
247
|
+
this.assertListing(query);
|
|
248
|
+
if (projectCwds.length === 0)
|
|
249
|
+
return [];
|
|
250
|
+
}
|
|
251
|
+
const scope = `(? = 1 OR internal = 0)${projectCwds ? ` AND cwd IN (${projectCwds.map(() => "?").join(", ")})` : ""}`;
|
|
252
|
+
const params = [query.includeInternal ? 1 : 0, ...(projectCwds ?? [])];
|
|
253
|
+
const inScope = (row) => !matchesCwd || matchesCwd(row.cwd);
|
|
254
|
+
if (listedBefore) {
|
|
255
|
+
const rows = (await this.database.all(`SELECT ${LISTING_COLUMNS} FROM ${this.tables.sessions} WHERE ${scope}`, ...params)).filter(inScope);
|
|
256
|
+
this.assertListing(query);
|
|
257
|
+
const stale = rows.filter((row) => this.summaries.get(row.id)?.version !== listingVersion(row));
|
|
258
|
+
// A few changed sessions are read by id; when most changed, one scan of the scope is cheaper.
|
|
259
|
+
if (stale.length <= rows.length / 4) {
|
|
260
|
+
for (let start = 0; start < stale.length; start += LISTING_FETCH_BATCH) {
|
|
261
|
+
const ids = stale.slice(start, start + LISTING_FETCH_BATCH).map((row) => row.id);
|
|
262
|
+
const fetched = new Set((await this.readSummaries(`id IN (${ids.map(() => "?").join(", ")})`, ids)).map((row) => row.id));
|
|
263
|
+
// A session deleted after the light read must not be listed from an older cached copy.
|
|
264
|
+
for (const id of ids)
|
|
265
|
+
if (!fetched.has(id))
|
|
266
|
+
this.summaries.delete(id);
|
|
267
|
+
this.assertListing(query);
|
|
268
|
+
}
|
|
269
|
+
return rows.flatMap((row) => (this.summaries.has(row.id) ? [row.id] : []));
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
const rows = (await this.readSummaries(scope, params)).filter(inScope);
|
|
273
|
+
this.assertListing(query);
|
|
274
|
+
return rows.map((row) => row.id);
|
|
275
|
+
}
|
|
276
|
+
/** Reads full listing rows, search text included, and caches their summaries. */
|
|
277
|
+
async readSummaries(where, params) {
|
|
278
|
+
// Combine encoded strings only at read time, preserving NUL and lone surrogates verbatim.
|
|
279
|
+
const rows = await this.database.all(`SELECT ${LISTING_COLUMNS}, (
|
|
280
|
+
SELECT COALESCE('[' || group_concat(text_json, ',') || ']', '[]')
|
|
281
|
+
FROM (SELECT text_json FROM ${this.tables.searchTexts} WHERE session_id = s.id ORDER BY seq)
|
|
282
|
+
) AS search_texts_json
|
|
283
|
+
FROM ${this.tables.sessions} AS s WHERE ${where}`, ...params);
|
|
284
|
+
for (const row of rows)
|
|
285
|
+
this.summaries.set(row.id, { version: listingVersion(row), summary: summaryFromRow(row) });
|
|
286
|
+
return rows;
|
|
287
|
+
}
|
|
288
|
+
/**
|
|
289
|
+
* Keeps only summaries some cached scope still lists, so memory follows the live sessions. Runs in a
|
|
290
|
+
* listing's turn after it records its scope, when no other listing holds summaries it has not recorded.
|
|
291
|
+
*/
|
|
292
|
+
pruneSummaries() {
|
|
293
|
+
const listed = new Set([...this.scopes.values()].flatMap((scope) => scope.ids));
|
|
294
|
+
for (const id of this.summaries.keys())
|
|
295
|
+
if (!listed.has(id))
|
|
296
|
+
this.summaries.delete(id);
|
|
181
297
|
}
|
|
182
298
|
assertOpen() {
|
|
183
299
|
if (this.closed)
|
|
@@ -215,15 +331,15 @@ export class SqlSessionStore {
|
|
|
215
331
|
const summary = materializeSessionSummaryMetadata(header, state);
|
|
216
332
|
await tx.run(`INSERT INTO ${this.tables.sessions}
|
|
217
333
|
(id, cwd, created_at, header_json, internal, last_seq, modified_at, message_count,
|
|
218
|
-
first_message, name, has_name, summary, summarized_through_id, summary_state)
|
|
219
|
-
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?,
|
|
334
|
+
first_message, name, has_name, summary, summarized_through_id, summary_state, revision)
|
|
335
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, lower(hex(randomblob(16))))
|
|
220
336
|
ON CONFLICT(id) DO UPDATE SET
|
|
221
337
|
cwd = excluded.cwd, created_at = excluded.created_at, header_json = excluded.header_json,
|
|
222
338
|
internal = excluded.internal, last_seq = excluded.last_seq, modified_at = excluded.modified_at,
|
|
223
339
|
message_count = excluded.message_count, first_message = excluded.first_message, name = excluded.name,
|
|
224
340
|
has_name = excluded.has_name, summary = excluded.summary,
|
|
225
341
|
summarized_through_id = excluded.summarized_through_id,
|
|
226
|
-
summary_state = excluded.summary_state`, sessionId, header.cwd, header.createdAt, this.encode(header), header.internal ? 1 : 0, lastSeq, summary.modifiedAt, summary.messageCount, this.encode(summary.firstMessage), summary.name === undefined ? null : this.encode(summary.name), summary.hasName ? 1 : 0, summary.summary === undefined ? null : this.encode(summary.summary), summary.summarizedThroughId ?? null, this.encode(state));
|
|
342
|
+
summary_state = excluded.summary_state, revision = excluded.revision`, sessionId, header.cwd, header.createdAt, this.encode(header), header.internal ? 1 : 0, lastSeq, summary.modifiedAt, summary.messageCount, this.encode(summary.firstMessage), summary.name === undefined ? null : this.encode(summary.name), summary.hasName ? 1 : 0, summary.summary === undefined ? null : this.encode(summary.summary), summary.summarizedThroughId ?? null, this.encode(state));
|
|
227
343
|
return texts;
|
|
228
344
|
}
|
|
229
345
|
async insertEntries(tx, sessionId, entries, lastSeq, texts) {
|