@adcp/sdk 12.0.0 → 12.0.2
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.d.mts +1 -1
- package/dist/lib/index.d.ts +1 -1
- package/dist/lib/index.d.ts.map +1 -1
- package/dist/lib/index.js.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.d.mts +13 -0
- package/dist/lib/server/create-adcp-server.d.ts +13 -0
- package/dist/lib/server/create-adcp-server.d.ts.map +1 -1
- package/dist/lib/server/create-adcp-server.js +3 -2
- package/dist/lib/server/create-adcp-server.js.map +1 -1
- package/dist/lib/server/create-adcp-server.mjs +3 -8
- 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.d.mts +1 -1
- package/dist/lib/server/index.d.ts +1 -1
- package/dist/lib/server/index.d.ts.map +1 -1
- package/dist/lib/server/index.js.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.d.mts +1 -1
- package/dist/lib/server/legacy/v5/index.d.ts +1 -1
- package/dist/lib/server/legacy/v5/index.d.ts.map +1 -1
- package/dist/lib/server/legacy/v5/index.js.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/edge-cases.ts"],"sourcesContent":["/**\n * Edge Case Testing Scenarios\n *\n * Tests various edge cases, error handling, and validation:\n * - Error handling (invalid inputs, non-existent IDs)\n * - Schema validation (negative values, invalid enums)\n * - Pricing edge cases (auction vs fixed, min spend, floor prices)\n * - Behavior analysis\n * - Temporal validation\n * - Response consistency\n *\n * These scenarios are designed to find bugs and ensure agents\n * properly handle edge cases according to the AdCP spec.\n */\n\nimport type { Product, PricingOption } from '../../types/core.generated';\nimport type {\n CreateMediaBuyRequest,\n GetProductsRequest,\n SyncCreativesRequest,\n GetMediaBuyDeliveryRequest,\n GetProductsResponse,\n ListCreativesResponse,\n} from '../../types/tools.generated';\nimport type { TestOptions, TestStepResult, AgentProfile, TaskResult } from '../types';\nimport { getOrCreateClient, runStep, resolveBrand, resolveAccount, getOrDiscoverProfile } from '../client';\nimport { testDiscovery } from './discovery';\n\n/**\n * Test: Error Handling\n * Verifies the agent returns proper discriminated union error responses\n */\nexport async function testErrorHandling(\n agentUrl: string,\n options: TestOptions\n): Promise<{ steps: TestStepResult[]; profile?: AgentProfile }> {\n const steps: TestStepResult[] = [];\n const client = getOrCreateClient(agentUrl, options);\n\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 // Test 1: Invalid product_id in create_media_buy\n if (profile.tools.includes('create_media_buy')) {\n const { result, step } = await runStep<TaskResult>(\n 'Invalid product_id error response',\n 'create_media_buy',\n async () =>\n client.createMediaBuy({\n idempotency_key: `error-test-${Date.now()}`,\n brand_manifest: {\n name: 'Error Test Brand',\n url: 'https://test.example',\n },\n start_time: new Date(Date.now() + 86400000).toISOString(),\n end_time: new Date(Date.now() + 604800000).toISOString(),\n packages: [\n {\n product_id: 'NONEXISTENT_PRODUCT_ID_12345',\n budget: 1000,\n pricing_option_id: 'nonexistent-pricing',\n },\n ],\n } as unknown as CreateMediaBuyRequest) as Promise<TaskResult>\n );\n\n if (result?.success) {\n step.passed = false;\n step.error = 'Agent accepted invalid product_id - should have returned error';\n } else {\n // !result (threw) or result.success === false — both count as rejection\n step.passed = true;\n step.details = `Agent correctly rejected invalid product_id${result?.error ? `: ${result.error}` : ''}`;\n if (result?.error) step.response_preview = JSON.stringify({ error: result.error }, null, 2);\n }\n steps.push(step);\n }\n\n // Test 2: Missing required field in get_products\n if (profile.tools.includes('get_products')) {\n const { result, step } = await runStep<TaskResult>(\n 'Empty request handling',\n 'get_products',\n async () => client.getProducts({} as unknown as GetProductsRequest) as Promise<TaskResult>\n );\n\n if (result?.success) {\n step.passed = true;\n step.details = 'Agent accepts empty get_products request (permissive)';\n } else {\n // !result (threw) or result.success === false — both mean stricter validation\n step.passed = true;\n step.details = `Agent requires brief or brand (stricter validation)${result?.error ? `: ${result.error}` : ''}`;\n if (result?.error) step.response_preview = JSON.stringify({ error: result.error }, null, 2);\n }\n steps.push(step);\n }\n\n // Test 3: Invalid format_id in sync_creatives\n if (profile.tools.includes('sync_creatives')) {\n const { result, step } = await runStep<TaskResult>(\n 'Invalid format_id error response',\n 'sync_creatives',\n async () =>\n client.syncCreatives({\n account: resolveAccount(options),\n creatives: [\n {\n creative_id: `invalid-format-test-${Date.now()}`,\n name: 'Invalid Format Test',\n format_id: { id: 'TOTALLY_INVALID_FORMAT_ID_999' },\n assets: {\n primary: {\n url: 'https://via.placeholder.com/300x250',\n width: 300,\n height: 250,\n format: 'png',\n },\n },\n },\n ],\n } as unknown as SyncCreativesRequest) as Promise<TaskResult>\n );\n\n if (result?.success) {\n step.passed = true;\n step.details = 'Agent accepts unknown format_ids (permissive mode)';\n } else {\n // !result (threw) or result.success === false — both count as rejection\n step.passed = true;\n step.details = `Agent correctly rejected invalid format_id${result?.error ? `: ${result.error}` : ''}`;\n if (result?.error) step.response_preview = JSON.stringify({ error: result.error }, null, 2);\n }\n steps.push(step);\n }\n\n // Test 4: get_media_buy_delivery with non-existent media_buy_id\n if (profile.tools.includes('get_media_buy_delivery')) {\n const { result, step } = await runStep<TaskResult>(\n 'Non-existent media_buy_id error',\n 'get_media_buy_delivery',\n async () =>\n client.getMediaBuyDelivery({\n media_buy_ids: ['NONEXISTENT_MEDIA_BUY_ID_99999'],\n } as unknown as GetMediaBuyDeliveryRequest) as Promise<TaskResult>\n );\n\n if (result?.success) {\n const data = result.data as unknown as Record<string, unknown> | undefined;\n const deliveries = (data?.deliveries || data?.media_buys || []) as unknown[];\n if (deliveries.length === 0) {\n step.passed = true;\n step.details = 'Agent returned empty deliveries for non-existent media buy';\n } else {\n step.passed = false;\n step.error = 'Agent returned deliveries for non-existent media_buy_id';\n }\n } else {\n // !result (threw) or result.success === false — both count as rejection\n step.passed = true;\n step.details = `Agent correctly returned error for non-existent media buy${result?.error ? `: ${result.error}` : ''}`;\n if (result?.error) step.response_preview = JSON.stringify({ error: result.error }, null, 2);\n }\n steps.push(step);\n }\n\n return { steps, profile };\n}\n\n/**\n * Test: Validation\n * Tests that agents properly validate inputs and reject malformed requests\n */\nexport async function testValidation(\n agentUrl: string,\n options: TestOptions\n): Promise<{ steps: TestStepResult[]; profile?: AgentProfile }> {\n const steps: TestStepResult[] = [];\n const client = getOrCreateClient(agentUrl, options);\n\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 // Test 1: Invalid enum value for pacing\n if (profile.tools.includes('create_media_buy')) {\n const { result, step } = await runStep<TaskResult>(\n 'Invalid pacing enum value',\n 'create_media_buy',\n async () =>\n client.createMediaBuy({\n idempotency_key: `validation-test-${Date.now()}`,\n brand_manifest: { name: 'Validation Test', url: 'https://test.example' },\n start_time: new Date(Date.now() + 86400000).toISOString(),\n end_time: new Date(Date.now() + 604800000).toISOString(),\n packages: [\n {\n product_id: 'test-product',\n budget: 1000,\n pricing_option_id: 'test-pricing',\n pacing: 'INVALID_PACING_VALUE' as unknown as string,\n },\n ],\n } as unknown as CreateMediaBuyRequest) as Promise<TaskResult>\n );\n\n if (result?.success) {\n step.passed = false;\n step.error = 'Agent accepted invalid pacing value - should validate enums';\n } else {\n step.passed = true;\n step.details = `Agent rejected invalid pacing enum value${result?.error ? `: ${result.error}` : ''}`;\n }\n steps.push(step);\n }\n\n // Test 2: Negative budget (definitely invalid)\n if (profile.tools.includes('create_media_buy')) {\n const { result, step } = await runStep<TaskResult>(\n 'Negative budget rejection',\n 'create_media_buy',\n async () =>\n client.createMediaBuy({\n idempotency_key: `negative-budget-test-${Date.now()}`,\n brand_manifest: { name: 'Negative Budget Test', url: 'https://test.example' },\n start_time: new Date(Date.now() + 86400000).toISOString(),\n end_time: new Date(Date.now() + 604800000).toISOString(),\n packages: [\n {\n product_id: 'test-product',\n budget: -500,\n pricing_option_id: 'test-pricing',\n },\n ],\n } as unknown as CreateMediaBuyRequest) as Promise<TaskResult>\n );\n\n if (result?.success) {\n step.passed = false;\n step.error = 'CRITICAL: Agent accepted negative budget - must validate minimum: 0';\n } else {\n step.passed = true;\n step.details = `Agent correctly rejected negative budget${result?.error ? `: ${result.error}` : ''}`;\n }\n steps.push(step);\n }\n\n // Test 3: Invalid creative weight (> 100)\n if (profile.tools.includes('sync_creatives')) {\n const { result, step } = await runStep<TaskResult>(\n 'Invalid creative weight (> 100)',\n 'sync_creatives',\n async () =>\n client.syncCreatives({\n account: resolveAccount(options),\n creatives: [\n {\n creative_id: `weight-test-${Date.now()}`,\n name: 'Weight Test Creative',\n format_id: { agent_url: 'https://creative.adcontextprotocol.org', id: 'display_300x250' },\n weight: 150,\n assets: {\n primary: {\n url: 'https://via.placeholder.com/300x250',\n width: 300,\n height: 250,\n format: 'png',\n },\n },\n },\n ],\n } as unknown as SyncCreativesRequest) as Promise<TaskResult>\n );\n\n if (result?.success) {\n step.passed = false;\n step.error = 'Agent accepted weight > 100 - should validate maximum: 100';\n } else {\n step.passed = true;\n step.details = `Agent rejected weight > 100${result?.error ? `: ${result.error}` : ''}`;\n }\n steps.push(step);\n }\n\n // Test 4: Empty creatives array\n if (profile.tools.includes('sync_creatives')) {\n const { result, step } = await runStep<TaskResult>(\n 'Empty creatives array handling',\n 'sync_creatives',\n async () =>\n client.syncCreatives({\n account: resolveAccount(options),\n creatives: [],\n } as unknown as SyncCreativesRequest) as Promise<TaskResult>\n );\n\n if (result?.success) {\n step.passed = true;\n step.details = 'Agent accepts empty creatives array (returns empty result)';\n } else {\n // !result (threw) or result.success === false — both mean agent rejected\n step.passed = true;\n step.details = `Agent rejected empty creatives array${result?.error ? `: ${result.error}` : ''}`;\n }\n steps.push(step);\n }\n\n return { steps, profile };\n}\n\n/**\n * Test: Pricing Edge Cases\n * Tests auction vs fixed pricing, min spend requirements, bid_price handling\n */\nexport async function testPricingEdgeCases(\n agentUrl: string,\n options: TestOptions\n): Promise<{ steps: TestStepResult[]; profile?: AgentProfile }> {\n const steps: TestStepResult[] = [];\n const client = getOrCreateClient(agentUrl, options);\n\n const { steps: discoverySteps, profile } = await testDiscovery(agentUrl, options);\n steps.push(...discoverySteps);\n\n if (!profile?.tools.includes('create_media_buy') || !profile?.tools.includes('get_products')) {\n steps.push({\n step: 'Pricing edge cases',\n passed: false,\n duration_ms: 0,\n error: 'Agent does not support create_media_buy or get_products',\n });\n return { steps, profile };\n }\n\n // Get products to find actual pricing options\n const { result: productsResult } = await runStep<TaskResult>(\n 'Fetch products for pricing analysis',\n 'get_products',\n async () =>\n client.getProducts({\n buying_mode: 'brief',\n brief: 'Show all products with pricing details',\n brand: resolveBrand(options),\n } as unknown as GetProductsRequest) as Promise<TaskResult>\n );\n\n const productsData = productsResult?.data as GetProductsResponse | undefined;\n const products = productsData?.products;\n if (!products?.length) {\n steps.push({\n step: 'Pricing edge cases',\n passed: false,\n duration_ms: 0,\n error: 'No products available for pricing tests',\n });\n return { steps, profile };\n }\n\n // Analyze products for auction vs fixed pricing\n const auctionProducts: { product: Product; pricingOption: PricingOption }[] = [];\n const fixedProducts: { product: Product; pricingOption: PricingOption }[] = [];\n const productsWithMinSpend: { product: Product; pricingOption: PricingOption; minSpend: number }[] = [];\n\n for (const product of products) {\n for (const po of product.pricing_options || []) {\n if (!('fixed_price' in po) && (po.floor_price !== undefined || po.price_guidance !== undefined)) {\n auctionProducts.push({ product, pricingOption: po });\n } else if ('fixed_price' in po) {\n fixedProducts.push({ product, pricingOption: po });\n }\n if (po.min_spend_per_package != null && po.min_spend_per_package > 0) {\n productsWithMinSpend.push({\n product,\n pricingOption: po,\n minSpend: po.min_spend_per_package,\n });\n }\n }\n }\n\n steps.push({\n step: 'Analyze pricing options',\n passed: true,\n duration_ms: 0,\n details: `Found ${fixedProducts.length} fixed, ${auctionProducts.length} auction, ${productsWithMinSpend.length} with min spend`,\n });\n\n // Test 1: Auction pricing without bid_price (should fail)\n if (auctionProducts.length > 0) {\n const { product, pricingOption } = auctionProducts[0]!;\n const { result, step } = await runStep<TaskResult>(\n 'Auction pricing without bid_price',\n 'create_media_buy',\n async () =>\n client.createMediaBuy({\n idempotency_key: `auction-no-bid-${Date.now()}`,\n brand_manifest: { name: 'Auction Test', url: 'https://test.example' },\n start_time: new Date(Date.now() + 86400000).toISOString(),\n end_time: new Date(Date.now() + 604800000).toISOString(),\n packages: [\n {\n product_id: product.product_id,\n budget: 5000,\n pricing_option_id: pricingOption.pricing_option_id,\n },\n ],\n } as unknown as CreateMediaBuyRequest) as Promise<TaskResult>\n );\n\n if (result?.success) {\n step.passed = false;\n step.error = 'Agent accepted auction pricing without bid_price - should require it';\n } else {\n step.passed = true;\n step.details = `Agent correctly requires bid_price for auction pricing${result?.error ? `: ${result.error}` : ''}`;\n }\n steps.push(step);\n }\n\n // Test 2: Budget below min_spend_per_package\n if (productsWithMinSpend.length > 0) {\n const { product, pricingOption, minSpend } = productsWithMinSpend[0]!;\n const underBudget = minSpend * 0.5;\n\n const { result, step } = await runStep<TaskResult>(\n 'Budget below min_spend_per_package',\n 'create_media_buy',\n async () =>\n client.createMediaBuy({\n idempotency_key: `under-min-spend-${Date.now()}`,\n brand_manifest: { name: 'Min Spend Test', url: 'https://test.example' },\n start_time: new Date(Date.now() + 86400000).toISOString(),\n end_time: new Date(Date.now() + 604800000).toISOString(),\n packages: [\n {\n product_id: product.product_id,\n budget: underBudget,\n pricing_option_id: pricingOption.pricing_option_id,\n },\n ],\n } as unknown as CreateMediaBuyRequest) as Promise<TaskResult>\n );\n\n if (result?.success) {\n step.passed = false;\n step.error = `Agent accepted budget ${underBudget} below min_spend ${minSpend}`;\n } else {\n step.passed = true;\n step.details = `Agent rejected budget ${underBudget} below min_spend ${minSpend}${result?.error ? `: ${result.error}` : ''}`;\n }\n steps.push(step);\n }\n\n return { steps, profile };\n}\n\n/**\n * Test: Temporal Validation\n * Tests date/time ordering and format validation\n */\nexport async function testTemporalValidation(\n agentUrl: string,\n options: TestOptions\n): Promise<{ steps: TestStepResult[]; profile?: AgentProfile }> {\n const steps: TestStepResult[] = [];\n const client = getOrCreateClient(agentUrl, options);\n\n const { profile, step: profileStep } = await getOrDiscoverProfile(client, options);\n steps.push(profileStep);\n\n if (!profileStep.passed || !profile.tools.includes('create_media_buy')) {\n return { steps, profile };\n }\n\n // Test 1: End time before start time\n const { result: endBeforeStart, step: step1 } = await runStep<TaskResult>(\n 'End time before start time',\n 'create_media_buy',\n async () =>\n client.createMediaBuy({\n idempotency_key: `temporal-test-${Date.now()}`,\n brand_manifest: { name: 'Temporal Test', url: 'https://test.example' },\n start_time: new Date(Date.now() + 604800000).toISOString(), // 7 days from now\n end_time: new Date(Date.now() + 86400000).toISOString(), // 1 day from now (before start!)\n packages: [\n {\n product_id: 'test-product',\n budget: 1000,\n pricing_option_id: 'test-pricing',\n },\n ],\n } as unknown as CreateMediaBuyRequest) as Promise<TaskResult>\n );\n\n if (!endBeforeStart) {\n // runStep caught an exception — agent rejected at transport level, which counts as rejection\n step1.passed = true;\n step1.details = `Agent rejected end_time before start_time (threw error)`;\n } else if (endBeforeStart.success) {\n step1.passed = false;\n step1.error = 'Agent accepted end_time before start_time - must validate';\n } else {\n step1.passed = true;\n step1.details = `Agent correctly rejected end_time before start_time${endBeforeStart.error ? `: ${endBeforeStart.error}` : ''}`;\n }\n steps.push(step1);\n\n // Test 2: Start time in the past\n const { result: pastStart, step: step2 } = await runStep<TaskResult>(\n 'Start time in the past',\n 'create_media_buy',\n async () =>\n client.createMediaBuy({\n idempotency_key: `past-start-${Date.now()}`,\n brand_manifest: { name: 'Past Start Test', url: 'https://test.example' },\n start_time: new Date(Date.now() - 86400000).toISOString(), // Yesterday\n end_time: new Date(Date.now() + 604800000).toISOString(), // 7 days from now\n packages: [\n {\n product_id: 'test-product',\n budget: 1000,\n pricing_option_id: 'test-pricing',\n },\n ],\n } as unknown as CreateMediaBuyRequest) as Promise<TaskResult>\n );\n\n if (!pastStart) {\n // runStep caught an exception — agent rejected at transport level\n step2.passed = true;\n step2.details = 'Agent rejected start_time in the past (threw error)';\n } else if (pastStart.success) {\n step2.passed = true;\n step2.details = 'Agent accepts start_time in past (may auto-adjust)';\n } else {\n step2.passed = true;\n step2.details = `Agent rejected start_time in the past${pastStart.error ? `: ${pastStart.error}` : ''}`;\n }\n steps.push(step2);\n\n return { steps, profile };\n}\n\n/**\n * Test: Behavior Analysis\n * Analyzes agent behavioral characteristics\n */\nexport async function testBehaviorAnalysis(\n agentUrl: string,\n options: TestOptions\n): Promise<{ steps: TestStepResult[]; profile?: AgentProfile }> {\n const steps: TestStepResult[] = [];\n const client = getOrCreateClient(agentUrl, options);\n\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 // Test 1: Does get_products require brand?\n if (profile.tools.includes('get_products')) {\n const { result: withoutBrand, step: step1 } = await runStep<TaskResult>(\n 'get_products without brand',\n 'get_products',\n async () =>\n client.getProducts({\n buying_mode: 'brief',\n brief: 'Show me all available products',\n } as unknown as GetProductsRequest) as Promise<TaskResult>\n );\n\n const withoutBrandProducts = (withoutBrand?.data as GetProductsResponse | undefined)?.products;\n if (withoutBrand?.success && withoutBrandProducts?.length) {\n step1.details = `Returns ${withoutBrandProducts.length} products without brand`;\n } else if (withoutBrand && !withoutBrand.success) {\n step1.details = 'Requires brand for product discovery';\n }\n steps.push(step1);\n\n // Test 2: Are results filtered by brief?\n const { result: specificBrief, step: step2 } = await runStep<TaskResult>(\n 'get_products with specific brief',\n 'get_products',\n async () =>\n client.getProducts({\n buying_mode: 'brief',\n brief: 'Looking specifically for podcast audio advertising only',\n brand: resolveBrand(options),\n } as unknown as GetProductsRequest) as Promise<TaskResult>\n );\n\n const { result: broadBrief } = await runStep<TaskResult>(\n 'get_products with broad brief',\n 'get_products',\n async () =>\n client.getProducts({\n buying_mode: 'brief',\n brief: 'Show all products across all channels and formats',\n brand: resolveBrand(options),\n } as unknown as GetProductsRequest) as Promise<TaskResult>\n );\n\n const specificProducts = (specificBrief?.data as GetProductsResponse | undefined)?.products;\n const broadProducts = (broadBrief?.data as GetProductsResponse | undefined)?.products;\n const specificCount = specificProducts?.length || 0;\n const broadCount = broadProducts?.length || 0;\n\n if (specificCount < broadCount) {\n step2.passed = true;\n step2.details = `Brief filtering: specific=${specificCount}, broad=${broadCount} (filtered)`;\n } else if (specificCount === broadCount && broadCount > 0) {\n step2.passed = true;\n step2.details = `No brief filtering: specific=${specificCount}, broad=${broadCount} (same)`;\n } else {\n step2.details = `Brief filtering unclear: specific=${specificCount}, broad=${broadCount}`;\n }\n steps.push(step2);\n }\n\n return { steps, profile };\n}\n\n/**\n * Test: Response Consistency\n * Checks for schema errors, pagination bugs, data mismatches\n */\nexport async function testResponseConsistency(\n agentUrl: string,\n options: TestOptions\n): Promise<{ steps: TestStepResult[]; profile?: AgentProfile }> {\n const steps: TestStepResult[] = [];\n const client = getOrCreateClient(agentUrl, options);\n\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 // Test list_authorized_properties consistency\n if (profile.tools.includes('list_authorized_properties')) {\n const { result, step } = await runStep<TaskResult>(\n 'Check list_authorized_properties consistency',\n 'list_authorized_properties',\n async () => client.executeTask('list_authorized_properties', {}) as Promise<TaskResult>\n );\n\n if (result?.success && result?.data) {\n const data = result.data as unknown as Record<string, unknown>;\n const publisherDomains = (data.publisher_domains || []) as unknown[];\n const issues: string[] = [];\n\n // Check for undefined elements\n for (let i = 0; i < publisherDomains.length; i++) {\n if (publisherDomains[i] === undefined || publisherDomains[i] === null) {\n issues.push(`publisher_domains[${i}] is ${String(publisherDomains[i])}`);\n }\n }\n\n if (issues.length > 0) {\n step.passed = false;\n step.error = `Schema validation errors: ${issues.slice(0, 3).join(', ')}`;\n step.response_preview = JSON.stringify(\n {\n issues: issues.slice(0, 10),\n publisher_domains_count: publisherDomains.length,\n },\n null,\n 2\n );\n } else {\n step.details = `Publisher domains consistent: ${publisherDomains.length} domain(s)`;\n }\n } else if (result && !result.success) {\n step.passed = false;\n step.error = result.error || 'list_authorized_properties failed';\n }\n steps.push(step);\n }\n\n // Test list_creatives pagination consistency\n if (profile.tools.includes('list_creatives')) {\n const { result, step } = await runStep<TaskResult>(\n 'Check list_creatives pagination consistency',\n 'list_creatives',\n async () => client.listCreatives({}) as Promise<TaskResult>\n );\n\n if (result?.success && result?.data) {\n const data = result.data as ListCreativesResponse;\n const creatives = data.creatives || [];\n const querySummary = data.query_summary;\n const totalMatching = querySummary?.total_matching;\n const returned = querySummary?.returned ?? creatives.length;\n\n if (totalMatching !== undefined && totalMatching > 0 && returned === 0) {\n step.passed = false;\n step.error = `Pagination bug: total_matching=${totalMatching} but returned=${returned}`;\n } else if (returned !== creatives.length) {\n step.passed = false;\n step.error = `Mismatch: returned=${returned} but creatives.length=${creatives.length}`;\n } else {\n step.details = `Pagination consistent: ${creatives.length} creatives`;\n }\n }\n steps.push(step);\n }\n\n return { steps, profile };\n}\n"],"mappings":";;;;;;AAyBA,SAAS,mBAAmB,SAAS,cAAc,gBAAgB,4BAA4B;AAC/F,SAAS,qBAAqB;AAM9B,eAAsB,kBACpB,UACA,SAC8D;AAC9D,QAAM,QAA0B,CAAC;AACjC,QAAM,SAAS,kBAAkB,UAAU,OAAO;AAElD,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,MAAI,QAAQ,MAAM,SAAS,kBAAkB,GAAG;AAC9C,UAAM,EAAE,QAAQ,KAAK,IAAI,MAAM;AAAA,MAC7B;AAAA,MACA;AAAA,MACA,YACE,OAAO,eAAe;AAAA,QACpB,iBAAiB,cAAc,KAAK,IAAI,CAAC;AAAA,QACzC,gBAAgB;AAAA,UACd,MAAM;AAAA,UACN,KAAK;AAAA,QACP;AAAA,QACA,YAAY,IAAI,KAAK,KAAK,IAAI,IAAI,KAAQ,EAAE,YAAY;AAAA,QACxD,UAAU,IAAI,KAAK,KAAK,IAAI,IAAI,MAAS,EAAE,YAAY;AAAA,QACvD,UAAU;AAAA,UACR;AAAA,YACE,YAAY;AAAA,YACZ,QAAQ;AAAA,YACR,mBAAmB;AAAA,UACrB;AAAA,QACF;AAAA,MACF,CAAqC;AAAA,IACzC;AAEA,QAAI,QAAQ,SAAS;AACnB,WAAK,SAAS;AACd,WAAK,QAAQ;AAAA,IACf,OAAO;AAEL,WAAK,SAAS;AACd,WAAK,UAAU,8CAA8C,QAAQ,QAAQ,KAAK,OAAO,KAAK,KAAK,EAAE;AACrG,UAAI,QAAQ,MAAO,MAAK,mBAAmB,KAAK,UAAU,EAAE,OAAO,OAAO,MAAM,GAAG,MAAM,CAAC;AAAA,IAC5F;AACA,UAAM,KAAK,IAAI;AAAA,EACjB;AAGA,MAAI,QAAQ,MAAM,SAAS,cAAc,GAAG;AAC1C,UAAM,EAAE,QAAQ,KAAK,IAAI,MAAM;AAAA,MAC7B;AAAA,MACA;AAAA,MACA,YAAY,OAAO,YAAY,CAAC,CAAkC;AAAA,IACpE;AAEA,QAAI,QAAQ,SAAS;AACnB,WAAK,SAAS;AACd,WAAK,UAAU;AAAA,IACjB,OAAO;AAEL,WAAK,SAAS;AACd,WAAK,UAAU,sDAAsD,QAAQ,QAAQ,KAAK,OAAO,KAAK,KAAK,EAAE;AAC7G,UAAI,QAAQ,MAAO,MAAK,mBAAmB,KAAK,UAAU,EAAE,OAAO,OAAO,MAAM,GAAG,MAAM,CAAC;AAAA,IAC5F;AACA,UAAM,KAAK,IAAI;AAAA,EACjB;AAGA,MAAI,QAAQ,MAAM,SAAS,gBAAgB,GAAG;AAC5C,UAAM,EAAE,QAAQ,KAAK,IAAI,MAAM;AAAA,MAC7B;AAAA,MACA;AAAA,MACA,YACE,OAAO,cAAc;AAAA,QACnB,SAAS,eAAe,OAAO;AAAA,QAC/B,WAAW;AAAA,UACT;AAAA,YACE,aAAa,uBAAuB,KAAK,IAAI,CAAC;AAAA,YAC9C,MAAM;AAAA,YACN,WAAW,EAAE,IAAI,gCAAgC;AAAA,YACjD,QAAQ;AAAA,cACN,SAAS;AAAA,gBACP,KAAK;AAAA,gBACL,OAAO;AAAA,gBACP,QAAQ;AAAA,gBACR,QAAQ;AAAA,cACV;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF,CAAoC;AAAA,IACxC;AAEA,QAAI,QAAQ,SAAS;AACnB,WAAK,SAAS;AACd,WAAK,UAAU;AAAA,IACjB,OAAO;AAEL,WAAK,SAAS;AACd,WAAK,UAAU,6CAA6C,QAAQ,QAAQ,KAAK,OAAO,KAAK,KAAK,EAAE;AACpG,UAAI,QAAQ,MAAO,MAAK,mBAAmB,KAAK,UAAU,EAAE,OAAO,OAAO,MAAM,GAAG,MAAM,CAAC;AAAA,IAC5F;AACA,UAAM,KAAK,IAAI;AAAA,EACjB;AAGA,MAAI,QAAQ,MAAM,SAAS,wBAAwB,GAAG;AACpD,UAAM,EAAE,QAAQ,KAAK,IAAI,MAAM;AAAA,MAC7B;AAAA,MACA;AAAA,MACA,YACE,OAAO,oBAAoB;AAAA,QACzB,eAAe,CAAC,gCAAgC;AAAA,MAClD,CAA0C;AAAA,IAC9C;AAEA,QAAI,QAAQ,SAAS;AACnB,YAAM,OAAO,OAAO;AACpB,YAAM,aAAc,MAAM,cAAc,MAAM,cAAc,CAAC;AAC7D,UAAI,WAAW,WAAW,GAAG;AAC3B,aAAK,SAAS;AACd,aAAK,UAAU;AAAA,MACjB,OAAO;AACL,aAAK,SAAS;AACd,aAAK,QAAQ;AAAA,MACf;AAAA,IACF,OAAO;AAEL,WAAK,SAAS;AACd,WAAK,UAAU,4DAA4D,QAAQ,QAAQ,KAAK,OAAO,KAAK,KAAK,EAAE;AACnH,UAAI,QAAQ,MAAO,MAAK,mBAAmB,KAAK,UAAU,EAAE,OAAO,OAAO,MAAM,GAAG,MAAM,CAAC;AAAA,IAC5F;AACA,UAAM,KAAK,IAAI;AAAA,EACjB;AAEA,SAAO,EAAE,OAAO,QAAQ;AAC1B;AAMA,eAAsB,eACpB,UACA,SAC8D;AAC9D,QAAM,QAA0B,CAAC;AACjC,QAAM,SAAS,kBAAkB,UAAU,OAAO;AAElD,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,MAAI,QAAQ,MAAM,SAAS,kBAAkB,GAAG;AAC9C,UAAM,EAAE,QAAQ,KAAK,IAAI,MAAM;AAAA,MAC7B;AAAA,MACA;AAAA,MACA,YACE,OAAO,eAAe;AAAA,QACpB,iBAAiB,mBAAmB,KAAK,IAAI,CAAC;AAAA,QAC9C,gBAAgB,EAAE,MAAM,mBAAmB,KAAK,uBAAuB;AAAA,QACvE,YAAY,IAAI,KAAK,KAAK,IAAI,IAAI,KAAQ,EAAE,YAAY;AAAA,QACxD,UAAU,IAAI,KAAK,KAAK,IAAI,IAAI,MAAS,EAAE,YAAY;AAAA,QACvD,UAAU;AAAA,UACR;AAAA,YACE,YAAY;AAAA,YACZ,QAAQ;AAAA,YACR,mBAAmB;AAAA,YACnB,QAAQ;AAAA,UACV;AAAA,QACF;AAAA,MACF,CAAqC;AAAA,IACzC;AAEA,QAAI,QAAQ,SAAS;AACnB,WAAK,SAAS;AACd,WAAK,QAAQ;AAAA,IACf,OAAO;AACL,WAAK,SAAS;AACd,WAAK,UAAU,2CAA2C,QAAQ,QAAQ,KAAK,OAAO,KAAK,KAAK,EAAE;AAAA,IACpG;AACA,UAAM,KAAK,IAAI;AAAA,EACjB;AAGA,MAAI,QAAQ,MAAM,SAAS,kBAAkB,GAAG;AAC9C,UAAM,EAAE,QAAQ,KAAK,IAAI,MAAM;AAAA,MAC7B;AAAA,MACA;AAAA,MACA,YACE,OAAO,eAAe;AAAA,QACpB,iBAAiB,wBAAwB,KAAK,IAAI,CAAC;AAAA,QACnD,gBAAgB,EAAE,MAAM,wBAAwB,KAAK,uBAAuB;AAAA,QAC5E,YAAY,IAAI,KAAK,KAAK,IAAI,IAAI,KAAQ,EAAE,YAAY;AAAA,QACxD,UAAU,IAAI,KAAK,KAAK,IAAI,IAAI,MAAS,EAAE,YAAY;AAAA,QACvD,UAAU;AAAA,UACR;AAAA,YACE,YAAY;AAAA,YACZ,QAAQ;AAAA,YACR,mBAAmB;AAAA,UACrB;AAAA,QACF;AAAA,MACF,CAAqC;AAAA,IACzC;AAEA,QAAI,QAAQ,SAAS;AACnB,WAAK,SAAS;AACd,WAAK,QAAQ;AAAA,IACf,OAAO;AACL,WAAK,SAAS;AACd,WAAK,UAAU,2CAA2C,QAAQ,QAAQ,KAAK,OAAO,KAAK,KAAK,EAAE;AAAA,IACpG;AACA,UAAM,KAAK,IAAI;AAAA,EACjB;AAGA,MAAI,QAAQ,MAAM,SAAS,gBAAgB,GAAG;AAC5C,UAAM,EAAE,QAAQ,KAAK,IAAI,MAAM;AAAA,MAC7B;AAAA,MACA;AAAA,MACA,YACE,OAAO,cAAc;AAAA,QACnB,SAAS,eAAe,OAAO;AAAA,QAC/B,WAAW;AAAA,UACT;AAAA,YACE,aAAa,eAAe,KAAK,IAAI,CAAC;AAAA,YACtC,MAAM;AAAA,YACN,WAAW,EAAE,WAAW,0CAA0C,IAAI,kBAAkB;AAAA,YACxF,QAAQ;AAAA,YACR,QAAQ;AAAA,cACN,SAAS;AAAA,gBACP,KAAK;AAAA,gBACL,OAAO;AAAA,gBACP,QAAQ;AAAA,gBACR,QAAQ;AAAA,cACV;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF,CAAoC;AAAA,IACxC;AAEA,QAAI,QAAQ,SAAS;AACnB,WAAK,SAAS;AACd,WAAK,QAAQ;AAAA,IACf,OAAO;AACL,WAAK,SAAS;AACd,WAAK,UAAU,8BAA8B,QAAQ,QAAQ,KAAK,OAAO,KAAK,KAAK,EAAE;AAAA,IACvF;AACA,UAAM,KAAK,IAAI;AAAA,EACjB;AAGA,MAAI,QAAQ,MAAM,SAAS,gBAAgB,GAAG;AAC5C,UAAM,EAAE,QAAQ,KAAK,IAAI,MAAM;AAAA,MAC7B;AAAA,MACA;AAAA,MACA,YACE,OAAO,cAAc;AAAA,QACnB,SAAS,eAAe,OAAO;AAAA,QAC/B,WAAW,CAAC;AAAA,MACd,CAAoC;AAAA,IACxC;AAEA,QAAI,QAAQ,SAAS;AACnB,WAAK,SAAS;AACd,WAAK,UAAU;AAAA,IACjB,OAAO;AAEL,WAAK,SAAS;AACd,WAAK,UAAU,uCAAuC,QAAQ,QAAQ,KAAK,OAAO,KAAK,KAAK,EAAE;AAAA,IAChG;AACA,UAAM,KAAK,IAAI;AAAA,EACjB;AAEA,SAAO,EAAE,OAAO,QAAQ;AAC1B;AAMA,eAAsB,qBACpB,UACA,SAC8D;AAC9D,QAAM,QAA0B,CAAC;AACjC,QAAM,SAAS,kBAAkB,UAAU,OAAO;AAElD,QAAM,EAAE,OAAO,gBAAgB,QAAQ,IAAI,MAAM,cAAc,UAAU,OAAO;AAChF,QAAM,KAAK,GAAG,cAAc;AAE5B,MAAI,CAAC,SAAS,MAAM,SAAS,kBAAkB,KAAK,CAAC,SAAS,MAAM,SAAS,cAAc,GAAG;AAC5F,UAAM,KAAK;AAAA,MACT,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,aAAa;AAAA,MACb,OAAO;AAAA,IACT,CAAC;AACD,WAAO,EAAE,OAAO,QAAQ;AAAA,EAC1B;AAGA,QAAM,EAAE,QAAQ,eAAe,IAAI,MAAM;AAAA,IACvC;AAAA,IACA;AAAA,IACA,YACE,OAAO,YAAY;AAAA,MACjB,aAAa;AAAA,MACb,OAAO;AAAA,MACP,OAAO,aAAa,OAAO;AAAA,IAC7B,CAAkC;AAAA,EACtC;AAEA,QAAM,eAAe,gBAAgB;AACrC,QAAM,WAAW,cAAc;AAC/B,MAAI,CAAC,UAAU,QAAQ;AACrB,UAAM,KAAK;AAAA,MACT,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,aAAa;AAAA,MACb,OAAO;AAAA,IACT,CAAC;AACD,WAAO,EAAE,OAAO,QAAQ;AAAA,EAC1B;AAGA,QAAM,kBAAwE,CAAC;AAC/E,QAAM,gBAAsE,CAAC;AAC7E,QAAM,uBAA+F,CAAC;AAEtG,aAAW,WAAW,UAAU;AAC9B,eAAW,MAAM,QAAQ,mBAAmB,CAAC,GAAG;AAC9C,UAAI,EAAE,iBAAiB,QAAQ,GAAG,gBAAgB,UAAa,GAAG,mBAAmB,SAAY;AAC/F,wBAAgB,KAAK,EAAE,SAAS,eAAe,GAAG,CAAC;AAAA,MACrD,WAAW,iBAAiB,IAAI;AAC9B,sBAAc,KAAK,EAAE,SAAS,eAAe,GAAG,CAAC;AAAA,MACnD;AACA,UAAI,GAAG,yBAAyB,QAAQ,GAAG,wBAAwB,GAAG;AACpE,6BAAqB,KAAK;AAAA,UACxB;AAAA,UACA,eAAe;AAAA,UACf,UAAU,GAAG;AAAA,QACf,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAEA,QAAM,KAAK;AAAA,IACT,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,aAAa;AAAA,IACb,SAAS,SAAS,cAAc,MAAM,WAAW,gBAAgB,MAAM,aAAa,qBAAqB,MAAM;AAAA,EACjH,CAAC;AAGD,MAAI,gBAAgB,SAAS,GAAG;AAC9B,UAAM,EAAE,SAAS,cAAc,IAAI,gBAAgB,CAAC;AACpD,UAAM,EAAE,QAAQ,KAAK,IAAI,MAAM;AAAA,MAC7B;AAAA,MACA;AAAA,MACA,YACE,OAAO,eAAe;AAAA,QACpB,iBAAiB,kBAAkB,KAAK,IAAI,CAAC;AAAA,QAC7C,gBAAgB,EAAE,MAAM,gBAAgB,KAAK,uBAAuB;AAAA,QACpE,YAAY,IAAI,KAAK,KAAK,IAAI,IAAI,KAAQ,EAAE,YAAY;AAAA,QACxD,UAAU,IAAI,KAAK,KAAK,IAAI,IAAI,MAAS,EAAE,YAAY;AAAA,QACvD,UAAU;AAAA,UACR;AAAA,YACE,YAAY,QAAQ;AAAA,YACpB,QAAQ;AAAA,YACR,mBAAmB,cAAc;AAAA,UACnC;AAAA,QACF;AAAA,MACF,CAAqC;AAAA,IACzC;AAEA,QAAI,QAAQ,SAAS;AACnB,WAAK,SAAS;AACd,WAAK,QAAQ;AAAA,IACf,OAAO;AACL,WAAK,SAAS;AACd,WAAK,UAAU,yDAAyD,QAAQ,QAAQ,KAAK,OAAO,KAAK,KAAK,EAAE;AAAA,IAClH;AACA,UAAM,KAAK,IAAI;AAAA,EACjB;AAGA,MAAI,qBAAqB,SAAS,GAAG;AACnC,UAAM,EAAE,SAAS,eAAe,SAAS,IAAI,qBAAqB,CAAC;AACnE,UAAM,cAAc,WAAW;AAE/B,UAAM,EAAE,QAAQ,KAAK,IAAI,MAAM;AAAA,MAC7B;AAAA,MACA;AAAA,MACA,YACE,OAAO,eAAe;AAAA,QACpB,iBAAiB,mBAAmB,KAAK,IAAI,CAAC;AAAA,QAC9C,gBAAgB,EAAE,MAAM,kBAAkB,KAAK,uBAAuB;AAAA,QACtE,YAAY,IAAI,KAAK,KAAK,IAAI,IAAI,KAAQ,EAAE,YAAY;AAAA,QACxD,UAAU,IAAI,KAAK,KAAK,IAAI,IAAI,MAAS,EAAE,YAAY;AAAA,QACvD,UAAU;AAAA,UACR;AAAA,YACE,YAAY,QAAQ;AAAA,YACpB,QAAQ;AAAA,YACR,mBAAmB,cAAc;AAAA,UACnC;AAAA,QACF;AAAA,MACF,CAAqC;AAAA,IACzC;AAEA,QAAI,QAAQ,SAAS;AACnB,WAAK,SAAS;AACd,WAAK,QAAQ,yBAAyB,WAAW,oBAAoB,QAAQ;AAAA,IAC/E,OAAO;AACL,WAAK,SAAS;AACd,WAAK,UAAU,yBAAyB,WAAW,oBAAoB,QAAQ,GAAG,QAAQ,QAAQ,KAAK,OAAO,KAAK,KAAK,EAAE;AAAA,IAC5H;AACA,UAAM,KAAK,IAAI;AAAA,EACjB;AAEA,SAAO,EAAE,OAAO,QAAQ;AAC1B;AAMA,eAAsB,uBACpB,UACA,SAC8D;AAC9D,QAAM,QAA0B,CAAC;AACjC,QAAM,SAAS,kBAAkB,UAAU,OAAO;AAElD,QAAM,EAAE,SAAS,MAAM,YAAY,IAAI,MAAM,qBAAqB,QAAQ,OAAO;AACjF,QAAM,KAAK,WAAW;AAEtB,MAAI,CAAC,YAAY,UAAU,CAAC,QAAQ,MAAM,SAAS,kBAAkB,GAAG;AACtE,WAAO,EAAE,OAAO,QAAQ;AAAA,EAC1B;AAGA,QAAM,EAAE,QAAQ,gBAAgB,MAAM,MAAM,IAAI,MAAM;AAAA,IACpD;AAAA,IACA;AAAA,IACA,YACE,OAAO,eAAe;AAAA,MACpB,iBAAiB,iBAAiB,KAAK,IAAI,CAAC;AAAA,MAC5C,gBAAgB,EAAE,MAAM,iBAAiB,KAAK,uBAAuB;AAAA,MACrE,YAAY,IAAI,KAAK,KAAK,IAAI,IAAI,MAAS,EAAE,YAAY;AAAA;AAAA,MACzD,UAAU,IAAI,KAAK,KAAK,IAAI,IAAI,KAAQ,EAAE,YAAY;AAAA;AAAA,MACtD,UAAU;AAAA,QACR;AAAA,UACE,YAAY;AAAA,UACZ,QAAQ;AAAA,UACR,mBAAmB;AAAA,QACrB;AAAA,MACF;AAAA,IACF,CAAqC;AAAA,EACzC;AAEA,MAAI,CAAC,gBAAgB;AAEnB,UAAM,SAAS;AACf,UAAM,UAAU;AAAA,EAClB,WAAW,eAAe,SAAS;AACjC,UAAM,SAAS;AACf,UAAM,QAAQ;AAAA,EAChB,OAAO;AACL,UAAM,SAAS;AACf,UAAM,UAAU,sDAAsD,eAAe,QAAQ,KAAK,eAAe,KAAK,KAAK,EAAE;AAAA,EAC/H;AACA,QAAM,KAAK,KAAK;AAGhB,QAAM,EAAE,QAAQ,WAAW,MAAM,MAAM,IAAI,MAAM;AAAA,IAC/C;AAAA,IACA;AAAA,IACA,YACE,OAAO,eAAe;AAAA,MACpB,iBAAiB,cAAc,KAAK,IAAI,CAAC;AAAA,MACzC,gBAAgB,EAAE,MAAM,mBAAmB,KAAK,uBAAuB;AAAA,MACvE,YAAY,IAAI,KAAK,KAAK,IAAI,IAAI,KAAQ,EAAE,YAAY;AAAA;AAAA,MACxD,UAAU,IAAI,KAAK,KAAK,IAAI,IAAI,MAAS,EAAE,YAAY;AAAA;AAAA,MACvD,UAAU;AAAA,QACR;AAAA,UACE,YAAY;AAAA,UACZ,QAAQ;AAAA,UACR,mBAAmB;AAAA,QACrB;AAAA,MACF;AAAA,IACF,CAAqC;AAAA,EACzC;AAEA,MAAI,CAAC,WAAW;AAEd,UAAM,SAAS;AACf,UAAM,UAAU;AAAA,EAClB,WAAW,UAAU,SAAS;AAC5B,UAAM,SAAS;AACf,UAAM,UAAU;AAAA,EAClB,OAAO;AACL,UAAM,SAAS;AACf,UAAM,UAAU,wCAAwC,UAAU,QAAQ,KAAK,UAAU,KAAK,KAAK,EAAE;AAAA,EACvG;AACA,QAAM,KAAK,KAAK;AAEhB,SAAO,EAAE,OAAO,QAAQ;AAC1B;AAMA,eAAsB,qBACpB,UACA,SAC8D;AAC9D,QAAM,QAA0B,CAAC;AACjC,QAAM,SAAS,kBAAkB,UAAU,OAAO;AAElD,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,MAAI,QAAQ,MAAM,SAAS,cAAc,GAAG;AAC1C,UAAM,EAAE,QAAQ,cAAc,MAAM,MAAM,IAAI,MAAM;AAAA,MAClD;AAAA,MACA;AAAA,MACA,YACE,OAAO,YAAY;AAAA,QACjB,aAAa;AAAA,QACb,OAAO;AAAA,MACT,CAAkC;AAAA,IACtC;AAEA,UAAM,uBAAwB,cAAc,MAA0C;AACtF,QAAI,cAAc,WAAW,sBAAsB,QAAQ;AACzD,YAAM,UAAU,WAAW,qBAAqB,MAAM;AAAA,IACxD,WAAW,gBAAgB,CAAC,aAAa,SAAS;AAChD,YAAM,UAAU;AAAA,IAClB;AACA,UAAM,KAAK,KAAK;AAGhB,UAAM,EAAE,QAAQ,eAAe,MAAM,MAAM,IAAI,MAAM;AAAA,MACnD;AAAA,MACA;AAAA,MACA,YACE,OAAO,YAAY;AAAA,QACjB,aAAa;AAAA,QACb,OAAO;AAAA,QACP,OAAO,aAAa,OAAO;AAAA,MAC7B,CAAkC;AAAA,IACtC;AAEA,UAAM,EAAE,QAAQ,WAAW,IAAI,MAAM;AAAA,MACnC;AAAA,MACA;AAAA,MACA,YACE,OAAO,YAAY;AAAA,QACjB,aAAa;AAAA,QACb,OAAO;AAAA,QACP,OAAO,aAAa,OAAO;AAAA,MAC7B,CAAkC;AAAA,IACtC;AAEA,UAAM,mBAAoB,eAAe,MAA0C;AACnF,UAAM,gBAAiB,YAAY,MAA0C;AAC7E,UAAM,gBAAgB,kBAAkB,UAAU;AAClD,UAAM,aAAa,eAAe,UAAU;AAE5C,QAAI,gBAAgB,YAAY;AAC9B,YAAM,SAAS;AACf,YAAM,UAAU,6BAA6B,aAAa,WAAW,UAAU;AAAA,IACjF,WAAW,kBAAkB,cAAc,aAAa,GAAG;AACzD,YAAM,SAAS;AACf,YAAM,UAAU,gCAAgC,aAAa,WAAW,UAAU;AAAA,IACpF,OAAO;AACL,YAAM,UAAU,qCAAqC,aAAa,WAAW,UAAU;AAAA,IACzF;AACA,UAAM,KAAK,KAAK;AAAA,EAClB;AAEA,SAAO,EAAE,OAAO,QAAQ;AAC1B;AAMA,eAAsB,wBACpB,UACA,SAC8D;AAC9D,QAAM,QAA0B,CAAC;AACjC,QAAM,SAAS,kBAAkB,UAAU,OAAO;AAElD,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,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,QAAI,QAAQ,WAAW,QAAQ,MAAM;AACnC,YAAM,OAAO,OAAO;AACpB,YAAM,mBAAoB,KAAK,qBAAqB,CAAC;AACrD,YAAM,SAAmB,CAAC;AAG1B,eAAS,IAAI,GAAG,IAAI,iBAAiB,QAAQ,KAAK;AAChD,YAAI,iBAAiB,CAAC,MAAM,UAAa,iBAAiB,CAAC,MAAM,MAAM;AACrE,iBAAO,KAAK,qBAAqB,CAAC,QAAQ,OAAO,iBAAiB,CAAC,CAAC,CAAC,EAAE;AAAA,QACzE;AAAA,MACF;AAEA,UAAI,OAAO,SAAS,GAAG;AACrB,aAAK,SAAS;AACd,aAAK,QAAQ,6BAA6B,OAAO,MAAM,GAAG,CAAC,EAAE,KAAK,IAAI,CAAC;AACvE,aAAK,mBAAmB,KAAK;AAAA,UAC3B;AAAA,YACE,QAAQ,OAAO,MAAM,GAAG,EAAE;AAAA,YAC1B,yBAAyB,iBAAiB;AAAA,UAC5C;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF,OAAO;AACL,aAAK,UAAU,iCAAiC,iBAAiB,MAAM;AAAA,MACzE;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,gBAAgB,GAAG;AAC5C,UAAM,EAAE,QAAQ,KAAK,IAAI,MAAM;AAAA,MAC7B;AAAA,MACA;AAAA,MACA,YAAY,OAAO,cAAc,CAAC,CAAC;AAAA,IACrC;AAEA,QAAI,QAAQ,WAAW,QAAQ,MAAM;AACnC,YAAM,OAAO,OAAO;AACpB,YAAM,YAAY,KAAK,aAAa,CAAC;AACrC,YAAM,eAAe,KAAK;AAC1B,YAAM,gBAAgB,cAAc;AACpC,YAAM,WAAW,cAAc,YAAY,UAAU;AAErD,UAAI,kBAAkB,UAAa,gBAAgB,KAAK,aAAa,GAAG;AACtE,aAAK,SAAS;AACd,aAAK,QAAQ,kCAAkC,aAAa,iBAAiB,QAAQ;AAAA,MACvF,WAAW,aAAa,UAAU,QAAQ;AACxC,aAAK,SAAS;AACd,aAAK,QAAQ,sBAAsB,QAAQ,yBAAyB,UAAU,MAAM;AAAA,MACtF,OAAO;AACL,aAAK,UAAU,0BAA0B,UAAU,MAAM;AAAA,MAC3D;AAAA,IACF;AACA,UAAM,KAAK,IAAI;AAAA,EACjB;AAEA,SAAO,EAAE,OAAO,QAAQ;AAC1B;","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../../../src/lib/testing/scenarios/edge-cases.ts"],"sourcesContent":["/**\n * Edge Case Testing Scenarios\n *\n * Tests various edge cases, error handling, and validation:\n * - Error handling (invalid inputs, non-existent IDs)\n * - Schema validation (negative values, invalid enums)\n * - Pricing edge cases (auction vs fixed, min spend, floor prices)\n * - Behavior analysis\n * - Temporal validation\n * - Response consistency\n *\n * These scenarios are designed to find bugs and ensure agents\n * properly handle edge cases according to the AdCP spec.\n */\n\nimport type { Product, PricingOption } from '../../types/core.generated';\nimport type {\n CreateMediaBuyRequest,\n GetProductsRequest,\n SyncCreativesRequest,\n GetMediaBuyDeliveryRequest,\n GetProductsResponse,\n ListCreativesResponse,\n} from '../../types/tools.generated';\nimport type { TestOptions, TestStepResult, AgentProfile, TaskResult } from '../types';\nimport { getOrCreateClient, runStep, resolveBrand, resolveAccount, getOrDiscoverProfile } from '../client';\nimport { testDiscovery } from './discovery';\n\n/**\n * Test: Error Handling\n * Verifies the agent returns proper discriminated union error responses\n */\nexport async function testErrorHandling(\n agentUrl: string,\n options: TestOptions\n): Promise<{ steps: TestStepResult[]; profile?: AgentProfile }> {\n const steps: TestStepResult[] = [];\n const client = getOrCreateClient(agentUrl, options);\n\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 // Test 1: Invalid product_id in create_media_buy\n if (profile.tools.includes('create_media_buy')) {\n const { result, step } = await runStep<TaskResult>(\n 'Invalid product_id error response',\n 'create_media_buy',\n async () =>\n client.createMediaBuy({\n idempotency_key: `error-test-${Date.now()}`,\n brand_manifest: {\n name: 'Error Test Brand',\n url: 'https://test.example',\n },\n start_time: new Date(Date.now() + 86400000).toISOString(),\n end_time: new Date(Date.now() + 604800000).toISOString(),\n packages: [\n {\n product_id: 'NONEXISTENT_PRODUCT_ID_12345',\n budget: 1000,\n pricing_option_id: 'nonexistent-pricing',\n },\n ],\n } as unknown as CreateMediaBuyRequest) as Promise<TaskResult>\n );\n\n if (result?.success) {\n step.passed = false;\n step.error = 'Agent accepted invalid product_id - should have returned error';\n } else {\n // !result (threw) or result.success === false — both count as rejection\n step.passed = true;\n step.details = `Agent correctly rejected invalid product_id${result?.error ? `: ${result.error}` : ''}`;\n if (result?.error) step.response_preview = JSON.stringify({ error: result.error }, null, 2);\n }\n steps.push(step);\n }\n\n // Test 2: Missing required field in get_products\n if (profile.tools.includes('get_products')) {\n const { result, step } = await runStep<TaskResult>(\n 'Empty request handling',\n 'get_products',\n async () => client.getProducts({} as unknown as GetProductsRequest) as Promise<TaskResult>\n );\n\n if (result?.success) {\n step.passed = true;\n step.details = 'Agent accepts empty get_products request (permissive)';\n } else {\n // !result (threw) or result.success === false — both mean stricter validation\n step.passed = true;\n step.details = `Agent requires brief or brand (stricter validation)${result?.error ? `: ${result.error}` : ''}`;\n if (result?.error) step.response_preview = JSON.stringify({ error: result.error }, null, 2);\n }\n steps.push(step);\n }\n\n // Test 3: Invalid format_id in sync_creatives\n if (profile.tools.includes('sync_creatives')) {\n const { result, step } = await runStep<TaskResult>(\n 'Invalid format_id error response',\n 'sync_creatives',\n async () =>\n client.syncCreatives({\n account: resolveAccount(options),\n creatives: [\n {\n creative_id: `invalid-format-test-${Date.now()}`,\n name: 'Invalid Format Test',\n format_id: { id: 'TOTALLY_INVALID_FORMAT_ID_999' },\n assets: {\n primary: {\n url: 'https://via.placeholder.com/300x250',\n width: 300,\n height: 250,\n format: 'png',\n },\n },\n },\n ],\n } as unknown as SyncCreativesRequest) as Promise<TaskResult>\n );\n\n if (result?.success) {\n step.passed = true;\n step.details = 'Agent accepts unknown format_ids (permissive mode)';\n } else {\n // !result (threw) or result.success === false — both count as rejection\n step.passed = true;\n step.details = `Agent correctly rejected invalid format_id${result?.error ? `: ${result.error}` : ''}`;\n if (result?.error) step.response_preview = JSON.stringify({ error: result.error }, null, 2);\n }\n steps.push(step);\n }\n\n // Test 4: get_media_buy_delivery with non-existent media_buy_id\n if (profile.tools.includes('get_media_buy_delivery')) {\n const { result, step } = await runStep<TaskResult>(\n 'Non-existent media_buy_id error',\n 'get_media_buy_delivery',\n async () =>\n client.getMediaBuyDelivery({\n media_buy_ids: ['NONEXISTENT_MEDIA_BUY_ID_99999'],\n } as unknown as GetMediaBuyDeliveryRequest) as Promise<TaskResult>\n );\n\n if (result?.success) {\n const data = result.data as unknown as Record<string, unknown> | undefined;\n const deliveries = (data?.deliveries || data?.media_buys || []) as unknown[];\n if (deliveries.length === 0) {\n step.passed = true;\n step.details = 'Agent returned empty deliveries for non-existent media buy';\n } else {\n step.passed = false;\n step.error = 'Agent returned deliveries for non-existent media_buy_id';\n }\n } else {\n // !result (threw) or result.success === false — both count as rejection\n step.passed = true;\n step.details = `Agent correctly returned error for non-existent media buy${result?.error ? `: ${result.error}` : ''}`;\n if (result?.error) step.response_preview = JSON.stringify({ error: result.error }, null, 2);\n }\n steps.push(step);\n }\n\n return { steps, profile };\n}\n\n/**\n * Test: Validation\n * Tests that agents properly validate inputs and reject malformed requests\n */\nexport async function testValidation(\n agentUrl: string,\n options: TestOptions\n): Promise<{ steps: TestStepResult[]; profile?: AgentProfile }> {\n const steps: TestStepResult[] = [];\n const client = getOrCreateClient(agentUrl, options);\n\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 // Test 1: Invalid enum value for pacing\n if (profile.tools.includes('create_media_buy')) {\n const { result, step } = await runStep<TaskResult>(\n 'Invalid pacing enum value',\n 'create_media_buy',\n async () =>\n client.createMediaBuy({\n idempotency_key: `validation-test-${Date.now()}`,\n brand_manifest: { name: 'Validation Test', url: 'https://test.example' },\n start_time: new Date(Date.now() + 86400000).toISOString(),\n end_time: new Date(Date.now() + 604800000).toISOString(),\n packages: [\n {\n product_id: 'test-product',\n budget: 1000,\n pricing_option_id: 'test-pricing',\n pacing: 'INVALID_PACING_VALUE' as unknown as string,\n },\n ],\n } as unknown as CreateMediaBuyRequest) as Promise<TaskResult>\n );\n\n if (result?.success) {\n step.passed = false;\n step.error = 'Agent accepted invalid pacing value - should validate enums';\n } else {\n step.passed = true;\n step.details = `Agent rejected invalid pacing enum value${result?.error ? `: ${result.error}` : ''}`;\n }\n steps.push(step);\n }\n\n // Test 2: Negative budget (definitely invalid)\n if (profile.tools.includes('create_media_buy')) {\n const { result, step } = await runStep<TaskResult>(\n 'Negative budget rejection',\n 'create_media_buy',\n async () =>\n client.createMediaBuy({\n idempotency_key: `negative-budget-test-${Date.now()}`,\n brand_manifest: { name: 'Negative Budget Test', url: 'https://test.example' },\n start_time: new Date(Date.now() + 86400000).toISOString(),\n end_time: new Date(Date.now() + 604800000).toISOString(),\n packages: [\n {\n product_id: 'test-product',\n budget: -500,\n pricing_option_id: 'test-pricing',\n },\n ],\n } as unknown as CreateMediaBuyRequest) as Promise<TaskResult>\n );\n\n if (result?.success) {\n step.passed = false;\n step.error = 'CRITICAL: Agent accepted negative budget - must validate minimum: 0';\n } else {\n step.passed = true;\n step.details = `Agent correctly rejected negative budget${result?.error ? `: ${result.error}` : ''}`;\n }\n steps.push(step);\n }\n\n // Test 3: Invalid creative weight (> 100)\n if (profile.tools.includes('sync_creatives')) {\n const { result, step } = await runStep<TaskResult>(\n 'Invalid creative weight (> 100)',\n 'sync_creatives',\n async () =>\n client.syncCreatives({\n account: resolveAccount(options),\n creatives: [\n {\n creative_id: `weight-test-${Date.now()}`,\n name: 'Weight Test Creative',\n format_id: { agent_url: 'https://creative.adcontextprotocol.org', id: 'display_300x250' },\n weight: 150,\n assets: {\n primary: {\n url: 'https://via.placeholder.com/300x250',\n width: 300,\n height: 250,\n format: 'png',\n },\n },\n },\n ],\n } as unknown as SyncCreativesRequest) as Promise<TaskResult>\n );\n\n if (result?.success) {\n step.passed = false;\n step.error = 'Agent accepted weight > 100 - should validate maximum: 100';\n } else {\n step.passed = true;\n step.details = `Agent rejected weight > 100${result?.error ? `: ${result.error}` : ''}`;\n }\n steps.push(step);\n }\n\n // Test 4: Empty creatives array\n if (profile.tools.includes('sync_creatives')) {\n const { result, step } = await runStep<TaskResult>(\n 'Empty creatives array handling',\n 'sync_creatives',\n async () =>\n client.syncCreatives({\n account: resolveAccount(options),\n creatives: [],\n } as unknown as SyncCreativesRequest) as Promise<TaskResult>\n );\n\n if (result?.success) {\n step.passed = true;\n step.details = 'Agent accepts empty creatives array (returns empty result)';\n } else {\n // !result (threw) or result.success === false — both mean agent rejected\n step.passed = true;\n step.details = `Agent rejected empty creatives array${result?.error ? `: ${result.error}` : ''}`;\n }\n steps.push(step);\n }\n\n return { steps, profile };\n}\n\n/**\n * Test: Pricing Edge Cases\n * Tests auction vs fixed pricing, min spend requirements, bid_price handling\n */\nexport async function testPricingEdgeCases(\n agentUrl: string,\n options: TestOptions\n): Promise<{ steps: TestStepResult[]; profile?: AgentProfile }> {\n const steps: TestStepResult[] = [];\n const client = getOrCreateClient(agentUrl, options);\n\n const { steps: discoverySteps, profile } = await testDiscovery(agentUrl, options);\n steps.push(...discoverySteps);\n\n if (!profile?.tools.includes('create_media_buy') || !profile?.tools.includes('get_products')) {\n steps.push({\n step: 'Pricing edge cases',\n passed: false,\n duration_ms: 0,\n error: 'Agent does not support create_media_buy or get_products',\n });\n return { steps, profile };\n }\n\n // Get products to find actual pricing options\n const { result: productsResult } = await runStep<TaskResult>(\n 'Fetch products for pricing analysis',\n 'get_products',\n async () =>\n client.getProducts({\n buying_mode: 'brief',\n brief: 'Show all products with pricing details',\n brand: resolveBrand(options),\n } as unknown as GetProductsRequest) as Promise<TaskResult>\n );\n\n const productsData = productsResult?.data as GetProductsResponse | undefined;\n const products = productsData?.products;\n if (!products?.length) {\n steps.push({\n step: 'Pricing edge cases',\n passed: false,\n duration_ms: 0,\n error: 'No products available for pricing tests',\n });\n return { steps, profile };\n }\n\n // Analyze products for auction vs fixed pricing\n const auctionProducts: { product: Product; pricingOption: PricingOption }[] = [];\n const fixedProducts: { product: Product; pricingOption: PricingOption }[] = [];\n const productsWithMinSpend: { product: Product; pricingOption: PricingOption; minSpend: number }[] = [];\n\n for (const product of products) {\n for (const po of product.pricing_options || []) {\n if (!('fixed_price' in po) && (po.floor_price !== undefined || po.price_guidance !== undefined)) {\n auctionProducts.push({ product, pricingOption: po });\n } else if ('fixed_price' in po) {\n fixedProducts.push({ product, pricingOption: po });\n }\n if (po.min_spend_per_package != null && po.min_spend_per_package > 0) {\n productsWithMinSpend.push({\n product,\n pricingOption: po,\n minSpend: po.min_spend_per_package,\n });\n }\n }\n }\n\n steps.push({\n step: 'Analyze pricing options',\n passed: true,\n duration_ms: 0,\n details: `Found ${fixedProducts.length} fixed, ${auctionProducts.length} auction, ${productsWithMinSpend.length} with min spend`,\n });\n\n // Test 1: Auction pricing without bid_price (should fail)\n if (auctionProducts.length > 0) {\n const { product, pricingOption } = auctionProducts[0]!;\n const { result, step } = await runStep<TaskResult>(\n 'Auction pricing without bid_price',\n 'create_media_buy',\n async () =>\n client.createMediaBuy({\n idempotency_key: `auction-no-bid-${Date.now()}`,\n brand_manifest: { name: 'Auction Test', url: 'https://test.example' },\n start_time: new Date(Date.now() + 86400000).toISOString(),\n end_time: new Date(Date.now() + 604800000).toISOString(),\n packages: [\n {\n product_id: product.product_id,\n budget: 5000,\n pricing_option_id: pricingOption.pricing_option_id,\n },\n ],\n } as unknown as CreateMediaBuyRequest) as Promise<TaskResult>\n );\n\n if (result?.success) {\n step.passed = false;\n step.error = 'Agent accepted auction pricing without bid_price - should require it';\n } else {\n step.passed = true;\n step.details = `Agent correctly requires bid_price for auction pricing${result?.error ? `: ${result.error}` : ''}`;\n }\n steps.push(step);\n }\n\n // Test 2: Budget below min_spend_per_package\n if (productsWithMinSpend.length > 0) {\n const { product, pricingOption, minSpend } = productsWithMinSpend[0]!;\n const underBudget = minSpend * 0.5;\n\n const { result, step } = await runStep<TaskResult>(\n 'Budget below min_spend_per_package',\n 'create_media_buy',\n async () =>\n client.createMediaBuy({\n idempotency_key: `under-min-spend-${Date.now()}`,\n brand_manifest: { name: 'Min Spend Test', url: 'https://test.example' },\n start_time: new Date(Date.now() + 86400000).toISOString(),\n end_time: new Date(Date.now() + 604800000).toISOString(),\n packages: [\n {\n product_id: product.product_id,\n budget: underBudget,\n pricing_option_id: pricingOption.pricing_option_id,\n },\n ],\n } as unknown as CreateMediaBuyRequest) as Promise<TaskResult>\n );\n\n if (result?.success) {\n step.passed = false;\n step.error = `Agent accepted budget ${underBudget} below min_spend ${minSpend}`;\n } else {\n step.passed = true;\n step.details = `Agent rejected budget ${underBudget} below min_spend ${minSpend}${result?.error ? `: ${result.error}` : ''}`;\n }\n steps.push(step);\n }\n\n return { steps, profile };\n}\n\n/**\n * Test: Temporal Validation\n * Tests date/time ordering and format validation\n */\nexport async function testTemporalValidation(\n agentUrl: string,\n options: TestOptions\n): Promise<{ steps: TestStepResult[]; profile?: AgentProfile }> {\n const steps: TestStepResult[] = [];\n const client = getOrCreateClient(agentUrl, options);\n\n const { profile, step: profileStep } = await getOrDiscoverProfile(client, options);\n steps.push(profileStep);\n\n if (!profileStep.passed || !profile.tools.includes('create_media_buy')) {\n return { steps, profile };\n }\n\n // Test 1: End time before start time\n const { result: endBeforeStart, step: step1 } = await runStep<TaskResult>(\n 'End time before start time',\n 'create_media_buy',\n async () =>\n client.createMediaBuy({\n idempotency_key: `temporal-test-${Date.now()}`,\n brand_manifest: { name: 'Temporal Test', url: 'https://test.example' },\n start_time: new Date(Date.now() + 604800000).toISOString(), // 7 days from now\n end_time: new Date(Date.now() + 86400000).toISOString(), // 1 day from now (before start!)\n packages: [\n {\n product_id: 'test-product',\n budget: 1000,\n pricing_option_id: 'test-pricing',\n },\n ],\n } as unknown as CreateMediaBuyRequest) as Promise<TaskResult>\n );\n\n if (!endBeforeStart) {\n // runStep caught an exception — agent rejected at transport level, which counts as rejection\n step1.passed = true;\n step1.details = `Agent rejected end_time before start_time (threw error)`;\n } else if (endBeforeStart.success) {\n step1.passed = false;\n step1.error = 'Agent accepted end_time before start_time - must validate';\n } else {\n step1.passed = true;\n step1.details = `Agent correctly rejected end_time before start_time${endBeforeStart.error ? `: ${endBeforeStart.error}` : ''}`;\n }\n steps.push(step1);\n\n // Test 2: Start time in the past\n const { result: pastStart, step: step2 } = await runStep<TaskResult>(\n 'Start time in the past',\n 'create_media_buy',\n async () =>\n client.createMediaBuy({\n idempotency_key: `past-start-${Date.now()}`,\n brand_manifest: { name: 'Past Start Test', url: 'https://test.example' },\n start_time: new Date(Date.now() - 86400000).toISOString(), // Yesterday\n end_time: new Date(Date.now() + 604800000).toISOString(), // 7 days from now\n packages: [\n {\n product_id: 'test-product',\n budget: 1000,\n pricing_option_id: 'test-pricing',\n },\n ],\n } as unknown as CreateMediaBuyRequest) as Promise<TaskResult>\n );\n\n if (!pastStart) {\n // runStep caught an exception — agent rejected at transport level\n step2.passed = true;\n step2.details = 'Agent rejected start_time in the past (threw error)';\n } else if (pastStart.success) {\n step2.passed = true;\n step2.details = 'Agent accepts start_time in past (may auto-adjust)';\n } else {\n step2.passed = true;\n step2.details = `Agent rejected start_time in the past${pastStart.error ? `: ${pastStart.error}` : ''}`;\n }\n steps.push(step2);\n\n return { steps, profile };\n}\n\n/**\n * Test: Behavior Analysis\n * Analyzes agent behavioral characteristics\n */\nexport async function testBehaviorAnalysis(\n agentUrl: string,\n options: TestOptions\n): Promise<{ steps: TestStepResult[]; profile?: AgentProfile }> {\n const steps: TestStepResult[] = [];\n const client = getOrCreateClient(agentUrl, options);\n\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 // Test 1: Does get_products require brand?\n if (profile.tools.includes('get_products')) {\n const { result: withoutBrand, step: step1 } = await runStep<TaskResult>(\n 'get_products without brand',\n 'get_products',\n async () =>\n client.getProducts({\n buying_mode: 'brief',\n brief: 'Show me all available products',\n } as unknown as GetProductsRequest) as Promise<TaskResult>\n );\n\n const withoutBrandProducts = (withoutBrand?.data as GetProductsResponse | undefined)?.products;\n if (withoutBrand?.success && withoutBrandProducts?.length) {\n step1.details = `Returns ${withoutBrandProducts.length} products without brand`;\n } else if (withoutBrand && !withoutBrand.success) {\n step1.details = 'Requires brand for product discovery';\n }\n steps.push(step1);\n\n // Test 2: Are results filtered by brief?\n const { result: specificBrief, step: step2 } = await runStep<TaskResult>(\n 'get_products with specific brief',\n 'get_products',\n async () =>\n client.getProducts({\n buying_mode: 'brief',\n brief: 'Looking specifically for podcast audio advertising only',\n brand: resolveBrand(options),\n } as unknown as GetProductsRequest) as Promise<TaskResult>\n );\n\n const { result: broadBrief } = await runStep<TaskResult>(\n 'get_products with broad brief',\n 'get_products',\n async () =>\n client.getProducts({\n buying_mode: 'brief',\n brief: 'Show all products across all channels and formats',\n brand: resolveBrand(options),\n } as unknown as GetProductsRequest) as Promise<TaskResult>\n );\n\n const specificProducts = (specificBrief?.data as GetProductsResponse | undefined)?.products;\n const broadProducts = (broadBrief?.data as GetProductsResponse | undefined)?.products;\n const specificCount = specificProducts?.length || 0;\n const broadCount = broadProducts?.length || 0;\n\n if (specificCount < broadCount) {\n step2.passed = true;\n step2.details = `Brief filtering: specific=${specificCount}, broad=${broadCount} (filtered)`;\n } else if (specificCount === broadCount && broadCount > 0) {\n step2.passed = true;\n step2.details = `No brief filtering: specific=${specificCount}, broad=${broadCount} (same)`;\n } else {\n step2.details = `Brief filtering unclear: specific=${specificCount}, broad=${broadCount}`;\n }\n steps.push(step2);\n }\n\n return { steps, profile };\n}\n\n/**\n * Test: Response Consistency\n * Checks for schema errors, pagination bugs, data mismatches\n */\nexport async function testResponseConsistency(\n agentUrl: string,\n options: TestOptions\n): Promise<{ steps: TestStepResult[]; profile?: AgentProfile }> {\n const steps: TestStepResult[] = [];\n const client = getOrCreateClient(agentUrl, options);\n\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 // Test list_authorized_properties consistency\n if (profile.tools.includes('list_authorized_properties')) {\n const { result, step } = await runStep<TaskResult>(\n 'Check list_authorized_properties consistency',\n 'list_authorized_properties',\n async () => client.executeTask('list_authorized_properties', {}) as Promise<TaskResult>\n );\n\n if (result?.success && result?.data) {\n const data = result.data as unknown as Record<string, unknown>;\n const publisherDomains = (data.publisher_domains || []) as unknown[];\n const issues: string[] = [];\n\n // Check for undefined elements\n for (let i = 0; i < publisherDomains.length; i++) {\n if (publisherDomains[i] === undefined || publisherDomains[i] === null) {\n issues.push(`publisher_domains[${i}] is ${String(publisherDomains[i])}`);\n }\n }\n\n if (issues.length > 0) {\n step.passed = false;\n step.error = `Schema validation errors: ${issues.slice(0, 3).join(', ')}`;\n step.response_preview = JSON.stringify(\n {\n issues: issues.slice(0, 10),\n publisher_domains_count: publisherDomains.length,\n },\n null,\n 2\n );\n } else {\n step.details = `Publisher domains consistent: ${publisherDomains.length} domain(s)`;\n }\n } else if (result && !result.success) {\n step.passed = false;\n step.error = result.error || 'list_authorized_properties failed';\n }\n steps.push(step);\n }\n\n // Test list_creatives pagination consistency\n if (profile.tools.includes('list_creatives')) {\n const { result, step } = await runStep<TaskResult>(\n 'Check list_creatives pagination consistency',\n 'list_creatives',\n async () => client.listCreatives({}) as Promise<TaskResult>\n );\n\n if (result?.success && result?.data) {\n const data = result.data as ListCreativesResponse;\n const creatives = data.creatives || [];\n const querySummary = data.query_summary;\n const totalMatching = querySummary?.total_matching;\n const returned = querySummary?.returned ?? creatives.length;\n\n if (totalMatching !== undefined && totalMatching > 0 && returned === 0) {\n step.passed = false;\n step.error = `Pagination bug: total_matching=${totalMatching} but returned=${returned}`;\n } else if (returned !== creatives.length) {\n step.passed = false;\n step.error = `Mismatch: returned=${returned} but creatives.length=${creatives.length}`;\n } else {\n step.details = `Pagination consistent: ${creatives.length} creatives`;\n }\n }\n steps.push(step);\n }\n\n return { steps, profile };\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 { getOrDiscoverProfile, getOrCreateClient } from "../client.mjs";
|
|
8
2
|
import { callMCPToolRaw } from "../../protocols/mcp.mjs";
|
|
9
3
|
import { extractAdcpErrorFromMcp, resolveRecovery } from "../../utils/error-extraction.mjs";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/lib/testing/scenarios/error-compliance.ts"],"sourcesContent":["/**\n * Error Compliance Scenarios\n *\n * Tests that agents return properly structured AdCP errors\n * per the transport error mapping spec. Grades agents on\n * compliance level (L1/L2/L3) based on error response quality.\n */\n\nimport type { TestOptions, TestStepResult, AgentProfile } from '../types';\nimport { getOrDiscoverProfile, getOrCreateClient } from '../client';\nimport { callMCPToolRaw } from '../../protocols/mcp';\nimport { extractAdcpErrorFromMcp, resolveRecovery } from '../../utils/error-extraction';\nimport type { ExtractedAdcpError } from '../../utils/error-extraction';\nimport { isStandardErrorCode } from '../../types/error-codes';\n\n/**\n * AdCP spec-defined codes that are held for a future wire version and\n * therefore absent from `ErrorCodeValues` in the current generated enum, but\n * are explicitly sanctioned by the spec and must not require the `X_` vendor\n * prefix. Remove a code from this set once it lands in `ErrorCodeValues` via\n * schema codegen.\n */\nconst SPEC_RESERVED_PENDING_CODES = new Set(['IDEMPOTENCY_IN_FLIGHT']);\n\n/** Raw MCP CallToolResult shape */\ninterface RawMcpResponse {\n isError?: boolean;\n content?: Array<{ type: string; text?: string }>;\n structuredContent?: Record<string, unknown>;\n}\n\n/** Provocation definition: what to send and what error to expect */\ninterface ErrorProvocation {\n name: string;\n tool: string;\n args: Record<string, unknown>;\n /** Expected standard error codes (any match counts) */\n expectedCodes: string[];\n /** Expected recovery classification */\n expectedRecovery: 'correctable' | 'transient' | 'terminal';\n /** Which field the error should point to */\n expectedField?: string;\n}\n\n/** Build fresh provocations per test run (avoids stale timestamps from module load) */\nfunction createProvocations(): ErrorProvocation[] {\n const now = Date.now();\n return [\n {\n name: 'Nonexistent product_id',\n tool: 'create_media_buy',\n args: {\n idempotency_key: `error-compliance-${now}`,\n start_time: new Date(now + 86400000).toISOString(),\n end_time: new Date(now + 604800000).toISOString(),\n packages: [\n {\n product_id: 'NONEXISTENT_PRODUCT_ID_12345',\n budget: 1000,\n pricing_option_id: 'nonexistent-pricing',\n },\n ],\n },\n expectedCodes: ['PRODUCT_NOT_FOUND', 'INVALID_REQUEST'],\n expectedRecovery: 'correctable',\n expectedField: 'packages[0].product_id',\n },\n {\n name: 'Negative budget',\n tool: 'create_media_buy',\n args: {\n idempotency_key: `error-compliance-neg-${now}`,\n start_time: new Date(now + 86400000).toISOString(),\n end_time: new Date(now + 604800000).toISOString(),\n packages: [\n {\n product_id: 'test-product',\n budget: -500,\n pricing_option_id: 'test-pricing',\n },\n ],\n },\n expectedCodes: ['INVALID_REQUEST', 'BUDGET_TOO_LOW'],\n expectedRecovery: 'correctable',\n expectedField: 'packages[0].budget',\n },\n {\n name: 'End time before start time',\n tool: 'create_media_buy',\n args: {\n idempotency_key: `error-compliance-temporal-${now}`,\n start_time: new Date(now + 604800000).toISOString(),\n end_time: new Date(now + 86400000).toISOString(),\n packages: [\n {\n product_id: 'test-product',\n budget: 1000,\n pricing_option_id: 'test-pricing',\n },\n ],\n },\n expectedCodes: ['INVALID_REQUEST'],\n expectedRecovery: 'correctable',\n expectedField: 'end_time',\n },\n ];\n}\n\n/**\n * Test: Error Codes — validates standard AdCP error code usage\n */\nexport async function testErrorCodes(\n agentUrl: string,\n options: TestOptions\n): Promise<{ steps: TestStepResult[]; profile?: AgentProfile }> {\n const steps: TestStepResult[] = [];\n const client = getOrCreateClient(agentUrl, options);\n\n const { profile, step: profileStep } = await getOrDiscoverProfile(client, options);\n steps.push(profileStep);\n if (!profileStep.passed) return { steps, profile };\n\n const authToken = options.auth?.type === 'bearer' ? options.auth.token : undefined;\n const headers: Record<string, string> = {};\n\n let correctCodes = 0;\n let totalChecked = 0;\n\n const provocations = createProvocations();\n for (const provocation of provocations) {\n if (!profile.tools.includes(provocation.tool)) continue;\n\n const start = Date.now();\n totalChecked++;\n\n try {\n const rawResponse = (await callMCPToolRaw(\n agentUrl,\n provocation.tool,\n provocation.args,\n authToken,\n [],\n headers\n )) as RawMcpResponse | undefined;\n\n const extracted = extractAdcpErrorFromMcp(rawResponse as RawMcpResponse);\n\n if (!rawResponse?.isError && !extracted) {\n // Agent accepted a bad request — that's a failure regardless of error structure\n steps.push({\n step: provocation.name,\n task: provocation.tool,\n passed: false,\n duration_ms: Date.now() - start,\n error: `Agent accepted invalid request (expected rejection with ${provocation.expectedCodes.join(' or ')})`,\n });\n continue;\n }\n\n if (!extracted) {\n steps.push({\n step: provocation.name,\n task: provocation.tool,\n passed: false,\n duration_ms: Date.now() - start,\n error: 'Agent rejected request but returned no structured AdCP error',\n details: 'L0: Unstructured error response',\n });\n continue;\n }\n\n const codeMatch = provocation.expectedCodes.includes(extracted.code);\n const recovery = resolveRecovery(extracted);\n const recoveryMatch = recovery === provocation.expectedRecovery;\n const passed = codeMatch && recoveryMatch;\n\n if (codeMatch) correctCodes++;\n\n const errors: string[] = [];\n if (!codeMatch) errors.push(`Expected code ${provocation.expectedCodes.join('|')}, got ${extracted.code}`);\n if (!recoveryMatch) errors.push(`Expected recovery ${provocation.expectedRecovery}, got ${recovery}`);\n\n steps.push({\n step: provocation.name,\n task: provocation.tool,\n passed,\n duration_ms: Date.now() - start,\n details: [\n `L${extracted.compliance_level}: ${extracted.code}`,\n `recovery=${recovery}`,\n extracted.field ? `field=${extracted.field}` : null,\n extracted.suggestion ? 'has suggestion' : null,\n ]\n .filter(Boolean)\n .join(', '),\n error: errors.length > 0 ? errors.join('; ') : undefined,\n response_preview: JSON.stringify(\n {\n code: extracted.code,\n recovery: extracted.recovery,\n field: extracted.field,\n compliance_level: extracted.compliance_level,\n source: extracted.source,\n },\n null,\n 2\n ),\n });\n } catch (error) {\n steps.push({\n step: provocation.name,\n task: provocation.tool,\n passed: false,\n duration_ms: Date.now() - start,\n error: `Transport error: ${error instanceof Error ? error.message : String(error)}`,\n });\n }\n }\n\n if (totalChecked === 0) {\n steps.push({\n step: 'Error code validation',\n passed: false,\n duration_ms: 0,\n error: 'No testable tools found (agent needs create_media_buy)',\n });\n }\n\n return { steps, profile };\n}\n\n/**\n * Test: Error Structure — validates error JSON matches error.json schema\n */\nexport async function testErrorStructure(\n agentUrl: string,\n options: TestOptions\n): Promise<{ steps: TestStepResult[]; profile?: AgentProfile }> {\n const steps: TestStepResult[] = [];\n const client = getOrCreateClient(agentUrl, options);\n\n const { profile, step: profileStep } = await getOrDiscoverProfile(client, options);\n steps.push(profileStep);\n if (!profileStep.passed) return { steps, profile };\n\n if (!profile.tools.includes('create_media_buy')) {\n steps.push({\n step: 'Error structure validation',\n passed: false,\n duration_ms: 0,\n error: 'Agent does not support create_media_buy (needed to provoke errors)',\n });\n return { steps, profile };\n }\n\n const authToken = options.auth?.type === 'bearer' ? options.auth.token : undefined;\n const headers: Record<string, string> = {};\n\n const start = Date.now();\n // Use first provocation to get an error response\n const provocation = createProvocations()[0]!;\n\n try {\n const rawResponse = await callMCPToolRaw(agentUrl, provocation.tool, provocation.args, authToken, [], headers);\n\n const extracted = extractAdcpErrorFromMcp(rawResponse as RawMcpResponse);\n if (!extracted) {\n steps.push({\n step: 'Error structure validation',\n task: provocation.tool,\n passed: false,\n duration_ms: Date.now() - start,\n error: 'No structured error to validate',\n });\n return { steps, profile };\n }\n\n const issues: string[] = [];\n\n // Required fields\n if (typeof extracted.code !== 'string' || !extracted.code) {\n issues.push('code must be a non-empty string');\n }\n if (typeof extracted.message !== 'string') {\n issues.push('message must be a string');\n }\n\n // Optional field types\n if (extracted.recovery !== undefined && !['transient', 'correctable', 'terminal'].includes(extracted.recovery)) {\n issues.push(`recovery must be transient|correctable|terminal, got '${extracted.recovery}'`);\n }\n if (\n extracted.retry_after !== undefined &&\n (typeof extracted.retry_after !== 'number' || extracted.retry_after < 0)\n ) {\n issues.push('retry_after must be a non-negative number');\n }\n if (extracted.field !== undefined && typeof extracted.field !== 'string') {\n issues.push('field must be a string');\n }\n if (extracted.suggestion !== undefined && typeof extracted.suggestion !== 'string') {\n issues.push('suggestion must be a string');\n }\n\n // Code is standard?\n if (\n !isStandardErrorCode(extracted.code) &&\n !extracted.code.startsWith('X_') &&\n !SPEC_RESERVED_PENDING_CODES.has(extracted.code)\n ) {\n issues.push(`Non-standard code '${extracted.code}' should use X_ vendor prefix`);\n }\n\n steps.push({\n step: 'Error structure validation',\n task: provocation.tool,\n passed: issues.length === 0,\n duration_ms: Date.now() - start,\n details:\n issues.length === 0\n ? `Valid error structure: code=${extracted.code}, L${extracted.compliance_level}`\n : undefined,\n error: issues.length > 0 ? issues.join('; ') : undefined,\n });\n } catch (error) {\n steps.push({\n step: 'Error structure validation',\n task: provocation.tool,\n passed: false,\n duration_ms: Date.now() - start,\n error: `Transport error: ${error instanceof Error ? error.message : String(error)}`,\n });\n }\n\n return { steps, profile };\n}\n\n/**\n * Test: Error Transport — validates transport binding compliance\n */\nexport async function testErrorTransport(\n agentUrl: string,\n options: TestOptions\n): Promise<{ steps: TestStepResult[]; profile?: AgentProfile }> {\n const steps: TestStepResult[] = [];\n const client = getOrCreateClient(agentUrl, options);\n\n const { profile, step: profileStep } = await getOrDiscoverProfile(client, options);\n steps.push(profileStep);\n if (!profileStep.passed) return { steps, profile };\n\n if (!profile.tools.includes('create_media_buy')) {\n steps.push({\n step: 'Error transport validation',\n passed: false,\n duration_ms: 0,\n error: 'Agent does not support create_media_buy (needed to provoke errors)',\n });\n return { steps, profile };\n }\n\n const authToken = options.auth?.type === 'bearer' ? options.auth.token : undefined;\n const headers: Record<string, string> = {};\n\n const start = Date.now();\n const provocation = createProvocations()[0]!;\n\n try {\n const rawResponse = (await callMCPToolRaw(agentUrl, provocation.tool, provocation.args, authToken, [], headers)) as\n | RawMcpResponse\n | undefined;\n\n const hasIsError = rawResponse?.isError === true;\n const structured = rawResponse?.structuredContent as Record<string, unknown> | undefined;\n const hasStructuredContent = !!structured?.adcp_error;\n\n // Check JSON text fallback\n let hasTextJson = false;\n if (Array.isArray(rawResponse?.content)) {\n for (const item of rawResponse.content) {\n if (item?.type === 'text' && typeof item.text === 'string') {\n try {\n const parsed = JSON.parse(item.text);\n if (parsed?.adcp_error) hasTextJson = true;\n } catch {\n /* not JSON */\n }\n }\n }\n }\n\n // Check consistency between layers\n let consistent = true;\n if (hasStructuredContent && hasTextJson) {\n const adcpError = (structured?.adcp_error ?? {}) as Record<string, unknown>;\n for (const item of rawResponse?.content ?? []) {\n if (item?.type === 'text' && item.text) {\n try {\n const parsed = JSON.parse(item.text);\n if (parsed?.adcp_error?.code !== adcpError.code) {\n consistent = false;\n }\n } catch {\n /* skip */\n }\n }\n }\n }\n\n // Determine compliance level — each layer requires the layers below it\n let level = 0;\n if (hasIsError) level = 1;\n if (hasIsError && hasTextJson) level = 2;\n if (hasIsError && hasTextJson && hasStructuredContent) level = 3;\n\n const details: string[] = [];\n details.push(`isError: ${hasIsError}`);\n details.push(`structuredContent.adcp_error: ${hasStructuredContent}`);\n details.push(`JSON text fallback: ${hasTextJson}`);\n if (hasStructuredContent && hasTextJson) {\n details.push(`consistent: ${consistent}`);\n }\n details.push(`Compliance Level: L${level}`);\n\n // L3 is the expected default (agents using adcpError() get this for free)\n steps.push({\n step: 'Error transport validation',\n task: provocation.tool,\n passed: level >= 2,\n duration_ms: Date.now() - start,\n details: details.join(', '),\n error:\n level < 2\n ? 'Error response missing JSON text fallback. Use adcpError() from @adcp/sdk for L3 compliance.'\n : undefined,\n response_preview: JSON.stringify(\n {\n isError: hasIsError,\n hasStructuredContent,\n hasTextJson,\n consistent,\n compliance_level: level,\n },\n null,\n 2\n ),\n });\n } catch (error) {\n steps.push({\n step: 'Error transport validation',\n task: provocation.tool,\n passed: false,\n duration_ms: Date.now() - start,\n error: `Transport error: ${error instanceof Error ? error.message : String(error)}`,\n });\n }\n\n return { steps, profile };\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../../../src/lib/testing/scenarios/error-compliance.ts"],"sourcesContent":["/**\n * Error Compliance Scenarios\n *\n * Tests that agents return properly structured AdCP errors\n * per the transport error mapping spec. Grades agents on\n * compliance level (L1/L2/L3) based on error response quality.\n */\n\nimport type { TestOptions, TestStepResult, AgentProfile } from '../types';\nimport { getOrDiscoverProfile, getOrCreateClient } from '../client';\nimport { callMCPToolRaw } from '../../protocols/mcp';\nimport { extractAdcpErrorFromMcp, resolveRecovery } from '../../utils/error-extraction';\nimport type { ExtractedAdcpError } from '../../utils/error-extraction';\nimport { isStandardErrorCode } from '../../types/error-codes';\n\n/**\n * AdCP spec-defined codes that are held for a future wire version and\n * therefore absent from `ErrorCodeValues` in the current generated enum, but\n * are explicitly sanctioned by the spec and must not require the `X_` vendor\n * prefix. Remove a code from this set once it lands in `ErrorCodeValues` via\n * schema codegen.\n */\nconst SPEC_RESERVED_PENDING_CODES = new Set(['IDEMPOTENCY_IN_FLIGHT']);\n\n/** Raw MCP CallToolResult shape */\ninterface RawMcpResponse {\n isError?: boolean;\n content?: Array<{ type: string; text?: string }>;\n structuredContent?: Record<string, unknown>;\n}\n\n/** Provocation definition: what to send and what error to expect */\ninterface ErrorProvocation {\n name: string;\n tool: string;\n args: Record<string, unknown>;\n /** Expected standard error codes (any match counts) */\n expectedCodes: string[];\n /** Expected recovery classification */\n expectedRecovery: 'correctable' | 'transient' | 'terminal';\n /** Which field the error should point to */\n expectedField?: string;\n}\n\n/** Build fresh provocations per test run (avoids stale timestamps from module load) */\nfunction createProvocations(): ErrorProvocation[] {\n const now = Date.now();\n return [\n {\n name: 'Nonexistent product_id',\n tool: 'create_media_buy',\n args: {\n idempotency_key: `error-compliance-${now}`,\n start_time: new Date(now + 86400000).toISOString(),\n end_time: new Date(now + 604800000).toISOString(),\n packages: [\n {\n product_id: 'NONEXISTENT_PRODUCT_ID_12345',\n budget: 1000,\n pricing_option_id: 'nonexistent-pricing',\n },\n ],\n },\n expectedCodes: ['PRODUCT_NOT_FOUND', 'INVALID_REQUEST'],\n expectedRecovery: 'correctable',\n expectedField: 'packages[0].product_id',\n },\n {\n name: 'Negative budget',\n tool: 'create_media_buy',\n args: {\n idempotency_key: `error-compliance-neg-${now}`,\n start_time: new Date(now + 86400000).toISOString(),\n end_time: new Date(now + 604800000).toISOString(),\n packages: [\n {\n product_id: 'test-product',\n budget: -500,\n pricing_option_id: 'test-pricing',\n },\n ],\n },\n expectedCodes: ['INVALID_REQUEST', 'BUDGET_TOO_LOW'],\n expectedRecovery: 'correctable',\n expectedField: 'packages[0].budget',\n },\n {\n name: 'End time before start time',\n tool: 'create_media_buy',\n args: {\n idempotency_key: `error-compliance-temporal-${now}`,\n start_time: new Date(now + 604800000).toISOString(),\n end_time: new Date(now + 86400000).toISOString(),\n packages: [\n {\n product_id: 'test-product',\n budget: 1000,\n pricing_option_id: 'test-pricing',\n },\n ],\n },\n expectedCodes: ['INVALID_REQUEST'],\n expectedRecovery: 'correctable',\n expectedField: 'end_time',\n },\n ];\n}\n\n/**\n * Test: Error Codes — validates standard AdCP error code usage\n */\nexport async function testErrorCodes(\n agentUrl: string,\n options: TestOptions\n): Promise<{ steps: TestStepResult[]; profile?: AgentProfile }> {\n const steps: TestStepResult[] = [];\n const client = getOrCreateClient(agentUrl, options);\n\n const { profile, step: profileStep } = await getOrDiscoverProfile(client, options);\n steps.push(profileStep);\n if (!profileStep.passed) return { steps, profile };\n\n const authToken = options.auth?.type === 'bearer' ? options.auth.token : undefined;\n const headers: Record<string, string> = {};\n\n let correctCodes = 0;\n let totalChecked = 0;\n\n const provocations = createProvocations();\n for (const provocation of provocations) {\n if (!profile.tools.includes(provocation.tool)) continue;\n\n const start = Date.now();\n totalChecked++;\n\n try {\n const rawResponse = (await callMCPToolRaw(\n agentUrl,\n provocation.tool,\n provocation.args,\n authToken,\n [],\n headers\n )) as RawMcpResponse | undefined;\n\n const extracted = extractAdcpErrorFromMcp(rawResponse as RawMcpResponse);\n\n if (!rawResponse?.isError && !extracted) {\n // Agent accepted a bad request — that's a failure regardless of error structure\n steps.push({\n step: provocation.name,\n task: provocation.tool,\n passed: false,\n duration_ms: Date.now() - start,\n error: `Agent accepted invalid request (expected rejection with ${provocation.expectedCodes.join(' or ')})`,\n });\n continue;\n }\n\n if (!extracted) {\n steps.push({\n step: provocation.name,\n task: provocation.tool,\n passed: false,\n duration_ms: Date.now() - start,\n error: 'Agent rejected request but returned no structured AdCP error',\n details: 'L0: Unstructured error response',\n });\n continue;\n }\n\n const codeMatch = provocation.expectedCodes.includes(extracted.code);\n const recovery = resolveRecovery(extracted);\n const recoveryMatch = recovery === provocation.expectedRecovery;\n const passed = codeMatch && recoveryMatch;\n\n if (codeMatch) correctCodes++;\n\n const errors: string[] = [];\n if (!codeMatch) errors.push(`Expected code ${provocation.expectedCodes.join('|')}, got ${extracted.code}`);\n if (!recoveryMatch) errors.push(`Expected recovery ${provocation.expectedRecovery}, got ${recovery}`);\n\n steps.push({\n step: provocation.name,\n task: provocation.tool,\n passed,\n duration_ms: Date.now() - start,\n details: [\n `L${extracted.compliance_level}: ${extracted.code}`,\n `recovery=${recovery}`,\n extracted.field ? `field=${extracted.field}` : null,\n extracted.suggestion ? 'has suggestion' : null,\n ]\n .filter(Boolean)\n .join(', '),\n error: errors.length > 0 ? errors.join('; ') : undefined,\n response_preview: JSON.stringify(\n {\n code: extracted.code,\n recovery: extracted.recovery,\n field: extracted.field,\n compliance_level: extracted.compliance_level,\n source: extracted.source,\n },\n null,\n 2\n ),\n });\n } catch (error) {\n steps.push({\n step: provocation.name,\n task: provocation.tool,\n passed: false,\n duration_ms: Date.now() - start,\n error: `Transport error: ${error instanceof Error ? error.message : String(error)}`,\n });\n }\n }\n\n if (totalChecked === 0) {\n steps.push({\n step: 'Error code validation',\n passed: false,\n duration_ms: 0,\n error: 'No testable tools found (agent needs create_media_buy)',\n });\n }\n\n return { steps, profile };\n}\n\n/**\n * Test: Error Structure — validates error JSON matches error.json schema\n */\nexport async function testErrorStructure(\n agentUrl: string,\n options: TestOptions\n): Promise<{ steps: TestStepResult[]; profile?: AgentProfile }> {\n const steps: TestStepResult[] = [];\n const client = getOrCreateClient(agentUrl, options);\n\n const { profile, step: profileStep } = await getOrDiscoverProfile(client, options);\n steps.push(profileStep);\n if (!profileStep.passed) return { steps, profile };\n\n if (!profile.tools.includes('create_media_buy')) {\n steps.push({\n step: 'Error structure validation',\n passed: false,\n duration_ms: 0,\n error: 'Agent does not support create_media_buy (needed to provoke errors)',\n });\n return { steps, profile };\n }\n\n const authToken = options.auth?.type === 'bearer' ? options.auth.token : undefined;\n const headers: Record<string, string> = {};\n\n const start = Date.now();\n // Use first provocation to get an error response\n const provocation = createProvocations()[0]!;\n\n try {\n const rawResponse = await callMCPToolRaw(agentUrl, provocation.tool, provocation.args, authToken, [], headers);\n\n const extracted = extractAdcpErrorFromMcp(rawResponse as RawMcpResponse);\n if (!extracted) {\n steps.push({\n step: 'Error structure validation',\n task: provocation.tool,\n passed: false,\n duration_ms: Date.now() - start,\n error: 'No structured error to validate',\n });\n return { steps, profile };\n }\n\n const issues: string[] = [];\n\n // Required fields\n if (typeof extracted.code !== 'string' || !extracted.code) {\n issues.push('code must be a non-empty string');\n }\n if (typeof extracted.message !== 'string') {\n issues.push('message must be a string');\n }\n\n // Optional field types\n if (extracted.recovery !== undefined && !['transient', 'correctable', 'terminal'].includes(extracted.recovery)) {\n issues.push(`recovery must be transient|correctable|terminal, got '${extracted.recovery}'`);\n }\n if (\n extracted.retry_after !== undefined &&\n (typeof extracted.retry_after !== 'number' || extracted.retry_after < 0)\n ) {\n issues.push('retry_after must be a non-negative number');\n }\n if (extracted.field !== undefined && typeof extracted.field !== 'string') {\n issues.push('field must be a string');\n }\n if (extracted.suggestion !== undefined && typeof extracted.suggestion !== 'string') {\n issues.push('suggestion must be a string');\n }\n\n // Code is standard?\n if (\n !isStandardErrorCode(extracted.code) &&\n !extracted.code.startsWith('X_') &&\n !SPEC_RESERVED_PENDING_CODES.has(extracted.code)\n ) {\n issues.push(`Non-standard code '${extracted.code}' should use X_ vendor prefix`);\n }\n\n steps.push({\n step: 'Error structure validation',\n task: provocation.tool,\n passed: issues.length === 0,\n duration_ms: Date.now() - start,\n details:\n issues.length === 0\n ? `Valid error structure: code=${extracted.code}, L${extracted.compliance_level}`\n : undefined,\n error: issues.length > 0 ? issues.join('; ') : undefined,\n });\n } catch (error) {\n steps.push({\n step: 'Error structure validation',\n task: provocation.tool,\n passed: false,\n duration_ms: Date.now() - start,\n error: `Transport error: ${error instanceof Error ? error.message : String(error)}`,\n });\n }\n\n return { steps, profile };\n}\n\n/**\n * Test: Error Transport — validates transport binding compliance\n */\nexport async function testErrorTransport(\n agentUrl: string,\n options: TestOptions\n): Promise<{ steps: TestStepResult[]; profile?: AgentProfile }> {\n const steps: TestStepResult[] = [];\n const client = getOrCreateClient(agentUrl, options);\n\n const { profile, step: profileStep } = await getOrDiscoverProfile(client, options);\n steps.push(profileStep);\n if (!profileStep.passed) return { steps, profile };\n\n if (!profile.tools.includes('create_media_buy')) {\n steps.push({\n step: 'Error transport validation',\n passed: false,\n duration_ms: 0,\n error: 'Agent does not support create_media_buy (needed to provoke errors)',\n });\n return { steps, profile };\n }\n\n const authToken = options.auth?.type === 'bearer' ? options.auth.token : undefined;\n const headers: Record<string, string> = {};\n\n const start = Date.now();\n const provocation = createProvocations()[0]!;\n\n try {\n const rawResponse = (await callMCPToolRaw(agentUrl, provocation.tool, provocation.args, authToken, [], headers)) as\n | RawMcpResponse\n | undefined;\n\n const hasIsError = rawResponse?.isError === true;\n const structured = rawResponse?.structuredContent as Record<string, unknown> | undefined;\n const hasStructuredContent = !!structured?.adcp_error;\n\n // Check JSON text fallback\n let hasTextJson = false;\n if (Array.isArray(rawResponse?.content)) {\n for (const item of rawResponse.content) {\n if (item?.type === 'text' && typeof item.text === 'string') {\n try {\n const parsed = JSON.parse(item.text);\n if (parsed?.adcp_error) hasTextJson = true;\n } catch {\n /* not JSON */\n }\n }\n }\n }\n\n // Check consistency between layers\n let consistent = true;\n if (hasStructuredContent && hasTextJson) {\n const adcpError = (structured?.adcp_error ?? {}) as Record<string, unknown>;\n for (const item of rawResponse?.content ?? []) {\n if (item?.type === 'text' && item.text) {\n try {\n const parsed = JSON.parse(item.text);\n if (parsed?.adcp_error?.code !== adcpError.code) {\n consistent = false;\n }\n } catch {\n /* skip */\n }\n }\n }\n }\n\n // Determine compliance level — each layer requires the layers below it\n let level = 0;\n if (hasIsError) level = 1;\n if (hasIsError && hasTextJson) level = 2;\n if (hasIsError && hasTextJson && hasStructuredContent) level = 3;\n\n const details: string[] = [];\n details.push(`isError: ${hasIsError}`);\n details.push(`structuredContent.adcp_error: ${hasStructuredContent}`);\n details.push(`JSON text fallback: ${hasTextJson}`);\n if (hasStructuredContent && hasTextJson) {\n details.push(`consistent: ${consistent}`);\n }\n details.push(`Compliance Level: L${level}`);\n\n // L3 is the expected default (agents using adcpError() get this for free)\n steps.push({\n step: 'Error transport validation',\n task: provocation.tool,\n passed: level >= 2,\n duration_ms: Date.now() - start,\n details: details.join(', '),\n error:\n level < 2\n ? 'Error response missing JSON text fallback. Use adcpError() from @adcp/sdk for L3 compliance.'\n : undefined,\n response_preview: JSON.stringify(\n {\n isError: hasIsError,\n hasStructuredContent,\n hasTextJson,\n consistent,\n compliance_level: level,\n },\n null,\n 2\n ),\n });\n } catch (error) {\n steps.push({\n step: 'Error transport validation',\n task: provocation.tool,\n passed: false,\n duration_ms: Date.now() - start,\n error: `Transport error: ${error instanceof Error ? error.message : String(error)}`,\n });\n }\n\n return { steps, profile };\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 } from "../client.mjs";
|
|
8
2
|
import { GOVERNANCE_TOOLS } from "../../utils/capabilities.mjs";
|
|
9
3
|
import { GovernanceAgentStub } from "../stubs/index.mjs";
|