@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/conformance/schemaLoader.ts"],"sourcesContent":["import * as fs from 'fs';\nimport * as path from 'path';\nimport type { ConformanceToolName } from './types';\nimport { ADCP_VERSION } from '../version';\nimport { resolveBundleKey } from '../validation/schema-loader';\n\ntype JsonSchema = Record<string, unknown>;\n\nexport interface ConformanceSchemaOptions {\n /** AdCP schema/cache version to load. Defaults to the SDK-pinned version. */\n version?: string;\n /** External schema-data root, e.g. `dist/schemas/latest` or `dist/lib/schemas-data/3.1.0-beta.7`. */\n schemaRoot?: string;\n}\n\ninterface ToolSchemaLocation {\n domain: string;\n fileBase: string;\n}\n\nconst TOOL_SCHEMA_LOCATIONS: Record<ConformanceToolName, ToolSchemaLocation> = {\n // Tier 1\n get_products: { domain: 'media-buy', fileBase: 'get-products' },\n list_creative_formats: { domain: 'media-buy', fileBase: 'list-creative-formats' },\n list_creatives: { domain: 'creative', fileBase: 'list-creatives' },\n get_media_buys: { domain: 'media-buy', fileBase: 'get-media-buys' },\n get_signals: { domain: 'signals', fileBase: 'get-signals' },\n si_get_offering: { domain: 'sponsored-intelligence', fileBase: 'si-get-offering' },\n get_adcp_capabilities: { domain: 'protocol', fileBase: 'get-adcp-capabilities' },\n tasks_list: { domain: 'core', fileBase: 'tasks-list' },\n list_property_lists: { domain: 'property', fileBase: 'list-property-lists' },\n list_content_standards: { domain: 'content-standards', fileBase: 'list-content-standards' },\n get_creative_features: { domain: 'creative', fileBase: 'get-creative-features' },\n // Tier 2 (referential)\n get_media_buy_delivery: { domain: 'media-buy', fileBase: 'get-media-buy-delivery' },\n get_property_list: { domain: 'property', fileBase: 'get-property-list' },\n get_content_standards: { domain: 'content-standards', fileBase: 'get-content-standards' },\n get_creative_delivery: { domain: 'creative', fileBase: 'get-creative-delivery' },\n tasks_get: { domain: 'core', fileBase: 'tasks-get' },\n preview_creative: { domain: 'creative', fileBase: 'preview-creative' },\n // Tier 3 (mutating updates)\n update_media_buy: { domain: 'media-buy', fileBase: 'update-media-buy' },\n update_property_list: { domain: 'property', fileBase: 'update-property-list' },\n update_content_standards: { domain: 'content-standards', fileBase: 'update-content-standards' },\n};\n\n/**\n * Resolve the bundled-schemas directory. Mirrors the validator's loader\n * in `src/lib/validation/schema-loader.ts`: prefer the built tree where\n * `scripts/copy-schemas-to-dist.ts` stages schemas at build time, and\n * fall back to the source cache for local development.\n *\n * Path keys follow the same `resolveBundleKey` rule the validator uses\n * (stable patches collapse to MAJOR.MINOR), so the conformance fuzzer's\n * dist lookup matches what the build script writes.\n *\n * - Built: <pkg>/dist/lib/schemas-data/<bundle-key>/bundled (e.g. `3.0/bundled`)\n * - Source: <pkg>/schemas/cache/<exact-version>/bundled (e.g. `3.0.1/bundled`)\n *\n * The cache fallback uses the exact `ADCP_VERSION` string because cache\n * directories preserve their spec-tag lineage (only the dist layout collapses).\n */\nfunction findBundledDir(options: ConformanceSchemaOptions = {}): string {\n if (options.schemaRoot) {\n const bundled = path.join(options.schemaRoot, 'bundled');\n if (fs.existsSync(bundled)) return bundled;\n if (path.basename(options.schemaRoot) === 'bundled' && fs.existsSync(options.schemaRoot)) return options.schemaRoot;\n throw new Error(`Conformance schema bundle not found at ${options.schemaRoot}. Expected a root with bundled/.`);\n }\n\n const version = options.version ?? ADCP_VERSION;\n const bundleKey = resolveBundleKey(version);\n const distCandidate = path.resolve(__dirname, '..', 'schemas-data', bundleKey, 'bundled');\n if (fs.existsSync(distCandidate)) return distCandidate;\n\n const srcCandidate = path.resolve(__dirname, '..', '..', '..', 'schemas', 'cache', version, 'bundled');\n if (fs.existsSync(srcCandidate)) return srcCandidate;\n\n throw new Error(\n `Conformance schema bundle not found. Looked in ${distCandidate} and ${srcCandidate}. ` +\n `Run \\`npm run sync-schemas && npm run build:lib\\`, or install the current package: \\`npm i @adcp/sdk@latest\\`.`\n );\n}\n\nconst schemaCache = new Map<string, JsonSchema>();\n\nfunction loadSchema(relativePath: string, options: ConformanceSchemaOptions = {}): JsonSchema {\n const bundledDir = findBundledDir(options);\n const cacheKey = `${bundledDir}\\0${relativePath}`;\n const cached = schemaCache.get(cacheKey);\n if (cached) return cached;\n const full = path.join(bundledDir, relativePath);\n const parsed = JSON.parse(fs.readFileSync(full, 'utf8')) as JsonSchema;\n schemaCache.set(cacheKey, parsed);\n return parsed;\n}\n\nexport function loadRequestSchema(tool: ConformanceToolName, options: ConformanceSchemaOptions = {}): JsonSchema {\n const loc = TOOL_SCHEMA_LOCATIONS[tool];\n return loadSchema(`${loc.domain}/${loc.fileBase}-request.json`, options);\n}\n\nexport function loadResponseSchema(tool: ConformanceToolName, options: ConformanceSchemaOptions = {}): JsonSchema {\n const loc = TOOL_SCHEMA_LOCATIONS[tool];\n return loadSchema(`${loc.domain}/${loc.fileBase}-response.json`, options);\n}\n\nexport function hasSchemas(tool: ConformanceToolName, options: ConformanceSchemaOptions = {}): boolean {\n try {\n loadRequestSchema(tool, options);\n loadResponseSchema(tool, options);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * The AdCP schema version the fuzzer loaded. Surfaced on the report so\n * a stored seed is replayable only against a matching snapshot.\n */\nexport function detectSchemaVersion(options: ConformanceSchemaOptions = {}): string {\n if (options.version) return options.version;\n if (options.schemaRoot) {\n const root =\n path.basename(options.schemaRoot) === 'bundled' ? path.dirname(options.schemaRoot) : options.schemaRoot;\n return path.basename(root);\n }\n return ADCP_VERSION;\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../../../src/lib/conformance/schemaLoader.ts"],"sourcesContent":["import { fileURLToPath as __adcpFileURLToPath } from 'node:url';\nimport { dirname as __adcpDirname } from 'node:path';\nimport { createRequire as __adcpCreateRequire } from 'node:module';\nconst __dirname = __adcpDirname(__adcpFileURLToPath(import.meta.url));\nconst require = __adcpCreateRequire(import.meta.url);\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport type { ConformanceToolName } from './types';\nimport { ADCP_VERSION } from '../version';\nimport { resolveBundleKey } from '../validation/schema-loader';\n\ntype JsonSchema = Record<string, unknown>;\n\nexport interface ConformanceSchemaOptions {\n /** AdCP schema/cache version to load. Defaults to the SDK-pinned version. */\n version?: string;\n /** External schema-data root, e.g. `dist/schemas/latest` or `dist/lib/schemas-data/3.1.0-beta.7`. */\n schemaRoot?: string;\n}\n\ninterface ToolSchemaLocation {\n domain: string;\n fileBase: string;\n}\n\nconst TOOL_SCHEMA_LOCATIONS: Record<ConformanceToolName, ToolSchemaLocation> = {\n // Tier 1\n get_products: { domain: 'media-buy', fileBase: 'get-products' },\n list_creative_formats: { domain: 'media-buy', fileBase: 'list-creative-formats' },\n list_creatives: { domain: 'creative', fileBase: 'list-creatives' },\n get_media_buys: { domain: 'media-buy', fileBase: 'get-media-buys' },\n get_signals: { domain: 'signals', fileBase: 'get-signals' },\n si_get_offering: { domain: 'sponsored-intelligence', fileBase: 'si-get-offering' },\n get_adcp_capabilities: { domain: 'protocol', fileBase: 'get-adcp-capabilities' },\n tasks_list: { domain: 'core', fileBase: 'tasks-list' },\n list_property_lists: { domain: 'property', fileBase: 'list-property-lists' },\n list_content_standards: { domain: 'content-standards', fileBase: 'list-content-standards' },\n get_creative_features: { domain: 'creative', fileBase: 'get-creative-features' },\n // Tier 2 (referential)\n get_media_buy_delivery: { domain: 'media-buy', fileBase: 'get-media-buy-delivery' },\n get_property_list: { domain: 'property', fileBase: 'get-property-list' },\n get_content_standards: { domain: 'content-standards', fileBase: 'get-content-standards' },\n get_creative_delivery: { domain: 'creative', fileBase: 'get-creative-delivery' },\n tasks_get: { domain: 'core', fileBase: 'tasks-get' },\n preview_creative: { domain: 'creative', fileBase: 'preview-creative' },\n // Tier 3 (mutating updates)\n update_media_buy: { domain: 'media-buy', fileBase: 'update-media-buy' },\n update_property_list: { domain: 'property', fileBase: 'update-property-list' },\n update_content_standards: { domain: 'content-standards', fileBase: 'update-content-standards' },\n};\n\n/**\n * Resolve the bundled-schemas directory. Mirrors the validator's loader\n * in `src/lib/validation/schema-loader.ts`: prefer the built tree where\n * `scripts/copy-schemas-to-dist.ts` stages schemas at build time, and\n * fall back to the source cache for local development.\n *\n * Path keys follow the same `resolveBundleKey` rule the validator uses\n * (stable patches collapse to MAJOR.MINOR), so the conformance fuzzer's\n * dist lookup matches what the build script writes.\n *\n * - Built: <pkg>/dist/lib/schemas-data/<bundle-key>/bundled (e.g. `3.0/bundled`)\n * - Source: <pkg>/schemas/cache/<exact-version>/bundled (e.g. `3.0.1/bundled`)\n *\n * The cache fallback uses the exact `ADCP_VERSION` string because cache\n * directories preserve their spec-tag lineage (only the dist layout collapses).\n */\nfunction findBundledDir(options: ConformanceSchemaOptions = {}): string {\n if (options.schemaRoot) {\n const bundled = path.join(options.schemaRoot, 'bundled');\n if (fs.existsSync(bundled)) return bundled;\n if (path.basename(options.schemaRoot) === 'bundled' && fs.existsSync(options.schemaRoot)) return options.schemaRoot;\n throw new Error(`Conformance schema bundle not found at ${options.schemaRoot}. Expected a root with bundled/.`);\n }\n\n const version = options.version ?? ADCP_VERSION;\n const bundleKey = resolveBundleKey(version);\n const distCandidate = path.resolve(__dirname, '..', 'schemas-data', bundleKey, 'bundled');\n if (fs.existsSync(distCandidate)) return distCandidate;\n\n const srcCandidate = path.resolve(__dirname, '..', '..', '..', 'schemas', 'cache', version, 'bundled');\n if (fs.existsSync(srcCandidate)) return srcCandidate;\n\n throw new Error(\n `Conformance schema bundle not found. Looked in ${distCandidate} and ${srcCandidate}. ` +\n `Run \\`npm run sync-schemas && npm run build:lib\\`, or install the current package: \\`npm i @adcp/sdk@latest\\`.`\n );\n}\n\nconst schemaCache = new Map<string, JsonSchema>();\n\nfunction loadSchema(relativePath: string, options: ConformanceSchemaOptions = {}): JsonSchema {\n const bundledDir = findBundledDir(options);\n const cacheKey = `${bundledDir}\\0${relativePath}`;\n const cached = schemaCache.get(cacheKey);\n if (cached) return cached;\n const full = path.join(bundledDir, relativePath);\n const parsed = JSON.parse(fs.readFileSync(full, 'utf8')) as JsonSchema;\n schemaCache.set(cacheKey, parsed);\n return parsed;\n}\n\nexport function loadRequestSchema(tool: ConformanceToolName, options: ConformanceSchemaOptions = {}): JsonSchema {\n const loc = TOOL_SCHEMA_LOCATIONS[tool];\n return loadSchema(`${loc.domain}/${loc.fileBase}-request.json`, options);\n}\n\nexport function loadResponseSchema(tool: ConformanceToolName, options: ConformanceSchemaOptions = {}): JsonSchema {\n const loc = TOOL_SCHEMA_LOCATIONS[tool];\n return loadSchema(`${loc.domain}/${loc.fileBase}-response.json`, options);\n}\n\nexport function hasSchemas(tool: ConformanceToolName, options: ConformanceSchemaOptions = {}): boolean {\n try {\n loadRequestSchema(tool, options);\n loadResponseSchema(tool, options);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * The AdCP schema version the fuzzer loaded. Surfaced on the report so\n * a stored seed is replayable only against a matching snapshot.\n */\nexport function detectSchemaVersion(options: ConformanceSchemaOptions = {}): string {\n if (options.version) return options.version;\n if (options.schemaRoot) {\n const root =\n path.basename(options.schemaRoot) === 'bundled' ? path.dirname(options.schemaRoot) : options.schemaRoot;\n return path.basename(root);\n }\n return ADCP_VERSION;\n}\n"],"mappings":"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","names":["require"]}
|
|
@@ -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 { AgentClient } from "../core/AgentClient.mjs";
|
|
8
2
|
import { generateIdempotencyKey } from "../utils/idempotency.mjs";
|
|
9
3
|
const UNIQUE_TAG = () => "cf_seed_" + Math.random().toString(36).slice(2, 10);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/lib/conformance/seeder.ts"],"sourcesContent":["import { AgentClient } from '../core/AgentClient';\nimport type { AgentConfig } from '../types';\nimport { generateIdempotencyKey } from '../utils/idempotency';\nimport type { ConformanceFixtures } from './types';\n\nexport interface SeedOptions {\n /** Protocol. Default: 'mcp'. */\n protocol?: 'mcp' | 'a2a';\n /** Bearer token forwarded to the agent. */\n authToken?: string;\n /** Full AgentConfig override. `id`/`agent_uri`/`protocol` are filled in from the other options. */\n agentConfig?: Partial<AgentConfig>;\n /**\n * Subset of seeders to run. Default: all.\n * `'create_media_buy'` implicitly runs `get_products` first to discover\n * a real product_id. `'sync_creatives'` implicitly runs\n * `list_creative_formats` first to pick a usable format.\n */\n seeders?: readonly SeederName[];\n /**\n * Brand reference for mutating seeders that require one. Default\n * `{ domain: 'conformance.example' }`. Sellers that enforce brand\n * allowlists should override this with a domain they're configured to\n * accept — otherwise `create_media_buy` seeding warns and falls through.\n */\n brand?: { domain: string; brand_id?: string };\n}\n\nexport type SeederName = 'create_property_list' | 'create_content_standards' | 'create_media_buy' | 'sync_creatives';\n\nexport interface SeedResult {\n fixtures: ConformanceFixtures;\n warnings: SeedWarning[];\n}\n\nexport interface SeedWarning {\n seeder: SeederName;\n reason: string;\n}\n\n// Cosmetic tag for human-readable names/labels only. NOT used for\n// idempotency_key — that's minted by `generateIdempotencyKey()`. Two\n// seeders racing with the same random suffix would produce two distinct\n// entities with identical names, which is fine for a seeder.\nconst UNIQUE_TAG = (): string => 'cf_seed_' + Math.random().toString(36).slice(2, 10);\n\n/**\n * Seeds an agent with known entities so Tier-3 fuzzing has real IDs to\n * feed back into referential + update tools. Each seeder is best-effort:\n * failures degrade to a recorded warning and an empty pool, never a\n * thrown exception, so a partial seed still lets the fuzzer run against\n * every other tool.\n *\n * Inputs are minimal hand-crafted payloads rather than fast-check\n * outputs — seeding is about producing a known-good entity, not\n * exploring the schema space. That's the job of runConformance.\n *\n * WARNING: This mutates the target. Point at a sandbox / test tenant.\n */\nexport async function seedFixtures(agentUrl: string, options: SeedOptions = {}): Promise<SeedResult> {\n const agent = buildAgent(agentUrl, options);\n const seeders =\n options.seeders ??\n (['create_property_list', 'create_content_standards', 'create_media_buy', 'sync_creatives'] as const);\n\n const ctx: SeederContext = {\n agent,\n brand: options.brand ?? { domain: 'conformance.example' },\n };\n\n const fixtures: ConformanceFixtures = {};\n const warnings: SeedWarning[] = [];\n\n for (const name of seeders) {\n try {\n const runner = SEEDERS[name];\n if (!runner) {\n warnings.push({ seeder: name, reason: `no seeder registered for ${name}` });\n continue;\n }\n const out = await runner(ctx);\n mergePool(fixtures, out.ids);\n warnings.push(...out.warnings);\n } catch (err) {\n warnings.push({ seeder: name, reason: `seeder threw: ${(err as Error)?.message ?? String(err)}` });\n }\n }\n\n return { fixtures, warnings };\n}\n\ninterface SeederContext {\n agent: AgentClient;\n brand: { domain: string; brand_id?: string };\n}\n\nfunction buildAgent(agentUrl: string, options: SeedOptions): AgentClient {\n const config: AgentConfig = {\n id: options.agentConfig?.id ?? 'conformance-seeder',\n name: options.agentConfig?.name ?? 'AdCP Conformance Seeder',\n agent_uri: agentUrl,\n protocol: options.protocol ?? options.agentConfig?.protocol ?? 'mcp',\n auth_token: options.authToken ?? options.agentConfig?.auth_token,\n ...options.agentConfig,\n };\n // The seeder tries every seed-tool regardless of declared capabilities.\n // Two SDK preflights are explicitly disabled:\n // - `validateFeatures: false` — don't refuse tools that aren't\n // declared in `get_adcp_capabilities`. The seeder just tries; the\n // agent's rejection becomes a recorded warning.\n // - `validation.responses: 'warn'` — don't fail a seed just because\n // the agent's response drifts from the response schema. We want\n // the ID if it's present; the fuzzer itself will do the strict\n // validation on downstream tools that actually care.\n return new AgentClient(config, {\n validateFeatures: false,\n validation: { responses: 'warn' },\n });\n}\n\nfunction mergePool(dest: ConformanceFixtures, src: Partial<Record<keyof ConformanceFixtures, string[]>>): void {\n for (const [key, values] of Object.entries(src)) {\n if (!values || values.length === 0) continue;\n const k = key as keyof ConformanceFixtures;\n const existing = dest[k] ?? [];\n dest[k] = [...existing, ...values];\n }\n}\n\ninterface SeederOutput {\n ids: Partial<Record<keyof ConformanceFixtures, string[]>>;\n warnings: SeedWarning[];\n}\ntype Seeder = (ctx: SeederContext) => Promise<SeederOutput>;\n\nconst SEEDERS: Record<SeederName, Seeder> = {\n create_property_list: seedPropertyList,\n create_content_standards: seedContentStandards,\n create_media_buy: seedMediaBuy,\n sync_creatives: seedSyncCreatives,\n};\n\nasync function seedPropertyList({ agent }: SeederContext): Promise<SeederOutput> {\n const result = await agent.executeTask('create_property_list', {\n idempotency_key: generateIdempotencyKey(),\n name: `Conformance Seeder List ${UNIQUE_TAG()}`,\n });\n if (!result.success || result.status !== 'completed' || !result.data) {\n return {\n ids: {},\n warnings: [{ seeder: 'create_property_list', reason: summarizeResult(result) }],\n };\n }\n const listId = (result.data as { list?: { list_id?: unknown } })?.list?.list_id;\n if (typeof listId !== 'string' || listId.length === 0) {\n return {\n ids: {},\n warnings: [{ seeder: 'create_property_list', reason: 'response missing list.list_id' }],\n };\n }\n return { ids: { list_ids: [listId] }, warnings: [] };\n}\n\nasync function seedContentStandards({ agent }: SeederContext): Promise<SeederOutput> {\n // Minimal payload that still satisfies the \"at least one of policy,\n // policies, or registry_policy_ids is required\" invariant some sellers\n // enforce beyond the raw schema. A single inline policy is the most\n // portable shape — registry_policy_ids require a pre-existing registry\n // entry on the seller, which we can't assume.\n const result = await agent.executeTask('create_content_standards', {\n idempotency_key: generateIdempotencyKey(),\n scope: { languages_any: ['en'] },\n policies: [\n {\n policy_id: `cf_policy_${UNIQUE_TAG()}`,\n enforcement: 'may',\n policy: 'Conformance seeder placeholder policy — advisory only.',\n },\n ],\n });\n if (!result.success || result.status !== 'completed' || !result.data) {\n return {\n ids: {},\n warnings: [{ seeder: 'create_content_standards', reason: summarizeResult(result) }],\n };\n }\n const standardsId = (result.data as { standards_id?: unknown })?.standards_id;\n if (typeof standardsId !== 'string' || standardsId.length === 0) {\n return {\n ids: {},\n warnings: [{ seeder: 'create_content_standards', reason: 'response missing standards_id' }],\n };\n }\n return { ids: { standards_ids: [standardsId] }, warnings: [] };\n}\n\n/**\n * Creates a media buy by first discovering a product via `get_products`,\n * then calling `create_media_buy` against that product. Captures the\n * returned `media_buy_id` and any `package_id`s from the response.\n */\nasync function seedMediaBuy({ agent, brand }: SeederContext): Promise<SeederOutput> {\n const warnings: SeedWarning[] = [];\n const products = await agent.executeTask('get_products', {\n brief: 'Conformance fuzzer seed — any product acceptable',\n });\n if (!products.success || products.status !== 'completed' || !products.data) {\n return {\n ids: {},\n warnings: [{ seeder: 'create_media_buy', reason: 'get_products preflight: ' + summarizeResult(products) }],\n };\n }\n const productList = (products.data as { products?: unknown })?.products;\n if (!Array.isArray(productList) || productList.length === 0) {\n return {\n ids: {},\n warnings: [{ seeder: 'create_media_buy', reason: 'get_products returned no products' }],\n };\n }\n const product = productList[0] as {\n product_id?: string;\n pricing_options?: Array<{ pricing_option_id?: string }>;\n };\n if (!product.product_id || !product.pricing_options?.[0]?.pricing_option_id) {\n return {\n ids: {},\n warnings: [{ seeder: 'create_media_buy', reason: 'first product missing product_id or pricing_option_id' }],\n };\n }\n\n const tag = UNIQUE_TAG();\n const now = new Date();\n const start = new Date(now.getTime() + 24 * 60 * 60 * 1000); // +1 day\n const end = new Date(now.getTime() + 8 * 24 * 60 * 60 * 1000); // +8 days\n\n const brandRef: Record<string, string> = { domain: brand.domain };\n if (brand.brand_id) brandRef.brand_id = brand.brand_id;\n const result = await agent.executeTask('create_media_buy', {\n idempotency_key: generateIdempotencyKey(),\n account: { brand: brandRef, operator: brand.domain },\n brand: brandRef,\n start_time: start.toISOString(),\n end_time: end.toISOString(),\n total_budget: { amount: 100, currency: 'USD' },\n packages: [\n {\n buyer_ref: `cf_pkg_${tag}`,\n product_id: product.product_id,\n pricing_option_id: product.pricing_options[0].pricing_option_id,\n budget: 100,\n },\n ],\n });\n\n if (!result.success || result.status !== 'completed' || !result.data) {\n return {\n ids: {},\n warnings: [...warnings, { seeder: 'create_media_buy', reason: summarizeResult(result) }],\n };\n }\n\n const data = result.data as {\n media_buy_id?: unknown;\n packages?: Array<{ package_id?: unknown }>;\n };\n const ids: Partial<Record<keyof ConformanceFixtures, string[]>> = {};\n if (typeof data.media_buy_id === 'string' && data.media_buy_id.length > 0) {\n ids.media_buy_ids = [data.media_buy_id];\n } else {\n warnings.push({ seeder: 'create_media_buy', reason: 'response missing media_buy_id (may be submitted async)' });\n }\n const packageIds = (data.packages ?? [])\n .map(p => p?.package_id)\n .filter((id): id is string => typeof id === 'string' && id.length > 0);\n if (packageIds.length > 0) ids.package_ids = packageIds;\n\n return { ids, warnings };\n}\n\nfunction summarizeResult(result: {\n success: boolean;\n status?: string;\n error?: string;\n adcpError?: { code?: string };\n}): string {\n if (result.success === false) {\n const code = result.adcpError?.code ? `${result.adcpError.code}: ` : '';\n return `agent rejected with ${code}${result.error ?? 'unknown error'}`;\n }\n return `unexpected status ${result.status ?? 'unknown'}`;\n}\n\n/**\n * Creates a single creative by first discovering formats via\n * `list_creative_formats`, picking the first format whose required\n * assets are all covered by our placeholder synthesis, then calling\n * `sync_creatives` with a minimal manifest. Captures returned\n * `creative_id`s into the pool.\n */\nasync function seedSyncCreatives({ agent, brand }: SeederContext): Promise<SeederOutput> {\n const warnings: SeedWarning[] = [];\n const formatsResult = await agent.executeTask('list_creative_formats', {});\n if (!formatsResult.success || formatsResult.status !== 'completed' || !formatsResult.data) {\n return {\n ids: {},\n warnings: [\n { seeder: 'sync_creatives', reason: 'list_creative_formats preflight: ' + summarizeResult(formatsResult) },\n ],\n };\n }\n const formats = (formatsResult.data as { formats?: unknown }).formats;\n if (!Array.isArray(formats) || formats.length === 0) {\n return { ids: {}, warnings: [{ seeder: 'sync_creatives', reason: 'list_creative_formats returned no formats' }] };\n }\n\n const picked = pickSimpleFormat(formats as FormatDef[]);\n if (!picked) {\n return {\n ids: {},\n warnings: [{ seeder: 'sync_creatives', reason: 'no format with a synthesizable required-asset set' }],\n };\n }\n\n const manifest = synthesizeManifestAssets(picked);\n const creativeId = `cf_creative_${UNIQUE_TAG()}`;\n const tag = UNIQUE_TAG();\n\n const result = await agent.executeTask('sync_creatives', {\n idempotency_key: generateIdempotencyKey(),\n account: {\n brand: { domain: brand.domain, ...(brand.brand_id ? { brand_id: brand.brand_id } : {}) },\n operator: brand.domain,\n },\n creatives: [\n {\n creative_id: creativeId,\n name: `Conformance Seeder Creative ${tag}`,\n format_id: { agent_url: picked.format_id.agent_url, id: picked.format_id.id },\n assets: manifest,\n },\n ],\n });\n\n if (!result.success || result.status !== 'completed' || !result.data) {\n return { ids: {}, warnings: [...warnings, { seeder: 'sync_creatives', reason: summarizeResult(result) }] };\n }\n\n const capturedIds = extractCreativeIds(result.data, creativeId);\n if (capturedIds.length === 0) {\n warnings.push({\n seeder: 'sync_creatives',\n reason: 'response did not surface a creative_id (may be pending review)',\n });\n return { ids: {}, warnings };\n }\n return { ids: { creative_ids: capturedIds }, warnings };\n}\n\n/**\n * Pick the first format whose required assets are all in the set of\n * types we know how to synthesize placeholder values for. Sorted by the\n * format's declared order — no clever heuristics.\n */\ninterface FormatDef {\n format_id: { agent_url: string; id: string };\n assets?: Array<{ asset_id: string; asset_type?: string; required?: boolean; item_type?: string }>;\n}\nfunction pickSimpleFormat(formats: FormatDef[]): FormatDef | null {\n for (const f of formats) {\n if (!f?.format_id?.agent_url || !f.format_id.id) continue;\n const required = (f.assets ?? []).filter(a => a?.required === true && a.item_type === 'individual');\n // Skip formats with zero required assets — sellers typically reject a\n // creative with an empty assets dict, so picking one would just\n // trade \"no format available\" for \"creative rejected\" downstream.\n if (required.length === 0) continue;\n if (required.every(a => ASSET_PLACEHOLDER[a.asset_type as keyof typeof ASSET_PLACEHOLDER])) return f;\n }\n return null;\n}\n\nfunction synthesizeManifestAssets(format: FormatDef): Record<string, unknown> {\n const manifest: Record<string, unknown> = {};\n for (const asset of format.assets ?? []) {\n if (asset?.required !== true || asset.item_type !== 'individual') continue;\n const placeholder = ASSET_PLACEHOLDER[asset.asset_type as keyof typeof ASSET_PLACEHOLDER];\n if (placeholder) manifest[asset.asset_id] = placeholder();\n }\n return manifest;\n}\n\n// Placeholder value per asset type. Kept intentionally small: the\n// seeder's job is to produce a creative the agent will accept, not to\n// fuzz the asset surface. We only cover types whose `required` fields\n// we can satisfy without format-specific knowledge (dimensions, codecs,\n// etc. use safe defaults).\nconst ASSET_PLACEHOLDER = {\n image: () => ({ asset_type: 'image', url: 'https://conformance.example/placeholder.png', width: 300, height: 250 }),\n video: () => ({ asset_type: 'video', url: 'https://conformance.example/placeholder.mp4', width: 640, height: 360 }),\n audio: () => ({ asset_type: 'audio', url: 'https://conformance.example/placeholder.mp3' }),\n text: () => ({ asset_type: 'text', content: 'Conformance seed text' }),\n url: () => ({ asset_type: 'url', url: 'https://conformance.example/' }),\n html: () => ({ asset_type: 'html', content: '<div>Conformance seed</div>' }),\n javascript: () => ({ asset_type: 'javascript', content: '/* conformance seed */' }),\n css: () => ({ asset_type: 'css', content: '/* conformance seed */' }),\n markdown: () => ({ asset_type: 'markdown', content: 'Conformance seed' }),\n} as const;\n\nfunction extractCreativeIds(data: unknown, fallbackId: string): string[] {\n const d = data as { creatives?: unknown; synced_creatives?: unknown };\n const items: unknown[] = [];\n if (Array.isArray(d.creatives)) items.push(...d.creatives);\n if (Array.isArray(d.synced_creatives)) items.push(...d.synced_creatives);\n const ids: string[] = [];\n for (const it of items) {\n const id = (it as { creative_id?: unknown })?.creative_id;\n if (typeof id === 'string' && id.length > 0) ids.push(id);\n }\n // Fall back to the id we supplied — spec allows sellers to echo back\n // buyer-supplied creative_ids on success.\n return ids.length > 0 ? ids : [fallbackId];\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../../src/lib/conformance/seeder.ts"],"sourcesContent":["import { AgentClient } from '../core/AgentClient';\nimport type { AgentConfig } from '../types';\nimport { generateIdempotencyKey } from '../utils/idempotency';\nimport type { ConformanceFixtures } from './types';\n\nexport interface SeedOptions {\n /** Protocol. Default: 'mcp'. */\n protocol?: 'mcp' | 'a2a';\n /** Bearer token forwarded to the agent. */\n authToken?: string;\n /** Full AgentConfig override. `id`/`agent_uri`/`protocol` are filled in from the other options. */\n agentConfig?: Partial<AgentConfig>;\n /**\n * Subset of seeders to run. Default: all.\n * `'create_media_buy'` implicitly runs `get_products` first to discover\n * a real product_id. `'sync_creatives'` implicitly runs\n * `list_creative_formats` first to pick a usable format.\n */\n seeders?: readonly SeederName[];\n /**\n * Brand reference for mutating seeders that require one. Default\n * `{ domain: 'conformance.example' }`. Sellers that enforce brand\n * allowlists should override this with a domain they're configured to\n * accept — otherwise `create_media_buy` seeding warns and falls through.\n */\n brand?: { domain: string; brand_id?: string };\n}\n\nexport type SeederName = 'create_property_list' | 'create_content_standards' | 'create_media_buy' | 'sync_creatives';\n\nexport interface SeedResult {\n fixtures: ConformanceFixtures;\n warnings: SeedWarning[];\n}\n\nexport interface SeedWarning {\n seeder: SeederName;\n reason: string;\n}\n\n// Cosmetic tag for human-readable names/labels only. NOT used for\n// idempotency_key — that's minted by `generateIdempotencyKey()`. Two\n// seeders racing with the same random suffix would produce two distinct\n// entities with identical names, which is fine for a seeder.\nconst UNIQUE_TAG = (): string => 'cf_seed_' + Math.random().toString(36).slice(2, 10);\n\n/**\n * Seeds an agent with known entities so Tier-3 fuzzing has real IDs to\n * feed back into referential + update tools. Each seeder is best-effort:\n * failures degrade to a recorded warning and an empty pool, never a\n * thrown exception, so a partial seed still lets the fuzzer run against\n * every other tool.\n *\n * Inputs are minimal hand-crafted payloads rather than fast-check\n * outputs — seeding is about producing a known-good entity, not\n * exploring the schema space. That's the job of runConformance.\n *\n * WARNING: This mutates the target. Point at a sandbox / test tenant.\n */\nexport async function seedFixtures(agentUrl: string, options: SeedOptions = {}): Promise<SeedResult> {\n const agent = buildAgent(agentUrl, options);\n const seeders =\n options.seeders ??\n (['create_property_list', 'create_content_standards', 'create_media_buy', 'sync_creatives'] as const);\n\n const ctx: SeederContext = {\n agent,\n brand: options.brand ?? { domain: 'conformance.example' },\n };\n\n const fixtures: ConformanceFixtures = {};\n const warnings: SeedWarning[] = [];\n\n for (const name of seeders) {\n try {\n const runner = SEEDERS[name];\n if (!runner) {\n warnings.push({ seeder: name, reason: `no seeder registered for ${name}` });\n continue;\n }\n const out = await runner(ctx);\n mergePool(fixtures, out.ids);\n warnings.push(...out.warnings);\n } catch (err) {\n warnings.push({ seeder: name, reason: `seeder threw: ${(err as Error)?.message ?? String(err)}` });\n }\n }\n\n return { fixtures, warnings };\n}\n\ninterface SeederContext {\n agent: AgentClient;\n brand: { domain: string; brand_id?: string };\n}\n\nfunction buildAgent(agentUrl: string, options: SeedOptions): AgentClient {\n const config: AgentConfig = {\n id: options.agentConfig?.id ?? 'conformance-seeder',\n name: options.agentConfig?.name ?? 'AdCP Conformance Seeder',\n agent_uri: agentUrl,\n protocol: options.protocol ?? options.agentConfig?.protocol ?? 'mcp',\n auth_token: options.authToken ?? options.agentConfig?.auth_token,\n ...options.agentConfig,\n };\n // The seeder tries every seed-tool regardless of declared capabilities.\n // Two SDK preflights are explicitly disabled:\n // - `validateFeatures: false` — don't refuse tools that aren't\n // declared in `get_adcp_capabilities`. The seeder just tries; the\n // agent's rejection becomes a recorded warning.\n // - `validation.responses: 'warn'` — don't fail a seed just because\n // the agent's response drifts from the response schema. We want\n // the ID if it's present; the fuzzer itself will do the strict\n // validation on downstream tools that actually care.\n return new AgentClient(config, {\n validateFeatures: false,\n validation: { responses: 'warn' },\n });\n}\n\nfunction mergePool(dest: ConformanceFixtures, src: Partial<Record<keyof ConformanceFixtures, string[]>>): void {\n for (const [key, values] of Object.entries(src)) {\n if (!values || values.length === 0) continue;\n const k = key as keyof ConformanceFixtures;\n const existing = dest[k] ?? [];\n dest[k] = [...existing, ...values];\n }\n}\n\ninterface SeederOutput {\n ids: Partial<Record<keyof ConformanceFixtures, string[]>>;\n warnings: SeedWarning[];\n}\ntype Seeder = (ctx: SeederContext) => Promise<SeederOutput>;\n\nconst SEEDERS: Record<SeederName, Seeder> = {\n create_property_list: seedPropertyList,\n create_content_standards: seedContentStandards,\n create_media_buy: seedMediaBuy,\n sync_creatives: seedSyncCreatives,\n};\n\nasync function seedPropertyList({ agent }: SeederContext): Promise<SeederOutput> {\n const result = await agent.executeTask('create_property_list', {\n idempotency_key: generateIdempotencyKey(),\n name: `Conformance Seeder List ${UNIQUE_TAG()}`,\n });\n if (!result.success || result.status !== 'completed' || !result.data) {\n return {\n ids: {},\n warnings: [{ seeder: 'create_property_list', reason: summarizeResult(result) }],\n };\n }\n const listId = (result.data as { list?: { list_id?: unknown } })?.list?.list_id;\n if (typeof listId !== 'string' || listId.length === 0) {\n return {\n ids: {},\n warnings: [{ seeder: 'create_property_list', reason: 'response missing list.list_id' }],\n };\n }\n return { ids: { list_ids: [listId] }, warnings: [] };\n}\n\nasync function seedContentStandards({ agent }: SeederContext): Promise<SeederOutput> {\n // Minimal payload that still satisfies the \"at least one of policy,\n // policies, or registry_policy_ids is required\" invariant some sellers\n // enforce beyond the raw schema. A single inline policy is the most\n // portable shape — registry_policy_ids require a pre-existing registry\n // entry on the seller, which we can't assume.\n const result = await agent.executeTask('create_content_standards', {\n idempotency_key: generateIdempotencyKey(),\n scope: { languages_any: ['en'] },\n policies: [\n {\n policy_id: `cf_policy_${UNIQUE_TAG()}`,\n enforcement: 'may',\n policy: 'Conformance seeder placeholder policy — advisory only.',\n },\n ],\n });\n if (!result.success || result.status !== 'completed' || !result.data) {\n return {\n ids: {},\n warnings: [{ seeder: 'create_content_standards', reason: summarizeResult(result) }],\n };\n }\n const standardsId = (result.data as { standards_id?: unknown })?.standards_id;\n if (typeof standardsId !== 'string' || standardsId.length === 0) {\n return {\n ids: {},\n warnings: [{ seeder: 'create_content_standards', reason: 'response missing standards_id' }],\n };\n }\n return { ids: { standards_ids: [standardsId] }, warnings: [] };\n}\n\n/**\n * Creates a media buy by first discovering a product via `get_products`,\n * then calling `create_media_buy` against that product. Captures the\n * returned `media_buy_id` and any `package_id`s from the response.\n */\nasync function seedMediaBuy({ agent, brand }: SeederContext): Promise<SeederOutput> {\n const warnings: SeedWarning[] = [];\n const products = await agent.executeTask('get_products', {\n brief: 'Conformance fuzzer seed — any product acceptable',\n });\n if (!products.success || products.status !== 'completed' || !products.data) {\n return {\n ids: {},\n warnings: [{ seeder: 'create_media_buy', reason: 'get_products preflight: ' + summarizeResult(products) }],\n };\n }\n const productList = (products.data as { products?: unknown })?.products;\n if (!Array.isArray(productList) || productList.length === 0) {\n return {\n ids: {},\n warnings: [{ seeder: 'create_media_buy', reason: 'get_products returned no products' }],\n };\n }\n const product = productList[0] as {\n product_id?: string;\n pricing_options?: Array<{ pricing_option_id?: string }>;\n };\n if (!product.product_id || !product.pricing_options?.[0]?.pricing_option_id) {\n return {\n ids: {},\n warnings: [{ seeder: 'create_media_buy', reason: 'first product missing product_id or pricing_option_id' }],\n };\n }\n\n const tag = UNIQUE_TAG();\n const now = new Date();\n const start = new Date(now.getTime() + 24 * 60 * 60 * 1000); // +1 day\n const end = new Date(now.getTime() + 8 * 24 * 60 * 60 * 1000); // +8 days\n\n const brandRef: Record<string, string> = { domain: brand.domain };\n if (brand.brand_id) brandRef.brand_id = brand.brand_id;\n const result = await agent.executeTask('create_media_buy', {\n idempotency_key: generateIdempotencyKey(),\n account: { brand: brandRef, operator: brand.domain },\n brand: brandRef,\n start_time: start.toISOString(),\n end_time: end.toISOString(),\n total_budget: { amount: 100, currency: 'USD' },\n packages: [\n {\n buyer_ref: `cf_pkg_${tag}`,\n product_id: product.product_id,\n pricing_option_id: product.pricing_options[0].pricing_option_id,\n budget: 100,\n },\n ],\n });\n\n if (!result.success || result.status !== 'completed' || !result.data) {\n return {\n ids: {},\n warnings: [...warnings, { seeder: 'create_media_buy', reason: summarizeResult(result) }],\n };\n }\n\n const data = result.data as {\n media_buy_id?: unknown;\n packages?: Array<{ package_id?: unknown }>;\n };\n const ids: Partial<Record<keyof ConformanceFixtures, string[]>> = {};\n if (typeof data.media_buy_id === 'string' && data.media_buy_id.length > 0) {\n ids.media_buy_ids = [data.media_buy_id];\n } else {\n warnings.push({ seeder: 'create_media_buy', reason: 'response missing media_buy_id (may be submitted async)' });\n }\n const packageIds = (data.packages ?? [])\n .map(p => p?.package_id)\n .filter((id): id is string => typeof id === 'string' && id.length > 0);\n if (packageIds.length > 0) ids.package_ids = packageIds;\n\n return { ids, warnings };\n}\n\nfunction summarizeResult(result: {\n success: boolean;\n status?: string;\n error?: string;\n adcpError?: { code?: string };\n}): string {\n if (result.success === false) {\n const code = result.adcpError?.code ? `${result.adcpError.code}: ` : '';\n return `agent rejected with ${code}${result.error ?? 'unknown error'}`;\n }\n return `unexpected status ${result.status ?? 'unknown'}`;\n}\n\n/**\n * Creates a single creative by first discovering formats via\n * `list_creative_formats`, picking the first format whose required\n * assets are all covered by our placeholder synthesis, then calling\n * `sync_creatives` with a minimal manifest. Captures returned\n * `creative_id`s into the pool.\n */\nasync function seedSyncCreatives({ agent, brand }: SeederContext): Promise<SeederOutput> {\n const warnings: SeedWarning[] = [];\n const formatsResult = await agent.executeTask('list_creative_formats', {});\n if (!formatsResult.success || formatsResult.status !== 'completed' || !formatsResult.data) {\n return {\n ids: {},\n warnings: [\n { seeder: 'sync_creatives', reason: 'list_creative_formats preflight: ' + summarizeResult(formatsResult) },\n ],\n };\n }\n const formats = (formatsResult.data as { formats?: unknown }).formats;\n if (!Array.isArray(formats) || formats.length === 0) {\n return { ids: {}, warnings: [{ seeder: 'sync_creatives', reason: 'list_creative_formats returned no formats' }] };\n }\n\n const picked = pickSimpleFormat(formats as FormatDef[]);\n if (!picked) {\n return {\n ids: {},\n warnings: [{ seeder: 'sync_creatives', reason: 'no format with a synthesizable required-asset set' }],\n };\n }\n\n const manifest = synthesizeManifestAssets(picked);\n const creativeId = `cf_creative_${UNIQUE_TAG()}`;\n const tag = UNIQUE_TAG();\n\n const result = await agent.executeTask('sync_creatives', {\n idempotency_key: generateIdempotencyKey(),\n account: {\n brand: { domain: brand.domain, ...(brand.brand_id ? { brand_id: brand.brand_id } : {}) },\n operator: brand.domain,\n },\n creatives: [\n {\n creative_id: creativeId,\n name: `Conformance Seeder Creative ${tag}`,\n format_id: { agent_url: picked.format_id.agent_url, id: picked.format_id.id },\n assets: manifest,\n },\n ],\n });\n\n if (!result.success || result.status !== 'completed' || !result.data) {\n return { ids: {}, warnings: [...warnings, { seeder: 'sync_creatives', reason: summarizeResult(result) }] };\n }\n\n const capturedIds = extractCreativeIds(result.data, creativeId);\n if (capturedIds.length === 0) {\n warnings.push({\n seeder: 'sync_creatives',\n reason: 'response did not surface a creative_id (may be pending review)',\n });\n return { ids: {}, warnings };\n }\n return { ids: { creative_ids: capturedIds }, warnings };\n}\n\n/**\n * Pick the first format whose required assets are all in the set of\n * types we know how to synthesize placeholder values for. Sorted by the\n * format's declared order — no clever heuristics.\n */\ninterface FormatDef {\n format_id: { agent_url: string; id: string };\n assets?: Array<{ asset_id: string; asset_type?: string; required?: boolean; item_type?: string }>;\n}\nfunction pickSimpleFormat(formats: FormatDef[]): FormatDef | null {\n for (const f of formats) {\n if (!f?.format_id?.agent_url || !f.format_id.id) continue;\n const required = (f.assets ?? []).filter(a => a?.required === true && a.item_type === 'individual');\n // Skip formats with zero required assets — sellers typically reject a\n // creative with an empty assets dict, so picking one would just\n // trade \"no format available\" for \"creative rejected\" downstream.\n if (required.length === 0) continue;\n if (required.every(a => ASSET_PLACEHOLDER[a.asset_type as keyof typeof ASSET_PLACEHOLDER])) return f;\n }\n return null;\n}\n\nfunction synthesizeManifestAssets(format: FormatDef): Record<string, unknown> {\n const manifest: Record<string, unknown> = {};\n for (const asset of format.assets ?? []) {\n if (asset?.required !== true || asset.item_type !== 'individual') continue;\n const placeholder = ASSET_PLACEHOLDER[asset.asset_type as keyof typeof ASSET_PLACEHOLDER];\n if (placeholder) manifest[asset.asset_id] = placeholder();\n }\n return manifest;\n}\n\n// Placeholder value per asset type. Kept intentionally small: the\n// seeder's job is to produce a creative the agent will accept, not to\n// fuzz the asset surface. We only cover types whose `required` fields\n// we can satisfy without format-specific knowledge (dimensions, codecs,\n// etc. use safe defaults).\nconst ASSET_PLACEHOLDER = {\n image: () => ({ asset_type: 'image', url: 'https://conformance.example/placeholder.png', width: 300, height: 250 }),\n video: () => ({ asset_type: 'video', url: 'https://conformance.example/placeholder.mp4', width: 640, height: 360 }),\n audio: () => ({ asset_type: 'audio', url: 'https://conformance.example/placeholder.mp3' }),\n text: () => ({ asset_type: 'text', content: 'Conformance seed text' }),\n url: () => ({ asset_type: 'url', url: 'https://conformance.example/' }),\n html: () => ({ asset_type: 'html', content: '<div>Conformance seed</div>' }),\n javascript: () => ({ asset_type: 'javascript', content: '/* conformance seed */' }),\n css: () => ({ asset_type: 'css', content: '/* conformance seed */' }),\n markdown: () => ({ asset_type: 'markdown', content: 'Conformance seed' }),\n} as const;\n\nfunction extractCreativeIds(data: unknown, fallbackId: string): string[] {\n const d = data as { creatives?: unknown; synced_creatives?: unknown };\n const items: unknown[] = [];\n if (Array.isArray(d.creatives)) items.push(...d.creatives);\n if (Array.isArray(d.synced_creatives)) items.push(...d.synced_creatives);\n const ids: string[] = [];\n for (const it of items) {\n const id = (it as { creative_id?: unknown })?.creative_id;\n if (typeof id === 'string' && id.length > 0) ids.push(id);\n }\n // Fall back to the id we supplied — spec allows sellers to echo back\n // buyer-supplied creative_ids on success.\n return ids.length > 0 ? ids : [fallbackId];\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
|
const STATELESS_TIER_TOOLS = [
|
|
8
2
|
"get_products",
|
|
9
3
|
"list_creative_formats",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/lib/conformance/types.ts"],"sourcesContent":["import type { AgentConfig } from '../types';\nimport type { AdcpJsonWebKey } from '../signing/types';\nimport type { SignerKey } from '../signing/client';\n\nexport type ConformanceToolName =\n // Tier 1: no required IDs, discovery-like\n | 'get_products'\n | 'list_creative_formats'\n | 'list_creatives'\n | 'get_media_buys'\n | 'get_signals'\n | 'si_get_offering'\n | 'get_adcp_capabilities'\n | 'tasks_list'\n | 'list_property_lists'\n | 'list_content_standards'\n | 'get_creative_features'\n // Tier 2: require an ID but no setup — random IDs exercise the\n // rejection surface (agents must return REFERENCE_NOT_FOUND, not 500).\n | 'get_media_buy_delivery'\n | 'get_property_list'\n | 'get_content_standards'\n | 'get_creative_delivery'\n | 'tasks_get'\n | 'preview_creative'\n // Tier 3: mutating updates. Only meaningful against real entity IDs —\n // either pre-seeded via `options.fixtures` or auto-seeded via\n // `autoSeed: true`. Excluded from DEFAULT_TOOLS when neither is active.\n | 'update_media_buy'\n | 'update_property_list'\n | 'update_content_standards';\n\nexport const STATELESS_TIER_TOOLS: readonly ConformanceToolName[] = [\n 'get_products',\n 'list_creative_formats',\n 'list_creatives',\n 'get_media_buys',\n 'get_signals',\n 'si_get_offering',\n 'get_adcp_capabilities',\n 'tasks_list',\n 'list_property_lists',\n 'list_content_standards',\n 'get_creative_features',\n] as const;\n\n/**\n * Tools that take an ID but no setup state. Without fixtures the runner\n * exercises only the rejection surface (random IDs → REFERENCE_NOT_FOUND);\n * with fixtures, the arbitrary draws IDs from the supplied pools to\n * exercise the accepted path too. See {@link RunConformanceOptions.fixtures}.\n */\nexport const REFERENTIAL_STATELESS_TOOLS: readonly ConformanceToolName[] = [\n 'get_media_buy_delivery',\n 'get_property_list',\n 'get_content_standards',\n 'get_creative_delivery',\n 'tasks_get',\n 'preview_creative',\n] as const;\n\n/**\n * Tier-3 mutating updates. Only meaningful when the fuzzer has real\n * entity IDs to target — either pre-seeded via\n * {@link RunConformanceOptions.fixtures} or auto-seeded via\n * {@link RunConformanceOptions.autoSeed}. {@link runConformance}\n * excludes these from the default tool list when neither is active.\n *\n * WARNING: running these mutates agent state. Point the fuzzer at a\n * sandbox / test tenant.\n */\nexport const UPDATE_TIER_TOOLS: readonly ConformanceToolName[] = [\n 'update_media_buy',\n 'update_property_list',\n 'update_content_standards',\n] as const;\n\n/** Tier 1 + Tier 2 combined. Default tool set for {@link runConformance}. */\nexport const DEFAULT_TOOLS: readonly ConformanceToolName[] = [\n ...STATELESS_TIER_TOOLS,\n ...REFERENTIAL_STATELESS_TOOLS,\n] as const;\n\n/** Tier 1 + Tier 2 + Tier 3. Used when `autoSeed` is true or fixtures were supplied. */\nexport const DEFAULT_TOOLS_WITH_UPDATES: readonly ConformanceToolName[] = [\n ...DEFAULT_TOOLS,\n ...UPDATE_TIER_TOOLS,\n] as const;\n\nexport interface RunConformanceOptions {\n /** Seed for reproducible runs. Omit for a random seed. */\n seed?: number;\n /** Subset of tools to fuzz. Defaults to the full stateless tier. */\n tools?: readonly ConformanceToolName[];\n /** Iterations per tool. Default 50. */\n turnBudget?: number;\n /** Protocol to use. Default: auto-detect via SingleAgentClient. */\n protocol?: 'mcp' | 'a2a';\n /** Auth token to pass as Bearer. */\n authToken?: string;\n /** Additional AgentConfig overrides. `id` and `agent_uri` are filled in automatically. */\n agentConfig?: Partial<AgentConfig>;\n /** AdCP schema/cache version to use for conformance request/response schemas. */\n version?: string;\n /** External schema-data root to use for conformance request/response schemas. */\n schemaRoot?: string;\n /** Skip runs where the agent returns UNSUPPORTED/NOT_IMPLEMENTED. Default true. */\n skipUnsupported?: boolean;\n /**\n * Cap the serialized size of `failure.input` and `failure.response` in the\n * returned report so a systematically broken agent can't OOM downstream\n * CI consumers. Default: 8192 bytes. Values < 256 are clamped.\n */\n maxFailurePayloadBytes?: number;\n /** Cap total failures collected. Default: 20. Excess are dropped with a marker. */\n maxFailures?: number;\n /**\n * Pre-seeded ID pools to inject into arbitraries. When a request schema\n * has a property whose name maps to one of these pools, the generator\n * draws from the pool with {@link https://fast-check.dev/api-reference/classes/Arbitrary.html `fc.constantFrom`}\n * instead of generating a random string. This is the Tier-2 accepted-path\n * hook — without it, random IDs only exercise the rejection surface.\n *\n * @example\n * ```ts\n * await runConformance(url, {\n * fixtures: {\n * creative_ids: ['cre_abc', 'cre_def'],\n * media_buy_ids: ['mb_123'],\n * },\n * });\n * ```\n */\n fixtures?: ConformanceFixtures;\n /**\n * When true, `runConformance` calls `seedFixtures` before fuzzing: it\n * creates a property list, a content-standards config, and (if the\n * agent returns at least one product from `get_products`) a media\n * buy. The returned IDs are merged into `fixtures` (explicit fixtures\n * win on conflict) and Tier-3 update tools are added to the default\n * tool list.\n *\n * WARNING: auto-seed mutates agent state. Point at a sandbox.\n *\n * @default false\n */\n autoSeed?: boolean;\n /**\n * Brand reference used by mutating seeders (currently `create_media_buy`\n * and `sync_creatives`). Sellers that enforce brand allowlists should\n * set this to a domain they're configured to accept. When omitted,\n * seeders fall back to `{ domain: 'conformance.example' }`, which will\n * warn-and-skip on allowlist-enforcing sellers.\n */\n seedBrand?: { domain: string; brand_id?: string };\n /**\n * Second auth token for the uniform-error paired probe. When set, the\n * seeder runs as `authToken` (tenant A) and the invariant probes as\n * `authTokenCrossTenant` (tenant B) against tenant A's seeded id —\n * the full \"exists but inaccessible vs does not exist\" MUST.\n *\n * When absent, the invariant runs in baseline mode (two fresh UUIDs\n * with a single token) — still catches id-echo, header divergence,\n * and state divergence. Cannot catch cross-tenant leaks.\n *\n * @see skills/build-seller-agent/SKILL.md § testing preparation\n */\n authTokenCrossTenant?: string;\n}\n\n/**\n * ID pools for Tier-2 fuzzing. Keys correspond to AdCP request-property\n * names; the generator injects them when the field name matches.\n */\nexport interface ConformanceFixtures {\n /** Pool for `creative_id` and `creative_ids[]` properties. */\n creative_ids?: readonly string[];\n /** Pool for `media_buy_id` and `media_buy_ids[]` properties. */\n media_buy_ids?: readonly string[];\n /** Pool for `list_id` properties on property-list tools. */\n list_ids?: readonly string[];\n /** Pool for `standards_id` properties on content-standards tools. */\n standards_ids?: readonly string[];\n /** Pool for `task_id` / `taskId` properties. */\n task_ids?: readonly string[];\n /** Pool for `plan_id` properties. */\n plan_ids?: readonly string[];\n /** Pool for `account_id` properties. */\n account_ids?: readonly string[];\n /** Pool for `package_id` / `package_ids[]` properties. */\n package_ids?: readonly string[];\n /** Pool for `format_id` / `format.id` properties. */\n format_ids?: readonly string[];\n}\n\nexport type OracleVerdict = 'accepted' | 'rejected' | 'invalid';\n\nexport interface ConformanceFailure {\n /** Tool the failure was observed on. */\n tool: ConformanceToolName;\n /** Dot-path inside the request that fast-check's shrinker isolated (best-effort). */\n path?: string;\n /** Seed that reproduces this failure. */\n seed: number;\n /** Whether fast-check was able to shrink the input. */\n shrunk: boolean;\n /** Shrunk request payload that triggered the failure. */\n input: unknown;\n /** Agent's response (raw). */\n response: unknown;\n /** Oracle verdict that led to the failure. */\n verdict: OracleVerdict;\n /** Human-readable invariant messages (e.g., \"reason code not in spec enum\"). */\n invariantFailures: string[];\n}\n\nexport type SkipReason = 'missing_schemas' | 'unresolvable_schema' | 'feature_unsupported' | 'runner_not_implemented';\n\nexport interface ConformanceToolStats {\n /** Fresh sample count. Shrinking replays are excluded. */\n runs: number;\n accepted: number;\n rejected: number;\n /** 0 or 1 — fast-check reports at most one shrunk counterexample per tool. */\n failed: 0 | 1;\n skipped: boolean;\n skipReason?: SkipReason;\n}\n\nexport interface ConformanceReport {\n agentUrl: string;\n seed: number;\n /** Schema version the fuzzer loaded. Pinned so a report is replayable. */\n schemaVersion: string;\n /** External schema root used for validation, when supplied. */\n schemaRoot?: string;\n /** Protocol used for the run. */\n protocol: 'mcp' | 'a2a';\n /** Iterations per tool that were requested. */\n turnBudget: number;\n /**\n * Snapshot of the fixture pools the run used. Empty object when\n * no fixtures were supplied. Recorded so a stored JSON report is\n * self-reproducible without the original invocation.\n */\n fixturesUsed: ConformanceFixtures;\n /**\n * Whether auto-seeding ran this cycle. When true, `seedWarnings`\n * carries any per-seeder reasons a pool ended up empty (e.g., the\n * agent rejected create_media_buy, or get_products returned no\n * products). Empty array means all requested seeders succeeded.\n */\n autoSeeded: boolean;\n seedWarnings: ReadonlyArray<{ seeder: string; reason: string }>;\n totalRuns: number;\n totalFailures: number;\n /** Count of failures dropped when `maxFailures` was hit. */\n droppedFailures: number;\n perTool: Record<string, ConformanceToolStats>;\n failures: ConformanceFailure[];\n /**\n * Uniform-error invariant results per T2 tool. Empty when no eligible\n * tool was probed (e.g., all T2 tools skipped). Each entry is the\n * byte-equivalence check for a paired probe against one tool.\n */\n uniformError: ReadonlyArray<import('./invariants/uniformError').UniformErrorReport>;\n startedAt: string;\n completedAt: string;\n durationMs: number;\n}\n\nexport type WebhookConformanceVerdict = 'accepted' | 'rejected_correctly' | 'false_accept' | 'false_reject';\n\nexport interface WebhookConformanceCase {\n name: string;\n description: string;\n expected: 'accept' | 'reject';\n verdict: WebhookConformanceVerdict;\n request: {\n body: unknown;\n idempotencyKey?: string;\n };\n response?: {\n status: number;\n body?: string;\n };\n error?: string;\n}\n\nexport type WebhookConformanceSigningOptions =\n | { mode: 'none' }\n | {\n mode: 'hmac';\n secret: string;\n /** Current unix time in seconds. Defaults to Date.now(). */\n now?: () => number;\n }\n | {\n mode: 'rfc9421';\n /**\n * Signing key used for replay. When omitted, the runner mints an\n * ephemeral Ed25519 webhook-signing key and returns its public JWK in\n * the report so the receiver can be configured for a repeat run.\n */\n key?: SignerKey;\n /** Target URI to cover in the signature. Defaults to the receiver URL. */\n targetUrl?: string;\n /** Current unix time in seconds. Defaults to Date.now(). */\n now?: () => number;\n };\n\nexport interface RunWebhookConformanceOptions {\n /** Extra headers to send on every replay. */\n headers?: Record<string, string>;\n /** Signature profile. Defaults to unsigned transport-envelope checks. */\n signing?: WebhookConformanceSigningOptions;\n /** Override fetch for tests or custom runtimes. */\n fetchImpl?: typeof fetch;\n /** Request timeout in milliseconds. Default 10000. */\n timeoutMs?: number;\n}\n\nexport interface WebhookConformanceReport {\n receiverUrl: string;\n totalCases: number;\n totalFailures: number;\n cases: WebhookConformanceCase[];\n signing: {\n mode: 'none' | 'hmac' | 'rfc9421';\n publicKey?: AdcpJsonWebKey;\n };\n startedAt: string;\n completedAt: string;\n durationMs: number;\n}\n"],"mappings":";;;;;;AAgCO,MAAM,uBAAuD;AAAA,EAClE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAQO,MAAM,8BAA8D;AAAA,EACzE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAYO,MAAM,oBAAoD;AAAA,EAC/D;AAAA,EACA;AAAA,EACA;AACF;AAGO,MAAM,gBAAgD;AAAA,EAC3D,GAAG;AAAA,EACH,GAAG;AACL;AAGO,MAAM,6BAA6D;AAAA,EACxE,GAAG;AAAA,EACH,GAAG;AACL;","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../../src/lib/conformance/types.ts"],"sourcesContent":["import type { AgentConfig } from '../types';\nimport type { AdcpJsonWebKey } from '../signing/types';\nimport type { SignerKey } from '../signing/client';\n\nexport type ConformanceToolName =\n // Tier 1: no required IDs, discovery-like\n | 'get_products'\n | 'list_creative_formats'\n | 'list_creatives'\n | 'get_media_buys'\n | 'get_signals'\n | 'si_get_offering'\n | 'get_adcp_capabilities'\n | 'tasks_list'\n | 'list_property_lists'\n | 'list_content_standards'\n | 'get_creative_features'\n // Tier 2: require an ID but no setup — random IDs exercise the\n // rejection surface (agents must return REFERENCE_NOT_FOUND, not 500).\n | 'get_media_buy_delivery'\n | 'get_property_list'\n | 'get_content_standards'\n | 'get_creative_delivery'\n | 'tasks_get'\n | 'preview_creative'\n // Tier 3: mutating updates. Only meaningful against real entity IDs —\n // either pre-seeded via `options.fixtures` or auto-seeded via\n // `autoSeed: true`. Excluded from DEFAULT_TOOLS when neither is active.\n | 'update_media_buy'\n | 'update_property_list'\n | 'update_content_standards';\n\nexport const STATELESS_TIER_TOOLS: readonly ConformanceToolName[] = [\n 'get_products',\n 'list_creative_formats',\n 'list_creatives',\n 'get_media_buys',\n 'get_signals',\n 'si_get_offering',\n 'get_adcp_capabilities',\n 'tasks_list',\n 'list_property_lists',\n 'list_content_standards',\n 'get_creative_features',\n] as const;\n\n/**\n * Tools that take an ID but no setup state. Without fixtures the runner\n * exercises only the rejection surface (random IDs → REFERENCE_NOT_FOUND);\n * with fixtures, the arbitrary draws IDs from the supplied pools to\n * exercise the accepted path too. See {@link RunConformanceOptions.fixtures}.\n */\nexport const REFERENTIAL_STATELESS_TOOLS: readonly ConformanceToolName[] = [\n 'get_media_buy_delivery',\n 'get_property_list',\n 'get_content_standards',\n 'get_creative_delivery',\n 'tasks_get',\n 'preview_creative',\n] as const;\n\n/**\n * Tier-3 mutating updates. Only meaningful when the fuzzer has real\n * entity IDs to target — either pre-seeded via\n * {@link RunConformanceOptions.fixtures} or auto-seeded via\n * {@link RunConformanceOptions.autoSeed}. {@link runConformance}\n * excludes these from the default tool list when neither is active.\n *\n * WARNING: running these mutates agent state. Point the fuzzer at a\n * sandbox / test tenant.\n */\nexport const UPDATE_TIER_TOOLS: readonly ConformanceToolName[] = [\n 'update_media_buy',\n 'update_property_list',\n 'update_content_standards',\n] as const;\n\n/** Tier 1 + Tier 2 combined. Default tool set for {@link runConformance}. */\nexport const DEFAULT_TOOLS: readonly ConformanceToolName[] = [\n ...STATELESS_TIER_TOOLS,\n ...REFERENTIAL_STATELESS_TOOLS,\n] as const;\n\n/** Tier 1 + Tier 2 + Tier 3. Used when `autoSeed` is true or fixtures were supplied. */\nexport const DEFAULT_TOOLS_WITH_UPDATES: readonly ConformanceToolName[] = [\n ...DEFAULT_TOOLS,\n ...UPDATE_TIER_TOOLS,\n] as const;\n\nexport interface RunConformanceOptions {\n /** Seed for reproducible runs. Omit for a random seed. */\n seed?: number;\n /** Subset of tools to fuzz. Defaults to the full stateless tier. */\n tools?: readonly ConformanceToolName[];\n /** Iterations per tool. Default 50. */\n turnBudget?: number;\n /** Protocol to use. Default: auto-detect via SingleAgentClient. */\n protocol?: 'mcp' | 'a2a';\n /** Auth token to pass as Bearer. */\n authToken?: string;\n /** Additional AgentConfig overrides. `id` and `agent_uri` are filled in automatically. */\n agentConfig?: Partial<AgentConfig>;\n /** AdCP schema/cache version to use for conformance request/response schemas. */\n version?: string;\n /** External schema-data root to use for conformance request/response schemas. */\n schemaRoot?: string;\n /** Skip runs where the agent returns UNSUPPORTED/NOT_IMPLEMENTED. Default true. */\n skipUnsupported?: boolean;\n /**\n * Cap the serialized size of `failure.input` and `failure.response` in the\n * returned report so a systematically broken agent can't OOM downstream\n * CI consumers. Default: 8192 bytes. Values < 256 are clamped.\n */\n maxFailurePayloadBytes?: number;\n /** Cap total failures collected. Default: 20. Excess are dropped with a marker. */\n maxFailures?: number;\n /**\n * Pre-seeded ID pools to inject into arbitraries. When a request schema\n * has a property whose name maps to one of these pools, the generator\n * draws from the pool with {@link https://fast-check.dev/api-reference/classes/Arbitrary.html `fc.constantFrom`}\n * instead of generating a random string. This is the Tier-2 accepted-path\n * hook — without it, random IDs only exercise the rejection surface.\n *\n * @example\n * ```ts\n * await runConformance(url, {\n * fixtures: {\n * creative_ids: ['cre_abc', 'cre_def'],\n * media_buy_ids: ['mb_123'],\n * },\n * });\n * ```\n */\n fixtures?: ConformanceFixtures;\n /**\n * When true, `runConformance` calls `seedFixtures` before fuzzing: it\n * creates a property list, a content-standards config, and (if the\n * agent returns at least one product from `get_products`) a media\n * buy. The returned IDs are merged into `fixtures` (explicit fixtures\n * win on conflict) and Tier-3 update tools are added to the default\n * tool list.\n *\n * WARNING: auto-seed mutates agent state. Point at a sandbox.\n *\n * @default false\n */\n autoSeed?: boolean;\n /**\n * Brand reference used by mutating seeders (currently `create_media_buy`\n * and `sync_creatives`). Sellers that enforce brand allowlists should\n * set this to a domain they're configured to accept. When omitted,\n * seeders fall back to `{ domain: 'conformance.example' }`, which will\n * warn-and-skip on allowlist-enforcing sellers.\n */\n seedBrand?: { domain: string; brand_id?: string };\n /**\n * Second auth token for the uniform-error paired probe. When set, the\n * seeder runs as `authToken` (tenant A) and the invariant probes as\n * `authTokenCrossTenant` (tenant B) against tenant A's seeded id —\n * the full \"exists but inaccessible vs does not exist\" MUST.\n *\n * When absent, the invariant runs in baseline mode (two fresh UUIDs\n * with a single token) — still catches id-echo, header divergence,\n * and state divergence. Cannot catch cross-tenant leaks.\n *\n * @see skills/build-seller-agent/SKILL.md § testing preparation\n */\n authTokenCrossTenant?: string;\n}\n\n/**\n * ID pools for Tier-2 fuzzing. Keys correspond to AdCP request-property\n * names; the generator injects them when the field name matches.\n */\nexport interface ConformanceFixtures {\n /** Pool for `creative_id` and `creative_ids[]` properties. */\n creative_ids?: readonly string[];\n /** Pool for `media_buy_id` and `media_buy_ids[]` properties. */\n media_buy_ids?: readonly string[];\n /** Pool for `list_id` properties on property-list tools. */\n list_ids?: readonly string[];\n /** Pool for `standards_id` properties on content-standards tools. */\n standards_ids?: readonly string[];\n /** Pool for `task_id` / `taskId` properties. */\n task_ids?: readonly string[];\n /** Pool for `plan_id` properties. */\n plan_ids?: readonly string[];\n /** Pool for `account_id` properties. */\n account_ids?: readonly string[];\n /** Pool for `package_id` / `package_ids[]` properties. */\n package_ids?: readonly string[];\n /** Pool for `format_id` / `format.id` properties. */\n format_ids?: readonly string[];\n}\n\nexport type OracleVerdict = 'accepted' | 'rejected' | 'invalid';\n\nexport interface ConformanceFailure {\n /** Tool the failure was observed on. */\n tool: ConformanceToolName;\n /** Dot-path inside the request that fast-check's shrinker isolated (best-effort). */\n path?: string;\n /** Seed that reproduces this failure. */\n seed: number;\n /** Whether fast-check was able to shrink the input. */\n shrunk: boolean;\n /** Shrunk request payload that triggered the failure. */\n input: unknown;\n /** Agent's response (raw). */\n response: unknown;\n /** Oracle verdict that led to the failure. */\n verdict: OracleVerdict;\n /** Human-readable invariant messages (e.g., \"reason code not in spec enum\"). */\n invariantFailures: string[];\n}\n\nexport type SkipReason = 'missing_schemas' | 'unresolvable_schema' | 'feature_unsupported' | 'runner_not_implemented';\n\nexport interface ConformanceToolStats {\n /** Fresh sample count. Shrinking replays are excluded. */\n runs: number;\n accepted: number;\n rejected: number;\n /** 0 or 1 — fast-check reports at most one shrunk counterexample per tool. */\n failed: 0 | 1;\n skipped: boolean;\n skipReason?: SkipReason;\n}\n\nexport interface ConformanceReport {\n agentUrl: string;\n seed: number;\n /** Schema version the fuzzer loaded. Pinned so a report is replayable. */\n schemaVersion: string;\n /** External schema root used for validation, when supplied. */\n schemaRoot?: string;\n /** Protocol used for the run. */\n protocol: 'mcp' | 'a2a';\n /** Iterations per tool that were requested. */\n turnBudget: number;\n /**\n * Snapshot of the fixture pools the run used. Empty object when\n * no fixtures were supplied. Recorded so a stored JSON report is\n * self-reproducible without the original invocation.\n */\n fixturesUsed: ConformanceFixtures;\n /**\n * Whether auto-seeding ran this cycle. When true, `seedWarnings`\n * carries any per-seeder reasons a pool ended up empty (e.g., the\n * agent rejected create_media_buy, or get_products returned no\n * products). Empty array means all requested seeders succeeded.\n */\n autoSeeded: boolean;\n seedWarnings: ReadonlyArray<{ seeder: string; reason: string }>;\n totalRuns: number;\n totalFailures: number;\n /** Count of failures dropped when `maxFailures` was hit. */\n droppedFailures: number;\n perTool: Record<string, ConformanceToolStats>;\n failures: ConformanceFailure[];\n /**\n * Uniform-error invariant results per T2 tool. Empty when no eligible\n * tool was probed (e.g., all T2 tools skipped). Each entry is the\n * byte-equivalence check for a paired probe against one tool.\n */\n uniformError: ReadonlyArray<import('./invariants/uniformError').UniformErrorReport>;\n startedAt: string;\n completedAt: string;\n durationMs: number;\n}\n\nexport type WebhookConformanceVerdict = 'accepted' | 'rejected_correctly' | 'false_accept' | 'false_reject';\n\nexport interface WebhookConformanceCase {\n name: string;\n description: string;\n expected: 'accept' | 'reject';\n verdict: WebhookConformanceVerdict;\n request: {\n body: unknown;\n idempotencyKey?: string;\n };\n response?: {\n status: number;\n body?: string;\n };\n error?: string;\n}\n\nexport type WebhookConformanceSigningOptions =\n | { mode: 'none' }\n | {\n mode: 'hmac';\n secret: string;\n /** Current unix time in seconds. Defaults to Date.now(). */\n now?: () => number;\n }\n | {\n mode: 'rfc9421';\n /**\n * Signing key used for replay. When omitted, the runner mints an\n * ephemeral Ed25519 webhook-signing key and returns its public JWK in\n * the report so the receiver can be configured for a repeat run.\n */\n key?: SignerKey;\n /** Target URI to cover in the signature. Defaults to the receiver URL. */\n targetUrl?: string;\n /** Current unix time in seconds. Defaults to Date.now(). */\n now?: () => number;\n };\n\nexport interface RunWebhookConformanceOptions {\n /** Extra headers to send on every replay. */\n headers?: Record<string, string>;\n /** Signature profile. Defaults to unsigned transport-envelope checks. */\n signing?: WebhookConformanceSigningOptions;\n /** Override fetch for tests or custom runtimes. */\n fetchImpl?: typeof fetch;\n /** Request timeout in milliseconds. Default 10000. */\n timeoutMs?: number;\n}\n\nexport interface WebhookConformanceReport {\n receiverUrl: string;\n totalCases: number;\n totalFailures: number;\n cases: WebhookConformanceCase[];\n signing: {\n mode: 'none' | 'hmac' | 'rfc9421';\n publicKey?: AdcpJsonWebKey;\n };\n startedAt: string;\n completedAt: string;\n durationMs: number;\n}\n"],"mappings":"AAgCO,MAAM,uBAAuD;AAAA,EAClE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAQO,MAAM,8BAA8D;AAAA,EACzE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAYO,MAAM,oBAAoD;AAAA,EAC/D;AAAA,EACA;AAAA,EACA;AACF;AAGO,MAAM,gBAAgD;AAAA,EAC3D,GAAG;AAAA,EACH,GAAG;AACL;AAGO,MAAM,6BAA6D;AAAA,EACxE,GAAG;AAAA,EACH,GAAG;AACL;","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 { createHmac } from "node:crypto";
|
|
8
2
|
import { signWebhook } from "../signing/client.mjs";
|
|
9
3
|
import { mintEphemeralEd25519Key } from "../signing/testing.mjs";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/lib/conformance/webhook.ts"],"sourcesContent":["import { createHmac } from 'node:crypto';\nimport { signWebhook, type RequestLike, type SignerKey } from '../signing/client';\nimport { mintEphemeralEd25519Key } from '../signing/testing';\nimport type { AdcpJsonWebKey } from '../signing/types';\nimport type {\n RunWebhookConformanceOptions,\n WebhookConformanceCase,\n WebhookConformanceReport,\n WebhookConformanceSigningOptions,\n WebhookConformanceVerdict,\n} from './types';\n\ntype WebhookExpectation = 'accept' | 'reject';\ntype ResolvedWebhookConformanceSigningOptions =\n | Exclude<WebhookConformanceSigningOptions, { mode: 'rfc9421' }>\n | (Extract<WebhookConformanceSigningOptions, { mode: 'rfc9421' }> & { key: SignerKey });\n\ninterface WebhookCaseDefinition {\n name: string;\n description: string;\n expected: WebhookExpectation;\n body: Record<string, unknown>;\n signatureMutation?: 'stale_timestamp' | 'invalid_signature' | 'mismatched_target';\n}\n\nconst DEFAULT_TIMEOUT_MS = 10_000;\nconst DUPLICATE_IDEMPOTENCY_KEY = 'whk_conformance_retry_000001';\n\n/**\n * Replay canonical buyer-receiver webhook cases against an inbound webhook URL.\n *\n * This runner intentionally tests the transport envelope, not seller tool\n * responses. It posts complete MCP webhook envelopes for accepted cases and\n * malformed top-level bodies for rejection cases. When `options.signing` is\n * provided, requests are signed over the exact raw JSON bytes sent on the wire.\n */\nexport async function runWebhookConformance(\n buyerReceiverUrl: string,\n options: RunWebhookConformanceOptions = {}\n): Promise<WebhookConformanceReport> {\n const startedAt = new Date();\n const fetchImpl = options.fetchImpl ?? fetch;\n const { signing, publicKey } = await resolveSigning(options.signing ?? { mode: 'none' });\n const cases = buildCases(signing);\n const results: WebhookConformanceCase[] = [];\n\n for (const testCase of cases) {\n const body = JSON.stringify(testCase.body);\n const headers = await headersForCase(buyerReceiverUrl, body, signing, options.headers, testCase.signatureMutation);\n\n try {\n const response = await postWithTimeout(\n fetchImpl,\n buyerReceiverUrl,\n {\n method: 'POST',\n headers,\n body,\n },\n options.timeoutMs ?? DEFAULT_TIMEOUT_MS\n );\n const responseBody = await safeReadResponseBody(response);\n results.push({\n name: testCase.name,\n description: testCase.description,\n expected: testCase.expected,\n verdict: classifyResponse(testCase.expected, response.status),\n request: {\n body: testCase.body,\n idempotencyKey: typeof testCase.body.idempotency_key === 'string' ? testCase.body.idempotency_key : undefined,\n },\n response: {\n status: response.status,\n ...(responseBody ? { body: responseBody } : {}),\n },\n });\n } catch (error) {\n results.push({\n name: testCase.name,\n description: testCase.description,\n expected: testCase.expected,\n verdict: testCase.expected === 'reject' ? 'rejected_correctly' : 'false_reject',\n request: {\n body: testCase.body,\n idempotencyKey: typeof testCase.body.idempotency_key === 'string' ? testCase.body.idempotency_key : undefined,\n },\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n const completedAt = new Date();\n return {\n receiverUrl: buyerReceiverUrl,\n totalCases: results.length,\n totalFailures: results.filter(result => result.verdict === 'false_accept' || result.verdict === 'false_reject')\n .length,\n cases: results,\n signing: { mode: signing.mode, ...(publicKey ? { publicKey } : {}) },\n startedAt: startedAt.toISOString(),\n completedAt: completedAt.toISOString(),\n durationMs: completedAt.getTime() - startedAt.getTime(),\n };\n}\n\nasync function resolveSigning(\n signing: WebhookConformanceSigningOptions\n): Promise<{ signing: ResolvedWebhookConformanceSigningOptions; publicKey?: AdcpJsonWebKey }> {\n if (signing.mode !== 'rfc9421' || signing.key) {\n return { signing: signing as ResolvedWebhookConformanceSigningOptions };\n }\n const keypair = await mintEphemeralEd25519Key({ adcp_use: 'webhook-signing' });\n return {\n signing: {\n ...signing,\n key: {\n keyid: keypair.kid,\n alg: keypair.algorithm,\n privateKey: keypair.privateKey,\n },\n },\n publicKey: keypair.publicKey,\n };\n}\n\nfunction buildCases(signing: ResolvedWebhookConformanceSigningOptions): WebhookCaseDefinition[] {\n const canonical = canonicalDeliveryEnvelope(DUPLICATE_IDEMPOTENCY_KEY);\n const cases: WebhookCaseDefinition[] = [\n {\n name: 'canonical_mcp_delivery_envelope',\n description: 'Accepts a complete MCP webhook envelope with a delivery report nested under result.',\n expected: 'accept',\n body: canonical,\n },\n {\n name: 'retry_preserves_idempotency_key',\n description: 'Accepts a retry of the same logical event with the same idempotency_key.',\n expected: 'accept',\n body: { ...canonical, timestamp: '2026-05-26T09:00:45.582Z' },\n },\n {\n name: 'reject_bare_delivery_result',\n description: 'Rejects delivery report content sent directly as the top-level POST body.',\n expected: 'reject',\n body: canonical.result as Record<string, unknown>,\n },\n {\n name: 'reject_missing_envelope_fields',\n description: 'Rejects an MCP-like envelope missing required transport fields.',\n expected: 'reject',\n body: {\n task_id: 'delivery_report_67_2026-04_000031',\n task_type: 'media_buy_delivery',\n status: 'completed',\n result: canonical.result,\n },\n },\n {\n name: 'reject_unsupported_status',\n description: 'Rejects malformed top-level async task status values.',\n expected: 'reject',\n body: {\n ...canonical,\n idempotency_key: 'whk_conformance_bad_status_0001',\n status: 'done',\n },\n },\n ];\n\n if (signing.mode !== 'none') {\n cases.push(\n {\n name: 'reject_stale_signature_timestamp',\n description: 'Rejects a request whose signature timestamp is outside the allowed freshness window.',\n expected: 'reject',\n body: {\n ...canonical,\n idempotency_key: 'whk_conformance_stale_sig_0001',\n },\n signatureMutation: 'stale_timestamp',\n },\n {\n name: 'reject_invalid_signature',\n description: 'Rejects a request whose signature does not cover the exact raw request body.',\n expected: 'reject',\n body: {\n ...canonical,\n idempotency_key: 'whk_conformance_bad_sig_00001',\n },\n signatureMutation: 'invalid_signature',\n }\n );\n }\n\n if (signing.mode === 'rfc9421') {\n cases.push({\n name: 'reject_mismatched_signature_target',\n description: 'Rejects a valid signature that covers a different webhook target URI.',\n expected: 'reject',\n body: {\n ...canonical,\n idempotency_key: 'whk_conformance_bad_target_01',\n },\n signatureMutation: 'mismatched_target',\n });\n }\n\n return cases;\n}\n\nfunction canonicalDeliveryEnvelope(idempotencyKey: string): Record<string, unknown> {\n return {\n idempotency_key: idempotencyKey,\n operation_id: 'delivery_report_67_2026-04',\n task_id: 'delivery_report_67_2026-04_000031',\n task_type: 'media_buy_delivery',\n status: 'completed',\n timestamp: '2026-05-26T09:00:44.582Z',\n message: 'Scheduled media buy delivery report available',\n result: {\n notification_type: 'scheduled',\n sequence_number: 31,\n reporting_period: {\n start: '2026-05-25T00:00:00Z',\n end: '2026-05-25T23:59:00Z',\n },\n currency: 'USD',\n media_buy_deliveries: [],\n },\n };\n}\n\nasync function headersForCase(\n receiverUrl: string,\n body: string,\n signing: ResolvedWebhookConformanceSigningOptions,\n extraHeaders: Record<string, string> | undefined,\n mutation: WebhookCaseDefinition['signatureMutation']\n): Promise<Record<string, string>> {\n const headers: Record<string, string> = {\n 'content-type': 'application/json',\n ...extraHeaders,\n };\n\n if (signing.mode === 'none') {\n return headers;\n }\n\n if (signing.mode === 'hmac') {\n const now = signing.now ? signing.now() : Math.floor(Date.now() / 1000);\n const timestamp = mutation === 'stale_timestamp' ? now - 600 : now;\n const signedBody = mutation === 'invalid_signature' ? `${body}\\n` : body;\n const hmac = createHmac('sha256', signing.secret);\n hmac.update(String(timestamp), 'utf8');\n hmac.update('.', 'utf8');\n hmac.update(signedBody, 'utf8');\n return {\n ...headers,\n 'x-adcp-timestamp': String(timestamp),\n 'x-adcp-signature': `sha256=${hmac.digest('hex')}`,\n };\n }\n\n const now = signing.now ? signing.now() : Math.floor(Date.now() / 1000);\n const targetUrl =\n mutation === 'mismatched_target' ? mismatchedTargetUrl(receiverUrl) : (signing.targetUrl ?? receiverUrl);\n const request: RequestLike = {\n method: 'POST',\n url: targetUrl,\n headers,\n body: mutation === 'invalid_signature' ? `${body}\\n` : body,\n };\n const signed = signWebhook(request, signing.key, {\n now: () => (mutation === 'stale_timestamp' ? now - 600 : now),\n });\n return { ...headers, ...signed.headers };\n}\n\nfunction mismatchedTargetUrl(receiverUrl: string): string {\n const url = new URL(receiverUrl);\n url.pathname = `${url.pathname.replace(/\\/$/, '')}/mismatched-target`;\n return url.toString();\n}\n\nfunction classifyResponse(expected: WebhookExpectation, status: number): WebhookConformanceVerdict {\n if (expected === 'accept') {\n return status >= 200 && status < 300 ? 'accepted' : 'false_reject';\n }\n return status >= 400 && status < 500 ? 'rejected_correctly' : 'false_accept';\n}\n\nasync function postWithTimeout(\n fetchImpl: typeof fetch,\n url: string,\n init: RequestInit,\n timeoutMs: number\n): Promise<Response> {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeoutMs);\n try {\n return await fetchImpl(url, { ...init, signal: controller.signal });\n } finally {\n clearTimeout(timer);\n }\n}\n\nasync function safeReadResponseBody(response: Response): Promise<string | undefined> {\n try {\n const body = await response.text();\n return body.length > 0 ? body.slice(0, 4096) : undefined;\n } catch {\n return undefined;\n }\n}\n"],"mappings":"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","names":["now"]}
|
|
1
|
+
{"version":3,"sources":["../../../src/lib/conformance/webhook.ts"],"sourcesContent":["import { createHmac } from 'node:crypto';\nimport { signWebhook, type RequestLike, type SignerKey } from '../signing/client';\nimport { mintEphemeralEd25519Key } from '../signing/testing';\nimport type { AdcpJsonWebKey } from '../signing/types';\nimport type {\n RunWebhookConformanceOptions,\n WebhookConformanceCase,\n WebhookConformanceReport,\n WebhookConformanceSigningOptions,\n WebhookConformanceVerdict,\n} from './types';\n\ntype WebhookExpectation = 'accept' | 'reject';\ntype ResolvedWebhookConformanceSigningOptions =\n | Exclude<WebhookConformanceSigningOptions, { mode: 'rfc9421' }>\n | (Extract<WebhookConformanceSigningOptions, { mode: 'rfc9421' }> & { key: SignerKey });\n\ninterface WebhookCaseDefinition {\n name: string;\n description: string;\n expected: WebhookExpectation;\n body: Record<string, unknown>;\n signatureMutation?: 'stale_timestamp' | 'invalid_signature' | 'mismatched_target';\n}\n\nconst DEFAULT_TIMEOUT_MS = 10_000;\nconst DUPLICATE_IDEMPOTENCY_KEY = 'whk_conformance_retry_000001';\n\n/**\n * Replay canonical buyer-receiver webhook cases against an inbound webhook URL.\n *\n * This runner intentionally tests the transport envelope, not seller tool\n * responses. It posts complete MCP webhook envelopes for accepted cases and\n * malformed top-level bodies for rejection cases. When `options.signing` is\n * provided, requests are signed over the exact raw JSON bytes sent on the wire.\n */\nexport async function runWebhookConformance(\n buyerReceiverUrl: string,\n options: RunWebhookConformanceOptions = {}\n): Promise<WebhookConformanceReport> {\n const startedAt = new Date();\n const fetchImpl = options.fetchImpl ?? fetch;\n const { signing, publicKey } = await resolveSigning(options.signing ?? { mode: 'none' });\n const cases = buildCases(signing);\n const results: WebhookConformanceCase[] = [];\n\n for (const testCase of cases) {\n const body = JSON.stringify(testCase.body);\n const headers = await headersForCase(buyerReceiverUrl, body, signing, options.headers, testCase.signatureMutation);\n\n try {\n const response = await postWithTimeout(\n fetchImpl,\n buyerReceiverUrl,\n {\n method: 'POST',\n headers,\n body,\n },\n options.timeoutMs ?? DEFAULT_TIMEOUT_MS\n );\n const responseBody = await safeReadResponseBody(response);\n results.push({\n name: testCase.name,\n description: testCase.description,\n expected: testCase.expected,\n verdict: classifyResponse(testCase.expected, response.status),\n request: {\n body: testCase.body,\n idempotencyKey: typeof testCase.body.idempotency_key === 'string' ? testCase.body.idempotency_key : undefined,\n },\n response: {\n status: response.status,\n ...(responseBody ? { body: responseBody } : {}),\n },\n });\n } catch (error) {\n results.push({\n name: testCase.name,\n description: testCase.description,\n expected: testCase.expected,\n verdict: testCase.expected === 'reject' ? 'rejected_correctly' : 'false_reject',\n request: {\n body: testCase.body,\n idempotencyKey: typeof testCase.body.idempotency_key === 'string' ? testCase.body.idempotency_key : undefined,\n },\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n const completedAt = new Date();\n return {\n receiverUrl: buyerReceiverUrl,\n totalCases: results.length,\n totalFailures: results.filter(result => result.verdict === 'false_accept' || result.verdict === 'false_reject')\n .length,\n cases: results,\n signing: { mode: signing.mode, ...(publicKey ? { publicKey } : {}) },\n startedAt: startedAt.toISOString(),\n completedAt: completedAt.toISOString(),\n durationMs: completedAt.getTime() - startedAt.getTime(),\n };\n}\n\nasync function resolveSigning(\n signing: WebhookConformanceSigningOptions\n): Promise<{ signing: ResolvedWebhookConformanceSigningOptions; publicKey?: AdcpJsonWebKey }> {\n if (signing.mode !== 'rfc9421' || signing.key) {\n return { signing: signing as ResolvedWebhookConformanceSigningOptions };\n }\n const keypair = await mintEphemeralEd25519Key({ adcp_use: 'webhook-signing' });\n return {\n signing: {\n ...signing,\n key: {\n keyid: keypair.kid,\n alg: keypair.algorithm,\n privateKey: keypair.privateKey,\n },\n },\n publicKey: keypair.publicKey,\n };\n}\n\nfunction buildCases(signing: ResolvedWebhookConformanceSigningOptions): WebhookCaseDefinition[] {\n const canonical = canonicalDeliveryEnvelope(DUPLICATE_IDEMPOTENCY_KEY);\n const cases: WebhookCaseDefinition[] = [\n {\n name: 'canonical_mcp_delivery_envelope',\n description: 'Accepts a complete MCP webhook envelope with a delivery report nested under result.',\n expected: 'accept',\n body: canonical,\n },\n {\n name: 'retry_preserves_idempotency_key',\n description: 'Accepts a retry of the same logical event with the same idempotency_key.',\n expected: 'accept',\n body: { ...canonical, timestamp: '2026-05-26T09:00:45.582Z' },\n },\n {\n name: 'reject_bare_delivery_result',\n description: 'Rejects delivery report content sent directly as the top-level POST body.',\n expected: 'reject',\n body: canonical.result as Record<string, unknown>,\n },\n {\n name: 'reject_missing_envelope_fields',\n description: 'Rejects an MCP-like envelope missing required transport fields.',\n expected: 'reject',\n body: {\n task_id: 'delivery_report_67_2026-04_000031',\n task_type: 'media_buy_delivery',\n status: 'completed',\n result: canonical.result,\n },\n },\n {\n name: 'reject_unsupported_status',\n description: 'Rejects malformed top-level async task status values.',\n expected: 'reject',\n body: {\n ...canonical,\n idempotency_key: 'whk_conformance_bad_status_0001',\n status: 'done',\n },\n },\n ];\n\n if (signing.mode !== 'none') {\n cases.push(\n {\n name: 'reject_stale_signature_timestamp',\n description: 'Rejects a request whose signature timestamp is outside the allowed freshness window.',\n expected: 'reject',\n body: {\n ...canonical,\n idempotency_key: 'whk_conformance_stale_sig_0001',\n },\n signatureMutation: 'stale_timestamp',\n },\n {\n name: 'reject_invalid_signature',\n description: 'Rejects a request whose signature does not cover the exact raw request body.',\n expected: 'reject',\n body: {\n ...canonical,\n idempotency_key: 'whk_conformance_bad_sig_00001',\n },\n signatureMutation: 'invalid_signature',\n }\n );\n }\n\n if (signing.mode === 'rfc9421') {\n cases.push({\n name: 'reject_mismatched_signature_target',\n description: 'Rejects a valid signature that covers a different webhook target URI.',\n expected: 'reject',\n body: {\n ...canonical,\n idempotency_key: 'whk_conformance_bad_target_01',\n },\n signatureMutation: 'mismatched_target',\n });\n }\n\n return cases;\n}\n\nfunction canonicalDeliveryEnvelope(idempotencyKey: string): Record<string, unknown> {\n return {\n idempotency_key: idempotencyKey,\n operation_id: 'delivery_report_67_2026-04',\n task_id: 'delivery_report_67_2026-04_000031',\n task_type: 'media_buy_delivery',\n status: 'completed',\n timestamp: '2026-05-26T09:00:44.582Z',\n message: 'Scheduled media buy delivery report available',\n result: {\n notification_type: 'scheduled',\n sequence_number: 31,\n reporting_period: {\n start: '2026-05-25T00:00:00Z',\n end: '2026-05-25T23:59:00Z',\n },\n currency: 'USD',\n media_buy_deliveries: [],\n },\n };\n}\n\nasync function headersForCase(\n receiverUrl: string,\n body: string,\n signing: ResolvedWebhookConformanceSigningOptions,\n extraHeaders: Record<string, string> | undefined,\n mutation: WebhookCaseDefinition['signatureMutation']\n): Promise<Record<string, string>> {\n const headers: Record<string, string> = {\n 'content-type': 'application/json',\n ...extraHeaders,\n };\n\n if (signing.mode === 'none') {\n return headers;\n }\n\n if (signing.mode === 'hmac') {\n const now = signing.now ? signing.now() : Math.floor(Date.now() / 1000);\n const timestamp = mutation === 'stale_timestamp' ? now - 600 : now;\n const signedBody = mutation === 'invalid_signature' ? `${body}\\n` : body;\n const hmac = createHmac('sha256', signing.secret);\n hmac.update(String(timestamp), 'utf8');\n hmac.update('.', 'utf8');\n hmac.update(signedBody, 'utf8');\n return {\n ...headers,\n 'x-adcp-timestamp': String(timestamp),\n 'x-adcp-signature': `sha256=${hmac.digest('hex')}`,\n };\n }\n\n const now = signing.now ? signing.now() : Math.floor(Date.now() / 1000);\n const targetUrl =\n mutation === 'mismatched_target' ? mismatchedTargetUrl(receiverUrl) : (signing.targetUrl ?? receiverUrl);\n const request: RequestLike = {\n method: 'POST',\n url: targetUrl,\n headers,\n body: mutation === 'invalid_signature' ? `${body}\\n` : body,\n };\n const signed = signWebhook(request, signing.key, {\n now: () => (mutation === 'stale_timestamp' ? now - 600 : now),\n });\n return { ...headers, ...signed.headers };\n}\n\nfunction mismatchedTargetUrl(receiverUrl: string): string {\n const url = new URL(receiverUrl);\n url.pathname = `${url.pathname.replace(/\\/$/, '')}/mismatched-target`;\n return url.toString();\n}\n\nfunction classifyResponse(expected: WebhookExpectation, status: number): WebhookConformanceVerdict {\n if (expected === 'accept') {\n return status >= 200 && status < 300 ? 'accepted' : 'false_reject';\n }\n return status >= 400 && status < 500 ? 'rejected_correctly' : 'false_accept';\n}\n\nasync function postWithTimeout(\n fetchImpl: typeof fetch,\n url: string,\n init: RequestInit,\n timeoutMs: number\n): Promise<Response> {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeoutMs);\n try {\n return await fetchImpl(url, { ...init, signal: controller.signal });\n } finally {\n clearTimeout(timer);\n }\n}\n\nasync function safeReadResponseBody(response: Response): Promise<string | undefined> {\n try {\n const body = await response.text();\n return body.length > 0 ? body.slice(0, 4096) : undefined;\n } catch {\n return undefined;\n }\n}\n"],"mappings":"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","names":["now"]}
|
|
@@ -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 { AgentClient } from "./AgentClient.mjs";
|
|
8
2
|
import { resolveAdcpVersion } from "../utils/adcp-version-config.mjs";
|
|
9
3
|
import { ConfigurationManager } from "./ConfigurationManager.mjs";
|