@adcp/sdk 12.0.0 → 12.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/lib/adapters/content-standards-adapter.mjs +0 -6
- package/dist/lib/adapters/content-standards-adapter.mjs.map +1 -1
- package/dist/lib/adapters/derived-account-store.mjs +0 -6
- package/dist/lib/adapters/derived-account-store.mjs.map +1 -1
- package/dist/lib/adapters/governance-adapter.mjs +0 -6
- package/dist/lib/adapters/governance-adapter.mjs.map +1 -1
- package/dist/lib/adapters/implicit-account-store.mjs +0 -6
- package/dist/lib/adapters/implicit-account-store.mjs.map +1 -1
- package/dist/lib/adapters/index.mjs +0 -6
- package/dist/lib/adapters/index.mjs.map +1 -1
- package/dist/lib/adapters/legacy/v2-5/create_media_buy.mjs +0 -6
- package/dist/lib/adapters/legacy/v2-5/create_media_buy.mjs.map +1 -1
- package/dist/lib/adapters/legacy/v2-5/get_products.mjs +0 -6
- package/dist/lib/adapters/legacy/v2-5/get_products.mjs.map +1 -1
- package/dist/lib/adapters/legacy/v2-5/index.mjs +0 -6
- package/dist/lib/adapters/legacy/v2-5/index.mjs.map +1 -1
- package/dist/lib/adapters/legacy/v2-5/list_creative_formats.mjs +0 -6
- package/dist/lib/adapters/legacy/v2-5/list_creative_formats.mjs.map +1 -1
- package/dist/lib/adapters/legacy/v2-5/preview_creative.mjs +0 -6
- package/dist/lib/adapters/legacy/v2-5/preview_creative.mjs.map +1 -1
- package/dist/lib/adapters/legacy/v2-5/sync_creatives.mjs +0 -6
- package/dist/lib/adapters/legacy/v2-5/sync_creatives.mjs.map +1 -1
- package/dist/lib/adapters/legacy/v2-5/types.mjs +0 -6
- package/dist/lib/adapters/legacy/v2-5/update_media_buy.mjs +0 -6
- package/dist/lib/adapters/legacy/v2-5/update_media_buy.mjs.map +1 -1
- package/dist/lib/adapters/oauth-passthrough-resolver.mjs +0 -6
- package/dist/lib/adapters/oauth-passthrough-resolver.mjs.map +1 -1
- package/dist/lib/adapters/property-list-adapter.mjs +0 -6
- package/dist/lib/adapters/property-list-adapter.mjs.map +1 -1
- package/dist/lib/adapters/roster-account-store.mjs +0 -6
- package/dist/lib/adapters/roster-account-store.mjs.map +1 -1
- package/dist/lib/adapters/si-session-manager.mjs +0 -6
- package/dist/lib/adapters/si-session-manager.mjs.map +1 -1
- package/dist/lib/adapters/version/3.0/brand-fields.mjs +0 -6
- package/dist/lib/adapters/version/3.0/brand-fields.mjs.map +1 -1
- package/dist/lib/adapters/version/3.0/get-products.mjs +0 -6
- package/dist/lib/adapters/version/3.0/get-products.mjs.map +1 -1
- package/dist/lib/adapters/version/3.0/index.mjs +0 -6
- package/dist/lib/adapters/version/3.0/index.mjs.map +1 -1
- package/dist/lib/adapters/version/3.0/sync-accounts.mjs +0 -6
- package/dist/lib/adapters/version/3.0/sync-accounts.mjs.map +1 -1
- package/dist/lib/adapters/version/index.mjs +0 -6
- package/dist/lib/adapters/version/index.mjs.map +1 -1
- package/dist/lib/adapters/version/types.mjs +0 -6
- package/dist/lib/advanced.mjs +0 -6
- package/dist/lib/advanced.mjs.map +1 -1
- package/dist/lib/agents/index.generated.mjs +0 -6
- package/dist/lib/agents/index.generated.mjs.map +1 -1
- package/dist/lib/auth/index.mjs +0 -6
- package/dist/lib/auth/index.mjs.map +1 -1
- package/dist/lib/auth/oauth/CLIFlowHandler.mjs +0 -6
- package/dist/lib/auth/oauth/CLIFlowHandler.mjs.map +1 -1
- package/dist/lib/auth/oauth/ClientCredentialsFlow.mjs +0 -6
- package/dist/lib/auth/oauth/ClientCredentialsFlow.mjs.map +1 -1
- package/dist/lib/auth/oauth/MCPOAuthProvider.mjs +0 -6
- package/dist/lib/auth/oauth/MCPOAuthProvider.mjs.map +1 -1
- package/dist/lib/auth/oauth/NonInteractiveFlowHandler.mjs +0 -6
- package/dist/lib/auth/oauth/NonInteractiveFlowHandler.mjs.map +1 -1
- package/dist/lib/auth/oauth/authorization-required.mjs +0 -6
- package/dist/lib/auth/oauth/authorization-required.mjs.map +1 -1
- package/dist/lib/auth/oauth/diagnose.mjs +0 -6
- package/dist/lib/auth/oauth/diagnose.mjs.map +1 -1
- package/dist/lib/auth/oauth/diagnostics.mjs +0 -6
- package/dist/lib/auth/oauth/diagnostics.mjs.map +1 -1
- package/dist/lib/auth/oauth/discovery.mjs +0 -6
- package/dist/lib/auth/oauth/discovery.mjs.map +1 -1
- package/dist/lib/auth/oauth/file-storage.mjs +0 -6
- package/dist/lib/auth/oauth/file-storage.mjs.map +1 -1
- package/dist/lib/auth/oauth/index.mjs +0 -6
- package/dist/lib/auth/oauth/index.mjs.map +1 -1
- package/dist/lib/auth/oauth/secret-resolver.mjs +0 -6
- package/dist/lib/auth/oauth/secret-resolver.mjs.map +1 -1
- package/dist/lib/auth/oauth/storage-registry.mjs +0 -6
- package/dist/lib/auth/oauth/storage-registry.mjs.map +1 -1
- package/dist/lib/auth/oauth/types.mjs +0 -6
- package/dist/lib/auth/oauth/types.mjs.map +1 -1
- package/dist/lib/auth/oauth/web-flow.mjs +0 -6
- package/dist/lib/auth/oauth/web-flow.mjs.map +1 -1
- package/dist/lib/brand/index.mjs +0 -6
- package/dist/lib/brand/index.mjs.map +1 -1
- package/dist/lib/canonical-references/index.mjs +6 -7
- package/dist/lib/canonical-references/index.mjs.map +1 -1
- package/dist/lib/client/index.mjs +0 -6
- package/dist/lib/client/index.mjs.map +1 -1
- package/dist/lib/compliance/index.mjs +0 -6
- package/dist/lib/compliance/index.mjs.map +1 -1
- package/dist/lib/compliance-fixtures/index.mjs +0 -6
- package/dist/lib/compliance-fixtures/index.mjs.map +1 -1
- package/dist/lib/compliance-fixtures/test-authorization-server.mjs +0 -6
- package/dist/lib/compliance-fixtures/test-authorization-server.mjs.map +1 -1
- package/dist/lib/conformance/index.mjs +0 -6
- package/dist/lib/conformance/index.mjs.map +1 -1
- package/dist/lib/conformance/invariants/uniformError.mjs +0 -6
- package/dist/lib/conformance/invariants/uniformError.mjs.map +1 -1
- package/dist/lib/conformance/invariants/uniformErrorComparator.mjs +0 -6
- package/dist/lib/conformance/invariants/uniformErrorComparator.mjs.map +1 -1
- package/dist/lib/conformance/oracle.mjs +0 -6
- package/dist/lib/conformance/oracle.mjs.map +1 -1
- package/dist/lib/conformance/runConformance.mjs +0 -6
- package/dist/lib/conformance/runConformance.mjs.map +1 -1
- package/dist/lib/conformance/runners.mjs +0 -6
- package/dist/lib/conformance/runners.mjs.map +1 -1
- package/dist/lib/conformance/schemaArbitrary.mjs +0 -6
- package/dist/lib/conformance/schemaArbitrary.mjs.map +1 -1
- package/dist/lib/conformance/schemaLoader.mjs +5 -6
- package/dist/lib/conformance/schemaLoader.mjs.map +1 -1
- package/dist/lib/conformance/seeder.mjs +0 -6
- package/dist/lib/conformance/seeder.mjs.map +1 -1
- package/dist/lib/conformance/types.mjs +0 -6
- package/dist/lib/conformance/types.mjs.map +1 -1
- package/dist/lib/conformance/webhook.mjs +0 -6
- package/dist/lib/conformance/webhook.mjs.map +1 -1
- package/dist/lib/core/ADCPMultiAgentClient.mjs +0 -6
- package/dist/lib/core/ADCPMultiAgentClient.mjs.map +1 -1
- package/dist/lib/core/AgentClient.mjs +0 -6
- package/dist/lib/core/AgentClient.mjs.map +1 -1
- package/dist/lib/core/AsyncHandler.mjs +0 -6
- package/dist/lib/core/AsyncHandler.mjs.map +1 -1
- package/dist/lib/core/ConfigurationManager.mjs +0 -6
- package/dist/lib/core/ConfigurationManager.mjs.map +1 -1
- package/dist/lib/core/ConversationTypes.mjs +0 -6
- package/dist/lib/core/CreativeAgentClient.mjs +0 -6
- package/dist/lib/core/CreativeAgentClient.mjs.map +1 -1
- package/dist/lib/core/GovernanceMiddleware.mjs +0 -6
- package/dist/lib/core/GovernanceMiddleware.mjs.map +1 -1
- package/dist/lib/core/GovernanceTypes.mjs +0 -6
- package/dist/lib/core/GovernanceTypes.mjs.map +1 -1
- package/dist/lib/core/ProtocolResponseParser.mjs +0 -6
- package/dist/lib/core/ProtocolResponseParser.mjs.map +1 -1
- package/dist/lib/core/ResponseValidator.mjs +0 -6
- package/dist/lib/core/ResponseValidator.mjs.map +1 -1
- package/dist/lib/core/SingleAgentClient.mjs +0 -6
- package/dist/lib/core/SingleAgentClient.mjs.map +1 -1
- package/dist/lib/core/TaskEventTypes.mjs +0 -6
- package/dist/lib/core/TaskEventTypes.mjs.map +1 -1
- package/dist/lib/core/TaskExecutor.mjs +0 -6
- package/dist/lib/core/TaskExecutor.mjs.map +1 -1
- package/dist/lib/core/match.mjs +0 -6
- package/dist/lib/core/match.mjs.map +1 -1
- package/dist/lib/core/task-status.mjs +0 -6
- package/dist/lib/core/task-status.mjs.map +1 -1
- package/dist/lib/core/webhook-url.mjs +0 -6
- package/dist/lib/core/webhook-url.mjs.map +1 -1
- package/dist/lib/discovery/adagents-redirects.mjs +0 -6
- package/dist/lib/discovery/adagents-redirects.mjs.map +1 -1
- package/dist/lib/discovery/agent-directory.mjs +0 -6
- package/dist/lib/discovery/agent-directory.mjs.map +1 -1
- package/dist/lib/discovery/inline-publisher-properties.mjs +0 -6
- package/dist/lib/discovery/inline-publisher-properties.mjs.map +1 -1
- package/dist/lib/discovery/network-consistency-checker.mjs +0 -6
- package/dist/lib/discovery/network-consistency-checker.mjs.map +1 -1
- package/dist/lib/discovery/property-crawler.mjs +0 -6
- package/dist/lib/discovery/property-crawler.mjs.map +1 -1
- package/dist/lib/discovery/property-index.mjs +0 -6
- package/dist/lib/discovery/property-index.mjs.map +1 -1
- package/dist/lib/discovery/publisher-property-selector.mjs +0 -6
- package/dist/lib/discovery/publisher-property-selector.mjs.map +1 -1
- package/dist/lib/discovery/resolve-agent-properties.mjs +0 -6
- package/dist/lib/discovery/resolve-agent-properties.mjs.map +1 -1
- package/dist/lib/discovery/types.mjs +0 -6
- package/dist/lib/discovery/validate-adagents.mjs +0 -6
- package/dist/lib/discovery/validate-adagents.mjs.map +1 -1
- package/dist/lib/enums.mjs +0 -6
- package/dist/lib/enums.mjs.map +1 -1
- package/dist/lib/errors/index.mjs +0 -6
- package/dist/lib/errors/index.mjs.map +1 -1
- package/dist/lib/express-mcp/index.mjs +0 -6
- package/dist/lib/express-mcp/index.mjs.map +1 -1
- package/dist/lib/governance/index.mjs +0 -6
- package/dist/lib/governance/index.mjs.map +1 -1
- package/dist/lib/handlers/types.mjs +0 -6
- package/dist/lib/handlers/types.mjs.map +1 -1
- package/dist/lib/index.mjs +0 -6
- package/dist/lib/index.mjs.map +1 -1
- package/dist/lib/media-buy/available-actions.mjs +0 -6
- package/dist/lib/media-buy/available-actions.mjs.map +1 -1
- package/dist/lib/media-buy/index.mjs +0 -6
- package/dist/lib/media-buy/index.mjs.map +1 -1
- package/dist/lib/media-buy/preflight.mjs +0 -6
- package/dist/lib/media-buy/preflight.mjs.map +1 -1
- package/dist/lib/media-buy/property-policy.mjs +0 -6
- package/dist/lib/media-buy/property-policy.mjs.map +1 -1
- package/dist/lib/media-buy/types.mjs +0 -6
- package/dist/lib/media-buy/types.mjs.map +1 -1
- package/dist/lib/media-buy/update-fields.generated.mjs +0 -6
- package/dist/lib/media-buy/update-fields.generated.mjs.map +1 -1
- package/dist/lib/mock-server/creative-ad-server/seed-data.mjs +0 -6
- package/dist/lib/mock-server/creative-ad-server/seed-data.mjs.map +1 -1
- package/dist/lib/mock-server/creative-ad-server/server.mjs +0 -6
- package/dist/lib/mock-server/creative-ad-server/server.mjs.map +1 -1
- package/dist/lib/mock-server/creative-template/seed-data.mjs +0 -6
- package/dist/lib/mock-server/creative-template/seed-data.mjs.map +1 -1
- package/dist/lib/mock-server/creative-template/server.mjs +0 -6
- package/dist/lib/mock-server/creative-template/server.mjs.map +1 -1
- package/dist/lib/mock-server/index.mjs +0 -6
- package/dist/lib/mock-server/index.mjs.map +1 -1
- package/dist/lib/mock-server/sales-guaranteed/recipe.mjs +0 -6
- package/dist/lib/mock-server/sales-guaranteed/recipe.mjs.map +1 -1
- package/dist/lib/mock-server/sales-guaranteed/seed-data.mjs +0 -6
- package/dist/lib/mock-server/sales-guaranteed/seed-data.mjs.map +1 -1
- package/dist/lib/mock-server/sales-guaranteed/server.mjs +0 -6
- package/dist/lib/mock-server/sales-guaranteed/server.mjs.map +1 -1
- package/dist/lib/mock-server/sales-non-guaranteed/recipe.mjs +0 -6
- package/dist/lib/mock-server/sales-non-guaranteed/recipe.mjs.map +1 -1
- package/dist/lib/mock-server/sales-non-guaranteed/seed-data.mjs +0 -6
- package/dist/lib/mock-server/sales-non-guaranteed/seed-data.mjs.map +1 -1
- package/dist/lib/mock-server/sales-non-guaranteed/server.mjs +0 -6
- package/dist/lib/mock-server/sales-non-guaranteed/server.mjs.map +1 -1
- package/dist/lib/mock-server/sales-social/seed-data.mjs +0 -6
- package/dist/lib/mock-server/sales-social/seed-data.mjs.map +1 -1
- package/dist/lib/mock-server/sales-social/server.mjs +0 -6
- package/dist/lib/mock-server/sales-social/server.mjs.map +1 -1
- package/dist/lib/mock-server/scenario.mjs +0 -6
- package/dist/lib/mock-server/scenario.mjs.map +1 -1
- package/dist/lib/mock-server/signal-marketplace/seed-data.mjs +0 -6
- package/dist/lib/mock-server/signal-marketplace/seed-data.mjs.map +1 -1
- package/dist/lib/mock-server/signal-marketplace/server.mjs +0 -6
- package/dist/lib/mock-server/signal-marketplace/server.mjs.map +1 -1
- package/dist/lib/mock-server/sponsored-intelligence/seed-data.mjs +0 -6
- package/dist/lib/mock-server/sponsored-intelligence/seed-data.mjs.map +1 -1
- package/dist/lib/mock-server/sponsored-intelligence/server.mjs +0 -6
- package/dist/lib/mock-server/sponsored-intelligence/server.mjs.map +1 -1
- package/dist/lib/net/address-guards.mjs +0 -6
- package/dist/lib/net/address-guards.mjs.map +1 -1
- package/dist/lib/net/index.mjs +0 -6
- package/dist/lib/net/index.mjs.map +1 -1
- package/dist/lib/net/ssrf-fetch.mjs +0 -6
- package/dist/lib/net/ssrf-fetch.mjs.map +1 -1
- package/dist/lib/observability/index.mjs +0 -6
- package/dist/lib/observability/index.mjs.map +1 -1
- package/dist/lib/observability/tracing.mjs +6 -7
- package/dist/lib/observability/tracing.mjs.map +1 -1
- package/dist/lib/protocols/a2a.mjs +0 -6
- package/dist/lib/protocols/a2a.mjs.map +1 -1
- package/dist/lib/protocols/abort.mjs +0 -6
- package/dist/lib/protocols/abort.mjs.map +1 -1
- package/dist/lib/protocols/index.mjs +0 -6
- package/dist/lib/protocols/index.mjs.map +1 -1
- package/dist/lib/protocols/mcp-modern.mjs +0 -6
- package/dist/lib/protocols/mcp-modern.mjs.map +1 -1
- package/dist/lib/protocols/mcp-tasks.mjs +0 -6
- package/dist/lib/protocols/mcp-tasks.mjs.map +1 -1
- package/dist/lib/protocols/mcp.mjs +0 -6
- package/dist/lib/protocols/mcp.mjs.map +1 -1
- package/dist/lib/protocols/rawResponseCapture.mjs +0 -6
- package/dist/lib/protocols/rawResponseCapture.mjs.map +1 -1
- package/dist/lib/protocols/responseSizeLimit.mjs +0 -6
- package/dist/lib/protocols/responseSizeLimit.mjs.map +1 -1
- package/dist/lib/protocols/transportDiagnostics.mjs +0 -6
- package/dist/lib/protocols/transportDiagnostics.mjs.map +1 -1
- package/dist/lib/registry/cursor-store.mjs +0 -6
- package/dist/lib/registry/cursor-store.mjs.map +1 -1
- package/dist/lib/registry/feed-stream.mjs +0 -6
- package/dist/lib/registry/feed-stream.mjs.map +1 -1
- package/dist/lib/registry/index.mjs +0 -6
- package/dist/lib/registry/index.mjs.map +1 -1
- package/dist/lib/registry/property-registry.mjs +0 -6
- package/dist/lib/registry/property-registry.mjs.map +1 -1
- package/dist/lib/registry/sync.mjs +0 -6
- package/dist/lib/registry/sync.mjs.map +1 -1
- package/dist/lib/registry/types.generated.mjs +0 -6
- package/dist/lib/registry/types.mjs +0 -6
- package/dist/lib/schemas/index.mjs +0 -6
- package/dist/lib/schemas/index.mjs.map +1 -1
- package/dist/lib/schemas-data/v2.5/_provenance.json +1 -1
- package/dist/lib/server/a2a-adapter.mjs +0 -6
- package/dist/lib/server/a2a-adapter.mjs.map +1 -1
- package/dist/lib/server/account-mode.mjs +0 -6
- package/dist/lib/server/account-mode.mjs.map +1 -1
- package/dist/lib/server/adcp-server.mjs +0 -6
- package/dist/lib/server/adcp-server.mjs.map +1 -1
- package/dist/lib/server/auth-introspection.mjs +0 -6
- package/dist/lib/server/auth-introspection.mjs.map +1 -1
- package/dist/lib/server/auth-signature.mjs +0 -6
- package/dist/lib/server/auth-signature.mjs.map +1 -1
- package/dist/lib/server/auth.mjs +0 -6
- package/dist/lib/server/auth.mjs.map +1 -1
- package/dist/lib/server/create-adcp-server.mjs +0 -6
- package/dist/lib/server/create-adcp-server.mjs.map +1 -1
- package/dist/lib/server/credential-policy.mjs +0 -6
- package/dist/lib/server/credential-policy.mjs.map +1 -1
- package/dist/lib/server/ctx-metadata/backends/memory.mjs +0 -6
- package/dist/lib/server/ctx-metadata/backends/memory.mjs.map +1 -1
- package/dist/lib/server/ctx-metadata/backends/pg.mjs +0 -6
- package/dist/lib/server/ctx-metadata/backends/pg.mjs.map +1 -1
- package/dist/lib/server/ctx-metadata/backends/redis.mjs +0 -6
- package/dist/lib/server/ctx-metadata/backends/redis.mjs.map +1 -1
- package/dist/lib/server/ctx-metadata/index.mjs +0 -6
- package/dist/lib/server/ctx-metadata/index.mjs.map +1 -1
- package/dist/lib/server/ctx-metadata/store.mjs +0 -6
- package/dist/lib/server/ctx-metadata/store.mjs.map +1 -1
- package/dist/lib/server/ctx-metadata/wire-shape.mjs +0 -6
- package/dist/lib/server/ctx-metadata/wire-shape.mjs.map +1 -1
- package/dist/lib/server/decisioning/account.mjs +0 -6
- package/dist/lib/server/decisioning/account.mjs.map +1 -1
- package/dist/lib/server/decisioning/admin-router.mjs +0 -6
- package/dist/lib/server/decisioning/admin-router.mjs.map +1 -1
- package/dist/lib/server/decisioning/assembly-helpers.mjs +0 -6
- package/dist/lib/server/decisioning/assembly-helpers.mjs.map +1 -1
- package/dist/lib/server/decisioning/async-outcome.mjs +0 -6
- package/dist/lib/server/decisioning/async-outcome.mjs.map +1 -1
- package/dist/lib/server/decisioning/buyer-agent.mjs +0 -6
- package/dist/lib/server/decisioning/buyer-agent.mjs.map +1 -1
- package/dist/lib/server/decisioning/capabilities.mjs +0 -6
- package/dist/lib/server/decisioning/capabilities.mjs.map +1 -1
- package/dist/lib/server/decisioning/compose.mjs +0 -6
- package/dist/lib/server/decisioning/compose.mjs.map +1 -1
- package/dist/lib/server/decisioning/context.mjs +0 -6
- package/dist/lib/server/decisioning/errors-typed.mjs +0 -6
- package/dist/lib/server/decisioning/errors-typed.mjs.map +1 -1
- package/dist/lib/server/decisioning/helpers.mjs +0 -6
- package/dist/lib/server/decisioning/helpers.mjs.map +1 -1
- package/dist/lib/server/decisioning/index.mjs +0 -6
- package/dist/lib/server/decisioning/index.mjs.map +1 -1
- package/dist/lib/server/decisioning/list-helpers.mjs +0 -6
- package/dist/lib/server/decisioning/list-helpers.mjs.map +1 -1
- package/dist/lib/server/decisioning/manifest-helpers.mjs +0 -6
- package/dist/lib/server/decisioning/manifest-helpers.mjs.map +1 -1
- package/dist/lib/server/decisioning/pagination.mjs +0 -6
- package/dist/lib/server/decisioning/platform-helpers.mjs +0 -6
- package/dist/lib/server/decisioning/platform-helpers.mjs.map +1 -1
- package/dist/lib/server/decisioning/platform.mjs +0 -6
- package/dist/lib/server/decisioning/proposal/dispatch.mjs +0 -6
- package/dist/lib/server/decisioning/proposal/dispatch.mjs.map +1 -1
- package/dist/lib/server/decisioning/proposal/index.mjs +0 -6
- package/dist/lib/server/decisioning/proposal/index.mjs.map +1 -1
- package/dist/lib/server/decisioning/proposal/lifecycle.mjs +0 -6
- package/dist/lib/server/decisioning/proposal/lifecycle.mjs.map +1 -1
- package/dist/lib/server/decisioning/proposal/mock-manager.mjs +0 -6
- package/dist/lib/server/decisioning/proposal/mock-manager.mjs.map +1 -1
- package/dist/lib/server/decisioning/proposal/store.mjs +0 -6
- package/dist/lib/server/decisioning/proposal/store.mjs.map +1 -1
- package/dist/lib/server/decisioning/proposal/types.mjs +0 -6
- package/dist/lib/server/decisioning/proposal/types.mjs.map +1 -1
- package/dist/lib/server/decisioning/resolve-presets.mjs +0 -6
- package/dist/lib/server/decisioning/resolve-presets.mjs.map +1 -1
- package/dist/lib/server/decisioning/runtime/entity-hydration.generated.mjs +0 -6
- package/dist/lib/server/decisioning/runtime/entity-hydration.generated.mjs.map +1 -1
- package/dist/lib/server/decisioning/runtime/from-platform.mjs +0 -6
- package/dist/lib/server/decisioning/runtime/from-platform.mjs.map +1 -1
- package/dist/lib/server/decisioning/runtime/observed-modes.mjs +0 -6
- package/dist/lib/server/decisioning/runtime/observed-modes.mjs.map +1 -1
- package/dist/lib/server/decisioning/runtime/postgres-task-registry.mjs +0 -6
- package/dist/lib/server/decisioning/runtime/postgres-task-registry.mjs.map +1 -1
- package/dist/lib/server/decisioning/runtime/protocol-for-tool.mjs +0 -6
- package/dist/lib/server/decisioning/runtime/protocol-for-tool.mjs.map +1 -1
- package/dist/lib/server/decisioning/runtime/task-registry.mjs +0 -6
- package/dist/lib/server/decisioning/runtime/task-registry.mjs.map +1 -1
- package/dist/lib/server/decisioning/runtime/to-context.mjs +0 -6
- package/dist/lib/server/decisioning/runtime/to-context.mjs.map +1 -1
- package/dist/lib/server/decisioning/runtime/validate-platform.mjs +0 -6
- package/dist/lib/server/decisioning/runtime/validate-platform.mjs.map +1 -1
- package/dist/lib/server/decisioning/specialisms/audiences.mjs +0 -6
- package/dist/lib/server/decisioning/specialisms/brand-rights.mjs +0 -6
- package/dist/lib/server/decisioning/specialisms/campaign-governance.mjs +0 -6
- package/dist/lib/server/decisioning/specialisms/content-standards.mjs +0 -6
- package/dist/lib/server/decisioning/specialisms/creative-ad-server.mjs +0 -6
- package/dist/lib/server/decisioning/specialisms/creative.mjs +0 -6
- package/dist/lib/server/decisioning/specialisms/lists.mjs +0 -6
- package/dist/lib/server/decisioning/specialisms/sales.mjs +0 -6
- package/dist/lib/server/decisioning/specialisms/signals.mjs +0 -6
- package/dist/lib/server/decisioning/specialisms/sponsored-intelligence.mjs +0 -6
- package/dist/lib/server/decisioning/start-time.mjs +0 -6
- package/dist/lib/server/decisioning/start-time.mjs.map +1 -1
- package/dist/lib/server/decisioning/status-changes.mjs +0 -6
- package/dist/lib/server/decisioning/status-changes.mjs.map +1 -1
- package/dist/lib/server/decisioning/status-mappers.mjs +0 -6
- package/dist/lib/server/decisioning/status-mappers.mjs.map +1 -1
- package/dist/lib/server/decisioning/tenant-registry.mjs +0 -6
- package/dist/lib/server/decisioning/tenant-registry.mjs.map +1 -1
- package/dist/lib/server/decisioning/tenant-store.mjs +0 -6
- package/dist/lib/server/decisioning/tenant-store.mjs.map +1 -1
- package/dist/lib/server/decisioning/validate-specialisms.mjs +0 -6
- package/dist/lib/server/decisioning/validate-specialisms.mjs.map +1 -1
- package/dist/lib/server/dynamic-registry.mjs +0 -6
- package/dist/lib/server/dynamic-registry.mjs.map +1 -1
- package/dist/lib/server/envelope-allowlist.mjs +0 -6
- package/dist/lib/server/envelope-allowlist.mjs.map +1 -1
- package/dist/lib/server/error-arm-tools.mjs +5 -6
- package/dist/lib/server/error-arm-tools.mjs.map +1 -1
- package/dist/lib/server/errors.mjs +0 -6
- package/dist/lib/server/errors.mjs.map +1 -1
- package/dist/lib/server/example-tld-guard.mjs +0 -6
- package/dist/lib/server/example-tld-guard.mjs.map +1 -1
- package/dist/lib/server/express-adapter.mjs +0 -6
- package/dist/lib/server/express-adapter.mjs.map +1 -1
- package/dist/lib/server/governance.mjs +0 -6
- package/dist/lib/server/governance.mjs.map +1 -1
- package/dist/lib/server/idempotency/backends/lazy.mjs +0 -6
- package/dist/lib/server/idempotency/backends/lazy.mjs.map +1 -1
- package/dist/lib/server/idempotency/backends/memory.mjs +0 -6
- package/dist/lib/server/idempotency/backends/memory.mjs.map +1 -1
- package/dist/lib/server/idempotency/backends/pg.mjs +0 -6
- package/dist/lib/server/idempotency/backends/pg.mjs.map +1 -1
- package/dist/lib/server/idempotency/backends/redis.mjs +0 -6
- package/dist/lib/server/idempotency/backends/redis.mjs.map +1 -1
- package/dist/lib/server/idempotency/index.mjs +0 -6
- package/dist/lib/server/idempotency/index.mjs.map +1 -1
- package/dist/lib/server/idempotency/store.mjs +0 -6
- package/dist/lib/server/idempotency/store.mjs.map +1 -1
- package/dist/lib/server/index.mjs +0 -6
- package/dist/lib/server/index.mjs.map +1 -1
- package/dist/lib/server/legacy/v5/index.mjs +0 -6
- package/dist/lib/server/legacy/v5/index.mjs.map +1 -1
- package/dist/lib/server/mcp-modern-server.mjs +0 -6
- package/dist/lib/server/mcp-modern-server.mjs.map +1 -1
- package/dist/lib/server/media-buy-actions.mjs +0 -6
- package/dist/lib/server/media-buy-actions.mjs.map +1 -1
- package/dist/lib/server/media-buy-helpers.mjs +0 -6
- package/dist/lib/server/media-buy-helpers.mjs.map +1 -1
- package/dist/lib/server/media-buy-store.mjs +0 -6
- package/dist/lib/server/media-buy-store.mjs.map +1 -1
- package/dist/lib/server/normalize-errors.mjs +0 -6
- package/dist/lib/server/normalize-errors.mjs.map +1 -1
- package/dist/lib/server/operational-platform.mjs +0 -6
- package/dist/lib/server/operational-platform.mjs.map +1 -1
- package/dist/lib/server/pick-safe-details.mjs +0 -6
- package/dist/lib/server/pick-safe-details.mjs.map +1 -1
- package/dist/lib/server/pin-and-bind-fetch.mjs +0 -6
- package/dist/lib/server/pin-and-bind-fetch.mjs.map +1 -1
- package/dist/lib/server/postgres-state-store.mjs +0 -6
- package/dist/lib/server/postgres-state-store.mjs.map +1 -1
- package/dist/lib/server/postgres-task-store.mjs +0 -6
- package/dist/lib/server/postgres-task-store.mjs.map +1 -1
- package/dist/lib/server/product-defaults.mjs +0 -6
- package/dist/lib/server/product-defaults.mjs.map +1 -1
- package/dist/lib/server/redact.mjs +0 -6
- package/dist/lib/server/redact.mjs.map +1 -1
- package/dist/lib/server/responses.mjs +0 -6
- package/dist/lib/server/responses.mjs.map +1 -1
- package/dist/lib/server/serve.mjs +0 -6
- package/dist/lib/server/serve.mjs.map +1 -1
- package/dist/lib/server/socket-mode/conformance-client.mjs +0 -6
- package/dist/lib/server/socket-mode/conformance-client.mjs.map +1 -1
- package/dist/lib/server/socket-mode/index.mjs +0 -6
- package/dist/lib/server/socket-mode/index.mjs.map +1 -1
- package/dist/lib/server/socket-mode/ws-transport.mjs +0 -6
- package/dist/lib/server/socket-mode/ws-transport.mjs.map +1 -1
- package/dist/lib/server/state-machine.mjs +0 -6
- package/dist/lib/server/state-machine.mjs.map +1 -1
- package/dist/lib/server/state-store.mjs +0 -6
- package/dist/lib/server/state-store.mjs.map +1 -1
- package/dist/lib/server/structured-serialize.mjs +0 -6
- package/dist/lib/server/structured-serialize.mjs.map +1 -1
- package/dist/lib/server/targeting-helpers.mjs +0 -6
- package/dist/lib/server/targeting-helpers.mjs.map +1 -1
- package/dist/lib/server/tasks.mjs +0 -6
- package/dist/lib/server/tasks.mjs.map +1 -1
- package/dist/lib/server/test-controller-bridge.mjs +0 -6
- package/dist/lib/server/test-controller-bridge.mjs.map +1 -1
- package/dist/lib/server/test-controller.mjs +0 -6
- package/dist/lib/server/test-controller.mjs.map +1 -1
- package/dist/lib/server/upstream-helpers.mjs +0 -6
- package/dist/lib/server/upstream-helpers.mjs.map +1 -1
- package/dist/lib/server/webhook-emitter.mjs +0 -6
- package/dist/lib/server/webhook-emitter.mjs.map +1 -1
- package/dist/lib/server/wire-safe.mjs +0 -6
- package/dist/lib/server/wire-safe.mjs.map +1 -1
- package/dist/lib/server/wire-spec-fields.generated.mjs +0 -6
- package/dist/lib/server/wire-spec-fields.generated.mjs.map +1 -1
- package/dist/lib/server/wrap-envelope.mjs +0 -6
- package/dist/lib/server/wrap-envelope.mjs.map +1 -1
- package/dist/lib/signing/agent-context.mjs +0 -6
- package/dist/lib/signing/agent-context.mjs.map +1 -1
- package/dist/lib/signing/agent-fetch.mjs +0 -6
- package/dist/lib/signing/agent-fetch.mjs.map +1 -1
- package/dist/lib/signing/agent-resolver/canonicalize.mjs +0 -6
- package/dist/lib/signing/agent-resolver/canonicalize.mjs.map +1 -1
- package/dist/lib/signing/agent-resolver/capabilities-types.mjs +0 -6
- package/dist/lib/signing/agent-resolver/capabilities-types.mjs.map +1 -1
- package/dist/lib/signing/agent-resolver/consistency.mjs +0 -6
- package/dist/lib/signing/agent-resolver/consistency.mjs.map +1 -1
- package/dist/lib/signing/agent-resolver/errors.mjs +0 -6
- package/dist/lib/signing/agent-resolver/errors.mjs.map +1 -1
- package/dist/lib/signing/agent-resolver/etld.mjs +0 -6
- package/dist/lib/signing/agent-resolver/etld.mjs.map +1 -1
- package/dist/lib/signing/agent-resolver/fetch-helpers.mjs +0 -6
- package/dist/lib/signing/agent-resolver/fetch-helpers.mjs.map +1 -1
- package/dist/lib/signing/agent-resolver/index.mjs +0 -6
- package/dist/lib/signing/agent-resolver/index.mjs.map +1 -1
- package/dist/lib/signing/agent-resolver/jwks-set.mjs +0 -6
- package/dist/lib/signing/agent-resolver/jwks-set.mjs.map +1 -1
- package/dist/lib/signing/agent-resolver/resolve-agent.mjs +0 -6
- package/dist/lib/signing/agent-resolver/resolve-agent.mjs.map +1 -1
- package/dist/lib/signing/agent-resolver/select-agent.mjs +0 -6
- package/dist/lib/signing/agent-resolver/select-agent.mjs.map +1 -1
- package/dist/lib/signing/agent-resolver/strict-json.mjs +0 -6
- package/dist/lib/signing/agent-resolver/strict-json.mjs.map +1 -1
- package/dist/lib/signing/brand-jwks.mjs +0 -6
- package/dist/lib/signing/brand-jwks.mjs.map +1 -1
- package/dist/lib/signing/canonicalize.mjs +0 -6
- package/dist/lib/signing/canonicalize.mjs.map +1 -1
- package/dist/lib/signing/capability-cache.mjs +0 -6
- package/dist/lib/signing/capability-cache.mjs.map +1 -1
- package/dist/lib/signing/capability-priming.mjs +0 -6
- package/dist/lib/signing/capability-priming.mjs.map +1 -1
- package/dist/lib/signing/client.mjs +0 -6
- package/dist/lib/signing/client.mjs.map +1 -1
- package/dist/lib/signing/content-digest.mjs +0 -6
- package/dist/lib/signing/content-digest.mjs.map +1 -1
- package/dist/lib/signing/crypto.mjs +0 -6
- package/dist/lib/signing/crypto.mjs.map +1 -1
- package/dist/lib/signing/ecdsa-encoding.mjs +0 -6
- package/dist/lib/signing/ecdsa-encoding.mjs.map +1 -1
- package/dist/lib/signing/errors.mjs +0 -6
- package/dist/lib/signing/errors.mjs.map +1 -1
- package/dist/lib/signing/fetch-async.mjs +0 -6
- package/dist/lib/signing/fetch-async.mjs.map +1 -1
- package/dist/lib/signing/fetch.mjs +0 -6
- package/dist/lib/signing/fetch.mjs.map +1 -1
- package/dist/lib/signing/index.mjs +0 -6
- package/dist/lib/signing/index.mjs.map +1 -1
- package/dist/lib/signing/jwks-helpers.mjs +0 -6
- package/dist/lib/signing/jwks-helpers.mjs.map +1 -1
- package/dist/lib/signing/jwks-https.mjs +0 -6
- package/dist/lib/signing/jwks-https.mjs.map +1 -1
- package/dist/lib/signing/jwks.mjs +0 -6
- package/dist/lib/signing/jwks.mjs.map +1 -1
- package/dist/lib/signing/middleware.mjs +0 -6
- package/dist/lib/signing/middleware.mjs.map +1 -1
- package/dist/lib/signing/parser.mjs +0 -6
- package/dist/lib/signing/parser.mjs.map +1 -1
- package/dist/lib/signing/postgres-replay-store.mjs +0 -6
- package/dist/lib/signing/postgres-replay-store.mjs.map +1 -1
- package/dist/lib/signing/protocol-response.mjs +0 -6
- package/dist/lib/signing/protocol-response.mjs.map +1 -1
- package/dist/lib/signing/provider.mjs +0 -6
- package/dist/lib/signing/redis-replay-store.mjs +0 -6
- package/dist/lib/signing/redis-replay-store.mjs.map +1 -1
- package/dist/lib/signing/replay.mjs +0 -6
- package/dist/lib/signing/replay.mjs.map +1 -1
- package/dist/lib/signing/request-context.mjs +0 -6
- package/dist/lib/signing/request-context.mjs.map +1 -1
- package/dist/lib/signing/revocation-https.mjs +0 -6
- package/dist/lib/signing/revocation-https.mjs.map +1 -1
- package/dist/lib/signing/revocation.mjs +0 -6
- package/dist/lib/signing/revocation.mjs.map +1 -1
- package/dist/lib/signing/server.mjs +0 -6
- package/dist/lib/signing/server.mjs.map +1 -1
- package/dist/lib/signing/signer-async.mjs +0 -6
- package/dist/lib/signing/signer-async.mjs.map +1 -1
- package/dist/lib/signing/signer.mjs +0 -6
- package/dist/lib/signing/signer.mjs.map +1 -1
- package/dist/lib/signing/testing.mjs +0 -6
- package/dist/lib/signing/testing.mjs.map +1 -1
- package/dist/lib/signing/types.mjs +0 -6
- package/dist/lib/signing/types.mjs.map +1 -1
- package/dist/lib/signing/verifier.mjs +0 -6
- package/dist/lib/signing/verifier.mjs.map +1 -1
- package/dist/lib/signing/webhook-auth-detection.mjs +0 -6
- package/dist/lib/signing/webhook-auth-detection.mjs.map +1 -1
- package/dist/lib/signing/webhook-verifier.mjs +0 -6
- package/dist/lib/signing/webhook-verifier.mjs.map +1 -1
- package/dist/lib/storage/MemoryStorage.mjs +0 -6
- package/dist/lib/storage/MemoryStorage.mjs.map +1 -1
- package/dist/lib/storage/interfaces.mjs +0 -6
- package/dist/lib/substitution/encoder/SubstitutionEncoder.mjs +0 -6
- package/dist/lib/substitution/encoder/SubstitutionEncoder.mjs.map +1 -1
- package/dist/lib/substitution/encoder/index.mjs +0 -6
- package/dist/lib/substitution/encoder/index.mjs.map +1 -1
- package/dist/lib/substitution/index.mjs +0 -6
- package/dist/lib/substitution/index.mjs.map +1 -1
- package/dist/lib/substitution/observer/SubstitutionObserver.mjs +0 -6
- package/dist/lib/substitution/observer/SubstitutionObserver.mjs.map +1 -1
- package/dist/lib/substitution/observer/alignment.mjs +0 -6
- package/dist/lib/substitution/observer/alignment.mjs.map +1 -1
- package/dist/lib/substitution/observer/assertions.mjs +0 -6
- package/dist/lib/substitution/observer/assertions.mjs.map +1 -1
- package/dist/lib/substitution/observer/html-parser.mjs +0 -6
- package/dist/lib/substitution/observer/html-parser.mjs.map +1 -1
- package/dist/lib/substitution/observer/index.mjs +0 -6
- package/dist/lib/substitution/observer/index.mjs.map +1 -1
- package/dist/lib/substitution/observer/ssrf.mjs +0 -6
- package/dist/lib/substitution/observer/ssrf.mjs.map +1 -1
- package/dist/lib/substitution/rfc3986.mjs +0 -6
- package/dist/lib/substitution/rfc3986.mjs.map +1 -1
- package/dist/lib/substitution/translate.mjs +0 -6
- package/dist/lib/substitution/translate.mjs.map +1 -1
- package/dist/lib/substitution/types.mjs +0 -6
- package/dist/lib/substitution/vectors.mjs +0 -6
- package/dist/lib/substitution/vectors.mjs.map +1 -1
- package/dist/lib/testing/agent-tester.mjs +0 -6
- package/dist/lib/testing/agent-tester.mjs.map +1 -1
- package/dist/lib/testing/client.mjs +0 -6
- package/dist/lib/testing/client.mjs.map +1 -1
- package/dist/lib/testing/compliance/briefs.mjs +0 -6
- package/dist/lib/testing/compliance/briefs.mjs.map +1 -1
- package/dist/lib/testing/compliance/comply.mjs +0 -6
- package/dist/lib/testing/compliance/comply.mjs.map +1 -1
- package/dist/lib/testing/compliance/index.mjs +0 -6
- package/dist/lib/testing/compliance/index.mjs.map +1 -1
- package/dist/lib/testing/compliance/spec-conformance.mjs +0 -6
- package/dist/lib/testing/compliance/spec-conformance.mjs.map +1 -1
- package/dist/lib/testing/compliance/storyboard-tracks.mjs +0 -6
- package/dist/lib/testing/compliance/storyboard-tracks.mjs.map +1 -1
- package/dist/lib/testing/compliance/summary.mjs +0 -6
- package/dist/lib/testing/compliance/summary.mjs.map +1 -1
- package/dist/lib/testing/compliance/types.mjs +0 -6
- package/dist/lib/testing/comply-controller.mjs +0 -6
- package/dist/lib/testing/comply-controller.mjs.map +1 -1
- package/dist/lib/testing/controller-assertions.mjs +0 -6
- package/dist/lib/testing/controller-assertions.mjs.map +1 -1
- package/dist/lib/testing/formatter.mjs +0 -6
- package/dist/lib/testing/formatter.mjs.map +1 -1
- package/dist/lib/testing/index.mjs +0 -6
- package/dist/lib/testing/index.mjs.map +1 -1
- package/dist/lib/testing/local-agent-runner.mjs +0 -6
- package/dist/lib/testing/local-agent-runner.mjs.map +1 -1
- package/dist/lib/testing/orchestrator.mjs +0 -6
- package/dist/lib/testing/orchestrator.mjs.map +1 -1
- package/dist/lib/testing/personas/index.mjs +0 -6
- package/dist/lib/testing/personas/index.mjs.map +1 -1
- package/dist/lib/testing/scenarios/brand-rights.mjs +0 -6
- package/dist/lib/testing/scenarios/brand-rights.mjs.map +1 -1
- package/dist/lib/testing/scenarios/capabilities.mjs +0 -6
- package/dist/lib/testing/scenarios/capabilities.mjs.map +1 -1
- package/dist/lib/testing/scenarios/creative.mjs +0 -6
- package/dist/lib/testing/scenarios/creative.mjs.map +1 -1
- package/dist/lib/testing/scenarios/deterministic.mjs +0 -6
- package/dist/lib/testing/scenarios/deterministic.mjs.map +1 -1
- package/dist/lib/testing/scenarios/discovery.mjs +0 -6
- package/dist/lib/testing/scenarios/discovery.mjs.map +1 -1
- package/dist/lib/testing/scenarios/edge-cases.mjs +0 -6
- package/dist/lib/testing/scenarios/edge-cases.mjs.map +1 -1
- package/dist/lib/testing/scenarios/error-compliance.mjs +0 -6
- package/dist/lib/testing/scenarios/error-compliance.mjs.map +1 -1
- package/dist/lib/testing/scenarios/governance.mjs +0 -6
- package/dist/lib/testing/scenarios/governance.mjs.map +1 -1
- package/dist/lib/testing/scenarios/health.mjs +0 -6
- package/dist/lib/testing/scenarios/health.mjs.map +1 -1
- package/dist/lib/testing/scenarios/index.mjs +0 -6
- package/dist/lib/testing/scenarios/index.mjs.map +1 -1
- package/dist/lib/testing/scenarios/media-buy.mjs +0 -6
- package/dist/lib/testing/scenarios/media-buy.mjs.map +1 -1
- package/dist/lib/testing/scenarios/schema-compliance.mjs +0 -6
- package/dist/lib/testing/scenarios/schema-compliance.mjs.map +1 -1
- package/dist/lib/testing/scenarios/signals.mjs +0 -6
- package/dist/lib/testing/scenarios/signals.mjs.map +1 -1
- package/dist/lib/testing/scenarios/sponsored-intelligence.mjs +0 -6
- package/dist/lib/testing/scenarios/sponsored-intelligence.mjs.map +1 -1
- package/dist/lib/testing/scenarios/trusted-match.mjs +0 -6
- package/dist/lib/testing/scenarios/trusted-match.mjs.map +1 -1
- package/dist/lib/testing/seed-merge.mjs +0 -6
- package/dist/lib/testing/seed-merge.mjs.map +1 -1
- package/dist/lib/testing/storyboard/agent-routing.mjs +0 -6
- package/dist/lib/testing/storyboard/agent-routing.mjs.map +1 -1
- package/dist/lib/testing/storyboard/assertions.mjs +0 -6
- package/dist/lib/testing/storyboard/assertions.mjs.map +1 -1
- package/dist/lib/testing/storyboard/canonical-format-satisfaction.mjs +0 -6
- package/dist/lib/testing/storyboard/canonical-format-satisfaction.mjs.map +1 -1
- package/dist/lib/testing/storyboard/compliance.mjs +5 -6
- package/dist/lib/testing/storyboard/compliance.mjs.map +1 -1
- package/dist/lib/testing/storyboard/context.mjs +0 -6
- package/dist/lib/testing/storyboard/context.mjs.map +1 -1
- package/dist/lib/testing/storyboard/default-invariants.mjs +0 -6
- package/dist/lib/testing/storyboard/default-invariants.mjs.map +1 -1
- package/dist/lib/testing/storyboard/index.mjs +0 -6
- package/dist/lib/testing/storyboard/index.mjs.map +1 -1
- package/dist/lib/testing/storyboard/junit.mjs +0 -6
- package/dist/lib/testing/storyboard/junit.mjs.map +1 -1
- package/dist/lib/testing/storyboard/loader.mjs +0 -6
- package/dist/lib/testing/storyboard/loader.mjs.map +1 -1
- package/dist/lib/testing/storyboard/parallel-dispatch.mjs +0 -6
- package/dist/lib/testing/storyboard/parallel-dispatch.mjs.map +1 -1
- package/dist/lib/testing/storyboard/path.mjs +0 -6
- package/dist/lib/testing/storyboard/path.mjs.map +1 -1
- package/dist/lib/testing/storyboard/probes.mjs +0 -6
- package/dist/lib/testing/storyboard/probes.mjs.map +1 -1
- package/dist/lib/testing/storyboard/rate-limit-trip.mjs +0 -6
- package/dist/lib/testing/storyboard/rate-limit-trip.mjs.map +1 -1
- package/dist/lib/testing/storyboard/rejection-hints.mjs +0 -6
- package/dist/lib/testing/storyboard/rejection-hints.mjs.map +1 -1
- package/dist/lib/testing/storyboard/request-builder.mjs +0 -6
- package/dist/lib/testing/storyboard/request-builder.mjs.map +1 -1
- package/dist/lib/testing/storyboard/request-signing/builder.mjs +0 -6
- package/dist/lib/testing/storyboard/request-signing/builder.mjs.map +1 -1
- package/dist/lib/testing/storyboard/request-signing/grader.mjs +0 -6
- package/dist/lib/testing/storyboard/request-signing/grader.mjs.map +1 -1
- package/dist/lib/testing/storyboard/request-signing/index.mjs +0 -6
- package/dist/lib/testing/storyboard/request-signing/index.mjs.map +1 -1
- package/dist/lib/testing/storyboard/request-signing/probe-dispatch.mjs +0 -6
- package/dist/lib/testing/storyboard/request-signing/probe-dispatch.mjs.map +1 -1
- package/dist/lib/testing/storyboard/request-signing/probe.mjs +0 -6
- package/dist/lib/testing/storyboard/request-signing/probe.mjs.map +1 -1
- package/dist/lib/testing/storyboard/request-signing/synthesize.mjs +0 -6
- package/dist/lib/testing/storyboard/request-signing/synthesize.mjs.map +1 -1
- package/dist/lib/testing/storyboard/request-signing/test-kit.mjs +0 -6
- package/dist/lib/testing/storyboard/request-signing/test-kit.mjs.map +1 -1
- package/dist/lib/testing/storyboard/request-signing/types.mjs +0 -6
- package/dist/lib/testing/storyboard/request-signing/types.mjs.map +1 -1
- package/dist/lib/testing/storyboard/request-signing/vector-loader.mjs +0 -6
- package/dist/lib/testing/storyboard/request-signing/vector-loader.mjs.map +1 -1
- package/dist/lib/testing/storyboard/runner.mjs +0 -6
- package/dist/lib/testing/storyboard/runner.mjs.map +1 -1
- package/dist/lib/testing/storyboard/sandbox-entities.mjs +0 -6
- package/dist/lib/testing/storyboard/sandbox-entities.mjs.map +1 -1
- package/dist/lib/testing/storyboard/seeding.mjs +0 -6
- package/dist/lib/testing/storyboard/seeding.mjs.map +1 -1
- package/dist/lib/testing/storyboard/shape-drift-hints.mjs +0 -6
- package/dist/lib/testing/storyboard/shape-drift-hints.mjs.map +1 -1
- package/dist/lib/testing/storyboard/signer-grader/grader.mjs +0 -6
- package/dist/lib/testing/storyboard/signer-grader/grader.mjs.map +1 -1
- package/dist/lib/testing/storyboard/signer-grader/index.mjs +0 -6
- package/dist/lib/testing/storyboard/signer-grader/index.mjs.map +1 -1
- package/dist/lib/testing/storyboard/signer-grader/types.mjs +0 -6
- package/dist/lib/testing/storyboard/strict-validation-hints.mjs +0 -6
- package/dist/lib/testing/storyboard/strict-validation-hints.mjs.map +1 -1
- package/dist/lib/testing/storyboard/task-map.mjs +0 -6
- package/dist/lib/testing/storyboard/task-map.mjs.map +1 -1
- package/dist/lib/testing/storyboard/test-kit.mjs +0 -6
- package/dist/lib/testing/storyboard/test-kit.mjs.map +1 -1
- package/dist/lib/testing/storyboard/types.mjs +0 -6
- package/dist/lib/testing/storyboard/types.mjs.map +1 -1
- package/dist/lib/testing/storyboard/validations.mjs +0 -6
- package/dist/lib/testing/storyboard/validations.mjs.map +1 -1
- package/dist/lib/testing/storyboard/webhook-assertions.mjs +0 -6
- package/dist/lib/testing/storyboard/webhook-assertions.mjs.map +1 -1
- package/dist/lib/testing/storyboard/webhook-receiver.mjs +0 -6
- package/dist/lib/testing/storyboard/webhook-receiver.mjs.map +1 -1
- package/dist/lib/testing/stubs/governance-agent-stub.mjs +0 -6
- package/dist/lib/testing/stubs/governance-agent-stub.mjs.map +1 -1
- package/dist/lib/testing/stubs/index.mjs +0 -6
- package/dist/lib/testing/stubs/index.mjs.map +1 -1
- package/dist/lib/testing/test-controller.mjs +0 -6
- package/dist/lib/testing/test-controller.mjs.map +1 -1
- package/dist/lib/testing/test-helpers.mjs +0 -6
- package/dist/lib/testing/test-helpers.mjs.map +1 -1
- package/dist/lib/testing/types.mjs +0 -6
- package/dist/lib/types/adcp.mjs +0 -6
- package/dist/lib/types/adcp.mjs.map +1 -1
- package/dist/lib/types/asset-instances.mjs +0 -6
- package/dist/lib/types/compat.mjs +0 -6
- package/dist/lib/types/compat.mjs.map +1 -1
- package/dist/lib/types/core.generated.mjs +0 -6
- package/dist/lib/types/enums.generated.mjs +0 -6
- package/dist/lib/types/enums.generated.mjs.map +1 -1
- package/dist/lib/types/error-codes.mjs +0 -6
- package/dist/lib/types/error-codes.mjs.map +1 -1
- package/dist/lib/types/error-details.aliases.mjs +0 -6
- package/dist/lib/types/error-details.aliases.mjs.map +1 -1
- package/dist/lib/types/format-asset-slots.mjs +0 -6
- package/dist/lib/types/forward-compat-error-codes.mjs +0 -6
- package/dist/lib/types/forward-compat-error-codes.mjs.map +1 -1
- package/dist/lib/types/index.mjs +0 -6
- package/dist/lib/types/index.mjs.map +1 -1
- package/dist/lib/types/inline-enums.aliases.mjs +0 -6
- package/dist/lib/types/inline-enums.aliases.mjs.map +1 -1
- package/dist/lib/types/inline-enums.generated.mjs +0 -6
- package/dist/lib/types/inline-enums.generated.mjs.map +1 -1
- package/dist/lib/types/manifest.generated.mjs +0 -6
- package/dist/lib/types/manifest.generated.mjs.map +1 -1
- package/dist/lib/types/schemas.generated.mjs +0 -6
- package/dist/lib/types/schemas.generated.mjs.map +1 -1
- package/dist/lib/types/server-payload-aliases.mjs +0 -6
- package/dist/lib/types/server-payload.mjs +0 -6
- package/dist/lib/types/sync-rows.mjs +0 -6
- package/dist/lib/types/tools.generated.mjs +0 -6
- package/dist/lib/types/v2-5/index.mjs +0 -6
- package/dist/lib/types/v2-5/index.mjs.map +1 -1
- package/dist/lib/types/v2-5/tools.generated.mjs +0 -6
- package/dist/lib/types/v3-1-beta/index.mjs +0 -6
- package/dist/lib/types/v3-1-beta/index.mjs.map +1 -1
- package/dist/lib/types/v3-1-beta/tools.generated.mjs +0 -6
- package/dist/lib/types/wellknown-schemas.generated.mjs +0 -6
- package/dist/lib/types/wellknown-schemas.generated.mjs.map +1 -1
- package/dist/lib/upstream-recorder/constants.mjs +0 -6
- package/dist/lib/upstream-recorder/constants.mjs.map +1 -1
- package/dist/lib/upstream-recorder/index.mjs +0 -6
- package/dist/lib/upstream-recorder/index.mjs.map +1 -1
- package/dist/lib/upstream-recorder/recorder.mjs +0 -6
- package/dist/lib/upstream-recorder/recorder.mjs.map +1 -1
- package/dist/lib/upstream-recorder/types.mjs +0 -6
- package/dist/lib/upstream-recorder/types.mjs.map +1 -1
- package/dist/lib/utils/a2a-artifacts.mjs +0 -6
- package/dist/lib/utils/a2a-artifacts.mjs.map +1 -1
- package/dist/lib/utils/a2a-discovery.mjs +0 -6
- package/dist/lib/utils/a2a-discovery.mjs.map +1 -1
- package/dist/lib/utils/activation-key-builders.mjs +0 -6
- package/dist/lib/utils/activation-key-builders.mjs.map +1 -1
- package/dist/lib/utils/adcp-version-config.mjs +0 -6
- package/dist/lib/utils/adcp-version-config.mjs.map +1 -1
- package/dist/lib/utils/asset-builders.mjs +0 -6
- package/dist/lib/utils/asset-builders.mjs.map +1 -1
- package/dist/lib/utils/build-creative-return-builders.mjs +0 -6
- package/dist/lib/utils/build-creative-return-builders.mjs.map +1 -1
- package/dist/lib/utils/buyer-retry-policy.mjs +0 -6
- package/dist/lib/utils/buyer-retry-policy.mjs.map +1 -1
- package/dist/lib/utils/capabilities.mjs +0 -6
- package/dist/lib/utils/capabilities.mjs.map +1 -1
- package/dist/lib/utils/capability-rollups.mjs +0 -6
- package/dist/lib/utils/capability-rollups.mjs.map +1 -1
- package/dist/lib/utils/creative-adapter.mjs +0 -6
- package/dist/lib/utils/creative-adapter.mjs.map +1 -1
- package/dist/lib/utils/creative-delivery.mjs +0 -6
- package/dist/lib/utils/creative-delivery.mjs.map +1 -1
- package/dist/lib/utils/deprecation.mjs +0 -6
- package/dist/lib/utils/deprecation.mjs.map +1 -1
- package/dist/lib/utils/envelope-status-compat.mjs +0 -6
- package/dist/lib/utils/envelope-status-compat.mjs.map +1 -1
- package/dist/lib/utils/error-extraction.mjs +0 -6
- package/dist/lib/utils/error-extraction.mjs.map +1 -1
- package/dist/lib/utils/extract-result.mjs +0 -6
- package/dist/lib/utils/extract-result.mjs.map +1 -1
- package/dist/lib/utils/format-asset-slot-builders.mjs +0 -6
- package/dist/lib/utils/format-asset-slot-builders.mjs.map +1 -1
- package/dist/lib/utils/format-assets.mjs +0 -6
- package/dist/lib/utils/format-assets.mjs.map +1 -1
- package/dist/lib/utils/format-render-builders.mjs +0 -6
- package/dist/lib/utils/format-render-builders.mjs.map +1 -1
- package/dist/lib/utils/format-renders.mjs +0 -6
- package/dist/lib/utils/format-renders.mjs.map +1 -1
- package/dist/lib/utils/get-products-cache-scope.mjs +0 -6
- package/dist/lib/utils/get-products-cache-scope.mjs.map +1 -1
- package/dist/lib/utils/glob.mjs +0 -6
- package/dist/lib/utils/glob.mjs.map +1 -1
- package/dist/lib/utils/global-async-local-storage.mjs +0 -6
- package/dist/lib/utils/global-async-local-storage.mjs.map +1 -1
- package/dist/lib/utils/idempotency.mjs +0 -6
- package/dist/lib/utils/idempotency.mjs.map +1 -1
- package/dist/lib/utils/index.mjs +0 -6
- package/dist/lib/utils/index.mjs.map +1 -1
- package/dist/lib/utils/jcs.mjs +0 -6
- package/dist/lib/utils/jcs.mjs.map +1 -1
- package/dist/lib/utils/json-depth.mjs +0 -6
- package/dist/lib/utils/json-depth.mjs.map +1 -1
- package/dist/lib/utils/logger.mjs +0 -6
- package/dist/lib/utils/logger.mjs.map +1 -1
- package/dist/lib/utils/media-buy-delivery-notification-builders.mjs +0 -6
- package/dist/lib/utils/media-buy-delivery-notification-builders.mjs.map +1 -1
- package/dist/lib/utils/media-buy-status.mjs +0 -6
- package/dist/lib/utils/media-buy-status.mjs.map +1 -1
- package/dist/lib/utils/pagination.mjs +0 -6
- package/dist/lib/utils/pagination.mjs.map +1 -1
- package/dist/lib/utils/preview-creative-builders.mjs +0 -6
- package/dist/lib/utils/preview-creative-builders.mjs.map +1 -1
- package/dist/lib/utils/preview-normalizer.mjs +0 -6
- package/dist/lib/utils/preview-normalizer.mjs.map +1 -1
- package/dist/lib/utils/preview-utils.mjs +0 -6
- package/dist/lib/utils/preview-utils.mjs.map +1 -1
- package/dist/lib/utils/pricing-adapter.mjs +0 -6
- package/dist/lib/utils/pricing-adapter.mjs.map +1 -1
- package/dist/lib/utils/probe-policy.mjs +0 -6
- package/dist/lib/utils/probe-policy.mjs.map +1 -1
- package/dist/lib/utils/protocol-detection.mjs +0 -6
- package/dist/lib/utils/protocol-detection.mjs.map +1 -1
- package/dist/lib/utils/redact-secrets.mjs +0 -6
- package/dist/lib/utils/redact-secrets.mjs.map +1 -1
- package/dist/lib/utils/redis-default-prefix-warn.mjs +0 -6
- package/dist/lib/utils/redis-default-prefix-warn.mjs.map +1 -1
- package/dist/lib/utils/render-builders.mjs +0 -6
- package/dist/lib/utils/render-builders.mjs.map +1 -1
- package/dist/lib/utils/request-normalizer.mjs +0 -6
- package/dist/lib/utils/request-normalizer.mjs.map +1 -1
- package/dist/lib/utils/response-schemas.mjs +0 -6
- package/dist/lib/utils/response-schemas.mjs.map +1 -1
- package/dist/lib/utils/response-unwrapper.mjs +0 -6
- package/dist/lib/utils/response-unwrapper.mjs.map +1 -1
- package/dist/lib/utils/retry.mjs +0 -6
- package/dist/lib/utils/retry.mjs.map +1 -1
- package/dist/lib/utils/signal-discovery-helpers.mjs +0 -6
- package/dist/lib/utils/signal-discovery-helpers.mjs.map +1 -1
- package/dist/lib/utils/signal-id-builders.mjs +0 -6
- package/dist/lib/utils/signal-id-builders.mjs.map +1 -1
- package/dist/lib/utils/sync-creatives-adapter.mjs +0 -6
- package/dist/lib/utils/sync-creatives-adapter.mjs.map +1 -1
- package/dist/lib/utils/task-state.mjs +0 -6
- package/dist/lib/utils/task-state.mjs.map +1 -1
- package/dist/lib/utils/tool-request-schemas.mjs +0 -6
- package/dist/lib/utils/tool-request-schemas.mjs.map +1 -1
- package/dist/lib/utils/typeGuards.mjs +0 -6
- package/dist/lib/utils/typeGuards.mjs.map +1 -1
- package/dist/lib/utils/union-errors.mjs +0 -6
- package/dist/lib/utils/union-errors.mjs.map +1 -1
- package/dist/lib/utils/validate-user-agent.mjs +0 -6
- package/dist/lib/utils/validate-user-agent.mjs.map +1 -1
- package/dist/lib/v2/format-schema/fetch.mjs +0 -6
- package/dist/lib/v2/format-schema/fetch.mjs.map +1 -1
- package/dist/lib/v2/format-schema/index.mjs +0 -6
- package/dist/lib/v2/format-schema/index.mjs.map +1 -1
- package/dist/lib/v2/format-schema/regex-safety.mjs +0 -6
- package/dist/lib/v2/format-schema/regex-safety.mjs.map +1 -1
- package/dist/lib/v2/format-schema/resolver.mjs +7 -8
- package/dist/lib/v2/format-schema/resolver.mjs.map +1 -1
- package/dist/lib/v2/format-schema/sandbox-refs.mjs +0 -6
- package/dist/lib/v2/format-schema/sandbox-refs.mjs.map +1 -1
- package/dist/lib/v2/projection/augment-response.mjs +0 -6
- package/dist/lib/v2/projection/augment-response.mjs.map +1 -1
- package/dist/lib/v2/projection/builders.mjs +0 -6
- package/dist/lib/v2/projection/builders.mjs.map +1 -1
- package/dist/lib/v2/projection/cache-versions.mjs +0 -6
- package/dist/lib/v2/projection/cache-versions.mjs.map +1 -1
- package/dist/lib/v2/projection/canonical-properties.mjs +5 -6
- package/dist/lib/v2/projection/canonical-properties.mjs.map +1 -1
- package/dist/lib/v2/projection/catalog.mjs +5 -6
- package/dist/lib/v2/projection/catalog.mjs.map +1 -1
- package/dist/lib/v2/projection/constants.mjs +0 -6
- package/dist/lib/v2/projection/constants.mjs.map +1 -1
- package/dist/lib/v2/projection/index.mjs +0 -6
- package/dist/lib/v2/projection/index.mjs.map +1 -1
- package/dist/lib/v2/projection/registry.mjs +5 -6
- package/dist/lib/v2/projection/registry.mjs.map +1 -1
- package/dist/lib/v2/projection/types.mjs +0 -6
- package/dist/lib/v2/projection/v1-to-v2.mjs +0 -6
- package/dist/lib/v2/projection/v1-to-v2.mjs.map +1 -1
- package/dist/lib/v2/projection/v2-to-v1.mjs +0 -6
- package/dist/lib/v2/projection/v2-to-v1.mjs.map +1 -1
- package/dist/lib/v2/projection/write-side.mjs +0 -6
- package/dist/lib/v2/projection/write-side.mjs.map +1 -1
- package/dist/lib/v2/publisher-catalog/formats.mjs +0 -6
- package/dist/lib/v2/publisher-catalog/formats.mjs.map +1 -1
- package/dist/lib/v2/publisher-catalog/index.mjs +0 -6
- package/dist/lib/v2/publisher-catalog/index.mjs.map +1 -1
- package/dist/lib/validation/client-hooks.mjs +0 -6
- package/dist/lib/validation/client-hooks.mjs.map +1 -1
- package/dist/lib/validation/hints.mjs +0 -6
- package/dist/lib/validation/hints.mjs.map +1 -1
- package/dist/lib/validation/index.mjs +0 -6
- package/dist/lib/validation/index.mjs.map +1 -1
- package/dist/lib/validation/schema-errors.mjs +0 -6
- package/dist/lib/validation/schema-errors.mjs.map +1 -1
- package/dist/lib/validation/schema-loader.mjs +5 -6
- package/dist/lib/validation/schema-loader.mjs.map +1 -1
- package/dist/lib/validation/schema-validator.mjs +0 -6
- package/dist/lib/validation/schema-validator.mjs.map +1 -1
- package/dist/lib/validation/sync-creatives.mjs +0 -6
- package/dist/lib/validation/sync-creatives.mjs.map +1 -1
- package/dist/lib/version.d.mts +3 -3
- package/dist/lib/version.d.ts +3 -3
- package/dist/lib/version.js +3 -3
- package/dist/lib/version.js.map +1 -1
- package/dist/lib/version.mjs +3 -9
- package/dist/lib/version.mjs.map +1 -1
- package/dist/lib/webhooks/index.mjs +0 -6
- package/dist/lib/webhooks/index.mjs.map +1 -1
- package/dist/lib/wholesale-feed-sync/index.mjs +0 -6
- package/dist/lib/wholesale-feed-sync/index.mjs.map +1 -1
- package/dist/lib/wholesale-feed-sync/sync.mjs +0 -6
- package/dist/lib/wholesale-feed-sync/sync.mjs.map +1 -1
- package/dist/lib/wholesale-feed-sync/types.mjs +0 -6
- package/dist/lib/wholesale-feed-sync/webhook-notification.mjs +0 -6
- package/dist/lib/wholesale-feed-sync/webhook-notification.mjs.map +1 -1
- package/package.json +2 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/lib/testing/scenarios/capabilities.ts"],"sourcesContent":["/**\n * Capability Discovery Testing Scenarios (v3)\n *\n * Tests agent capability discovery including:\n * - get_adcp_capabilities (v3 agents)\n * - Synthetic capability detection (v2 agents)\n * - Protocol/tool cross-validation\n */\n\nimport type { TestOptions, TestStepResult, AgentProfile, TaskResult } from '../types';\nimport { getOrCreateClient, runStep, getOrDiscoverProfile } from '../client';\nimport {\n buildSyntheticCapabilities,\n parseCapabilitiesResponse,\n MEDIA_BUY_TOOLS,\n SIGNALS_TOOLS,\n GOVERNANCE_TOOLS,\n CREATIVE_TOOLS,\n SPONSORED_INTELLIGENCE_TOOLS,\n TRUSTED_MATCH_TOOLS,\n COMPLIANCE_TOOLS,\n type AdcpCapabilities,\n type AdcpProtocol,\n} from '../../utils/capabilities';\nimport type { GetAdCPCapabilitiesResponse } from '../../types/tools.generated';\n\n/**\n * Test: Capability Discovery\n *\n * Flow:\n * 1. Discover agent profile (tools list)\n * 2. If get_adcp_capabilities exists, call it and validate response\n * 3. Cross-check reported protocols against available tools\n * 4. For v2 agents, build synthetic capabilities and note v3 upgrade path\n */\nexport async function testCapabilityDiscovery(\n agentUrl: string,\n options: TestOptions\n): Promise<{ steps: TestStepResult[]; profile?: AgentProfile }> {\n const steps: TestStepResult[] = [];\n const client = getOrCreateClient(agentUrl, options);\n\n // Discover agent profile\n const { profile, step: profileStep } = await getOrDiscoverProfile(client, options);\n steps.push(profileStep);\n\n if (!profileStep.passed) {\n return { steps, profile };\n }\n\n const hasGetCapabilities = profile.tools.includes('get_adcp_capabilities');\n let capabilities: AdcpCapabilities;\n\n if (hasGetCapabilities) {\n // v3 agent: call get_adcp_capabilities\n const { result, step } = await runStep<TaskResult>(\n 'Get AdCP capabilities (v3)',\n 'get_adcp_capabilities',\n async () => client.getAdcpCapabilities({}) as Promise<TaskResult>\n );\n\n if (result?.success && result?.data) {\n capabilities = parseCapabilitiesResponse(result.data);\n profile.adcp_version = capabilities.version;\n profile.adcp_major_versions = [...capabilities.majorVersions];\n profile.supported_protocols = capabilities.protocols;\n profile.supports_governance = capabilities.protocols.includes('governance');\n profile.supports_si = capabilities.protocols.includes('sponsored_intelligence');\n\n step.details = `v${capabilities.majorVersions.join('/')} agent with ${capabilities.protocols.length} protocol(s)`;\n step.response_preview = JSON.stringify(\n {\n version: capabilities.version,\n major_versions: capabilities.majorVersions,\n protocols: capabilities.protocols,\n features: capabilities.features,\n extensions: capabilities.extensions,\n publisher_domains: capabilities.publisherDomains?.slice(0, 3),\n channels: capabilities.channels,\n },\n null,\n 2\n );\n steps.push(step);\n\n // Validate response structure\n const { steps: validationSteps } = validateCapabilitiesResponse(\n result.data as GetAdCPCapabilitiesResponse,\n profile.tools\n );\n steps.push(...validationSteps);\n } else if (result && !result.success) {\n step.passed = false;\n step.error = result.error || 'get_adcp_capabilities failed';\n steps.push(step);\n\n // Fall back to synthetic capabilities\n const toolInfos = profile.tools.map(name => ({ name }));\n capabilities = buildSyntheticCapabilities(toolInfos);\n profile.adcp_version = 'v2';\n profile.supported_protocols = capabilities.protocols;\n\n steps.push({\n step: 'Fallback to synthetic capabilities',\n passed: true,\n duration_ms: 0,\n details: 'get_adcp_capabilities failed, using tool-based detection',\n });\n } else {\n // No result at all\n const toolInfos = profile.tools.map(name => ({ name }));\n capabilities = buildSyntheticCapabilities(toolInfos);\n profile.adcp_version = 'v2';\n profile.supported_protocols = capabilities.protocols;\n step.passed = false;\n step.error = 'get_adcp_capabilities returned no data';\n steps.push(step);\n }\n } else {\n // v2 agent: build synthetic capabilities\n const toolInfos = profile.tools.map(name => ({ name }));\n capabilities = buildSyntheticCapabilities(toolInfos);\n profile.adcp_version = 'v2';\n profile.supported_protocols = capabilities.protocols;\n profile.supports_governance = capabilities.protocols.includes('governance');\n profile.supports_si = capabilities.protocols.includes('sponsored_intelligence');\n\n steps.push({\n step: 'Build synthetic capabilities (v2)',\n task: undefined,\n passed: true,\n duration_ms: 0,\n details: `Agent does not support get_adcp_capabilities. Detected ${capabilities.protocols.length} protocol(s) from tools.`,\n response_preview: JSON.stringify(\n {\n version: capabilities.version,\n protocols: capabilities.protocols,\n features: capabilities.features,\n _synthetic: true,\n },\n null,\n 2\n ),\n });\n\n // Check for v3 upgrade potential\n const v3ToolsPresent = [\n ...GOVERNANCE_TOOLS,\n ...SPONSORED_INTELLIGENCE_TOOLS,\n ...TRUSTED_MATCH_TOOLS,\n ...COMPLIANCE_TOOLS,\n ].filter(t => profile.tools.includes(t));\n\n if (v3ToolsPresent.length > 0) {\n steps.push({\n step: 'v3 upgrade potential detected',\n passed: true,\n duration_ms: 0,\n details: `Agent has ${v3ToolsPresent.length} v3 tool(s) but missing get_adcp_capabilities`,\n warnings: [\n `Consider implementing get_adcp_capabilities for better protocol discovery. v3 tools detected: ${v3ToolsPresent.join(', ')}`,\n ],\n });\n }\n }\n\n // Cross-validate: check that reported protocols match available tools\n const { steps: crossValidationSteps } = crossValidateProtocolsAndTools(capabilities, profile.tools);\n steps.push(...crossValidationSteps);\n\n return { steps, profile };\n}\n\n/**\n * Validate the structure and content of a get_adcp_capabilities response\n */\nfunction validateCapabilitiesResponse(\n response: GetAdCPCapabilitiesResponse,\n tools: string[]\n): { steps: TestStepResult[] } {\n const steps: TestStepResult[] = [];\n\n // Check for required fields\n const hasAdcp = response.adcp && Array.isArray(response.adcp.major_versions);\n const hasProtocols = Array.isArray(response.supported_protocols);\n\n steps.push({\n step: 'Validate capabilities structure',\n passed: hasAdcp && hasProtocols,\n duration_ms: 0,\n details:\n hasAdcp && hasProtocols\n ? 'Response has required fields (adcp.major_versions, supported_protocols)'\n : `Missing fields: ${!hasAdcp ? 'adcp.major_versions' : ''} ${!hasProtocols ? 'supported_protocols' : ''}`,\n });\n\n // Check for v3 version\n if (hasAdcp) {\n const majorVersions = response.adcp.major_versions;\n const hasV3 = majorVersions.includes(3);\n\n steps.push({\n step: 'Check v3 support',\n passed: true, // Not a failure if v2 only, just informational\n duration_ms: 0,\n details: hasV3\n ? `Agent supports v3 (versions: ${majorVersions.join(', ')})`\n : `Agent is v2 only (versions: ${majorVersions.join(', ')})`,\n });\n }\n\n // Check media_buy features if media_buy protocol is supported\n if (hasProtocols && response.supported_protocols.includes('media_buy')) {\n const mediaBuy = response.media_buy;\n const hasMediaBuyFeatures = mediaBuy?.features;\n\n steps.push({\n step: 'Validate media_buy features',\n passed: true, // Features are optional\n duration_ms: 0,\n details: hasMediaBuyFeatures\n ? `Features: inline_creative=${mediaBuy.features?.inline_creative_management}, property_list=${mediaBuy.features?.property_list_filtering}, content_standards=${mediaBuy.features?.content_standards}`\n : 'No media_buy.features declared (all features assumed false)',\n });\n }\n\n if (hasProtocols && response.supported_protocols.includes('creative')) {\n const creative = response.creative;\n const hasCreativeCapabilities = !!creative;\n const creativeWarnings: string[] = [];\n let creativePassed = hasCreativeCapabilities;\n\n if (creative?.supports_generation && !tools.includes('build_creative')) {\n creativePassed = false;\n creativeWarnings.push('creative.supports_generation=true but build_creative is not advertised');\n }\n\n if (creative?.supports_transformation && !tools.includes('build_creative')) {\n creativePassed = false;\n creativeWarnings.push('creative.supports_transformation=true but build_creative is not advertised');\n }\n\n if (creative?.has_creative_library && !tools.includes('list_creatives')) {\n creativePassed = false;\n creativeWarnings.push('creative.has_creative_library=true but list_creatives is not advertised');\n }\n\n if (creative?.has_creative_library && !tools.includes('list_accounts') && !tools.includes('sync_accounts')) {\n creativeWarnings.push(\n 'creative.has_creative_library=true but no account management tool is advertised (expected sync_accounts or list_accounts)'\n );\n }\n\n steps.push({\n step: 'Validate creative capabilities',\n passed: creativePassed,\n duration_ms: 0,\n details: hasCreativeCapabilities\n ? `Creative: generation=${creative?.supports_generation ?? false}, transformation=${creative?.supports_transformation ?? false}, compliance=${creative?.supports_compliance ?? false}, library=${creative?.has_creative_library ?? false}`\n : 'creative is listed in supported_protocols but the creative capability block is missing',\n warnings: creativeWarnings.length > 0 ? creativeWarnings : undefined,\n });\n }\n\n if (response.account) {\n const accountWarnings: string[] = [];\n let accountPassed = true;\n\n if (response.account.require_operator_auth && !tools.includes('list_accounts')) {\n accountPassed = false;\n accountWarnings.push('account.require_operator_auth=true but list_accounts is not advertised');\n }\n\n if (\n response.account.required_for_products &&\n !tools.includes('list_accounts') &&\n !tools.includes('sync_accounts')\n ) {\n accountPassed = false;\n accountWarnings.push('account.required_for_products=true but no account management tool is advertised');\n }\n\n steps.push({\n step: 'Validate account capabilities',\n passed: accountPassed,\n duration_ms: 0,\n details: `Account model: require_operator_auth=${response.account.require_operator_auth ?? false}, required_for_products=${response.account.required_for_products ?? false}, sandbox=${response.account.sandbox ?? false}, supported_billing=${(response.account.supported_billing || []).join(', ') || '(none)'}`,\n warnings: accountWarnings.length > 0 ? accountWarnings : undefined,\n });\n }\n\n // Check extensions\n const extensions = response.extensions_supported ?? [];\n if (extensions.length > 0) {\n steps.push({\n step: 'Check extensions',\n passed: true,\n duration_ms: 0,\n details: `Supported extensions: ${extensions.join(', ')}`,\n });\n }\n\n return { steps };\n}\n\n/**\n * Cross-validate that reported protocols match available tools\n */\nfunction crossValidateProtocolsAndTools(capabilities: AdcpCapabilities, tools: string[]): { steps: TestStepResult[] } {\n const steps: TestStepResult[] = [];\n const issues: string[] = [];\n const warnings: string[] = [];\n\n const protocolToolMap: Record<string, readonly string[]> = {\n media_buy: MEDIA_BUY_TOOLS,\n signals: SIGNALS_TOOLS,\n governance: GOVERNANCE_TOOLS,\n creative: CREATIVE_TOOLS,\n sponsored_intelligence: SPONSORED_INTELLIGENCE_TOOLS,\n trusted_match: TRUSTED_MATCH_TOOLS,\n compliance: COMPLIANCE_TOOLS,\n };\n\n // Check each reported protocol has at least one corresponding tool\n const perProtocolDiffs: Record<string, { expected: string[]; found: string[]; missing: string[] }> = {};\n\n for (const protocol of capabilities.protocols) {\n const protocolTools = protocolToolMap[protocol] || [];\n const matchingTools = protocolTools.filter(t => tools.includes(t));\n const missingTools = protocolTools.filter(t => !tools.includes(t));\n\n if (matchingTools.length === 0 && protocolTools.length > 0) {\n issues.push(\n `Protocol '${protocol}' reported but no matching tools found. Expected one of: [${[...protocolTools].join(', ')}]`\n );\n perProtocolDiffs[protocol] = {\n expected: [...protocolTools],\n found: [],\n missing: [...protocolTools],\n };\n } else if (missingTools.length > 0) {\n // Partial coverage is a warning, not a failure — agents can legitimately\n // implement a subset of tools within a protocol.\n warnings.push(`Protocol '${protocol}' has partial tool coverage: missing [${missingTools.join(', ')}]`);\n perProtocolDiffs[protocol] = {\n expected: [...protocolTools],\n found: [...matchingTools],\n missing: missingTools,\n };\n }\n }\n\n // Check for tools that suggest protocols not reported.\n // Only consider tools exclusive to a protocol — shared tools (those appearing\n // in multiple protocol tool lists) don't indicate a specific unreported protocol.\n const allProtocolTools = Object.values(protocolToolMap).flat();\n const toolProtocolCount = new Map<string, number>();\n for (const tool of allProtocolTools) {\n toolProtocolCount.set(tool, (toolProtocolCount.get(tool) || 0) + 1);\n }\n\n const unreportedProtocols: string[] = [];\n\n for (const [protocol, expectedTools] of Object.entries(protocolToolMap)) {\n if (!capabilities.protocols.includes(protocol as AdcpProtocol)) {\n // Only flag based on exclusive tools (not shared across protocols)\n const exclusivePresent = expectedTools.filter(t => tools.includes(t) && toolProtocolCount.get(t) === 1);\n if (exclusivePresent.length > 0) {\n unreportedProtocols.push(protocol);\n perProtocolDiffs[protocol] = {\n expected: [],\n found: [...exclusivePresent],\n missing: [],\n };\n }\n }\n }\n\n if (unreportedProtocols.length > 0) {\n issues.push(\n `Tools suggest unreported protocols: ${unreportedProtocols.map(p => `${p} (has: [${perProtocolDiffs[p]!.found.join(', ')}])`).join('; ')}`\n );\n }\n\n const allMessages = [...issues, ...warnings];\n const hasDiffs = Object.keys(perProtocolDiffs).length > 0;\n\n steps.push({\n step: 'Cross-validate protocols and tools',\n passed: issues.length === 0,\n duration_ms: 0,\n error: issues.length > 0 ? issues.join('; ') : undefined,\n details: allMessages.length === 0 ? 'Reported protocols match available tools' : allMessages.join('; '),\n warnings: warnings.length > 0 ? warnings : undefined,\n response_preview: hasDiffs\n ? JSON.stringify(\n {\n reported_protocols: capabilities.protocols,\n per_protocol: perProtocolDiffs,\n },\n null,\n 2\n )\n : undefined,\n });\n\n return { steps };\n}\n\n/**\n * Check if agent likely supports v3 capabilities\n */\nexport function likelySupportsV3(tools: string[]): boolean {\n return (\n tools.includes('get_adcp_capabilities') ||\n GOVERNANCE_TOOLS.some(t => tools.includes(t)) ||\n SPONSORED_INTELLIGENCE_TOOLS.some(t => tools.includes(t)) ||\n TRUSTED_MATCH_TOOLS.some(t => tools.includes(t)) ||\n COMPLIANCE_TOOLS.some(t => tools.includes(t))\n );\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../../../src/lib/testing/scenarios/capabilities.ts"],"sourcesContent":["/**\n * Capability Discovery Testing Scenarios (v3)\n *\n * Tests agent capability discovery including:\n * - get_adcp_capabilities (v3 agents)\n * - Synthetic capability detection (v2 agents)\n * - Protocol/tool cross-validation\n */\n\nimport type { TestOptions, TestStepResult, AgentProfile, TaskResult } from '../types';\nimport { getOrCreateClient, runStep, getOrDiscoverProfile } from '../client';\nimport {\n buildSyntheticCapabilities,\n parseCapabilitiesResponse,\n MEDIA_BUY_TOOLS,\n SIGNALS_TOOLS,\n GOVERNANCE_TOOLS,\n CREATIVE_TOOLS,\n SPONSORED_INTELLIGENCE_TOOLS,\n TRUSTED_MATCH_TOOLS,\n COMPLIANCE_TOOLS,\n type AdcpCapabilities,\n type AdcpProtocol,\n} from '../../utils/capabilities';\nimport type { GetAdCPCapabilitiesResponse } from '../../types/tools.generated';\n\n/**\n * Test: Capability Discovery\n *\n * Flow:\n * 1. Discover agent profile (tools list)\n * 2. If get_adcp_capabilities exists, call it and validate response\n * 3. Cross-check reported protocols against available tools\n * 4. For v2 agents, build synthetic capabilities and note v3 upgrade path\n */\nexport async function testCapabilityDiscovery(\n agentUrl: string,\n options: TestOptions\n): Promise<{ steps: TestStepResult[]; profile?: AgentProfile }> {\n const steps: TestStepResult[] = [];\n const client = getOrCreateClient(agentUrl, options);\n\n // Discover agent profile\n const { profile, step: profileStep } = await getOrDiscoverProfile(client, options);\n steps.push(profileStep);\n\n if (!profileStep.passed) {\n return { steps, profile };\n }\n\n const hasGetCapabilities = profile.tools.includes('get_adcp_capabilities');\n let capabilities: AdcpCapabilities;\n\n if (hasGetCapabilities) {\n // v3 agent: call get_adcp_capabilities\n const { result, step } = await runStep<TaskResult>(\n 'Get AdCP capabilities (v3)',\n 'get_adcp_capabilities',\n async () => client.getAdcpCapabilities({}) as Promise<TaskResult>\n );\n\n if (result?.success && result?.data) {\n capabilities = parseCapabilitiesResponse(result.data);\n profile.adcp_version = capabilities.version;\n profile.adcp_major_versions = [...capabilities.majorVersions];\n profile.supported_protocols = capabilities.protocols;\n profile.supports_governance = capabilities.protocols.includes('governance');\n profile.supports_si = capabilities.protocols.includes('sponsored_intelligence');\n\n step.details = `v${capabilities.majorVersions.join('/')} agent with ${capabilities.protocols.length} protocol(s)`;\n step.response_preview = JSON.stringify(\n {\n version: capabilities.version,\n major_versions: capabilities.majorVersions,\n protocols: capabilities.protocols,\n features: capabilities.features,\n extensions: capabilities.extensions,\n publisher_domains: capabilities.publisherDomains?.slice(0, 3),\n channels: capabilities.channels,\n },\n null,\n 2\n );\n steps.push(step);\n\n // Validate response structure\n const { steps: validationSteps } = validateCapabilitiesResponse(\n result.data as GetAdCPCapabilitiesResponse,\n profile.tools\n );\n steps.push(...validationSteps);\n } else if (result && !result.success) {\n step.passed = false;\n step.error = result.error || 'get_adcp_capabilities failed';\n steps.push(step);\n\n // Fall back to synthetic capabilities\n const toolInfos = profile.tools.map(name => ({ name }));\n capabilities = buildSyntheticCapabilities(toolInfos);\n profile.adcp_version = 'v2';\n profile.supported_protocols = capabilities.protocols;\n\n steps.push({\n step: 'Fallback to synthetic capabilities',\n passed: true,\n duration_ms: 0,\n details: 'get_adcp_capabilities failed, using tool-based detection',\n });\n } else {\n // No result at all\n const toolInfos = profile.tools.map(name => ({ name }));\n capabilities = buildSyntheticCapabilities(toolInfos);\n profile.adcp_version = 'v2';\n profile.supported_protocols = capabilities.protocols;\n step.passed = false;\n step.error = 'get_adcp_capabilities returned no data';\n steps.push(step);\n }\n } else {\n // v2 agent: build synthetic capabilities\n const toolInfos = profile.tools.map(name => ({ name }));\n capabilities = buildSyntheticCapabilities(toolInfos);\n profile.adcp_version = 'v2';\n profile.supported_protocols = capabilities.protocols;\n profile.supports_governance = capabilities.protocols.includes('governance');\n profile.supports_si = capabilities.protocols.includes('sponsored_intelligence');\n\n steps.push({\n step: 'Build synthetic capabilities (v2)',\n task: undefined,\n passed: true,\n duration_ms: 0,\n details: `Agent does not support get_adcp_capabilities. Detected ${capabilities.protocols.length} protocol(s) from tools.`,\n response_preview: JSON.stringify(\n {\n version: capabilities.version,\n protocols: capabilities.protocols,\n features: capabilities.features,\n _synthetic: true,\n },\n null,\n 2\n ),\n });\n\n // Check for v3 upgrade potential\n const v3ToolsPresent = [\n ...GOVERNANCE_TOOLS,\n ...SPONSORED_INTELLIGENCE_TOOLS,\n ...TRUSTED_MATCH_TOOLS,\n ...COMPLIANCE_TOOLS,\n ].filter(t => profile.tools.includes(t));\n\n if (v3ToolsPresent.length > 0) {\n steps.push({\n step: 'v3 upgrade potential detected',\n passed: true,\n duration_ms: 0,\n details: `Agent has ${v3ToolsPresent.length} v3 tool(s) but missing get_adcp_capabilities`,\n warnings: [\n `Consider implementing get_adcp_capabilities for better protocol discovery. v3 tools detected: ${v3ToolsPresent.join(', ')}`,\n ],\n });\n }\n }\n\n // Cross-validate: check that reported protocols match available tools\n const { steps: crossValidationSteps } = crossValidateProtocolsAndTools(capabilities, profile.tools);\n steps.push(...crossValidationSteps);\n\n return { steps, profile };\n}\n\n/**\n * Validate the structure and content of a get_adcp_capabilities response\n */\nfunction validateCapabilitiesResponse(\n response: GetAdCPCapabilitiesResponse,\n tools: string[]\n): { steps: TestStepResult[] } {\n const steps: TestStepResult[] = [];\n\n // Check for required fields\n const hasAdcp = response.adcp && Array.isArray(response.adcp.major_versions);\n const hasProtocols = Array.isArray(response.supported_protocols);\n\n steps.push({\n step: 'Validate capabilities structure',\n passed: hasAdcp && hasProtocols,\n duration_ms: 0,\n details:\n hasAdcp && hasProtocols\n ? 'Response has required fields (adcp.major_versions, supported_protocols)'\n : `Missing fields: ${!hasAdcp ? 'adcp.major_versions' : ''} ${!hasProtocols ? 'supported_protocols' : ''}`,\n });\n\n // Check for v3 version\n if (hasAdcp) {\n const majorVersions = response.adcp.major_versions;\n const hasV3 = majorVersions.includes(3);\n\n steps.push({\n step: 'Check v3 support',\n passed: true, // Not a failure if v2 only, just informational\n duration_ms: 0,\n details: hasV3\n ? `Agent supports v3 (versions: ${majorVersions.join(', ')})`\n : `Agent is v2 only (versions: ${majorVersions.join(', ')})`,\n });\n }\n\n // Check media_buy features if media_buy protocol is supported\n if (hasProtocols && response.supported_protocols.includes('media_buy')) {\n const mediaBuy = response.media_buy;\n const hasMediaBuyFeatures = mediaBuy?.features;\n\n steps.push({\n step: 'Validate media_buy features',\n passed: true, // Features are optional\n duration_ms: 0,\n details: hasMediaBuyFeatures\n ? `Features: inline_creative=${mediaBuy.features?.inline_creative_management}, property_list=${mediaBuy.features?.property_list_filtering}, content_standards=${mediaBuy.features?.content_standards}`\n : 'No media_buy.features declared (all features assumed false)',\n });\n }\n\n if (hasProtocols && response.supported_protocols.includes('creative')) {\n const creative = response.creative;\n const hasCreativeCapabilities = !!creative;\n const creativeWarnings: string[] = [];\n let creativePassed = hasCreativeCapabilities;\n\n if (creative?.supports_generation && !tools.includes('build_creative')) {\n creativePassed = false;\n creativeWarnings.push('creative.supports_generation=true but build_creative is not advertised');\n }\n\n if (creative?.supports_transformation && !tools.includes('build_creative')) {\n creativePassed = false;\n creativeWarnings.push('creative.supports_transformation=true but build_creative is not advertised');\n }\n\n if (creative?.has_creative_library && !tools.includes('list_creatives')) {\n creativePassed = false;\n creativeWarnings.push('creative.has_creative_library=true but list_creatives is not advertised');\n }\n\n if (creative?.has_creative_library && !tools.includes('list_accounts') && !tools.includes('sync_accounts')) {\n creativeWarnings.push(\n 'creative.has_creative_library=true but no account management tool is advertised (expected sync_accounts or list_accounts)'\n );\n }\n\n steps.push({\n step: 'Validate creative capabilities',\n passed: creativePassed,\n duration_ms: 0,\n details: hasCreativeCapabilities\n ? `Creative: generation=${creative?.supports_generation ?? false}, transformation=${creative?.supports_transformation ?? false}, compliance=${creative?.supports_compliance ?? false}, library=${creative?.has_creative_library ?? false}`\n : 'creative is listed in supported_protocols but the creative capability block is missing',\n warnings: creativeWarnings.length > 0 ? creativeWarnings : undefined,\n });\n }\n\n if (response.account) {\n const accountWarnings: string[] = [];\n let accountPassed = true;\n\n if (response.account.require_operator_auth && !tools.includes('list_accounts')) {\n accountPassed = false;\n accountWarnings.push('account.require_operator_auth=true but list_accounts is not advertised');\n }\n\n if (\n response.account.required_for_products &&\n !tools.includes('list_accounts') &&\n !tools.includes('sync_accounts')\n ) {\n accountPassed = false;\n accountWarnings.push('account.required_for_products=true but no account management tool is advertised');\n }\n\n steps.push({\n step: 'Validate account capabilities',\n passed: accountPassed,\n duration_ms: 0,\n details: `Account model: require_operator_auth=${response.account.require_operator_auth ?? false}, required_for_products=${response.account.required_for_products ?? false}, sandbox=${response.account.sandbox ?? false}, supported_billing=${(response.account.supported_billing || []).join(', ') || '(none)'}`,\n warnings: accountWarnings.length > 0 ? accountWarnings : undefined,\n });\n }\n\n // Check extensions\n const extensions = response.extensions_supported ?? [];\n if (extensions.length > 0) {\n steps.push({\n step: 'Check extensions',\n passed: true,\n duration_ms: 0,\n details: `Supported extensions: ${extensions.join(', ')}`,\n });\n }\n\n return { steps };\n}\n\n/**\n * Cross-validate that reported protocols match available tools\n */\nfunction crossValidateProtocolsAndTools(capabilities: AdcpCapabilities, tools: string[]): { steps: TestStepResult[] } {\n const steps: TestStepResult[] = [];\n const issues: string[] = [];\n const warnings: string[] = [];\n\n const protocolToolMap: Record<string, readonly string[]> = {\n media_buy: MEDIA_BUY_TOOLS,\n signals: SIGNALS_TOOLS,\n governance: GOVERNANCE_TOOLS,\n creative: CREATIVE_TOOLS,\n sponsored_intelligence: SPONSORED_INTELLIGENCE_TOOLS,\n trusted_match: TRUSTED_MATCH_TOOLS,\n compliance: COMPLIANCE_TOOLS,\n };\n\n // Check each reported protocol has at least one corresponding tool\n const perProtocolDiffs: Record<string, { expected: string[]; found: string[]; missing: string[] }> = {};\n\n for (const protocol of capabilities.protocols) {\n const protocolTools = protocolToolMap[protocol] || [];\n const matchingTools = protocolTools.filter(t => tools.includes(t));\n const missingTools = protocolTools.filter(t => !tools.includes(t));\n\n if (matchingTools.length === 0 && protocolTools.length > 0) {\n issues.push(\n `Protocol '${protocol}' reported but no matching tools found. Expected one of: [${[...protocolTools].join(', ')}]`\n );\n perProtocolDiffs[protocol] = {\n expected: [...protocolTools],\n found: [],\n missing: [...protocolTools],\n };\n } else if (missingTools.length > 0) {\n // Partial coverage is a warning, not a failure — agents can legitimately\n // implement a subset of tools within a protocol.\n warnings.push(`Protocol '${protocol}' has partial tool coverage: missing [${missingTools.join(', ')}]`);\n perProtocolDiffs[protocol] = {\n expected: [...protocolTools],\n found: [...matchingTools],\n missing: missingTools,\n };\n }\n }\n\n // Check for tools that suggest protocols not reported.\n // Only consider tools exclusive to a protocol — shared tools (those appearing\n // in multiple protocol tool lists) don't indicate a specific unreported protocol.\n const allProtocolTools = Object.values(protocolToolMap).flat();\n const toolProtocolCount = new Map<string, number>();\n for (const tool of allProtocolTools) {\n toolProtocolCount.set(tool, (toolProtocolCount.get(tool) || 0) + 1);\n }\n\n const unreportedProtocols: string[] = [];\n\n for (const [protocol, expectedTools] of Object.entries(protocolToolMap)) {\n if (!capabilities.protocols.includes(protocol as AdcpProtocol)) {\n // Only flag based on exclusive tools (not shared across protocols)\n const exclusivePresent = expectedTools.filter(t => tools.includes(t) && toolProtocolCount.get(t) === 1);\n if (exclusivePresent.length > 0) {\n unreportedProtocols.push(protocol);\n perProtocolDiffs[protocol] = {\n expected: [],\n found: [...exclusivePresent],\n missing: [],\n };\n }\n }\n }\n\n if (unreportedProtocols.length > 0) {\n issues.push(\n `Tools suggest unreported protocols: ${unreportedProtocols.map(p => `${p} (has: [${perProtocolDiffs[p]!.found.join(', ')}])`).join('; ')}`\n );\n }\n\n const allMessages = [...issues, ...warnings];\n const hasDiffs = Object.keys(perProtocolDiffs).length > 0;\n\n steps.push({\n step: 'Cross-validate protocols and tools',\n passed: issues.length === 0,\n duration_ms: 0,\n error: issues.length > 0 ? issues.join('; ') : undefined,\n details: allMessages.length === 0 ? 'Reported protocols match available tools' : allMessages.join('; '),\n warnings: warnings.length > 0 ? warnings : undefined,\n response_preview: hasDiffs\n ? JSON.stringify(\n {\n reported_protocols: capabilities.protocols,\n per_protocol: perProtocolDiffs,\n },\n null,\n 2\n )\n : undefined,\n });\n\n return { steps };\n}\n\n/**\n * Check if agent likely supports v3 capabilities\n */\nexport function likelySupportsV3(tools: string[]): boolean {\n return (\n tools.includes('get_adcp_capabilities') ||\n GOVERNANCE_TOOLS.some(t => tools.includes(t)) ||\n SPONSORED_INTELLIGENCE_TOOLS.some(t => tools.includes(t)) ||\n TRUSTED_MATCH_TOOLS.some(t => tools.includes(t)) ||\n COMPLIANCE_TOOLS.some(t => tools.includes(t))\n );\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1,9 +1,3 @@
|
|
|
1
|
-
import { fileURLToPath as __adcpFileURLToPath } from 'node:url';
|
|
2
|
-
import { dirname as __adcpDirname } from 'node:path';
|
|
3
|
-
import { createRequire as __adcpCreateRequire } from 'node:module';
|
|
4
|
-
const __filename = __adcpFileURLToPath(import.meta.url);
|
|
5
|
-
const __dirname = __adcpDirname(__filename);
|
|
6
|
-
const require = __adcpCreateRequire(import.meta.url);
|
|
7
1
|
import { getOrCreateClient, runStep, getOrDiscoverProfile, discoverCreativeFormats, resolveBrand } from "../client.mjs";
|
|
8
2
|
async function testCreativeFlow(agentUrl, options) {
|
|
9
3
|
const steps = [];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/lib/testing/scenarios/creative.ts"],"sourcesContent":["/**\n * Creative Agent Testing Scenarios\n *\n * Tests creative agent capabilities including:\n * - list_creative_formats / list_formats\n * - build_creative\n * - preview_creative\n *\n * Enhanced to:\n * - Test multiple formats from the agent's actual catalog\n * - Test with both required and optional assets\n * - Validate preview renders\n */\n\nimport type { BuildCreativeRequest, PreviewCreativeRequest } from '../../types/tools.generated';\nimport type { TestOptions, TestStepResult, AgentProfile, TaskResult } from '../types';\nimport { getOrCreateClient, runStep, getOrDiscoverProfile, discoverCreativeFormats, resolveBrand } from '../client';\n\n/**\n * Test: Creative Flow (for creative agents)\n *\n * Flow: list_formats -> build_creative (multiple formats) -> preview_creative (with assets)\n */\nexport async function testCreativeFlow(\n agentUrl: string,\n options: TestOptions\n): Promise<{ steps: TestStepResult[]; profile?: AgentProfile }> {\n const steps: TestStepResult[] = [];\n const client = getOrCreateClient(agentUrl, options);\n\n // Discover agent profile\n const { profile, step: profileStep } = await getOrDiscoverProfile(client, options);\n steps.push(profileStep);\n\n if (!profileStep.passed) {\n return { steps, profile };\n }\n\n // Discover creative formats with full details\n const { formats, step: formatStep } = await discoverCreativeFormats(client, profile);\n steps.push(formatStep);\n\n if (!formatStep.passed || !formats || formats.length === 0) {\n return { steps, profile: { ...profile, supported_formats: formats || [] } };\n }\n\n // Store discovered formats in profile\n profile.supported_formats = formats;\n\n // Determine which formats to test\n const formatsToTest = selectFormatsToTest(formats || [], options);\n\n // Build creative for each selected format\n if (profile.tools.includes('build_creative')) {\n for (const format of formatsToTest) {\n const formatDisplayName = format.name || format.format_id.id;\n const { result, step } = await runStep<TaskResult>(\n `Build creative: ${formatDisplayName}`,\n 'build_creative',\n async () =>\n client.buildCreative({\n target_format_id: format.format_id,\n brand: resolveBrand(options),\n message: `Create an ad for an e-commerce brand promoting summer sale`,\n quality: 'draft',\n include_preview: true,\n } as unknown as BuildCreativeRequest) as Promise<TaskResult>\n );\n\n if (result?.success && result?.data) {\n const data = result.data as {\n creative_manifest?: { format_id?: unknown; assets?: Record<string, unknown> };\n creative_manifests?: Array<{ format_id?: unknown; assets?: Record<string, unknown> }>;\n preview?: { previews?: unknown[] };\n };\n const manifest = data.creative_manifest || data.creative_manifests?.[0];\n step.details = `Built creative manifest for format ${formatDisplayName}`;\n step.response_preview = JSON.stringify(\n {\n format_id: manifest?.format_id || format.format_id,\n asset_keys: Object.keys(manifest?.assets || {}),\n has_preview: !!data.preview,\n preview_count: data.preview?.previews?.length || 0,\n },\n null,\n 2\n );\n } else if (result && !result.success) {\n step.passed = false;\n step.error = result.error || 'build_creative failed';\n }\n steps.push(step);\n }\n }\n\n // Preview creative with various asset configurations\n if (profile.tools.includes('preview_creative')) {\n // Test 1: Preview with minimal assets (empty)\n const { step: minimalStep } = await runStep<TaskResult>(\n 'Preview creative: minimal assets',\n 'preview_creative',\n async () =>\n client.previewCreative({\n request_type: 'single',\n creative_manifest: {\n format_id: formatsToTest[0]?.format_id || {\n agent_url: 'https://creative.adcontextprotocol.org',\n id: 'display_300x250',\n },\n name: 'Minimal Test Creative',\n assets: {},\n },\n } as unknown as PreviewCreativeRequest) as Promise<TaskResult>\n );\n steps.push(minimalStep);\n\n // Test 2: Preview with sample assets\n const sampleFormat = formatsToTest[0];\n if (sampleFormat) {\n const { result, step } = await runStep<TaskResult>(\n `Preview creative: with assets (${sampleFormat.format_id.id})`,\n 'preview_creative',\n async () =>\n client.previewCreative({\n request_type: 'single',\n creative_manifest: {\n format_id: sampleFormat.format_id,\n name: 'Full Test Creative',\n assets: buildTestAssets(sampleFormat) as unknown as Record<string, unknown>,\n },\n } as unknown as PreviewCreativeRequest) as Promise<TaskResult>\n );\n\n if (result?.success && result?.data) {\n const data = result.data as {\n previews?: Array<{ renders?: unknown[] }>;\n interactive_url?: string;\n };\n const previews = data.previews || [];\n const renderCount = previews.reduce((count, preview) => count + (preview.renders?.length || 0), 0);\n step.details = `Generated preview with ${previews.length} variant(s)`;\n step.response_preview = JSON.stringify(\n {\n has_renders: renderCount > 0,\n preview_count: previews.length,\n render_count: renderCount,\n interactive_url: data.interactive_url,\n },\n null,\n 2\n );\n } else if (result && !result.success) {\n step.passed = false;\n step.error = result.error || 'preview_creative failed';\n }\n steps.push(step);\n }\n\n // Test 3: Preview with invalid format_id (error case)\n const { result: errorResult, step: errorStep } = await runStep<TaskResult>(\n 'Preview creative: invalid format (error expected)',\n 'preview_creative',\n async () =>\n client.previewCreative({\n request_type: 'single',\n creative_manifest: {\n format_id: { agent_url: 'https://creative.adcontextprotocol.org', id: 'INVALID_FORMAT_ID_12345' },\n name: 'Error Test Creative',\n assets: {},\n },\n } as unknown as PreviewCreativeRequest) as Promise<TaskResult>\n );\n\n // This should fail - if it succeeds with invalid format, that's a bug\n if (errorResult?.success) {\n errorStep.passed = false;\n errorStep.error = 'Expected error for invalid format_id but got success';\n } else {\n errorStep.passed = true;\n errorStep.details = 'Correctly rejected invalid format_id';\n }\n steps.push(errorStep);\n }\n\n return { steps, profile };\n}\n\n/**\n * Test: Creative Lifecycle\n *\n * Chains creative protocol operations end-to-end:\n * 1. list_creative_formats → verify format schema\n * 2. sync_creatives with multiple creatives → verify per-creative status\n * 3. list_creatives (no snapshot) → verify basic fields\n * 4. list_creatives (include_snapshot: true) → verify snapshot or snapshot_unavailable_reason\n * 5. build_creative or preview_creative on synced creative → adapt to agent capabilities\n */\nexport async function testCreativeLifecycle(\n agentUrl: string,\n options: TestOptions\n): Promise<{ steps: TestStepResult[]; profile?: AgentProfile }> {\n const steps: TestStepResult[] = [];\n const client = getOrCreateClient(agentUrl, options);\n\n // Discover agent profile\n const { profile, step: profileStep } = await getOrDiscoverProfile(client, options);\n steps.push(profileStep);\n\n if (!profileStep.passed) {\n return { steps, profile };\n }\n\n // Step 1: Discover creative formats\n const { formats, step: formatStep } = await discoverCreativeFormats(client, profile);\n steps.push(formatStep);\n\n if (!formatStep.passed || !formats || formats.length === 0) {\n return { steps, profile };\n }\n\n profile.supported_formats = formats;\n\n // Validate format schema: each format should have format_id\n const formatSchemaIssues: string[] = [];\n for (const format of formats) {\n if (!format.format_id) formatSchemaIssues.push('Missing format_id');\n }\n\n steps.push({\n step: 'Validate format schema',\n passed: formatSchemaIssues.length === 0,\n duration_ms: 0,\n details:\n formatSchemaIssues.length === 0\n ? `All ${formats.length} format(s) have required fields`\n : formatSchemaIssues.join('; '),\n warnings: formatSchemaIssues.length > 0 ? formatSchemaIssues : undefined,\n });\n\n // Step 2: Sync multiple creatives (image + video if formats allow)\n if (profile.tools.includes('sync_creatives')) {\n const imageFormat = formats[0]!;\n const videoFormat = formats.length > 1 ? formats[1] : undefined;\n\n const creativesToSync = [\n {\n creative_id: `lifecycle-img-${Date.now()}`,\n name: 'Lifecycle Test Image Creative',\n format_id: imageFormat.format_id,\n assets: {\n primary: {\n url: 'https://via.placeholder.com/300x250.png?text=Lifecycle+Image',\n width: 300,\n height: 250,\n format: 'png',\n },\n },\n },\n ];\n\n if (videoFormat) {\n creativesToSync.push({\n creative_id: `lifecycle-vid-${Date.now()}`,\n name: 'Lifecycle Test Video Creative',\n format_id: videoFormat.format_id,\n assets: {\n primary: {\n url: 'https://storage.googleapis.com/webfundamentals-assets/videos/chrome.mp4',\n width: 1920,\n height: 1080,\n format: 'mp4',\n },\n },\n });\n }\n\n const { result: syncResult, step: syncStep } = await runStep<TaskResult>(\n `Sync ${creativesToSync.length} creative(s) to library`,\n 'sync_creatives',\n async () =>\n client.executeTask('sync_creatives', {\n creatives: creativesToSync,\n }) as Promise<TaskResult>\n );\n\n if (syncResult?.success && syncResult?.data) {\n const data = syncResult.data;\n const creatives = data.creatives || [];\n const actions = creatives.map((c: any) => c.action);\n const failed = creatives.filter((c: any) => c.action === 'failed');\n\n syncStep.details = `Synced ${creatives.length} creative(s), actions: ${actions.join(', ')}`;\n syncStep.response_preview = JSON.stringify(\n {\n synced_count: creatives.length,\n actions,\n creative_ids: creatives.map((c: any) => c.creative_id),\n failed_count: failed.length,\n failed_errors: failed.map((c: any) => ({ creative_id: c.creative_id, errors: c.errors })),\n },\n null,\n 2\n );\n } else if (syncResult && !syncResult.success) {\n syncStep.passed = false;\n syncStep.error = syncResult.error || 'sync_creatives returned unsuccessful result';\n }\n steps.push(syncStep);\n\n // Step 3: list_creatives without snapshot\n if (profile.tools.includes('list_creatives')) {\n const { result: listResult, step: listStep } = await runStep<TaskResult>(\n 'List creatives (no snapshot)',\n 'list_creatives',\n async () => client.executeTask('list_creatives', {}) as Promise<TaskResult>\n );\n\n if (listResult?.success && listResult?.data) {\n const data = listResult.data;\n const creatives = data.creatives || [];\n\n // Validate basic fields on each creative\n const fieldIssues: string[] = [];\n for (const creative of creatives.slice(0, 5)) {\n if (!creative.creative_id) fieldIssues.push('Creative missing creative_id');\n if (!creative.name) fieldIssues.push(`Creative ${creative.creative_id}: missing name`);\n if (!creative.format_id) fieldIssues.push(`Creative ${creative.creative_id}: missing format_id`);\n }\n\n // Verify snapshot is absent when not requested\n const hasUnexpectedSnapshot = creatives.some((c: any) => c.snapshot !== undefined);\n\n if (fieldIssues.length > 0) {\n listStep.passed = false;\n listStep.error = `Creative field validation: ${fieldIssues.join('; ')}`;\n } else {\n listStep.details = `Found ${creatives.length} creative(s) with valid fields`;\n }\n\n listStep.response_preview = JSON.stringify(\n {\n creatives_count: creatives.length,\n statuses: Array.from(new Set(creatives.map((c: any) => c.status))),\n has_unexpected_snapshot: hasUnexpectedSnapshot,\n query_summary: data.query_summary,\n },\n null,\n 2\n );\n\n if (hasUnexpectedSnapshot) {\n listStep.warnings = ['snapshot field present on creatives without include_snapshot=true'];\n }\n } else if (listResult && !listResult.success) {\n listStep.passed = false;\n listStep.error = listResult.error || 'list_creatives returned unsuccessful result';\n }\n steps.push(listStep);\n\n // Step 4: list_creatives with include_snapshot: true\n const { result: snapshotResult, step: snapshotStep } = await runStep<TaskResult>(\n 'List creatives (include_snapshot: true)',\n 'list_creatives',\n async () => client.executeTask('list_creatives', { include_snapshot: true }) as Promise<TaskResult>\n );\n\n if (snapshotResult?.success && snapshotResult?.data) {\n const data = snapshotResult.data;\n const creatives = data.creatives || [];\n\n // Each creative should have either snapshot data or snapshot_unavailable_reason\n const invalidCreatives = creatives.filter((c: any) => {\n if (c.snapshot) {\n return !c.snapshot.as_of || c.snapshot.staleness_seconds === undefined;\n }\n return !c.snapshot_unavailable_reason;\n });\n\n if (invalidCreatives.length > 0) {\n snapshotStep.passed = false;\n snapshotStep.error = `${invalidCreatives.length} creative(s) missing both snapshot and snapshot_unavailable_reason`;\n } else {\n const withSnapshot = creatives.filter((c: any) => !!c.snapshot).length;\n const withReason = creatives.filter((c: any) => !!c.snapshot_unavailable_reason).length;\n snapshotStep.details = `${creatives.length} creative(s): ${withSnapshot} with snapshot, ${withReason} with unavailable_reason`;\n }\n\n snapshotStep.response_preview = JSON.stringify(\n {\n creatives_count: creatives.length,\n with_snapshot: creatives.filter((c: any) => !!c.snapshot).length,\n with_unavailable_reason: creatives.filter((c: any) => !!c.snapshot_unavailable_reason).length,\n snapshot_reasons: Array.from(\n new Set(creatives.map((c: any) => c.snapshot_unavailable_reason).filter(Boolean))\n ),\n },\n null,\n 2\n );\n } else if (snapshotResult && !snapshotResult.success) {\n snapshotStep.passed = false;\n snapshotStep.error = snapshotResult.error || 'list_creatives with snapshot returned unsuccessful result';\n }\n steps.push(snapshotStep);\n }\n }\n\n // Step 5: build_creative or preview_creative (adapt to agent capabilities)\n if (profile.tools.includes('build_creative')) {\n const targetFormat = formats[0]!;\n const { result, step } = await runStep<TaskResult>(\n `Build creative for lifecycle (${targetFormat.format_id})`,\n 'build_creative',\n async () =>\n client.executeTask('build_creative', {\n target_format_id: targetFormat.format_id,\n brand: resolveBrand(options),\n message: `Create an ad for lifecycle testing`,\n quality: 'draft',\n include_preview: true,\n }) as Promise<TaskResult>\n );\n\n if (result?.success && result?.data) {\n const data = result.data;\n const manifest = data.creative_manifest || data.creative_manifests?.[0];\n step.details = `Built creative manifest for format ${manifest?.format_id || targetFormat.format_id}`;\n step.response_preview = JSON.stringify(\n {\n format_id: manifest?.format_id || targetFormat.format_id,\n asset_keys: Object.keys(manifest?.assets || {}),\n has_preview: !!data.preview,\n },\n null,\n 2\n );\n } else if (result && !result.success) {\n step.passed = false;\n step.error = result.error || 'build_creative failed';\n }\n steps.push(step);\n } else if (profile.tools.includes('preview_creative')) {\n // Tag-serving agents may only support preview, not build\n const targetFormat = formats[0]!;\n const { result, step } = await runStep<TaskResult>(\n `Preview creative for lifecycle (${targetFormat.format_id})`,\n 'preview_creative',\n async () =>\n client.executeTask('preview_creative', {\n request_type: 'single',\n creative_manifest: {\n format_id: targetFormat.format_id,\n name: 'Lifecycle Test Preview',\n assets: buildTestAssets(targetFormat),\n },\n }) as Promise<TaskResult>\n );\n\n if (result?.success && result?.data) {\n const data = result.data;\n step.details = `Generated preview with ${data.renders?.length || 0} render(s)`;\n } else if (result && !result.success) {\n step.passed = false;\n step.error = result.error || 'preview_creative failed';\n }\n steps.push(step);\n }\n\n return { steps, profile };\n}\n\n/**\n * Select which formats to test based on options\n */\nfunction selectFormatsToTest(\n formats: NonNullable<AgentProfile['supported_formats']>,\n options: TestOptions\n): NonNullable<AgentProfile['supported_formats']> {\n // If specific format_ids provided, use those\n if (options.format_ids?.length) {\n return formats.filter(f => options.format_ids!.includes(f.format_id.id));\n }\n\n // If test_all_formats, test up to max_formats_to_test\n if (options.test_all_formats) {\n const maxFormats = options.max_formats_to_test || 5;\n return formats.slice(0, maxFormats);\n }\n\n // Default: test up to 3 formats\n return formats.slice(0, 3);\n}\n\n/**\n * Build test assets for a format based on its requirements\n */\nfunction buildTestAssets(\n format: NonNullable<AgentProfile['supported_formats']>[0]\n): Array<{ asset_id: string; asset_type: string; url: string }> {\n const assets: Array<{ asset_id: string; asset_type: string; url: string }> = [];\n\n // Add required assets\n if (format.required_assets?.length) {\n for (const assetName of format.required_assets) {\n assets.push({\n asset_id: assetName,\n asset_type: guessAssetType(assetName),\n url: getTestAssetUrl(assetName),\n });\n }\n }\n\n // If no required assets, add a default image\n if (assets.length === 0) {\n assets.push({\n asset_id: 'primary_image',\n asset_type: 'image',\n url: 'https://via.placeholder.com/300x250.png?text=Test+Creative',\n });\n }\n\n return assets;\n}\n\n/**\n * Guess asset type from asset name\n */\nfunction guessAssetType(assetName: string): string {\n const lower = assetName.toLowerCase();\n if (lower.includes('video') || lower.includes('clip')) return 'video';\n if (lower.includes('audio') || lower.includes('sound')) return 'audio';\n if (lower.includes('logo')) return 'image';\n if (lower.includes('text') || lower.includes('headline') || lower.includes('copy')) return 'text';\n return 'image';\n}\n\n/**\n * Get a test asset URL for testing\n */\nfunction getTestAssetUrl(assetName: string): string {\n const type = guessAssetType(assetName);\n switch (type) {\n case 'video':\n return 'https://storage.googleapis.com/webfundamentals-assets/videos/chrome.mp4';\n case 'audio':\n return 'https://www.soundhelix.com/examples/mp3/SoundHelix-Song-1.mp3';\n default:\n return 'https://via.placeholder.com/300x250.png?text=Test+Asset';\n }\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../../../src/lib/testing/scenarios/creative.ts"],"sourcesContent":["/**\n * Creative Agent Testing Scenarios\n *\n * Tests creative agent capabilities including:\n * - list_creative_formats / list_formats\n * - build_creative\n * - preview_creative\n *\n * Enhanced to:\n * - Test multiple formats from the agent's actual catalog\n * - Test with both required and optional assets\n * - Validate preview renders\n */\n\nimport type { BuildCreativeRequest, PreviewCreativeRequest } from '../../types/tools.generated';\nimport type { TestOptions, TestStepResult, AgentProfile, TaskResult } from '../types';\nimport { getOrCreateClient, runStep, getOrDiscoverProfile, discoverCreativeFormats, resolveBrand } from '../client';\n\n/**\n * Test: Creative Flow (for creative agents)\n *\n * Flow: list_formats -> build_creative (multiple formats) -> preview_creative (with assets)\n */\nexport async function testCreativeFlow(\n agentUrl: string,\n options: TestOptions\n): Promise<{ steps: TestStepResult[]; profile?: AgentProfile }> {\n const steps: TestStepResult[] = [];\n const client = getOrCreateClient(agentUrl, options);\n\n // Discover agent profile\n const { profile, step: profileStep } = await getOrDiscoverProfile(client, options);\n steps.push(profileStep);\n\n if (!profileStep.passed) {\n return { steps, profile };\n }\n\n // Discover creative formats with full details\n const { formats, step: formatStep } = await discoverCreativeFormats(client, profile);\n steps.push(formatStep);\n\n if (!formatStep.passed || !formats || formats.length === 0) {\n return { steps, profile: { ...profile, supported_formats: formats || [] } };\n }\n\n // Store discovered formats in profile\n profile.supported_formats = formats;\n\n // Determine which formats to test\n const formatsToTest = selectFormatsToTest(formats || [], options);\n\n // Build creative for each selected format\n if (profile.tools.includes('build_creative')) {\n for (const format of formatsToTest) {\n const formatDisplayName = format.name || format.format_id.id;\n const { result, step } = await runStep<TaskResult>(\n `Build creative: ${formatDisplayName}`,\n 'build_creative',\n async () =>\n client.buildCreative({\n target_format_id: format.format_id,\n brand: resolveBrand(options),\n message: `Create an ad for an e-commerce brand promoting summer sale`,\n quality: 'draft',\n include_preview: true,\n } as unknown as BuildCreativeRequest) as Promise<TaskResult>\n );\n\n if (result?.success && result?.data) {\n const data = result.data as {\n creative_manifest?: { format_id?: unknown; assets?: Record<string, unknown> };\n creative_manifests?: Array<{ format_id?: unknown; assets?: Record<string, unknown> }>;\n preview?: { previews?: unknown[] };\n };\n const manifest = data.creative_manifest || data.creative_manifests?.[0];\n step.details = `Built creative manifest for format ${formatDisplayName}`;\n step.response_preview = JSON.stringify(\n {\n format_id: manifest?.format_id || format.format_id,\n asset_keys: Object.keys(manifest?.assets || {}),\n has_preview: !!data.preview,\n preview_count: data.preview?.previews?.length || 0,\n },\n null,\n 2\n );\n } else if (result && !result.success) {\n step.passed = false;\n step.error = result.error || 'build_creative failed';\n }\n steps.push(step);\n }\n }\n\n // Preview creative with various asset configurations\n if (profile.tools.includes('preview_creative')) {\n // Test 1: Preview with minimal assets (empty)\n const { step: minimalStep } = await runStep<TaskResult>(\n 'Preview creative: minimal assets',\n 'preview_creative',\n async () =>\n client.previewCreative({\n request_type: 'single',\n creative_manifest: {\n format_id: formatsToTest[0]?.format_id || {\n agent_url: 'https://creative.adcontextprotocol.org',\n id: 'display_300x250',\n },\n name: 'Minimal Test Creative',\n assets: {},\n },\n } as unknown as PreviewCreativeRequest) as Promise<TaskResult>\n );\n steps.push(minimalStep);\n\n // Test 2: Preview with sample assets\n const sampleFormat = formatsToTest[0];\n if (sampleFormat) {\n const { result, step } = await runStep<TaskResult>(\n `Preview creative: with assets (${sampleFormat.format_id.id})`,\n 'preview_creative',\n async () =>\n client.previewCreative({\n request_type: 'single',\n creative_manifest: {\n format_id: sampleFormat.format_id,\n name: 'Full Test Creative',\n assets: buildTestAssets(sampleFormat) as unknown as Record<string, unknown>,\n },\n } as unknown as PreviewCreativeRequest) as Promise<TaskResult>\n );\n\n if (result?.success && result?.data) {\n const data = result.data as {\n previews?: Array<{ renders?: unknown[] }>;\n interactive_url?: string;\n };\n const previews = data.previews || [];\n const renderCount = previews.reduce((count, preview) => count + (preview.renders?.length || 0), 0);\n step.details = `Generated preview with ${previews.length} variant(s)`;\n step.response_preview = JSON.stringify(\n {\n has_renders: renderCount > 0,\n preview_count: previews.length,\n render_count: renderCount,\n interactive_url: data.interactive_url,\n },\n null,\n 2\n );\n } else if (result && !result.success) {\n step.passed = false;\n step.error = result.error || 'preview_creative failed';\n }\n steps.push(step);\n }\n\n // Test 3: Preview with invalid format_id (error case)\n const { result: errorResult, step: errorStep } = await runStep<TaskResult>(\n 'Preview creative: invalid format (error expected)',\n 'preview_creative',\n async () =>\n client.previewCreative({\n request_type: 'single',\n creative_manifest: {\n format_id: { agent_url: 'https://creative.adcontextprotocol.org', id: 'INVALID_FORMAT_ID_12345' },\n name: 'Error Test Creative',\n assets: {},\n },\n } as unknown as PreviewCreativeRequest) as Promise<TaskResult>\n );\n\n // This should fail - if it succeeds with invalid format, that's a bug\n if (errorResult?.success) {\n errorStep.passed = false;\n errorStep.error = 'Expected error for invalid format_id but got success';\n } else {\n errorStep.passed = true;\n errorStep.details = 'Correctly rejected invalid format_id';\n }\n steps.push(errorStep);\n }\n\n return { steps, profile };\n}\n\n/**\n * Test: Creative Lifecycle\n *\n * Chains creative protocol operations end-to-end:\n * 1. list_creative_formats → verify format schema\n * 2. sync_creatives with multiple creatives → verify per-creative status\n * 3. list_creatives (no snapshot) → verify basic fields\n * 4. list_creatives (include_snapshot: true) → verify snapshot or snapshot_unavailable_reason\n * 5. build_creative or preview_creative on synced creative → adapt to agent capabilities\n */\nexport async function testCreativeLifecycle(\n agentUrl: string,\n options: TestOptions\n): Promise<{ steps: TestStepResult[]; profile?: AgentProfile }> {\n const steps: TestStepResult[] = [];\n const client = getOrCreateClient(agentUrl, options);\n\n // Discover agent profile\n const { profile, step: profileStep } = await getOrDiscoverProfile(client, options);\n steps.push(profileStep);\n\n if (!profileStep.passed) {\n return { steps, profile };\n }\n\n // Step 1: Discover creative formats\n const { formats, step: formatStep } = await discoverCreativeFormats(client, profile);\n steps.push(formatStep);\n\n if (!formatStep.passed || !formats || formats.length === 0) {\n return { steps, profile };\n }\n\n profile.supported_formats = formats;\n\n // Validate format schema: each format should have format_id\n const formatSchemaIssues: string[] = [];\n for (const format of formats) {\n if (!format.format_id) formatSchemaIssues.push('Missing format_id');\n }\n\n steps.push({\n step: 'Validate format schema',\n passed: formatSchemaIssues.length === 0,\n duration_ms: 0,\n details:\n formatSchemaIssues.length === 0\n ? `All ${formats.length} format(s) have required fields`\n : formatSchemaIssues.join('; '),\n warnings: formatSchemaIssues.length > 0 ? formatSchemaIssues : undefined,\n });\n\n // Step 2: Sync multiple creatives (image + video if formats allow)\n if (profile.tools.includes('sync_creatives')) {\n const imageFormat = formats[0]!;\n const videoFormat = formats.length > 1 ? formats[1] : undefined;\n\n const creativesToSync = [\n {\n creative_id: `lifecycle-img-${Date.now()}`,\n name: 'Lifecycle Test Image Creative',\n format_id: imageFormat.format_id,\n assets: {\n primary: {\n url: 'https://via.placeholder.com/300x250.png?text=Lifecycle+Image',\n width: 300,\n height: 250,\n format: 'png',\n },\n },\n },\n ];\n\n if (videoFormat) {\n creativesToSync.push({\n creative_id: `lifecycle-vid-${Date.now()}`,\n name: 'Lifecycle Test Video Creative',\n format_id: videoFormat.format_id,\n assets: {\n primary: {\n url: 'https://storage.googleapis.com/webfundamentals-assets/videos/chrome.mp4',\n width: 1920,\n height: 1080,\n format: 'mp4',\n },\n },\n });\n }\n\n const { result: syncResult, step: syncStep } = await runStep<TaskResult>(\n `Sync ${creativesToSync.length} creative(s) to library`,\n 'sync_creatives',\n async () =>\n client.executeTask('sync_creatives', {\n creatives: creativesToSync,\n }) as Promise<TaskResult>\n );\n\n if (syncResult?.success && syncResult?.data) {\n const data = syncResult.data;\n const creatives = data.creatives || [];\n const actions = creatives.map((c: any) => c.action);\n const failed = creatives.filter((c: any) => c.action === 'failed');\n\n syncStep.details = `Synced ${creatives.length} creative(s), actions: ${actions.join(', ')}`;\n syncStep.response_preview = JSON.stringify(\n {\n synced_count: creatives.length,\n actions,\n creative_ids: creatives.map((c: any) => c.creative_id),\n failed_count: failed.length,\n failed_errors: failed.map((c: any) => ({ creative_id: c.creative_id, errors: c.errors })),\n },\n null,\n 2\n );\n } else if (syncResult && !syncResult.success) {\n syncStep.passed = false;\n syncStep.error = syncResult.error || 'sync_creatives returned unsuccessful result';\n }\n steps.push(syncStep);\n\n // Step 3: list_creatives without snapshot\n if (profile.tools.includes('list_creatives')) {\n const { result: listResult, step: listStep } = await runStep<TaskResult>(\n 'List creatives (no snapshot)',\n 'list_creatives',\n async () => client.executeTask('list_creatives', {}) as Promise<TaskResult>\n );\n\n if (listResult?.success && listResult?.data) {\n const data = listResult.data;\n const creatives = data.creatives || [];\n\n // Validate basic fields on each creative\n const fieldIssues: string[] = [];\n for (const creative of creatives.slice(0, 5)) {\n if (!creative.creative_id) fieldIssues.push('Creative missing creative_id');\n if (!creative.name) fieldIssues.push(`Creative ${creative.creative_id}: missing name`);\n if (!creative.format_id) fieldIssues.push(`Creative ${creative.creative_id}: missing format_id`);\n }\n\n // Verify snapshot is absent when not requested\n const hasUnexpectedSnapshot = creatives.some((c: any) => c.snapshot !== undefined);\n\n if (fieldIssues.length > 0) {\n listStep.passed = false;\n listStep.error = `Creative field validation: ${fieldIssues.join('; ')}`;\n } else {\n listStep.details = `Found ${creatives.length} creative(s) with valid fields`;\n }\n\n listStep.response_preview = JSON.stringify(\n {\n creatives_count: creatives.length,\n statuses: Array.from(new Set(creatives.map((c: any) => c.status))),\n has_unexpected_snapshot: hasUnexpectedSnapshot,\n query_summary: data.query_summary,\n },\n null,\n 2\n );\n\n if (hasUnexpectedSnapshot) {\n listStep.warnings = ['snapshot field present on creatives without include_snapshot=true'];\n }\n } else if (listResult && !listResult.success) {\n listStep.passed = false;\n listStep.error = listResult.error || 'list_creatives returned unsuccessful result';\n }\n steps.push(listStep);\n\n // Step 4: list_creatives with include_snapshot: true\n const { result: snapshotResult, step: snapshotStep } = await runStep<TaskResult>(\n 'List creatives (include_snapshot: true)',\n 'list_creatives',\n async () => client.executeTask('list_creatives', { include_snapshot: true }) as Promise<TaskResult>\n );\n\n if (snapshotResult?.success && snapshotResult?.data) {\n const data = snapshotResult.data;\n const creatives = data.creatives || [];\n\n // Each creative should have either snapshot data or snapshot_unavailable_reason\n const invalidCreatives = creatives.filter((c: any) => {\n if (c.snapshot) {\n return !c.snapshot.as_of || c.snapshot.staleness_seconds === undefined;\n }\n return !c.snapshot_unavailable_reason;\n });\n\n if (invalidCreatives.length > 0) {\n snapshotStep.passed = false;\n snapshotStep.error = `${invalidCreatives.length} creative(s) missing both snapshot and snapshot_unavailable_reason`;\n } else {\n const withSnapshot = creatives.filter((c: any) => !!c.snapshot).length;\n const withReason = creatives.filter((c: any) => !!c.snapshot_unavailable_reason).length;\n snapshotStep.details = `${creatives.length} creative(s): ${withSnapshot} with snapshot, ${withReason} with unavailable_reason`;\n }\n\n snapshotStep.response_preview = JSON.stringify(\n {\n creatives_count: creatives.length,\n with_snapshot: creatives.filter((c: any) => !!c.snapshot).length,\n with_unavailable_reason: creatives.filter((c: any) => !!c.snapshot_unavailable_reason).length,\n snapshot_reasons: Array.from(\n new Set(creatives.map((c: any) => c.snapshot_unavailable_reason).filter(Boolean))\n ),\n },\n null,\n 2\n );\n } else if (snapshotResult && !snapshotResult.success) {\n snapshotStep.passed = false;\n snapshotStep.error = snapshotResult.error || 'list_creatives with snapshot returned unsuccessful result';\n }\n steps.push(snapshotStep);\n }\n }\n\n // Step 5: build_creative or preview_creative (adapt to agent capabilities)\n if (profile.tools.includes('build_creative')) {\n const targetFormat = formats[0]!;\n const { result, step } = await runStep<TaskResult>(\n `Build creative for lifecycle (${targetFormat.format_id})`,\n 'build_creative',\n async () =>\n client.executeTask('build_creative', {\n target_format_id: targetFormat.format_id,\n brand: resolveBrand(options),\n message: `Create an ad for lifecycle testing`,\n quality: 'draft',\n include_preview: true,\n }) as Promise<TaskResult>\n );\n\n if (result?.success && result?.data) {\n const data = result.data;\n const manifest = data.creative_manifest || data.creative_manifests?.[0];\n step.details = `Built creative manifest for format ${manifest?.format_id || targetFormat.format_id}`;\n step.response_preview = JSON.stringify(\n {\n format_id: manifest?.format_id || targetFormat.format_id,\n asset_keys: Object.keys(manifest?.assets || {}),\n has_preview: !!data.preview,\n },\n null,\n 2\n );\n } else if (result && !result.success) {\n step.passed = false;\n step.error = result.error || 'build_creative failed';\n }\n steps.push(step);\n } else if (profile.tools.includes('preview_creative')) {\n // Tag-serving agents may only support preview, not build\n const targetFormat = formats[0]!;\n const { result, step } = await runStep<TaskResult>(\n `Preview creative for lifecycle (${targetFormat.format_id})`,\n 'preview_creative',\n async () =>\n client.executeTask('preview_creative', {\n request_type: 'single',\n creative_manifest: {\n format_id: targetFormat.format_id,\n name: 'Lifecycle Test Preview',\n assets: buildTestAssets(targetFormat),\n },\n }) as Promise<TaskResult>\n );\n\n if (result?.success && result?.data) {\n const data = result.data;\n step.details = `Generated preview with ${data.renders?.length || 0} render(s)`;\n } else if (result && !result.success) {\n step.passed = false;\n step.error = result.error || 'preview_creative failed';\n }\n steps.push(step);\n }\n\n return { steps, profile };\n}\n\n/**\n * Select which formats to test based on options\n */\nfunction selectFormatsToTest(\n formats: NonNullable<AgentProfile['supported_formats']>,\n options: TestOptions\n): NonNullable<AgentProfile['supported_formats']> {\n // If specific format_ids provided, use those\n if (options.format_ids?.length) {\n return formats.filter(f => options.format_ids!.includes(f.format_id.id));\n }\n\n // If test_all_formats, test up to max_formats_to_test\n if (options.test_all_formats) {\n const maxFormats = options.max_formats_to_test || 5;\n return formats.slice(0, maxFormats);\n }\n\n // Default: test up to 3 formats\n return formats.slice(0, 3);\n}\n\n/**\n * Build test assets for a format based on its requirements\n */\nfunction buildTestAssets(\n format: NonNullable<AgentProfile['supported_formats']>[0]\n): Array<{ asset_id: string; asset_type: string; url: string }> {\n const assets: Array<{ asset_id: string; asset_type: string; url: string }> = [];\n\n // Add required assets\n if (format.required_assets?.length) {\n for (const assetName of format.required_assets) {\n assets.push({\n asset_id: assetName,\n asset_type: guessAssetType(assetName),\n url: getTestAssetUrl(assetName),\n });\n }\n }\n\n // If no required assets, add a default image\n if (assets.length === 0) {\n assets.push({\n asset_id: 'primary_image',\n asset_type: 'image',\n url: 'https://via.placeholder.com/300x250.png?text=Test+Creative',\n });\n }\n\n return assets;\n}\n\n/**\n * Guess asset type from asset name\n */\nfunction guessAssetType(assetName: string): string {\n const lower = assetName.toLowerCase();\n if (lower.includes('video') || lower.includes('clip')) return 'video';\n if (lower.includes('audio') || lower.includes('sound')) return 'audio';\n if (lower.includes('logo')) return 'image';\n if (lower.includes('text') || lower.includes('headline') || lower.includes('copy')) return 'text';\n return 'image';\n}\n\n/**\n * Get a test asset URL for testing\n */\nfunction getTestAssetUrl(assetName: string): string {\n const type = guessAssetType(assetName);\n switch (type) {\n case 'video':\n return 'https://storage.googleapis.com/webfundamentals-assets/videos/chrome.mp4';\n case 'audio':\n return 'https://www.soundhelix.com/examples/mp3/SoundHelix-Song-1.mp3';\n default:\n return 'https://via.placeholder.com/300x250.png?text=Test+Asset';\n }\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1,9 +1,3 @@
|
|
|
1
|
-
import { fileURLToPath as __adcpFileURLToPath } from 'node:url';
|
|
2
|
-
import { dirname as __adcpDirname } from 'node:path';
|
|
3
|
-
import { createRequire as __adcpCreateRequire } from 'node:module';
|
|
4
|
-
const __filename = __adcpFileURLToPath(import.meta.url);
|
|
5
|
-
const __dirname = __adcpDirname(__filename);
|
|
6
|
-
const require = __adcpCreateRequire(import.meta.url);
|
|
7
1
|
import { getOrCreateClient, runStep, resolveAccount } from "../client.mjs";
|
|
8
2
|
import { forceStatus, simulate, supportsScenario, callControllerRaw } from "../test-controller.mjs";
|
|
9
3
|
import { testCreateMediaBuy, testCreativeSync } from "./media-buy.mjs";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/lib/testing/scenarios/deterministic.ts"],"sourcesContent":["/**\n * Deterministic Compliance Scenarios\n *\n * These scenarios use the comply_test_controller to force seller-side\n * state transitions, enabling full state machine verification.\n * Only run when the controller is detected.\n */\n\nimport { getOrCreateClient, runStep, resolveAccount } from '../client';\nimport { forceStatus, simulate, supportsScenario, callControllerRaw } from '../test-controller';\nimport type { ControllerDetection } from '../test-controller';\nimport type { TestOptions, TestStepResult, AgentProfile, TaskResult } from '../types';\nimport type { StateTransitionSuccess, ControllerError } from '../../types/tools.generated';\nimport { testCreateMediaBuy, testCreativeSync } from './media-buy';\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction getController(options: TestOptions): ControllerDetection | undefined {\n return options._controllerCapabilities;\n}\n\n/** Extract an entity ID from step results (created_id, response_preview field, or plural array) */\nfunction extractIdFromSteps(stepsToSearch: TestStepResult[], field: string): string | undefined {\n const pluralField = field.endsWith('_id') ? field + 's' : undefined; // creative_id → creative_ids\n for (const step of stepsToSearch) {\n if (step.created_id) return step.created_id;\n if (step.response_preview) {\n try {\n const preview = JSON.parse(step.response_preview);\n if (preview[field]) return preview[field];\n if (pluralField && Array.isArray(preview[pluralField]) && preview[pluralField][0]) {\n return preview[pluralField][0];\n }\n } catch {\n /* skip */\n }\n }\n }\n return undefined;\n}\n\n/** Build a TestStepResult from a controller transition response */\nfunction transitionStep(\n label: string,\n response: StateTransitionSuccess | ControllerError,\n expectedSuccess: boolean,\n durationMs: number\n): TestStepResult {\n const passed = response.success === expectedSuccess;\n if (response.success) {\n return {\n step: label,\n task: 'comply_test_controller',\n passed,\n duration_ms: durationMs,\n details: `${response.previous_state} → ${response.current_state}`,\n response_preview: JSON.stringify(\n { previous_state: response.previous_state, current_state: response.current_state },\n null,\n 2\n ),\n ...(!passed && {\n error: `Expected failure but got success: ${response.previous_state} → ${response.current_state}`,\n }),\n };\n } else {\n return {\n step: label,\n task: 'comply_test_controller',\n passed,\n duration_ms: durationMs,\n details: `Error: ${response.error} — ${response.error_detail || ''}`,\n response_preview: JSON.stringify({ error: response.error, current_state: response.current_state }, null, 2),\n ...(!passed && { error: `Expected success but got ${response.error}: ${response.error_detail || ''}` }),\n };\n }\n}\n\n/**\n * Create timed wrappers bound to specific options.\n * This ensures controller calls use the same account as test scenarios.\n */\nfunction createTimedHelpers(client: ReturnType<typeof getOrCreateClient>, options: TestOptions) {\n return {\n async forceStatus(\n scenario: Parameters<typeof forceStatus>[1],\n params: Parameters<typeof forceStatus>[2]\n ): Promise<{ response: Awaited<ReturnType<typeof forceStatus>>; durationMs: number }> {\n const start = Date.now();\n const response = await forceStatus(client, scenario, params, options);\n return { response, durationMs: Date.now() - start };\n },\n async simulate(\n scenario: Parameters<typeof simulate>[1],\n params: Parameters<typeof simulate>[2]\n ): Promise<{ response: Awaited<ReturnType<typeof simulate>>; durationMs: number }> {\n const start = Date.now();\n const response = await simulate(client, scenario, params, options);\n return { response, durationMs: Date.now() - start };\n },\n };\n}\n\n/**\n * Call a typed method on the client via executeTask.\n * Uses the same pattern as existing scenarios but through the typed executeTask overload.\n */\nfunction callTask(\n client: ReturnType<typeof getOrCreateClient>,\n taskName: string,\n params: Record<string, unknown>\n): Promise<TaskResult> {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- AgentClient.executeTask exists but TestClient type doesn't expose it directly\n return (client as any).executeTask(taskName, params) as Promise<TaskResult>;\n}\n\n// ---------------------------------------------------------------------------\n// Creative State Machine\n// ---------------------------------------------------------------------------\n\nexport async function testCreativeStateMachine(\n agentUrl: string,\n options: TestOptions\n): Promise<{ steps: TestStepResult[]; profile?: AgentProfile }> {\n const steps: TestStepResult[] = [];\n const client = getOrCreateClient(agentUrl, options);\n const controller = getController(options);\n\n if (!controller?.detected || !supportsScenario(controller, 'force_creative_status')) {\n steps.push({\n step: 'Controller check',\n task: 'comply_test_controller',\n passed: true,\n duration_ms: 0,\n details: 'force_creative_status not supported — skipping',\n });\n return { steps };\n }\n\n const ctrl = createTimedHelpers(client, options);\n\n // Step 1: Sync a creative to get an entity to work with\n const { steps: syncSteps, profile } = await testCreativeSync(agentUrl, options);\n steps.push(...syncSteps);\n\n const creativeId = extractIdFromSteps(syncSteps, 'creative_id');\n\n if (!creativeId) {\n steps.push({\n step: 'Find creative for state machine test',\n passed: false,\n duration_ms: 0,\n error: 'No creative_id found from sync_creatives — cannot test state machine',\n });\n return { steps, profile };\n }\n\n // Step 2: Force to approved\n const { response: approveResult, durationMs: approveDur } = await ctrl.forceStatus('force_creative_status', {\n creative_id: creativeId,\n status: 'approved',\n });\n steps.push(transitionStep('Force creative → approved', approveResult, true, approveDur));\n\n // Step 3: Verify via list_creatives\n if (approveResult.success && profile?.tools.includes('list_creatives')) {\n const { result: listResult, step: listStep } = await runStep<TaskResult>(\n 'Verify creative status via list_creatives',\n 'list_creatives',\n async () => callTask(client, 'list_creatives', {})\n );\n if (listResult?.success && listResult?.data) {\n const creatives = ((listResult.data as Record<string, unknown>).creatives as any[]) || [];\n const found = creatives.find((c: Record<string, unknown>) => c.creative_id === creativeId);\n if (found) {\n listStep.details = `Creative ${creativeId} status: ${found.status}`;\n if (found.status !== 'approved') {\n listStep.passed = false;\n listStep.error = `Expected status 'approved', got '${found.status}'`;\n }\n }\n }\n steps.push(listStep);\n }\n\n // Step 4: Force to archived\n const { response: archiveResult, durationMs: archiveDur } = await ctrl.forceStatus('force_creative_status', {\n creative_id: creativeId,\n status: 'archived',\n });\n steps.push(transitionStep('Force creative → archived', archiveResult, true, archiveDur));\n\n // Step 5: Invalid transition — archived is terminal, can't go back to processing\n const { response: invalidResult, durationMs: invalidDur } = await ctrl.forceStatus('force_creative_status', {\n creative_id: creativeId,\n status: 'processing',\n });\n steps.push(\n transitionStep('Invalid: archived → processing (expect INVALID_TRANSITION)', invalidResult, false, invalidDur)\n );\n\n if (!invalidResult.success && invalidResult.error !== 'INVALID_TRANSITION') {\n steps.push({\n step: 'Validate error code for invalid transition',\n task: 'comply_test_controller',\n passed: false,\n duration_ms: 0,\n error: `Expected error code INVALID_TRANSITION, got ${invalidResult.error}`,\n });\n }\n\n // Step 6: Force to rejected with reason on a fresh creative.\n // Sellers may auto-approve on sync, so force to pending_review first (the only state\n // that allows rejection in most state machines), then reject.\n const { steps: resyncSteps } = await testCreativeSync(agentUrl, options);\n const freshCreativeId = extractIdFromSteps(resyncSteps, 'creative_id');\n\n if (freshCreativeId) {\n // Try to reach a state that allows rejection\n const { response: toPendingReview } = await ctrl.forceStatus('force_creative_status', {\n creative_id: freshCreativeId,\n status: 'pending_review',\n });\n // Whether or not pending_review was reachable, try rejecting from wherever we are.\n // Some sellers allow rejection from processing directly; others require pending_review first.\n const { response: rejectResult, durationMs: rejectDur } = await ctrl.forceStatus('force_creative_status', {\n creative_id: freshCreativeId,\n status: 'rejected',\n rejection_reason: 'Brand safety policy violation (comply test)',\n });\n steps.push(transitionStep('Force creative → rejected with reason', rejectResult, true, rejectDur));\n }\n\n return { steps, profile };\n}\n\n// ---------------------------------------------------------------------------\n// Media Buy State Machine\n// ---------------------------------------------------------------------------\n\nexport async function testMediaBuyStateMachine(\n agentUrl: string,\n options: TestOptions\n): Promise<{ steps: TestStepResult[]; profile?: AgentProfile }> {\n const steps: TestStepResult[] = [];\n const client = getOrCreateClient(agentUrl, options);\n const controller = getController(options);\n\n if (!controller?.detected || !supportsScenario(controller, 'force_media_buy_status')) {\n steps.push({\n step: 'Controller check',\n task: 'comply_test_controller',\n passed: true,\n duration_ms: 0,\n details: 'force_media_buy_status not supported — skipping',\n });\n return { steps };\n }\n\n const ctrl = createTimedHelpers(client, options);\n\n // Create a media buy\n const { steps: createSteps, profile, mediaBuyId } = await testCreateMediaBuy(agentUrl, options);\n steps.push(...createSteps);\n\n if (!mediaBuyId) {\n steps.push({\n step: 'Find media buy for state machine test',\n passed: false,\n duration_ms: 0,\n error: 'No media_buy_id from create_media_buy — cannot test state machine',\n });\n return { steps, profile };\n }\n\n // Force to active\n const { response: activateResult, durationMs: activateDur } = await ctrl.forceStatus('force_media_buy_status', {\n media_buy_id: mediaBuyId,\n status: 'active',\n });\n steps.push(transitionStep('Force media buy → active', activateResult, true, activateDur));\n\n // Verify via get_media_buys\n if (activateResult.success && profile?.tools.includes('get_media_buys')) {\n const { result: getResult, step: getStep } = await runStep<TaskResult>(\n 'Verify media buy status via get_media_buys',\n 'get_media_buys',\n async () => callTask(client, 'get_media_buys', { media_buy_id: mediaBuyId })\n );\n if (getResult?.success && getResult?.data) {\n const data = getResult.data as Record<string, unknown>;\n const buys = (data.media_buys as Record<string, unknown>[]) || [data];\n const found = buys.find((b: Record<string, unknown>) => b.media_buy_id === mediaBuyId);\n if (found) {\n getStep.details = `Media buy ${mediaBuyId} status: ${found.status}`;\n if (found.status !== 'active') {\n getStep.passed = false;\n getStep.error = `Expected status 'active', got '${found.status}'`;\n }\n }\n }\n steps.push(getStep);\n }\n\n // Force to completed (terminal)\n const { response: completeResult, durationMs: completeDur } = await ctrl.forceStatus('force_media_buy_status', {\n media_buy_id: mediaBuyId,\n status: 'completed',\n });\n steps.push(transitionStep('Force media buy → completed', completeResult, true, completeDur));\n\n // Invalid: completed → active (terminal)\n const { response: invalidResult, durationMs: invalidDur } = await ctrl.forceStatus('force_media_buy_status', {\n media_buy_id: mediaBuyId,\n status: 'active',\n });\n steps.push(\n transitionStep('Invalid: completed → active (expect INVALID_TRANSITION)', invalidResult, false, invalidDur)\n );\n\n // Test rejection: force to pending_start first (some sellers create as active),\n // then reject from there. If the seller doesn't support pending_start, skip.\n const { steps: create2Steps, mediaBuyId: mediaBuyId2 } = await testCreateMediaBuy(agentUrl, options);\n steps.push(...create2Steps);\n\n if (mediaBuyId2) {\n // Try to force to pending_start first\n const { response: pendingResult } = await ctrl.forceStatus('force_media_buy_status', {\n media_buy_id: mediaBuyId2,\n status: 'pending_start',\n });\n\n if (pendingResult.success) {\n // Now reject from pending_start\n const { response: rejectResult, durationMs: rejectDur } = await ctrl.forceStatus('force_media_buy_status', {\n media_buy_id: mediaBuyId2,\n status: 'rejected',\n rejection_reason: 'Policy violation (comply test)',\n });\n steps.push(transitionStep('Force media buy → rejected from pending_start', rejectResult, true, rejectDur));\n } else {\n // Can't reach pending_start — test cancellation instead (valid from active)\n const { response: cancelResult, durationMs: cancelDur } = await ctrl.forceStatus('force_media_buy_status', {\n media_buy_id: mediaBuyId2,\n status: 'canceled',\n });\n steps.push(transitionStep('Force media buy → canceled from active', cancelResult, true, cancelDur));\n }\n }\n\n return { steps, profile };\n}\n\n// ---------------------------------------------------------------------------\n// Account State Machine\n// ---------------------------------------------------------------------------\n\nexport async function testAccountStateMachine(\n agentUrl: string,\n options: TestOptions\n): Promise<{ steps: TestStepResult[]; profile?: AgentProfile }> {\n const steps: TestStepResult[] = [];\n const client = getOrCreateClient(agentUrl, options);\n const controller = getController(options);\n\n if (!controller?.detected || !supportsScenario(controller, 'force_account_status')) {\n steps.push({\n step: 'Controller check',\n task: 'comply_test_controller',\n passed: true,\n duration_ms: 0,\n details: 'force_account_status not supported — skipping',\n });\n return { steps };\n }\n\n const ctrl = createTimedHelpers(client, options);\n\n // Discover an account to work with\n const profile = options._profile;\n let accountId: string | undefined;\n\n if (profile?.tools.includes('list_accounts')) {\n const { result: listResult, step: listStep } = await runStep<TaskResult>(\n 'List accounts for state machine test',\n 'list_accounts',\n async () => callTask(client, 'list_accounts', {})\n );\n if (listResult?.success && listResult?.data) {\n const accounts = ((listResult.data as Record<string, unknown>).accounts as Record<string, unknown>[]) || [];\n const active = accounts.find((a: Record<string, unknown>) => a.status === 'active');\n accountId = (active?.account_id || accounts[0]?.account_id) as string | undefined;\n listStep.details = `Found ${accounts.length} account(s), using ${accountId || 'none'}`;\n }\n steps.push(listStep);\n }\n\n if (!accountId) {\n steps.push({\n step: 'Find account for state machine test',\n passed: true,\n duration_ms: 0,\n details: 'No account found — skipping account state machine test',\n });\n return { steps, profile };\n }\n\n // Force to suspended\n const { response: suspendResult, durationMs: suspendDur } = await ctrl.forceStatus('force_account_status', {\n account_id: accountId,\n status: 'suspended',\n });\n steps.push(transitionStep('Force account → suspended', suspendResult, true, suspendDur));\n\n // Verify operations are gated: create_media_buy should fail\n if (suspendResult.success && profile?.tools.includes('create_media_buy') && profile?.tools.includes('get_products')) {\n const { result: createResult, step: createStep } = await runStep<TaskResult>(\n 'Verify create_media_buy blocked when suspended',\n 'create_media_buy',\n async () =>\n callTask(client, 'create_media_buy', {\n brief: 'comply test — should be blocked by suspension',\n budget: { amount: 100, currency: 'USD' },\n })\n );\n // We expect this to fail\n if (createResult?.success) {\n createStep.passed = false;\n createStep.error = 'create_media_buy succeeded but account is suspended — operation gate not enforced';\n } else {\n createStep.passed = true;\n createStep.details = 'create_media_buy correctly blocked when account is suspended';\n }\n steps.push(createStep);\n }\n\n // Reactivate\n const { response: reactivateResult, durationMs: reactivateDur } = await ctrl.forceStatus('force_account_status', {\n account_id: accountId,\n status: 'active',\n });\n steps.push(transitionStep('Force account → active (reactivate)', reactivateResult, true, reactivateDur));\n\n // Force to payment_required\n const { response: paymentResult, durationMs: paymentDur } = await ctrl.forceStatus('force_account_status', {\n account_id: accountId,\n status: 'payment_required',\n });\n steps.push(transitionStep('Force account → payment_required', paymentResult, true, paymentDur));\n\n // Restore to active\n const { response: restoreResult, durationMs: restoreDur } = await ctrl.forceStatus('force_account_status', {\n account_id: accountId,\n status: 'active',\n });\n steps.push(transitionStep('Force account → active (restore)', restoreResult, true, restoreDur));\n\n return { steps, profile };\n}\n\n// ---------------------------------------------------------------------------\n// SI Session State Machine\n// ---------------------------------------------------------------------------\n\nexport async function testSessionStateMachine(\n agentUrl: string,\n options: TestOptions\n): Promise<{ steps: TestStepResult[]; profile?: AgentProfile }> {\n const steps: TestStepResult[] = [];\n const client = getOrCreateClient(agentUrl, options);\n const controller = getController(options);\n const profile = options._profile;\n\n if (!controller?.detected || !supportsScenario(controller, 'force_session_status')) {\n steps.push({\n step: 'Controller check',\n task: 'comply_test_controller',\n passed: true,\n duration_ms: 0,\n details: 'force_session_status not supported — skipping',\n });\n return { steps };\n }\n\n if (!profile?.tools.includes('si_initiate_session')) {\n steps.push({\n step: 'SI tools check',\n passed: true,\n duration_ms: 0,\n details: 'si_initiate_session not available — skipping',\n });\n return { steps };\n }\n\n const ctrl = createTimedHelpers(client, options);\n\n // Initiate a session\n const { result: initResult, step: initStep } = await runStep<TaskResult>(\n 'Initiate SI session for state machine test',\n 'si_initiate_session',\n async () =>\n callTask(client, 'si_initiate_session', {\n identity: { user_type: 'consumer' },\n supported_capabilities: { response_formats: ['text'] },\n })\n );\n steps.push(initStep);\n\n const sessionId = (initResult?.data as Record<string, unknown> | undefined)?.session_id as string | undefined;\n if (!sessionId) {\n steps.push({\n step: 'Extract session ID',\n passed: false,\n duration_ms: 0,\n error: 'No session_id in initiate response',\n });\n return { steps, profile };\n }\n\n // Force session timeout\n const { response: timeoutResult, durationMs: timeoutDur } = await ctrl.forceStatus('force_session_status', {\n session_id: sessionId,\n status: 'terminated',\n termination_reason: 'session_timeout',\n });\n steps.push(transitionStep('Force session → terminated (timeout)', timeoutResult, true, timeoutDur));\n\n // Verify: si_send_message should fail with SESSION_NOT_FOUND or similar\n if (timeoutResult.success && profile.tools.includes('si_send_message')) {\n const { result: msgResult, step: msgStep } = await runStep<TaskResult>(\n 'Verify si_send_message fails after forced termination',\n 'si_send_message',\n async () =>\n callTask(client, 'si_send_message', {\n session_id: sessionId,\n message: 'comply test — session should be terminated',\n })\n );\n\n if (msgResult?.success) {\n const data = msgResult.data as Record<string, unknown> | undefined;\n const errors = data?.errors as unknown[] | undefined;\n if ((errors && errors.length > 0) || data?.session_status === 'terminated') {\n msgStep.passed = true;\n msgStep.details = 'Agent correctly returned error/terminated status for expired session';\n } else {\n msgStep.passed = false;\n msgStep.error = 'si_send_message succeeded on terminated session — session state not enforced';\n }\n } else {\n msgStep.passed = true;\n msgStep.details = 'si_send_message correctly failed on terminated session';\n }\n steps.push(msgStep);\n }\n\n return { steps, profile };\n}\n\n// ---------------------------------------------------------------------------\n// Delivery Simulation\n// ---------------------------------------------------------------------------\n\nexport async function testDeliverySimulation(\n agentUrl: string,\n options: TestOptions\n): Promise<{ steps: TestStepResult[]; profile?: AgentProfile }> {\n const steps: TestStepResult[] = [];\n const client = getOrCreateClient(agentUrl, options);\n const controller = getController(options);\n const profile = options._profile;\n\n if (!controller?.detected || !supportsScenario(controller, 'simulate_delivery')) {\n steps.push({\n step: 'Controller check',\n task: 'comply_test_controller',\n passed: true,\n duration_ms: 0,\n details: 'simulate_delivery not supported — skipping',\n });\n return { steps };\n }\n\n const ctrl = createTimedHelpers(client, options);\n\n // Create a media buy to simulate delivery on\n const { steps: createSteps, mediaBuyId } = await testCreateMediaBuy(agentUrl, options);\n steps.push(...createSteps);\n\n if (!mediaBuyId) {\n steps.push({\n step: 'Find media buy for delivery simulation',\n passed: false,\n duration_ms: 0,\n error: 'No media_buy_id — cannot test delivery simulation',\n });\n return { steps, profile };\n }\n\n // Simulate delivery\n const { response: simResult, durationMs: simDur } = await ctrl.simulate('simulate_delivery', {\n media_buy_id: mediaBuyId,\n impressions: 10000,\n clicks: 150,\n reported_spend: { amount: 150.0, currency: 'USD' },\n });\n\n if (simResult.success) {\n steps.push({\n step: 'Simulate delivery data',\n task: 'comply_test_controller',\n passed: true,\n duration_ms: simDur,\n details: simResult.message || 'Delivery simulated',\n response_preview: JSON.stringify(simResult.simulated, null, 2),\n });\n } else {\n steps.push({\n step: 'Simulate delivery data',\n task: 'comply_test_controller',\n passed: false,\n duration_ms: simDur,\n error: `${simResult.error}: ${simResult.error_detail || ''}`,\n });\n return { steps, profile };\n }\n\n // Verify via get_media_buy_delivery\n if (profile?.tools.includes('get_media_buy_delivery')) {\n const { result: deliveryResult, step: deliveryStep } = await runStep<TaskResult>(\n 'Verify delivery data via get_media_buy_delivery',\n 'get_media_buy_delivery',\n async () =>\n callTask(client, 'get_media_buy_delivery', { media_buy_id: mediaBuyId, account: resolveAccount(options) })\n );\n\n if (deliveryResult?.success && deliveryResult?.data) {\n const data = deliveryResult.data as Record<string, unknown>;\n // Handle multiple response shapes:\n // - { media_buy_deliveries: [{ totals: { impressions } }] } (training agent)\n // - { summary: { impressions } } or { impressions } (other agents)\n const deliveries = data.media_buy_deliveries as Record<string, unknown>[] | undefined;\n const totals = deliveries?.[0]?.totals as Record<string, unknown> | undefined;\n const summary = data.summary as Record<string, unknown> | undefined;\n const impressions = (totals?.impressions ??\n data.impressions ??\n data.total_impressions ??\n summary?.impressions) as number | undefined;\n if (impressions !== undefined && impressions >= 10000) {\n deliveryStep.details = `Delivery reflects simulated data: ${impressions} impressions`;\n } else {\n deliveryStep.passed = false;\n deliveryStep.error = `Expected ≥10000 impressions in delivery report, got ${impressions}`;\n }\n deliveryStep.response_preview = JSON.stringify({ impressions, raw_keys: Object.keys(data) }, null, 2);\n }\n steps.push(deliveryStep);\n }\n\n return { steps, profile };\n}\n\n// ---------------------------------------------------------------------------\n// Budget Simulation\n// ---------------------------------------------------------------------------\n\nexport async function testBudgetSimulation(\n agentUrl: string,\n options: TestOptions\n): Promise<{ steps: TestStepResult[]; profile?: AgentProfile }> {\n const steps: TestStepResult[] = [];\n const client = getOrCreateClient(agentUrl, options);\n const controller = getController(options);\n const profile = options._profile;\n\n if (!controller?.detected || !supportsScenario(controller, 'simulate_budget_spend')) {\n steps.push({\n step: 'Controller check',\n task: 'comply_test_controller',\n passed: true,\n duration_ms: 0,\n details: 'simulate_budget_spend not supported — skipping',\n });\n return { steps };\n }\n\n const ctrl = createTimedHelpers(client, options);\n\n // Create a media buy with a known budget\n const { steps: createSteps, mediaBuyId } = await testCreateMediaBuy(agentUrl, options);\n steps.push(...createSteps);\n\n if (!mediaBuyId) {\n steps.push({\n step: 'Find media buy for budget simulation',\n passed: false,\n duration_ms: 0,\n error: 'No media_buy_id — cannot test budget simulation',\n });\n return { steps, profile };\n }\n\n // Simulate 95% spend\n const { response: simResult, durationMs: simDur } = await ctrl.simulate('simulate_budget_spend', {\n media_buy_id: mediaBuyId,\n spend_percentage: 95,\n });\n\n if (simResult.success) {\n steps.push({\n step: 'Simulate budget spend to 95%',\n task: 'comply_test_controller',\n passed: true,\n duration_ms: simDur,\n details: simResult.message || 'Budget spend simulated to 95%',\n response_preview: JSON.stringify(simResult.simulated, null, 2),\n });\n } else {\n steps.push({\n step: 'Simulate budget spend to 95%',\n task: 'comply_test_controller',\n passed: false,\n duration_ms: simDur,\n error: `${simResult.error}: ${simResult.error_detail || ''}`,\n });\n return { steps, profile };\n }\n\n // Simulate 100% spend\n const { response: depletedResult, durationMs: depletedDur } = await ctrl.simulate('simulate_budget_spend', {\n media_buy_id: mediaBuyId,\n spend_percentage: 100,\n });\n\n if (depletedResult.success) {\n steps.push({\n step: 'Simulate budget fully depleted (100%)',\n task: 'comply_test_controller',\n passed: true,\n duration_ms: depletedDur,\n details: depletedResult.message || 'Budget fully depleted',\n response_preview: JSON.stringify(depletedResult.simulated, null, 2),\n });\n } else {\n steps.push({\n step: 'Simulate budget fully depleted (100%)',\n task: 'comply_test_controller',\n passed: false,\n duration_ms: depletedDur,\n error: `${depletedResult.error}: ${depletedResult.error_detail || ''}`,\n });\n }\n\n return { steps, profile };\n}\n\n// ---------------------------------------------------------------------------\n// Controller Self-Validation\n// ---------------------------------------------------------------------------\n\nexport async function testControllerValidation(\n agentUrl: string,\n options: TestOptions\n): Promise<{ steps: TestStepResult[]; profile?: AgentProfile }> {\n const steps: TestStepResult[] = [];\n const client = getOrCreateClient(agentUrl, options);\n const controller = getController(options);\n\n if (!controller?.detected) {\n steps.push({\n step: 'Controller check',\n task: 'comply_test_controller',\n passed: true,\n duration_ms: 0,\n details: 'No test controller — skipping validation',\n });\n return { steps };\n }\n\n // Test 1: Unknown scenario → expect UNKNOWN_SCENARIO\n const { result: unknownResult, step: unknownStep } = await runStep<TaskResult>(\n 'Unknown scenario returns UNKNOWN_SCENARIO',\n 'comply_test_controller',\n async () =>\n callControllerRaw(\n client,\n {\n scenario: 'nonexistent_scenario',\n params: {},\n },\n options\n )\n );\n\n const unknownData = unknownResult?.data as ControllerError | undefined;\n if (unknownData && !unknownData.success && unknownData.error === 'UNKNOWN_SCENARIO') {\n unknownStep.details = 'Correctly returned UNKNOWN_SCENARIO for nonexistent_scenario';\n } else {\n unknownStep.passed = false;\n unknownStep.error = `Expected UNKNOWN_SCENARIO error, got: ${JSON.stringify(unknownData)}`;\n }\n steps.push(unknownStep);\n\n // Test 2: Missing required params → expect INVALID_PARAMS\n if (supportsScenario(controller, 'force_creative_status')) {\n const start = Date.now();\n const missingResult = await forceStatus(client, 'force_creative_status', {}, options);\n const dur = Date.now() - start;\n if (!missingResult.success && missingResult.error === 'INVALID_PARAMS') {\n steps.push({\n step: 'Missing params returns INVALID_PARAMS',\n task: 'comply_test_controller',\n passed: true,\n duration_ms: dur,\n details: 'Correctly returned INVALID_PARAMS for missing creative_id/status',\n });\n } else {\n steps.push({\n step: 'Missing params returns INVALID_PARAMS',\n task: 'comply_test_controller',\n passed: false,\n duration_ms: dur,\n error: `Expected INVALID_PARAMS, got: ${!missingResult.success ? missingResult.error : 'success'}`,\n });\n }\n }\n\n // Test 3: NOT_FOUND for nonexistent entity\n if (supportsScenario(controller, 'force_creative_status')) {\n const start = Date.now();\n const notFoundResult = await forceStatus(\n client,\n 'force_creative_status',\n {\n creative_id: 'comply-test-nonexistent-000000000000',\n status: 'approved',\n },\n options\n );\n const dur = Date.now() - start;\n if (!notFoundResult.success && notFoundResult.error === 'NOT_FOUND') {\n steps.push({\n step: 'Nonexistent entity returns NOT_FOUND',\n task: 'comply_test_controller',\n passed: true,\n duration_ms: dur,\n details: 'Correctly returned NOT_FOUND for nonexistent creative',\n });\n } else {\n steps.push({\n step: 'Nonexistent entity returns NOT_FOUND',\n task: 'comply_test_controller',\n passed: false,\n duration_ms: dur,\n error: `Expected NOT_FOUND, got: ${!notFoundResult.success ? notFoundResult.error : 'success'}`,\n });\n }\n }\n\n return { steps };\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../../../src/lib/testing/scenarios/deterministic.ts"],"sourcesContent":["/**\n * Deterministic Compliance Scenarios\n *\n * These scenarios use the comply_test_controller to force seller-side\n * state transitions, enabling full state machine verification.\n * Only run when the controller is detected.\n */\n\nimport { getOrCreateClient, runStep, resolveAccount } from '../client';\nimport { forceStatus, simulate, supportsScenario, callControllerRaw } from '../test-controller';\nimport type { ControllerDetection } from '../test-controller';\nimport type { TestOptions, TestStepResult, AgentProfile, TaskResult } from '../types';\nimport type { StateTransitionSuccess, ControllerError } from '../../types/tools.generated';\nimport { testCreateMediaBuy, testCreativeSync } from './media-buy';\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction getController(options: TestOptions): ControllerDetection | undefined {\n return options._controllerCapabilities;\n}\n\n/** Extract an entity ID from step results (created_id, response_preview field, or plural array) */\nfunction extractIdFromSteps(stepsToSearch: TestStepResult[], field: string): string | undefined {\n const pluralField = field.endsWith('_id') ? field + 's' : undefined; // creative_id → creative_ids\n for (const step of stepsToSearch) {\n if (step.created_id) return step.created_id;\n if (step.response_preview) {\n try {\n const preview = JSON.parse(step.response_preview);\n if (preview[field]) return preview[field];\n if (pluralField && Array.isArray(preview[pluralField]) && preview[pluralField][0]) {\n return preview[pluralField][0];\n }\n } catch {\n /* skip */\n }\n }\n }\n return undefined;\n}\n\n/** Build a TestStepResult from a controller transition response */\nfunction transitionStep(\n label: string,\n response: StateTransitionSuccess | ControllerError,\n expectedSuccess: boolean,\n durationMs: number\n): TestStepResult {\n const passed = response.success === expectedSuccess;\n if (response.success) {\n return {\n step: label,\n task: 'comply_test_controller',\n passed,\n duration_ms: durationMs,\n details: `${response.previous_state} → ${response.current_state}`,\n response_preview: JSON.stringify(\n { previous_state: response.previous_state, current_state: response.current_state },\n null,\n 2\n ),\n ...(!passed && {\n error: `Expected failure but got success: ${response.previous_state} → ${response.current_state}`,\n }),\n };\n } else {\n return {\n step: label,\n task: 'comply_test_controller',\n passed,\n duration_ms: durationMs,\n details: `Error: ${response.error} — ${response.error_detail || ''}`,\n response_preview: JSON.stringify({ error: response.error, current_state: response.current_state }, null, 2),\n ...(!passed && { error: `Expected success but got ${response.error}: ${response.error_detail || ''}` }),\n };\n }\n}\n\n/**\n * Create timed wrappers bound to specific options.\n * This ensures controller calls use the same account as test scenarios.\n */\nfunction createTimedHelpers(client: ReturnType<typeof getOrCreateClient>, options: TestOptions) {\n return {\n async forceStatus(\n scenario: Parameters<typeof forceStatus>[1],\n params: Parameters<typeof forceStatus>[2]\n ): Promise<{ response: Awaited<ReturnType<typeof forceStatus>>; durationMs: number }> {\n const start = Date.now();\n const response = await forceStatus(client, scenario, params, options);\n return { response, durationMs: Date.now() - start };\n },\n async simulate(\n scenario: Parameters<typeof simulate>[1],\n params: Parameters<typeof simulate>[2]\n ): Promise<{ response: Awaited<ReturnType<typeof simulate>>; durationMs: number }> {\n const start = Date.now();\n const response = await simulate(client, scenario, params, options);\n return { response, durationMs: Date.now() - start };\n },\n };\n}\n\n/**\n * Call a typed method on the client via executeTask.\n * Uses the same pattern as existing scenarios but through the typed executeTask overload.\n */\nfunction callTask(\n client: ReturnType<typeof getOrCreateClient>,\n taskName: string,\n params: Record<string, unknown>\n): Promise<TaskResult> {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- AgentClient.executeTask exists but TestClient type doesn't expose it directly\n return (client as any).executeTask(taskName, params) as Promise<TaskResult>;\n}\n\n// ---------------------------------------------------------------------------\n// Creative State Machine\n// ---------------------------------------------------------------------------\n\nexport async function testCreativeStateMachine(\n agentUrl: string,\n options: TestOptions\n): Promise<{ steps: TestStepResult[]; profile?: AgentProfile }> {\n const steps: TestStepResult[] = [];\n const client = getOrCreateClient(agentUrl, options);\n const controller = getController(options);\n\n if (!controller?.detected || !supportsScenario(controller, 'force_creative_status')) {\n steps.push({\n step: 'Controller check',\n task: 'comply_test_controller',\n passed: true,\n duration_ms: 0,\n details: 'force_creative_status not supported — skipping',\n });\n return { steps };\n }\n\n const ctrl = createTimedHelpers(client, options);\n\n // Step 1: Sync a creative to get an entity to work with\n const { steps: syncSteps, profile } = await testCreativeSync(agentUrl, options);\n steps.push(...syncSteps);\n\n const creativeId = extractIdFromSteps(syncSteps, 'creative_id');\n\n if (!creativeId) {\n steps.push({\n step: 'Find creative for state machine test',\n passed: false,\n duration_ms: 0,\n error: 'No creative_id found from sync_creatives — cannot test state machine',\n });\n return { steps, profile };\n }\n\n // Step 2: Force to approved\n const { response: approveResult, durationMs: approveDur } = await ctrl.forceStatus('force_creative_status', {\n creative_id: creativeId,\n status: 'approved',\n });\n steps.push(transitionStep('Force creative → approved', approveResult, true, approveDur));\n\n // Step 3: Verify via list_creatives\n if (approveResult.success && profile?.tools.includes('list_creatives')) {\n const { result: listResult, step: listStep } = await runStep<TaskResult>(\n 'Verify creative status via list_creatives',\n 'list_creatives',\n async () => callTask(client, 'list_creatives', {})\n );\n if (listResult?.success && listResult?.data) {\n const creatives = ((listResult.data as Record<string, unknown>).creatives as any[]) || [];\n const found = creatives.find((c: Record<string, unknown>) => c.creative_id === creativeId);\n if (found) {\n listStep.details = `Creative ${creativeId} status: ${found.status}`;\n if (found.status !== 'approved') {\n listStep.passed = false;\n listStep.error = `Expected status 'approved', got '${found.status}'`;\n }\n }\n }\n steps.push(listStep);\n }\n\n // Step 4: Force to archived\n const { response: archiveResult, durationMs: archiveDur } = await ctrl.forceStatus('force_creative_status', {\n creative_id: creativeId,\n status: 'archived',\n });\n steps.push(transitionStep('Force creative → archived', archiveResult, true, archiveDur));\n\n // Step 5: Invalid transition — archived is terminal, can't go back to processing\n const { response: invalidResult, durationMs: invalidDur } = await ctrl.forceStatus('force_creative_status', {\n creative_id: creativeId,\n status: 'processing',\n });\n steps.push(\n transitionStep('Invalid: archived → processing (expect INVALID_TRANSITION)', invalidResult, false, invalidDur)\n );\n\n if (!invalidResult.success && invalidResult.error !== 'INVALID_TRANSITION') {\n steps.push({\n step: 'Validate error code for invalid transition',\n task: 'comply_test_controller',\n passed: false,\n duration_ms: 0,\n error: `Expected error code INVALID_TRANSITION, got ${invalidResult.error}`,\n });\n }\n\n // Step 6: Force to rejected with reason on a fresh creative.\n // Sellers may auto-approve on sync, so force to pending_review first (the only state\n // that allows rejection in most state machines), then reject.\n const { steps: resyncSteps } = await testCreativeSync(agentUrl, options);\n const freshCreativeId = extractIdFromSteps(resyncSteps, 'creative_id');\n\n if (freshCreativeId) {\n // Try to reach a state that allows rejection\n const { response: toPendingReview } = await ctrl.forceStatus('force_creative_status', {\n creative_id: freshCreativeId,\n status: 'pending_review',\n });\n // Whether or not pending_review was reachable, try rejecting from wherever we are.\n // Some sellers allow rejection from processing directly; others require pending_review first.\n const { response: rejectResult, durationMs: rejectDur } = await ctrl.forceStatus('force_creative_status', {\n creative_id: freshCreativeId,\n status: 'rejected',\n rejection_reason: 'Brand safety policy violation (comply test)',\n });\n steps.push(transitionStep('Force creative → rejected with reason', rejectResult, true, rejectDur));\n }\n\n return { steps, profile };\n}\n\n// ---------------------------------------------------------------------------\n// Media Buy State Machine\n// ---------------------------------------------------------------------------\n\nexport async function testMediaBuyStateMachine(\n agentUrl: string,\n options: TestOptions\n): Promise<{ steps: TestStepResult[]; profile?: AgentProfile }> {\n const steps: TestStepResult[] = [];\n const client = getOrCreateClient(agentUrl, options);\n const controller = getController(options);\n\n if (!controller?.detected || !supportsScenario(controller, 'force_media_buy_status')) {\n steps.push({\n step: 'Controller check',\n task: 'comply_test_controller',\n passed: true,\n duration_ms: 0,\n details: 'force_media_buy_status not supported — skipping',\n });\n return { steps };\n }\n\n const ctrl = createTimedHelpers(client, options);\n\n // Create a media buy\n const { steps: createSteps, profile, mediaBuyId } = await testCreateMediaBuy(agentUrl, options);\n steps.push(...createSteps);\n\n if (!mediaBuyId) {\n steps.push({\n step: 'Find media buy for state machine test',\n passed: false,\n duration_ms: 0,\n error: 'No media_buy_id from create_media_buy — cannot test state machine',\n });\n return { steps, profile };\n }\n\n // Force to active\n const { response: activateResult, durationMs: activateDur } = await ctrl.forceStatus('force_media_buy_status', {\n media_buy_id: mediaBuyId,\n status: 'active',\n });\n steps.push(transitionStep('Force media buy → active', activateResult, true, activateDur));\n\n // Verify via get_media_buys\n if (activateResult.success && profile?.tools.includes('get_media_buys')) {\n const { result: getResult, step: getStep } = await runStep<TaskResult>(\n 'Verify media buy status via get_media_buys',\n 'get_media_buys',\n async () => callTask(client, 'get_media_buys', { media_buy_id: mediaBuyId })\n );\n if (getResult?.success && getResult?.data) {\n const data = getResult.data as Record<string, unknown>;\n const buys = (data.media_buys as Record<string, unknown>[]) || [data];\n const found = buys.find((b: Record<string, unknown>) => b.media_buy_id === mediaBuyId);\n if (found) {\n getStep.details = `Media buy ${mediaBuyId} status: ${found.status}`;\n if (found.status !== 'active') {\n getStep.passed = false;\n getStep.error = `Expected status 'active', got '${found.status}'`;\n }\n }\n }\n steps.push(getStep);\n }\n\n // Force to completed (terminal)\n const { response: completeResult, durationMs: completeDur } = await ctrl.forceStatus('force_media_buy_status', {\n media_buy_id: mediaBuyId,\n status: 'completed',\n });\n steps.push(transitionStep('Force media buy → completed', completeResult, true, completeDur));\n\n // Invalid: completed → active (terminal)\n const { response: invalidResult, durationMs: invalidDur } = await ctrl.forceStatus('force_media_buy_status', {\n media_buy_id: mediaBuyId,\n status: 'active',\n });\n steps.push(\n transitionStep('Invalid: completed → active (expect INVALID_TRANSITION)', invalidResult, false, invalidDur)\n );\n\n // Test rejection: force to pending_start first (some sellers create as active),\n // then reject from there. If the seller doesn't support pending_start, skip.\n const { steps: create2Steps, mediaBuyId: mediaBuyId2 } = await testCreateMediaBuy(agentUrl, options);\n steps.push(...create2Steps);\n\n if (mediaBuyId2) {\n // Try to force to pending_start first\n const { response: pendingResult } = await ctrl.forceStatus('force_media_buy_status', {\n media_buy_id: mediaBuyId2,\n status: 'pending_start',\n });\n\n if (pendingResult.success) {\n // Now reject from pending_start\n const { response: rejectResult, durationMs: rejectDur } = await ctrl.forceStatus('force_media_buy_status', {\n media_buy_id: mediaBuyId2,\n status: 'rejected',\n rejection_reason: 'Policy violation (comply test)',\n });\n steps.push(transitionStep('Force media buy → rejected from pending_start', rejectResult, true, rejectDur));\n } else {\n // Can't reach pending_start — test cancellation instead (valid from active)\n const { response: cancelResult, durationMs: cancelDur } = await ctrl.forceStatus('force_media_buy_status', {\n media_buy_id: mediaBuyId2,\n status: 'canceled',\n });\n steps.push(transitionStep('Force media buy → canceled from active', cancelResult, true, cancelDur));\n }\n }\n\n return { steps, profile };\n}\n\n// ---------------------------------------------------------------------------\n// Account State Machine\n// ---------------------------------------------------------------------------\n\nexport async function testAccountStateMachine(\n agentUrl: string,\n options: TestOptions\n): Promise<{ steps: TestStepResult[]; profile?: AgentProfile }> {\n const steps: TestStepResult[] = [];\n const client = getOrCreateClient(agentUrl, options);\n const controller = getController(options);\n\n if (!controller?.detected || !supportsScenario(controller, 'force_account_status')) {\n steps.push({\n step: 'Controller check',\n task: 'comply_test_controller',\n passed: true,\n duration_ms: 0,\n details: 'force_account_status not supported — skipping',\n });\n return { steps };\n }\n\n const ctrl = createTimedHelpers(client, options);\n\n // Discover an account to work with\n const profile = options._profile;\n let accountId: string | undefined;\n\n if (profile?.tools.includes('list_accounts')) {\n const { result: listResult, step: listStep } = await runStep<TaskResult>(\n 'List accounts for state machine test',\n 'list_accounts',\n async () => callTask(client, 'list_accounts', {})\n );\n if (listResult?.success && listResult?.data) {\n const accounts = ((listResult.data as Record<string, unknown>).accounts as Record<string, unknown>[]) || [];\n const active = accounts.find((a: Record<string, unknown>) => a.status === 'active');\n accountId = (active?.account_id || accounts[0]?.account_id) as string | undefined;\n listStep.details = `Found ${accounts.length} account(s), using ${accountId || 'none'}`;\n }\n steps.push(listStep);\n }\n\n if (!accountId) {\n steps.push({\n step: 'Find account for state machine test',\n passed: true,\n duration_ms: 0,\n details: 'No account found — skipping account state machine test',\n });\n return { steps, profile };\n }\n\n // Force to suspended\n const { response: suspendResult, durationMs: suspendDur } = await ctrl.forceStatus('force_account_status', {\n account_id: accountId,\n status: 'suspended',\n });\n steps.push(transitionStep('Force account → suspended', suspendResult, true, suspendDur));\n\n // Verify operations are gated: create_media_buy should fail\n if (suspendResult.success && profile?.tools.includes('create_media_buy') && profile?.tools.includes('get_products')) {\n const { result: createResult, step: createStep } = await runStep<TaskResult>(\n 'Verify create_media_buy blocked when suspended',\n 'create_media_buy',\n async () =>\n callTask(client, 'create_media_buy', {\n brief: 'comply test — should be blocked by suspension',\n budget: { amount: 100, currency: 'USD' },\n })\n );\n // We expect this to fail\n if (createResult?.success) {\n createStep.passed = false;\n createStep.error = 'create_media_buy succeeded but account is suspended — operation gate not enforced';\n } else {\n createStep.passed = true;\n createStep.details = 'create_media_buy correctly blocked when account is suspended';\n }\n steps.push(createStep);\n }\n\n // Reactivate\n const { response: reactivateResult, durationMs: reactivateDur } = await ctrl.forceStatus('force_account_status', {\n account_id: accountId,\n status: 'active',\n });\n steps.push(transitionStep('Force account → active (reactivate)', reactivateResult, true, reactivateDur));\n\n // Force to payment_required\n const { response: paymentResult, durationMs: paymentDur } = await ctrl.forceStatus('force_account_status', {\n account_id: accountId,\n status: 'payment_required',\n });\n steps.push(transitionStep('Force account → payment_required', paymentResult, true, paymentDur));\n\n // Restore to active\n const { response: restoreResult, durationMs: restoreDur } = await ctrl.forceStatus('force_account_status', {\n account_id: accountId,\n status: 'active',\n });\n steps.push(transitionStep('Force account → active (restore)', restoreResult, true, restoreDur));\n\n return { steps, profile };\n}\n\n// ---------------------------------------------------------------------------\n// SI Session State Machine\n// ---------------------------------------------------------------------------\n\nexport async function testSessionStateMachine(\n agentUrl: string,\n options: TestOptions\n): Promise<{ steps: TestStepResult[]; profile?: AgentProfile }> {\n const steps: TestStepResult[] = [];\n const client = getOrCreateClient(agentUrl, options);\n const controller = getController(options);\n const profile = options._profile;\n\n if (!controller?.detected || !supportsScenario(controller, 'force_session_status')) {\n steps.push({\n step: 'Controller check',\n task: 'comply_test_controller',\n passed: true,\n duration_ms: 0,\n details: 'force_session_status not supported — skipping',\n });\n return { steps };\n }\n\n if (!profile?.tools.includes('si_initiate_session')) {\n steps.push({\n step: 'SI tools check',\n passed: true,\n duration_ms: 0,\n details: 'si_initiate_session not available — skipping',\n });\n return { steps };\n }\n\n const ctrl = createTimedHelpers(client, options);\n\n // Initiate a session\n const { result: initResult, step: initStep } = await runStep<TaskResult>(\n 'Initiate SI session for state machine test',\n 'si_initiate_session',\n async () =>\n callTask(client, 'si_initiate_session', {\n identity: { user_type: 'consumer' },\n supported_capabilities: { response_formats: ['text'] },\n })\n );\n steps.push(initStep);\n\n const sessionId = (initResult?.data as Record<string, unknown> | undefined)?.session_id as string | undefined;\n if (!sessionId) {\n steps.push({\n step: 'Extract session ID',\n passed: false,\n duration_ms: 0,\n error: 'No session_id in initiate response',\n });\n return { steps, profile };\n }\n\n // Force session timeout\n const { response: timeoutResult, durationMs: timeoutDur } = await ctrl.forceStatus('force_session_status', {\n session_id: sessionId,\n status: 'terminated',\n termination_reason: 'session_timeout',\n });\n steps.push(transitionStep('Force session → terminated (timeout)', timeoutResult, true, timeoutDur));\n\n // Verify: si_send_message should fail with SESSION_NOT_FOUND or similar\n if (timeoutResult.success && profile.tools.includes('si_send_message')) {\n const { result: msgResult, step: msgStep } = await runStep<TaskResult>(\n 'Verify si_send_message fails after forced termination',\n 'si_send_message',\n async () =>\n callTask(client, 'si_send_message', {\n session_id: sessionId,\n message: 'comply test — session should be terminated',\n })\n );\n\n if (msgResult?.success) {\n const data = msgResult.data as Record<string, unknown> | undefined;\n const errors = data?.errors as unknown[] | undefined;\n if ((errors && errors.length > 0) || data?.session_status === 'terminated') {\n msgStep.passed = true;\n msgStep.details = 'Agent correctly returned error/terminated status for expired session';\n } else {\n msgStep.passed = false;\n msgStep.error = 'si_send_message succeeded on terminated session — session state not enforced';\n }\n } else {\n msgStep.passed = true;\n msgStep.details = 'si_send_message correctly failed on terminated session';\n }\n steps.push(msgStep);\n }\n\n return { steps, profile };\n}\n\n// ---------------------------------------------------------------------------\n// Delivery Simulation\n// ---------------------------------------------------------------------------\n\nexport async function testDeliverySimulation(\n agentUrl: string,\n options: TestOptions\n): Promise<{ steps: TestStepResult[]; profile?: AgentProfile }> {\n const steps: TestStepResult[] = [];\n const client = getOrCreateClient(agentUrl, options);\n const controller = getController(options);\n const profile = options._profile;\n\n if (!controller?.detected || !supportsScenario(controller, 'simulate_delivery')) {\n steps.push({\n step: 'Controller check',\n task: 'comply_test_controller',\n passed: true,\n duration_ms: 0,\n details: 'simulate_delivery not supported — skipping',\n });\n return { steps };\n }\n\n const ctrl = createTimedHelpers(client, options);\n\n // Create a media buy to simulate delivery on\n const { steps: createSteps, mediaBuyId } = await testCreateMediaBuy(agentUrl, options);\n steps.push(...createSteps);\n\n if (!mediaBuyId) {\n steps.push({\n step: 'Find media buy for delivery simulation',\n passed: false,\n duration_ms: 0,\n error: 'No media_buy_id — cannot test delivery simulation',\n });\n return { steps, profile };\n }\n\n // Simulate delivery\n const { response: simResult, durationMs: simDur } = await ctrl.simulate('simulate_delivery', {\n media_buy_id: mediaBuyId,\n impressions: 10000,\n clicks: 150,\n reported_spend: { amount: 150.0, currency: 'USD' },\n });\n\n if (simResult.success) {\n steps.push({\n step: 'Simulate delivery data',\n task: 'comply_test_controller',\n passed: true,\n duration_ms: simDur,\n details: simResult.message || 'Delivery simulated',\n response_preview: JSON.stringify(simResult.simulated, null, 2),\n });\n } else {\n steps.push({\n step: 'Simulate delivery data',\n task: 'comply_test_controller',\n passed: false,\n duration_ms: simDur,\n error: `${simResult.error}: ${simResult.error_detail || ''}`,\n });\n return { steps, profile };\n }\n\n // Verify via get_media_buy_delivery\n if (profile?.tools.includes('get_media_buy_delivery')) {\n const { result: deliveryResult, step: deliveryStep } = await runStep<TaskResult>(\n 'Verify delivery data via get_media_buy_delivery',\n 'get_media_buy_delivery',\n async () =>\n callTask(client, 'get_media_buy_delivery', { media_buy_id: mediaBuyId, account: resolveAccount(options) })\n );\n\n if (deliveryResult?.success && deliveryResult?.data) {\n const data = deliveryResult.data as Record<string, unknown>;\n // Handle multiple response shapes:\n // - { media_buy_deliveries: [{ totals: { impressions } }] } (training agent)\n // - { summary: { impressions } } or { impressions } (other agents)\n const deliveries = data.media_buy_deliveries as Record<string, unknown>[] | undefined;\n const totals = deliveries?.[0]?.totals as Record<string, unknown> | undefined;\n const summary = data.summary as Record<string, unknown> | undefined;\n const impressions = (totals?.impressions ??\n data.impressions ??\n data.total_impressions ??\n summary?.impressions) as number | undefined;\n if (impressions !== undefined && impressions >= 10000) {\n deliveryStep.details = `Delivery reflects simulated data: ${impressions} impressions`;\n } else {\n deliveryStep.passed = false;\n deliveryStep.error = `Expected ≥10000 impressions in delivery report, got ${impressions}`;\n }\n deliveryStep.response_preview = JSON.stringify({ impressions, raw_keys: Object.keys(data) }, null, 2);\n }\n steps.push(deliveryStep);\n }\n\n return { steps, profile };\n}\n\n// ---------------------------------------------------------------------------\n// Budget Simulation\n// ---------------------------------------------------------------------------\n\nexport async function testBudgetSimulation(\n agentUrl: string,\n options: TestOptions\n): Promise<{ steps: TestStepResult[]; profile?: AgentProfile }> {\n const steps: TestStepResult[] = [];\n const client = getOrCreateClient(agentUrl, options);\n const controller = getController(options);\n const profile = options._profile;\n\n if (!controller?.detected || !supportsScenario(controller, 'simulate_budget_spend')) {\n steps.push({\n step: 'Controller check',\n task: 'comply_test_controller',\n passed: true,\n duration_ms: 0,\n details: 'simulate_budget_spend not supported — skipping',\n });\n return { steps };\n }\n\n const ctrl = createTimedHelpers(client, options);\n\n // Create a media buy with a known budget\n const { steps: createSteps, mediaBuyId } = await testCreateMediaBuy(agentUrl, options);\n steps.push(...createSteps);\n\n if (!mediaBuyId) {\n steps.push({\n step: 'Find media buy for budget simulation',\n passed: false,\n duration_ms: 0,\n error: 'No media_buy_id — cannot test budget simulation',\n });\n return { steps, profile };\n }\n\n // Simulate 95% spend\n const { response: simResult, durationMs: simDur } = await ctrl.simulate('simulate_budget_spend', {\n media_buy_id: mediaBuyId,\n spend_percentage: 95,\n });\n\n if (simResult.success) {\n steps.push({\n step: 'Simulate budget spend to 95%',\n task: 'comply_test_controller',\n passed: true,\n duration_ms: simDur,\n details: simResult.message || 'Budget spend simulated to 95%',\n response_preview: JSON.stringify(simResult.simulated, null, 2),\n });\n } else {\n steps.push({\n step: 'Simulate budget spend to 95%',\n task: 'comply_test_controller',\n passed: false,\n duration_ms: simDur,\n error: `${simResult.error}: ${simResult.error_detail || ''}`,\n });\n return { steps, profile };\n }\n\n // Simulate 100% spend\n const { response: depletedResult, durationMs: depletedDur } = await ctrl.simulate('simulate_budget_spend', {\n media_buy_id: mediaBuyId,\n spend_percentage: 100,\n });\n\n if (depletedResult.success) {\n steps.push({\n step: 'Simulate budget fully depleted (100%)',\n task: 'comply_test_controller',\n passed: true,\n duration_ms: depletedDur,\n details: depletedResult.message || 'Budget fully depleted',\n response_preview: JSON.stringify(depletedResult.simulated, null, 2),\n });\n } else {\n steps.push({\n step: 'Simulate budget fully depleted (100%)',\n task: 'comply_test_controller',\n passed: false,\n duration_ms: depletedDur,\n error: `${depletedResult.error}: ${depletedResult.error_detail || ''}`,\n });\n }\n\n return { steps, profile };\n}\n\n// ---------------------------------------------------------------------------\n// Controller Self-Validation\n// ---------------------------------------------------------------------------\n\nexport async function testControllerValidation(\n agentUrl: string,\n options: TestOptions\n): Promise<{ steps: TestStepResult[]; profile?: AgentProfile }> {\n const steps: TestStepResult[] = [];\n const client = getOrCreateClient(agentUrl, options);\n const controller = getController(options);\n\n if (!controller?.detected) {\n steps.push({\n step: 'Controller check',\n task: 'comply_test_controller',\n passed: true,\n duration_ms: 0,\n details: 'No test controller — skipping validation',\n });\n return { steps };\n }\n\n // Test 1: Unknown scenario → expect UNKNOWN_SCENARIO\n const { result: unknownResult, step: unknownStep } = await runStep<TaskResult>(\n 'Unknown scenario returns UNKNOWN_SCENARIO',\n 'comply_test_controller',\n async () =>\n callControllerRaw(\n client,\n {\n scenario: 'nonexistent_scenario',\n params: {},\n },\n options\n )\n );\n\n const unknownData = unknownResult?.data as ControllerError | undefined;\n if (unknownData && !unknownData.success && unknownData.error === 'UNKNOWN_SCENARIO') {\n unknownStep.details = 'Correctly returned UNKNOWN_SCENARIO for nonexistent_scenario';\n } else {\n unknownStep.passed = false;\n unknownStep.error = `Expected UNKNOWN_SCENARIO error, got: ${JSON.stringify(unknownData)}`;\n }\n steps.push(unknownStep);\n\n // Test 2: Missing required params → expect INVALID_PARAMS\n if (supportsScenario(controller, 'force_creative_status')) {\n const start = Date.now();\n const missingResult = await forceStatus(client, 'force_creative_status', {}, options);\n const dur = Date.now() - start;\n if (!missingResult.success && missingResult.error === 'INVALID_PARAMS') {\n steps.push({\n step: 'Missing params returns INVALID_PARAMS',\n task: 'comply_test_controller',\n passed: true,\n duration_ms: dur,\n details: 'Correctly returned INVALID_PARAMS for missing creative_id/status',\n });\n } else {\n steps.push({\n step: 'Missing params returns INVALID_PARAMS',\n task: 'comply_test_controller',\n passed: false,\n duration_ms: dur,\n error: `Expected INVALID_PARAMS, got: ${!missingResult.success ? missingResult.error : 'success'}`,\n });\n }\n }\n\n // Test 3: NOT_FOUND for nonexistent entity\n if (supportsScenario(controller, 'force_creative_status')) {\n const start = Date.now();\n const notFoundResult = await forceStatus(\n client,\n 'force_creative_status',\n {\n creative_id: 'comply-test-nonexistent-000000000000',\n status: 'approved',\n },\n options\n );\n const dur = Date.now() - start;\n if (!notFoundResult.success && notFoundResult.error === 'NOT_FOUND') {\n steps.push({\n step: 'Nonexistent entity returns NOT_FOUND',\n task: 'comply_test_controller',\n passed: true,\n duration_ms: dur,\n details: 'Correctly returned NOT_FOUND for nonexistent creative',\n });\n } else {\n steps.push({\n step: 'Nonexistent entity returns NOT_FOUND',\n task: 'comply_test_controller',\n passed: false,\n duration_ms: dur,\n error: `Expected NOT_FOUND, got: ${!notFoundResult.success ? notFoundResult.error : 'success'}`,\n });\n }\n }\n\n return { steps };\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1,9 +1,3 @@
|
|
|
1
|
-
import { fileURLToPath as __adcpFileURLToPath } from 'node:url';
|
|
2
|
-
import { dirname as __adcpDirname } from 'node:path';
|
|
3
|
-
import { createRequire as __adcpCreateRequire } from 'node:module';
|
|
4
|
-
const __filename = __adcpFileURLToPath(import.meta.url);
|
|
5
|
-
const __dirname = __adcpDirname(__filename);
|
|
6
|
-
const require = __adcpCreateRequire(import.meta.url);
|
|
7
1
|
import { getOrCreateClient, runStep, getOrDiscoverProfile, discoverAgentCapabilities } from "../client.mjs";
|
|
8
2
|
async function testDiscovery(agentUrl, options) {
|
|
9
3
|
const steps = [];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/lib/testing/scenarios/discovery.ts"],"sourcesContent":["/**\n * Discovery Testing Scenario\n *\n * Tests product discovery, format listing, and property listing.\n */\n\nimport type { ListCreativeFormatsResponse, Format } from '../../types/tools.generated';\nimport type { TestOptions, TestStepResult, AgentProfile, TaskResult } from '../types';\nimport { getOrCreateClient, runStep, getOrDiscoverProfile, discoverAgentCapabilities } from '../client';\n\n/**\n * Test: Discovery\n * Tests product discovery, format listing, and property listing\n */\nexport async function testDiscovery(\n agentUrl: string,\n options: TestOptions\n): Promise<{ steps: TestStepResult[]; profile?: AgentProfile }> {\n const steps: TestStepResult[] = [];\n const client = getOrCreateClient(agentUrl, options);\n\n // Discover agent profile\n const { profile, step: profileStep } = await getOrDiscoverProfile(client, options);\n steps.push(profileStep);\n\n if (!profileStep.passed) {\n return { steps, profile };\n }\n\n // Discover capabilities\n const { capabilities, steps: capSteps } = await discoverAgentCapabilities(client, profile, options);\n steps.push(...capSteps);\n\n // Merge capabilities into profile\n Object.assign(profile, capabilities);\n\n // List creative formats (if available)\n if (profile.tools.includes('list_creative_formats')) {\n const { result, step } = await runStep<TaskResult>(\n 'List creative formats',\n 'list_creative_formats',\n async () => client.listCreativeFormats({}) as Promise<TaskResult>\n );\n\n if (result?.success && result?.data) {\n const data = result.data as ListCreativeFormatsResponse;\n const formats: Format[] = data.formats || [];\n const creativeAgents = data.creative_agents || [];\n const formatCount = formats.length;\n step.details = `Found ${formatCount} format(s), ${creativeAgents.length} creative agent(s)`;\n step.response_preview = JSON.stringify(\n {\n format_ids: formats.map(f => f.format_id).slice(0, 5),\n creative_agents: creativeAgents.map(a => a.agent_url),\n },\n null,\n 2\n );\n } else if (result && !result.success) {\n step.passed = false;\n step.error = result.error || 'list_creative_formats returned unsuccessful result';\n }\n steps.push(step);\n }\n\n // List authorized properties (if available)\n if (profile.tools.includes('list_authorized_properties')) {\n const { result, step } = await runStep<TaskResult>(\n 'List authorized properties',\n 'list_authorized_properties',\n async () => client.executeTask('list_authorized_properties', {}) as Promise<TaskResult>\n );\n\n const data = result?.data as unknown as Record<string, unknown> | undefined;\n const publisherDomains = data?.publisher_domains as string[] | undefined;\n if (result?.success && publisherDomains) {\n step.details = `Found ${publisherDomains.length} publisher domain(s)`;\n step.response_preview = JSON.stringify(\n {\n publisher_domains_count: publisherDomains.length,\n domains: publisherDomains.slice(0, 3),\n },\n null,\n 2\n );\n } else if (result && !result.success) {\n step.passed = false;\n step.error = result.error || 'list_authorized_properties returned unsuccessful result';\n }\n steps.push(step);\n }\n\n return { steps, profile };\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../../../../src/lib/testing/scenarios/discovery.ts"],"sourcesContent":["/**\n * Discovery Testing Scenario\n *\n * Tests product discovery, format listing, and property listing.\n */\n\nimport type { ListCreativeFormatsResponse, Format } from '../../types/tools.generated';\nimport type { TestOptions, TestStepResult, AgentProfile, TaskResult } from '../types';\nimport { getOrCreateClient, runStep, getOrDiscoverProfile, discoverAgentCapabilities } from '../client';\n\n/**\n * Test: Discovery\n * Tests product discovery, format listing, and property listing\n */\nexport async function testDiscovery(\n agentUrl: string,\n options: TestOptions\n): Promise<{ steps: TestStepResult[]; profile?: AgentProfile }> {\n const steps: TestStepResult[] = [];\n const client = getOrCreateClient(agentUrl, options);\n\n // Discover agent profile\n const { profile, step: profileStep } = await getOrDiscoverProfile(client, options);\n steps.push(profileStep);\n\n if (!profileStep.passed) {\n return { steps, profile };\n }\n\n // Discover capabilities\n const { capabilities, steps: capSteps } = await discoverAgentCapabilities(client, profile, options);\n steps.push(...capSteps);\n\n // Merge capabilities into profile\n Object.assign(profile, capabilities);\n\n // List creative formats (if available)\n if (profile.tools.includes('list_creative_formats')) {\n const { result, step } = await runStep<TaskResult>(\n 'List creative formats',\n 'list_creative_formats',\n async () => client.listCreativeFormats({}) as Promise<TaskResult>\n );\n\n if (result?.success && result?.data) {\n const data = result.data as ListCreativeFormatsResponse;\n const formats: Format[] = data.formats || [];\n const creativeAgents = data.creative_agents || [];\n const formatCount = formats.length;\n step.details = `Found ${formatCount} format(s), ${creativeAgents.length} creative agent(s)`;\n step.response_preview = JSON.stringify(\n {\n format_ids: formats.map(f => f.format_id).slice(0, 5),\n creative_agents: creativeAgents.map(a => a.agent_url),\n },\n null,\n 2\n );\n } else if (result && !result.success) {\n step.passed = false;\n step.error = result.error || 'list_creative_formats returned unsuccessful result';\n }\n steps.push(step);\n }\n\n // List authorized properties (if available)\n if (profile.tools.includes('list_authorized_properties')) {\n const { result, step } = await runStep<TaskResult>(\n 'List authorized properties',\n 'list_authorized_properties',\n async () => client.executeTask('list_authorized_properties', {}) as Promise<TaskResult>\n );\n\n const data = result?.data as unknown as Record<string, unknown> | undefined;\n const publisherDomains = data?.publisher_domains as string[] | undefined;\n if (result?.success && publisherDomains) {\n step.details = `Found ${publisherDomains.length} publisher domain(s)`;\n step.response_preview = JSON.stringify(\n {\n publisher_domains_count: publisherDomains.length,\n domains: publisherDomains.slice(0, 3),\n },\n null,\n 2\n );\n } else if (result && !result.success) {\n step.passed = false;\n step.error = result.error || 'list_authorized_properties returned unsuccessful result';\n }\n steps.push(step);\n }\n\n return { steps, profile };\n}\n"],"mappings":"AAQA,SAAS,mBAAmB,SAAS,sBAAsB,iCAAiC;AAM5F,eAAsB,cACpB,UACA,SAC8D;AAC9D,QAAM,QAA0B,CAAC;AACjC,QAAM,SAAS,kBAAkB,UAAU,OAAO;AAGlD,QAAM,EAAE,SAAS,MAAM,YAAY,IAAI,MAAM,qBAAqB,QAAQ,OAAO;AACjF,QAAM,KAAK,WAAW;AAEtB,MAAI,CAAC,YAAY,QAAQ;AACvB,WAAO,EAAE,OAAO,QAAQ;AAAA,EAC1B;AAGA,QAAM,EAAE,cAAc,OAAO,SAAS,IAAI,MAAM,0BAA0B,QAAQ,SAAS,OAAO;AAClG,QAAM,KAAK,GAAG,QAAQ;AAGtB,SAAO,OAAO,SAAS,YAAY;AAGnC,MAAI,QAAQ,MAAM,SAAS,uBAAuB,GAAG;AACnD,UAAM,EAAE,QAAQ,KAAK,IAAI,MAAM;AAAA,MAC7B;AAAA,MACA;AAAA,MACA,YAAY,OAAO,oBAAoB,CAAC,CAAC;AAAA,IAC3C;AAEA,QAAI,QAAQ,WAAW,QAAQ,MAAM;AACnC,YAAM,OAAO,OAAO;AACpB,YAAM,UAAoB,KAAK,WAAW,CAAC;AAC3C,YAAM,iBAAiB,KAAK,mBAAmB,CAAC;AAChD,YAAM,cAAc,QAAQ;AAC5B,WAAK,UAAU,SAAS,WAAW,eAAe,eAAe,MAAM;AACvE,WAAK,mBAAmB,KAAK;AAAA,QAC3B;AAAA,UACE,YAAY,QAAQ,IAAI,OAAK,EAAE,SAAS,EAAE,MAAM,GAAG,CAAC;AAAA,UACpD,iBAAiB,eAAe,IAAI,OAAK,EAAE,SAAS;AAAA,QACtD;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF,WAAW,UAAU,CAAC,OAAO,SAAS;AACpC,WAAK,SAAS;AACd,WAAK,QAAQ,OAAO,SAAS;AAAA,IAC/B;AACA,UAAM,KAAK,IAAI;AAAA,EACjB;AAGA,MAAI,QAAQ,MAAM,SAAS,4BAA4B,GAAG;AACxD,UAAM,EAAE,QAAQ,KAAK,IAAI,MAAM;AAAA,MAC7B;AAAA,MACA;AAAA,MACA,YAAY,OAAO,YAAY,8BAA8B,CAAC,CAAC;AAAA,IACjE;AAEA,UAAM,OAAO,QAAQ;AACrB,UAAM,mBAAmB,MAAM;AAC/B,QAAI,QAAQ,WAAW,kBAAkB;AACvC,WAAK,UAAU,SAAS,iBAAiB,MAAM;AAC/C,WAAK,mBAAmB,KAAK;AAAA,QAC3B;AAAA,UACE,yBAAyB,iBAAiB;AAAA,UAC1C,SAAS,iBAAiB,MAAM,GAAG,CAAC;AAAA,QACtC;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF,WAAW,UAAU,CAAC,OAAO,SAAS;AACpC,WAAK,SAAS;AACd,WAAK,QAAQ,OAAO,SAAS;AAAA,IAC/B;AACA,UAAM,KAAK,IAAI;AAAA,EACjB;AAEA,SAAO,EAAE,OAAO,QAAQ;AAC1B;","names":[]}
|
|
@@ -1,9 +1,3 @@
|
|
|
1
|
-
import { fileURLToPath as __adcpFileURLToPath } from 'node:url';
|
|
2
|
-
import { dirname as __adcpDirname } from 'node:path';
|
|
3
|
-
import { createRequire as __adcpCreateRequire } from 'node:module';
|
|
4
|
-
const __filename = __adcpFileURLToPath(import.meta.url);
|
|
5
|
-
const __dirname = __adcpDirname(__filename);
|
|
6
|
-
const require = __adcpCreateRequire(import.meta.url);
|
|
7
1
|
import { getOrCreateClient, runStep, resolveBrand, resolveAccount, getOrDiscoverProfile } from "../client.mjs";
|
|
8
2
|
import { testDiscovery } from "./discovery.mjs";
|
|
9
3
|
async function testErrorHandling(agentUrl, options) {
|