@ai-agent-forge/agent-forge 0.86.6 → 0.87.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +19 -1
- package/README.md +8 -9
- package/dist/artifacts/artifact-store.d.ts.map +1 -1
- package/dist/artifacts/artifact-store.js +9 -5
- package/dist/artifacts/artifact-store.js.map +1 -1
- package/dist/bundle/.build-manifest.json +410 -371
- package/dist/bundle/chunks/{chunk-A7GUOX2H.js → chunk-6ZKDNZHA.js} +5 -1
- package/dist/bundle/chunks/chunk-BFC2BDVJ.js +13 -0
- package/dist/bundle/chunks/chunk-MOHOLL3F.js +1456 -0
- package/dist/bundle/chunks/image-resize-worker.js +12 -1
- package/dist/bundle/chunks/{virtual-modules-3IZ4MYSQ.js → virtual-modules-KZ5DRH7Q.js} +1 -1
- package/dist/bundle/cli.js +1 -1
- package/dist/bundle/client.js +1 -1
- package/dist/bundle/index.js +2 -2
- package/dist/bundle/rpc-entry.js +1 -1
- package/dist/cli/args.d.ts.map +1 -1
- package/dist/cli/args.js +231 -185
- package/dist/cli/args.js.map +1 -1
- package/dist/cli/auth-check.d.ts.map +1 -1
- package/dist/cli/auth-check.js +3 -2
- package/dist/cli/auth-check.js.map +1 -1
- package/dist/cli/auth-command.d.ts.map +1 -1
- package/dist/cli/auth-command.js +15 -9
- package/dist/cli/auth-command.js.map +1 -1
- package/dist/cli/credential-print.d.ts.map +1 -1
- package/dist/cli/credential-print.js +14 -7
- package/dist/cli/credential-print.js.map +1 -1
- package/dist/cli/experimental/command.d.ts.map +1 -1
- package/dist/cli/experimental/command.js +6 -5
- package/dist/cli/experimental/command.js.map +1 -1
- package/dist/cli/list-models.d.ts.map +1 -1
- package/dist/cli/list-models.js +9 -8
- package/dist/cli/list-models.js.map +1 -1
- package/dist/cli/plugin-manager-controller.d.ts.map +1 -1
- package/dist/cli/plugin-manager-controller.js +2 -1
- package/dist/cli/plugin-manager-controller.js.map +1 -1
- package/dist/cli/serve.d.ts.map +1 -1
- package/dist/cli/serve.js +8 -5
- package/dist/cli/serve.js.map +1 -1
- package/dist/client/remote-session.d.ts.map +1 -1
- package/dist/client/remote-session.js +16 -9
- package/dist/client/remote-session.js.map +1 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +2 -1
- package/dist/config.js.map +1 -1
- package/dist/core/agent-capability-contract.d.ts +0 -7
- package/dist/core/agent-capability-contract.d.ts.map +1 -1
- package/dist/core/agent-capability-contract.js +72 -68
- package/dist/core/agent-capability-contract.js.map +1 -1
- package/dist/core/agent-session-bash.d.ts.map +1 -1
- package/dist/core/agent-session-bash.js +5 -4
- package/dist/core/agent-session-bash.js.map +1 -1
- package/dist/core/agent-session-compaction.d.ts.map +1 -1
- package/dist/core/agent-session-compaction.js +28 -22
- package/dist/core/agent-session-compaction.js.map +1 -1
- package/dist/core/agent-session-context.d.ts.map +1 -1
- package/dist/core/agent-session-context.js +18 -13
- package/dist/core/agent-session-context.js.map +1 -1
- package/dist/core/agent-session-model.d.ts.map +1 -1
- package/dist/core/agent-session-model.js +2 -1
- package/dist/core/agent-session-model.js.map +1 -1
- package/dist/core/agent-session-retry.d.ts.map +1 -1
- package/dist/core/agent-session-retry.js +3 -2
- package/dist/core/agent-session-retry.js.map +1 -1
- package/dist/core/agent-session-runtime.d.ts.map +1 -1
- package/dist/core/agent-session-runtime.js +7 -6
- package/dist/core/agent-session-runtime.js.map +1 -1
- package/dist/core/agent-session-services.d.ts +1 -1
- package/dist/core/agent-session-services.d.ts.map +1 -1
- package/dist/core/agent-session-services.js.map +1 -1
- package/dist/core/agent-session-tools.d.ts.map +1 -1
- package/dist/core/agent-session-tools.js +3 -2
- package/dist/core/agent-session-tools.js.map +1 -1
- package/dist/core/agent-session.d.ts +40 -2
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +142 -34
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/auth-guidance.d.ts.map +1 -1
- package/dist/core/auth-guidance.js +11 -5
- package/dist/core/auth-guidance.js.map +1 -1
- package/dist/core/auth-storage.d.ts.map +1 -1
- package/dist/core/auth-storage.js +9 -6
- package/dist/core/auth-storage.js.map +1 -1
- package/dist/core/compaction/compaction.d.ts.map +1 -1
- package/dist/core/compaction/compaction.js +2 -1
- package/dist/core/compaction/compaction.js.map +1 -1
- package/dist/core/embedded-sdk.d.ts.map +1 -1
- package/dist/core/embedded-sdk.js +10 -6
- package/dist/core/embedded-sdk.js.map +1 -1
- package/dist/core/export-html/index.d.ts.map +1 -1
- package/dist/core/export-html/index.js +9 -4
- package/dist/core/export-html/index.js.map +1 -1
- package/dist/core/extensions/agent-composition.d.ts.map +1 -1
- package/dist/core/extensions/agent-composition.js +26 -19
- package/dist/core/extensions/agent-composition.js.map +1 -1
- package/dist/core/extensions/bootstrap-agent-loop.d.ts.map +1 -1
- package/dist/core/extensions/bootstrap-agent-loop.js +3 -2
- package/dist/core/extensions/bootstrap-agent-loop.js.map +1 -1
- package/dist/core/extensions/bootstrap-lifecycle.d.ts.map +1 -1
- package/dist/core/extensions/bootstrap-lifecycle.js +20 -17
- package/dist/core/extensions/bootstrap-lifecycle.js.map +1 -1
- package/dist/core/extensions/bootstrap-overflow-policy.d.ts.map +1 -1
- package/dist/core/extensions/bootstrap-overflow-policy.js +2 -1
- package/dist/core/extensions/bootstrap-overflow-policy.js.map +1 -1
- package/dist/core/extensions/bootstrap-retry-policy.d.ts.map +1 -1
- package/dist/core/extensions/bootstrap-retry-policy.js +2 -1
- package/dist/core/extensions/bootstrap-retry-policy.js.map +1 -1
- package/dist/core/extensions/bootstrap-skills.d.ts.map +1 -1
- package/dist/core/extensions/bootstrap-skills.js +7 -6
- package/dist/core/extensions/bootstrap-skills.js.map +1 -1
- package/dist/core/extensions/bootstrap-tools.d.ts.map +1 -1
- package/dist/core/extensions/bootstrap-tools.js +2 -1
- package/dist/core/extensions/bootstrap-tools.js.map +1 -1
- package/dist/core/extensions/capability-plugin.d.ts.map +1 -1
- package/dist/core/extensions/capability-plugin.js +37 -13
- package/dist/core/extensions/capability-plugin.js.map +1 -1
- package/dist/core/extensions/capability-runtime-events.d.ts.map +1 -1
- package/dist/core/extensions/capability-runtime-events.js +17 -13
- package/dist/core/extensions/capability-runtime-events.js.map +1 -1
- package/dist/core/extensions/capability-runtime-guards.d.ts.map +1 -1
- package/dist/core/extensions/capability-runtime-guards.js +16 -15
- package/dist/core/extensions/capability-runtime-guards.js.map +1 -1
- package/dist/core/extensions/capability-runtime-manifest.d.ts.map +1 -1
- package/dist/core/extensions/capability-runtime-manifest.js +52 -30
- package/dist/core/extensions/capability-runtime-manifest.js.map +1 -1
- package/dist/core/extensions/capability-runtime-validation.d.ts.map +1 -1
- package/dist/core/extensions/capability-runtime-validation.js +66 -65
- package/dist/core/extensions/capability-runtime-validation.js.map +1 -1
- package/dist/core/extensions/capability-runtime.d.ts.map +1 -1
- package/dist/core/extensions/capability-runtime.js +147 -127
- package/dist/core/extensions/capability-runtime.js.map +1 -1
- package/dist/core/extensions/compaction-memory-failure-mode.d.ts.map +1 -1
- package/dist/core/extensions/compaction-memory-failure-mode.js +3 -2
- package/dist/core/extensions/compaction-memory-failure-mode.js.map +1 -1
- package/dist/core/extensions/context-strategy-binding.d.ts.map +1 -1
- package/dist/core/extensions/context-strategy-binding.js +7 -4
- package/dist/core/extensions/context-strategy-binding.js.map +1 -1
- package/dist/core/extensions/lifecycle-catalog.d.ts.map +1 -1
- package/dist/core/extensions/lifecycle-catalog.js +290 -279
- package/dist/core/extensions/lifecycle-catalog.js.map +1 -1
- package/dist/core/extensions/lifecycle-delivery-queue.d.ts.map +1 -1
- package/dist/core/extensions/lifecycle-delivery-queue.js +3 -2
- package/dist/core/extensions/lifecycle-delivery-queue.js.map +1 -1
- package/dist/core/facade/coding-agent-facade.d.ts +6 -0
- package/dist/core/facade/coding-agent-facade.d.ts.map +1 -1
- package/dist/core/facade/coding-agent-facade.js +2 -0
- package/dist/core/facade/coding-agent-facade.js.map +1 -1
- package/dist/core/http-dispatcher.d.ts.map +1 -1
- package/dist/core/http-dispatcher.js +2 -1
- package/dist/core/http-dispatcher.js.map +1 -1
- package/dist/core/i18n/index.d.ts +14 -0
- package/dist/core/i18n/index.d.ts.map +1 -0
- package/dist/core/i18n/index.js +67 -0
- package/dist/core/i18n/index.js.map +1 -0
- package/dist/core/i18n/locales/en/example.d.ts +7 -0
- package/dist/core/i18n/locales/en/example.d.ts.map +1 -0
- package/dist/core/i18n/locales/en/example.js +7 -0
- package/dist/core/i18n/locales/en/example.js.map +1 -0
- package/dist/core/i18n/locales/zh-cn/cli.d.ts +8 -0
- package/dist/core/i18n/locales/zh-cn/cli.d.ts.map +1 -0
- package/dist/core/i18n/locales/zh-cn/cli.js +227 -0
- package/dist/core/i18n/locales/zh-cn/cli.js.map +1 -0
- package/dist/core/i18n/locales/zh-cn/common.d.ts +6 -0
- package/dist/core/i18n/locales/zh-cn/common.d.ts.map +1 -0
- package/dist/core/i18n/locales/zh-cn/common.js +6 -0
- package/dist/core/i18n/locales/zh-cn/common.js.map +1 -0
- package/dist/core/i18n/locales/zh-cn/core-contract-core.d.ts +13 -0
- package/dist/core/i18n/locales/zh-cn/core-contract-core.d.ts.map +1 -0
- package/dist/core/i18n/locales/zh-cn/core-contract-core.js +173 -0
- package/dist/core/i18n/locales/zh-cn/core-contract-core.js.map +1 -0
- package/dist/core/i18n/locales/zh-cn/core-contract-extensions.d.ts +12 -0
- package/dist/core/i18n/locales/zh-cn/core-contract-extensions.d.ts.map +1 -0
- package/dist/core/i18n/locales/zh-cn/core-contract-extensions.js +582 -0
- package/dist/core/i18n/locales/zh-cn/core-contract-extensions.js.map +1 -0
- package/dist/core/i18n/locales/zh-cn/core-contract-final.d.ts +9 -0
- package/dist/core/i18n/locales/zh-cn/core-contract-final.d.ts.map +1 -0
- package/dist/core/i18n/locales/zh-cn/core-contract-final.js +55 -0
- package/dist/core/i18n/locales/zh-cn/core-contract-final.js.map +1 -0
- package/dist/core/i18n/locales/zh-cn/core-contract-plugins.d.ts +11 -0
- package/dist/core/i18n/locales/zh-cn/core-contract-plugins.d.ts.map +1 -0
- package/dist/core/i18n/locales/zh-cn/core-contract-plugins.js +455 -0
- package/dist/core/i18n/locales/zh-cn/core-contract-plugins.js.map +1 -0
- package/dist/core/i18n/locales/zh-cn/core-errors.d.ts +9 -0
- package/dist/core/i18n/locales/zh-cn/core-errors.d.ts.map +1 -0
- package/dist/core/i18n/locales/zh-cn/core-errors.js +191 -0
- package/dist/core/i18n/locales/zh-cn/core-errors.js.map +1 -0
- package/dist/core/i18n/locales/zh-cn/example.d.ts +7 -0
- package/dist/core/i18n/locales/zh-cn/example.d.ts.map +1 -0
- package/dist/core/i18n/locales/zh-cn/example.js +10 -0
- package/dist/core/i18n/locales/zh-cn/example.js.map +1 -0
- package/dist/core/i18n/locales/zh-cn/index.d.ts +2 -0
- package/dist/core/i18n/locales/zh-cn/index.d.ts.map +1 -0
- package/dist/core/i18n/locales/zh-cn/index.js +41 -0
- package/dist/core/i18n/locales/zh-cn/index.js.map +1 -0
- package/dist/core/i18n/locales/zh-cn/interactive-mode.d.ts +10 -0
- package/dist/core/i18n/locales/zh-cn/interactive-mode.d.ts.map +1 -0
- package/dist/core/i18n/locales/zh-cn/interactive-mode.js +265 -0
- package/dist/core/i18n/locales/zh-cn/interactive-mode.js.map +1 -0
- package/dist/core/i18n/locales/zh-cn/keybindings.d.ts +11 -0
- package/dist/core/i18n/locales/zh-cn/keybindings.d.ts.map +1 -0
- package/dist/core/i18n/locales/zh-cn/keybindings.js +67 -0
- package/dist/core/i18n/locales/zh-cn/keybindings.js.map +1 -0
- package/dist/core/i18n/locales/zh-cn/slash-commands.d.ts +7 -0
- package/dist/core/i18n/locales/zh-cn/slash-commands.d.ts.map +1 -0
- package/dist/core/i18n/locales/zh-cn/slash-commands.js +39 -0
- package/dist/core/i18n/locales/zh-cn/slash-commands.js.map +1 -0
- package/dist/core/i18n/locales/zh-cn/tui-builtin.d.ts +10 -0
- package/dist/core/i18n/locales/zh-cn/tui-builtin.d.ts.map +1 -0
- package/dist/core/i18n/locales/zh-cn/tui-builtin.js +15 -0
- package/dist/core/i18n/locales/zh-cn/tui-builtin.js.map +1 -0
- package/dist/core/i18n/locales/zh-cn/tui-components-misc.d.ts +13 -0
- package/dist/core/i18n/locales/zh-cn/tui-components-misc.d.ts.map +1 -0
- package/dist/core/i18n/locales/zh-cn/tui-components-misc.js +102 -0
- package/dist/core/i18n/locales/zh-cn/tui-components-misc.js.map +1 -0
- package/dist/core/i18n/locales/zh-cn/tui-components-selectors.d.ts +12 -0
- package/dist/core/i18n/locales/zh-cn/tui-components-selectors.d.ts.map +1 -0
- package/dist/core/i18n/locales/zh-cn/tui-components-selectors.js +288 -0
- package/dist/core/i18n/locales/zh-cn/tui-components-selectors.js.map +1 -0
- package/dist/core/i18n/locales/zh-cn/tui-interactive-misc.d.ts +9 -0
- package/dist/core/i18n/locales/zh-cn/tui-interactive-misc.d.ts.map +1 -0
- package/dist/core/i18n/locales/zh-cn/tui-interactive-misc.js +79 -0
- package/dist/core/i18n/locales/zh-cn/tui-interactive-misc.js.map +1 -0
- package/dist/core/i18n/locales/zh-cn/tui-self-owned.d.ts +8 -0
- package/dist/core/i18n/locales/zh-cn/tui-self-owned.d.ts.map +1 -0
- package/dist/core/i18n/locales/zh-cn/tui-self-owned.js +72 -0
- package/dist/core/i18n/locales/zh-cn/tui-self-owned.js.map +1 -0
- package/dist/core/keybindings.d.ts +15 -0
- package/dist/core/keybindings.d.ts.map +1 -1
- package/dist/core/keybindings.js +18 -0
- package/dist/core/keybindings.js.map +1 -1
- package/dist/core/logger.d.ts.map +1 -1
- package/dist/core/logger.js +5 -1
- package/dist/core/logger.js.map +1 -1
- package/dist/core/model-registry.d.ts.map +1 -1
- package/dist/core/model-registry.js +2 -1
- package/dist/core/model-registry.js.map +1 -1
- package/dist/core/model-runtime.d.ts.map +1 -1
- package/dist/core/model-runtime.js +8 -4
- package/dist/core/model-runtime.js.map +1 -1
- package/dist/core/package-install-host.d.ts.map +1 -1
- package/dist/core/package-install-host.js +4 -3
- package/dist/core/package-install-host.js.map +1 -1
- package/dist/core/package-manager.d.ts.map +1 -1
- package/dist/core/package-manager.js +15 -10
- package/dist/core/package-manager.js.map +1 -1
- package/dist/core/package-resource-collection.d.ts.map +1 -1
- package/dist/core/package-resource-collection.js +2 -1
- package/dist/core/package-resource-collection.js.map +1 -1
- package/dist/core/package-source.d.ts.map +1 -1
- package/dist/core/package-source.js +3 -2
- package/dist/core/package-source.js.map +1 -1
- package/dist/core/provider-composer.d.ts.map +1 -1
- package/dist/core/provider-composer.js +22 -13
- package/dist/core/provider-composer.js.map +1 -1
- package/dist/core/remote-catalog-provider.d.ts.map +1 -1
- package/dist/core/remote-catalog-provider.js +6 -2
- package/dist/core/remote-catalog-provider.js.map +1 -1
- package/dist/core/resolve-config-value.d.ts.map +1 -1
- package/dist/core/resolve-config-value.js +15 -5
- package/dist/core/resolve-config-value.js.map +1 -1
- package/dist/core/sdk.d.ts +19 -5
- package/dist/core/sdk.d.ts.map +1 -1
- package/dist/core/sdk.js +74 -54
- package/dist/core/sdk.js.map +1 -1
- package/dist/core/session-cwd.d.ts.map +1 -1
- package/dist/core/session-cwd.js +5 -2
- package/dist/core/session-cwd.js.map +1 -1
- package/dist/core/session-export.d.ts.map +1 -1
- package/dist/core/session-export.js +2 -1
- package/dist/core/session-export.js.map +1 -1
- package/dist/core/session-manager.d.ts.map +1 -1
- package/dist/core/session-manager.js +39 -29
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/session-storage.d.ts.map +1 -1
- package/dist/core/session-storage.js +3 -3
- package/dist/core/session-storage.js.map +1 -1
- package/dist/core/settings-manager.d.ts +11 -0
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js +27 -5
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/core/slash-commands.d.ts.map +1 -1
- package/dist/core/slash-commands.js +53 -32
- package/dist/core/slash-commands.js.map +1 -1
- package/dist/core/system-prompt.d.ts.map +1 -1
- package/dist/core/system-prompt.js +25 -2
- package/dist/core/system-prompt.js.map +1 -1
- package/dist/core/tools/bash.d.ts.map +1 -1
- package/dist/core/tools/bash.js +11 -7
- package/dist/core/tools/bash.js.map +1 -1
- package/dist/core/tools/edit-diff.d.ts.map +1 -1
- package/dist/core/tools/edit-diff.js +9 -4
- package/dist/core/tools/edit-diff.js.map +1 -1
- package/dist/core/tools/edit.d.ts.map +1 -1
- package/dist/core/tools/edit.js +4 -3
- package/dist/core/tools/edit.js.map +1 -1
- package/dist/core/tools/index.d.ts.map +1 -1
- package/dist/core/tools/index.js +3 -2
- package/dist/core/tools/index.js.map +1 -1
- package/dist/core/tools/output-accumulator.d.ts.map +1 -1
- package/dist/core/tools/output-accumulator.js +2 -1
- package/dist/core/tools/output-accumulator.js.map +1 -1
- package/dist/core/tools/read.d.ts.map +1 -1
- package/dist/core/tools/read.js +6 -2
- package/dist/core/tools/read.js.map +1 -1
- package/dist/core/tools/write.d.ts.map +1 -1
- package/dist/core/tools/write.js +2 -1
- package/dist/core/tools/write.js.map +1 -1
- package/dist/durable/durable-service.d.ts.map +1 -1
- package/dist/durable/durable-service.js +25 -18
- package/dist/durable/durable-service.js.map +1 -1
- package/dist/host/checkpoint-commit.d.ts.map +1 -1
- package/dist/host/checkpoint-commit.js +2 -1
- package/dist/host/checkpoint-commit.js.map +1 -1
- package/dist/host/manual-compaction.d.ts.map +1 -1
- package/dist/host/manual-compaction.js +2 -1
- package/dist/host/manual-compaction.js.map +1 -1
- package/dist/host/output-projection.d.ts +0 -13
- package/dist/host/output-projection.d.ts.map +1 -1
- package/dist/host/output-projection.js +16 -2
- package/dist/host/output-projection.js.map +1 -1
- package/dist/host/summary-retry.d.ts.map +1 -1
- package/dist/host/summary-retry.js +3 -2
- package/dist/host/summary-retry.js.map +1 -1
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +94 -58
- package/dist/main.js.map +1 -1
- package/dist/modes/interactive/components/agents-view.d.ts.map +1 -1
- package/dist/modes/interactive/components/agents-view.js +18 -15
- package/dist/modes/interactive/components/agents-view.js.map +1 -1
- package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/assistant-message.js +6 -5
- package/dist/modes/interactive/components/assistant-message.js.map +1 -1
- package/dist/modes/interactive/components/bash-execution.d.ts.map +1 -1
- package/dist/modes/interactive/components/bash-execution.js +12 -7
- package/dist/modes/interactive/components/bash-execution.js.map +1 -1
- package/dist/modes/interactive/components/bordered-loader.d.ts.map +1 -1
- package/dist/modes/interactive/components/bordered-loader.js +2 -1
- package/dist/modes/interactive/components/bordered-loader.js.map +1 -1
- package/dist/modes/interactive/components/branch-summary-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/branch-summary-message.js +6 -5
- package/dist/modes/interactive/components/branch-summary-message.js.map +1 -1
- package/dist/modes/interactive/components/compaction-summary-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/compaction-summary-message.js +9 -5
- package/dist/modes/interactive/components/compaction-summary-message.js.map +1 -1
- package/dist/modes/interactive/components/config-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/config-selector.js +18 -15
- package/dist/modes/interactive/components/config-selector.js.map +1 -1
- package/dist/modes/interactive/components/custom-entry.d.ts.map +1 -1
- package/dist/modes/interactive/components/custom-entry.js +2 -1
- package/dist/modes/interactive/components/custom-entry.js.map +1 -1
- package/dist/modes/interactive/components/dialog-editor.d.ts.map +1 -1
- package/dist/modes/interactive/components/dialog-editor.js +5 -4
- package/dist/modes/interactive/components/dialog-editor.js.map +1 -1
- package/dist/modes/interactive/components/dialog-input.d.ts.map +1 -1
- package/dist/modes/interactive/components/dialog-input.js +2 -1
- package/dist/modes/interactive/components/dialog-input.js.map +1 -1
- package/dist/modes/interactive/components/dialog-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/dialog-selector.js +4 -3
- package/dist/modes/interactive/components/dialog-selector.js.map +1 -1
- package/dist/modes/interactive/components/first-time-setup.d.ts.map +1 -1
- package/dist/modes/interactive/components/first-time-setup.js +11 -10
- package/dist/modes/interactive/components/first-time-setup.js.map +1 -1
- package/dist/modes/interactive/components/footer.d.ts.map +1 -1
- package/dist/modes/interactive/components/footer.js +7 -4
- package/dist/modes/interactive/components/footer.js.map +1 -1
- package/dist/modes/interactive/components/index.d.ts +1 -0
- package/dist/modes/interactive/components/index.d.ts.map +1 -1
- package/dist/modes/interactive/components/index.js +1 -0
- package/dist/modes/interactive/components/index.js.map +1 -1
- package/dist/modes/interactive/components/keybinding-hints.d.ts.map +1 -1
- package/dist/modes/interactive/components/keybinding-hints.js +3 -2
- package/dist/modes/interactive/components/keybinding-hints.js.map +1 -1
- package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
- package/dist/modes/interactive/components/login-dialog.js +12 -11
- package/dist/modes/interactive/components/login-dialog.js.map +1 -1
- package/dist/modes/interactive/components/mermaid.d.ts.map +1 -1
- package/dist/modes/interactive/components/mermaid.js +6 -2
- package/dist/modes/interactive/components/mermaid.js.map +1 -1
- package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/model-selector.js +28 -16
- package/dist/modes/interactive/components/model-selector.js.map +1 -1
- package/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/oauth-selector.js +10 -9
- package/dist/modes/interactive/components/oauth-selector.js.map +1 -1
- package/dist/modes/interactive/components/plugin-manager-entry.d.ts.map +1 -1
- package/dist/modes/interactive/components/plugin-manager-entry.js +22 -13
- package/dist/modes/interactive/components/plugin-manager-entry.js.map +1 -1
- package/dist/modes/interactive/components/plugin-selection-entry.d.ts.map +1 -1
- package/dist/modes/interactive/components/plugin-selection-entry.js +27 -12
- package/dist/modes/interactive/components/plugin-selection-entry.js.map +1 -1
- package/dist/modes/interactive/components/queue-manager-selector.d.ts +60 -0
- package/dist/modes/interactive/components/queue-manager-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/queue-manager-selector.js +166 -0
- package/dist/modes/interactive/components/queue-manager-selector.js.map +1 -0
- package/dist/modes/interactive/components/scoped-models-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/scoped-models-selector.js +16 -14
- package/dist/modes/interactive/components/scoped-models-selector.js.map +1 -1
- package/dist/modes/interactive/components/session-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/session-selector.js +43 -31
- package/dist/modes/interactive/components/session-selector.js.map +1 -1
- package/dist/modes/interactive/components/settings-selector.d.ts +2 -0
- package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/settings-selector.js +113 -96
- package/dist/modes/interactive/components/settings-selector.js.map +1 -1
- package/dist/modes/interactive/components/settings-submenu.d.ts.map +1 -1
- package/dist/modes/interactive/components/settings-submenu.js +5 -4
- package/dist/modes/interactive/components/settings-submenu.js.map +1 -1
- package/dist/modes/interactive/components/show-images-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/show-images-selector.js +3 -2
- package/dist/modes/interactive/components/show-images-selector.js.map +1 -1
- package/dist/modes/interactive/components/skill-invocation-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/skill-invocation-message.js +4 -3
- package/dist/modes/interactive/components/skill-invocation-message.js.map +1 -1
- package/dist/modes/interactive/components/status-indicator.d.ts.map +1 -1
- package/dist/modes/interactive/components/status-indicator.js +14 -5
- package/dist/modes/interactive/components/status-indicator.js.map +1 -1
- package/dist/modes/interactive/components/theme-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/theme-selector.js +2 -1
- package/dist/modes/interactive/components/theme-selector.js.map +1 -1
- package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/thinking-selector.js +11 -4
- package/dist/modes/interactive/components/thinking-selector.js.map +1 -1
- package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
- package/dist/modes/interactive/components/tool-execution.js +8 -3
- package/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/dist/modes/interactive/components/tree-list.d.ts.map +1 -1
- package/dist/modes/interactive/components/tree-list.js +7 -6
- package/dist/modes/interactive/components/tree-list.js.map +1 -1
- package/dist/modes/interactive/components/tree-render.d.ts.map +1 -1
- package/dist/modes/interactive/components/tree-render.js +28 -23
- package/dist/modes/interactive/components/tree-render.js.map +1 -1
- package/dist/modes/interactive/components/tree-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/tree-selector.js +9 -7
- package/dist/modes/interactive/components/tree-selector.js.map +1 -1
- package/dist/modes/interactive/components/user-message-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/user-message-selector.js +5 -4
- package/dist/modes/interactive/components/user-message-selector.js.map +1 -1
- package/dist/modes/interactive/components/workflow-view.d.ts.map +1 -1
- package/dist/modes/interactive/components/workflow-view.js +36 -21
- package/dist/modes/interactive/components/workflow-view.js.map +1 -1
- package/dist/modes/interactive/external-editor.d.ts.map +1 -1
- package/dist/modes/interactive/external-editor.js +2 -1
- package/dist/modes/interactive/external-editor.js.map +1 -1
- package/dist/modes/interactive/interactive-auth.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-auth.js +71 -40
- package/dist/modes/interactive/interactive-auth.js.map +1 -1
- package/dist/modes/interactive/interactive-commands.d.ts +1 -0
- package/dist/modes/interactive/interactive-commands.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-commands.js +3 -0
- package/dist/modes/interactive/interactive-commands.js.map +1 -1
- package/dist/modes/interactive/interactive-dialog-ui.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-dialog-ui.js +5 -5
- package/dist/modes/interactive/interactive-dialog-ui.js.map +1 -1
- package/dist/modes/interactive/interactive-format.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-format.js +34 -18
- package/dist/modes/interactive/interactive-format.js.map +1 -1
- package/dist/modes/interactive/interactive-helpers.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-helpers.js +7 -2
- package/dist/modes/interactive/interactive-helpers.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts +4 -1
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +327 -243
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/modes/interactive/interactive-selectors.d.ts +9 -0
- package/dist/modes/interactive/interactive-selectors.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-selectors.js +79 -25
- package/dist/modes/interactive/interactive-selectors.js.map +1 -1
- package/dist/modes/interactive/theme/theme-controller.d.ts.map +1 -1
- package/dist/modes/interactive/theme/theme-controller.js +5 -1
- package/dist/modes/interactive/theme/theme-controller.js.map +1 -1
- package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
- package/dist/modes/interactive/theme/theme.js +26 -23
- package/dist/modes/interactive/theme/theme.js.map +1 -1
- package/dist/modes/json-event.d.ts.map +1 -1
- package/dist/modes/json-event.js +3 -2
- package/dist/modes/json-event.js.map +1 -1
- package/dist/modes/print-mode.d.ts.map +1 -1
- package/dist/modes/print-mode.js +3 -2
- package/dist/modes/print-mode.js.map +1 -1
- package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-client.js +3 -2
- package/dist/modes/rpc/rpc-client.js.map +1 -1
- package/dist/package-manager-cli.d.ts.map +1 -1
- package/dist/package-manager-cli.js +28 -13
- package/dist/package-manager-cli.js.map +1 -1
- package/dist/plugins/ecosystem/catalog.d.ts.map +1 -1
- package/dist/plugins/ecosystem/catalog.js +3 -2
- package/dist/plugins/ecosystem/catalog.js.map +1 -1
- package/dist/plugins/ecosystem/cli.d.ts.map +1 -1
- package/dist/plugins/ecosystem/cli.js +2 -1
- package/dist/plugins/ecosystem/cli.js.map +1 -1
- package/dist/plugins/ecosystem/default-plugin-market.d.ts.map +1 -1
- package/dist/plugins/ecosystem/default-plugin-market.js +3 -2
- package/dist/plugins/ecosystem/default-plugin-market.js.map +1 -1
- package/dist/plugins/ecosystem/distribution.d.ts.map +1 -1
- package/dist/plugins/ecosystem/distribution.js +2 -1
- package/dist/plugins/ecosystem/distribution.js.map +1 -1
- package/dist/plugins/ecosystem/installer.d.ts.map +1 -1
- package/dist/plugins/ecosystem/installer.js +3 -2
- package/dist/plugins/ecosystem/installer.js.map +1 -1
- package/dist/plugins/ecosystem/node-disk-registry-source.d.ts.map +1 -1
- package/dist/plugins/ecosystem/node-disk-registry-source.js +20 -17
- package/dist/plugins/ecosystem/node-disk-registry-source.js.map +1 -1
- package/dist/plugins/ecosystem/node-distribution-host.d.ts.map +1 -1
- package/dist/plugins/ecosystem/node-distribution-host.js +35 -34
- package/dist/plugins/ecosystem/node-distribution-host.js.map +1 -1
- package/dist/plugins/ecosystem/node-npm-registry-source.d.ts.map +1 -1
- package/dist/plugins/ecosystem/node-npm-registry-source.js +35 -34
- package/dist/plugins/ecosystem/node-npm-registry-source.js.map +1 -1
- package/dist/plugins/ecosystem/node-package-install-host.d.ts.map +1 -1
- package/dist/plugins/ecosystem/node-package-install-host.js +9 -8
- package/dist/plugins/ecosystem/node-package-install-host.js.map +1 -1
- package/dist/plugins/ecosystem/node-package-install-persistence.d.ts.map +1 -1
- package/dist/plugins/ecosystem/node-package-install-persistence.js +4 -3
- package/dist/plugins/ecosystem/node-package-install-persistence.js.map +1 -1
- package/dist/plugins/ecosystem/node-plugin-bootstrap.d.ts.map +1 -1
- package/dist/plugins/ecosystem/node-plugin-bootstrap.js +21 -5
- package/dist/plugins/ecosystem/node-plugin-bootstrap.js.map +1 -1
- package/dist/plugins/ecosystem/node-plugin-trust-root.d.ts.map +1 -1
- package/dist/plugins/ecosystem/node-plugin-trust-root.js +10 -9
- package/dist/plugins/ecosystem/node-plugin-trust-root.js.map +1 -1
- package/dist/plugins/ecosystem/node-registry-source.d.ts.map +1 -1
- package/dist/plugins/ecosystem/node-registry-source.js +31 -30
- package/dist/plugins/ecosystem/node-registry-source.js.map +1 -1
- package/dist/plugins/ecosystem/node-release-package-source.d.ts.map +1 -1
- package/dist/plugins/ecosystem/node-release-package-source.js +30 -29
- package/dist/plugins/ecosystem/node-release-package-source.js.map +1 -1
- package/dist/plugins/ecosystem/node-tar-writer.d.ts.map +1 -1
- package/dist/plugins/ecosystem/node-tar-writer.js +11 -10
- package/dist/plugins/ecosystem/node-tar-writer.js.map +1 -1
- package/dist/plugins/ecosystem/node-url-package-source.d.ts.map +1 -1
- package/dist/plugins/ecosystem/node-url-package-source.js +21 -20
- package/dist/plugins/ecosystem/node-url-package-source.js.map +1 -1
- package/dist/plugins/ecosystem/plugin-acquisition.d.ts.map +1 -1
- package/dist/plugins/ecosystem/plugin-acquisition.js +3 -2
- package/dist/plugins/ecosystem/plugin-acquisition.js.map +1 -1
- package/dist/plugins/ecosystem/registry-cli-adapter.d.ts.map +1 -1
- package/dist/plugins/ecosystem/registry-cli-adapter.js +2 -1
- package/dist/plugins/ecosystem/registry-cli-adapter.js.map +1 -1
- package/dist/plugins/ecosystem/registry.d.ts.map +1 -1
- package/dist/plugins/ecosystem/registry.js +35 -32
- package/dist/plugins/ecosystem/registry.js.map +1 -1
- package/dist/plugins/ecosystem/resolver.d.ts.map +1 -1
- package/dist/plugins/ecosystem/resolver.js +3 -2
- package/dist/plugins/ecosystem/resolver.js.map +1 -1
- package/dist/plugins/ecosystem/selection-store.d.ts.map +1 -1
- package/dist/plugins/ecosystem/selection-store.js +11 -10
- package/dist/plugins/ecosystem/selection-store.js.map +1 -1
- package/dist/plugins/ecosystem/selection.d.ts.map +1 -1
- package/dist/plugins/ecosystem/selection.js +8 -7
- package/dist/plugins/ecosystem/selection.js.map +1 -1
- package/dist/plugins/ecosystem/state.d.ts.map +1 -1
- package/dist/plugins/ecosystem/state.js +24 -23
- package/dist/plugins/ecosystem/state.js.map +1 -1
- package/dist/plugins/ecosystem/updates.d.ts.map +1 -1
- package/dist/plugins/ecosystem/updates.js +5 -4
- package/dist/plugins/ecosystem/updates.js.map +1 -1
- package/dist/plugins/mcp-http.d.ts +0 -17
- package/dist/plugins/mcp-http.d.ts.map +1 -1
- package/dist/plugins/mcp-http.js +30 -7
- package/dist/plugins/mcp-http.js.map +1 -1
- package/dist/plugins/plugin-supervisor.d.ts.map +1 -1
- package/dist/plugins/plugin-supervisor.js +19 -1
- package/dist/plugins/plugin-supervisor.js.map +1 -1
- package/dist/profile/first-roles.d.ts.map +1 -1
- package/dist/profile/first-roles.js +10 -1
- package/dist/profile/first-roles.js.map +1 -1
- package/dist/profile/goal-plugin.d.ts.map +1 -1
- package/dist/profile/goal-plugin.js +24 -5
- package/dist/profile/goal-plugin.js.map +1 -1
- package/dist/profile/identity.d.ts.map +1 -1
- package/dist/profile/identity.js +7 -6
- package/dist/profile/identity.js.map +1 -1
- package/dist/profile/lock.d.ts.map +1 -1
- package/dist/profile/lock.js +15 -1
- package/dist/profile/lock.js.map +1 -1
- package/dist/profile/plan-plugin.d.ts.map +1 -1
- package/dist/profile/plan-plugin.js +26 -13
- package/dist/profile/plan-plugin.js.map +1 -1
- package/dist/profile/plugin-profiles.d.ts.map +1 -1
- package/dist/profile/plugin-profiles.js +2 -1
- package/dist/profile/plugin-profiles.js.map +1 -1
- package/dist/profile/policy-manifest.d.ts.map +1 -1
- package/dist/profile/policy-manifest.js +5 -4
- package/dist/profile/policy-manifest.js.map +1 -1
- package/dist/profile/profile-registry.d.ts +0 -12
- package/dist/profile/profile-registry.d.ts.map +1 -1
- package/dist/profile/profile-registry.js +14 -1
- package/dist/profile/profile-registry.js.map +1 -1
- package/dist/profile/role-catalog.d.ts +0 -1
- package/dist/profile/role-catalog.d.ts.map +1 -1
- package/dist/profile/role-catalog.js +17 -15
- package/dist/profile/role-catalog.js.map +1 -1
- package/dist/profile/role-orchestrator.d.ts.map +1 -1
- package/dist/profile/role-orchestrator.js +8 -7
- package/dist/profile/role-orchestrator.js.map +1 -1
- package/dist/profile/role-runner.d.ts.map +1 -1
- package/dist/profile/role-runner.js +3 -2
- package/dist/profile/role-runner.js.map +1 -1
- package/dist/profile/root-facade.d.ts.map +1 -1
- package/dist/profile/root-facade.js +2 -1
- package/dist/profile/root-facade.js.map +1 -1
- package/dist/profile/skill-discovery-wiring.d.ts.map +1 -1
- package/dist/profile/skill-discovery-wiring.js +7 -2
- package/dist/profile/skill-discovery-wiring.js.map +1 -1
- package/dist/profile/state-store.d.ts.map +1 -1
- package/dist/profile/state-store.js +13 -9
- package/dist/profile/state-store.js.map +1 -1
- package/dist/profile/todo-plugin.d.ts.map +1 -1
- package/dist/profile/todo-plugin.js +9 -4
- package/dist/profile/todo-plugin.js.map +1 -1
- package/dist/profiles/builtin-suites.d.ts +13 -6
- package/dist/profiles/builtin-suites.d.ts.map +1 -1
- package/dist/profiles/builtin-suites.js +15 -6
- package/dist/profiles/builtin-suites.js.map +1 -1
- package/dist/profiles/suite-loader.d.ts +25 -1
- package/dist/profiles/suite-loader.d.ts.map +1 -1
- package/dist/profiles/suite-loader.js +34 -9
- package/dist/profiles/suite-loader.js.map +1 -1
- package/dist/remote/server-entry.d.ts.map +1 -1
- package/dist/remote/server-entry.js +3 -2
- package/dist/remote/server-entry.js.map +1 -1
- package/dist/remote/session-source.d.ts.map +1 -1
- package/dist/remote/session-source.js +8 -4
- package/dist/remote/session-source.js.map +1 -1
- package/dist/share/session-share.d.ts.map +1 -1
- package/dist/share/session-share.js +14 -2
- package/dist/share/session-share.js.map +1 -1
- package/dist/testing/plugin-testkit.d.ts.map +1 -1
- package/dist/testing/plugin-testkit.js +4 -3
- package/dist/testing/plugin-testkit.js.map +1 -1
- package/dist/testing/runtime-delivery-queue.d.ts.map +1 -1
- package/dist/testing/runtime-delivery-queue.js +2 -1
- package/dist/testing/runtime-delivery-queue.js.map +1 -1
- package/dist/testing/session-plugin-testkit.d.ts.map +1 -1
- package/dist/testing/session-plugin-testkit.js +10 -7
- package/dist/testing/session-plugin-testkit.js.map +1 -1
- package/dist/utils/ansi.d.ts.map +1 -1
- package/dist/utils/ansi.js +2 -1
- package/dist/utils/ansi.js.map +1 -1
- package/dist/utils/clipboard.d.ts.map +1 -1
- package/dist/utils/clipboard.js +7 -6
- package/dist/utils/clipboard.js.map +1 -1
- package/dist/utils/image-resize-worker.d.ts.map +1 -1
- package/dist/utils/image-resize-worker.js +3 -2
- package/dist/utils/image-resize-worker.js.map +1 -1
- package/dist/utils/shell.d.ts.map +1 -1
- package/dist/utils/shell.js +9 -8
- package/dist/utils/shell.js.map +1 -1
- package/dist/utils/tools-manager.d.ts.map +1 -1
- package/dist/utils/tools-manager.js +23 -13
- package/dist/utils/tools-manager.js.map +1 -1
- package/dist/utils/version-check.d.ts.map +1 -1
- package/dist/utils/version-check.js +5 -1
- package/dist/utils/version-check.js.map +1 -1
- package/docs/keybindings.md +3 -0
- package/docs/quickstart.md +1 -1
- package/docs/settings.md +1 -0
- package/docs/terminal-setup.md +2 -3
- package/docs/usage.md +6 -5
- package/examples/extensions/with-deps/package-lock.json +2 -2
- package/examples/extensions/with-deps/package.json +1 -1
- package/examples/extensions/with-deps/plugin.json +1 -1
- package/package.json +1 -1
- package/dist/bundle/chunks/chunk-EALJ5DDX.js +0 -1452
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-session-context.d.ts","sourceRoot":"","sources":["../../src/core/agent-session-context.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AACzE,OAAO,KAAK,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAExF,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,qBAAqB,GAAG;IAAE,OAAO,EAAE,iBAAiB,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAanH;AAED,wBAAgB,2BAA2B,CAAC,OAAO,EAAE,qBAAqB,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAInG;AAED,wBAAgB,2BAA2B,CAAC,OAAO,EAAE,qBAAqB,GAAG,IAAI,CAIhF;AAED,wBAAgB,0BAA0B,CACzC,OAAO,EAAE,qBAAqB,EAC9B,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,OAAO,GAClB,OAAO,CAET;AAED,wBAAgB,8BAA8B,CAC7C,OAAO,EAAE,qBAAqB,EAC9B,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,OAAO,GAClB,IAAI,CASN;AAED,wBAAgB,wBAAwB,CAAC,CAAC,EACzC,OAAO,EAAE,qBAAqB,EAC9B,SAAS,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,KAAK,OAAO,CAAC,CAAC,CAAC,EAC7D,OAAO,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,WAAW,CAAC;IAAC,WAAW,CAAC,EAAE,OAAO,CAAA;CAAE,GACvD,OAAO,CAAC,CAAC,CAAC,CA6BZ;AAED,wBAAgB,mBAAmB,CAClC,KAAK,EAAE,OAAO,EACd,YAAY,EAAE,MAAM,EACpB,SAAS,EAAE,OAAO,GAAG,QAAQ,GAC3B,YAAY,EAAE,CA2BhB;AAED,kFAAkF;AAClF,wBAAgB,sBAAsB,CACrC,OAAO,EAAE,qBAAqB,EAC9B,QAAQ,EAAE,YAAY,EAAE,EACxB,MAAM,GAAE,uBAAuB,CAAC,QAAQ,CAAqB,EAC7D,MAAM,CAAC,EAAE,WAAW,EACpB,OAAO,CAAC,EAAE;IAAE,WAAW,CAAC,EAAE,OAAO,CAAA;CAAE,GACjC,OAAO,CAAC,YAAY,EAAE,CAAC,CAmCzB;AAED,wBAAgB,wBAAwB,CACvC,OAAO,EAAE,qBAAqB,EAC9B,QAAQ,EAAE,OAAO,EACjB,MAAM,EAAE,WAAW,CAAC,uBAAuB,CAAC,QAAQ,CAAC,CAAC,EACtD,OAAO,CAAC,EAAE;IAAE,WAAW,CAAC,EAAE,OAAO,CAAA;CAAE,GACjC,OAAO,CAAC,YAAY,EAAE,CAAC,CAoBzB;AAED,kFAAkF;AAClF,wBAAsB,eAAe,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,OAAO,CAAC,CAOtF;AAED,yDAAyD;AACzD,wBAAsB,cAAc,CAAC,OAAO,EAAE,qBAAqB,EAAE,QAAQ,EAAE,OAAO,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAG/G;AAED,wEAAwE;AACxE,wBAAsB,cAAc,CAAC,OAAO,EAAE,qBAAqB,EAAE,OAAO,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAIrH","sourcesContent":["/**\n * Context transition pipeline for AgentSession: the strategy gate, the\n * transition fence, and the snapshot/restore/replace operations.\n *\n * Extracted from `agent-session.ts`. Every function here operates on the\n * internal session facade ({@link AgentSessionInternals}); `AgentSession`\n * keeps same-name delegates so call sites, dynamic dispatch, and test spies\n * keep working unchanged. Method-to-method calls that have a facade member go\n * through the session parameter (not direct function calls) to preserve that\n * dispatch — including `session._dispatchContextReplacedLifecycle`, whose\n * delegate stays on the class with the other lifecycle dispatchers and\n * forwards to `agent-session-lifecycle.ts`.\n */\n\nimport type { AgentMessage } from \"@agent-forge/agent-core\";\nimport type { AgentSessionInternals } from \"./agent-session-internal.ts\";\nimport type { CapabilityRuntime, ContextOperationOptions } from \"./extensions/index.ts\";\n\nexport function requireContextStrategy(session: AgentSessionInternals): { runtime: CapabilityRuntime; name: string } {\n\tconst name = session._contextStrategyName;\n\tif (!name) {\n\t\tthrow new Error(\"Context strategy is not configured\");\n\t}\n\tconst runtime = session._capabilityRuntime;\n\tif (!runtime) {\n\t\tthrow new Error(\"Capability runtime is not available\");\n\t}\n\tif (!runtime.hasContextStrategy(name)) {\n\t\tthrow new Error(`Configured context strategy is not registered: ${name}`);\n\t}\n\treturn { runtime, name };\n}\n\nexport function requireIdleContextOperation(session: AgentSessionInternals, operation: string): void {\n\tif (!session.isIdle) {\n\t\tthrow new Error(`Cannot ${operation} while the session is running`);\n\t}\n}\n\nexport function beginContextTransitionFence(session: AgentSessionInternals): void {\n\tsession._contextEpoch += 1;\n\tsession._contextTransitionAbortController.abort(\"context runtime replaced\");\n\tsession._contextTransitionAbortController = new AbortController();\n}\n\nexport function isContextTransitionCurrent(\n\tsession: AgentSessionInternals,\n\tepoch: number,\n\tallowReload: boolean,\n): boolean {\n\treturn !session.isDisposed && epoch === session._contextEpoch && (allowReload || !session._reloadInProgress);\n}\n\nexport function assertContextTransitionCurrent(\n\tsession: AgentSessionInternals,\n\tepoch: number,\n\tallowReload: boolean,\n): void {\n\tif (session._isContextTransitionCurrent(epoch, allowReload)) return;\n\tthrow new Error(\n\t\tsession.isDisposed\n\t\t\t? \"Session is disposed; context transition was cancelled\"\n\t\t\t: session._reloadInProgress\n\t\t\t\t? \"Session reload in progress; context transition was cancelled\"\n\t\t\t\t: \"Context transition was superseded\",\n\t);\n}\n\nexport function enqueueContextTransition<T>(\n\tsession: AgentSessionInternals,\n\toperation: (epoch: number, signal: AbortSignal) => Promise<T>,\n\toptions?: { signal?: AbortSignal; allowReload?: boolean },\n): Promise<T> {\n\tconst allowReload = options?.allowReload ?? false;\n\tif (session.isDisposed) {\n\t\treturn Promise.reject(new Error(\"Session is disposed; context transition is unavailable\"));\n\t}\n\tif (session._reloadInProgress && !allowReload) {\n\t\treturn Promise.reject(new Error(\"Session reload in progress; context transition is unavailable\"));\n\t}\n\tconst epoch = session._contextEpoch;\n\tconst fenceSignal = session._contextTransitionAbortController.signal;\n\tconst signal = options?.signal ? AbortSignal.any([fenceSignal, options.signal]) : fenceSignal;\n\tconst previous = session._activeContextTransition;\n\t// Keep the failure visible to its original caller, but do not poison the\n\t// serialized tail: a later independent context operation may still run.\n\tconst tail = previous?.catch(() => undefined);\n\tconst queued = (tail ?? Promise.resolve()).then(() => {\n\t\tsession._assertContextTransitionCurrent(epoch, allowReload);\n\t\treturn operation(epoch, signal);\n\t});\n\tsession._activeContextTransition = queued;\n\tvoid queued.then(\n\t\t() => {\n\t\t\tif (session._activeContextTransition === queued) session._activeContextTransition = undefined;\n\t\t},\n\t\t() => {\n\t\t\tif (session._activeContextTransition === queued) session._activeContextTransition = undefined;\n\t\t},\n\t);\n\treturn queued;\n}\n\nexport function copyContextMessages(\n\tvalue: unknown,\n\tstrategyName: string,\n\tdirection: \"input\" | \"result\",\n): AgentMessage[] {\n\tif (\n\t\t!Array.isArray(value) ||\n\t\tvalue.some(\n\t\t\t(message) =>\n\t\t\t\ttypeof message !== \"object\" ||\n\t\t\t\tmessage === null ||\n\t\t\t\t!(\"role\" in message) ||\n\t\t\t\ttypeof (message as { role?: unknown }).role !== \"string\",\n\t\t)\n\t) {\n\t\tthrow new Error(\n\t\t\tdirection === \"result\"\n\t\t\t\t? `Context strategy must return an AgentMessage array: ${strategyName}`\n\t\t\t\t: `Context transition requires an AgentMessage array: ${strategyName}`,\n\t\t);\n\t}\n\ttry {\n\t\treturn structuredClone(value) as AgentMessage[];\n\t} catch (error) {\n\t\tthrow new Error(\n\t\t\tdirection === \"result\"\n\t\t\t\t? `Context strategy must return structured-cloneable AgentMessage values: ${strategyName}`\n\t\t\t\t: `Context transition requires structured-cloneable AgentMessage values: ${strategyName}`,\n\t\t\t{ cause: error },\n\t\t);\n\t}\n}\n\n/** Apply a persisted-context transition, including strategy-owned projections. */\nexport function applyContextTransition(\n\tsession: AgentSessionInternals,\n\tmessages: AgentMessage[],\n\treason: ContextOperationOptions[\"reason\"] = \"session_replace\",\n\tsignal?: AbortSignal,\n\toptions?: { allowReload?: boolean },\n): Promise<AgentMessage[]> {\n\treturn session._enqueueContextTransition(\n\t\tasync (epoch, transitionSignal) => {\n\t\t\tconst name = session._contextStrategyName;\n\t\t\tconst runtime = session._capabilityRuntime;\n\t\t\tif (name) {\n\t\t\t\tif (!runtime) {\n\t\t\t\t\tthrow new Error(\"Capability runtime is not available\");\n\t\t\t\t}\n\t\t\t\tif (!runtime.hasContextStrategy(name)) {\n\t\t\t\t\tthrow new Error(`Configured context strategy is not registered: ${name}`);\n\t\t\t\t}\n\t\t\t\tconst replaced = await runtime.replaceContext(name, session._copyContextMessages(messages, name, \"input\"), {\n\t\t\t\t\tsignal: transitionSignal,\n\t\t\t\t\treason,\n\t\t\t\t\tsessionId: session.sessionId,\n\t\t\t\t});\n\t\t\t\tsession._assertContextTransitionCurrent(epoch, options?.allowReload ?? false);\n\t\t\t\tconst committed = session._copyContextMessages(replaced, name, \"result\");\n\t\t\t\tsession._assertContextTransitionCurrent(epoch, options?.allowReload ?? false);\n\t\t\t\tsession.agent.state.messages = committed;\n\t\t\t\tsession._contextRevision += 1;\n\t\t\t\tsession._assertContextTransitionCurrent(epoch, options?.allowReload ?? false);\n\t\t\t\tawait session._dispatchContextReplacedLifecycle(reason, name);\n\t\t\t\treturn committed;\n\t\t\t}\n\t\t\tsession._assertContextTransitionCurrent(epoch, options?.allowReload ?? false);\n\t\t\tsession.agent.state.messages = messages;\n\t\t\tsession._contextRevision += 1;\n\t\t\tsession._assertContextTransitionCurrent(epoch, options?.allowReload ?? false);\n\t\t\tawait session._dispatchContextReplacedLifecycle(reason);\n\t\t\treturn messages;\n\t\t},\n\t\t{ signal, allowReload: options?.allowReload },\n\t);\n}\n\nexport function restoreContextTransition(\n\tsession: AgentSessionInternals,\n\tsnapshot: unknown,\n\treason: NonNullable<ContextOperationOptions[\"reason\"]>,\n\toptions?: { allowReload?: boolean },\n): Promise<AgentMessage[]> {\n\treturn session._enqueueContextTransition(\n\t\tasync (epoch, signal) => {\n\t\t\tconst { runtime, name } = session._requireContextStrategy();\n\t\t\tconst restored = await runtime.restoreContext(name, snapshot, {\n\t\t\t\tsignal,\n\t\t\t\treason,\n\t\t\t\tsessionId: session.sessionId,\n\t\t\t});\n\t\t\tsession._assertContextTransitionCurrent(epoch, options?.allowReload ?? false);\n\t\t\tconst committed = session._copyContextMessages(restored, name, \"result\");\n\t\t\tsession._assertContextTransitionCurrent(epoch, options?.allowReload ?? false);\n\t\t\tsession.agent.state.messages = committed;\n\t\t\tsession._contextRevision += 1;\n\t\t\tsession._assertContextTransitionCurrent(epoch, options?.allowReload ?? false);\n\t\t\tawait session._dispatchContextReplacedLifecycle(reason, name);\n\t\t\treturn committed;\n\t\t},\n\t\t{ allowReload: options?.allowReload },\n\t);\n}\n\n/** Snapshot the current session messages with the configured context strategy. */\nexport async function snapshotContext(session: AgentSessionInternals): Promise<unknown> {\n\tsession._requireIdleContextOperation(\"snapshot context\");\n\tconst { runtime, name } = session._requireContextStrategy();\n\treturn runtime.snapshotContext(name, session._copyContextMessages(session.agent.state.messages, name, \"input\"), {\n\t\treason: \"reload\",\n\t\tsessionId: session.sessionId,\n\t});\n}\n\n/** Restore session messages from a strategy snapshot. */\nexport async function restoreContext(session: AgentSessionInternals, snapshot: unknown): Promise<AgentMessage[]> {\n\tsession._requireIdleContextOperation(\"restore context\");\n\treturn session._restoreContextTransition(snapshot, \"session_replace\");\n}\n\n/** Replace session messages through the configured context strategy. */\nexport async function replaceContext(session: AgentSessionInternals, context: AgentMessage[]): Promise<AgentMessage[]> {\n\tsession._requireIdleContextOperation(\"replace context\");\n\tconst { name } = session._requireContextStrategy();\n\treturn session._applyContextTransition(session._copyContextMessages(context, name, \"input\"), \"session_replace\");\n}\n"]}
|
|
1
|
+
{"version":3,"file":"agent-session-context.d.ts","sourceRoot":"","sources":["../../src/core/agent-session-context.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AACzE,OAAO,KAAK,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAGxF,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,qBAAqB,GAAG;IAAE,OAAO,EAAE,iBAAiB,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAanH;AAED,wBAAgB,2BAA2B,CAAC,OAAO,EAAE,qBAAqB,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAInG;AAED,wBAAgB,2BAA2B,CAAC,OAAO,EAAE,qBAAqB,GAAG,IAAI,CAIhF;AAED,wBAAgB,0BAA0B,CACzC,OAAO,EAAE,qBAAqB,EAC9B,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,OAAO,GAClB,OAAO,CAET;AAED,wBAAgB,8BAA8B,CAC7C,OAAO,EAAE,qBAAqB,EAC9B,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,OAAO,GAClB,IAAI,CASN;AAED,wBAAgB,wBAAwB,CAAC,CAAC,EACzC,OAAO,EAAE,qBAAqB,EAC9B,SAAS,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,KAAK,OAAO,CAAC,CAAC,CAAC,EAC7D,OAAO,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,WAAW,CAAC;IAAC,WAAW,CAAC,EAAE,OAAO,CAAA;CAAE,GACvD,OAAO,CAAC,CAAC,CAAC,CA6BZ;AAED,wBAAgB,mBAAmB,CAClC,KAAK,EAAE,OAAO,EACd,YAAY,EAAE,MAAM,EACpB,SAAS,EAAE,OAAO,GAAG,QAAQ,GAC3B,YAAY,EAAE,CA+BhB;AAED,kFAAkF;AAClF,wBAAgB,sBAAsB,CACrC,OAAO,EAAE,qBAAqB,EAC9B,QAAQ,EAAE,YAAY,EAAE,EACxB,MAAM,GAAE,uBAAuB,CAAC,QAAQ,CAAqB,EAC7D,MAAM,CAAC,EAAE,WAAW,EACpB,OAAO,CAAC,EAAE;IAAE,WAAW,CAAC,EAAE,OAAO,CAAA;CAAE,GACjC,OAAO,CAAC,YAAY,EAAE,CAAC,CAmCzB;AAED,wBAAgB,wBAAwB,CACvC,OAAO,EAAE,qBAAqB,EAC9B,QAAQ,EAAE,OAAO,EACjB,MAAM,EAAE,WAAW,CAAC,uBAAuB,CAAC,QAAQ,CAAC,CAAC,EACtD,OAAO,CAAC,EAAE;IAAE,WAAW,CAAC,EAAE,OAAO,CAAA;CAAE,GACjC,OAAO,CAAC,YAAY,EAAE,CAAC,CAoBzB;AAED,kFAAkF;AAClF,wBAAsB,eAAe,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,OAAO,CAAC,CAOtF;AAED,yDAAyD;AACzD,wBAAsB,cAAc,CAAC,OAAO,EAAE,qBAAqB,EAAE,QAAQ,EAAE,OAAO,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAG/G;AAED,wEAAwE;AACxE,wBAAsB,cAAc,CAAC,OAAO,EAAE,qBAAqB,EAAE,OAAO,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAIrH","sourcesContent":["/**\n * Context transition pipeline for AgentSession: the strategy gate, the\n * transition fence, and the snapshot/restore/replace operations.\n *\n * Extracted from `agent-session.ts`. Every function here operates on the\n * internal session facade ({@link AgentSessionInternals}); `AgentSession`\n * keeps same-name delegates so call sites, dynamic dispatch, and test spies\n * keep working unchanged. Method-to-method calls that have a facade member go\n * through the session parameter (not direct function calls) to preserve that\n * dispatch — including `session._dispatchContextReplacedLifecycle`, whose\n * delegate stays on the class with the other lifecycle dispatchers and\n * forwards to `agent-session-lifecycle.ts`.\n */\n\nimport type { AgentMessage } from \"@agent-forge/agent-core\";\nimport type { AgentSessionInternals } from \"./agent-session-internal.ts\";\nimport type { CapabilityRuntime, ContextOperationOptions } from \"./extensions/index.ts\";\nimport { t } from \"./i18n/index.ts\";\n\nexport function requireContextStrategy(session: AgentSessionInternals): { runtime: CapabilityRuntime; name: string } {\n\tconst name = session._contextStrategyName;\n\tif (!name) {\n\t\tthrow new Error(t(\"Context strategy is not configured\"));\n\t}\n\tconst runtime = session._capabilityRuntime;\n\tif (!runtime) {\n\t\tthrow new Error(t(\"Capability runtime is not available\"));\n\t}\n\tif (!runtime.hasContextStrategy(name)) {\n\t\tthrow new Error(t(\"Configured context strategy is not registered: {name}\", { name }));\n\t}\n\treturn { runtime, name };\n}\n\nexport function requireIdleContextOperation(session: AgentSessionInternals, operation: string): void {\n\tif (!session.isIdle) {\n\t\tthrow new Error(t(\"Cannot {operation} while the session is running\", { operation }));\n\t}\n}\n\nexport function beginContextTransitionFence(session: AgentSessionInternals): void {\n\tsession._contextEpoch += 1;\n\tsession._contextTransitionAbortController.abort(\"context runtime replaced\");\n\tsession._contextTransitionAbortController = new AbortController();\n}\n\nexport function isContextTransitionCurrent(\n\tsession: AgentSessionInternals,\n\tepoch: number,\n\tallowReload: boolean,\n): boolean {\n\treturn !session.isDisposed && epoch === session._contextEpoch && (allowReload || !session._reloadInProgress);\n}\n\nexport function assertContextTransitionCurrent(\n\tsession: AgentSessionInternals,\n\tepoch: number,\n\tallowReload: boolean,\n): void {\n\tif (session._isContextTransitionCurrent(epoch, allowReload)) return;\n\tthrow new Error(\n\t\tsession.isDisposed\n\t\t\t? t(\"Session is disposed; context transition was cancelled\")\n\t\t\t: session._reloadInProgress\n\t\t\t\t? t(\"Session reload in progress; context transition was cancelled\")\n\t\t\t\t: t(\"Context transition was superseded\"),\n\t);\n}\n\nexport function enqueueContextTransition<T>(\n\tsession: AgentSessionInternals,\n\toperation: (epoch: number, signal: AbortSignal) => Promise<T>,\n\toptions?: { signal?: AbortSignal; allowReload?: boolean },\n): Promise<T> {\n\tconst allowReload = options?.allowReload ?? false;\n\tif (session.isDisposed) {\n\t\treturn Promise.reject(new Error(\"Session is disposed; context transition is unavailable\"));\n\t}\n\tif (session._reloadInProgress && !allowReload) {\n\t\treturn Promise.reject(new Error(\"Session reload in progress; context transition is unavailable\"));\n\t}\n\tconst epoch = session._contextEpoch;\n\tconst fenceSignal = session._contextTransitionAbortController.signal;\n\tconst signal = options?.signal ? AbortSignal.any([fenceSignal, options.signal]) : fenceSignal;\n\tconst previous = session._activeContextTransition;\n\t// Keep the failure visible to its original caller, but do not poison the\n\t// serialized tail: a later independent context operation may still run.\n\tconst tail = previous?.catch(() => undefined);\n\tconst queued = (tail ?? Promise.resolve()).then(() => {\n\t\tsession._assertContextTransitionCurrent(epoch, allowReload);\n\t\treturn operation(epoch, signal);\n\t});\n\tsession._activeContextTransition = queued;\n\tvoid queued.then(\n\t\t() => {\n\t\t\tif (session._activeContextTransition === queued) session._activeContextTransition = undefined;\n\t\t},\n\t\t() => {\n\t\t\tif (session._activeContextTransition === queued) session._activeContextTransition = undefined;\n\t\t},\n\t);\n\treturn queued;\n}\n\nexport function copyContextMessages(\n\tvalue: unknown,\n\tstrategyName: string,\n\tdirection: \"input\" | \"result\",\n): AgentMessage[] {\n\tif (\n\t\t!Array.isArray(value) ||\n\t\tvalue.some(\n\t\t\t(message) =>\n\t\t\t\ttypeof message !== \"object\" ||\n\t\t\t\tmessage === null ||\n\t\t\t\t!(\"role\" in message) ||\n\t\t\t\ttypeof (message as { role?: unknown }).role !== \"string\",\n\t\t)\n\t) {\n\t\tthrow new Error(\n\t\t\tdirection === \"result\"\n\t\t\t\t? t(\"Context strategy must return an AgentMessage array: {strategyName}\", { strategyName })\n\t\t\t\t: t(\"Context transition requires an AgentMessage array: {strategyName}\", { strategyName }),\n\t\t);\n\t}\n\ttry {\n\t\treturn structuredClone(value) as AgentMessage[];\n\t} catch (error) {\n\t\tthrow new Error(\n\t\t\tdirection === \"result\"\n\t\t\t\t? t(\"Context strategy must return structured-cloneable AgentMessage values: {strategyName}\", {\n\t\t\t\t\t\tstrategyName,\n\t\t\t\t\t})\n\t\t\t\t: t(\"Context transition requires structured-cloneable AgentMessage values: {strategyName}\", {\n\t\t\t\t\t\tstrategyName,\n\t\t\t\t\t}),\n\t\t\t{ cause: error },\n\t\t);\n\t}\n}\n\n/** Apply a persisted-context transition, including strategy-owned projections. */\nexport function applyContextTransition(\n\tsession: AgentSessionInternals,\n\tmessages: AgentMessage[],\n\treason: ContextOperationOptions[\"reason\"] = \"session_replace\",\n\tsignal?: AbortSignal,\n\toptions?: { allowReload?: boolean },\n): Promise<AgentMessage[]> {\n\treturn session._enqueueContextTransition(\n\t\tasync (epoch, transitionSignal) => {\n\t\t\tconst name = session._contextStrategyName;\n\t\t\tconst runtime = session._capabilityRuntime;\n\t\t\tif (name) {\n\t\t\t\tif (!runtime) {\n\t\t\t\t\tthrow new Error(t(\"Capability runtime is not available\"));\n\t\t\t\t}\n\t\t\t\tif (!runtime.hasContextStrategy(name)) {\n\t\t\t\t\tthrow new Error(t(\"Configured context strategy is not registered: {name}\", { name }));\n\t\t\t\t}\n\t\t\t\tconst replaced = await runtime.replaceContext(name, session._copyContextMessages(messages, name, \"input\"), {\n\t\t\t\t\tsignal: transitionSignal,\n\t\t\t\t\treason,\n\t\t\t\t\tsessionId: session.sessionId,\n\t\t\t\t});\n\t\t\t\tsession._assertContextTransitionCurrent(epoch, options?.allowReload ?? false);\n\t\t\t\tconst committed = session._copyContextMessages(replaced, name, \"result\");\n\t\t\t\tsession._assertContextTransitionCurrent(epoch, options?.allowReload ?? false);\n\t\t\t\tsession.agent.state.messages = committed;\n\t\t\t\tsession._contextRevision += 1;\n\t\t\t\tsession._assertContextTransitionCurrent(epoch, options?.allowReload ?? false);\n\t\t\t\tawait session._dispatchContextReplacedLifecycle(reason, name);\n\t\t\t\treturn committed;\n\t\t\t}\n\t\t\tsession._assertContextTransitionCurrent(epoch, options?.allowReload ?? false);\n\t\t\tsession.agent.state.messages = messages;\n\t\t\tsession._contextRevision += 1;\n\t\t\tsession._assertContextTransitionCurrent(epoch, options?.allowReload ?? false);\n\t\t\tawait session._dispatchContextReplacedLifecycle(reason);\n\t\t\treturn messages;\n\t\t},\n\t\t{ signal, allowReload: options?.allowReload },\n\t);\n}\n\nexport function restoreContextTransition(\n\tsession: AgentSessionInternals,\n\tsnapshot: unknown,\n\treason: NonNullable<ContextOperationOptions[\"reason\"]>,\n\toptions?: { allowReload?: boolean },\n): Promise<AgentMessage[]> {\n\treturn session._enqueueContextTransition(\n\t\tasync (epoch, signal) => {\n\t\t\tconst { runtime, name } = session._requireContextStrategy();\n\t\t\tconst restored = await runtime.restoreContext(name, snapshot, {\n\t\t\t\tsignal,\n\t\t\t\treason,\n\t\t\t\tsessionId: session.sessionId,\n\t\t\t});\n\t\t\tsession._assertContextTransitionCurrent(epoch, options?.allowReload ?? false);\n\t\t\tconst committed = session._copyContextMessages(restored, name, \"result\");\n\t\t\tsession._assertContextTransitionCurrent(epoch, options?.allowReload ?? false);\n\t\t\tsession.agent.state.messages = committed;\n\t\t\tsession._contextRevision += 1;\n\t\t\tsession._assertContextTransitionCurrent(epoch, options?.allowReload ?? false);\n\t\t\tawait session._dispatchContextReplacedLifecycle(reason, name);\n\t\t\treturn committed;\n\t\t},\n\t\t{ allowReload: options?.allowReload },\n\t);\n}\n\n/** Snapshot the current session messages with the configured context strategy. */\nexport async function snapshotContext(session: AgentSessionInternals): Promise<unknown> {\n\tsession._requireIdleContextOperation(\"snapshot context\");\n\tconst { runtime, name } = session._requireContextStrategy();\n\treturn runtime.snapshotContext(name, session._copyContextMessages(session.agent.state.messages, name, \"input\"), {\n\t\treason: \"reload\",\n\t\tsessionId: session.sessionId,\n\t});\n}\n\n/** Restore session messages from a strategy snapshot. */\nexport async function restoreContext(session: AgentSessionInternals, snapshot: unknown): Promise<AgentMessage[]> {\n\tsession._requireIdleContextOperation(\"restore context\");\n\treturn session._restoreContextTransition(snapshot, \"session_replace\");\n}\n\n/** Replace session messages through the configured context strategy. */\nexport async function replaceContext(session: AgentSessionInternals, context: AgentMessage[]): Promise<AgentMessage[]> {\n\tsession._requireIdleContextOperation(\"replace context\");\n\tconst { name } = session._requireContextStrategy();\n\treturn session._applyContextTransition(session._copyContextMessages(context, name, \"input\"), \"session_replace\");\n}\n"]}
|
|
@@ -11,23 +11,24 @@
|
|
|
11
11
|
* delegate stays on the class with the other lifecycle dispatchers and
|
|
12
12
|
* forwards to `agent-session-lifecycle.ts`.
|
|
13
13
|
*/
|
|
14
|
+
import { t } from "./i18n/index.js";
|
|
14
15
|
export function requireContextStrategy(session) {
|
|
15
16
|
const name = session._contextStrategyName;
|
|
16
17
|
if (!name) {
|
|
17
|
-
throw new Error("Context strategy is not configured");
|
|
18
|
+
throw new Error(t("Context strategy is not configured"));
|
|
18
19
|
}
|
|
19
20
|
const runtime = session._capabilityRuntime;
|
|
20
21
|
if (!runtime) {
|
|
21
|
-
throw new Error("Capability runtime is not available");
|
|
22
|
+
throw new Error(t("Capability runtime is not available"));
|
|
22
23
|
}
|
|
23
24
|
if (!runtime.hasContextStrategy(name)) {
|
|
24
|
-
throw new Error(
|
|
25
|
+
throw new Error(t("Configured context strategy is not registered: {name}", { name }));
|
|
25
26
|
}
|
|
26
27
|
return { runtime, name };
|
|
27
28
|
}
|
|
28
29
|
export function requireIdleContextOperation(session, operation) {
|
|
29
30
|
if (!session.isIdle) {
|
|
30
|
-
throw new Error(
|
|
31
|
+
throw new Error(t("Cannot {operation} while the session is running", { operation }));
|
|
31
32
|
}
|
|
32
33
|
}
|
|
33
34
|
export function beginContextTransitionFence(session) {
|
|
@@ -42,10 +43,10 @@ export function assertContextTransitionCurrent(session, epoch, allowReload) {
|
|
|
42
43
|
if (session._isContextTransitionCurrent(epoch, allowReload))
|
|
43
44
|
return;
|
|
44
45
|
throw new Error(session.isDisposed
|
|
45
|
-
? "Session is disposed; context transition was cancelled"
|
|
46
|
+
? t("Session is disposed; context transition was cancelled")
|
|
46
47
|
: session._reloadInProgress
|
|
47
|
-
? "Session reload in progress; context transition was cancelled"
|
|
48
|
-
: "Context transition was superseded");
|
|
48
|
+
? t("Session reload in progress; context transition was cancelled")
|
|
49
|
+
: t("Context transition was superseded"));
|
|
49
50
|
}
|
|
50
51
|
export function enqueueContextTransition(session, operation, options) {
|
|
51
52
|
const allowReload = options?.allowReload ?? false;
|
|
@@ -83,16 +84,20 @@ export function copyContextMessages(value, strategyName, direction) {
|
|
|
83
84
|
!("role" in message) ||
|
|
84
85
|
typeof message.role !== "string")) {
|
|
85
86
|
throw new Error(direction === "result"
|
|
86
|
-
?
|
|
87
|
-
:
|
|
87
|
+
? t("Context strategy must return an AgentMessage array: {strategyName}", { strategyName })
|
|
88
|
+
: t("Context transition requires an AgentMessage array: {strategyName}", { strategyName }));
|
|
88
89
|
}
|
|
89
90
|
try {
|
|
90
91
|
return structuredClone(value);
|
|
91
92
|
}
|
|
92
93
|
catch (error) {
|
|
93
94
|
throw new Error(direction === "result"
|
|
94
|
-
?
|
|
95
|
-
|
|
95
|
+
? t("Context strategy must return structured-cloneable AgentMessage values: {strategyName}", {
|
|
96
|
+
strategyName,
|
|
97
|
+
})
|
|
98
|
+
: t("Context transition requires structured-cloneable AgentMessage values: {strategyName}", {
|
|
99
|
+
strategyName,
|
|
100
|
+
}), { cause: error });
|
|
96
101
|
}
|
|
97
102
|
}
|
|
98
103
|
/** Apply a persisted-context transition, including strategy-owned projections. */
|
|
@@ -102,10 +107,10 @@ export function applyContextTransition(session, messages, reason = "session_repl
|
|
|
102
107
|
const runtime = session._capabilityRuntime;
|
|
103
108
|
if (name) {
|
|
104
109
|
if (!runtime) {
|
|
105
|
-
throw new Error("Capability runtime is not available");
|
|
110
|
+
throw new Error(t("Capability runtime is not available"));
|
|
106
111
|
}
|
|
107
112
|
if (!runtime.hasContextStrategy(name)) {
|
|
108
|
-
throw new Error(
|
|
113
|
+
throw new Error(t("Configured context strategy is not registered: {name}", { name }));
|
|
109
114
|
}
|
|
110
115
|
const replaced = await runtime.replaceContext(name, session._copyContextMessages(messages, name, "input"), {
|
|
111
116
|
signal: transitionSignal,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-session-context.js","sourceRoot":"","sources":["../../src/core/agent-session-context.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Context transition pipeline for AgentSession: the strategy gate, the\n * transition fence, and the snapshot/restore/replace operations.\n *\n * Extracted from `agent-session.ts`. Every function here operates on the\n * internal session facade ({@link AgentSessionInternals}); `AgentSession`\n * keeps same-name delegates so call sites, dynamic dispatch, and test spies\n * keep working unchanged. Method-to-method calls that have a facade member go\n * through the session parameter (not direct function calls) to preserve that\n * dispatch — including `session._dispatchContextReplacedLifecycle`, whose\n * delegate stays on the class with the other lifecycle dispatchers and\n * forwards to `agent-session-lifecycle.ts`.\n */\n\nimport type { AgentMessage } from \"@agent-forge/agent-core\";\nimport type { AgentSessionInternals } from \"./agent-session-internal.ts\";\nimport type { CapabilityRuntime, ContextOperationOptions } from \"./extensions/index.ts\";\n\nexport function requireContextStrategy(session: AgentSessionInternals): { runtime: CapabilityRuntime; name: string } {\n\tconst name = session._contextStrategyName;\n\tif (!name) {\n\t\tthrow new Error(\"Context strategy is not configured\");\n\t}\n\tconst runtime = session._capabilityRuntime;\n\tif (!runtime) {\n\t\tthrow new Error(\"Capability runtime is not available\");\n\t}\n\tif (!runtime.hasContextStrategy(name)) {\n\t\tthrow new Error(`Configured context strategy is not registered: ${name}`);\n\t}\n\treturn { runtime, name };\n}\n\nexport function requireIdleContextOperation(session: AgentSessionInternals, operation: string): void {\n\tif (!session.isIdle) {\n\t\tthrow new Error(`Cannot ${operation} while the session is running`);\n\t}\n}\n\nexport function beginContextTransitionFence(session: AgentSessionInternals): void {\n\tsession._contextEpoch += 1;\n\tsession._contextTransitionAbortController.abort(\"context runtime replaced\");\n\tsession._contextTransitionAbortController = new AbortController();\n}\n\nexport function isContextTransitionCurrent(\n\tsession: AgentSessionInternals,\n\tepoch: number,\n\tallowReload: boolean,\n): boolean {\n\treturn !session.isDisposed && epoch === session._contextEpoch && (allowReload || !session._reloadInProgress);\n}\n\nexport function assertContextTransitionCurrent(\n\tsession: AgentSessionInternals,\n\tepoch: number,\n\tallowReload: boolean,\n): void {\n\tif (session._isContextTransitionCurrent(epoch, allowReload)) return;\n\tthrow new Error(\n\t\tsession.isDisposed\n\t\t\t? \"Session is disposed; context transition was cancelled\"\n\t\t\t: session._reloadInProgress\n\t\t\t\t? \"Session reload in progress; context transition was cancelled\"\n\t\t\t\t: \"Context transition was superseded\",\n\t);\n}\n\nexport function enqueueContextTransition<T>(\n\tsession: AgentSessionInternals,\n\toperation: (epoch: number, signal: AbortSignal) => Promise<T>,\n\toptions?: { signal?: AbortSignal; allowReload?: boolean },\n): Promise<T> {\n\tconst allowReload = options?.allowReload ?? false;\n\tif (session.isDisposed) {\n\t\treturn Promise.reject(new Error(\"Session is disposed; context transition is unavailable\"));\n\t}\n\tif (session._reloadInProgress && !allowReload) {\n\t\treturn Promise.reject(new Error(\"Session reload in progress; context transition is unavailable\"));\n\t}\n\tconst epoch = session._contextEpoch;\n\tconst fenceSignal = session._contextTransitionAbortController.signal;\n\tconst signal = options?.signal ? AbortSignal.any([fenceSignal, options.signal]) : fenceSignal;\n\tconst previous = session._activeContextTransition;\n\t// Keep the failure visible to its original caller, but do not poison the\n\t// serialized tail: a later independent context operation may still run.\n\tconst tail = previous?.catch(() => undefined);\n\tconst queued = (tail ?? Promise.resolve()).then(() => {\n\t\tsession._assertContextTransitionCurrent(epoch, allowReload);\n\t\treturn operation(epoch, signal);\n\t});\n\tsession._activeContextTransition = queued;\n\tvoid queued.then(\n\t\t() => {\n\t\t\tif (session._activeContextTransition === queued) session._activeContextTransition = undefined;\n\t\t},\n\t\t() => {\n\t\t\tif (session._activeContextTransition === queued) session._activeContextTransition = undefined;\n\t\t},\n\t);\n\treturn queued;\n}\n\nexport function copyContextMessages(\n\tvalue: unknown,\n\tstrategyName: string,\n\tdirection: \"input\" | \"result\",\n): AgentMessage[] {\n\tif (\n\t\t!Array.isArray(value) ||\n\t\tvalue.some(\n\t\t\t(message) =>\n\t\t\t\ttypeof message !== \"object\" ||\n\t\t\t\tmessage === null ||\n\t\t\t\t!(\"role\" in message) ||\n\t\t\t\ttypeof (message as { role?: unknown }).role !== \"string\",\n\t\t)\n\t) {\n\t\tthrow new Error(\n\t\t\tdirection === \"result\"\n\t\t\t\t? `Context strategy must return an AgentMessage array: ${strategyName}`\n\t\t\t\t: `Context transition requires an AgentMessage array: ${strategyName}`,\n\t\t);\n\t}\n\ttry {\n\t\treturn structuredClone(value) as AgentMessage[];\n\t} catch (error) {\n\t\tthrow new Error(\n\t\t\tdirection === \"result\"\n\t\t\t\t? `Context strategy must return structured-cloneable AgentMessage values: ${strategyName}`\n\t\t\t\t: `Context transition requires structured-cloneable AgentMessage values: ${strategyName}`,\n\t\t\t{ cause: error },\n\t\t);\n\t}\n}\n\n/** Apply a persisted-context transition, including strategy-owned projections. */\nexport function applyContextTransition(\n\tsession: AgentSessionInternals,\n\tmessages: AgentMessage[],\n\treason: ContextOperationOptions[\"reason\"] = \"session_replace\",\n\tsignal?: AbortSignal,\n\toptions?: { allowReload?: boolean },\n): Promise<AgentMessage[]> {\n\treturn session._enqueueContextTransition(\n\t\tasync (epoch, transitionSignal) => {\n\t\t\tconst name = session._contextStrategyName;\n\t\t\tconst runtime = session._capabilityRuntime;\n\t\t\tif (name) {\n\t\t\t\tif (!runtime) {\n\t\t\t\t\tthrow new Error(\"Capability runtime is not available\");\n\t\t\t\t}\n\t\t\t\tif (!runtime.hasContextStrategy(name)) {\n\t\t\t\t\tthrow new Error(`Configured context strategy is not registered: ${name}`);\n\t\t\t\t}\n\t\t\t\tconst replaced = await runtime.replaceContext(name, session._copyContextMessages(messages, name, \"input\"), {\n\t\t\t\t\tsignal: transitionSignal,\n\t\t\t\t\treason,\n\t\t\t\t\tsessionId: session.sessionId,\n\t\t\t\t});\n\t\t\t\tsession._assertContextTransitionCurrent(epoch, options?.allowReload ?? false);\n\t\t\t\tconst committed = session._copyContextMessages(replaced, name, \"result\");\n\t\t\t\tsession._assertContextTransitionCurrent(epoch, options?.allowReload ?? false);\n\t\t\t\tsession.agent.state.messages = committed;\n\t\t\t\tsession._contextRevision += 1;\n\t\t\t\tsession._assertContextTransitionCurrent(epoch, options?.allowReload ?? false);\n\t\t\t\tawait session._dispatchContextReplacedLifecycle(reason, name);\n\t\t\t\treturn committed;\n\t\t\t}\n\t\t\tsession._assertContextTransitionCurrent(epoch, options?.allowReload ?? false);\n\t\t\tsession.agent.state.messages = messages;\n\t\t\tsession._contextRevision += 1;\n\t\t\tsession._assertContextTransitionCurrent(epoch, options?.allowReload ?? false);\n\t\t\tawait session._dispatchContextReplacedLifecycle(reason);\n\t\t\treturn messages;\n\t\t},\n\t\t{ signal, allowReload: options?.allowReload },\n\t);\n}\n\nexport function restoreContextTransition(\n\tsession: AgentSessionInternals,\n\tsnapshot: unknown,\n\treason: NonNullable<ContextOperationOptions[\"reason\"]>,\n\toptions?: { allowReload?: boolean },\n): Promise<AgentMessage[]> {\n\treturn session._enqueueContextTransition(\n\t\tasync (epoch, signal) => {\n\t\t\tconst { runtime, name } = session._requireContextStrategy();\n\t\t\tconst restored = await runtime.restoreContext(name, snapshot, {\n\t\t\t\tsignal,\n\t\t\t\treason,\n\t\t\t\tsessionId: session.sessionId,\n\t\t\t});\n\t\t\tsession._assertContextTransitionCurrent(epoch, options?.allowReload ?? false);\n\t\t\tconst committed = session._copyContextMessages(restored, name, \"result\");\n\t\t\tsession._assertContextTransitionCurrent(epoch, options?.allowReload ?? false);\n\t\t\tsession.agent.state.messages = committed;\n\t\t\tsession._contextRevision += 1;\n\t\t\tsession._assertContextTransitionCurrent(epoch, options?.allowReload ?? false);\n\t\t\tawait session._dispatchContextReplacedLifecycle(reason, name);\n\t\t\treturn committed;\n\t\t},\n\t\t{ allowReload: options?.allowReload },\n\t);\n}\n\n/** Snapshot the current session messages with the configured context strategy. */\nexport async function snapshotContext(session: AgentSessionInternals): Promise<unknown> {\n\tsession._requireIdleContextOperation(\"snapshot context\");\n\tconst { runtime, name } = session._requireContextStrategy();\n\treturn runtime.snapshotContext(name, session._copyContextMessages(session.agent.state.messages, name, \"input\"), {\n\t\treason: \"reload\",\n\t\tsessionId: session.sessionId,\n\t});\n}\n\n/** Restore session messages from a strategy snapshot. */\nexport async function restoreContext(session: AgentSessionInternals, snapshot: unknown): Promise<AgentMessage[]> {\n\tsession._requireIdleContextOperation(\"restore context\");\n\treturn session._restoreContextTransition(snapshot, \"session_replace\");\n}\n\n/** Replace session messages through the configured context strategy. */\nexport async function replaceContext(session: AgentSessionInternals, context: AgentMessage[]): Promise<AgentMessage[]> {\n\tsession._requireIdleContextOperation(\"replace context\");\n\tconst { name } = session._requireContextStrategy();\n\treturn session._applyContextTransition(session._copyContextMessages(context, name, \"input\"), \"session_replace\");\n}\n"]}
|
|
1
|
+
{"version":3,"file":"agent-session-context.js","sourceRoot":"","sources":["../../src/core/agent-session-context.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Context transition pipeline for AgentSession: the strategy gate, the\n * transition fence, and the snapshot/restore/replace operations.\n *\n * Extracted from `agent-session.ts`. Every function here operates on the\n * internal session facade ({@link AgentSessionInternals}); `AgentSession`\n * keeps same-name delegates so call sites, dynamic dispatch, and test spies\n * keep working unchanged. Method-to-method calls that have a facade member go\n * through the session parameter (not direct function calls) to preserve that\n * dispatch — including `session._dispatchContextReplacedLifecycle`, whose\n * delegate stays on the class with the other lifecycle dispatchers and\n * forwards to `agent-session-lifecycle.ts`.\n */\n\nimport type { AgentMessage } from \"@agent-forge/agent-core\";\nimport type { AgentSessionInternals } from \"./agent-session-internal.ts\";\nimport type { CapabilityRuntime, ContextOperationOptions } from \"./extensions/index.ts\";\nimport { t } from \"./i18n/index.ts\";\n\nexport function requireContextStrategy(session: AgentSessionInternals): { runtime: CapabilityRuntime; name: string } {\n\tconst name = session._contextStrategyName;\n\tif (!name) {\n\t\tthrow new Error(t(\"Context strategy is not configured\"));\n\t}\n\tconst runtime = session._capabilityRuntime;\n\tif (!runtime) {\n\t\tthrow new Error(t(\"Capability runtime is not available\"));\n\t}\n\tif (!runtime.hasContextStrategy(name)) {\n\t\tthrow new Error(t(\"Configured context strategy is not registered: {name}\", { name }));\n\t}\n\treturn { runtime, name };\n}\n\nexport function requireIdleContextOperation(session: AgentSessionInternals, operation: string): void {\n\tif (!session.isIdle) {\n\t\tthrow new Error(t(\"Cannot {operation} while the session is running\", { operation }));\n\t}\n}\n\nexport function beginContextTransitionFence(session: AgentSessionInternals): void {\n\tsession._contextEpoch += 1;\n\tsession._contextTransitionAbortController.abort(\"context runtime replaced\");\n\tsession._contextTransitionAbortController = new AbortController();\n}\n\nexport function isContextTransitionCurrent(\n\tsession: AgentSessionInternals,\n\tepoch: number,\n\tallowReload: boolean,\n): boolean {\n\treturn !session.isDisposed && epoch === session._contextEpoch && (allowReload || !session._reloadInProgress);\n}\n\nexport function assertContextTransitionCurrent(\n\tsession: AgentSessionInternals,\n\tepoch: number,\n\tallowReload: boolean,\n): void {\n\tif (session._isContextTransitionCurrent(epoch, allowReload)) return;\n\tthrow new Error(\n\t\tsession.isDisposed\n\t\t\t? t(\"Session is disposed; context transition was cancelled\")\n\t\t\t: session._reloadInProgress\n\t\t\t\t? t(\"Session reload in progress; context transition was cancelled\")\n\t\t\t\t: t(\"Context transition was superseded\"),\n\t);\n}\n\nexport function enqueueContextTransition<T>(\n\tsession: AgentSessionInternals,\n\toperation: (epoch: number, signal: AbortSignal) => Promise<T>,\n\toptions?: { signal?: AbortSignal; allowReload?: boolean },\n): Promise<T> {\n\tconst allowReload = options?.allowReload ?? false;\n\tif (session.isDisposed) {\n\t\treturn Promise.reject(new Error(\"Session is disposed; context transition is unavailable\"));\n\t}\n\tif (session._reloadInProgress && !allowReload) {\n\t\treturn Promise.reject(new Error(\"Session reload in progress; context transition is unavailable\"));\n\t}\n\tconst epoch = session._contextEpoch;\n\tconst fenceSignal = session._contextTransitionAbortController.signal;\n\tconst signal = options?.signal ? AbortSignal.any([fenceSignal, options.signal]) : fenceSignal;\n\tconst previous = session._activeContextTransition;\n\t// Keep the failure visible to its original caller, but do not poison the\n\t// serialized tail: a later independent context operation may still run.\n\tconst tail = previous?.catch(() => undefined);\n\tconst queued = (tail ?? Promise.resolve()).then(() => {\n\t\tsession._assertContextTransitionCurrent(epoch, allowReload);\n\t\treturn operation(epoch, signal);\n\t});\n\tsession._activeContextTransition = queued;\n\tvoid queued.then(\n\t\t() => {\n\t\t\tif (session._activeContextTransition === queued) session._activeContextTransition = undefined;\n\t\t},\n\t\t() => {\n\t\t\tif (session._activeContextTransition === queued) session._activeContextTransition = undefined;\n\t\t},\n\t);\n\treturn queued;\n}\n\nexport function copyContextMessages(\n\tvalue: unknown,\n\tstrategyName: string,\n\tdirection: \"input\" | \"result\",\n): AgentMessage[] {\n\tif (\n\t\t!Array.isArray(value) ||\n\t\tvalue.some(\n\t\t\t(message) =>\n\t\t\t\ttypeof message !== \"object\" ||\n\t\t\t\tmessage === null ||\n\t\t\t\t!(\"role\" in message) ||\n\t\t\t\ttypeof (message as { role?: unknown }).role !== \"string\",\n\t\t)\n\t) {\n\t\tthrow new Error(\n\t\t\tdirection === \"result\"\n\t\t\t\t? t(\"Context strategy must return an AgentMessage array: {strategyName}\", { strategyName })\n\t\t\t\t: t(\"Context transition requires an AgentMessage array: {strategyName}\", { strategyName }),\n\t\t);\n\t}\n\ttry {\n\t\treturn structuredClone(value) as AgentMessage[];\n\t} catch (error) {\n\t\tthrow new Error(\n\t\t\tdirection === \"result\"\n\t\t\t\t? t(\"Context strategy must return structured-cloneable AgentMessage values: {strategyName}\", {\n\t\t\t\t\t\tstrategyName,\n\t\t\t\t\t})\n\t\t\t\t: t(\"Context transition requires structured-cloneable AgentMessage values: {strategyName}\", {\n\t\t\t\t\t\tstrategyName,\n\t\t\t\t\t}),\n\t\t\t{ cause: error },\n\t\t);\n\t}\n}\n\n/** Apply a persisted-context transition, including strategy-owned projections. */\nexport function applyContextTransition(\n\tsession: AgentSessionInternals,\n\tmessages: AgentMessage[],\n\treason: ContextOperationOptions[\"reason\"] = \"session_replace\",\n\tsignal?: AbortSignal,\n\toptions?: { allowReload?: boolean },\n): Promise<AgentMessage[]> {\n\treturn session._enqueueContextTransition(\n\t\tasync (epoch, transitionSignal) => {\n\t\t\tconst name = session._contextStrategyName;\n\t\t\tconst runtime = session._capabilityRuntime;\n\t\t\tif (name) {\n\t\t\t\tif (!runtime) {\n\t\t\t\t\tthrow new Error(t(\"Capability runtime is not available\"));\n\t\t\t\t}\n\t\t\t\tif (!runtime.hasContextStrategy(name)) {\n\t\t\t\t\tthrow new Error(t(\"Configured context strategy is not registered: {name}\", { name }));\n\t\t\t\t}\n\t\t\t\tconst replaced = await runtime.replaceContext(name, session._copyContextMessages(messages, name, \"input\"), {\n\t\t\t\t\tsignal: transitionSignal,\n\t\t\t\t\treason,\n\t\t\t\t\tsessionId: session.sessionId,\n\t\t\t\t});\n\t\t\t\tsession._assertContextTransitionCurrent(epoch, options?.allowReload ?? false);\n\t\t\t\tconst committed = session._copyContextMessages(replaced, name, \"result\");\n\t\t\t\tsession._assertContextTransitionCurrent(epoch, options?.allowReload ?? false);\n\t\t\t\tsession.agent.state.messages = committed;\n\t\t\t\tsession._contextRevision += 1;\n\t\t\t\tsession._assertContextTransitionCurrent(epoch, options?.allowReload ?? false);\n\t\t\t\tawait session._dispatchContextReplacedLifecycle(reason, name);\n\t\t\t\treturn committed;\n\t\t\t}\n\t\t\tsession._assertContextTransitionCurrent(epoch, options?.allowReload ?? false);\n\t\t\tsession.agent.state.messages = messages;\n\t\t\tsession._contextRevision += 1;\n\t\t\tsession._assertContextTransitionCurrent(epoch, options?.allowReload ?? false);\n\t\t\tawait session._dispatchContextReplacedLifecycle(reason);\n\t\t\treturn messages;\n\t\t},\n\t\t{ signal, allowReload: options?.allowReload },\n\t);\n}\n\nexport function restoreContextTransition(\n\tsession: AgentSessionInternals,\n\tsnapshot: unknown,\n\treason: NonNullable<ContextOperationOptions[\"reason\"]>,\n\toptions?: { allowReload?: boolean },\n): Promise<AgentMessage[]> {\n\treturn session._enqueueContextTransition(\n\t\tasync (epoch, signal) => {\n\t\t\tconst { runtime, name } = session._requireContextStrategy();\n\t\t\tconst restored = await runtime.restoreContext(name, snapshot, {\n\t\t\t\tsignal,\n\t\t\t\treason,\n\t\t\t\tsessionId: session.sessionId,\n\t\t\t});\n\t\t\tsession._assertContextTransitionCurrent(epoch, options?.allowReload ?? false);\n\t\t\tconst committed = session._copyContextMessages(restored, name, \"result\");\n\t\t\tsession._assertContextTransitionCurrent(epoch, options?.allowReload ?? false);\n\t\t\tsession.agent.state.messages = committed;\n\t\t\tsession._contextRevision += 1;\n\t\t\tsession._assertContextTransitionCurrent(epoch, options?.allowReload ?? false);\n\t\t\tawait session._dispatchContextReplacedLifecycle(reason, name);\n\t\t\treturn committed;\n\t\t},\n\t\t{ allowReload: options?.allowReload },\n\t);\n}\n\n/** Snapshot the current session messages with the configured context strategy. */\nexport async function snapshotContext(session: AgentSessionInternals): Promise<unknown> {\n\tsession._requireIdleContextOperation(\"snapshot context\");\n\tconst { runtime, name } = session._requireContextStrategy();\n\treturn runtime.snapshotContext(name, session._copyContextMessages(session.agent.state.messages, name, \"input\"), {\n\t\treason: \"reload\",\n\t\tsessionId: session.sessionId,\n\t});\n}\n\n/** Restore session messages from a strategy snapshot. */\nexport async function restoreContext(session: AgentSessionInternals, snapshot: unknown): Promise<AgentMessage[]> {\n\tsession._requireIdleContextOperation(\"restore context\");\n\treturn session._restoreContextTransition(snapshot, \"session_replace\");\n}\n\n/** Replace session messages through the configured context strategy. */\nexport async function replaceContext(session: AgentSessionInternals, context: AgentMessage[]): Promise<AgentMessage[]> {\n\tsession._requireIdleContextOperation(\"replace context\");\n\tconst { name } = session._requireContextStrategy();\n\treturn session._applyContextTransition(session._copyContextMessages(context, name, \"input\"), \"session_replace\");\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-session-model.d.ts","sourceRoot":"","sources":["../../src/core/agent-session-model.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAC;AAEzD,OAAO,KAAK,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AACjF,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AAGzE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAEnE,wBAAsB,eAAe,CACpC,OAAO,EAAE,qBAAqB,EAC9B,SAAS,EAAE,KAAK,CAAC,GAAG,CAAC,EACrB,aAAa,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,SAAS,EACrC,MAAM,EAAE,KAAK,GAAG,OAAO,GAAG,SAAS,GACjC,OAAO,CAAC,IAAI,CAAC,CAGf;AAED;;;;;GAKG;AACH,wBAAsB,QAAQ,CAC7B,OAAO,EAAE,qBAAqB,EAC9B,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,EACjB,OAAO,GAAE,oBAAyB,GAChC,OAAO,CAAC,IAAI,CAAC,CAoBf;AAED,wBAAgB,kCAAkC,CAAC,OAAO,EAAE,qBAAqB,EAAE,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,IAAI,CAY1G;AAED;;;;;GAKG;AACH,wBAAsB,UAAU,CAC/B,OAAO,EAAE,qBAAqB,EAC9B,SAAS,GAAE,SAAS,GAAG,UAAsB,EAC7C,OAAO,GAAE,oBAAyB,GAChC,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAAC,CAKvC;AAED,wBAAsB,gBAAgB,CACrC,OAAO,EAAE,qBAAqB,EAC9B,SAAS,EAAE,SAAS,GAAG,UAAU,EACjC,OAAO,EAAE,oBAAoB,GAC3B,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAAC,CAoCvC;AAED,wBAAsB,mBAAmB,CACxC,OAAO,EAAE,qBAAqB,EAC9B,SAAS,EAAE,SAAS,GAAG,UAAU,EACjC,OAAO,EAAE,oBAAoB,GAC3B,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAAC,CA2BvC;AAED,sDAAsD;AACtD,wBAAgB,eAAe,CAC9B,OAAO,EAAE,qBAAqB,GAC5B,aAAa,CAAC;IAAE,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;IAAC,aAAa,CAAC,EAAE,aAAa,CAAA;CAAE,CAAC,CAErE;AAED,+FAA+F;AAC/F,wBAAgB,cAAc,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,gBAAgB,CAQlE;AAED,wCAAwC;AACxC,wBAAgB,eAAe,CAC9B,OAAO,EAAE,qBAAqB,EAC9B,YAAY,EAAE,KAAK,CAAC;IAAE,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;IAAC,aAAa,CAAC,EAAE,aAAa,CAAA;CAAE,CAAC,GACvE,IAAI,CAEN;AAED,wBAAgB,8BAA8B,CAC7C,OAAO,EAAE,qBAAqB,EAC9B,WAAW,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,EACxB,aAAa,CAAC,EAAE,aAAa,GAC3B,aAAa,CAYf","sourcesContent":["/**\n * Model selection and thinking-level resolution for AgentSession.\n *\n * Extracted from `agent-session.ts`. Every function here operates on the\n * internal session facade ({@link AgentSessionInternals}); `AgentSession`\n * keeps same-name delegates so call sites, dynamic dispatch, and test spies\n * keep working unchanged. Method-to-method calls that have a facade member go\n * through the session parameter (not direct function calls) to preserve that\n * dispatch. `setModel` and `cycleModel` stay parallel implementations: each\n * keeps its own apply/persist/thinking/model_select sequence and never calls\n * the other.\n */\n\nimport type { ThinkingLevel } from \"@agent-forge/agent-core\";\nimport type { Api, Model } from \"@agent-forge/ai/compat\";\nimport { modelsAreEqual } from \"@agent-forge/ai/compat\";\nimport type { ModelCycleResult, ModelMutationOptions } from \"./agent-session.ts\";\nimport type { AgentSessionInternals } from \"./agent-session-internal.ts\";\nimport { dispatchModelSelectLifecycle } from \"./agent-session-lifecycle.ts\";\nimport { DEFAULT_THINKING_LEVEL } from \"./defaults.ts\";\nimport type { ModelFactsViewV1 } from \"./extensions/public-api.ts\";\n\nexport async function emitModelSelect(\n\tsession: AgentSessionInternals,\n\tnextModel: Model<Api>,\n\tpreviousModel: Model<Api> | undefined,\n\tsource: \"set\" | \"cycle\" | \"restore\",\n): Promise<void> {\n\tif (modelsAreEqual(previousModel, nextModel)) return;\n\tawait dispatchModelSelectLifecycle(session, { provider: nextModel.provider, id: nextModel.id }, source);\n}\n\n/**\n * Set model directly.\n * Validates that auth is configured and saves to the session transcript.\n * Persists to global defaults only when options.persist is true.\n * @throws Error if no auth is configured for the model\n */\nexport async function setModel(\n\tsession: AgentSessionInternals,\n\tmodel: Model<Api>,\n\toptions: ModelMutationOptions = {},\n): Promise<void> {\n\tif (!(await session._modelRuntime.checkAuth(model.provider))) {\n\t\tthrow new Error(`No API key for ${model.provider}/${model.id}`);\n\t}\n\n\tconst previousModel = session.model;\n\tconst thinkingLevel = session._getThinkingLevelForModelSwitch(model);\n\tsession.agent.state.model = model;\n\tsession.sessionManager.appendModelChange(model.provider, model.id);\n\tif (options.persist) {\n\t\tsession.settingsManager.setDefaultModelAndProvider(model.provider, model.id);\n\t\tsession._addPersistedDefaultToNonEmptyScope(model);\n\t}\n\n\t// Apply thinking level for the new model.\n\t// Per-model thinking level overrides take priority over the global default.\n\t// Model persistence does not implicitly rewrite the global thinking default.\n\tsession.setThinkingLevel(thinkingLevel);\n\n\tawait session._emitModelSelect(model, previousModel, \"set\");\n}\n\nexport function addPersistedDefaultToNonEmptyScope(session: AgentSessionInternals, model: Model<Api>): void {\n\tif (session._scopedModels.length === 0) return;\n\tif (session._scopedModels.some((scoped) => modelsAreEqual(scoped.model, model))) return;\n\n\tsession._scopedModels = [...session._scopedModels, { model }];\n\n\tconst enabledModels = session.settingsManager.getEnabledModels();\n\tif (!enabledModels?.length) return;\n\n\tconst modelReference = `${model.provider}/${model.id}`;\n\tif (enabledModels.some((pattern) => pattern.toLowerCase() === modelReference.toLowerCase())) return;\n\tsession.settingsManager.setEnabledModels([...enabledModels, modelReference]);\n}\n\n/**\n * Cycle to next/previous model.\n * Uses scoped models (from --models flag) if available, otherwise all available models.\n * @param direction - \"forward\" (default) or \"backward\"\n * @returns The new model info, or undefined if only one model available\n */\nexport async function cycleModel(\n\tsession: AgentSessionInternals,\n\tdirection: \"forward\" | \"backward\" = \"forward\",\n\toptions: ModelMutationOptions = {},\n): Promise<ModelCycleResult | undefined> {\n\tif (session._scopedModels.length > 0) {\n\t\treturn session._cycleScopedModel(direction, options);\n\t}\n\treturn session._cycleAvailableModel(direction, options);\n}\n\nexport async function cycleScopedModel(\n\tsession: AgentSessionInternals,\n\tdirection: \"forward\" | \"backward\",\n\toptions: ModelMutationOptions,\n): Promise<ModelCycleResult | undefined> {\n\tconst availableIds = new Set(\n\t\tsession._modelRuntime.getAvailableSnapshot().map((model) => `${model.provider}\\0${model.id}`),\n\t);\n\tconst scopedModels = session._scopedModels.filter((scoped) =>\n\t\tavailableIds.has(`${scoped.model.provider}\\0${scoped.model.id}`),\n\t);\n\tif (scopedModels.length <= 1) return undefined;\n\n\tconst currentModel = session.model;\n\tlet currentIndex = scopedModels.findIndex((sm) => modelsAreEqual(sm.model, currentModel));\n\n\tif (currentIndex === -1) currentIndex = 0;\n\tconst len = scopedModels.length;\n\tconst nextIndex = direction === \"forward\" ? (currentIndex + 1) % len : (currentIndex - 1 + len) % len;\n\tconst next = scopedModels[nextIndex];\n\tconst thinkingLevel = session._getThinkingLevelForModelSwitch(next.model, next.thinkingLevel);\n\n\t// Apply model\n\tsession.agent.state.model = next.model;\n\tsession.sessionManager.appendModelChange(next.model.provider, next.model.id);\n\tif (options.persist) {\n\t\tsession.settingsManager.setDefaultModelAndProvider(next.model.provider, next.model.id);\n\t\tsession._addPersistedDefaultToNonEmptyScope(next.model);\n\t}\n\n\t// Apply thinking level for the new model.\n\t// - Explicit scoped model thinking level overrides defaults\n\t// - Per-model thinking level overrides take priority over the global default\n\t// setThinkingLevel clamps to model capabilities.\n\t// Model persistence does not implicitly rewrite the global thinking default.\n\tsession.setThinkingLevel(thinkingLevel);\n\n\tawait session._emitModelSelect(next.model, currentModel, \"cycle\");\n\n\treturn { model: next.model, thinkingLevel: session.thinkingLevel, isScoped: true };\n}\n\nexport async function cycleAvailableModel(\n\tsession: AgentSessionInternals,\n\tdirection: \"forward\" | \"backward\",\n\toptions: ModelMutationOptions,\n): Promise<ModelCycleResult | undefined> {\n\tconst availableModels = session._modelRuntime.getAvailableSnapshot();\n\tif (availableModels.length <= 1) return undefined;\n\n\tconst currentModel = session.model;\n\tlet currentIndex = availableModels.findIndex((m) => modelsAreEqual(m, currentModel));\n\n\tif (currentIndex === -1) currentIndex = 0;\n\tconst len = availableModels.length;\n\tconst nextIndex = direction === \"forward\" ? (currentIndex + 1) % len : (currentIndex - 1 + len) % len;\n\tconst nextModel = availableModels[nextIndex];\n\n\tconst thinkingLevel = session._getThinkingLevelForModelSwitch(nextModel);\n\tsession.agent.state.model = nextModel;\n\tsession.sessionManager.appendModelChange(nextModel.provider, nextModel.id);\n\tif (options.persist) {\n\t\tsession.settingsManager.setDefaultModelAndProvider(nextModel.provider, nextModel.id);\n\t\tsession._addPersistedDefaultToNonEmptyScope(nextModel);\n\t}\n\n\t// Apply thinking level for the new model.\n\t// Model persistence does not implicitly rewrite the global thinking default.\n\tsession.setThinkingLevel(thinkingLevel);\n\n\tawait session._emitModelSelect(nextModel, currentModel, \"cycle\");\n\n\treturn { model: nextModel, thinkingLevel: session.thinkingLevel, isScoped: false };\n}\n\n/** Scoped models for cycling (from --models flag). */\nexport function getScopedModels(\n\tsession: AgentSessionInternals,\n): ReadonlyArray<{ model: Model<Api>; thinkingLevel?: ThinkingLevel }> {\n\treturn session._scopedModels;\n}\n\n/** Project provider-agnostic facts off a Model without exposing api/headers/cost internals. */\nexport function modelFactsView(model: Model<Api>): ModelFactsViewV1 {\n\treturn {\n\t\tprovider: model.provider,\n\t\tid: model.id,\n\t\tcontextWindow: model.contextWindow,\n\t\tmaxTokens: model.maxTokens,\n\t\treasoning: model.reasoning,\n\t};\n}\n\n/** Update scoped models for cycling. */\nexport function setScopedModels(\n\tsession: AgentSessionInternals,\n\tscopedModels: Array<{ model: Model<Api>; thinkingLevel?: ThinkingLevel }>,\n): void {\n\tsession._scopedModels = scopedModels;\n}\n\nexport function getThinkingLevelForModelSwitch(\n\tsession: AgentSessionInternals,\n\ttargetModel?: Model<Api>,\n\texplicitLevel?: ThinkingLevel,\n): ThinkingLevel {\n\tif (explicitLevel !== undefined) {\n\t\treturn explicitLevel;\n\t}\n\t// Per-model default takes priority when switching to a model that has one\n\tif (targetModel) {\n\t\tconst perModel = session.settingsManager.getModelThinkingLevel(targetModel.provider, targetModel.id);\n\t\tif (perModel !== undefined) {\n\t\t\treturn perModel;\n\t\t}\n\t}\n\treturn session.settingsManager.getDefaultThinkingLevel() ?? session.thinkingLevel ?? DEFAULT_THINKING_LEVEL;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"agent-session-model.d.ts","sourceRoot":"","sources":["../../src/core/agent-session-model.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAC;AAEzD,OAAO,KAAK,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AACjF,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AAGzE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAGnE,wBAAsB,eAAe,CACpC,OAAO,EAAE,qBAAqB,EAC9B,SAAS,EAAE,KAAK,CAAC,GAAG,CAAC,EACrB,aAAa,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,SAAS,EACrC,MAAM,EAAE,KAAK,GAAG,OAAO,GAAG,SAAS,GACjC,OAAO,CAAC,IAAI,CAAC,CAGf;AAED;;;;;GAKG;AACH,wBAAsB,QAAQ,CAC7B,OAAO,EAAE,qBAAqB,EAC9B,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,EACjB,OAAO,GAAE,oBAAyB,GAChC,OAAO,CAAC,IAAI,CAAC,CAoBf;AAED,wBAAgB,kCAAkC,CAAC,OAAO,EAAE,qBAAqB,EAAE,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,IAAI,CAY1G;AAED;;;;;GAKG;AACH,wBAAsB,UAAU,CAC/B,OAAO,EAAE,qBAAqB,EAC9B,SAAS,GAAE,SAAS,GAAG,UAAsB,EAC7C,OAAO,GAAE,oBAAyB,GAChC,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAAC,CAKvC;AAED,wBAAsB,gBAAgB,CACrC,OAAO,EAAE,qBAAqB,EAC9B,SAAS,EAAE,SAAS,GAAG,UAAU,EACjC,OAAO,EAAE,oBAAoB,GAC3B,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAAC,CAoCvC;AAED,wBAAsB,mBAAmB,CACxC,OAAO,EAAE,qBAAqB,EAC9B,SAAS,EAAE,SAAS,GAAG,UAAU,EACjC,OAAO,EAAE,oBAAoB,GAC3B,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAAC,CA2BvC;AAED,sDAAsD;AACtD,wBAAgB,eAAe,CAC9B,OAAO,EAAE,qBAAqB,GAC5B,aAAa,CAAC;IAAE,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;IAAC,aAAa,CAAC,EAAE,aAAa,CAAA;CAAE,CAAC,CAErE;AAED,+FAA+F;AAC/F,wBAAgB,cAAc,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,gBAAgB,CAQlE;AAED,wCAAwC;AACxC,wBAAgB,eAAe,CAC9B,OAAO,EAAE,qBAAqB,EAC9B,YAAY,EAAE,KAAK,CAAC;IAAE,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;IAAC,aAAa,CAAC,EAAE,aAAa,CAAA;CAAE,CAAC,GACvE,IAAI,CAEN;AAED,wBAAgB,8BAA8B,CAC7C,OAAO,EAAE,qBAAqB,EAC9B,WAAW,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,EACxB,aAAa,CAAC,EAAE,aAAa,GAC3B,aAAa,CAYf","sourcesContent":["/**\n * Model selection and thinking-level resolution for AgentSession.\n *\n * Extracted from `agent-session.ts`. Every function here operates on the\n * internal session facade ({@link AgentSessionInternals}); `AgentSession`\n * keeps same-name delegates so call sites, dynamic dispatch, and test spies\n * keep working unchanged. Method-to-method calls that have a facade member go\n * through the session parameter (not direct function calls) to preserve that\n * dispatch. `setModel` and `cycleModel` stay parallel implementations: each\n * keeps its own apply/persist/thinking/model_select sequence and never calls\n * the other.\n */\n\nimport type { ThinkingLevel } from \"@agent-forge/agent-core\";\nimport type { Api, Model } from \"@agent-forge/ai/compat\";\nimport { modelsAreEqual } from \"@agent-forge/ai/compat\";\nimport type { ModelCycleResult, ModelMutationOptions } from \"./agent-session.ts\";\nimport type { AgentSessionInternals } from \"./agent-session-internal.ts\";\nimport { dispatchModelSelectLifecycle } from \"./agent-session-lifecycle.ts\";\nimport { DEFAULT_THINKING_LEVEL } from \"./defaults.ts\";\nimport type { ModelFactsViewV1 } from \"./extensions/public-api.ts\";\nimport { t } from \"./i18n/index.ts\";\n\nexport async function emitModelSelect(\n\tsession: AgentSessionInternals,\n\tnextModel: Model<Api>,\n\tpreviousModel: Model<Api> | undefined,\n\tsource: \"set\" | \"cycle\" | \"restore\",\n): Promise<void> {\n\tif (modelsAreEqual(previousModel, nextModel)) return;\n\tawait dispatchModelSelectLifecycle(session, { provider: nextModel.provider, id: nextModel.id }, source);\n}\n\n/**\n * Set model directly.\n * Validates that auth is configured and saves to the session transcript.\n * Persists to global defaults only when options.persist is true.\n * @throws Error if no auth is configured for the model\n */\nexport async function setModel(\n\tsession: AgentSessionInternals,\n\tmodel: Model<Api>,\n\toptions: ModelMutationOptions = {},\n): Promise<void> {\n\tif (!(await session._modelRuntime.checkAuth(model.provider))) {\n\t\tthrow new Error(t(\"No API key for {provider}/{model}\", { provider: model.provider, model: model.id }));\n\t}\n\n\tconst previousModel = session.model;\n\tconst thinkingLevel = session._getThinkingLevelForModelSwitch(model);\n\tsession.agent.state.model = model;\n\tsession.sessionManager.appendModelChange(model.provider, model.id);\n\tif (options.persist) {\n\t\tsession.settingsManager.setDefaultModelAndProvider(model.provider, model.id);\n\t\tsession._addPersistedDefaultToNonEmptyScope(model);\n\t}\n\n\t// Apply thinking level for the new model.\n\t// Per-model thinking level overrides take priority over the global default.\n\t// Model persistence does not implicitly rewrite the global thinking default.\n\tsession.setThinkingLevel(thinkingLevel);\n\n\tawait session._emitModelSelect(model, previousModel, \"set\");\n}\n\nexport function addPersistedDefaultToNonEmptyScope(session: AgentSessionInternals, model: Model<Api>): void {\n\tif (session._scopedModels.length === 0) return;\n\tif (session._scopedModels.some((scoped) => modelsAreEqual(scoped.model, model))) return;\n\n\tsession._scopedModels = [...session._scopedModels, { model }];\n\n\tconst enabledModels = session.settingsManager.getEnabledModels();\n\tif (!enabledModels?.length) return;\n\n\tconst modelReference = `${model.provider}/${model.id}`;\n\tif (enabledModels.some((pattern) => pattern.toLowerCase() === modelReference.toLowerCase())) return;\n\tsession.settingsManager.setEnabledModels([...enabledModels, modelReference]);\n}\n\n/**\n * Cycle to next/previous model.\n * Uses scoped models (from --models flag) if available, otherwise all available models.\n * @param direction - \"forward\" (default) or \"backward\"\n * @returns The new model info, or undefined if only one model available\n */\nexport async function cycleModel(\n\tsession: AgentSessionInternals,\n\tdirection: \"forward\" | \"backward\" = \"forward\",\n\toptions: ModelMutationOptions = {},\n): Promise<ModelCycleResult | undefined> {\n\tif (session._scopedModels.length > 0) {\n\t\treturn session._cycleScopedModel(direction, options);\n\t}\n\treturn session._cycleAvailableModel(direction, options);\n}\n\nexport async function cycleScopedModel(\n\tsession: AgentSessionInternals,\n\tdirection: \"forward\" | \"backward\",\n\toptions: ModelMutationOptions,\n): Promise<ModelCycleResult | undefined> {\n\tconst availableIds = new Set(\n\t\tsession._modelRuntime.getAvailableSnapshot().map((model) => `${model.provider}\\0${model.id}`),\n\t);\n\tconst scopedModels = session._scopedModels.filter((scoped) =>\n\t\tavailableIds.has(`${scoped.model.provider}\\0${scoped.model.id}`),\n\t);\n\tif (scopedModels.length <= 1) return undefined;\n\n\tconst currentModel = session.model;\n\tlet currentIndex = scopedModels.findIndex((sm) => modelsAreEqual(sm.model, currentModel));\n\n\tif (currentIndex === -1) currentIndex = 0;\n\tconst len = scopedModels.length;\n\tconst nextIndex = direction === \"forward\" ? (currentIndex + 1) % len : (currentIndex - 1 + len) % len;\n\tconst next = scopedModels[nextIndex];\n\tconst thinkingLevel = session._getThinkingLevelForModelSwitch(next.model, next.thinkingLevel);\n\n\t// Apply model\n\tsession.agent.state.model = next.model;\n\tsession.sessionManager.appendModelChange(next.model.provider, next.model.id);\n\tif (options.persist) {\n\t\tsession.settingsManager.setDefaultModelAndProvider(next.model.provider, next.model.id);\n\t\tsession._addPersistedDefaultToNonEmptyScope(next.model);\n\t}\n\n\t// Apply thinking level for the new model.\n\t// - Explicit scoped model thinking level overrides defaults\n\t// - Per-model thinking level overrides take priority over the global default\n\t// setThinkingLevel clamps to model capabilities.\n\t// Model persistence does not implicitly rewrite the global thinking default.\n\tsession.setThinkingLevel(thinkingLevel);\n\n\tawait session._emitModelSelect(next.model, currentModel, \"cycle\");\n\n\treturn { model: next.model, thinkingLevel: session.thinkingLevel, isScoped: true };\n}\n\nexport async function cycleAvailableModel(\n\tsession: AgentSessionInternals,\n\tdirection: \"forward\" | \"backward\",\n\toptions: ModelMutationOptions,\n): Promise<ModelCycleResult | undefined> {\n\tconst availableModels = session._modelRuntime.getAvailableSnapshot();\n\tif (availableModels.length <= 1) return undefined;\n\n\tconst currentModel = session.model;\n\tlet currentIndex = availableModels.findIndex((m) => modelsAreEqual(m, currentModel));\n\n\tif (currentIndex === -1) currentIndex = 0;\n\tconst len = availableModels.length;\n\tconst nextIndex = direction === \"forward\" ? (currentIndex + 1) % len : (currentIndex - 1 + len) % len;\n\tconst nextModel = availableModels[nextIndex];\n\n\tconst thinkingLevel = session._getThinkingLevelForModelSwitch(nextModel);\n\tsession.agent.state.model = nextModel;\n\tsession.sessionManager.appendModelChange(nextModel.provider, nextModel.id);\n\tif (options.persist) {\n\t\tsession.settingsManager.setDefaultModelAndProvider(nextModel.provider, nextModel.id);\n\t\tsession._addPersistedDefaultToNonEmptyScope(nextModel);\n\t}\n\n\t// Apply thinking level for the new model.\n\t// Model persistence does not implicitly rewrite the global thinking default.\n\tsession.setThinkingLevel(thinkingLevel);\n\n\tawait session._emitModelSelect(nextModel, currentModel, \"cycle\");\n\n\treturn { model: nextModel, thinkingLevel: session.thinkingLevel, isScoped: false };\n}\n\n/** Scoped models for cycling (from --models flag). */\nexport function getScopedModels(\n\tsession: AgentSessionInternals,\n): ReadonlyArray<{ model: Model<Api>; thinkingLevel?: ThinkingLevel }> {\n\treturn session._scopedModels;\n}\n\n/** Project provider-agnostic facts off a Model without exposing api/headers/cost internals. */\nexport function modelFactsView(model: Model<Api>): ModelFactsViewV1 {\n\treturn {\n\t\tprovider: model.provider,\n\t\tid: model.id,\n\t\tcontextWindow: model.contextWindow,\n\t\tmaxTokens: model.maxTokens,\n\t\treasoning: model.reasoning,\n\t};\n}\n\n/** Update scoped models for cycling. */\nexport function setScopedModels(\n\tsession: AgentSessionInternals,\n\tscopedModels: Array<{ model: Model<Api>; thinkingLevel?: ThinkingLevel }>,\n): void {\n\tsession._scopedModels = scopedModels;\n}\n\nexport function getThinkingLevelForModelSwitch(\n\tsession: AgentSessionInternals,\n\ttargetModel?: Model<Api>,\n\texplicitLevel?: ThinkingLevel,\n): ThinkingLevel {\n\tif (explicitLevel !== undefined) {\n\t\treturn explicitLevel;\n\t}\n\t// Per-model default takes priority when switching to a model that has one\n\tif (targetModel) {\n\t\tconst perModel = session.settingsManager.getModelThinkingLevel(targetModel.provider, targetModel.id);\n\t\tif (perModel !== undefined) {\n\t\t\treturn perModel;\n\t\t}\n\t}\n\treturn session.settingsManager.getDefaultThinkingLevel() ?? session.thinkingLevel ?? DEFAULT_THINKING_LEVEL;\n}\n"]}
|
|
@@ -13,6 +13,7 @@
|
|
|
13
13
|
import { modelsAreEqual } from "@agent-forge/ai/compat";
|
|
14
14
|
import { dispatchModelSelectLifecycle } from "./agent-session-lifecycle.js";
|
|
15
15
|
import { DEFAULT_THINKING_LEVEL } from "./defaults.js";
|
|
16
|
+
import { t } from "./i18n/index.js";
|
|
16
17
|
export async function emitModelSelect(session, nextModel, previousModel, source) {
|
|
17
18
|
if (modelsAreEqual(previousModel, nextModel))
|
|
18
19
|
return;
|
|
@@ -26,7 +27,7 @@ export async function emitModelSelect(session, nextModel, previousModel, source)
|
|
|
26
27
|
*/
|
|
27
28
|
export async function setModel(session, model, options = {}) {
|
|
28
29
|
if (!(await session._modelRuntime.checkAuth(model.provider))) {
|
|
29
|
-
throw new Error(
|
|
30
|
+
throw new Error(t("No API key for {provider}/{model}", { provider: model.provider, model: model.id }));
|
|
30
31
|
}
|
|
31
32
|
const previousModel = session.model;
|
|
32
33
|
const thinkingLevel = session._getThinkingLevelForModelSwitch(model);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-session-model.js","sourceRoot":"","sources":["../../src/core/agent-session-model.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Model selection and thinking-level resolution for AgentSession.\n *\n * Extracted from `agent-session.ts`. Every function here operates on the\n * internal session facade ({@link AgentSessionInternals}); `AgentSession`\n * keeps same-name delegates so call sites, dynamic dispatch, and test spies\n * keep working unchanged. Method-to-method calls that have a facade member go\n * through the session parameter (not direct function calls) to preserve that\n * dispatch. `setModel` and `cycleModel` stay parallel implementations: each\n * keeps its own apply/persist/thinking/model_select sequence and never calls\n * the other.\n */\n\nimport type { ThinkingLevel } from \"@agent-forge/agent-core\";\nimport type { Api, Model } from \"@agent-forge/ai/compat\";\nimport { modelsAreEqual } from \"@agent-forge/ai/compat\";\nimport type { ModelCycleResult, ModelMutationOptions } from \"./agent-session.ts\";\nimport type { AgentSessionInternals } from \"./agent-session-internal.ts\";\nimport { dispatchModelSelectLifecycle } from \"./agent-session-lifecycle.ts\";\nimport { DEFAULT_THINKING_LEVEL } from \"./defaults.ts\";\nimport type { ModelFactsViewV1 } from \"./extensions/public-api.ts\";\n\nexport async function emitModelSelect(\n\tsession: AgentSessionInternals,\n\tnextModel: Model<Api>,\n\tpreviousModel: Model<Api> | undefined,\n\tsource: \"set\" | \"cycle\" | \"restore\",\n): Promise<void> {\n\tif (modelsAreEqual(previousModel, nextModel)) return;\n\tawait dispatchModelSelectLifecycle(session, { provider: nextModel.provider, id: nextModel.id }, source);\n}\n\n/**\n * Set model directly.\n * Validates that auth is configured and saves to the session transcript.\n * Persists to global defaults only when options.persist is true.\n * @throws Error if no auth is configured for the model\n */\nexport async function setModel(\n\tsession: AgentSessionInternals,\n\tmodel: Model<Api>,\n\toptions: ModelMutationOptions = {},\n): Promise<void> {\n\tif (!(await session._modelRuntime.checkAuth(model.provider))) {\n\t\tthrow new Error(`No API key for ${model.provider}/${model.id}`);\n\t}\n\n\tconst previousModel = session.model;\n\tconst thinkingLevel = session._getThinkingLevelForModelSwitch(model);\n\tsession.agent.state.model = model;\n\tsession.sessionManager.appendModelChange(model.provider, model.id);\n\tif (options.persist) {\n\t\tsession.settingsManager.setDefaultModelAndProvider(model.provider, model.id);\n\t\tsession._addPersistedDefaultToNonEmptyScope(model);\n\t}\n\n\t// Apply thinking level for the new model.\n\t// Per-model thinking level overrides take priority over the global default.\n\t// Model persistence does not implicitly rewrite the global thinking default.\n\tsession.setThinkingLevel(thinkingLevel);\n\n\tawait session._emitModelSelect(model, previousModel, \"set\");\n}\n\nexport function addPersistedDefaultToNonEmptyScope(session: AgentSessionInternals, model: Model<Api>): void {\n\tif (session._scopedModels.length === 0) return;\n\tif (session._scopedModels.some((scoped) => modelsAreEqual(scoped.model, model))) return;\n\n\tsession._scopedModels = [...session._scopedModels, { model }];\n\n\tconst enabledModels = session.settingsManager.getEnabledModels();\n\tif (!enabledModels?.length) return;\n\n\tconst modelReference = `${model.provider}/${model.id}`;\n\tif (enabledModels.some((pattern) => pattern.toLowerCase() === modelReference.toLowerCase())) return;\n\tsession.settingsManager.setEnabledModels([...enabledModels, modelReference]);\n}\n\n/**\n * Cycle to next/previous model.\n * Uses scoped models (from --models flag) if available, otherwise all available models.\n * @param direction - \"forward\" (default) or \"backward\"\n * @returns The new model info, or undefined if only one model available\n */\nexport async function cycleModel(\n\tsession: AgentSessionInternals,\n\tdirection: \"forward\" | \"backward\" = \"forward\",\n\toptions: ModelMutationOptions = {},\n): Promise<ModelCycleResult | undefined> {\n\tif (session._scopedModels.length > 0) {\n\t\treturn session._cycleScopedModel(direction, options);\n\t}\n\treturn session._cycleAvailableModel(direction, options);\n}\n\nexport async function cycleScopedModel(\n\tsession: AgentSessionInternals,\n\tdirection: \"forward\" | \"backward\",\n\toptions: ModelMutationOptions,\n): Promise<ModelCycleResult | undefined> {\n\tconst availableIds = new Set(\n\t\tsession._modelRuntime.getAvailableSnapshot().map((model) => `${model.provider}\\0${model.id}`),\n\t);\n\tconst scopedModels = session._scopedModels.filter((scoped) =>\n\t\tavailableIds.has(`${scoped.model.provider}\\0${scoped.model.id}`),\n\t);\n\tif (scopedModels.length <= 1) return undefined;\n\n\tconst currentModel = session.model;\n\tlet currentIndex = scopedModels.findIndex((sm) => modelsAreEqual(sm.model, currentModel));\n\n\tif (currentIndex === -1) currentIndex = 0;\n\tconst len = scopedModels.length;\n\tconst nextIndex = direction === \"forward\" ? (currentIndex + 1) % len : (currentIndex - 1 + len) % len;\n\tconst next = scopedModels[nextIndex];\n\tconst thinkingLevel = session._getThinkingLevelForModelSwitch(next.model, next.thinkingLevel);\n\n\t// Apply model\n\tsession.agent.state.model = next.model;\n\tsession.sessionManager.appendModelChange(next.model.provider, next.model.id);\n\tif (options.persist) {\n\t\tsession.settingsManager.setDefaultModelAndProvider(next.model.provider, next.model.id);\n\t\tsession._addPersistedDefaultToNonEmptyScope(next.model);\n\t}\n\n\t// Apply thinking level for the new model.\n\t// - Explicit scoped model thinking level overrides defaults\n\t// - Per-model thinking level overrides take priority over the global default\n\t// setThinkingLevel clamps to model capabilities.\n\t// Model persistence does not implicitly rewrite the global thinking default.\n\tsession.setThinkingLevel(thinkingLevel);\n\n\tawait session._emitModelSelect(next.model, currentModel, \"cycle\");\n\n\treturn { model: next.model, thinkingLevel: session.thinkingLevel, isScoped: true };\n}\n\nexport async function cycleAvailableModel(\n\tsession: AgentSessionInternals,\n\tdirection: \"forward\" | \"backward\",\n\toptions: ModelMutationOptions,\n): Promise<ModelCycleResult | undefined> {\n\tconst availableModels = session._modelRuntime.getAvailableSnapshot();\n\tif (availableModels.length <= 1) return undefined;\n\n\tconst currentModel = session.model;\n\tlet currentIndex = availableModels.findIndex((m) => modelsAreEqual(m, currentModel));\n\n\tif (currentIndex === -1) currentIndex = 0;\n\tconst len = availableModels.length;\n\tconst nextIndex = direction === \"forward\" ? (currentIndex + 1) % len : (currentIndex - 1 + len) % len;\n\tconst nextModel = availableModels[nextIndex];\n\n\tconst thinkingLevel = session._getThinkingLevelForModelSwitch(nextModel);\n\tsession.agent.state.model = nextModel;\n\tsession.sessionManager.appendModelChange(nextModel.provider, nextModel.id);\n\tif (options.persist) {\n\t\tsession.settingsManager.setDefaultModelAndProvider(nextModel.provider, nextModel.id);\n\t\tsession._addPersistedDefaultToNonEmptyScope(nextModel);\n\t}\n\n\t// Apply thinking level for the new model.\n\t// Model persistence does not implicitly rewrite the global thinking default.\n\tsession.setThinkingLevel(thinkingLevel);\n\n\tawait session._emitModelSelect(nextModel, currentModel, \"cycle\");\n\n\treturn { model: nextModel, thinkingLevel: session.thinkingLevel, isScoped: false };\n}\n\n/** Scoped models for cycling (from --models flag). */\nexport function getScopedModels(\n\tsession: AgentSessionInternals,\n): ReadonlyArray<{ model: Model<Api>; thinkingLevel?: ThinkingLevel }> {\n\treturn session._scopedModels;\n}\n\n/** Project provider-agnostic facts off a Model without exposing api/headers/cost internals. */\nexport function modelFactsView(model: Model<Api>): ModelFactsViewV1 {\n\treturn {\n\t\tprovider: model.provider,\n\t\tid: model.id,\n\t\tcontextWindow: model.contextWindow,\n\t\tmaxTokens: model.maxTokens,\n\t\treasoning: model.reasoning,\n\t};\n}\n\n/** Update scoped models for cycling. */\nexport function setScopedModels(\n\tsession: AgentSessionInternals,\n\tscopedModels: Array<{ model: Model<Api>; thinkingLevel?: ThinkingLevel }>,\n): void {\n\tsession._scopedModels = scopedModels;\n}\n\nexport function getThinkingLevelForModelSwitch(\n\tsession: AgentSessionInternals,\n\ttargetModel?: Model<Api>,\n\texplicitLevel?: ThinkingLevel,\n): ThinkingLevel {\n\tif (explicitLevel !== undefined) {\n\t\treturn explicitLevel;\n\t}\n\t// Per-model default takes priority when switching to a model that has one\n\tif (targetModel) {\n\t\tconst perModel = session.settingsManager.getModelThinkingLevel(targetModel.provider, targetModel.id);\n\t\tif (perModel !== undefined) {\n\t\t\treturn perModel;\n\t\t}\n\t}\n\treturn session.settingsManager.getDefaultThinkingLevel() ?? session.thinkingLevel ?? DEFAULT_THINKING_LEVEL;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"agent-session-model.js","sourceRoot":"","sources":["../../src/core/agent-session-model.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Model selection and thinking-level resolution for AgentSession.\n *\n * Extracted from `agent-session.ts`. Every function here operates on the\n * internal session facade ({@link AgentSessionInternals}); `AgentSession`\n * keeps same-name delegates so call sites, dynamic dispatch, and test spies\n * keep working unchanged. Method-to-method calls that have a facade member go\n * through the session parameter (not direct function calls) to preserve that\n * dispatch. `setModel` and `cycleModel` stay parallel implementations: each\n * keeps its own apply/persist/thinking/model_select sequence and never calls\n * the other.\n */\n\nimport type { ThinkingLevel } from \"@agent-forge/agent-core\";\nimport type { Api, Model } from \"@agent-forge/ai/compat\";\nimport { modelsAreEqual } from \"@agent-forge/ai/compat\";\nimport type { ModelCycleResult, ModelMutationOptions } from \"./agent-session.ts\";\nimport type { AgentSessionInternals } from \"./agent-session-internal.ts\";\nimport { dispatchModelSelectLifecycle } from \"./agent-session-lifecycle.ts\";\nimport { DEFAULT_THINKING_LEVEL } from \"./defaults.ts\";\nimport type { ModelFactsViewV1 } from \"./extensions/public-api.ts\";\nimport { t } from \"./i18n/index.ts\";\n\nexport async function emitModelSelect(\n\tsession: AgentSessionInternals,\n\tnextModel: Model<Api>,\n\tpreviousModel: Model<Api> | undefined,\n\tsource: \"set\" | \"cycle\" | \"restore\",\n): Promise<void> {\n\tif (modelsAreEqual(previousModel, nextModel)) return;\n\tawait dispatchModelSelectLifecycle(session, { provider: nextModel.provider, id: nextModel.id }, source);\n}\n\n/**\n * Set model directly.\n * Validates that auth is configured and saves to the session transcript.\n * Persists to global defaults only when options.persist is true.\n * @throws Error if no auth is configured for the model\n */\nexport async function setModel(\n\tsession: AgentSessionInternals,\n\tmodel: Model<Api>,\n\toptions: ModelMutationOptions = {},\n): Promise<void> {\n\tif (!(await session._modelRuntime.checkAuth(model.provider))) {\n\t\tthrow new Error(t(\"No API key for {provider}/{model}\", { provider: model.provider, model: model.id }));\n\t}\n\n\tconst previousModel = session.model;\n\tconst thinkingLevel = session._getThinkingLevelForModelSwitch(model);\n\tsession.agent.state.model = model;\n\tsession.sessionManager.appendModelChange(model.provider, model.id);\n\tif (options.persist) {\n\t\tsession.settingsManager.setDefaultModelAndProvider(model.provider, model.id);\n\t\tsession._addPersistedDefaultToNonEmptyScope(model);\n\t}\n\n\t// Apply thinking level for the new model.\n\t// Per-model thinking level overrides take priority over the global default.\n\t// Model persistence does not implicitly rewrite the global thinking default.\n\tsession.setThinkingLevel(thinkingLevel);\n\n\tawait session._emitModelSelect(model, previousModel, \"set\");\n}\n\nexport function addPersistedDefaultToNonEmptyScope(session: AgentSessionInternals, model: Model<Api>): void {\n\tif (session._scopedModels.length === 0) return;\n\tif (session._scopedModels.some((scoped) => modelsAreEqual(scoped.model, model))) return;\n\n\tsession._scopedModels = [...session._scopedModels, { model }];\n\n\tconst enabledModels = session.settingsManager.getEnabledModels();\n\tif (!enabledModels?.length) return;\n\n\tconst modelReference = `${model.provider}/${model.id}`;\n\tif (enabledModels.some((pattern) => pattern.toLowerCase() === modelReference.toLowerCase())) return;\n\tsession.settingsManager.setEnabledModels([...enabledModels, modelReference]);\n}\n\n/**\n * Cycle to next/previous model.\n * Uses scoped models (from --models flag) if available, otherwise all available models.\n * @param direction - \"forward\" (default) or \"backward\"\n * @returns The new model info, or undefined if only one model available\n */\nexport async function cycleModel(\n\tsession: AgentSessionInternals,\n\tdirection: \"forward\" | \"backward\" = \"forward\",\n\toptions: ModelMutationOptions = {},\n): Promise<ModelCycleResult | undefined> {\n\tif (session._scopedModels.length > 0) {\n\t\treturn session._cycleScopedModel(direction, options);\n\t}\n\treturn session._cycleAvailableModel(direction, options);\n}\n\nexport async function cycleScopedModel(\n\tsession: AgentSessionInternals,\n\tdirection: \"forward\" | \"backward\",\n\toptions: ModelMutationOptions,\n): Promise<ModelCycleResult | undefined> {\n\tconst availableIds = new Set(\n\t\tsession._modelRuntime.getAvailableSnapshot().map((model) => `${model.provider}\\0${model.id}`),\n\t);\n\tconst scopedModels = session._scopedModels.filter((scoped) =>\n\t\tavailableIds.has(`${scoped.model.provider}\\0${scoped.model.id}`),\n\t);\n\tif (scopedModels.length <= 1) return undefined;\n\n\tconst currentModel = session.model;\n\tlet currentIndex = scopedModels.findIndex((sm) => modelsAreEqual(sm.model, currentModel));\n\n\tif (currentIndex === -1) currentIndex = 0;\n\tconst len = scopedModels.length;\n\tconst nextIndex = direction === \"forward\" ? (currentIndex + 1) % len : (currentIndex - 1 + len) % len;\n\tconst next = scopedModels[nextIndex];\n\tconst thinkingLevel = session._getThinkingLevelForModelSwitch(next.model, next.thinkingLevel);\n\n\t// Apply model\n\tsession.agent.state.model = next.model;\n\tsession.sessionManager.appendModelChange(next.model.provider, next.model.id);\n\tif (options.persist) {\n\t\tsession.settingsManager.setDefaultModelAndProvider(next.model.provider, next.model.id);\n\t\tsession._addPersistedDefaultToNonEmptyScope(next.model);\n\t}\n\n\t// Apply thinking level for the new model.\n\t// - Explicit scoped model thinking level overrides defaults\n\t// - Per-model thinking level overrides take priority over the global default\n\t// setThinkingLevel clamps to model capabilities.\n\t// Model persistence does not implicitly rewrite the global thinking default.\n\tsession.setThinkingLevel(thinkingLevel);\n\n\tawait session._emitModelSelect(next.model, currentModel, \"cycle\");\n\n\treturn { model: next.model, thinkingLevel: session.thinkingLevel, isScoped: true };\n}\n\nexport async function cycleAvailableModel(\n\tsession: AgentSessionInternals,\n\tdirection: \"forward\" | \"backward\",\n\toptions: ModelMutationOptions,\n): Promise<ModelCycleResult | undefined> {\n\tconst availableModels = session._modelRuntime.getAvailableSnapshot();\n\tif (availableModels.length <= 1) return undefined;\n\n\tconst currentModel = session.model;\n\tlet currentIndex = availableModels.findIndex((m) => modelsAreEqual(m, currentModel));\n\n\tif (currentIndex === -1) currentIndex = 0;\n\tconst len = availableModels.length;\n\tconst nextIndex = direction === \"forward\" ? (currentIndex + 1) % len : (currentIndex - 1 + len) % len;\n\tconst nextModel = availableModels[nextIndex];\n\n\tconst thinkingLevel = session._getThinkingLevelForModelSwitch(nextModel);\n\tsession.agent.state.model = nextModel;\n\tsession.sessionManager.appendModelChange(nextModel.provider, nextModel.id);\n\tif (options.persist) {\n\t\tsession.settingsManager.setDefaultModelAndProvider(nextModel.provider, nextModel.id);\n\t\tsession._addPersistedDefaultToNonEmptyScope(nextModel);\n\t}\n\n\t// Apply thinking level for the new model.\n\t// Model persistence does not implicitly rewrite the global thinking default.\n\tsession.setThinkingLevel(thinkingLevel);\n\n\tawait session._emitModelSelect(nextModel, currentModel, \"cycle\");\n\n\treturn { model: nextModel, thinkingLevel: session.thinkingLevel, isScoped: false };\n}\n\n/** Scoped models for cycling (from --models flag). */\nexport function getScopedModels(\n\tsession: AgentSessionInternals,\n): ReadonlyArray<{ model: Model<Api>; thinkingLevel?: ThinkingLevel }> {\n\treturn session._scopedModels;\n}\n\n/** Project provider-agnostic facts off a Model without exposing api/headers/cost internals. */\nexport function modelFactsView(model: Model<Api>): ModelFactsViewV1 {\n\treturn {\n\t\tprovider: model.provider,\n\t\tid: model.id,\n\t\tcontextWindow: model.contextWindow,\n\t\tmaxTokens: model.maxTokens,\n\t\treasoning: model.reasoning,\n\t};\n}\n\n/** Update scoped models for cycling. */\nexport function setScopedModels(\n\tsession: AgentSessionInternals,\n\tscopedModels: Array<{ model: Model<Api>; thinkingLevel?: ThinkingLevel }>,\n): void {\n\tsession._scopedModels = scopedModels;\n}\n\nexport function getThinkingLevelForModelSwitch(\n\tsession: AgentSessionInternals,\n\ttargetModel?: Model<Api>,\n\texplicitLevel?: ThinkingLevel,\n): ThinkingLevel {\n\tif (explicitLevel !== undefined) {\n\t\treturn explicitLevel;\n\t}\n\t// Per-model default takes priority when switching to a model that has one\n\tif (targetModel) {\n\t\tconst perModel = session.settingsManager.getModelThinkingLevel(targetModel.provider, targetModel.id);\n\t\tif (perModel !== undefined) {\n\t\t\treturn perModel;\n\t\t}\n\t}\n\treturn session.settingsManager.getDefaultThinkingLevel() ?? session.thinkingLevel ?? DEFAULT_THINKING_LEVEL;\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-session-retry.d.ts","sourceRoot":"","sources":["../../src/core/agent-session-retry.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAE1D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAG/D,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AAEzE,OAAO,KAAK,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"agent-session-retry.d.ts","sourceRoot":"","sources":["../../src/core/agent-session-retry.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAE1D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAG/D,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AAEzE,OAAO,KAAK,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAGjF,wBAAsB,sBAAsB,CAC3C,OAAO,EAAE,qBAAqB,EAC9B,KAAK,EAAE,OAAO,CAAC,UAAU,EAAE;IAAE,IAAI,EAAE,WAAW,CAAA;CAAE,CAAC,EACjD,MAAM,CAAC,EAAE,WAAW,GAClB,OAAO,CAAC,OAAO,CAAC,CA8BlB;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,CACrC,OAAO,EAAE,qBAAqB,EAC9B,OAAO,EAAE,gBAAgB,EACzB,SAAS,CAAC,EAAE,gBAAgB,EAC5B,MAAM,CAAC,EAAE,WAAW,GAClB,OAAO,CAAC,OAAO,CAAC,CAYlB;AAED,wBAAsB,WAAW,CAChC,OAAO,EAAE,qBAAqB,EAC9B,OAAO,EAAE,gBAAgB,EACzB,SAAS,CAAC,EAAE,gBAAgB,EAC5B,MAAM,CAAC,EAAE,WAAW,gEAiBpB;AAED;;;GAGG;AACH,wBAAsB,YAAY,CACjC,OAAO,EAAE,qBAAqB,EAC9B,OAAO,EAAE,gBAAgB,EACzB,mBAAmB,CAAC,EAAE,OAAO,CAAC,UAAU,CAAC,iBAAiB,CAAC,aAAa,CAAC,CAAC,CAAC,GACzE,OAAO,CAAC,OAAO,CAAC,CA0DlB","sourcesContent":["/**\n * Auto-retry and overflow classification for AgentSession.\n *\n * Extracted from `agent-session.ts`. Every function here operates on the\n * internal session facade ({@link AgentSessionInternals}); `AgentSession`\n * keeps same-name private delegates so call sites, dynamic dispatch, and test\n * spies keep working unchanged. Method-to-method calls go through the session\n * parameter (not direct function calls) to preserve that dispatch.\n */\n\nimport type { AgentEvent } from \"@agent-forge/agent-core\";\nimport { retryDelayMs } from \"@agent-forge/ai\";\nimport type { AssistantMessage } from \"@agent-forge/ai/compat\";\nimport { sleep } from \"../utils/sleep.ts\";\nimport { decideOverflow, executionFacts } from \"./agent-session-compaction.ts\";\nimport type { AgentSessionInternals } from \"./agent-session-internal.ts\";\nimport { dispatchAutoRetryLifecycle } from \"./agent-session-lifecycle.ts\";\nimport type { CapabilityRuntime, ExecutionFactsV1 } from \"./extensions/index.ts\";\nimport { t } from \"./i18n/index.ts\";\n\nexport async function willRetryAfterAgentEnd(\n\tsession: AgentSessionInternals,\n\tevent: Extract<AgentEvent, { type: \"agent_end\" }>,\n\tsignal?: AbortSignal,\n): Promise<boolean> {\n\tif (signal?.aborted) {\n\t\tsession._pendingRetryDecision = undefined;\n\t\treturn false;\n\t}\n\tconst settings = session.settingsManager.getRetrySettings();\n\tif (session._retryAttempt >= settings.maxRetries) {\n\t\tsession._pendingRetryDecision = undefined;\n\t\treturn false;\n\t}\n\n\tfor (let i = event.messages.length - 1; i >= 0; i--) {\n\t\tconst message = event.messages[i];\n\t\tif (message.role === \"assistant\") {\n\t\t\tconst assistantMessage = message as AssistantMessage;\n\t\t\ttry {\n\t\t\t\tconst decision = await decideRetry(session, assistantMessage, undefined, signal);\n\t\t\t\tsession._pendingRetryDecision = { message: assistantMessage, decision };\n\t\t\t\treturn decision.retry;\n\t\t\t} catch (error) {\n\t\t\t\tif (signal?.aborted) {\n\t\t\t\t\tsession._pendingRetryDecision = undefined;\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t}\n\t}\n\tsession._pendingRetryDecision = undefined;\n\treturn false;\n}\n\n/**\n * Check if an error is retryable (overloaded, rate limit, server errors).\n * Context overflow errors are NOT retryable (handled by compaction instead).\n */\nexport async function isRetryableError(\n\tsession: AgentSessionInternals,\n\tmessage: AssistantMessage,\n\texecution?: ExecutionFactsV1,\n\tsignal?: AbortSignal,\n): Promise<boolean> {\n\t// Context overflow is handled by compaction, not retry.\n\tif ((await decideOverflow(session, message, execution, signal)).contextOverflow) return false;\n\tconst runtime = session._capabilityRuntime;\n\t// v8 ignore next -- capability runtime 恒由 _buildRuntime 创建,dispose 后不再调用,运行期恒存在\n\tif (!runtime) throw new Error(t(\"Capability runtime is not available\"));\n\treturn runtime.classifyRetry(session._retryPolicyName, {\n\t\tmessage,\n\t\tsignal,\n\t\tcontext: { version: 1, sessionId: session.sessionId, phase: \"retry\" },\n\t\texecution: execution ?? executionFacts(session, \"retry\"),\n\t});\n}\n\nexport async function decideRetry(\n\tsession: AgentSessionInternals,\n\tmessage: AssistantMessage,\n\texecution?: ExecutionFactsV1,\n\tsignal?: AbortSignal,\n) {\n\tconst settings = session.settingsManager.getRetrySettings();\n\tconst runtime = session._capabilityRuntime;\n\t// v8 ignore next -- capability runtime 恒由 _buildRuntime 创建,dispose 后不再调用,运行期恒存在\n\tif (!runtime) throw new Error(t(\"Capability runtime is not available\"));\n\treturn runtime.decideRetry(session._retryPolicyName, {\n\t\tretryable: await session._isRetryableError(message, execution, signal),\n\t\tenabled: settings.enabled,\n\t\tattempt: session._retryAttempt + 1,\n\t\tmaxAttempts: settings.maxRetries,\n\t\tbaseDelayMs: settings.baseDelayMs,\n\t\terrorMessage: message.errorMessage,\n\t\tsignal,\n\t\tcontext: { version: 1, sessionId: session.sessionId, phase: \"retry\" },\n\t\texecution: execution ?? executionFacts(session, \"retry\"),\n\t});\n}\n\n/**\n * Prepare a retryable error for continuation with exponential backoff.\n * @returns true if the caller should continue the agent, false otherwise\n */\nexport async function prepareRetry(\n\tsession: AgentSessionInternals,\n\tmessage: AssistantMessage,\n\tprecomputedDecision?: Awaited<ReturnType<CapabilityRuntime[\"decideRetry\"]>>,\n): Promise<boolean> {\n\tconst settings = session.settingsManager.getRetrySettings();\n\tconst decision = precomputedDecision ?? (await decideRetry(session, message));\n\tif (!decision.retry) return false;\n\tsession._retryAttempt++;\n\t// ±10% jitter on the exponential backoff (borrowed from codex's backoff):\n\t// prevents synchronized retry storms when many sessions hit the same outage.\n\t// The effective delay is capped by maxAgentDelayMs before jitter (retryDelayMs\n\t// already caps the exponential path; the min() also clamps policy-provided\n\t// delayMs), so a capped delay can overshoot the cap by at most the jitter band.\n\tconst baseDelayMs = Math.min(\n\t\tdecision.delayMs ?? retryDelayMs(settings, session._retryAttempt),\n\t\tsettings.maxAgentDelayMs,\n\t);\n\tconst delayMs = Math.round(baseDelayMs * (0.9 + Math.random() * 0.2));\n\t// Install the controller before announcing the retry so listeners can cancel\n\t// the pending delay from the auto_retry_start event itself.\n\tsession._retryAbortController = new AbortController();\n\n\tsession._emit({\n\t\ttype: \"auto_retry_start\",\n\t\tattempt: session._retryAttempt,\n\t\tmaxAttempts: settings.maxRetries,\n\t\tdelayMs,\n\t\terrorMessage: message.errorMessage || \"Unknown error\",\n\t});\n\tawait dispatchAutoRetryLifecycle(session, {\n\t\tattempt: session._retryAttempt,\n\t\tmaxAttempts: settings.maxRetries,\n\t\tdelayMs,\n\t\terrorMessage: message.errorMessage || \"Unknown error\",\n\t});\n\n\t// Remove error message from agent state (keep in session for history)\n\tconst messages = session.agent.state.messages;\n\tif (messages.length > 0 && messages[messages.length - 1].role === \"assistant\") {\n\t\tawait session._applyContextTransition(messages.slice(0, -1), \"retry\");\n\t}\n\n\t// Wait with exponential backoff (abortable)\n\ttry {\n\t\tawait sleep(delayMs, session._retryAbortController.signal);\n\t} catch {\n\t\t// Aborted during sleep - emit end event so UI can clean up\n\t\tconst attempt = session._retryAttempt;\n\t\tsession._retryAttempt = 0;\n\t\tsession._emit({\n\t\t\ttype: \"auto_retry_end\",\n\t\t\tsuccess: false,\n\t\t\tattempt,\n\t\t\tfinalError: \"Retry cancelled\",\n\t\t});\n\t\treturn false;\n\t} finally {\n\t\tsession._retryAbortController = undefined;\n\t}\n\n\treturn true;\n}\n"]}
|
|
@@ -11,6 +11,7 @@ import { retryDelayMs } from "@agent-forge/ai";
|
|
|
11
11
|
import { sleep } from "../utils/sleep.js";
|
|
12
12
|
import { decideOverflow, executionFacts } from "./agent-session-compaction.js";
|
|
13
13
|
import { dispatchAutoRetryLifecycle } from "./agent-session-lifecycle.js";
|
|
14
|
+
import { t } from "./i18n/index.js";
|
|
14
15
|
export async function willRetryAfterAgentEnd(session, event, signal) {
|
|
15
16
|
if (signal?.aborted) {
|
|
16
17
|
session._pendingRetryDecision = undefined;
|
|
@@ -53,7 +54,7 @@ export async function isRetryableError(session, message, execution, signal) {
|
|
|
53
54
|
const runtime = session._capabilityRuntime;
|
|
54
55
|
// v8 ignore next -- capability runtime 恒由 _buildRuntime 创建,dispose 后不再调用,运行期恒存在
|
|
55
56
|
if (!runtime)
|
|
56
|
-
throw new Error("Capability runtime is not available");
|
|
57
|
+
throw new Error(t("Capability runtime is not available"));
|
|
57
58
|
return runtime.classifyRetry(session._retryPolicyName, {
|
|
58
59
|
message,
|
|
59
60
|
signal,
|
|
@@ -66,7 +67,7 @@ export async function decideRetry(session, message, execution, signal) {
|
|
|
66
67
|
const runtime = session._capabilityRuntime;
|
|
67
68
|
// v8 ignore next -- capability runtime 恒由 _buildRuntime 创建,dispose 后不再调用,运行期恒存在
|
|
68
69
|
if (!runtime)
|
|
69
|
-
throw new Error("Capability runtime is not available");
|
|
70
|
+
throw new Error(t("Capability runtime is not available"));
|
|
70
71
|
return runtime.decideRetry(session._retryPolicyName, {
|
|
71
72
|
retryable: await session._isRetryableError(message, execution, signal),
|
|
72
73
|
enabled: settings.enabled,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-session-retry.js","sourceRoot":"","sources":["../../src/core/agent-session-retry.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Auto-retry and overflow classification for AgentSession.\n *\n * Extracted from `agent-session.ts`. Every function here operates on the\n * internal session facade ({@link AgentSessionInternals}); `AgentSession`\n * keeps same-name private delegates so call sites, dynamic dispatch, and test\n * spies keep working unchanged. Method-to-method calls go through the session\n * parameter (not direct function calls) to preserve that dispatch.\n */\n\nimport type { AgentEvent } from \"@agent-forge/agent-core\";\nimport { retryDelayMs } from \"@agent-forge/ai\";\nimport type { AssistantMessage } from \"@agent-forge/ai/compat\";\nimport { sleep } from \"../utils/sleep.ts\";\nimport { decideOverflow, executionFacts } from \"./agent-session-compaction.ts\";\nimport type { AgentSessionInternals } from \"./agent-session-internal.ts\";\nimport { dispatchAutoRetryLifecycle } from \"./agent-session-lifecycle.ts\";\nimport type { CapabilityRuntime, ExecutionFactsV1 } from \"./extensions/index.ts\";\n\nexport async function willRetryAfterAgentEnd(\n\tsession: AgentSessionInternals,\n\tevent: Extract<AgentEvent, { type: \"agent_end\" }>,\n\tsignal?: AbortSignal,\n): Promise<boolean> {\n\tif (signal?.aborted) {\n\t\tsession._pendingRetryDecision = undefined;\n\t\treturn false;\n\t}\n\tconst settings = session.settingsManager.getRetrySettings();\n\tif (session._retryAttempt >= settings.maxRetries) {\n\t\tsession._pendingRetryDecision = undefined;\n\t\treturn false;\n\t}\n\n\tfor (let i = event.messages.length - 1; i >= 0; i--) {\n\t\tconst message = event.messages[i];\n\t\tif (message.role === \"assistant\") {\n\t\t\tconst assistantMessage = message as AssistantMessage;\n\t\t\ttry {\n\t\t\t\tconst decision = await decideRetry(session, assistantMessage, undefined, signal);\n\t\t\t\tsession._pendingRetryDecision = { message: assistantMessage, decision };\n\t\t\t\treturn decision.retry;\n\t\t\t} catch (error) {\n\t\t\t\tif (signal?.aborted) {\n\t\t\t\t\tsession._pendingRetryDecision = undefined;\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t}\n\t}\n\tsession._pendingRetryDecision = undefined;\n\treturn false;\n}\n\n/**\n * Check if an error is retryable (overloaded, rate limit, server errors).\n * Context overflow errors are NOT retryable (handled by compaction instead).\n */\nexport async function isRetryableError(\n\tsession: AgentSessionInternals,\n\tmessage: AssistantMessage,\n\texecution?: ExecutionFactsV1,\n\tsignal?: AbortSignal,\n): Promise<boolean> {\n\t// Context overflow is handled by compaction, not retry.\n\tif ((await decideOverflow(session, message, execution, signal)).contextOverflow) return false;\n\tconst runtime = session._capabilityRuntime;\n\t// v8 ignore next -- capability runtime 恒由 _buildRuntime 创建,dispose 后不再调用,运行期恒存在\n\tif (!runtime) throw new Error(\"Capability runtime is not available\");\n\treturn runtime.classifyRetry(session._retryPolicyName, {\n\t\tmessage,\n\t\tsignal,\n\t\tcontext: { version: 1, sessionId: session.sessionId, phase: \"retry\" },\n\t\texecution: execution ?? executionFacts(session, \"retry\"),\n\t});\n}\n\nexport async function decideRetry(\n\tsession: AgentSessionInternals,\n\tmessage: AssistantMessage,\n\texecution?: ExecutionFactsV1,\n\tsignal?: AbortSignal,\n) {\n\tconst settings = session.settingsManager.getRetrySettings();\n\tconst runtime = session._capabilityRuntime;\n\t// v8 ignore next -- capability runtime 恒由 _buildRuntime 创建,dispose 后不再调用,运行期恒存在\n\tif (!runtime) throw new Error(\"Capability runtime is not available\");\n\treturn runtime.decideRetry(session._retryPolicyName, {\n\t\tretryable: await session._isRetryableError(message, execution, signal),\n\t\tenabled: settings.enabled,\n\t\tattempt: session._retryAttempt + 1,\n\t\tmaxAttempts: settings.maxRetries,\n\t\tbaseDelayMs: settings.baseDelayMs,\n\t\terrorMessage: message.errorMessage,\n\t\tsignal,\n\t\tcontext: { version: 1, sessionId: session.sessionId, phase: \"retry\" },\n\t\texecution: execution ?? executionFacts(session, \"retry\"),\n\t});\n}\n\n/**\n * Prepare a retryable error for continuation with exponential backoff.\n * @returns true if the caller should continue the agent, false otherwise\n */\nexport async function prepareRetry(\n\tsession: AgentSessionInternals,\n\tmessage: AssistantMessage,\n\tprecomputedDecision?: Awaited<ReturnType<CapabilityRuntime[\"decideRetry\"]>>,\n): Promise<boolean> {\n\tconst settings = session.settingsManager.getRetrySettings();\n\tconst decision = precomputedDecision ?? (await decideRetry(session, message));\n\tif (!decision.retry) return false;\n\tsession._retryAttempt++;\n\t// ±10% jitter on the exponential backoff (borrowed from codex's backoff):\n\t// prevents synchronized retry storms when many sessions hit the same outage.\n\t// The effective delay is capped by maxAgentDelayMs before jitter (retryDelayMs\n\t// already caps the exponential path; the min() also clamps policy-provided\n\t// delayMs), so a capped delay can overshoot the cap by at most the jitter band.\n\tconst baseDelayMs = Math.min(\n\t\tdecision.delayMs ?? retryDelayMs(settings, session._retryAttempt),\n\t\tsettings.maxAgentDelayMs,\n\t);\n\tconst delayMs = Math.round(baseDelayMs * (0.9 + Math.random() * 0.2));\n\t// Install the controller before announcing the retry so listeners can cancel\n\t// the pending delay from the auto_retry_start event itself.\n\tsession._retryAbortController = new AbortController();\n\n\tsession._emit({\n\t\ttype: \"auto_retry_start\",\n\t\tattempt: session._retryAttempt,\n\t\tmaxAttempts: settings.maxRetries,\n\t\tdelayMs,\n\t\terrorMessage: message.errorMessage || \"Unknown error\",\n\t});\n\tawait dispatchAutoRetryLifecycle(session, {\n\t\tattempt: session._retryAttempt,\n\t\tmaxAttempts: settings.maxRetries,\n\t\tdelayMs,\n\t\terrorMessage: message.errorMessage || \"Unknown error\",\n\t});\n\n\t// Remove error message from agent state (keep in session for history)\n\tconst messages = session.agent.state.messages;\n\tif (messages.length > 0 && messages[messages.length - 1].role === \"assistant\") {\n\t\tawait session._applyContextTransition(messages.slice(0, -1), \"retry\");\n\t}\n\n\t// Wait with exponential backoff (abortable)\n\ttry {\n\t\tawait sleep(delayMs, session._retryAbortController.signal);\n\t} catch {\n\t\t// Aborted during sleep - emit end event so UI can clean up\n\t\tconst attempt = session._retryAttempt;\n\t\tsession._retryAttempt = 0;\n\t\tsession._emit({\n\t\t\ttype: \"auto_retry_end\",\n\t\t\tsuccess: false,\n\t\t\tattempt,\n\t\t\tfinalError: \"Retry cancelled\",\n\t\t});\n\t\treturn false;\n\t} finally {\n\t\tsession._retryAbortController = undefined;\n\t}\n\n\treturn true;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"agent-session-retry.js","sourceRoot":"","sources":["../../src/core/agent-session-retry.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Auto-retry and overflow classification for AgentSession.\n *\n * Extracted from `agent-session.ts`. Every function here operates on the\n * internal session facade ({@link AgentSessionInternals}); `AgentSession`\n * keeps same-name private delegates so call sites, dynamic dispatch, and test\n * spies keep working unchanged. Method-to-method calls go through the session\n * parameter (not direct function calls) to preserve that dispatch.\n */\n\nimport type { AgentEvent } from \"@agent-forge/agent-core\";\nimport { retryDelayMs } from \"@agent-forge/ai\";\nimport type { AssistantMessage } from \"@agent-forge/ai/compat\";\nimport { sleep } from \"../utils/sleep.ts\";\nimport { decideOverflow, executionFacts } from \"./agent-session-compaction.ts\";\nimport type { AgentSessionInternals } from \"./agent-session-internal.ts\";\nimport { dispatchAutoRetryLifecycle } from \"./agent-session-lifecycle.ts\";\nimport type { CapabilityRuntime, ExecutionFactsV1 } from \"./extensions/index.ts\";\nimport { t } from \"./i18n/index.ts\";\n\nexport async function willRetryAfterAgentEnd(\n\tsession: AgentSessionInternals,\n\tevent: Extract<AgentEvent, { type: \"agent_end\" }>,\n\tsignal?: AbortSignal,\n): Promise<boolean> {\n\tif (signal?.aborted) {\n\t\tsession._pendingRetryDecision = undefined;\n\t\treturn false;\n\t}\n\tconst settings = session.settingsManager.getRetrySettings();\n\tif (session._retryAttempt >= settings.maxRetries) {\n\t\tsession._pendingRetryDecision = undefined;\n\t\treturn false;\n\t}\n\n\tfor (let i = event.messages.length - 1; i >= 0; i--) {\n\t\tconst message = event.messages[i];\n\t\tif (message.role === \"assistant\") {\n\t\t\tconst assistantMessage = message as AssistantMessage;\n\t\t\ttry {\n\t\t\t\tconst decision = await decideRetry(session, assistantMessage, undefined, signal);\n\t\t\t\tsession._pendingRetryDecision = { message: assistantMessage, decision };\n\t\t\t\treturn decision.retry;\n\t\t\t} catch (error) {\n\t\t\t\tif (signal?.aborted) {\n\t\t\t\t\tsession._pendingRetryDecision = undefined;\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t}\n\t}\n\tsession._pendingRetryDecision = undefined;\n\treturn false;\n}\n\n/**\n * Check if an error is retryable (overloaded, rate limit, server errors).\n * Context overflow errors are NOT retryable (handled by compaction instead).\n */\nexport async function isRetryableError(\n\tsession: AgentSessionInternals,\n\tmessage: AssistantMessage,\n\texecution?: ExecutionFactsV1,\n\tsignal?: AbortSignal,\n): Promise<boolean> {\n\t// Context overflow is handled by compaction, not retry.\n\tif ((await decideOverflow(session, message, execution, signal)).contextOverflow) return false;\n\tconst runtime = session._capabilityRuntime;\n\t// v8 ignore next -- capability runtime 恒由 _buildRuntime 创建,dispose 后不再调用,运行期恒存在\n\tif (!runtime) throw new Error(t(\"Capability runtime is not available\"));\n\treturn runtime.classifyRetry(session._retryPolicyName, {\n\t\tmessage,\n\t\tsignal,\n\t\tcontext: { version: 1, sessionId: session.sessionId, phase: \"retry\" },\n\t\texecution: execution ?? executionFacts(session, \"retry\"),\n\t});\n}\n\nexport async function decideRetry(\n\tsession: AgentSessionInternals,\n\tmessage: AssistantMessage,\n\texecution?: ExecutionFactsV1,\n\tsignal?: AbortSignal,\n) {\n\tconst settings = session.settingsManager.getRetrySettings();\n\tconst runtime = session._capabilityRuntime;\n\t// v8 ignore next -- capability runtime 恒由 _buildRuntime 创建,dispose 后不再调用,运行期恒存在\n\tif (!runtime) throw new Error(t(\"Capability runtime is not available\"));\n\treturn runtime.decideRetry(session._retryPolicyName, {\n\t\tretryable: await session._isRetryableError(message, execution, signal),\n\t\tenabled: settings.enabled,\n\t\tattempt: session._retryAttempt + 1,\n\t\tmaxAttempts: settings.maxRetries,\n\t\tbaseDelayMs: settings.baseDelayMs,\n\t\terrorMessage: message.errorMessage,\n\t\tsignal,\n\t\tcontext: { version: 1, sessionId: session.sessionId, phase: \"retry\" },\n\t\texecution: execution ?? executionFacts(session, \"retry\"),\n\t});\n}\n\n/**\n * Prepare a retryable error for continuation with exponential backoff.\n * @returns true if the caller should continue the agent, false otherwise\n */\nexport async function prepareRetry(\n\tsession: AgentSessionInternals,\n\tmessage: AssistantMessage,\n\tprecomputedDecision?: Awaited<ReturnType<CapabilityRuntime[\"decideRetry\"]>>,\n): Promise<boolean> {\n\tconst settings = session.settingsManager.getRetrySettings();\n\tconst decision = precomputedDecision ?? (await decideRetry(session, message));\n\tif (!decision.retry) return false;\n\tsession._retryAttempt++;\n\t// ±10% jitter on the exponential backoff (borrowed from codex's backoff):\n\t// prevents synchronized retry storms when many sessions hit the same outage.\n\t// The effective delay is capped by maxAgentDelayMs before jitter (retryDelayMs\n\t// already caps the exponential path; the min() also clamps policy-provided\n\t// delayMs), so a capped delay can overshoot the cap by at most the jitter band.\n\tconst baseDelayMs = Math.min(\n\t\tdecision.delayMs ?? retryDelayMs(settings, session._retryAttempt),\n\t\tsettings.maxAgentDelayMs,\n\t);\n\tconst delayMs = Math.round(baseDelayMs * (0.9 + Math.random() * 0.2));\n\t// Install the controller before announcing the retry so listeners can cancel\n\t// the pending delay from the auto_retry_start event itself.\n\tsession._retryAbortController = new AbortController();\n\n\tsession._emit({\n\t\ttype: \"auto_retry_start\",\n\t\tattempt: session._retryAttempt,\n\t\tmaxAttempts: settings.maxRetries,\n\t\tdelayMs,\n\t\terrorMessage: message.errorMessage || \"Unknown error\",\n\t});\n\tawait dispatchAutoRetryLifecycle(session, {\n\t\tattempt: session._retryAttempt,\n\t\tmaxAttempts: settings.maxRetries,\n\t\tdelayMs,\n\t\terrorMessage: message.errorMessage || \"Unknown error\",\n\t});\n\n\t// Remove error message from agent state (keep in session for history)\n\tconst messages = session.agent.state.messages;\n\tif (messages.length > 0 && messages[messages.length - 1].role === \"assistant\") {\n\t\tawait session._applyContextTransition(messages.slice(0, -1), \"retry\");\n\t}\n\n\t// Wait with exponential backoff (abortable)\n\ttry {\n\t\tawait sleep(delayMs, session._retryAbortController.signal);\n\t} catch {\n\t\t// Aborted during sleep - emit end event so UI can clean up\n\t\tconst attempt = session._retryAttempt;\n\t\tsession._retryAttempt = 0;\n\t\tsession._emit({\n\t\t\ttype: \"auto_retry_end\",\n\t\t\tsuccess: false,\n\t\t\tattempt,\n\t\t\tfinalError: \"Retry cancelled\",\n\t\t});\n\t\treturn false;\n\t} finally {\n\t\tsession._retryAbortController = undefined;\n\t}\n\n\treturn true;\n}\n"]}
|