@ai-agent-forge/agent-forge 0.86.7 → 0.88.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 +45 -0
- package/README.md +10 -11
- 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 +430 -413
- package/dist/bundle/chunks/{chunk-A7GUOX2H.js → chunk-6ZKDNZHA.js} +5 -1
- package/dist/bundle/chunks/chunk-HLJEVRWP.js +13 -0
- package/dist/bundle/chunks/chunk-YGHQME4V.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 +17 -4
- 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 +5 -3
- 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 +6 -10
- package/dist/core/agent-session-compaction.d.ts.map +1 -1
- package/dist/core/agent-session-compaction.js +35 -133
- 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-internal.d.ts +0 -6
- package/dist/core/agent-session-internal.d.ts.map +1 -1
- package/dist/core/agent-session-internal.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 -3
- 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 -22
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +147 -67
- 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-compaction-policy.d.ts.map +1 -1
- package/dist/core/extensions/bootstrap-compaction-policy.js +0 -34
- package/dist/core/extensions/bootstrap-compaction-policy.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 +4 -3
- 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/extensions/provider-failover.d.ts +7 -3
- package/dist/core/extensions/provider-failover.d.ts.map +1 -1
- package/dist/core/extensions/provider-failover.js +9 -8
- package/dist/core/extensions/provider-failover.js.map +1 -1
- package/dist/core/facade/coding-agent-facade.d.ts +6 -6
- package/dist/core/facade/coding-agent-facade.d.ts.map +1 -1
- package/dist/core/facade/coding-agent-facade.js +2 -3
- 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 +229 -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 +267 -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 +286 -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-config.d.ts +0 -1
- package/dist/core/model-config.d.ts.map +1 -1
- package/dist/core/model-config.js +9 -1
- package/dist/core/model-config.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 +11 -7
- 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 +2 -2
- package/dist/core/provider-composer.d.ts.map +1 -1
- package/dist/core/provider-composer.js +29 -21
- 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 +27 -5
- package/dist/core/sdk.d.ts.map +1 -1
- package/dist/core/sdk.js +80 -55
- 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 +20 -20
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js +47 -59
- 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 +97 -60
- 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 +0 -2
- package/dist/modes/interactive/components/footer.d.ts.map +1 -1
- package/dist/modes/interactive/components/footer.js +8 -10
- 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 +4 -6
- package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/settings-selector.js +115 -120
- 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 -2
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +350 -279
- 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 +0 -8
- package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-client.js +3 -14
- package/dist/modes/rpc/rpc-client.js.map +1 -1
- package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-mode.js +0 -9
- package/dist/modes/rpc/rpc-mode.js.map +1 -1
- package/dist/modes/rpc/rpc-types.d.ts +0 -19
- package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-types.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 +9 -2
- package/dist/plugins/ecosystem/node-plugin-bootstrap.d.ts.map +1 -1
- package/dist/plugins/ecosystem/node-plugin-bootstrap.js +44 -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/plugin-bootstrap.d.ts +9 -1
- package/dist/plugins/ecosystem/plugin-bootstrap.d.ts.map +1 -1
- package/dist/plugins/ecosystem/plugin-bootstrap.js +5 -0
- package/dist/plugins/ecosystem/plugin-bootstrap.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/photon.d.ts +2 -2
- package/dist/utils/photon.d.ts.map +1 -1
- package/dist/utils/photon.js +2 -2
- package/dist/utils/photon.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/compaction.md +1 -3
- package/docs/docs.json +4 -0
- package/docs/index.md +1 -0
- package/docs/keybindings.md +3 -0
- package/docs/mcp.md +103 -0
- package/docs/models.md +14 -22
- package/docs/providers.md +0 -1
- package/docs/quickstart.md +1 -1
- package/docs/rpc.md +1 -26
- package/docs/sdk.md +4 -6
- package/docs/settings.md +10 -12
- package/docs/skills.md +1 -9
- package/docs/terminal-setup.md +2 -3
- package/docs/usage.md +7 -6
- 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/examples/sdk/10-settings.ts +2 -4
- package/examples/sdk/12-full-control.ts +1 -2
- package/package.json +1 -3
- package/dist/bundle/chunks/chunk-EALJ5DDX.js +0 -1452
- package/dist/core/extensions/microcompact.d.ts +0 -80
- package/dist/core/extensions/microcompact.d.ts.map +0 -1
- package/dist/core/extensions/microcompact.js +0 -134
- package/dist/core/extensions/microcompact.js.map +0 -1
- package/dist/server/create-harness.d.ts +0 -26
- package/dist/server/create-harness.d.ts.map +0 -1
- package/dist/server/create-harness.js +0 -106
- package/dist/server/create-harness.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-composition.d.ts","sourceRoot":"","sources":["../../../src/core/extensions/agent-composition.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n\tAgentCompositionAPI,\n\tAgentCompositionDefinitionBinding,\n\tAgentCompositionHostBinding,\n\tAgentCompositionScopedHostBinding,\n\tAgentContextCommitRequestV1,\n\tAgentContextCommitResultV1,\n\tAgentContextFacadeV1,\n\tAgentControllerLease,\n\tAgentDefinition,\n\tAgentExecutionContext,\n\tAgentHostPrimitivesFactory,\n\tAgentHostPrimitivesV1,\n\tAgentInstance,\n\tAgentInstanceResult,\n\tAgentInstanceSnapshot,\n\tAgentInstanceStatus,\n\tAgentModelFacadeV1,\n\tAgentModelInvocationV1,\n\tAgentOperationFacadeV1,\n\tAgentSessionFacadeV1,\n\tAgentToolFacadeV1,\n\tDisposableRegistration,\n\tOperationHandle,\n\tOperationProgress,\n\tOperationStatus,\n\tOutputArtifactAPI,\n\tOutputArtifactChunk,\n\tOutputArtifactRef,\n\tStateAPI,\n\tStateChange,\n} from \"./public-api.ts\";\n\nexport interface AgentCompositionRuntimeOptions {\n\tidFactory?: (kind: string) => string;\n\tdefaultLeaseOwner?: string;\n\thostPrimitivesFactory?: AgentHostPrimitivesFactory;\n}\n\nexport type AgentCompositionLifecycleEventName = \"start\" | \"step\" | \"cancel\" | \"end\";\nexport type AgentCompositionLifecycleTerminalStatus = \"succeeded\" | \"failed\" | \"cancelled\";\n\nexport interface AgentCompositionLifecycleEvent {\n\treadonly event: AgentCompositionLifecycleEventName;\n\treadonly operationId: string;\n\treadonly operationKind: string;\n\treadonly owner?: string;\n\treadonly status?: AgentCompositionLifecycleTerminalStatus;\n\treadonly step?: number;\n\treadonly progress?: OperationProgress;\n}\n\nexport type AgentCompositionLifecycleDispatcher = (event: AgentCompositionLifecycleEvent) => void;\n\n/** Host-only binding used by CapabilityRuntime to observe composition operations. */\nexport interface AgentCompositionLifecycleBinding {\n\tsetLifecycleDispatcher(dispatcher?: AgentCompositionLifecycleDispatcher): void;\n}\n\n/**\n * Host-only binding used by CapabilityRuntime to clear instance-scoped state\n * when an instance is disposed. Instance ids are unique per composition\n * runtime, so every registered clearer is invoked on each disposal and\n * resolves by id whether the disposed instance belongs to it.\n */\nexport interface AgentCompositionInstanceStateBinding {\n\t/** Registers a clearer invoked after a disposed instance's execution drained. Returns an unsubscribe function. */\n\taddInstanceStateClearer(clearer: (instanceId: string) => void): () => void;\n}\n\ntype DefinitionRef = { id: string; version: number };\n\nconst terminalStatuses = new Set<AgentInstanceStatus>([\"succeeded\", \"failed\", \"cancelled\", \"disposed\"]);\n\nfunction abortError(reason?: unknown): Error {\n\tif (reason instanceof Error) return reason;\n\tconst error = new Error(reason === undefined ? \"Agent operation cancelled\" : String(reason));\n\terror.name = \"AbortError\";\n\treturn error;\n}\n\nfunction combinedAbortSignal(...signals: readonly (AbortSignal | undefined)[]): {\n\tsignal: AbortSignal;\n\tdispose(): void;\n} {\n\tconst controller = new AbortController();\n\tconst listeners: Array<{ signal: AbortSignal; listener: () => void }> = [];\n\tfor (const signal of new Set(signals.filter((signal): signal is AbortSignal => signal !== undefined))) {\n\t\tconst abort = () => {\n\t\t\tif (!controller.signal.aborted) controller.abort(signal.reason);\n\t\t};\n\t\tif (signal.aborted) {\n\t\t\tabort();\n\t\t\tbreak;\n\t\t}\n\t\tsignal.addEventListener(\"abort\", abort, { once: true });\n\t\tlisteners.push({ signal, listener: abort });\n\t}\n\treturn {\n\t\tsignal: controller.signal,\n\t\tdispose: () => {\n\t\t\tfor (const { signal, listener } of listeners) signal.removeEventListener(\"abort\", listener);\n\t\t},\n\t};\n}\n\nfunction freezeSnapshot(snapshot: AgentInstanceSnapshot): AgentInstanceSnapshot {\n\treturn Object.freeze({ ...snapshot });\n}\n\nfunction validateAgentDefinition<TInput, TResult>(\n\tdefinition: AgentDefinition<TInput, TResult>,\n): AgentDefinition<TInput, TResult> {\n\tif (!definition || typeof definition !== \"object\") {\n\t\tthrow new Error(\"Agent definition is required\");\n\t}\n\tif (typeof definition.id !== \"string\" || !definition.id.trim()) {\n\t\tthrow new Error(\"Agent definition requires a non-empty id\");\n\t}\n\tif (!Number.isSafeInteger(definition.version) || definition.version < 1) {\n\t\tthrow new Error(\"Agent definition version must be a positive safe integer\");\n\t}\n\tif (definition.role !== \"root-agent-controller\" && definition.role !== \"child-agent-controller\") {\n\t\tthrow new Error(\"Agent definition role must be root-agent-controller or child-agent-controller\");\n\t}\n\tif (typeof definition.run !== \"function\") {\n\t\tthrow new Error(\"Agent definition requires a run function\");\n\t}\n\tif (definition.owner !== undefined && (typeof definition.owner !== \"string\" || !definition.owner.trim())) {\n\t\tthrow new Error(\"Agent definition owner must be a non-empty string when provided\");\n\t}\n\treturn definition;\n}\n\nfunction detachedFreeze<T>(value: T, seen = new WeakMap<object, unknown>()): T {\n\tif (value === null || typeof value !== \"object\") return value;\n\tif (value instanceof Uint8Array) return new Uint8Array(value) as T;\n\tconst existing = seen.get(value);\n\tif (existing) return existing as T;\n\tconst result: Record<string, unknown> | unknown[] = Array.isArray(value) ? [] : {};\n\tseen.set(value, result);\n\tfor (const [key, item] of Object.entries(value as Record<string, unknown>)) {\n\t\t(result as Record<string, unknown>)[key] = detachedFreeze(item, seen);\n\t}\n\treturn Object.freeze(result) as T;\n}\n\nfunction disposable(dispose: () => void | Promise<void>): DisposableRegistration {\n\tlet disposed = false;\n\treturn {\n\t\tid: \"agent-host-registration\",\n\t\tkind: \"agent-host\",\n\t\tdispose: () => {\n\t\t\tif (disposed) return;\n\t\t\tdisposed = true;\n\t\t\treturn dispose();\n\t\t},\n\t};\n}\n\nfunction revokedError(instanceId: string): Error {\n\treturn new Error(`Agent host primitives are revoked: ${instanceId}`);\n}\n\ninterface RevocableHost {\n\treadonly value: AgentHostPrimitivesV1;\n\trevoke(): void;\n}\n\nfunction createOperationFacade<TResult>(\n\toperation: OperationRuntime<TResult>,\n\tinstanceId: string,\n\tactive: () => boolean,\n): AgentOperationFacadeV1 {\n\treturn Object.freeze({\n\t\tversion: 1 as const,\n\t\tid: operation.id,\n\t\tsignal: operation.signal,\n\t\tstatus: () => {\n\t\t\tif (!active()) return \"cancelled\" as OperationStatus;\n\t\t\treturn operation.status();\n\t\t},\n\t\tisActive: () => active() && operation.status() === \"running\",\n\t\treportProgress: (progress: OperationProgress) => active() && operation.reportProgress(progress),\n\t\tonCancel: (handler: (reason: unknown) => void | Promise<void>) => {\n\t\t\tif (!active()) throw revokedError(instanceId);\n\t\t\tconst listener = () => {\n\t\t\t\tvoid handler(operation.signal.reason);\n\t\t\t};\n\t\t\toperation.signal.addEventListener(\"abort\", listener, { once: true });\n\t\t\treturn disposable(() => operation.signal.removeEventListener(\"abort\", listener));\n\t\t},\n\t\tcancel: async (reason?: string) => {\n\t\t\tif (!active()) throw revokedError(instanceId);\n\t\t\tawait operation.cancel(reason);\n\t\t},\n\t});\n}\n\nfunction createRevocableHostPrimitives(\n\traw: AgentHostPrimitivesV1,\n\toperation: OperationRuntime<unknown>,\n\tinstance: AgentInstanceSnapshot,\n): RevocableHost {\n\tlet active = true;\n\tconst cleanups: Array<() => void | Promise<void>> = [];\n\tconst track = (registration: DisposableRegistration): DisposableRegistration => {\n\t\tlet released = false;\n\t\tconst dispose = async () => {\n\t\t\tif (released) return;\n\t\t\treleased = true;\n\t\t\tconst index = cleanups.indexOf(cleanup);\n\t\t\tif (index >= 0) cleanups.splice(index, 1);\n\t\t\tawait registration.dispose();\n\t\t};\n\t\tconst cleanup = dispose;\n\t\tcleanups.push(cleanup);\n\t\treturn {\n\t\t\tid: registration.id,\n\t\t\tkind: registration.kind,\n\t\t\tdispose,\n\t\t};\n\t};\n\tconst assertActive = () => {\n\t\tif (!active) throw revokedError(instance.id);\n\t\tif (operation.signal.aborted) throw abortError(operation.signal.reason);\n\t};\n\n\tconst session = raw.session\n\t\t? (Object.freeze({\n\t\t\t\tversion: 1 as const,\n\t\t\t\tgetSessionId: () => {\n\t\t\t\t\tassertActive();\n\t\t\t\t\treturn raw.session!.getSessionId();\n\t\t\t\t},\n\t\t\t\tgetRevision: raw.session.getRevision\n\t\t\t\t\t? () => {\n\t\t\t\t\t\t\tassertActive();\n\t\t\t\t\t\t\treturn detachedFreeze(raw.session!.getRevision!());\n\t\t\t\t\t\t}\n\t\t\t\t\t: undefined,\n\t\t\t\tgetMessages: () => {\n\t\t\t\t\tassertActive();\n\t\t\t\t\treturn detachedFreeze(raw.session!.getMessages());\n\t\t\t\t},\n\t\t\t\tgetBranchEntries: () => {\n\t\t\t\t\tassertActive();\n\t\t\t\t\treturn detachedFreeze(raw.session!.getBranchEntries());\n\t\t\t\t},\n\t\t\t\tisIdle: () => {\n\t\t\t\t\tassertActive();\n\t\t\t\t\treturn raw.session!.isIdle();\n\t\t\t\t},\n\t\t\t\twaitForIdle: async () => {\n\t\t\t\t\tassertActive();\n\t\t\t\t\tawait raw.session!.waitForIdle();\n\t\t\t\t\tassertActive();\n\t\t\t\t},\n\t\t\t\tappendEntry: (customType: string, data?: unknown) => {\n\t\t\t\t\tassertActive();\n\t\t\t\t\treturn raw.session!.appendEntry(customType, detachedFreeze(data));\n\t\t\t\t},\n\t\t\t}) as AgentSessionFacadeV1)\n\t\t: undefined;\n\n\tconst context = raw.context\n\t\t? (Object.freeze({\n\t\t\t\tversion: 1 as const,\n\t\t\t\tget: <TValue = unknown>() => {\n\t\t\t\t\tassertActive();\n\t\t\t\t\treturn detachedFreeze(raw.context!.get<TValue>());\n\t\t\t\t},\n\t\t\t\tcommit: async <TValue = unknown>(request: AgentContextCommitRequestV1<TValue>) => {\n\t\t\t\t\tassertActive();\n\t\t\t\t\tif (request.signal?.aborted) throw abortError(request.signal.reason);\n\t\t\t\t\tconst result = await raw.context!.commit({\n\t\t\t\t\t\t...request,\n\t\t\t\t\t\tvalue: detachedFreeze(request.value),\n\t\t\t\t\t});\n\t\t\t\t\tassertActive();\n\t\t\t\t\treturn detachedFreeze(result) as AgentContextCommitResultV1<TValue>;\n\t\t\t\t},\n\t\t\t}) as AgentContextFacadeV1)\n\t\t: undefined;\n\n\t// One guarded StateAPI facade shared by the owner namespace and the\n\t// instance-private namespace: same revocation gating and detached snapshots.\n\tconst guardedStateFacade = (source: StateAPI): StateAPI =>\n\t\tObject.freeze({\n\t\t\tget: (key: string) => {\n\t\t\t\tassertActive();\n\t\t\t\treturn detachedFreeze(source.get(key));\n\t\t\t},\n\t\t\tset: (key: string, value: Parameters<StateAPI[\"set\"]>[1], options?: Parameters<StateAPI[\"set\"]>[2]) => {\n\t\t\t\tassertActive();\n\t\t\t\treturn source.set(key, detachedFreeze(value), options);\n\t\t\t},\n\t\t\tdelete: (key: string, options?: Parameters<StateAPI[\"delete\"]>[1]) => {\n\t\t\t\tassertActive();\n\t\t\t\treturn source.delete(key, options);\n\t\t\t},\n\t\t\tlist: (prefix?: string) => {\n\t\t\t\tassertActive();\n\t\t\t\treturn detachedFreeze(source.list(prefix));\n\t\t\t},\n\t\t\twatch: (prefix: string | undefined, handler: (change: StateChange) => void | Promise<void>) => {\n\t\t\t\tassertActive();\n\t\t\t\treturn track(\n\t\t\t\t\tsource.watch(prefix, (change: StateChange) => {\n\t\t\t\t\t\tif (!active || operation.signal.aborted) return;\n\t\t\t\t\t\tvoid handler(detachedFreeze(change));\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t},\n\t\t}) as StateAPI;\n\n\tconst state = raw.state ? guardedStateFacade(raw.state) : undefined;\n\tconst instanceState = raw.instanceState ? guardedStateFacade(raw.instanceState) : undefined;\n\n\tconst artifact = raw.artifact\n\t\t? (Object.freeze({\n\t\t\t\tput: async (\n\t\t\t\t\tinput: Parameters<OutputArtifactAPI[\"put\"]>[0],\n\t\t\t\t\toptions?: Parameters<OutputArtifactAPI[\"put\"]>[1],\n\t\t\t\t) => {\n\t\t\t\t\tassertActive();\n\t\t\t\t\tconst data = input.data instanceof Uint8Array ? new Uint8Array(input.data) : input.data;\n\t\t\t\t\tconst abort = combinedAbortSignal(operation.signal, options?.signal);\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst ref = await raw.artifact!.put({ ...input, data }, { ...options, signal: abort.signal });\n\t\t\t\t\t\tassertActive();\n\t\t\t\t\t\treturn detachedFreeze(ref) as OutputArtifactRef;\n\t\t\t\t\t} finally {\n\t\t\t\t\t\tabort.dispose();\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tstat: async (ref: OutputArtifactRef) => {\n\t\t\t\t\tassertActive();\n\t\t\t\t\tconst result = await raw.artifact!.stat(detachedFreeze(ref));\n\t\t\t\t\tassertActive();\n\t\t\t\t\treturn detachedFreeze(result);\n\t\t\t\t},\n\t\t\t\tread: async (ref: OutputArtifactRef, options?: Parameters<OutputArtifactAPI[\"read\"]>[1]) => {\n\t\t\t\t\tassertActive();\n\t\t\t\t\tconst chunk = await raw.artifact!.read(detachedFreeze(ref), options);\n\t\t\t\t\tassertActive();\n\t\t\t\t\treturn detachedFreeze({\n\t\t\t\t\t\t...chunk,\n\t\t\t\t\t\tdata: new Uint8Array(chunk.data),\n\t\t\t\t\t}) as OutputArtifactChunk;\n\t\t\t\t},\n\t\t\t}) as OutputArtifactAPI)\n\t\t: undefined;\n\n\tconst operationFacade = raw.operation\n\t\t? Object.freeze({\n\t\t\t\tversion: 1 as const,\n\t\t\t\tid: raw.operation.id,\n\t\t\t\tsignal: raw.operation.signal,\n\t\t\t\tstatus: () => {\n\t\t\t\t\tassertActive();\n\t\t\t\t\treturn raw.operation!.status();\n\t\t\t\t},\n\t\t\t\tisActive: () => active && raw.operation!.isActive(),\n\t\t\t\treportProgress: (progress: OperationProgress) => {\n\t\t\t\t\tassertActive();\n\t\t\t\t\treturn raw.operation!.reportProgress(progress);\n\t\t\t\t},\n\t\t\t\tonCancel: (handler: (reason: unknown) => void | Promise<void>) => {\n\t\t\t\t\tassertActive();\n\t\t\t\t\treturn track(raw.operation!.onCancel(handler));\n\t\t\t\t},\n\t\t\t\tcancel: async (reason?: string) => {\n\t\t\t\t\tassertActive();\n\t\t\t\t\tawait raw.operation!.cancel(reason);\n\t\t\t\t},\n\t\t\t})\n\t\t: createOperationFacade(operation, instance.id, () => active);\n\n\tconst value = Object.freeze({\n\t\tversion: 1 as const,\n\t\t...(session ? { session } : {}),\n\t\t...(context ? { context } : {}),\n\t\t...(state ? { state } : {}),\n\t\t...(instanceState ? { instanceState } : {}),\n\t\t...(artifact ? { artifact } : {}),\n\t\t...(operationFacade ? { operation: operationFacade } : {}),\n\t\t...(raw.model\n\t\t\t? {\n\t\t\t\t\tmodel: Object.freeze({\n\t\t\t\t\t\tversion: 1 as const,\n\t\t\t\t\t\tget facts() {\n\t\t\t\t\t\t\tassertActive();\n\t\t\t\t\t\t\treturn raw.model!.facts;\n\t\t\t\t\t\t},\n\t\t\t\t\t\tinvocation: {\n\t\t\t\t\t\t\tinvoke: async (input: Parameters<AgentModelInvocationV1[\"invoke\"]>[0], signal: AbortSignal) => {\n\t\t\t\t\t\t\t\tassertActive();\n\t\t\t\t\t\t\t\tconst result = await raw.model!.invocation.invoke(input, signal);\n\t\t\t\t\t\t\t\tassertActive();\n\t\t\t\t\t\t\t\treturn result;\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t}) satisfies AgentModelFacadeV1,\n\t\t\t\t}\n\t\t\t: {}),\n\t\t...(raw.tool\n\t\t\t? {\n\t\t\t\t\ttool: Object.freeze({\n\t\t\t\t\t\tversion: 1 as const,\n\t\t\t\t\t\tlistTools: () => {\n\t\t\t\t\t\t\tassertActive();\n\t\t\t\t\t\t\treturn raw.tool!.listTools();\n\t\t\t\t\t\t},\n\t\t\t\t\t\tinvokeTool: (name: string, input: unknown, invokeOptions?: { readonly signal?: AbortSignal }) => {\n\t\t\t\t\t\t\tassertActive();\n\t\t\t\t\t\t\treturn raw.tool!.invokeTool(name, input, invokeOptions);\n\t\t\t\t\t\t},\n\t\t\t\t\t}) satisfies AgentToolFacadeV1,\n\t\t\t\t}\n\t\t\t: {}),\n\t});\n\treturn {\n\t\tvalue,\n\t\trevoke: () => {\n\t\t\tif (!active) return;\n\t\t\tactive = false;\n\t\t\tfor (const cleanup of [...cleanups]) void cleanup();\n\t\t},\n\t};\n}\n\nclass AgentInstanceRuntime<TInput, TResult> implements AgentInstance<TInput, TResult> {\n\treadonly id: string;\n\treadonly definition: AgentDefinition<TInput, TResult>;\n\n\tprivate statusValue: AgentInstanceStatus = \"created\";\n\tprivate revisionValue = 0;\n\tprivate activeLease?: ControllerLeaseRuntime;\n\tprivate activeOperation?: OperationRuntime<TResult>;\n\tprivate activeExecution?: Promise<void>;\n\tprivate completion: Promise<AgentInstanceResult<TResult>>;\n\tprivate resolveCompletion!: (result: AgentInstanceResult<TResult>) => void;\n\tprivate completionResolved = false;\n\tprivate readonly parentInstanceId: string | undefined;\n\tprivate readonly nextId: (kind: string) => string;\n\tprivate readonly defaultLeaseOwner: string;\n\tprivate readonly hostPrimitivesFactory?: AgentHostPrimitivesFactory;\n\tprivate readonly lifecycleDispatcher?: AgentCompositionLifecycleDispatcher;\n\tprivate readonly clearInstanceState?: (instanceId: string) => void;\n\n\tconstructor(\n\t\tdefinition: AgentDefinition<TInput, TResult>,\n\t\tid: string,\n\t\tparentInstanceId: string | undefined,\n\t\tnextId: (kind: string) => string,\n\t\tdefaultLeaseOwner: string,\n\t\thostPrimitivesFactory: AgentHostPrimitivesFactory | undefined,\n\t\tlifecycleDispatcher: AgentCompositionLifecycleDispatcher | undefined,\n\t\tclearInstanceState: ((instanceId: string) => void) | undefined,\n\t) {\n\t\tthis.id = id;\n\t\tthis.definition = definition;\n\t\tthis.parentInstanceId = parentInstanceId;\n\t\tthis.nextId = nextId;\n\t\tthis.defaultLeaseOwner = defaultLeaseOwner;\n\t\tthis.hostPrimitivesFactory = hostPrimitivesFactory;\n\t\tthis.lifecycleDispatcher = lifecycleDispatcher;\n\t\tthis.clearInstanceState = clearInstanceState;\n\t\tthis.completion = new Promise<AgentInstanceResult<TResult>>((resolve) => {\n\t\t\tthis.resolveCompletion = resolve;\n\t\t});\n\t}\n\n\tsnapshot(): AgentInstanceSnapshot {\n\t\treturn freezeSnapshot({\n\t\t\tid: this.id,\n\t\t\tdefinitionId: this.definition.id,\n\t\t\tdefinitionVersion: this.definition.version,\n\t\t\trole: this.definition.role,\n\t\t\t...(this.parentInstanceId ? { parentInstanceId: this.parentInstanceId } : {}),\n\t\t\tstatus: this.statusValue,\n\t\t\trevision: this.revisionValue,\n\t\t\t...(this.activeLease?.isActive() ? { leaseOwner: this.activeLease.owner } : {}),\n\t\t});\n\t}\n\n\tasync acquireControllerLease(\n\t\towner = this.definition.owner ?? this.defaultLeaseOwner,\n\t): Promise<AgentControllerLease> {\n\t\tthis.assertNotDisposed();\n\t\tif (this.activeLease?.isActive())\n\t\t\tthrow new Error(`Agent instance already has an active controller lease: ${this.id}`);\n\t\tconst lease = new ControllerLeaseRuntime(this, this.nextId(\"agent-lease\"), owner, this.revisionValue + 1);\n\t\tthis.activeLease = lease;\n\t\treturn lease;\n\t}\n\n\trun(input: TInput, options: { lease?: AgentControllerLease; signal?: AbortSignal } = {}): OperationHandle<TResult> {\n\t\tthis.assertNotDisposed();\n\t\tif (this.statusValue !== \"created\")\n\t\t\tthrow new Error(`Agent instance cannot run from status ${this.statusValue}: ${this.id}`);\n\t\tconst lease = this.activeLease;\n\t\tif (!lease?.isActive()) throw new Error(`Agent instance requires an active controller lease: ${this.id}`);\n\t\tif (options.lease !== lease || !this.isLeaseUsable(options.lease)) {\n\t\t\tthrow new Error(`Agent controller lease is not valid for instance: ${this.id}`);\n\t\t}\n\n\t\tthis.statusValue = \"running\";\n\t\tconst controller = new AbortController();\n\t\tconst externalSignal = options.signal;\n\t\tlet externalAbortListener: (() => void) | undefined;\n\t\tif (externalSignal) {\n\t\t\texternalAbortListener = () => {\n\t\t\t\tcontroller.abort(externalSignal.reason);\n\t\t\t\tvoid this.cancel(externalSignal.reason === undefined ? undefined : String(externalSignal.reason));\n\t\t\t};\n\t\t\tif (!externalSignal.aborted) externalSignal.addEventListener(\"abort\", externalAbortListener, { once: true });\n\t\t}\n\n\t\tlet operation!: OperationRuntime<TResult>;\n\t\toperation = new OperationRuntime<TResult>(\n\t\t\tthis.nextId(\"agent-operation\"),\n\t\t\tcontroller,\n\t\t\t() => this.cancel(controller.signal.reason),\n\t\t\t(progress, step) => this.reportLifecycle(\"step\", operation, undefined, progress, step),\n\t\t);\n\t\tthis.activeOperation = operation;\n\t\tif (externalSignal?.aborted) {\n\t\t\tcontroller.abort(externalSignal.reason);\n\t\t} else {\n\t\t\tthis.reportLifecycle(\"start\", operation);\n\t\t}\n\t\tthis.activeExecution = this.execute(input, lease, operation, externalSignal, externalAbortListener);\n\t\tif (externalSignal?.aborted) {\n\t\t\t// Trigger cancellation only after the execution is tracked, so the\n\t\t\t// pre-aborted path drains like every other cancellation path instead\n\t\t\t// of resolving completion ahead of the execution body.\n\t\t\tvoid this.cancel(externalSignal.reason === undefined ? undefined : String(externalSignal.reason));\n\t\t}\n\t\treturn operation;\n\t}\n\n\tasync wait(): Promise<AgentInstanceResult<TResult>> {\n\t\treturn this.completion;\n\t}\n\n\tasync cancel(reason?: string): Promise<void> {\n\t\tif (this.statusValue === \"disposed\" || terminalStatuses.has(this.statusValue)) return;\n\t\tthis.statusValue = \"cancelled\";\n\t\tthis.revisionValue += 1;\n\t\tconst operation = this.activeOperation;\n\t\tif (operation) {\n\t\t\tthis.reportLifecycle(\"cancel\", operation);\n\t\t\tthis.reportLifecycle(\"end\", operation, \"cancelled\");\n\t\t\toperation.cancelFromInstance(reason);\n\t\t}\n\t\t// The run body must eventually observe the abort signal: cancellation only\n\t\t// settles after the execution drained, so wait() and lease disposal never\n\t\t// race side effects still in flight. There is deliberately no timeout. A run\n\t\t// body that awaits this cancel(), dispose(), or its own lease release\n\t\t// self-deadlocks by contract.\n\t\tawait this.drainExecution();\n\t\tthis.resolveCompletionOnce({ status: \"cancelled\", revision: this.revisionValue, error: abortError(reason) });\n\t}\n\n\tasync dispose(): Promise<void> {\n\t\tif (this.statusValue === \"disposed\") return;\n\t\tif (this.statusValue === \"created\") {\n\t\t\tawait this.activeLease?.release();\n\t\t\tthis.statusValue = \"disposed\";\n\t\t\tthis.revisionValue += 1;\n\t\t\tthis.clearInstanceState?.(this.id);\n\t\t\tthis.resolveCompletionOnce({ status: \"disposed\", revision: this.revisionValue });\n\t\t\treturn;\n\t\t}\n\t\tif (!terminalStatuses.has(this.statusValue)) await this.cancel(\"Agent instance disposed\");\n\t\t// A concurrent cancel() may still be draining; release the lease only after\n\t\t// the execution has settled.\n\t\tawait this.drainExecution();\n\t\tawait this.activeLease?.release();\n\t\tthis.statusValue = \"disposed\";\n\t\tthis.revisionValue += 1;\n\t\t// The instance-private state namespace (and its watchers) dies with the\n\t\t// instance, after every drain the run body could still rely on.\n\t\tthis.clearInstanceState?.(this.id);\n\t\tthis.resolveCompletionOnce({ status: \"disposed\", revision: this.revisionValue });\n\t}\n\n\tasync deactivateLease(lease: ControllerLeaseRuntime): Promise<void> {\n\t\tif (this.activeLease !== lease) return;\n\t\tthis.activeLease = undefined;\n\t\tif (this.statusValue === \"running\") {\n\t\t\tawait this.cancel(\"Controller lease released\");\n\t\t\treturn;\n\t\t}\n\t\t// A cancel() from another path may still be draining the execution.\n\t\tawait this.drainExecution();\n\t}\n\n\tisLeaseUsable(lease: AgentControllerLease | undefined): lease is ControllerLeaseRuntime {\n\t\treturn (\n\t\t\tlease instanceof ControllerLeaseRuntime &&\n\t\t\tlease.instanceId === this.id &&\n\t\t\tlease.isActive() &&\n\t\t\tthis.activeLease === lease\n\t\t);\n\t}\n\n\tprivate async execute(\n\t\tinput: TInput,\n\t\tlease: ControllerLeaseRuntime,\n\t\toperation: OperationRuntime<TResult>,\n\t\texternalSignal: AbortSignal | undefined,\n\t\texternalAbortListener: (() => void) | undefined,\n\t): Promise<void> {\n\t\tconst instanceSnapshot = this.snapshot();\n\t\tlet hostScope: RevocableHost | undefined;\n\t\tconst revokeHost = () => hostScope?.revoke();\n\t\toperation.signal.addEventListener(\"abort\", revokeHost, { once: true });\n\t\ttry {\n\t\t\tif (operation.signal.aborted) throw abortError(operation.signal.reason);\n\t\t\tif (this.hostPrimitivesFactory) {\n\t\t\t\tconst raw = await this.hostPrimitivesFactory({\n\t\t\t\t\tinstance: instanceSnapshot,\n\t\t\t\t\toperationId: operation.id,\n\t\t\t\t\tsignal: operation.signal,\n\t\t\t\t\tleaseOwner: lease.owner,\n\t\t\t\t});\n\t\t\t\tif (raw !== undefined) {\n\t\t\t\t\tif (raw.version !== 1) throw new Error(\"Unsupported Agent host primitives version\");\n\t\t\t\t\tif (raw.operation && (raw.operation.id !== operation.id || raw.operation.signal !== operation.signal))\n\t\t\t\t\t\tthrow new Error(`Agent host operation does not match active operation: ${operation.id}`);\n\t\t\t\t\thostScope = createRevocableHostPrimitives(\n\t\t\t\t\t\t{ ...raw, operation: raw.operation ?? createOperationFacade(operation, this.id, () => true) },\n\t\t\t\t\t\toperation as OperationRuntime<unknown>,\n\t\t\t\t\t\tinstanceSnapshot,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (operation.signal.aborted) throw abortError(operation.signal.reason);\n\t\t\tconst context: AgentExecutionContext = Object.freeze({\n\t\t\t\tinstance: instanceSnapshot,\n\t\t\t\tsignal: operation.signal,\n\t\t\t\tinputRevision: this.revisionValue,\n\t\t\t\t...(hostScope ? { host: hostScope.value } : {}),\n\t\t\t});\n\t\t\tconst output = await this.definition.run(input, context);\n\t\t\tif (operation.signal.aborted || !this.isLeaseUsable(lease) || this.statusValue !== \"running\") return;\n\t\t\tthis.statusValue = \"succeeded\";\n\t\t\tthis.revisionValue += 1;\n\t\t\toperation.resolve(output);\n\t\t\tthis.reportLifecycle(\"end\", operation, \"succeeded\");\n\t\t\tthis.resolveCompletionOnce({ status: \"succeeded\", revision: this.revisionValue, output });\n\t\t} catch (error) {\n\t\t\tif (operation.signal.aborted || this.statusValue === \"cancelled\" || this.statusValue === \"disposed\") {\n\t\t\t\t// Instance-level cancellation marks the handle cancelled before this\n\t\t\t\t// catch runs; the pre-aborted run() path gets here first, so settle\n\t\t\t\t// the handle as cancelled instead of failed.\n\t\t\t\toperation.cancelFromInstance(operation.signal.reason);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis.statusValue = \"failed\";\n\t\t\tthis.revisionValue += 1;\n\t\t\toperation.reject(error);\n\t\t\tthis.reportLifecycle(\"end\", operation, \"failed\");\n\t\t\tthis.resolveCompletionOnce({ status: \"failed\", revision: this.revisionValue, error });\n\t\t} finally {\n\t\t\thostScope?.revoke();\n\t\t\toperation.signal.removeEventListener(\"abort\", revokeHost);\n\t\t\tif (externalSignal && externalAbortListener)\n\t\t\t\texternalSignal.removeEventListener(\"abort\", externalAbortListener);\n\t\t\tif (this.activeOperation === operation) this.activeOperation = undefined;\n\t\t\t// run() requires status \"created\", so at most one execution ever exists\n\t\t\t// per instance and clearing the field unconditionally is safe.\n\t\t\tthis.activeExecution = undefined;\n\t\t}\n\t}\n\n\tprivate async drainExecution(): Promise<void> {\n\t\t// Capture the reference before awaiting: execute()'s finally clears the\n\t\t// field while drainers still need the promise.\n\t\tconst execution = this.activeExecution;\n\t\tif (!execution) return;\n\t\tawait execution;\n\t}\n\n\tprivate assertNotDisposed(): void {\n\t\tif (this.statusValue === \"disposed\") throw new Error(`Agent instance is disposed: ${this.id}`);\n\t}\n\n\tprivate resolveCompletionOnce(result: AgentInstanceResult<TResult>): void {\n\t\tif (this.completionResolved) return;\n\t\tthis.completionResolved = true;\n\t\tthis.resolveCompletion(result);\n\t}\n\n\tprivate reportLifecycle(\n\t\tevent: AgentCompositionLifecycleEventName,\n\t\toperation: OperationRuntime<TResult>,\n\t\tstatus?: AgentCompositionLifecycleTerminalStatus,\n\t\tprogress?: OperationProgress,\n\t\tstep?: number,\n\t): void {\n\t\tif (!this.lifecycleDispatcher) return;\n\t\ttry {\n\t\t\tthis.lifecycleDispatcher({\n\t\t\t\tevent,\n\t\t\t\toperationId: operation.id,\n\t\t\t\toperationKind: `agent:${this.definition.id}@${this.definition.version}`,\n\t\t\t\t...(this.definition.owner === undefined ? {} : { owner: this.definition.owner }),\n\t\t\t\t...(status === undefined ? {} : { status }),\n\t\t\t\t...(progress === undefined ? {} : { progress }),\n\t\t\t\t...(step === undefined ? {} : { step }),\n\t\t\t});\n\t\t} catch {\n\t\t\t// Lifecycle delivery is observational and must not affect the operation.\n\t\t}\n\t}\n}\n\ninterface LeaseOwner {\n\tid: string;\n\tdeactivateLease(lease: ControllerLeaseRuntime): Promise<void>;\n}\n\nclass ControllerLeaseRuntime implements AgentControllerLease {\n\tprivate active = true;\n\tprivate readonly instance: LeaseOwner;\n\treadonly id: string;\n\treadonly owner: string;\n\treadonly revision: number;\n\n\tconstructor(instance: LeaseOwner, id: string, owner: string, revision: number) {\n\t\tthis.instance = instance;\n\t\tthis.id = id;\n\t\tthis.owner = owner;\n\t\tthis.revision = revision;\n\t}\n\n\tget instanceId(): string {\n\t\treturn this.instance.id;\n\t}\n\n\tisActive(): boolean {\n\t\treturn this.active;\n\t}\n\n\tasync release(): Promise<void> {\n\t\tif (!this.active) return;\n\t\tthis.active = false;\n\t\tawait this.instance.deactivateLease(this);\n\t}\n}\n\nclass OperationRuntime<TResult> implements OperationHandle<TResult> {\n\tprivate statusValue: OperationStatus = \"queued\";\n\tprivate resolveResult!: (result: TResult) => void;\n\tprivate rejectResult!: (error: unknown) => void;\n\treadonly result: Promise<TResult>;\n\treadonly id: string;\n\tprivate readonly controller: AbortController;\n\tprivate readonly cancelCallback: () => Promise<void>;\n\tprivate readonly reportProgressCallback: (progress: OperationProgress, step: number) => void;\n\tprivate progressSequence = 0;\n\n\tconstructor(\n\t\tid: string,\n\t\tcontroller: AbortController,\n\t\tcancelCallback: () => Promise<void>,\n\t\treportProgress: (progress: OperationProgress, step: number) => void,\n\t) {\n\t\tthis.id = id;\n\t\tthis.controller = controller;\n\t\tthis.cancelCallback = cancelCallback;\n\t\tthis.reportProgressCallback = reportProgress;\n\t\tthis.signal = controller.signal;\n\t\tthis.result = new Promise<TResult>((resolve, reject) => {\n\t\t\tthis.resolveResult = resolve;\n\t\t\tthis.rejectResult = reject;\n\t\t});\n\t\tthis.statusValue = \"running\";\n\t}\n\n\treadonly signal: AbortSignal;\n\n\tstatus(): OperationStatus {\n\t\treturn this.statusValue;\n\t}\n\n\treportProgress(progress: OperationProgress): boolean {\n\t\tif (this.statusValue !== \"running\" || this.signal.aborted) return false;\n\t\tthis.reportProgressCallback(progress, ++this.progressSequence);\n\t\treturn true;\n\t}\n\n\tasync cancel(reason?: string): Promise<void> {\n\t\tif (this.statusValue === \"succeeded\" || this.statusValue === \"failed\" || this.statusValue === \"cancelled\") return;\n\t\tthis.controller.abort(reason);\n\t\t// The handle must settle cancellation without waiting for an uncooperative\n\t\t// run body. AgentInstanceRuntime.cancel() still drains the body when the\n\t\t// caller explicitly cancels/releases the instance, but OperationHandle is\n\t\t// the non-blocking public fence used by callers that cannot coordinate the\n\t\t// plugin's private awaits. The callback synchronously marks the operation\n\t\t// cancelled before its first await; any later drain is best-effort here.\n\t\ttry {\n\t\t\tvoid this.cancelCallback().catch(() => undefined);\n\t\t} catch {\n\t\t\t// A cancellation request is already reflected by this operation's\n\t\t\t// aborted signal and terminal status; callback failures must not turn\n\t\t\t// cancel() into an unbounded or rejected wait.\n\t\t}\n\t}\n\n\tcancelFromInstance(reason?: string): void {\n\t\tif (this.statusValue === \"succeeded\" || this.statusValue === \"failed\" || this.statusValue === \"cancelled\") return;\n\t\tthis.statusValue = \"cancelled\";\n\t\tthis.controller.abort(reason);\n\t\tthis.rejectResult(abortError(reason));\n\t}\n\n\tresolve(value: TResult): void {\n\t\tif (this.statusValue === \"cancelled\" || this.statusValue === \"failed\") return;\n\t\tthis.statusValue = \"succeeded\";\n\t\tthis.resolveResult(value);\n\t}\n\n\treject(error: unknown): void {\n\t\tif (this.statusValue === \"cancelled\") return;\n\t\tthis.statusValue = \"failed\";\n\t\tthis.rejectResult(error);\n\t}\n}\n\nexport class AgentCompositionRuntime\n\timplements\n\t\tAgentCompositionAPI,\n\t\tAgentCompositionHostBinding,\n\t\tAgentCompositionDefinitionBinding,\n\t\tAgentCompositionScopedHostBinding,\n\t\tAgentCompositionInstanceStateBinding\n{\n\tprivate readonly definitions = new Map<string, AgentDefinition<unknown, unknown>>();\n\tprivate readonly instances = new Map<string, AgentInstanceRuntime<unknown, unknown>>();\n\tprivate readonly instanceStateClearers = new Set<(instanceId: string) => void>();\n\tprivate sequence = 0;\n\tprivate readonly nextId: (kind: string) => string;\n\tprivate readonly defaultLeaseOwner?: string;\n\tprivate hostPrimitivesFactory?: AgentHostPrimitivesFactory;\n\tprivate lifecycleDispatcher?: AgentCompositionLifecycleDispatcher;\n\n\tconstructor(options: AgentCompositionRuntimeOptions = {}) {\n\t\tthis.defaultLeaseOwner = options.defaultLeaseOwner;\n\t\tthis.hostPrimitivesFactory = options.hostPrimitivesFactory;\n\t\tthis.nextId = options.idFactory ?? ((kind: string) => `${kind}-${++this.sequence}`);\n\t}\n\n\tsetHostPrimitivesFactory(factory?: AgentHostPrimitivesFactory): void {\n\t\tthis.hostPrimitivesFactory = factory;\n\t}\n\n\tsetLifecycleDispatcher(dispatcher?: AgentCompositionLifecycleDispatcher): void {\n\t\tthis.lifecycleDispatcher = dispatcher;\n\t}\n\n\taddInstanceStateClearer(clearer: (instanceId: string) => void): () => void {\n\t\tthis.instanceStateClearers.add(clearer);\n\t\treturn () => {\n\t\t\tthis.instanceStateClearers.delete(clearer);\n\t\t};\n\t}\n\n\tdisposeDefinitions(definitions: readonly AgentDefinition[]): void {\n\t\tconst owned = new Set(definitions);\n\t\tfor (const [key, definition] of this.definitions) {\n\t\t\tif (owned.has(definition)) this.definitions.delete(key);\n\t\t}\n\t\tfor (const [id, instance] of this.instances) {\n\t\t\tif (!owned.has(instance.definition)) continue;\n\t\t\tthis.instances.delete(id);\n\t\t\tvoid instance.dispose();\n\t\t}\n\t}\n\n\tdefine<TInput = unknown, TResult = unknown>(\n\t\tdefinition: AgentDefinition<TInput, TResult>,\n\t): AgentDefinition<TInput, TResult> {\n\t\tvalidateAgentDefinition(definition);\n\t\tif (this.definitions.has(this.definitionKey(definition.id, definition.version))) {\n\t\t\tthrow new Error(`Agent definition already registered: ${definition.id}@${definition.version}`);\n\t\t}\n\t\tconst frozen = Object.freeze({ ...definition });\n\t\tthis.definitions.set(\n\t\t\tthis.definitionKey(definition.id, definition.version),\n\t\t\tfrozen as AgentDefinition<unknown, unknown>,\n\t\t);\n\t\treturn frozen;\n\t}\n\n\tget<TInput = unknown, TResult = unknown>(id: string, version: number): AgentDefinition<TInput, TResult> {\n\t\tconst definition = this.definitions.get(this.definitionKey(id, version));\n\t\tif (!definition) throw new Error(`Unknown Agent definition: ${id}@${version}`);\n\t\treturn definition as AgentDefinition<TInput, TResult>;\n\t}\n\n\tcreate<TInput = unknown, TResult = unknown>(\n\t\tdefinition: AgentDefinition<TInput, TResult> | DefinitionRef,\n\t\toptions: { id?: string; parentInstanceId?: string } = {},\n\t): AgentInstance<TInput, TResult> {\n\t\treturn this.createInternal(definition, options, this.hostPrimitivesFactory);\n\t}\n\n\tcreateWithHostPrimitives<TInput = unknown, TResult = unknown>(\n\t\tdefinition: AgentDefinition<TInput, TResult> | DefinitionRef,\n\t\toptions: { id?: string; parentInstanceId?: string } | undefined,\n\t\thostPrimitivesFactory: AgentHostPrimitivesFactory,\n\t\tlifecycleDispatcher?: AgentCompositionLifecycleDispatcher,\n\t): AgentInstance<TInput, TResult> {\n\t\t// A CapabilityRuntime supplies a complete, session-bound factory for this\n\t\t// plugin invocation. Do not merge the runtime-wide factory here: one\n\t\t// composition runtime may be shared by more than one AgentSession.\n\t\treturn this.createInternal(\n\t\t\tdefinition,\n\t\t\toptions ?? {},\n\t\t\thostPrimitivesFactory,\n\t\t\tlifecycleDispatcher ?? this.lifecycleDispatcher,\n\t\t);\n\t}\n\n\tprivate createInternal<TInput = unknown, TResult = unknown>(\n\t\tdefinition: AgentDefinition<TInput, TResult> | DefinitionRef,\n\t\toptions: { id?: string; parentInstanceId?: string },\n\t\thostPrimitivesFactory: AgentHostPrimitivesFactory | undefined,\n\t\tlifecycleDispatcher: AgentCompositionLifecycleDispatcher | undefined = this.lifecycleDispatcher,\n\t): AgentInstance<TInput, TResult> {\n\t\tif (!definition || typeof definition !== \"object\") throw new Error(\"Agent definition or reference is required\");\n\t\tconst resolved =\n\t\t\t\"run\" in definition\n\t\t\t\t? validateAgentDefinition(definition as AgentDefinition<TInput, TResult>)\n\t\t\t\t: this.get<TInput, TResult>(definition.id, definition.version);\n\t\tif (options.parentInstanceId !== undefined && !this.instances.has(options.parentInstanceId)) {\n\t\t\tthrow new Error(`Unknown parent Agent instance: ${options.parentInstanceId}`);\n\t\t}\n\t\tif (this.instances.has(options.id ?? \"\")) throw new Error(`Agent instance id already exists: ${options.id}`);\n\t\tconst id = options.id ?? this.nextId(\"agent-instance\");\n\t\tif (this.instances.has(id)) throw new Error(`Agent instance id already exists: ${id}`);\n\t\tconst instance = new AgentInstanceRuntime(\n\t\t\tresolved,\n\t\t\tid,\n\t\t\toptions.parentInstanceId,\n\t\t\tthis.nextId,\n\t\t\tthis.defaultLeaseOwner ?? resolved.owner ?? \"agent-composition\",\n\t\t\thostPrimitivesFactory,\n\t\t\tlifecycleDispatcher,\n\t\t\t(instanceId: string) => {\n\t\t\t\tfor (const clearer of this.instanceStateClearers) clearer(instanceId);\n\t\t\t},\n\t\t);\n\t\tthis.instances.set(id, instance as AgentInstanceRuntime<unknown, unknown>);\n\t\treturn instance;\n\t}\n\n\tlistInstances(): readonly AgentInstanceSnapshot[] {\n\t\treturn Object.freeze([...this.instances.values()].map((instance) => instance.snapshot()));\n\t}\n\n\tprivate definitionKey(id: string, version: number): string {\n\t\treturn `${id}@${version}`;\n\t}\n}\n\nexport function createAgentCompositionRuntime(options: AgentCompositionRuntimeOptions = {}): AgentCompositionRuntime {\n\treturn new AgentCompositionRuntime(options);\n}\n"]}
|
|
1
|
+
{"version":3,"file":"agent-composition.d.ts","sourceRoot":"","sources":["../../../src/core/extensions/agent-composition.ts"],"names":[],"mappings":"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","sourcesContent":["import { t } from \"../i18n/index.ts\";\nimport type {\n\tAgentCompositionAPI,\n\tAgentCompositionDefinitionBinding,\n\tAgentCompositionHostBinding,\n\tAgentCompositionScopedHostBinding,\n\tAgentContextCommitRequestV1,\n\tAgentContextCommitResultV1,\n\tAgentContextFacadeV1,\n\tAgentControllerLease,\n\tAgentDefinition,\n\tAgentExecutionContext,\n\tAgentHostPrimitivesFactory,\n\tAgentHostPrimitivesV1,\n\tAgentInstance,\n\tAgentInstanceResult,\n\tAgentInstanceSnapshot,\n\tAgentInstanceStatus,\n\tAgentModelFacadeV1,\n\tAgentModelInvocationV1,\n\tAgentOperationFacadeV1,\n\tAgentSessionFacadeV1,\n\tAgentToolFacadeV1,\n\tDisposableRegistration,\n\tOperationHandle,\n\tOperationProgress,\n\tOperationStatus,\n\tOutputArtifactAPI,\n\tOutputArtifactChunk,\n\tOutputArtifactRef,\n\tStateAPI,\n\tStateChange,\n} from \"./public-api.ts\";\n\nexport interface AgentCompositionRuntimeOptions {\n\tidFactory?: (kind: string) => string;\n\tdefaultLeaseOwner?: string;\n\thostPrimitivesFactory?: AgentHostPrimitivesFactory;\n}\n\nexport type AgentCompositionLifecycleEventName = \"start\" | \"step\" | \"cancel\" | \"end\";\nexport type AgentCompositionLifecycleTerminalStatus = \"succeeded\" | \"failed\" | \"cancelled\";\n\nexport interface AgentCompositionLifecycleEvent {\n\treadonly event: AgentCompositionLifecycleEventName;\n\treadonly operationId: string;\n\treadonly operationKind: string;\n\treadonly owner?: string;\n\treadonly status?: AgentCompositionLifecycleTerminalStatus;\n\treadonly step?: number;\n\treadonly progress?: OperationProgress;\n}\n\nexport type AgentCompositionLifecycleDispatcher = (event: AgentCompositionLifecycleEvent) => void;\n\n/** Host-only binding used by CapabilityRuntime to observe composition operations. */\nexport interface AgentCompositionLifecycleBinding {\n\tsetLifecycleDispatcher(dispatcher?: AgentCompositionLifecycleDispatcher): void;\n}\n\n/**\n * Host-only binding used by CapabilityRuntime to clear instance-scoped state\n * when an instance is disposed. Instance ids are unique per composition\n * runtime, so every registered clearer is invoked on each disposal and\n * resolves by id whether the disposed instance belongs to it.\n */\nexport interface AgentCompositionInstanceStateBinding {\n\t/** Registers a clearer invoked after a disposed instance's execution drained. Returns an unsubscribe function. */\n\taddInstanceStateClearer(clearer: (instanceId: string) => void): () => void;\n}\n\ntype DefinitionRef = { id: string; version: number };\n\nconst terminalStatuses = new Set<AgentInstanceStatus>([\"succeeded\", \"failed\", \"cancelled\", \"disposed\"]);\n\nfunction abortError(reason?: unknown): Error {\n\tif (reason instanceof Error) return reason;\n\tconst error = new Error(reason === undefined ? \"Agent operation cancelled\" : String(reason));\n\terror.name = \"AbortError\";\n\treturn error;\n}\n\nfunction combinedAbortSignal(...signals: readonly (AbortSignal | undefined)[]): {\n\tsignal: AbortSignal;\n\tdispose(): void;\n} {\n\tconst controller = new AbortController();\n\tconst listeners: Array<{ signal: AbortSignal; listener: () => void }> = [];\n\tfor (const signal of new Set(signals.filter((signal): signal is AbortSignal => signal !== undefined))) {\n\t\tconst abort = () => {\n\t\t\tif (!controller.signal.aborted) controller.abort(signal.reason);\n\t\t};\n\t\tif (signal.aborted) {\n\t\t\tabort();\n\t\t\tbreak;\n\t\t}\n\t\tsignal.addEventListener(\"abort\", abort, { once: true });\n\t\tlisteners.push({ signal, listener: abort });\n\t}\n\treturn {\n\t\tsignal: controller.signal,\n\t\tdispose: () => {\n\t\t\tfor (const { signal, listener } of listeners) signal.removeEventListener(\"abort\", listener);\n\t\t},\n\t};\n}\n\nfunction freezeSnapshot(snapshot: AgentInstanceSnapshot): AgentInstanceSnapshot {\n\treturn Object.freeze({ ...snapshot });\n}\n\nfunction validateAgentDefinition<TInput, TResult>(\n\tdefinition: AgentDefinition<TInput, TResult>,\n): AgentDefinition<TInput, TResult> {\n\tif (!definition || typeof definition !== \"object\") {\n\t\tthrow new Error(t(\"Agent definition is required\"));\n\t}\n\tif (typeof definition.id !== \"string\" || !definition.id.trim()) {\n\t\tthrow new Error(t(\"Agent definition requires a non-empty id\"));\n\t}\n\tif (!Number.isSafeInteger(definition.version) || definition.version < 1) {\n\t\tthrow new Error(t(\"Agent definition version must be a positive safe integer\"));\n\t}\n\tif (definition.role !== \"root-agent-controller\" && definition.role !== \"child-agent-controller\") {\n\t\tthrow new Error(t(\"Agent definition role must be root-agent-controller or child-agent-controller\"));\n\t}\n\tif (typeof definition.run !== \"function\") {\n\t\tthrow new Error(t(\"Agent definition requires a run function\"));\n\t}\n\tif (definition.owner !== undefined && (typeof definition.owner !== \"string\" || !definition.owner.trim())) {\n\t\tthrow new Error(t(\"Agent definition owner must be a non-empty string when provided\"));\n\t}\n\treturn definition;\n}\n\nfunction detachedFreeze<T>(value: T, seen = new WeakMap<object, unknown>()): T {\n\tif (value === null || typeof value !== \"object\") return value;\n\tif (value instanceof Uint8Array) return new Uint8Array(value) as T;\n\tconst existing = seen.get(value);\n\tif (existing) return existing as T;\n\tconst result: Record<string, unknown> | unknown[] = Array.isArray(value) ? [] : {};\n\tseen.set(value, result);\n\tfor (const [key, item] of Object.entries(value as Record<string, unknown>)) {\n\t\t(result as Record<string, unknown>)[key] = detachedFreeze(item, seen);\n\t}\n\treturn Object.freeze(result) as T;\n}\n\nfunction disposable(dispose: () => void | Promise<void>): DisposableRegistration {\n\tlet disposed = false;\n\treturn {\n\t\tid: \"agent-host-registration\",\n\t\tkind: \"agent-host\",\n\t\tdispose: () => {\n\t\t\tif (disposed) return;\n\t\t\tdisposed = true;\n\t\t\treturn dispose();\n\t\t},\n\t};\n}\n\nfunction revokedError(instanceId: string): Error {\n\treturn new Error(`Agent host primitives are revoked: ${instanceId}`);\n}\n\ninterface RevocableHost {\n\treadonly value: AgentHostPrimitivesV1;\n\trevoke(): void;\n}\n\nfunction createOperationFacade<TResult>(\n\toperation: OperationRuntime<TResult>,\n\tinstanceId: string,\n\tactive: () => boolean,\n): AgentOperationFacadeV1 {\n\treturn Object.freeze({\n\t\tversion: 1 as const,\n\t\tid: operation.id,\n\t\tsignal: operation.signal,\n\t\tstatus: () => {\n\t\t\tif (!active()) return \"cancelled\" as OperationStatus;\n\t\t\treturn operation.status();\n\t\t},\n\t\tisActive: () => active() && operation.status() === \"running\",\n\t\treportProgress: (progress: OperationProgress) => active() && operation.reportProgress(progress),\n\t\tonCancel: (handler: (reason: unknown) => void | Promise<void>) => {\n\t\t\tif (!active()) throw revokedError(instanceId);\n\t\t\tconst listener = () => {\n\t\t\t\tvoid handler(operation.signal.reason);\n\t\t\t};\n\t\t\toperation.signal.addEventListener(\"abort\", listener, { once: true });\n\t\t\treturn disposable(() => operation.signal.removeEventListener(\"abort\", listener));\n\t\t},\n\t\tcancel: async (reason?: string) => {\n\t\t\tif (!active()) throw revokedError(instanceId);\n\t\t\tawait operation.cancel(reason);\n\t\t},\n\t});\n}\n\nfunction createRevocableHostPrimitives(\n\traw: AgentHostPrimitivesV1,\n\toperation: OperationRuntime<unknown>,\n\tinstance: AgentInstanceSnapshot,\n): RevocableHost {\n\tlet active = true;\n\tconst cleanups: Array<() => void | Promise<void>> = [];\n\tconst track = (registration: DisposableRegistration): DisposableRegistration => {\n\t\tlet released = false;\n\t\tconst dispose = async () => {\n\t\t\tif (released) return;\n\t\t\treleased = true;\n\t\t\tconst index = cleanups.indexOf(cleanup);\n\t\t\tif (index >= 0) cleanups.splice(index, 1);\n\t\t\tawait registration.dispose();\n\t\t};\n\t\tconst cleanup = dispose;\n\t\tcleanups.push(cleanup);\n\t\treturn {\n\t\t\tid: registration.id,\n\t\t\tkind: registration.kind,\n\t\t\tdispose,\n\t\t};\n\t};\n\tconst assertActive = () => {\n\t\tif (!active) throw revokedError(instance.id);\n\t\tif (operation.signal.aborted) throw abortError(operation.signal.reason);\n\t};\n\n\tconst session = raw.session\n\t\t? (Object.freeze({\n\t\t\t\tversion: 1 as const,\n\t\t\t\tgetSessionId: () => {\n\t\t\t\t\tassertActive();\n\t\t\t\t\treturn raw.session!.getSessionId();\n\t\t\t\t},\n\t\t\t\tgetRevision: raw.session.getRevision\n\t\t\t\t\t? () => {\n\t\t\t\t\t\t\tassertActive();\n\t\t\t\t\t\t\treturn detachedFreeze(raw.session!.getRevision!());\n\t\t\t\t\t\t}\n\t\t\t\t\t: undefined,\n\t\t\t\tgetMessages: () => {\n\t\t\t\t\tassertActive();\n\t\t\t\t\treturn detachedFreeze(raw.session!.getMessages());\n\t\t\t\t},\n\t\t\t\tgetBranchEntries: () => {\n\t\t\t\t\tassertActive();\n\t\t\t\t\treturn detachedFreeze(raw.session!.getBranchEntries());\n\t\t\t\t},\n\t\t\t\tisIdle: () => {\n\t\t\t\t\tassertActive();\n\t\t\t\t\treturn raw.session!.isIdle();\n\t\t\t\t},\n\t\t\t\twaitForIdle: async () => {\n\t\t\t\t\tassertActive();\n\t\t\t\t\tawait raw.session!.waitForIdle();\n\t\t\t\t\tassertActive();\n\t\t\t\t},\n\t\t\t\tappendEntry: (customType: string, data?: unknown) => {\n\t\t\t\t\tassertActive();\n\t\t\t\t\treturn raw.session!.appendEntry(customType, detachedFreeze(data));\n\t\t\t\t},\n\t\t\t}) as AgentSessionFacadeV1)\n\t\t: undefined;\n\n\tconst context = raw.context\n\t\t? (Object.freeze({\n\t\t\t\tversion: 1 as const,\n\t\t\t\tget: <TValue = unknown>() => {\n\t\t\t\t\tassertActive();\n\t\t\t\t\treturn detachedFreeze(raw.context!.get<TValue>());\n\t\t\t\t},\n\t\t\t\tcommit: async <TValue = unknown>(request: AgentContextCommitRequestV1<TValue>) => {\n\t\t\t\t\tassertActive();\n\t\t\t\t\tif (request.signal?.aborted) throw abortError(request.signal.reason);\n\t\t\t\t\tconst result = await raw.context!.commit({\n\t\t\t\t\t\t...request,\n\t\t\t\t\t\tvalue: detachedFreeze(request.value),\n\t\t\t\t\t});\n\t\t\t\t\tassertActive();\n\t\t\t\t\treturn detachedFreeze(result) as AgentContextCommitResultV1<TValue>;\n\t\t\t\t},\n\t\t\t}) as AgentContextFacadeV1)\n\t\t: undefined;\n\n\t// One guarded StateAPI facade shared by the owner namespace and the\n\t// instance-private namespace: same revocation gating and detached snapshots.\n\tconst guardedStateFacade = (source: StateAPI): StateAPI =>\n\t\tObject.freeze({\n\t\t\tget: (key: string) => {\n\t\t\t\tassertActive();\n\t\t\t\treturn detachedFreeze(source.get(key));\n\t\t\t},\n\t\t\tset: (key: string, value: Parameters<StateAPI[\"set\"]>[1], options?: Parameters<StateAPI[\"set\"]>[2]) => {\n\t\t\t\tassertActive();\n\t\t\t\treturn source.set(key, detachedFreeze(value), options);\n\t\t\t},\n\t\t\tdelete: (key: string, options?: Parameters<StateAPI[\"delete\"]>[1]) => {\n\t\t\t\tassertActive();\n\t\t\t\treturn source.delete(key, options);\n\t\t\t},\n\t\t\tlist: (prefix?: string) => {\n\t\t\t\tassertActive();\n\t\t\t\treturn detachedFreeze(source.list(prefix));\n\t\t\t},\n\t\t\twatch: (prefix: string | undefined, handler: (change: StateChange) => void | Promise<void>) => {\n\t\t\t\tassertActive();\n\t\t\t\treturn track(\n\t\t\t\t\tsource.watch(prefix, (change: StateChange) => {\n\t\t\t\t\t\tif (!active || operation.signal.aborted) return;\n\t\t\t\t\t\tvoid handler(detachedFreeze(change));\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t},\n\t\t}) as StateAPI;\n\n\tconst state = raw.state ? guardedStateFacade(raw.state) : undefined;\n\tconst instanceState = raw.instanceState ? guardedStateFacade(raw.instanceState) : undefined;\n\n\tconst artifact = raw.artifact\n\t\t? (Object.freeze({\n\t\t\t\tput: async (\n\t\t\t\t\tinput: Parameters<OutputArtifactAPI[\"put\"]>[0],\n\t\t\t\t\toptions?: Parameters<OutputArtifactAPI[\"put\"]>[1],\n\t\t\t\t) => {\n\t\t\t\t\tassertActive();\n\t\t\t\t\tconst data = input.data instanceof Uint8Array ? new Uint8Array(input.data) : input.data;\n\t\t\t\t\tconst abort = combinedAbortSignal(operation.signal, options?.signal);\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst ref = await raw.artifact!.put({ ...input, data }, { ...options, signal: abort.signal });\n\t\t\t\t\t\tassertActive();\n\t\t\t\t\t\treturn detachedFreeze(ref) as OutputArtifactRef;\n\t\t\t\t\t} finally {\n\t\t\t\t\t\tabort.dispose();\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tstat: async (ref: OutputArtifactRef) => {\n\t\t\t\t\tassertActive();\n\t\t\t\t\tconst result = await raw.artifact!.stat(detachedFreeze(ref));\n\t\t\t\t\tassertActive();\n\t\t\t\t\treturn detachedFreeze(result);\n\t\t\t\t},\n\t\t\t\tread: async (ref: OutputArtifactRef, options?: Parameters<OutputArtifactAPI[\"read\"]>[1]) => {\n\t\t\t\t\tassertActive();\n\t\t\t\t\tconst chunk = await raw.artifact!.read(detachedFreeze(ref), options);\n\t\t\t\t\tassertActive();\n\t\t\t\t\treturn detachedFreeze({\n\t\t\t\t\t\t...chunk,\n\t\t\t\t\t\tdata: new Uint8Array(chunk.data),\n\t\t\t\t\t}) as OutputArtifactChunk;\n\t\t\t\t},\n\t\t\t}) as OutputArtifactAPI)\n\t\t: undefined;\n\n\tconst operationFacade = raw.operation\n\t\t? Object.freeze({\n\t\t\t\tversion: 1 as const,\n\t\t\t\tid: raw.operation.id,\n\t\t\t\tsignal: raw.operation.signal,\n\t\t\t\tstatus: () => {\n\t\t\t\t\tassertActive();\n\t\t\t\t\treturn raw.operation!.status();\n\t\t\t\t},\n\t\t\t\tisActive: () => active && raw.operation!.isActive(),\n\t\t\t\treportProgress: (progress: OperationProgress) => {\n\t\t\t\t\tassertActive();\n\t\t\t\t\treturn raw.operation!.reportProgress(progress);\n\t\t\t\t},\n\t\t\t\tonCancel: (handler: (reason: unknown) => void | Promise<void>) => {\n\t\t\t\t\tassertActive();\n\t\t\t\t\treturn track(raw.operation!.onCancel(handler));\n\t\t\t\t},\n\t\t\t\tcancel: async (reason?: string) => {\n\t\t\t\t\tassertActive();\n\t\t\t\t\tawait raw.operation!.cancel(reason);\n\t\t\t\t},\n\t\t\t})\n\t\t: createOperationFacade(operation, instance.id, () => active);\n\n\tconst value = Object.freeze({\n\t\tversion: 1 as const,\n\t\t...(session ? { session } : {}),\n\t\t...(context ? { context } : {}),\n\t\t...(state ? { state } : {}),\n\t\t...(instanceState ? { instanceState } : {}),\n\t\t...(artifact ? { artifact } : {}),\n\t\t...(operationFacade ? { operation: operationFacade } : {}),\n\t\t...(raw.model\n\t\t\t? {\n\t\t\t\t\tmodel: Object.freeze({\n\t\t\t\t\t\tversion: 1 as const,\n\t\t\t\t\t\tget facts() {\n\t\t\t\t\t\t\tassertActive();\n\t\t\t\t\t\t\treturn raw.model!.facts;\n\t\t\t\t\t\t},\n\t\t\t\t\t\tinvocation: {\n\t\t\t\t\t\t\tinvoke: async (input: Parameters<AgentModelInvocationV1[\"invoke\"]>[0], signal: AbortSignal) => {\n\t\t\t\t\t\t\t\tassertActive();\n\t\t\t\t\t\t\t\tconst result = await raw.model!.invocation.invoke(input, signal);\n\t\t\t\t\t\t\t\tassertActive();\n\t\t\t\t\t\t\t\treturn result;\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t}) satisfies AgentModelFacadeV1,\n\t\t\t\t}\n\t\t\t: {}),\n\t\t...(raw.tool\n\t\t\t? {\n\t\t\t\t\ttool: Object.freeze({\n\t\t\t\t\t\tversion: 1 as const,\n\t\t\t\t\t\tlistTools: () => {\n\t\t\t\t\t\t\tassertActive();\n\t\t\t\t\t\t\treturn raw.tool!.listTools();\n\t\t\t\t\t\t},\n\t\t\t\t\t\tinvokeTool: (name: string, input: unknown, invokeOptions?: { readonly signal?: AbortSignal }) => {\n\t\t\t\t\t\t\tassertActive();\n\t\t\t\t\t\t\treturn raw.tool!.invokeTool(name, input, invokeOptions);\n\t\t\t\t\t\t},\n\t\t\t\t\t}) satisfies AgentToolFacadeV1,\n\t\t\t\t}\n\t\t\t: {}),\n\t});\n\treturn {\n\t\tvalue,\n\t\trevoke: () => {\n\t\t\tif (!active) return;\n\t\t\tactive = false;\n\t\t\tfor (const cleanup of [...cleanups]) void cleanup();\n\t\t},\n\t};\n}\n\nclass AgentInstanceRuntime<TInput, TResult> implements AgentInstance<TInput, TResult> {\n\treadonly id: string;\n\treadonly definition: AgentDefinition<TInput, TResult>;\n\n\tprivate statusValue: AgentInstanceStatus = \"created\";\n\tprivate revisionValue = 0;\n\tprivate activeLease?: ControllerLeaseRuntime;\n\tprivate activeOperation?: OperationRuntime<TResult>;\n\tprivate activeExecution?: Promise<void>;\n\tprivate completion: Promise<AgentInstanceResult<TResult>>;\n\tprivate resolveCompletion!: (result: AgentInstanceResult<TResult>) => void;\n\tprivate completionResolved = false;\n\tprivate readonly parentInstanceId: string | undefined;\n\tprivate readonly nextId: (kind: string) => string;\n\tprivate readonly defaultLeaseOwner: string;\n\tprivate readonly hostPrimitivesFactory?: AgentHostPrimitivesFactory;\n\tprivate readonly lifecycleDispatcher?: AgentCompositionLifecycleDispatcher;\n\tprivate readonly clearInstanceState?: (instanceId: string) => void;\n\n\tconstructor(\n\t\tdefinition: AgentDefinition<TInput, TResult>,\n\t\tid: string,\n\t\tparentInstanceId: string | undefined,\n\t\tnextId: (kind: string) => string,\n\t\tdefaultLeaseOwner: string,\n\t\thostPrimitivesFactory: AgentHostPrimitivesFactory | undefined,\n\t\tlifecycleDispatcher: AgentCompositionLifecycleDispatcher | undefined,\n\t\tclearInstanceState: ((instanceId: string) => void) | undefined,\n\t) {\n\t\tthis.id = id;\n\t\tthis.definition = definition;\n\t\tthis.parentInstanceId = parentInstanceId;\n\t\tthis.nextId = nextId;\n\t\tthis.defaultLeaseOwner = defaultLeaseOwner;\n\t\tthis.hostPrimitivesFactory = hostPrimitivesFactory;\n\t\tthis.lifecycleDispatcher = lifecycleDispatcher;\n\t\tthis.clearInstanceState = clearInstanceState;\n\t\tthis.completion = new Promise<AgentInstanceResult<TResult>>((resolve) => {\n\t\t\tthis.resolveCompletion = resolve;\n\t\t});\n\t}\n\n\tsnapshot(): AgentInstanceSnapshot {\n\t\treturn freezeSnapshot({\n\t\t\tid: this.id,\n\t\t\tdefinitionId: this.definition.id,\n\t\t\tdefinitionVersion: this.definition.version,\n\t\t\trole: this.definition.role,\n\t\t\t...(this.parentInstanceId ? { parentInstanceId: this.parentInstanceId } : {}),\n\t\t\tstatus: this.statusValue,\n\t\t\trevision: this.revisionValue,\n\t\t\t...(this.activeLease?.isActive() ? { leaseOwner: this.activeLease.owner } : {}),\n\t\t});\n\t}\n\n\tasync acquireControllerLease(\n\t\towner = this.definition.owner ?? this.defaultLeaseOwner,\n\t): Promise<AgentControllerLease> {\n\t\tthis.assertNotDisposed();\n\t\tif (this.activeLease?.isActive())\n\t\t\tthrow new Error(t(\"Agent instance already has an active controller lease: {id}\", { id: this.id }));\n\t\tconst lease = new ControllerLeaseRuntime(this, this.nextId(\"agent-lease\"), owner, this.revisionValue + 1);\n\t\tthis.activeLease = lease;\n\t\treturn lease;\n\t}\n\n\trun(input: TInput, options: { lease?: AgentControllerLease; signal?: AbortSignal } = {}): OperationHandle<TResult> {\n\t\tthis.assertNotDisposed();\n\t\tif (this.statusValue !== \"created\")\n\t\t\tthrow new Error(\n\t\t\t\tt(\"Agent instance cannot run from status {statusValue}: {id}\", {\n\t\t\t\t\tstatusValue: this.statusValue,\n\t\t\t\t\tid: this.id,\n\t\t\t\t}),\n\t\t\t);\n\t\tconst lease = this.activeLease;\n\t\tif (!lease?.isActive())\n\t\t\tthrow new Error(t(\"Agent instance requires an active controller lease: {id}\", { id: this.id }));\n\t\tif (options.lease !== lease || !this.isLeaseUsable(options.lease)) {\n\t\t\tthrow new Error(t(\"Agent controller lease is not valid for instance: {id}\", { id: this.id }));\n\t\t}\n\n\t\tthis.statusValue = \"running\";\n\t\tconst controller = new AbortController();\n\t\tconst externalSignal = options.signal;\n\t\tlet externalAbortListener: (() => void) | undefined;\n\t\tif (externalSignal) {\n\t\t\texternalAbortListener = () => {\n\t\t\t\tcontroller.abort(externalSignal.reason);\n\t\t\t\tvoid this.cancel(externalSignal.reason === undefined ? undefined : String(externalSignal.reason));\n\t\t\t};\n\t\t\tif (!externalSignal.aborted) externalSignal.addEventListener(\"abort\", externalAbortListener, { once: true });\n\t\t}\n\n\t\tlet operation!: OperationRuntime<TResult>;\n\t\toperation = new OperationRuntime<TResult>(\n\t\t\tthis.nextId(\"agent-operation\"),\n\t\t\tcontroller,\n\t\t\t() => this.cancel(controller.signal.reason),\n\t\t\t(progress, step) => this.reportLifecycle(\"step\", operation, undefined, progress, step),\n\t\t);\n\t\tthis.activeOperation = operation;\n\t\tif (externalSignal?.aborted) {\n\t\t\tcontroller.abort(externalSignal.reason);\n\t\t} else {\n\t\t\tthis.reportLifecycle(\"start\", operation);\n\t\t}\n\t\tthis.activeExecution = this.execute(input, lease, operation, externalSignal, externalAbortListener);\n\t\tif (externalSignal?.aborted) {\n\t\t\t// Trigger cancellation only after the execution is tracked, so the\n\t\t\t// pre-aborted path drains like every other cancellation path instead\n\t\t\t// of resolving completion ahead of the execution body.\n\t\t\tvoid this.cancel(externalSignal.reason === undefined ? undefined : String(externalSignal.reason));\n\t\t}\n\t\treturn operation;\n\t}\n\n\tasync wait(): Promise<AgentInstanceResult<TResult>> {\n\t\treturn this.completion;\n\t}\n\n\tasync cancel(reason?: string): Promise<void> {\n\t\tif (this.statusValue === \"disposed\" || terminalStatuses.has(this.statusValue)) return;\n\t\tthis.statusValue = \"cancelled\";\n\t\tthis.revisionValue += 1;\n\t\tconst operation = this.activeOperation;\n\t\tif (operation) {\n\t\t\tthis.reportLifecycle(\"cancel\", operation);\n\t\t\tthis.reportLifecycle(\"end\", operation, \"cancelled\");\n\t\t\toperation.cancelFromInstance(reason);\n\t\t}\n\t\t// The run body must eventually observe the abort signal: cancellation only\n\t\t// settles after the execution drained, so wait() and lease disposal never\n\t\t// race side effects still in flight. There is deliberately no timeout. A run\n\t\t// body that awaits this cancel(), dispose(), or its own lease release\n\t\t// self-deadlocks by contract.\n\t\tawait this.drainExecution();\n\t\tthis.resolveCompletionOnce({ status: \"cancelled\", revision: this.revisionValue, error: abortError(reason) });\n\t}\n\n\tasync dispose(): Promise<void> {\n\t\tif (this.statusValue === \"disposed\") return;\n\t\tif (this.statusValue === \"created\") {\n\t\t\tawait this.activeLease?.release();\n\t\t\tthis.statusValue = \"disposed\";\n\t\t\tthis.revisionValue += 1;\n\t\t\tthis.clearInstanceState?.(this.id);\n\t\t\tthis.resolveCompletionOnce({ status: \"disposed\", revision: this.revisionValue });\n\t\t\treturn;\n\t\t}\n\t\tif (!terminalStatuses.has(this.statusValue)) await this.cancel(\"Agent instance disposed\");\n\t\t// A concurrent cancel() may still be draining; release the lease only after\n\t\t// the execution has settled.\n\t\tawait this.drainExecution();\n\t\tawait this.activeLease?.release();\n\t\tthis.statusValue = \"disposed\";\n\t\tthis.revisionValue += 1;\n\t\t// The instance-private state namespace (and its watchers) dies with the\n\t\t// instance, after every drain the run body could still rely on.\n\t\tthis.clearInstanceState?.(this.id);\n\t\tthis.resolveCompletionOnce({ status: \"disposed\", revision: this.revisionValue });\n\t}\n\n\tasync deactivateLease(lease: ControllerLeaseRuntime): Promise<void> {\n\t\tif (this.activeLease !== lease) return;\n\t\tthis.activeLease = undefined;\n\t\tif (this.statusValue === \"running\") {\n\t\t\tawait this.cancel(\"Controller lease released\");\n\t\t\treturn;\n\t\t}\n\t\t// A cancel() from another path may still be draining the execution.\n\t\tawait this.drainExecution();\n\t}\n\n\tisLeaseUsable(lease: AgentControllerLease | undefined): lease is ControllerLeaseRuntime {\n\t\treturn (\n\t\t\tlease instanceof ControllerLeaseRuntime &&\n\t\t\tlease.instanceId === this.id &&\n\t\t\tlease.isActive() &&\n\t\t\tthis.activeLease === lease\n\t\t);\n\t}\n\n\tprivate async execute(\n\t\tinput: TInput,\n\t\tlease: ControllerLeaseRuntime,\n\t\toperation: OperationRuntime<TResult>,\n\t\texternalSignal: AbortSignal | undefined,\n\t\texternalAbortListener: (() => void) | undefined,\n\t): Promise<void> {\n\t\tconst instanceSnapshot = this.snapshot();\n\t\tlet hostScope: RevocableHost | undefined;\n\t\tconst revokeHost = () => hostScope?.revoke();\n\t\toperation.signal.addEventListener(\"abort\", revokeHost, { once: true });\n\t\ttry {\n\t\t\tif (operation.signal.aborted) throw abortError(operation.signal.reason);\n\t\t\tif (this.hostPrimitivesFactory) {\n\t\t\t\tconst raw = await this.hostPrimitivesFactory({\n\t\t\t\t\tinstance: instanceSnapshot,\n\t\t\t\t\toperationId: operation.id,\n\t\t\t\t\tsignal: operation.signal,\n\t\t\t\t\tleaseOwner: lease.owner,\n\t\t\t\t});\n\t\t\t\tif (raw !== undefined) {\n\t\t\t\t\tif (raw.version !== 1) throw new Error(t(\"Unsupported Agent host primitives version\"));\n\t\t\t\t\tif (raw.operation && (raw.operation.id !== operation.id || raw.operation.signal !== operation.signal))\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\tt(\"Agent host operation does not match active operation: {id}\", { id: operation.id }),\n\t\t\t\t\t\t);\n\t\t\t\t\thostScope = createRevocableHostPrimitives(\n\t\t\t\t\t\t{ ...raw, operation: raw.operation ?? createOperationFacade(operation, this.id, () => true) },\n\t\t\t\t\t\toperation as OperationRuntime<unknown>,\n\t\t\t\t\t\tinstanceSnapshot,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (operation.signal.aborted) throw abortError(operation.signal.reason);\n\t\t\tconst context: AgentExecutionContext = Object.freeze({\n\t\t\t\tinstance: instanceSnapshot,\n\t\t\t\tsignal: operation.signal,\n\t\t\t\tinputRevision: this.revisionValue,\n\t\t\t\t...(hostScope ? { host: hostScope.value } : {}),\n\t\t\t});\n\t\t\tconst output = await this.definition.run(input, context);\n\t\t\tif (operation.signal.aborted || !this.isLeaseUsable(lease) || this.statusValue !== \"running\") return;\n\t\t\tthis.statusValue = \"succeeded\";\n\t\t\tthis.revisionValue += 1;\n\t\t\toperation.resolve(output);\n\t\t\tthis.reportLifecycle(\"end\", operation, \"succeeded\");\n\t\t\tthis.resolveCompletionOnce({ status: \"succeeded\", revision: this.revisionValue, output });\n\t\t} catch (error) {\n\t\t\tif (operation.signal.aborted || this.statusValue === \"cancelled\" || this.statusValue === \"disposed\") {\n\t\t\t\t// Instance-level cancellation marks the handle cancelled before this\n\t\t\t\t// catch runs; the pre-aborted run() path gets here first, so settle\n\t\t\t\t// the handle as cancelled instead of failed.\n\t\t\t\toperation.cancelFromInstance(operation.signal.reason);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis.statusValue = \"failed\";\n\t\t\tthis.revisionValue += 1;\n\t\t\toperation.reject(error);\n\t\t\tthis.reportLifecycle(\"end\", operation, \"failed\");\n\t\t\tthis.resolveCompletionOnce({ status: \"failed\", revision: this.revisionValue, error });\n\t\t} finally {\n\t\t\thostScope?.revoke();\n\t\t\toperation.signal.removeEventListener(\"abort\", revokeHost);\n\t\t\tif (externalSignal && externalAbortListener)\n\t\t\t\texternalSignal.removeEventListener(\"abort\", externalAbortListener);\n\t\t\tif (this.activeOperation === operation) this.activeOperation = undefined;\n\t\t\t// run() requires status \"created\", so at most one execution ever exists\n\t\t\t// per instance and clearing the field unconditionally is safe.\n\t\t\tthis.activeExecution = undefined;\n\t\t}\n\t}\n\n\tprivate async drainExecution(): Promise<void> {\n\t\t// Capture the reference before awaiting: execute()'s finally clears the\n\t\t// field while drainers still need the promise.\n\t\tconst execution = this.activeExecution;\n\t\tif (!execution) return;\n\t\tawait execution;\n\t}\n\n\tprivate assertNotDisposed(): void {\n\t\tif (this.statusValue === \"disposed\") throw new Error(t(\"Agent instance is disposed: {id}\", { id: this.id }));\n\t}\n\n\tprivate resolveCompletionOnce(result: AgentInstanceResult<TResult>): void {\n\t\tif (this.completionResolved) return;\n\t\tthis.completionResolved = true;\n\t\tthis.resolveCompletion(result);\n\t}\n\n\tprivate reportLifecycle(\n\t\tevent: AgentCompositionLifecycleEventName,\n\t\toperation: OperationRuntime<TResult>,\n\t\tstatus?: AgentCompositionLifecycleTerminalStatus,\n\t\tprogress?: OperationProgress,\n\t\tstep?: number,\n\t): void {\n\t\tif (!this.lifecycleDispatcher) return;\n\t\ttry {\n\t\t\tthis.lifecycleDispatcher({\n\t\t\t\tevent,\n\t\t\t\toperationId: operation.id,\n\t\t\t\toperationKind: `agent:${this.definition.id}@${this.definition.version}`,\n\t\t\t\t...(this.definition.owner === undefined ? {} : { owner: this.definition.owner }),\n\t\t\t\t...(status === undefined ? {} : { status }),\n\t\t\t\t...(progress === undefined ? {} : { progress }),\n\t\t\t\t...(step === undefined ? {} : { step }),\n\t\t\t});\n\t\t} catch {\n\t\t\t// Lifecycle delivery is observational and must not affect the operation.\n\t\t}\n\t}\n}\n\ninterface LeaseOwner {\n\tid: string;\n\tdeactivateLease(lease: ControllerLeaseRuntime): Promise<void>;\n}\n\nclass ControllerLeaseRuntime implements AgentControllerLease {\n\tprivate active = true;\n\tprivate readonly instance: LeaseOwner;\n\treadonly id: string;\n\treadonly owner: string;\n\treadonly revision: number;\n\n\tconstructor(instance: LeaseOwner, id: string, owner: string, revision: number) {\n\t\tthis.instance = instance;\n\t\tthis.id = id;\n\t\tthis.owner = owner;\n\t\tthis.revision = revision;\n\t}\n\n\tget instanceId(): string {\n\t\treturn this.instance.id;\n\t}\n\n\tisActive(): boolean {\n\t\treturn this.active;\n\t}\n\n\tasync release(): Promise<void> {\n\t\tif (!this.active) return;\n\t\tthis.active = false;\n\t\tawait this.instance.deactivateLease(this);\n\t}\n}\n\nclass OperationRuntime<TResult> implements OperationHandle<TResult> {\n\tprivate statusValue: OperationStatus = \"queued\";\n\tprivate resolveResult!: (result: TResult) => void;\n\tprivate rejectResult!: (error: unknown) => void;\n\treadonly result: Promise<TResult>;\n\treadonly id: string;\n\tprivate readonly controller: AbortController;\n\tprivate readonly cancelCallback: () => Promise<void>;\n\tprivate readonly reportProgressCallback: (progress: OperationProgress, step: number) => void;\n\tprivate progressSequence = 0;\n\n\tconstructor(\n\t\tid: string,\n\t\tcontroller: AbortController,\n\t\tcancelCallback: () => Promise<void>,\n\t\treportProgress: (progress: OperationProgress, step: number) => void,\n\t) {\n\t\tthis.id = id;\n\t\tthis.controller = controller;\n\t\tthis.cancelCallback = cancelCallback;\n\t\tthis.reportProgressCallback = reportProgress;\n\t\tthis.signal = controller.signal;\n\t\tthis.result = new Promise<TResult>((resolve, reject) => {\n\t\t\tthis.resolveResult = resolve;\n\t\t\tthis.rejectResult = reject;\n\t\t});\n\t\tthis.statusValue = \"running\";\n\t}\n\n\treadonly signal: AbortSignal;\n\n\tstatus(): OperationStatus {\n\t\treturn this.statusValue;\n\t}\n\n\treportProgress(progress: OperationProgress): boolean {\n\t\tif (this.statusValue !== \"running\" || this.signal.aborted) return false;\n\t\tthis.reportProgressCallback(progress, ++this.progressSequence);\n\t\treturn true;\n\t}\n\n\tasync cancel(reason?: string): Promise<void> {\n\t\tif (this.statusValue === \"succeeded\" || this.statusValue === \"failed\" || this.statusValue === \"cancelled\") return;\n\t\tthis.controller.abort(reason);\n\t\t// The handle must settle cancellation without waiting for an uncooperative\n\t\t// run body. AgentInstanceRuntime.cancel() still drains the body when the\n\t\t// caller explicitly cancels/releases the instance, but OperationHandle is\n\t\t// the non-blocking public fence used by callers that cannot coordinate the\n\t\t// plugin's private awaits. The callback synchronously marks the operation\n\t\t// cancelled before its first await; any later drain is best-effort here.\n\t\ttry {\n\t\t\tvoid this.cancelCallback().catch(() => undefined);\n\t\t} catch {\n\t\t\t// A cancellation request is already reflected by this operation's\n\t\t\t// aborted signal and terminal status; callback failures must not turn\n\t\t\t// cancel() into an unbounded or rejected wait.\n\t\t}\n\t}\n\n\tcancelFromInstance(reason?: string): void {\n\t\tif (this.statusValue === \"succeeded\" || this.statusValue === \"failed\" || this.statusValue === \"cancelled\") return;\n\t\tthis.statusValue = \"cancelled\";\n\t\tthis.controller.abort(reason);\n\t\tthis.rejectResult(abortError(reason));\n\t}\n\n\tresolve(value: TResult): void {\n\t\tif (this.statusValue === \"cancelled\" || this.statusValue === \"failed\") return;\n\t\tthis.statusValue = \"succeeded\";\n\t\tthis.resolveResult(value);\n\t}\n\n\treject(error: unknown): void {\n\t\tif (this.statusValue === \"cancelled\") return;\n\t\tthis.statusValue = \"failed\";\n\t\tthis.rejectResult(error);\n\t}\n}\n\nexport class AgentCompositionRuntime\n\timplements\n\t\tAgentCompositionAPI,\n\t\tAgentCompositionHostBinding,\n\t\tAgentCompositionDefinitionBinding,\n\t\tAgentCompositionScopedHostBinding,\n\t\tAgentCompositionInstanceStateBinding\n{\n\tprivate readonly definitions = new Map<string, AgentDefinition<unknown, unknown>>();\n\tprivate readonly instances = new Map<string, AgentInstanceRuntime<unknown, unknown>>();\n\tprivate readonly instanceStateClearers = new Set<(instanceId: string) => void>();\n\tprivate sequence = 0;\n\tprivate readonly nextId: (kind: string) => string;\n\tprivate readonly defaultLeaseOwner?: string;\n\tprivate hostPrimitivesFactory?: AgentHostPrimitivesFactory;\n\tprivate lifecycleDispatcher?: AgentCompositionLifecycleDispatcher;\n\n\tconstructor(options: AgentCompositionRuntimeOptions = {}) {\n\t\tthis.defaultLeaseOwner = options.defaultLeaseOwner;\n\t\tthis.hostPrimitivesFactory = options.hostPrimitivesFactory;\n\t\tthis.nextId = options.idFactory ?? ((kind: string) => `${kind}-${++this.sequence}`);\n\t}\n\n\tsetHostPrimitivesFactory(factory?: AgentHostPrimitivesFactory): void {\n\t\tthis.hostPrimitivesFactory = factory;\n\t}\n\n\tsetLifecycleDispatcher(dispatcher?: AgentCompositionLifecycleDispatcher): void {\n\t\tthis.lifecycleDispatcher = dispatcher;\n\t}\n\n\taddInstanceStateClearer(clearer: (instanceId: string) => void): () => void {\n\t\tthis.instanceStateClearers.add(clearer);\n\t\treturn () => {\n\t\t\tthis.instanceStateClearers.delete(clearer);\n\t\t};\n\t}\n\n\tdisposeDefinitions(definitions: readonly AgentDefinition[]): void {\n\t\tconst owned = new Set(definitions);\n\t\tfor (const [key, definition] of this.definitions) {\n\t\t\tif (owned.has(definition)) this.definitions.delete(key);\n\t\t}\n\t\tfor (const [id, instance] of this.instances) {\n\t\t\tif (!owned.has(instance.definition)) continue;\n\t\t\tthis.instances.delete(id);\n\t\t\tvoid instance.dispose();\n\t\t}\n\t}\n\n\tdefine<TInput = unknown, TResult = unknown>(\n\t\tdefinition: AgentDefinition<TInput, TResult>,\n\t): AgentDefinition<TInput, TResult> {\n\t\tvalidateAgentDefinition(definition);\n\t\tif (this.definitions.has(this.definitionKey(definition.id, definition.version))) {\n\t\t\tthrow new Error(\n\t\t\t\tt(\"Agent definition already registered: {id}@{version}\", {\n\t\t\t\t\tid: definition.id,\n\t\t\t\t\tversion: definition.version,\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\t\tconst frozen = Object.freeze({ ...definition });\n\t\tthis.definitions.set(\n\t\t\tthis.definitionKey(definition.id, definition.version),\n\t\t\tfrozen as AgentDefinition<unknown, unknown>,\n\t\t);\n\t\treturn frozen;\n\t}\n\n\tget<TInput = unknown, TResult = unknown>(id: string, version: number): AgentDefinition<TInput, TResult> {\n\t\tconst definition = this.definitions.get(this.definitionKey(id, version));\n\t\tif (!definition) throw new Error(t(\"Unknown Agent definition: {id}@{version}\", { id, version }));\n\t\treturn definition as AgentDefinition<TInput, TResult>;\n\t}\n\n\tcreate<TInput = unknown, TResult = unknown>(\n\t\tdefinition: AgentDefinition<TInput, TResult> | DefinitionRef,\n\t\toptions: { id?: string; parentInstanceId?: string } = {},\n\t): AgentInstance<TInput, TResult> {\n\t\treturn this.createInternal(definition, options, this.hostPrimitivesFactory);\n\t}\n\n\tcreateWithHostPrimitives<TInput = unknown, TResult = unknown>(\n\t\tdefinition: AgentDefinition<TInput, TResult> | DefinitionRef,\n\t\toptions: { id?: string; parentInstanceId?: string } | undefined,\n\t\thostPrimitivesFactory: AgentHostPrimitivesFactory,\n\t\tlifecycleDispatcher?: AgentCompositionLifecycleDispatcher,\n\t): AgentInstance<TInput, TResult> {\n\t\t// A CapabilityRuntime supplies a complete, session-bound factory for this\n\t\t// plugin invocation. Do not merge the runtime-wide factory here: one\n\t\t// composition runtime may be shared by more than one AgentSession.\n\t\treturn this.createInternal(\n\t\t\tdefinition,\n\t\t\toptions ?? {},\n\t\t\thostPrimitivesFactory,\n\t\t\tlifecycleDispatcher ?? this.lifecycleDispatcher,\n\t\t);\n\t}\n\n\tprivate createInternal<TInput = unknown, TResult = unknown>(\n\t\tdefinition: AgentDefinition<TInput, TResult> | DefinitionRef,\n\t\toptions: { id?: string; parentInstanceId?: string },\n\t\thostPrimitivesFactory: AgentHostPrimitivesFactory | undefined,\n\t\tlifecycleDispatcher: AgentCompositionLifecycleDispatcher | undefined = this.lifecycleDispatcher,\n\t): AgentInstance<TInput, TResult> {\n\t\tif (!definition || typeof definition !== \"object\")\n\t\t\tthrow new Error(t(\"Agent definition or reference is required\"));\n\t\tconst resolved =\n\t\t\t\"run\" in definition\n\t\t\t\t? validateAgentDefinition(definition as AgentDefinition<TInput, TResult>)\n\t\t\t\t: this.get<TInput, TResult>(definition.id, definition.version);\n\t\tif (options.parentInstanceId !== undefined && !this.instances.has(options.parentInstanceId)) {\n\t\t\tthrow new Error(\n\t\t\t\tt(\"Unknown parent Agent instance: {parentInstanceId}\", { parentInstanceId: options.parentInstanceId }),\n\t\t\t);\n\t\t}\n\t\tif (this.instances.has(options.id ?? \"\"))\n\t\t\tthrow new Error(t(\"Agent instance id already exists: {id}\", { id: options.id ?? \"\" }));\n\t\tconst id = options.id ?? this.nextId(\"agent-instance\");\n\t\tif (this.instances.has(id)) throw new Error(t(\"Agent instance id already exists: {id}\", { id }));\n\t\tconst instance = new AgentInstanceRuntime(\n\t\t\tresolved,\n\t\t\tid,\n\t\t\toptions.parentInstanceId,\n\t\t\tthis.nextId,\n\t\t\tthis.defaultLeaseOwner ?? resolved.owner ?? \"agent-composition\",\n\t\t\thostPrimitivesFactory,\n\t\t\tlifecycleDispatcher,\n\t\t\t(instanceId: string) => {\n\t\t\t\tfor (const clearer of this.instanceStateClearers) clearer(instanceId);\n\t\t\t},\n\t\t);\n\t\tthis.instances.set(id, instance as AgentInstanceRuntime<unknown, unknown>);\n\t\treturn instance;\n\t}\n\n\tlistInstances(): readonly AgentInstanceSnapshot[] {\n\t\treturn Object.freeze([...this.instances.values()].map((instance) => instance.snapshot()));\n\t}\n\n\tprivate definitionKey(id: string, version: number): string {\n\t\treturn `${id}@${version}`;\n\t}\n}\n\nexport function createAgentCompositionRuntime(options: AgentCompositionRuntimeOptions = {}): AgentCompositionRuntime {\n\treturn new AgentCompositionRuntime(options);\n}\n"]}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { t } from "../i18n/index.js";
|
|
1
2
|
const terminalStatuses = new Set(["succeeded", "failed", "cancelled", "disposed"]);
|
|
2
3
|
function abortError(reason) {
|
|
3
4
|
if (reason instanceof Error)
|
|
@@ -34,22 +35,22 @@ function freezeSnapshot(snapshot) {
|
|
|
34
35
|
}
|
|
35
36
|
function validateAgentDefinition(definition) {
|
|
36
37
|
if (!definition || typeof definition !== "object") {
|
|
37
|
-
throw new Error("Agent definition is required");
|
|
38
|
+
throw new Error(t("Agent definition is required"));
|
|
38
39
|
}
|
|
39
40
|
if (typeof definition.id !== "string" || !definition.id.trim()) {
|
|
40
|
-
throw new Error("Agent definition requires a non-empty id");
|
|
41
|
+
throw new Error(t("Agent definition requires a non-empty id"));
|
|
41
42
|
}
|
|
42
43
|
if (!Number.isSafeInteger(definition.version) || definition.version < 1) {
|
|
43
|
-
throw new Error("Agent definition version must be a positive safe integer");
|
|
44
|
+
throw new Error(t("Agent definition version must be a positive safe integer"));
|
|
44
45
|
}
|
|
45
46
|
if (definition.role !== "root-agent-controller" && definition.role !== "child-agent-controller") {
|
|
46
|
-
throw new Error("Agent definition role must be root-agent-controller or child-agent-controller");
|
|
47
|
+
throw new Error(t("Agent definition role must be root-agent-controller or child-agent-controller"));
|
|
47
48
|
}
|
|
48
49
|
if (typeof definition.run !== "function") {
|
|
49
|
-
throw new Error("Agent definition requires a run function");
|
|
50
|
+
throw new Error(t("Agent definition requires a run function"));
|
|
50
51
|
}
|
|
51
52
|
if (definition.owner !== undefined && (typeof definition.owner !== "string" || !definition.owner.trim())) {
|
|
52
|
-
throw new Error("Agent definition owner must be a non-empty string when provided");
|
|
53
|
+
throw new Error(t("Agent definition owner must be a non-empty string when provided"));
|
|
53
54
|
}
|
|
54
55
|
return definition;
|
|
55
56
|
}
|
|
@@ -381,7 +382,7 @@ class AgentInstanceRuntime {
|
|
|
381
382
|
async acquireControllerLease(owner = this.definition.owner ?? this.defaultLeaseOwner) {
|
|
382
383
|
this.assertNotDisposed();
|
|
383
384
|
if (this.activeLease?.isActive())
|
|
384
|
-
throw new Error(
|
|
385
|
+
throw new Error(t("Agent instance already has an active controller lease: {id}", { id: this.id }));
|
|
385
386
|
const lease = new ControllerLeaseRuntime(this, this.nextId("agent-lease"), owner, this.revisionValue + 1);
|
|
386
387
|
this.activeLease = lease;
|
|
387
388
|
return lease;
|
|
@@ -389,12 +390,15 @@ class AgentInstanceRuntime {
|
|
|
389
390
|
run(input, options = {}) {
|
|
390
391
|
this.assertNotDisposed();
|
|
391
392
|
if (this.statusValue !== "created")
|
|
392
|
-
throw new Error(
|
|
393
|
+
throw new Error(t("Agent instance cannot run from status {statusValue}: {id}", {
|
|
394
|
+
statusValue: this.statusValue,
|
|
395
|
+
id: this.id,
|
|
396
|
+
}));
|
|
393
397
|
const lease = this.activeLease;
|
|
394
398
|
if (!lease?.isActive())
|
|
395
|
-
throw new Error(
|
|
399
|
+
throw new Error(t("Agent instance requires an active controller lease: {id}", { id: this.id }));
|
|
396
400
|
if (options.lease !== lease || !this.isLeaseUsable(options.lease)) {
|
|
397
|
-
throw new Error(
|
|
401
|
+
throw new Error(t("Agent controller lease is not valid for instance: {id}", { id: this.id }));
|
|
398
402
|
}
|
|
399
403
|
this.statusValue = "running";
|
|
400
404
|
const controller = new AbortController();
|
|
@@ -506,9 +510,9 @@ class AgentInstanceRuntime {
|
|
|
506
510
|
});
|
|
507
511
|
if (raw !== undefined) {
|
|
508
512
|
if (raw.version !== 1)
|
|
509
|
-
throw new Error("Unsupported Agent host primitives version");
|
|
513
|
+
throw new Error(t("Unsupported Agent host primitives version"));
|
|
510
514
|
if (raw.operation && (raw.operation.id !== operation.id || raw.operation.signal !== operation.signal))
|
|
511
|
-
throw new Error(
|
|
515
|
+
throw new Error(t("Agent host operation does not match active operation: {id}", { id: operation.id }));
|
|
512
516
|
hostScope = createRevocableHostPrimitives({ ...raw, operation: raw.operation ?? createOperationFacade(operation, this.id, () => true) }, operation, instanceSnapshot);
|
|
513
517
|
}
|
|
514
518
|
}
|
|
@@ -565,7 +569,7 @@ class AgentInstanceRuntime {
|
|
|
565
569
|
}
|
|
566
570
|
assertNotDisposed() {
|
|
567
571
|
if (this.statusValue === "disposed")
|
|
568
|
-
throw new Error(
|
|
572
|
+
throw new Error(t("Agent instance is disposed: {id}", { id: this.id }));
|
|
569
573
|
}
|
|
570
574
|
resolveCompletionOnce(result) {
|
|
571
575
|
if (this.completionResolved)
|
|
@@ -730,7 +734,10 @@ export class AgentCompositionRuntime {
|
|
|
730
734
|
define(definition) {
|
|
731
735
|
validateAgentDefinition(definition);
|
|
732
736
|
if (this.definitions.has(this.definitionKey(definition.id, definition.version))) {
|
|
733
|
-
throw new Error(
|
|
737
|
+
throw new Error(t("Agent definition already registered: {id}@{version}", {
|
|
738
|
+
id: definition.id,
|
|
739
|
+
version: definition.version,
|
|
740
|
+
}));
|
|
734
741
|
}
|
|
735
742
|
const frozen = Object.freeze({ ...definition });
|
|
736
743
|
this.definitions.set(this.definitionKey(definition.id, definition.version), frozen);
|
|
@@ -739,7 +746,7 @@ export class AgentCompositionRuntime {
|
|
|
739
746
|
get(id, version) {
|
|
740
747
|
const definition = this.definitions.get(this.definitionKey(id, version));
|
|
741
748
|
if (!definition)
|
|
742
|
-
throw new Error(
|
|
749
|
+
throw new Error(t("Unknown Agent definition: {id}@{version}", { id, version }));
|
|
743
750
|
return definition;
|
|
744
751
|
}
|
|
745
752
|
create(definition, options = {}) {
|
|
@@ -753,18 +760,18 @@ export class AgentCompositionRuntime {
|
|
|
753
760
|
}
|
|
754
761
|
createInternal(definition, options, hostPrimitivesFactory, lifecycleDispatcher = this.lifecycleDispatcher) {
|
|
755
762
|
if (!definition || typeof definition !== "object")
|
|
756
|
-
throw new Error("Agent definition or reference is required");
|
|
763
|
+
throw new Error(t("Agent definition or reference is required"));
|
|
757
764
|
const resolved = "run" in definition
|
|
758
765
|
? validateAgentDefinition(definition)
|
|
759
766
|
: this.get(definition.id, definition.version);
|
|
760
767
|
if (options.parentInstanceId !== undefined && !this.instances.has(options.parentInstanceId)) {
|
|
761
|
-
throw new Error(
|
|
768
|
+
throw new Error(t("Unknown parent Agent instance: {parentInstanceId}", { parentInstanceId: options.parentInstanceId }));
|
|
762
769
|
}
|
|
763
770
|
if (this.instances.has(options.id ?? ""))
|
|
764
|
-
throw new Error(
|
|
771
|
+
throw new Error(t("Agent instance id already exists: {id}", { id: options.id ?? "" }));
|
|
765
772
|
const id = options.id ?? this.nextId("agent-instance");
|
|
766
773
|
if (this.instances.has(id))
|
|
767
|
-
throw new Error(
|
|
774
|
+
throw new Error(t("Agent instance id already exists: {id}", { id }));
|
|
768
775
|
const instance = new AgentInstanceRuntime(resolved, id, options.parentInstanceId, this.nextId, this.defaultLeaseOwner ?? resolved.owner ?? "agent-composition", hostPrimitivesFactory, lifecycleDispatcher, (instanceId) => {
|
|
769
776
|
for (const clearer of this.instanceStateClearers)
|
|
770
777
|
clearer(instanceId);
|