@adcp/sdk 12.0.0 → 12.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/lib/adapters/content-standards-adapter.mjs +0 -6
- package/dist/lib/adapters/content-standards-adapter.mjs.map +1 -1
- package/dist/lib/adapters/derived-account-store.mjs +0 -6
- package/dist/lib/adapters/derived-account-store.mjs.map +1 -1
- package/dist/lib/adapters/governance-adapter.mjs +0 -6
- package/dist/lib/adapters/governance-adapter.mjs.map +1 -1
- package/dist/lib/adapters/implicit-account-store.mjs +0 -6
- package/dist/lib/adapters/implicit-account-store.mjs.map +1 -1
- package/dist/lib/adapters/index.mjs +0 -6
- package/dist/lib/adapters/index.mjs.map +1 -1
- package/dist/lib/adapters/legacy/v2-5/create_media_buy.mjs +0 -6
- package/dist/lib/adapters/legacy/v2-5/create_media_buy.mjs.map +1 -1
- package/dist/lib/adapters/legacy/v2-5/get_products.mjs +0 -6
- package/dist/lib/adapters/legacy/v2-5/get_products.mjs.map +1 -1
- package/dist/lib/adapters/legacy/v2-5/index.mjs +0 -6
- package/dist/lib/adapters/legacy/v2-5/index.mjs.map +1 -1
- package/dist/lib/adapters/legacy/v2-5/list_creative_formats.mjs +0 -6
- package/dist/lib/adapters/legacy/v2-5/list_creative_formats.mjs.map +1 -1
- package/dist/lib/adapters/legacy/v2-5/preview_creative.mjs +0 -6
- package/dist/lib/adapters/legacy/v2-5/preview_creative.mjs.map +1 -1
- package/dist/lib/adapters/legacy/v2-5/sync_creatives.mjs +0 -6
- package/dist/lib/adapters/legacy/v2-5/sync_creatives.mjs.map +1 -1
- package/dist/lib/adapters/legacy/v2-5/types.mjs +0 -6
- package/dist/lib/adapters/legacy/v2-5/update_media_buy.mjs +0 -6
- package/dist/lib/adapters/legacy/v2-5/update_media_buy.mjs.map +1 -1
- package/dist/lib/adapters/oauth-passthrough-resolver.mjs +0 -6
- package/dist/lib/adapters/oauth-passthrough-resolver.mjs.map +1 -1
- package/dist/lib/adapters/property-list-adapter.mjs +0 -6
- package/dist/lib/adapters/property-list-adapter.mjs.map +1 -1
- package/dist/lib/adapters/roster-account-store.mjs +0 -6
- package/dist/lib/adapters/roster-account-store.mjs.map +1 -1
- package/dist/lib/adapters/si-session-manager.mjs +0 -6
- package/dist/lib/adapters/si-session-manager.mjs.map +1 -1
- package/dist/lib/adapters/version/3.0/brand-fields.mjs +0 -6
- package/dist/lib/adapters/version/3.0/brand-fields.mjs.map +1 -1
- package/dist/lib/adapters/version/3.0/get-products.mjs +0 -6
- package/dist/lib/adapters/version/3.0/get-products.mjs.map +1 -1
- package/dist/lib/adapters/version/3.0/index.mjs +0 -6
- package/dist/lib/adapters/version/3.0/index.mjs.map +1 -1
- package/dist/lib/adapters/version/3.0/sync-accounts.mjs +0 -6
- package/dist/lib/adapters/version/3.0/sync-accounts.mjs.map +1 -1
- package/dist/lib/adapters/version/index.mjs +0 -6
- package/dist/lib/adapters/version/index.mjs.map +1 -1
- package/dist/lib/adapters/version/types.mjs +0 -6
- package/dist/lib/advanced.mjs +0 -6
- package/dist/lib/advanced.mjs.map +1 -1
- package/dist/lib/agents/index.generated.mjs +0 -6
- package/dist/lib/agents/index.generated.mjs.map +1 -1
- package/dist/lib/auth/index.mjs +0 -6
- package/dist/lib/auth/index.mjs.map +1 -1
- package/dist/lib/auth/oauth/CLIFlowHandler.mjs +0 -6
- package/dist/lib/auth/oauth/CLIFlowHandler.mjs.map +1 -1
- package/dist/lib/auth/oauth/ClientCredentialsFlow.mjs +0 -6
- package/dist/lib/auth/oauth/ClientCredentialsFlow.mjs.map +1 -1
- package/dist/lib/auth/oauth/MCPOAuthProvider.mjs +0 -6
- package/dist/lib/auth/oauth/MCPOAuthProvider.mjs.map +1 -1
- package/dist/lib/auth/oauth/NonInteractiveFlowHandler.mjs +0 -6
- package/dist/lib/auth/oauth/NonInteractiveFlowHandler.mjs.map +1 -1
- package/dist/lib/auth/oauth/authorization-required.mjs +0 -6
- package/dist/lib/auth/oauth/authorization-required.mjs.map +1 -1
- package/dist/lib/auth/oauth/diagnose.mjs +0 -6
- package/dist/lib/auth/oauth/diagnose.mjs.map +1 -1
- package/dist/lib/auth/oauth/diagnostics.mjs +0 -6
- package/dist/lib/auth/oauth/diagnostics.mjs.map +1 -1
- package/dist/lib/auth/oauth/discovery.mjs +0 -6
- package/dist/lib/auth/oauth/discovery.mjs.map +1 -1
- package/dist/lib/auth/oauth/file-storage.mjs +0 -6
- package/dist/lib/auth/oauth/file-storage.mjs.map +1 -1
- package/dist/lib/auth/oauth/index.mjs +0 -6
- package/dist/lib/auth/oauth/index.mjs.map +1 -1
- package/dist/lib/auth/oauth/secret-resolver.mjs +0 -6
- package/dist/lib/auth/oauth/secret-resolver.mjs.map +1 -1
- package/dist/lib/auth/oauth/storage-registry.mjs +0 -6
- package/dist/lib/auth/oauth/storage-registry.mjs.map +1 -1
- package/dist/lib/auth/oauth/types.mjs +0 -6
- package/dist/lib/auth/oauth/types.mjs.map +1 -1
- package/dist/lib/auth/oauth/web-flow.mjs +0 -6
- package/dist/lib/auth/oauth/web-flow.mjs.map +1 -1
- package/dist/lib/brand/index.mjs +0 -6
- package/dist/lib/brand/index.mjs.map +1 -1
- package/dist/lib/canonical-references/index.mjs +6 -7
- package/dist/lib/canonical-references/index.mjs.map +1 -1
- package/dist/lib/client/index.mjs +0 -6
- package/dist/lib/client/index.mjs.map +1 -1
- package/dist/lib/compliance/index.mjs +0 -6
- package/dist/lib/compliance/index.mjs.map +1 -1
- package/dist/lib/compliance-fixtures/index.mjs +0 -6
- package/dist/lib/compliance-fixtures/index.mjs.map +1 -1
- package/dist/lib/compliance-fixtures/test-authorization-server.mjs +0 -6
- package/dist/lib/compliance-fixtures/test-authorization-server.mjs.map +1 -1
- package/dist/lib/conformance/index.mjs +0 -6
- package/dist/lib/conformance/index.mjs.map +1 -1
- package/dist/lib/conformance/invariants/uniformError.mjs +0 -6
- package/dist/lib/conformance/invariants/uniformError.mjs.map +1 -1
- package/dist/lib/conformance/invariants/uniformErrorComparator.mjs +0 -6
- package/dist/lib/conformance/invariants/uniformErrorComparator.mjs.map +1 -1
- package/dist/lib/conformance/oracle.mjs +0 -6
- package/dist/lib/conformance/oracle.mjs.map +1 -1
- package/dist/lib/conformance/runConformance.mjs +0 -6
- package/dist/lib/conformance/runConformance.mjs.map +1 -1
- package/dist/lib/conformance/runners.mjs +0 -6
- package/dist/lib/conformance/runners.mjs.map +1 -1
- package/dist/lib/conformance/schemaArbitrary.mjs +0 -6
- package/dist/lib/conformance/schemaArbitrary.mjs.map +1 -1
- package/dist/lib/conformance/schemaLoader.mjs +5 -6
- package/dist/lib/conformance/schemaLoader.mjs.map +1 -1
- package/dist/lib/conformance/seeder.mjs +0 -6
- package/dist/lib/conformance/seeder.mjs.map +1 -1
- package/dist/lib/conformance/types.mjs +0 -6
- package/dist/lib/conformance/types.mjs.map +1 -1
- package/dist/lib/conformance/webhook.mjs +0 -6
- package/dist/lib/conformance/webhook.mjs.map +1 -1
- package/dist/lib/core/ADCPMultiAgentClient.mjs +0 -6
- package/dist/lib/core/ADCPMultiAgentClient.mjs.map +1 -1
- package/dist/lib/core/AgentClient.mjs +0 -6
- package/dist/lib/core/AgentClient.mjs.map +1 -1
- package/dist/lib/core/AsyncHandler.mjs +0 -6
- package/dist/lib/core/AsyncHandler.mjs.map +1 -1
- package/dist/lib/core/ConfigurationManager.mjs +0 -6
- package/dist/lib/core/ConfigurationManager.mjs.map +1 -1
- package/dist/lib/core/ConversationTypes.mjs +0 -6
- package/dist/lib/core/CreativeAgentClient.mjs +0 -6
- package/dist/lib/core/CreativeAgentClient.mjs.map +1 -1
- package/dist/lib/core/GovernanceMiddleware.mjs +0 -6
- package/dist/lib/core/GovernanceMiddleware.mjs.map +1 -1
- package/dist/lib/core/GovernanceTypes.mjs +0 -6
- package/dist/lib/core/GovernanceTypes.mjs.map +1 -1
- package/dist/lib/core/ProtocolResponseParser.mjs +0 -6
- package/dist/lib/core/ProtocolResponseParser.mjs.map +1 -1
- package/dist/lib/core/ResponseValidator.mjs +0 -6
- package/dist/lib/core/ResponseValidator.mjs.map +1 -1
- package/dist/lib/core/SingleAgentClient.mjs +0 -6
- package/dist/lib/core/SingleAgentClient.mjs.map +1 -1
- package/dist/lib/core/TaskEventTypes.mjs +0 -6
- package/dist/lib/core/TaskEventTypes.mjs.map +1 -1
- package/dist/lib/core/TaskExecutor.mjs +0 -6
- package/dist/lib/core/TaskExecutor.mjs.map +1 -1
- package/dist/lib/core/match.mjs +0 -6
- package/dist/lib/core/match.mjs.map +1 -1
- package/dist/lib/core/task-status.mjs +0 -6
- package/dist/lib/core/task-status.mjs.map +1 -1
- package/dist/lib/core/webhook-url.mjs +0 -6
- package/dist/lib/core/webhook-url.mjs.map +1 -1
- package/dist/lib/discovery/adagents-redirects.mjs +0 -6
- package/dist/lib/discovery/adagents-redirects.mjs.map +1 -1
- package/dist/lib/discovery/agent-directory.mjs +0 -6
- package/dist/lib/discovery/agent-directory.mjs.map +1 -1
- package/dist/lib/discovery/inline-publisher-properties.mjs +0 -6
- package/dist/lib/discovery/inline-publisher-properties.mjs.map +1 -1
- package/dist/lib/discovery/network-consistency-checker.mjs +0 -6
- package/dist/lib/discovery/network-consistency-checker.mjs.map +1 -1
- package/dist/lib/discovery/property-crawler.mjs +0 -6
- package/dist/lib/discovery/property-crawler.mjs.map +1 -1
- package/dist/lib/discovery/property-index.mjs +0 -6
- package/dist/lib/discovery/property-index.mjs.map +1 -1
- package/dist/lib/discovery/publisher-property-selector.mjs +0 -6
- package/dist/lib/discovery/publisher-property-selector.mjs.map +1 -1
- package/dist/lib/discovery/resolve-agent-properties.mjs +0 -6
- package/dist/lib/discovery/resolve-agent-properties.mjs.map +1 -1
- package/dist/lib/discovery/types.mjs +0 -6
- package/dist/lib/discovery/validate-adagents.mjs +0 -6
- package/dist/lib/discovery/validate-adagents.mjs.map +1 -1
- package/dist/lib/enums.mjs +0 -6
- package/dist/lib/enums.mjs.map +1 -1
- package/dist/lib/errors/index.mjs +0 -6
- package/dist/lib/errors/index.mjs.map +1 -1
- package/dist/lib/express-mcp/index.mjs +0 -6
- package/dist/lib/express-mcp/index.mjs.map +1 -1
- package/dist/lib/governance/index.mjs +0 -6
- package/dist/lib/governance/index.mjs.map +1 -1
- package/dist/lib/handlers/types.mjs +0 -6
- package/dist/lib/handlers/types.mjs.map +1 -1
- package/dist/lib/index.mjs +0 -6
- package/dist/lib/index.mjs.map +1 -1
- package/dist/lib/media-buy/available-actions.mjs +0 -6
- package/dist/lib/media-buy/available-actions.mjs.map +1 -1
- package/dist/lib/media-buy/index.mjs +0 -6
- package/dist/lib/media-buy/index.mjs.map +1 -1
- package/dist/lib/media-buy/preflight.mjs +0 -6
- package/dist/lib/media-buy/preflight.mjs.map +1 -1
- package/dist/lib/media-buy/property-policy.mjs +0 -6
- package/dist/lib/media-buy/property-policy.mjs.map +1 -1
- package/dist/lib/media-buy/types.mjs +0 -6
- package/dist/lib/media-buy/types.mjs.map +1 -1
- package/dist/lib/media-buy/update-fields.generated.mjs +0 -6
- package/dist/lib/media-buy/update-fields.generated.mjs.map +1 -1
- package/dist/lib/mock-server/creative-ad-server/seed-data.mjs +0 -6
- package/dist/lib/mock-server/creative-ad-server/seed-data.mjs.map +1 -1
- package/dist/lib/mock-server/creative-ad-server/server.mjs +0 -6
- package/dist/lib/mock-server/creative-ad-server/server.mjs.map +1 -1
- package/dist/lib/mock-server/creative-template/seed-data.mjs +0 -6
- package/dist/lib/mock-server/creative-template/seed-data.mjs.map +1 -1
- package/dist/lib/mock-server/creative-template/server.mjs +0 -6
- package/dist/lib/mock-server/creative-template/server.mjs.map +1 -1
- package/dist/lib/mock-server/index.mjs +0 -6
- package/dist/lib/mock-server/index.mjs.map +1 -1
- package/dist/lib/mock-server/sales-guaranteed/recipe.mjs +0 -6
- package/dist/lib/mock-server/sales-guaranteed/recipe.mjs.map +1 -1
- package/dist/lib/mock-server/sales-guaranteed/seed-data.mjs +0 -6
- package/dist/lib/mock-server/sales-guaranteed/seed-data.mjs.map +1 -1
- package/dist/lib/mock-server/sales-guaranteed/server.mjs +0 -6
- package/dist/lib/mock-server/sales-guaranteed/server.mjs.map +1 -1
- package/dist/lib/mock-server/sales-non-guaranteed/recipe.mjs +0 -6
- package/dist/lib/mock-server/sales-non-guaranteed/recipe.mjs.map +1 -1
- package/dist/lib/mock-server/sales-non-guaranteed/seed-data.mjs +0 -6
- package/dist/lib/mock-server/sales-non-guaranteed/seed-data.mjs.map +1 -1
- package/dist/lib/mock-server/sales-non-guaranteed/server.mjs +0 -6
- package/dist/lib/mock-server/sales-non-guaranteed/server.mjs.map +1 -1
- package/dist/lib/mock-server/sales-social/seed-data.mjs +0 -6
- package/dist/lib/mock-server/sales-social/seed-data.mjs.map +1 -1
- package/dist/lib/mock-server/sales-social/server.mjs +0 -6
- package/dist/lib/mock-server/sales-social/server.mjs.map +1 -1
- package/dist/lib/mock-server/scenario.mjs +0 -6
- package/dist/lib/mock-server/scenario.mjs.map +1 -1
- package/dist/lib/mock-server/signal-marketplace/seed-data.mjs +0 -6
- package/dist/lib/mock-server/signal-marketplace/seed-data.mjs.map +1 -1
- package/dist/lib/mock-server/signal-marketplace/server.mjs +0 -6
- package/dist/lib/mock-server/signal-marketplace/server.mjs.map +1 -1
- package/dist/lib/mock-server/sponsored-intelligence/seed-data.mjs +0 -6
- package/dist/lib/mock-server/sponsored-intelligence/seed-data.mjs.map +1 -1
- package/dist/lib/mock-server/sponsored-intelligence/server.mjs +0 -6
- package/dist/lib/mock-server/sponsored-intelligence/server.mjs.map +1 -1
- package/dist/lib/net/address-guards.mjs +0 -6
- package/dist/lib/net/address-guards.mjs.map +1 -1
- package/dist/lib/net/index.mjs +0 -6
- package/dist/lib/net/index.mjs.map +1 -1
- package/dist/lib/net/ssrf-fetch.mjs +0 -6
- package/dist/lib/net/ssrf-fetch.mjs.map +1 -1
- package/dist/lib/observability/index.mjs +0 -6
- package/dist/lib/observability/index.mjs.map +1 -1
- package/dist/lib/observability/tracing.mjs +6 -7
- package/dist/lib/observability/tracing.mjs.map +1 -1
- package/dist/lib/protocols/a2a.mjs +0 -6
- package/dist/lib/protocols/a2a.mjs.map +1 -1
- package/dist/lib/protocols/abort.mjs +0 -6
- package/dist/lib/protocols/abort.mjs.map +1 -1
- package/dist/lib/protocols/index.mjs +0 -6
- package/dist/lib/protocols/index.mjs.map +1 -1
- package/dist/lib/protocols/mcp-modern.mjs +0 -6
- package/dist/lib/protocols/mcp-modern.mjs.map +1 -1
- package/dist/lib/protocols/mcp-tasks.mjs +0 -6
- package/dist/lib/protocols/mcp-tasks.mjs.map +1 -1
- package/dist/lib/protocols/mcp.mjs +0 -6
- package/dist/lib/protocols/mcp.mjs.map +1 -1
- package/dist/lib/protocols/rawResponseCapture.mjs +0 -6
- package/dist/lib/protocols/rawResponseCapture.mjs.map +1 -1
- package/dist/lib/protocols/responseSizeLimit.mjs +0 -6
- package/dist/lib/protocols/responseSizeLimit.mjs.map +1 -1
- package/dist/lib/protocols/transportDiagnostics.mjs +0 -6
- package/dist/lib/protocols/transportDiagnostics.mjs.map +1 -1
- package/dist/lib/registry/cursor-store.mjs +0 -6
- package/dist/lib/registry/cursor-store.mjs.map +1 -1
- package/dist/lib/registry/feed-stream.mjs +0 -6
- package/dist/lib/registry/feed-stream.mjs.map +1 -1
- package/dist/lib/registry/index.mjs +0 -6
- package/dist/lib/registry/index.mjs.map +1 -1
- package/dist/lib/registry/property-registry.mjs +0 -6
- package/dist/lib/registry/property-registry.mjs.map +1 -1
- package/dist/lib/registry/sync.mjs +0 -6
- package/dist/lib/registry/sync.mjs.map +1 -1
- package/dist/lib/registry/types.generated.mjs +0 -6
- package/dist/lib/registry/types.mjs +0 -6
- package/dist/lib/schemas/index.mjs +0 -6
- package/dist/lib/schemas/index.mjs.map +1 -1
- package/dist/lib/schemas-data/v2.5/_provenance.json +1 -1
- package/dist/lib/server/a2a-adapter.mjs +0 -6
- package/dist/lib/server/a2a-adapter.mjs.map +1 -1
- package/dist/lib/server/account-mode.mjs +0 -6
- package/dist/lib/server/account-mode.mjs.map +1 -1
- package/dist/lib/server/adcp-server.mjs +0 -6
- package/dist/lib/server/adcp-server.mjs.map +1 -1
- package/dist/lib/server/auth-introspection.mjs +0 -6
- package/dist/lib/server/auth-introspection.mjs.map +1 -1
- package/dist/lib/server/auth-signature.mjs +0 -6
- package/dist/lib/server/auth-signature.mjs.map +1 -1
- package/dist/lib/server/auth.mjs +0 -6
- package/dist/lib/server/auth.mjs.map +1 -1
- package/dist/lib/server/create-adcp-server.mjs +0 -6
- package/dist/lib/server/create-adcp-server.mjs.map +1 -1
- package/dist/lib/server/credential-policy.mjs +0 -6
- package/dist/lib/server/credential-policy.mjs.map +1 -1
- package/dist/lib/server/ctx-metadata/backends/memory.mjs +0 -6
- package/dist/lib/server/ctx-metadata/backends/memory.mjs.map +1 -1
- package/dist/lib/server/ctx-metadata/backends/pg.mjs +0 -6
- package/dist/lib/server/ctx-metadata/backends/pg.mjs.map +1 -1
- package/dist/lib/server/ctx-metadata/backends/redis.mjs +0 -6
- package/dist/lib/server/ctx-metadata/backends/redis.mjs.map +1 -1
- package/dist/lib/server/ctx-metadata/index.mjs +0 -6
- package/dist/lib/server/ctx-metadata/index.mjs.map +1 -1
- package/dist/lib/server/ctx-metadata/store.mjs +0 -6
- package/dist/lib/server/ctx-metadata/store.mjs.map +1 -1
- package/dist/lib/server/ctx-metadata/wire-shape.mjs +0 -6
- package/dist/lib/server/ctx-metadata/wire-shape.mjs.map +1 -1
- package/dist/lib/server/decisioning/account.mjs +0 -6
- package/dist/lib/server/decisioning/account.mjs.map +1 -1
- package/dist/lib/server/decisioning/admin-router.mjs +0 -6
- package/dist/lib/server/decisioning/admin-router.mjs.map +1 -1
- package/dist/lib/server/decisioning/assembly-helpers.mjs +0 -6
- package/dist/lib/server/decisioning/assembly-helpers.mjs.map +1 -1
- package/dist/lib/server/decisioning/async-outcome.mjs +0 -6
- package/dist/lib/server/decisioning/async-outcome.mjs.map +1 -1
- package/dist/lib/server/decisioning/buyer-agent.mjs +0 -6
- package/dist/lib/server/decisioning/buyer-agent.mjs.map +1 -1
- package/dist/lib/server/decisioning/capabilities.mjs +0 -6
- package/dist/lib/server/decisioning/capabilities.mjs.map +1 -1
- package/dist/lib/server/decisioning/compose.mjs +0 -6
- package/dist/lib/server/decisioning/compose.mjs.map +1 -1
- package/dist/lib/server/decisioning/context.mjs +0 -6
- package/dist/lib/server/decisioning/errors-typed.mjs +0 -6
- package/dist/lib/server/decisioning/errors-typed.mjs.map +1 -1
- package/dist/lib/server/decisioning/helpers.mjs +0 -6
- package/dist/lib/server/decisioning/helpers.mjs.map +1 -1
- package/dist/lib/server/decisioning/index.mjs +0 -6
- package/dist/lib/server/decisioning/index.mjs.map +1 -1
- package/dist/lib/server/decisioning/list-helpers.mjs +0 -6
- package/dist/lib/server/decisioning/list-helpers.mjs.map +1 -1
- package/dist/lib/server/decisioning/manifest-helpers.mjs +0 -6
- package/dist/lib/server/decisioning/manifest-helpers.mjs.map +1 -1
- package/dist/lib/server/decisioning/pagination.mjs +0 -6
- package/dist/lib/server/decisioning/platform-helpers.mjs +0 -6
- package/dist/lib/server/decisioning/platform-helpers.mjs.map +1 -1
- package/dist/lib/server/decisioning/platform.mjs +0 -6
- package/dist/lib/server/decisioning/proposal/dispatch.mjs +0 -6
- package/dist/lib/server/decisioning/proposal/dispatch.mjs.map +1 -1
- package/dist/lib/server/decisioning/proposal/index.mjs +0 -6
- package/dist/lib/server/decisioning/proposal/index.mjs.map +1 -1
- package/dist/lib/server/decisioning/proposal/lifecycle.mjs +0 -6
- package/dist/lib/server/decisioning/proposal/lifecycle.mjs.map +1 -1
- package/dist/lib/server/decisioning/proposal/mock-manager.mjs +0 -6
- package/dist/lib/server/decisioning/proposal/mock-manager.mjs.map +1 -1
- package/dist/lib/server/decisioning/proposal/store.mjs +0 -6
- package/dist/lib/server/decisioning/proposal/store.mjs.map +1 -1
- package/dist/lib/server/decisioning/proposal/types.mjs +0 -6
- package/dist/lib/server/decisioning/proposal/types.mjs.map +1 -1
- package/dist/lib/server/decisioning/resolve-presets.mjs +0 -6
- package/dist/lib/server/decisioning/resolve-presets.mjs.map +1 -1
- package/dist/lib/server/decisioning/runtime/entity-hydration.generated.mjs +0 -6
- package/dist/lib/server/decisioning/runtime/entity-hydration.generated.mjs.map +1 -1
- package/dist/lib/server/decisioning/runtime/from-platform.mjs +0 -6
- package/dist/lib/server/decisioning/runtime/from-platform.mjs.map +1 -1
- package/dist/lib/server/decisioning/runtime/observed-modes.mjs +0 -6
- package/dist/lib/server/decisioning/runtime/observed-modes.mjs.map +1 -1
- package/dist/lib/server/decisioning/runtime/postgres-task-registry.mjs +0 -6
- package/dist/lib/server/decisioning/runtime/postgres-task-registry.mjs.map +1 -1
- package/dist/lib/server/decisioning/runtime/protocol-for-tool.mjs +0 -6
- package/dist/lib/server/decisioning/runtime/protocol-for-tool.mjs.map +1 -1
- package/dist/lib/server/decisioning/runtime/task-registry.mjs +0 -6
- package/dist/lib/server/decisioning/runtime/task-registry.mjs.map +1 -1
- package/dist/lib/server/decisioning/runtime/to-context.mjs +0 -6
- package/dist/lib/server/decisioning/runtime/to-context.mjs.map +1 -1
- package/dist/lib/server/decisioning/runtime/validate-platform.mjs +0 -6
- package/dist/lib/server/decisioning/runtime/validate-platform.mjs.map +1 -1
- package/dist/lib/server/decisioning/specialisms/audiences.mjs +0 -6
- package/dist/lib/server/decisioning/specialisms/brand-rights.mjs +0 -6
- package/dist/lib/server/decisioning/specialisms/campaign-governance.mjs +0 -6
- package/dist/lib/server/decisioning/specialisms/content-standards.mjs +0 -6
- package/dist/lib/server/decisioning/specialisms/creative-ad-server.mjs +0 -6
- package/dist/lib/server/decisioning/specialisms/creative.mjs +0 -6
- package/dist/lib/server/decisioning/specialisms/lists.mjs +0 -6
- package/dist/lib/server/decisioning/specialisms/sales.mjs +0 -6
- package/dist/lib/server/decisioning/specialisms/signals.mjs +0 -6
- package/dist/lib/server/decisioning/specialisms/sponsored-intelligence.mjs +0 -6
- package/dist/lib/server/decisioning/start-time.mjs +0 -6
- package/dist/lib/server/decisioning/start-time.mjs.map +1 -1
- package/dist/lib/server/decisioning/status-changes.mjs +0 -6
- package/dist/lib/server/decisioning/status-changes.mjs.map +1 -1
- package/dist/lib/server/decisioning/status-mappers.mjs +0 -6
- package/dist/lib/server/decisioning/status-mappers.mjs.map +1 -1
- package/dist/lib/server/decisioning/tenant-registry.mjs +0 -6
- package/dist/lib/server/decisioning/tenant-registry.mjs.map +1 -1
- package/dist/lib/server/decisioning/tenant-store.mjs +0 -6
- package/dist/lib/server/decisioning/tenant-store.mjs.map +1 -1
- package/dist/lib/server/decisioning/validate-specialisms.mjs +0 -6
- package/dist/lib/server/decisioning/validate-specialisms.mjs.map +1 -1
- package/dist/lib/server/dynamic-registry.mjs +0 -6
- package/dist/lib/server/dynamic-registry.mjs.map +1 -1
- package/dist/lib/server/envelope-allowlist.mjs +0 -6
- package/dist/lib/server/envelope-allowlist.mjs.map +1 -1
- package/dist/lib/server/error-arm-tools.mjs +5 -6
- package/dist/lib/server/error-arm-tools.mjs.map +1 -1
- package/dist/lib/server/errors.mjs +0 -6
- package/dist/lib/server/errors.mjs.map +1 -1
- package/dist/lib/server/example-tld-guard.mjs +0 -6
- package/dist/lib/server/example-tld-guard.mjs.map +1 -1
- package/dist/lib/server/express-adapter.mjs +0 -6
- package/dist/lib/server/express-adapter.mjs.map +1 -1
- package/dist/lib/server/governance.mjs +0 -6
- package/dist/lib/server/governance.mjs.map +1 -1
- package/dist/lib/server/idempotency/backends/lazy.mjs +0 -6
- package/dist/lib/server/idempotency/backends/lazy.mjs.map +1 -1
- package/dist/lib/server/idempotency/backends/memory.mjs +0 -6
- package/dist/lib/server/idempotency/backends/memory.mjs.map +1 -1
- package/dist/lib/server/idempotency/backends/pg.mjs +0 -6
- package/dist/lib/server/idempotency/backends/pg.mjs.map +1 -1
- package/dist/lib/server/idempotency/backends/redis.mjs +0 -6
- package/dist/lib/server/idempotency/backends/redis.mjs.map +1 -1
- package/dist/lib/server/idempotency/index.mjs +0 -6
- package/dist/lib/server/idempotency/index.mjs.map +1 -1
- package/dist/lib/server/idempotency/store.mjs +0 -6
- package/dist/lib/server/idempotency/store.mjs.map +1 -1
- package/dist/lib/server/index.mjs +0 -6
- package/dist/lib/server/index.mjs.map +1 -1
- package/dist/lib/server/legacy/v5/index.mjs +0 -6
- package/dist/lib/server/legacy/v5/index.mjs.map +1 -1
- package/dist/lib/server/mcp-modern-server.mjs +0 -6
- package/dist/lib/server/mcp-modern-server.mjs.map +1 -1
- package/dist/lib/server/media-buy-actions.mjs +0 -6
- package/dist/lib/server/media-buy-actions.mjs.map +1 -1
- package/dist/lib/server/media-buy-helpers.mjs +0 -6
- package/dist/lib/server/media-buy-helpers.mjs.map +1 -1
- package/dist/lib/server/media-buy-store.mjs +0 -6
- package/dist/lib/server/media-buy-store.mjs.map +1 -1
- package/dist/lib/server/normalize-errors.mjs +0 -6
- package/dist/lib/server/normalize-errors.mjs.map +1 -1
- package/dist/lib/server/operational-platform.mjs +0 -6
- package/dist/lib/server/operational-platform.mjs.map +1 -1
- package/dist/lib/server/pick-safe-details.mjs +0 -6
- package/dist/lib/server/pick-safe-details.mjs.map +1 -1
- package/dist/lib/server/pin-and-bind-fetch.mjs +0 -6
- package/dist/lib/server/pin-and-bind-fetch.mjs.map +1 -1
- package/dist/lib/server/postgres-state-store.mjs +0 -6
- package/dist/lib/server/postgres-state-store.mjs.map +1 -1
- package/dist/lib/server/postgres-task-store.mjs +0 -6
- package/dist/lib/server/postgres-task-store.mjs.map +1 -1
- package/dist/lib/server/product-defaults.mjs +0 -6
- package/dist/lib/server/product-defaults.mjs.map +1 -1
- package/dist/lib/server/redact.mjs +0 -6
- package/dist/lib/server/redact.mjs.map +1 -1
- package/dist/lib/server/responses.mjs +0 -6
- package/dist/lib/server/responses.mjs.map +1 -1
- package/dist/lib/server/serve.mjs +0 -6
- package/dist/lib/server/serve.mjs.map +1 -1
- package/dist/lib/server/socket-mode/conformance-client.mjs +0 -6
- package/dist/lib/server/socket-mode/conformance-client.mjs.map +1 -1
- package/dist/lib/server/socket-mode/index.mjs +0 -6
- package/dist/lib/server/socket-mode/index.mjs.map +1 -1
- package/dist/lib/server/socket-mode/ws-transport.mjs +0 -6
- package/dist/lib/server/socket-mode/ws-transport.mjs.map +1 -1
- package/dist/lib/server/state-machine.mjs +0 -6
- package/dist/lib/server/state-machine.mjs.map +1 -1
- package/dist/lib/server/state-store.mjs +0 -6
- package/dist/lib/server/state-store.mjs.map +1 -1
- package/dist/lib/server/structured-serialize.mjs +0 -6
- package/dist/lib/server/structured-serialize.mjs.map +1 -1
- package/dist/lib/server/targeting-helpers.mjs +0 -6
- package/dist/lib/server/targeting-helpers.mjs.map +1 -1
- package/dist/lib/server/tasks.mjs +0 -6
- package/dist/lib/server/tasks.mjs.map +1 -1
- package/dist/lib/server/test-controller-bridge.mjs +0 -6
- package/dist/lib/server/test-controller-bridge.mjs.map +1 -1
- package/dist/lib/server/test-controller.mjs +0 -6
- package/dist/lib/server/test-controller.mjs.map +1 -1
- package/dist/lib/server/upstream-helpers.mjs +0 -6
- package/dist/lib/server/upstream-helpers.mjs.map +1 -1
- package/dist/lib/server/webhook-emitter.mjs +0 -6
- package/dist/lib/server/webhook-emitter.mjs.map +1 -1
- package/dist/lib/server/wire-safe.mjs +0 -6
- package/dist/lib/server/wire-safe.mjs.map +1 -1
- package/dist/lib/server/wire-spec-fields.generated.mjs +0 -6
- package/dist/lib/server/wire-spec-fields.generated.mjs.map +1 -1
- package/dist/lib/server/wrap-envelope.mjs +0 -6
- package/dist/lib/server/wrap-envelope.mjs.map +1 -1
- package/dist/lib/signing/agent-context.mjs +0 -6
- package/dist/lib/signing/agent-context.mjs.map +1 -1
- package/dist/lib/signing/agent-fetch.mjs +0 -6
- package/dist/lib/signing/agent-fetch.mjs.map +1 -1
- package/dist/lib/signing/agent-resolver/canonicalize.mjs +0 -6
- package/dist/lib/signing/agent-resolver/canonicalize.mjs.map +1 -1
- package/dist/lib/signing/agent-resolver/capabilities-types.mjs +0 -6
- package/dist/lib/signing/agent-resolver/capabilities-types.mjs.map +1 -1
- package/dist/lib/signing/agent-resolver/consistency.mjs +0 -6
- package/dist/lib/signing/agent-resolver/consistency.mjs.map +1 -1
- package/dist/lib/signing/agent-resolver/errors.mjs +0 -6
- package/dist/lib/signing/agent-resolver/errors.mjs.map +1 -1
- package/dist/lib/signing/agent-resolver/etld.mjs +0 -6
- package/dist/lib/signing/agent-resolver/etld.mjs.map +1 -1
- package/dist/lib/signing/agent-resolver/fetch-helpers.mjs +0 -6
- package/dist/lib/signing/agent-resolver/fetch-helpers.mjs.map +1 -1
- package/dist/lib/signing/agent-resolver/index.mjs +0 -6
- package/dist/lib/signing/agent-resolver/index.mjs.map +1 -1
- package/dist/lib/signing/agent-resolver/jwks-set.mjs +0 -6
- package/dist/lib/signing/agent-resolver/jwks-set.mjs.map +1 -1
- package/dist/lib/signing/agent-resolver/resolve-agent.mjs +0 -6
- package/dist/lib/signing/agent-resolver/resolve-agent.mjs.map +1 -1
- package/dist/lib/signing/agent-resolver/select-agent.mjs +0 -6
- package/dist/lib/signing/agent-resolver/select-agent.mjs.map +1 -1
- package/dist/lib/signing/agent-resolver/strict-json.mjs +0 -6
- package/dist/lib/signing/agent-resolver/strict-json.mjs.map +1 -1
- package/dist/lib/signing/brand-jwks.mjs +0 -6
- package/dist/lib/signing/brand-jwks.mjs.map +1 -1
- package/dist/lib/signing/canonicalize.mjs +0 -6
- package/dist/lib/signing/canonicalize.mjs.map +1 -1
- package/dist/lib/signing/capability-cache.mjs +0 -6
- package/dist/lib/signing/capability-cache.mjs.map +1 -1
- package/dist/lib/signing/capability-priming.mjs +0 -6
- package/dist/lib/signing/capability-priming.mjs.map +1 -1
- package/dist/lib/signing/client.mjs +0 -6
- package/dist/lib/signing/client.mjs.map +1 -1
- package/dist/lib/signing/content-digest.mjs +0 -6
- package/dist/lib/signing/content-digest.mjs.map +1 -1
- package/dist/lib/signing/crypto.mjs +0 -6
- package/dist/lib/signing/crypto.mjs.map +1 -1
- package/dist/lib/signing/ecdsa-encoding.mjs +0 -6
- package/dist/lib/signing/ecdsa-encoding.mjs.map +1 -1
- package/dist/lib/signing/errors.mjs +0 -6
- package/dist/lib/signing/errors.mjs.map +1 -1
- package/dist/lib/signing/fetch-async.mjs +0 -6
- package/dist/lib/signing/fetch-async.mjs.map +1 -1
- package/dist/lib/signing/fetch.mjs +0 -6
- package/dist/lib/signing/fetch.mjs.map +1 -1
- package/dist/lib/signing/index.mjs +0 -6
- package/dist/lib/signing/index.mjs.map +1 -1
- package/dist/lib/signing/jwks-helpers.mjs +0 -6
- package/dist/lib/signing/jwks-helpers.mjs.map +1 -1
- package/dist/lib/signing/jwks-https.mjs +0 -6
- package/dist/lib/signing/jwks-https.mjs.map +1 -1
- package/dist/lib/signing/jwks.mjs +0 -6
- package/dist/lib/signing/jwks.mjs.map +1 -1
- package/dist/lib/signing/middleware.mjs +0 -6
- package/dist/lib/signing/middleware.mjs.map +1 -1
- package/dist/lib/signing/parser.mjs +0 -6
- package/dist/lib/signing/parser.mjs.map +1 -1
- package/dist/lib/signing/postgres-replay-store.mjs +0 -6
- package/dist/lib/signing/postgres-replay-store.mjs.map +1 -1
- package/dist/lib/signing/protocol-response.mjs +0 -6
- package/dist/lib/signing/protocol-response.mjs.map +1 -1
- package/dist/lib/signing/provider.mjs +0 -6
- package/dist/lib/signing/redis-replay-store.mjs +0 -6
- package/dist/lib/signing/redis-replay-store.mjs.map +1 -1
- package/dist/lib/signing/replay.mjs +0 -6
- package/dist/lib/signing/replay.mjs.map +1 -1
- package/dist/lib/signing/request-context.mjs +0 -6
- package/dist/lib/signing/request-context.mjs.map +1 -1
- package/dist/lib/signing/revocation-https.mjs +0 -6
- package/dist/lib/signing/revocation-https.mjs.map +1 -1
- package/dist/lib/signing/revocation.mjs +0 -6
- package/dist/lib/signing/revocation.mjs.map +1 -1
- package/dist/lib/signing/server.mjs +0 -6
- package/dist/lib/signing/server.mjs.map +1 -1
- package/dist/lib/signing/signer-async.mjs +0 -6
- package/dist/lib/signing/signer-async.mjs.map +1 -1
- package/dist/lib/signing/signer.mjs +0 -6
- package/dist/lib/signing/signer.mjs.map +1 -1
- package/dist/lib/signing/testing.mjs +0 -6
- package/dist/lib/signing/testing.mjs.map +1 -1
- package/dist/lib/signing/types.mjs +0 -6
- package/dist/lib/signing/types.mjs.map +1 -1
- package/dist/lib/signing/verifier.mjs +0 -6
- package/dist/lib/signing/verifier.mjs.map +1 -1
- package/dist/lib/signing/webhook-auth-detection.mjs +0 -6
- package/dist/lib/signing/webhook-auth-detection.mjs.map +1 -1
- package/dist/lib/signing/webhook-verifier.mjs +0 -6
- package/dist/lib/signing/webhook-verifier.mjs.map +1 -1
- package/dist/lib/storage/MemoryStorage.mjs +0 -6
- package/dist/lib/storage/MemoryStorage.mjs.map +1 -1
- package/dist/lib/storage/interfaces.mjs +0 -6
- package/dist/lib/substitution/encoder/SubstitutionEncoder.mjs +0 -6
- package/dist/lib/substitution/encoder/SubstitutionEncoder.mjs.map +1 -1
- package/dist/lib/substitution/encoder/index.mjs +0 -6
- package/dist/lib/substitution/encoder/index.mjs.map +1 -1
- package/dist/lib/substitution/index.mjs +0 -6
- package/dist/lib/substitution/index.mjs.map +1 -1
- package/dist/lib/substitution/observer/SubstitutionObserver.mjs +0 -6
- package/dist/lib/substitution/observer/SubstitutionObserver.mjs.map +1 -1
- package/dist/lib/substitution/observer/alignment.mjs +0 -6
- package/dist/lib/substitution/observer/alignment.mjs.map +1 -1
- package/dist/lib/substitution/observer/assertions.mjs +0 -6
- package/dist/lib/substitution/observer/assertions.mjs.map +1 -1
- package/dist/lib/substitution/observer/html-parser.mjs +0 -6
- package/dist/lib/substitution/observer/html-parser.mjs.map +1 -1
- package/dist/lib/substitution/observer/index.mjs +0 -6
- package/dist/lib/substitution/observer/index.mjs.map +1 -1
- package/dist/lib/substitution/observer/ssrf.mjs +0 -6
- package/dist/lib/substitution/observer/ssrf.mjs.map +1 -1
- package/dist/lib/substitution/rfc3986.mjs +0 -6
- package/dist/lib/substitution/rfc3986.mjs.map +1 -1
- package/dist/lib/substitution/translate.mjs +0 -6
- package/dist/lib/substitution/translate.mjs.map +1 -1
- package/dist/lib/substitution/types.mjs +0 -6
- package/dist/lib/substitution/vectors.mjs +0 -6
- package/dist/lib/substitution/vectors.mjs.map +1 -1
- package/dist/lib/testing/agent-tester.mjs +0 -6
- package/dist/lib/testing/agent-tester.mjs.map +1 -1
- package/dist/lib/testing/client.mjs +0 -6
- package/dist/lib/testing/client.mjs.map +1 -1
- package/dist/lib/testing/compliance/briefs.mjs +0 -6
- package/dist/lib/testing/compliance/briefs.mjs.map +1 -1
- package/dist/lib/testing/compliance/comply.mjs +0 -6
- package/dist/lib/testing/compliance/comply.mjs.map +1 -1
- package/dist/lib/testing/compliance/index.mjs +0 -6
- package/dist/lib/testing/compliance/index.mjs.map +1 -1
- package/dist/lib/testing/compliance/spec-conformance.mjs +0 -6
- package/dist/lib/testing/compliance/spec-conformance.mjs.map +1 -1
- package/dist/lib/testing/compliance/storyboard-tracks.mjs +0 -6
- package/dist/lib/testing/compliance/storyboard-tracks.mjs.map +1 -1
- package/dist/lib/testing/compliance/summary.mjs +0 -6
- package/dist/lib/testing/compliance/summary.mjs.map +1 -1
- package/dist/lib/testing/compliance/types.mjs +0 -6
- package/dist/lib/testing/comply-controller.mjs +0 -6
- package/dist/lib/testing/comply-controller.mjs.map +1 -1
- package/dist/lib/testing/controller-assertions.mjs +0 -6
- package/dist/lib/testing/controller-assertions.mjs.map +1 -1
- package/dist/lib/testing/formatter.mjs +0 -6
- package/dist/lib/testing/formatter.mjs.map +1 -1
- package/dist/lib/testing/index.mjs +0 -6
- package/dist/lib/testing/index.mjs.map +1 -1
- package/dist/lib/testing/local-agent-runner.mjs +0 -6
- package/dist/lib/testing/local-agent-runner.mjs.map +1 -1
- package/dist/lib/testing/orchestrator.mjs +0 -6
- package/dist/lib/testing/orchestrator.mjs.map +1 -1
- package/dist/lib/testing/personas/index.mjs +0 -6
- package/dist/lib/testing/personas/index.mjs.map +1 -1
- package/dist/lib/testing/scenarios/brand-rights.mjs +0 -6
- package/dist/lib/testing/scenarios/brand-rights.mjs.map +1 -1
- package/dist/lib/testing/scenarios/capabilities.mjs +0 -6
- package/dist/lib/testing/scenarios/capabilities.mjs.map +1 -1
- package/dist/lib/testing/scenarios/creative.mjs +0 -6
- package/dist/lib/testing/scenarios/creative.mjs.map +1 -1
- package/dist/lib/testing/scenarios/deterministic.mjs +0 -6
- package/dist/lib/testing/scenarios/deterministic.mjs.map +1 -1
- package/dist/lib/testing/scenarios/discovery.mjs +0 -6
- package/dist/lib/testing/scenarios/discovery.mjs.map +1 -1
- package/dist/lib/testing/scenarios/edge-cases.mjs +0 -6
- package/dist/lib/testing/scenarios/edge-cases.mjs.map +1 -1
- package/dist/lib/testing/scenarios/error-compliance.mjs +0 -6
- package/dist/lib/testing/scenarios/error-compliance.mjs.map +1 -1
- package/dist/lib/testing/scenarios/governance.mjs +0 -6
- package/dist/lib/testing/scenarios/governance.mjs.map +1 -1
- package/dist/lib/testing/scenarios/health.mjs +0 -6
- package/dist/lib/testing/scenarios/health.mjs.map +1 -1
- package/dist/lib/testing/scenarios/index.mjs +0 -6
- package/dist/lib/testing/scenarios/index.mjs.map +1 -1
- package/dist/lib/testing/scenarios/media-buy.mjs +0 -6
- package/dist/lib/testing/scenarios/media-buy.mjs.map +1 -1
- package/dist/lib/testing/scenarios/schema-compliance.mjs +0 -6
- package/dist/lib/testing/scenarios/schema-compliance.mjs.map +1 -1
- package/dist/lib/testing/scenarios/signals.mjs +0 -6
- package/dist/lib/testing/scenarios/signals.mjs.map +1 -1
- package/dist/lib/testing/scenarios/sponsored-intelligence.mjs +0 -6
- package/dist/lib/testing/scenarios/sponsored-intelligence.mjs.map +1 -1
- package/dist/lib/testing/scenarios/trusted-match.mjs +0 -6
- package/dist/lib/testing/scenarios/trusted-match.mjs.map +1 -1
- package/dist/lib/testing/seed-merge.mjs +0 -6
- package/dist/lib/testing/seed-merge.mjs.map +1 -1
- package/dist/lib/testing/storyboard/agent-routing.mjs +0 -6
- package/dist/lib/testing/storyboard/agent-routing.mjs.map +1 -1
- package/dist/lib/testing/storyboard/assertions.mjs +0 -6
- package/dist/lib/testing/storyboard/assertions.mjs.map +1 -1
- package/dist/lib/testing/storyboard/canonical-format-satisfaction.mjs +0 -6
- package/dist/lib/testing/storyboard/canonical-format-satisfaction.mjs.map +1 -1
- package/dist/lib/testing/storyboard/compliance.mjs +5 -6
- package/dist/lib/testing/storyboard/compliance.mjs.map +1 -1
- package/dist/lib/testing/storyboard/context.mjs +0 -6
- package/dist/lib/testing/storyboard/context.mjs.map +1 -1
- package/dist/lib/testing/storyboard/default-invariants.mjs +0 -6
- package/dist/lib/testing/storyboard/default-invariants.mjs.map +1 -1
- package/dist/lib/testing/storyboard/index.mjs +0 -6
- package/dist/lib/testing/storyboard/index.mjs.map +1 -1
- package/dist/lib/testing/storyboard/junit.mjs +0 -6
- package/dist/lib/testing/storyboard/junit.mjs.map +1 -1
- package/dist/lib/testing/storyboard/loader.mjs +0 -6
- package/dist/lib/testing/storyboard/loader.mjs.map +1 -1
- package/dist/lib/testing/storyboard/parallel-dispatch.mjs +0 -6
- package/dist/lib/testing/storyboard/parallel-dispatch.mjs.map +1 -1
- package/dist/lib/testing/storyboard/path.mjs +0 -6
- package/dist/lib/testing/storyboard/path.mjs.map +1 -1
- package/dist/lib/testing/storyboard/probes.mjs +0 -6
- package/dist/lib/testing/storyboard/probes.mjs.map +1 -1
- package/dist/lib/testing/storyboard/rate-limit-trip.mjs +0 -6
- package/dist/lib/testing/storyboard/rate-limit-trip.mjs.map +1 -1
- package/dist/lib/testing/storyboard/rejection-hints.mjs +0 -6
- package/dist/lib/testing/storyboard/rejection-hints.mjs.map +1 -1
- package/dist/lib/testing/storyboard/request-builder.mjs +0 -6
- package/dist/lib/testing/storyboard/request-builder.mjs.map +1 -1
- package/dist/lib/testing/storyboard/request-signing/builder.mjs +0 -6
- package/dist/lib/testing/storyboard/request-signing/builder.mjs.map +1 -1
- package/dist/lib/testing/storyboard/request-signing/grader.mjs +0 -6
- package/dist/lib/testing/storyboard/request-signing/grader.mjs.map +1 -1
- package/dist/lib/testing/storyboard/request-signing/index.mjs +0 -6
- package/dist/lib/testing/storyboard/request-signing/index.mjs.map +1 -1
- package/dist/lib/testing/storyboard/request-signing/probe-dispatch.mjs +0 -6
- package/dist/lib/testing/storyboard/request-signing/probe-dispatch.mjs.map +1 -1
- package/dist/lib/testing/storyboard/request-signing/probe.mjs +0 -6
- package/dist/lib/testing/storyboard/request-signing/probe.mjs.map +1 -1
- package/dist/lib/testing/storyboard/request-signing/synthesize.mjs +0 -6
- package/dist/lib/testing/storyboard/request-signing/synthesize.mjs.map +1 -1
- package/dist/lib/testing/storyboard/request-signing/test-kit.mjs +0 -6
- package/dist/lib/testing/storyboard/request-signing/test-kit.mjs.map +1 -1
- package/dist/lib/testing/storyboard/request-signing/types.mjs +0 -6
- package/dist/lib/testing/storyboard/request-signing/types.mjs.map +1 -1
- package/dist/lib/testing/storyboard/request-signing/vector-loader.mjs +0 -6
- package/dist/lib/testing/storyboard/request-signing/vector-loader.mjs.map +1 -1
- package/dist/lib/testing/storyboard/runner.mjs +0 -6
- package/dist/lib/testing/storyboard/runner.mjs.map +1 -1
- package/dist/lib/testing/storyboard/sandbox-entities.mjs +0 -6
- package/dist/lib/testing/storyboard/sandbox-entities.mjs.map +1 -1
- package/dist/lib/testing/storyboard/seeding.mjs +0 -6
- package/dist/lib/testing/storyboard/seeding.mjs.map +1 -1
- package/dist/lib/testing/storyboard/shape-drift-hints.mjs +0 -6
- package/dist/lib/testing/storyboard/shape-drift-hints.mjs.map +1 -1
- package/dist/lib/testing/storyboard/signer-grader/grader.mjs +0 -6
- package/dist/lib/testing/storyboard/signer-grader/grader.mjs.map +1 -1
- package/dist/lib/testing/storyboard/signer-grader/index.mjs +0 -6
- package/dist/lib/testing/storyboard/signer-grader/index.mjs.map +1 -1
- package/dist/lib/testing/storyboard/signer-grader/types.mjs +0 -6
- package/dist/lib/testing/storyboard/strict-validation-hints.mjs +0 -6
- package/dist/lib/testing/storyboard/strict-validation-hints.mjs.map +1 -1
- package/dist/lib/testing/storyboard/task-map.mjs +0 -6
- package/dist/lib/testing/storyboard/task-map.mjs.map +1 -1
- package/dist/lib/testing/storyboard/test-kit.mjs +0 -6
- package/dist/lib/testing/storyboard/test-kit.mjs.map +1 -1
- package/dist/lib/testing/storyboard/types.mjs +0 -6
- package/dist/lib/testing/storyboard/types.mjs.map +1 -1
- package/dist/lib/testing/storyboard/validations.mjs +0 -6
- package/dist/lib/testing/storyboard/validations.mjs.map +1 -1
- package/dist/lib/testing/storyboard/webhook-assertions.mjs +0 -6
- package/dist/lib/testing/storyboard/webhook-assertions.mjs.map +1 -1
- package/dist/lib/testing/storyboard/webhook-receiver.mjs +0 -6
- package/dist/lib/testing/storyboard/webhook-receiver.mjs.map +1 -1
- package/dist/lib/testing/stubs/governance-agent-stub.mjs +0 -6
- package/dist/lib/testing/stubs/governance-agent-stub.mjs.map +1 -1
- package/dist/lib/testing/stubs/index.mjs +0 -6
- package/dist/lib/testing/stubs/index.mjs.map +1 -1
- package/dist/lib/testing/test-controller.mjs +0 -6
- package/dist/lib/testing/test-controller.mjs.map +1 -1
- package/dist/lib/testing/test-helpers.mjs +0 -6
- package/dist/lib/testing/test-helpers.mjs.map +1 -1
- package/dist/lib/testing/types.mjs +0 -6
- package/dist/lib/types/adcp.mjs +0 -6
- package/dist/lib/types/adcp.mjs.map +1 -1
- package/dist/lib/types/asset-instances.mjs +0 -6
- package/dist/lib/types/compat.mjs +0 -6
- package/dist/lib/types/compat.mjs.map +1 -1
- package/dist/lib/types/core.generated.mjs +0 -6
- package/dist/lib/types/enums.generated.mjs +0 -6
- package/dist/lib/types/enums.generated.mjs.map +1 -1
- package/dist/lib/types/error-codes.mjs +0 -6
- package/dist/lib/types/error-codes.mjs.map +1 -1
- package/dist/lib/types/error-details.aliases.mjs +0 -6
- package/dist/lib/types/error-details.aliases.mjs.map +1 -1
- package/dist/lib/types/format-asset-slots.mjs +0 -6
- package/dist/lib/types/forward-compat-error-codes.mjs +0 -6
- package/dist/lib/types/forward-compat-error-codes.mjs.map +1 -1
- package/dist/lib/types/index.mjs +0 -6
- package/dist/lib/types/index.mjs.map +1 -1
- package/dist/lib/types/inline-enums.aliases.mjs +0 -6
- package/dist/lib/types/inline-enums.aliases.mjs.map +1 -1
- package/dist/lib/types/inline-enums.generated.mjs +0 -6
- package/dist/lib/types/inline-enums.generated.mjs.map +1 -1
- package/dist/lib/types/manifest.generated.mjs +0 -6
- package/dist/lib/types/manifest.generated.mjs.map +1 -1
- package/dist/lib/types/schemas.generated.mjs +0 -6
- package/dist/lib/types/schemas.generated.mjs.map +1 -1
- package/dist/lib/types/server-payload-aliases.mjs +0 -6
- package/dist/lib/types/server-payload.mjs +0 -6
- package/dist/lib/types/sync-rows.mjs +0 -6
- package/dist/lib/types/tools.generated.mjs +0 -6
- package/dist/lib/types/v2-5/index.mjs +0 -6
- package/dist/lib/types/v2-5/index.mjs.map +1 -1
- package/dist/lib/types/v2-5/tools.generated.mjs +0 -6
- package/dist/lib/types/v3-1-beta/index.mjs +0 -6
- package/dist/lib/types/v3-1-beta/index.mjs.map +1 -1
- package/dist/lib/types/v3-1-beta/tools.generated.mjs +0 -6
- package/dist/lib/types/wellknown-schemas.generated.mjs +0 -6
- package/dist/lib/types/wellknown-schemas.generated.mjs.map +1 -1
- package/dist/lib/upstream-recorder/constants.mjs +0 -6
- package/dist/lib/upstream-recorder/constants.mjs.map +1 -1
- package/dist/lib/upstream-recorder/index.mjs +0 -6
- package/dist/lib/upstream-recorder/index.mjs.map +1 -1
- package/dist/lib/upstream-recorder/recorder.mjs +0 -6
- package/dist/lib/upstream-recorder/recorder.mjs.map +1 -1
- package/dist/lib/upstream-recorder/types.mjs +0 -6
- package/dist/lib/upstream-recorder/types.mjs.map +1 -1
- package/dist/lib/utils/a2a-artifacts.mjs +0 -6
- package/dist/lib/utils/a2a-artifacts.mjs.map +1 -1
- package/dist/lib/utils/a2a-discovery.mjs +0 -6
- package/dist/lib/utils/a2a-discovery.mjs.map +1 -1
- package/dist/lib/utils/activation-key-builders.mjs +0 -6
- package/dist/lib/utils/activation-key-builders.mjs.map +1 -1
- package/dist/lib/utils/adcp-version-config.mjs +0 -6
- package/dist/lib/utils/adcp-version-config.mjs.map +1 -1
- package/dist/lib/utils/asset-builders.mjs +0 -6
- package/dist/lib/utils/asset-builders.mjs.map +1 -1
- package/dist/lib/utils/build-creative-return-builders.mjs +0 -6
- package/dist/lib/utils/build-creative-return-builders.mjs.map +1 -1
- package/dist/lib/utils/buyer-retry-policy.mjs +0 -6
- package/dist/lib/utils/buyer-retry-policy.mjs.map +1 -1
- package/dist/lib/utils/capabilities.mjs +0 -6
- package/dist/lib/utils/capabilities.mjs.map +1 -1
- package/dist/lib/utils/capability-rollups.mjs +0 -6
- package/dist/lib/utils/capability-rollups.mjs.map +1 -1
- package/dist/lib/utils/creative-adapter.mjs +0 -6
- package/dist/lib/utils/creative-adapter.mjs.map +1 -1
- package/dist/lib/utils/creative-delivery.mjs +0 -6
- package/dist/lib/utils/creative-delivery.mjs.map +1 -1
- package/dist/lib/utils/deprecation.mjs +0 -6
- package/dist/lib/utils/deprecation.mjs.map +1 -1
- package/dist/lib/utils/envelope-status-compat.mjs +0 -6
- package/dist/lib/utils/envelope-status-compat.mjs.map +1 -1
- package/dist/lib/utils/error-extraction.mjs +0 -6
- package/dist/lib/utils/error-extraction.mjs.map +1 -1
- package/dist/lib/utils/extract-result.mjs +0 -6
- package/dist/lib/utils/extract-result.mjs.map +1 -1
- package/dist/lib/utils/format-asset-slot-builders.mjs +0 -6
- package/dist/lib/utils/format-asset-slot-builders.mjs.map +1 -1
- package/dist/lib/utils/format-assets.mjs +0 -6
- package/dist/lib/utils/format-assets.mjs.map +1 -1
- package/dist/lib/utils/format-render-builders.mjs +0 -6
- package/dist/lib/utils/format-render-builders.mjs.map +1 -1
- package/dist/lib/utils/format-renders.mjs +0 -6
- package/dist/lib/utils/format-renders.mjs.map +1 -1
- package/dist/lib/utils/get-products-cache-scope.mjs +0 -6
- package/dist/lib/utils/get-products-cache-scope.mjs.map +1 -1
- package/dist/lib/utils/glob.mjs +0 -6
- package/dist/lib/utils/glob.mjs.map +1 -1
- package/dist/lib/utils/global-async-local-storage.mjs +0 -6
- package/dist/lib/utils/global-async-local-storage.mjs.map +1 -1
- package/dist/lib/utils/idempotency.mjs +0 -6
- package/dist/lib/utils/idempotency.mjs.map +1 -1
- package/dist/lib/utils/index.mjs +0 -6
- package/dist/lib/utils/index.mjs.map +1 -1
- package/dist/lib/utils/jcs.mjs +0 -6
- package/dist/lib/utils/jcs.mjs.map +1 -1
- package/dist/lib/utils/json-depth.mjs +0 -6
- package/dist/lib/utils/json-depth.mjs.map +1 -1
- package/dist/lib/utils/logger.mjs +0 -6
- package/dist/lib/utils/logger.mjs.map +1 -1
- package/dist/lib/utils/media-buy-delivery-notification-builders.mjs +0 -6
- package/dist/lib/utils/media-buy-delivery-notification-builders.mjs.map +1 -1
- package/dist/lib/utils/media-buy-status.mjs +0 -6
- package/dist/lib/utils/media-buy-status.mjs.map +1 -1
- package/dist/lib/utils/pagination.mjs +0 -6
- package/dist/lib/utils/pagination.mjs.map +1 -1
- package/dist/lib/utils/preview-creative-builders.mjs +0 -6
- package/dist/lib/utils/preview-creative-builders.mjs.map +1 -1
- package/dist/lib/utils/preview-normalizer.mjs +0 -6
- package/dist/lib/utils/preview-normalizer.mjs.map +1 -1
- package/dist/lib/utils/preview-utils.mjs +0 -6
- package/dist/lib/utils/preview-utils.mjs.map +1 -1
- package/dist/lib/utils/pricing-adapter.mjs +0 -6
- package/dist/lib/utils/pricing-adapter.mjs.map +1 -1
- package/dist/lib/utils/probe-policy.mjs +0 -6
- package/dist/lib/utils/probe-policy.mjs.map +1 -1
- package/dist/lib/utils/protocol-detection.mjs +0 -6
- package/dist/lib/utils/protocol-detection.mjs.map +1 -1
- package/dist/lib/utils/redact-secrets.mjs +0 -6
- package/dist/lib/utils/redact-secrets.mjs.map +1 -1
- package/dist/lib/utils/redis-default-prefix-warn.mjs +0 -6
- package/dist/lib/utils/redis-default-prefix-warn.mjs.map +1 -1
- package/dist/lib/utils/render-builders.mjs +0 -6
- package/dist/lib/utils/render-builders.mjs.map +1 -1
- package/dist/lib/utils/request-normalizer.mjs +0 -6
- package/dist/lib/utils/request-normalizer.mjs.map +1 -1
- package/dist/lib/utils/response-schemas.mjs +0 -6
- package/dist/lib/utils/response-schemas.mjs.map +1 -1
- package/dist/lib/utils/response-unwrapper.mjs +0 -6
- package/dist/lib/utils/response-unwrapper.mjs.map +1 -1
- package/dist/lib/utils/retry.mjs +0 -6
- package/dist/lib/utils/retry.mjs.map +1 -1
- package/dist/lib/utils/signal-discovery-helpers.mjs +0 -6
- package/dist/lib/utils/signal-discovery-helpers.mjs.map +1 -1
- package/dist/lib/utils/signal-id-builders.mjs +0 -6
- package/dist/lib/utils/signal-id-builders.mjs.map +1 -1
- package/dist/lib/utils/sync-creatives-adapter.mjs +0 -6
- package/dist/lib/utils/sync-creatives-adapter.mjs.map +1 -1
- package/dist/lib/utils/task-state.mjs +0 -6
- package/dist/lib/utils/task-state.mjs.map +1 -1
- package/dist/lib/utils/tool-request-schemas.mjs +0 -6
- package/dist/lib/utils/tool-request-schemas.mjs.map +1 -1
- package/dist/lib/utils/typeGuards.mjs +0 -6
- package/dist/lib/utils/typeGuards.mjs.map +1 -1
- package/dist/lib/utils/union-errors.mjs +0 -6
- package/dist/lib/utils/union-errors.mjs.map +1 -1
- package/dist/lib/utils/validate-user-agent.mjs +0 -6
- package/dist/lib/utils/validate-user-agent.mjs.map +1 -1
- package/dist/lib/v2/format-schema/fetch.mjs +0 -6
- package/dist/lib/v2/format-schema/fetch.mjs.map +1 -1
- package/dist/lib/v2/format-schema/index.mjs +0 -6
- package/dist/lib/v2/format-schema/index.mjs.map +1 -1
- package/dist/lib/v2/format-schema/regex-safety.mjs +0 -6
- package/dist/lib/v2/format-schema/regex-safety.mjs.map +1 -1
- package/dist/lib/v2/format-schema/resolver.mjs +7 -8
- package/dist/lib/v2/format-schema/resolver.mjs.map +1 -1
- package/dist/lib/v2/format-schema/sandbox-refs.mjs +0 -6
- package/dist/lib/v2/format-schema/sandbox-refs.mjs.map +1 -1
- package/dist/lib/v2/projection/augment-response.mjs +0 -6
- package/dist/lib/v2/projection/augment-response.mjs.map +1 -1
- package/dist/lib/v2/projection/builders.mjs +0 -6
- package/dist/lib/v2/projection/builders.mjs.map +1 -1
- package/dist/lib/v2/projection/cache-versions.mjs +0 -6
- package/dist/lib/v2/projection/cache-versions.mjs.map +1 -1
- package/dist/lib/v2/projection/canonical-properties.mjs +5 -6
- package/dist/lib/v2/projection/canonical-properties.mjs.map +1 -1
- package/dist/lib/v2/projection/catalog.mjs +5 -6
- package/dist/lib/v2/projection/catalog.mjs.map +1 -1
- package/dist/lib/v2/projection/constants.mjs +0 -6
- package/dist/lib/v2/projection/constants.mjs.map +1 -1
- package/dist/lib/v2/projection/index.mjs +0 -6
- package/dist/lib/v2/projection/index.mjs.map +1 -1
- package/dist/lib/v2/projection/registry.mjs +5 -6
- package/dist/lib/v2/projection/registry.mjs.map +1 -1
- package/dist/lib/v2/projection/types.mjs +0 -6
- package/dist/lib/v2/projection/v1-to-v2.mjs +0 -6
- package/dist/lib/v2/projection/v1-to-v2.mjs.map +1 -1
- package/dist/lib/v2/projection/v2-to-v1.mjs +0 -6
- package/dist/lib/v2/projection/v2-to-v1.mjs.map +1 -1
- package/dist/lib/v2/projection/write-side.mjs +0 -6
- package/dist/lib/v2/projection/write-side.mjs.map +1 -1
- package/dist/lib/v2/publisher-catalog/formats.mjs +0 -6
- package/dist/lib/v2/publisher-catalog/formats.mjs.map +1 -1
- package/dist/lib/v2/publisher-catalog/index.mjs +0 -6
- package/dist/lib/v2/publisher-catalog/index.mjs.map +1 -1
- package/dist/lib/validation/client-hooks.mjs +0 -6
- package/dist/lib/validation/client-hooks.mjs.map +1 -1
- package/dist/lib/validation/hints.mjs +0 -6
- package/dist/lib/validation/hints.mjs.map +1 -1
- package/dist/lib/validation/index.mjs +0 -6
- package/dist/lib/validation/index.mjs.map +1 -1
- package/dist/lib/validation/schema-errors.mjs +0 -6
- package/dist/lib/validation/schema-errors.mjs.map +1 -1
- package/dist/lib/validation/schema-loader.mjs +5 -6
- package/dist/lib/validation/schema-loader.mjs.map +1 -1
- package/dist/lib/validation/schema-validator.mjs +0 -6
- package/dist/lib/validation/schema-validator.mjs.map +1 -1
- package/dist/lib/validation/sync-creatives.mjs +0 -6
- package/dist/lib/validation/sync-creatives.mjs.map +1 -1
- package/dist/lib/version.d.mts +3 -3
- package/dist/lib/version.d.ts +3 -3
- package/dist/lib/version.js +3 -3
- package/dist/lib/version.js.map +1 -1
- package/dist/lib/version.mjs +3 -9
- package/dist/lib/version.mjs.map +1 -1
- package/dist/lib/webhooks/index.mjs +0 -6
- package/dist/lib/webhooks/index.mjs.map +1 -1
- package/dist/lib/wholesale-feed-sync/index.mjs +0 -6
- package/dist/lib/wholesale-feed-sync/index.mjs.map +1 -1
- package/dist/lib/wholesale-feed-sync/sync.mjs +0 -6
- package/dist/lib/wholesale-feed-sync/sync.mjs.map +1 -1
- package/dist/lib/wholesale-feed-sync/types.mjs +0 -6
- package/dist/lib/wholesale-feed-sync/webhook-notification.mjs +0 -6
- package/dist/lib/wholesale-feed-sync/webhook-notification.mjs.map +1 -1
- package/package.json +2 -1
package/dist/lib/version.d.mts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* AdCP SDK library version
|
|
3
3
|
*/
|
|
4
|
-
export declare const LIBRARY_VERSION = "12.0.
|
|
4
|
+
export declare const LIBRARY_VERSION = "12.0.1";
|
|
5
5
|
/**
|
|
6
6
|
* AdCP specification version this library is built for
|
|
7
7
|
*/
|
|
@@ -33,10 +33,10 @@ export type AdcpVersion = (typeof COMPATIBLE_ADCP_VERSIONS)[number];
|
|
|
33
33
|
* Full version information
|
|
34
34
|
*/
|
|
35
35
|
export declare const VERSION_INFO: {
|
|
36
|
-
readonly library: "12.0.
|
|
36
|
+
readonly library: "12.0.1";
|
|
37
37
|
readonly adcp: "3.1.2";
|
|
38
38
|
readonly compatibleVersions: readonly ["v2.5", "v2.6", "v3", "3.0.0-beta.1", "3.0-beta.1", "3.0-beta", "3.0.0-beta.3", "3.0-beta.3", "3.0.0", "3.0", "3.0.1", "3.0.2", "3.0.3", "3.0.4", "3.0.5", "3.0.6", "3.0.7", "3.0.8", "3.0.9", "3.0.10", "3.0.11", "3.0.12", "3.1.0", "3.1", "3.1.1", "3.1.2"];
|
|
39
|
-
readonly generatedAt: "2026-07-
|
|
39
|
+
readonly generatedAt: "2026-07-17T15:43:08.232Z";
|
|
40
40
|
};
|
|
41
41
|
/**
|
|
42
42
|
* Get the AdCP specification version this library is built for
|
package/dist/lib/version.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* AdCP SDK library version
|
|
3
3
|
*/
|
|
4
|
-
export declare const LIBRARY_VERSION = "12.0.
|
|
4
|
+
export declare const LIBRARY_VERSION = "12.0.1";
|
|
5
5
|
/**
|
|
6
6
|
* AdCP specification version this library is built for
|
|
7
7
|
*/
|
|
@@ -33,10 +33,10 @@ export type AdcpVersion = (typeof COMPATIBLE_ADCP_VERSIONS)[number];
|
|
|
33
33
|
* Full version information
|
|
34
34
|
*/
|
|
35
35
|
export declare const VERSION_INFO: {
|
|
36
|
-
readonly library: "12.0.
|
|
36
|
+
readonly library: "12.0.1";
|
|
37
37
|
readonly adcp: "3.1.2";
|
|
38
38
|
readonly compatibleVersions: readonly ["v2.5", "v2.6", "v3", "3.0.0-beta.1", "3.0-beta.1", "3.0-beta", "3.0.0-beta.3", "3.0-beta.3", "3.0.0", "3.0", "3.0.1", "3.0.2", "3.0.3", "3.0.4", "3.0.5", "3.0.6", "3.0.7", "3.0.8", "3.0.9", "3.0.10", "3.0.11", "3.0.12", "3.1.0", "3.1", "3.1.1", "3.1.2"];
|
|
39
|
-
readonly generatedAt: "2026-07-
|
|
39
|
+
readonly generatedAt: "2026-07-17T15:43:08.232Z";
|
|
40
40
|
};
|
|
41
41
|
/**
|
|
42
42
|
* Get the AdCP specification version this library is built for
|
package/dist/lib/version.js
CHANGED
|
@@ -31,7 +31,7 @@ __export(version_exports, {
|
|
|
31
31
|
toReleasePrecisionVersion: () => toReleasePrecisionVersion
|
|
32
32
|
});
|
|
33
33
|
module.exports = __toCommonJS(version_exports);
|
|
34
|
-
const LIBRARY_VERSION = "12.0.
|
|
34
|
+
const LIBRARY_VERSION = "12.0.1";
|
|
35
35
|
const ADCP_VERSION = "3.1.2";
|
|
36
36
|
const ADCP_MAJOR_VERSION = 3;
|
|
37
37
|
const COMPATIBLE_ADCP_VERSIONS = [
|
|
@@ -63,10 +63,10 @@ const COMPATIBLE_ADCP_VERSIONS = [
|
|
|
63
63
|
"3.1.2"
|
|
64
64
|
];
|
|
65
65
|
const VERSION_INFO = {
|
|
66
|
-
library: "12.0.
|
|
66
|
+
library: "12.0.1",
|
|
67
67
|
adcp: "3.1.2",
|
|
68
68
|
compatibleVersions: COMPATIBLE_ADCP_VERSIONS,
|
|
69
|
-
generatedAt: "2026-07-
|
|
69
|
+
generatedAt: "2026-07-17T15:43:08.232Z"
|
|
70
70
|
};
|
|
71
71
|
function getAdcpVersion() {
|
|
72
72
|
return ADCP_VERSION;
|
package/dist/lib/version.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/lib/version.ts"],"sourcesContent":["// Generated version information\n// This file is auto-generated by sync-version.ts\n\n/**\n * AdCP SDK library version\n */\nexport const LIBRARY_VERSION = '12.0.
|
|
1
|
+
{"version":3,"sources":["../../src/lib/version.ts"],"sourcesContent":["// Generated version information\n// This file is auto-generated by sync-version.ts\n\n/**\n * AdCP SDK library version\n */\nexport const LIBRARY_VERSION = '12.0.1';\n\n/**\n * AdCP specification version this library is built for\n */\nexport const ADCP_VERSION = '3.1.2';\n\n/**\n * AdCP major version sent with every request (adcp_major_version field).\n * Sellers validate this against their supported versions and return\n * VERSION_UNSUPPORTED if the version is not in range.\n */\nexport const ADCP_MAJOR_VERSION = 3;\n\n/**\n * AdCP versions this library maintains backward compatibility with.\n *\n * Auto-derived from `ADCP_VERSION` by scripts/sync-version.ts. Do not edit\n * this list by hand; bumping the AdCP pin via `npm run sync-version`\n * extends it.\n */\nexport const COMPATIBLE_ADCP_VERSIONS = [\n 'v2.5',\n 'v2.6',\n 'v3',\n '3.0.0-beta.1',\n '3.0-beta.1',\n '3.0-beta',\n '3.0.0-beta.3',\n '3.0-beta.3',\n '3.0.0',\n '3.0',\n '3.0.1',\n '3.0.2',\n '3.0.3',\n '3.0.4',\n '3.0.5',\n '3.0.6',\n '3.0.7',\n '3.0.8',\n '3.0.9',\n '3.0.10',\n '3.0.11',\n '3.0.12',\n '3.1.0',\n '3.1',\n '3.1.1',\n '3.1.2',\n] as const;\n\n/**\n * String literal union of every AdCP version the SDK formally supports.\n *\n * Used by the per-instance `adcpVersion` constructor option to give callers\n * autocomplete in editors. The intersection with `(string & {})` in the\n * config type preserves the escape hatch — any string is still accepted at\n * the type level — while the literal union surfaces canonical values first.\n */\nexport type AdcpVersion = (typeof COMPATIBLE_ADCP_VERSIONS)[number];\n\n/**\n * Full version information\n */\nexport const VERSION_INFO = {\n library: '12.0.1',\n adcp: '3.1.2',\n compatibleVersions: COMPATIBLE_ADCP_VERSIONS,\n generatedAt: '2026-07-17T15:43:08.232Z',\n} as const;\n\n/**\n * Get the AdCP specification version this library is built for\n */\nexport function getAdcpVersion(): string {\n return ADCP_VERSION;\n}\n\n/**\n * Get the library version\n */\nexport function getLibraryVersion(): string {\n return LIBRARY_VERSION;\n}\n\n/**\n * Check if this library version is compatible with a given AdCP version\n */\nexport function isCompatibleWith(adcpVersion: string): boolean {\n return (COMPATIBLE_ADCP_VERSIONS as readonly string[]).includes(adcpVersion);\n}\n\n/**\n * Get all AdCP versions this library is compatible with\n */\nexport function getCompatibleVersions(): readonly string[] {\n return COMPATIBLE_ADCP_VERSIONS;\n}\n\n/**\n * Extract the major version number from an AdCP version string.\n *\n * Accepts:\n * - Semver: '3.0.0', '3.0.1', '3.1.0-beta.1' → 3\n * - Legacy aliases: 'v3' → 3, 'v2.5' / 'v2.6' → 2\n *\n * Returns NaN for unrecognized strings — callers should validate before passing.\n */\nexport function parseAdcpMajorVersion(version: string): number {\n const trimmed = version.trim();\n const semverLike = trimmed.startsWith('v') ? trimmed.slice(1) : trimmed;\n const major = parseInt(semverLike.split('.')[0] ?? '', 10);\n return Number.isFinite(major) ? major : NaN;\n}\n\n/**\n * Normalize a full-semver AdCP version (`MAJOR.MINOR.PATCH[-prerelease]`) to\n * the release-precision form that AdCP 3.1+ requires on the wire:\n * `MAJOR.MINOR[-prerelease]` — the patch digit is dropped.\n *\n * Per the spec note on `adcp_version`: \"SDKs that read full-semver values\n * from bundle metadata (e.g. `ComplianceIndex.published_version =\n * \"3.1.0-beta.1\"`) MUST normalize to release-precision (`\"3.1-beta.1\"`)\n * before emitting on the wire — meta-field values are NOT valid wire\n * values.\" The wire regex (`^\\d+\\.\\d+(-[a-zA-Z0-9.-]+)?$`) rejects strings\n * with a patch digit.\n *\n * Behavior:\n * - `\"3.1.0-beta.7\"` → `\"3.1-beta.7\"`\n * - `\"3.1.0\"` → `\"3.1\"`\n * - `\"3.0.12\"` → `\"3.0\"`\n * - Already-release-precision input (`\"3.1\"`, `\"3.1-beta.7\"`) passes through\n * - Legacy aliases (`\"v2.5\"`, `\"v3\"`) pass through unchanged — the wire\n * regex doesn't accept them anyway; the v2.5 path uses\n * `adcp_major_version` instead of `adcp_version` for transport.\n * - Unrecognized strings pass through unchanged so callers can detect drift\n * via the wire validator rather than have it masked by this helper.\n */\nexport function toReleasePrecisionVersion(version: string): string {\n const trimmed = version.trim();\n // Pre-release form `MAJOR.MINOR.PATCH-prerelease` → `MAJOR.MINOR-prerelease`\n const semverMatch = trimmed.match(/^(\\d+)\\.(\\d+)\\.\\d+(-[A-Za-z0-9.-]+)?$/);\n if (semverMatch) {\n const [, major, minor, pre = ''] = semverMatch;\n return `${major}.${minor}${pre}`;\n }\n // Already release-precision (no patch digit). Includes `3.1`, `3.1-beta.7`.\n if (/^\\d+\\.\\d+(-[A-Za-z0-9.-]+)?$/.test(trimmed)) return trimmed;\n // Legacy aliases (`v3`, `v2.5`, `v2.6`) and anything we don't recognize —\n // pass through so the wire validator can flag genuine drift.\n return version;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAMO,MAAM,kBAAkB;AAKxB,MAAM,eAAe;AAOrB,MAAM,qBAAqB;AAS3B,MAAM,2BAA2B;AAAA,EACtC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAeO,MAAM,eAAe;AAAA,EAC1B,SAAS;AAAA,EACT,MAAM;AAAA,EACN,oBAAoB;AAAA,EACpB,aAAa;AACf;AAKO,SAAS,iBAAyB;AACvC,SAAO;AACT;AAKO,SAAS,oBAA4B;AAC1C,SAAO;AACT;AAKO,SAAS,iBAAiB,aAA8B;AAC7D,SAAQ,yBAA+C,SAAS,WAAW;AAC7E;AAKO,SAAS,wBAA2C;AACzD,SAAO;AACT;AAWO,SAAS,sBAAsB,SAAyB;AAC7D,QAAM,UAAU,QAAQ,KAAK;AAC7B,QAAM,aAAa,QAAQ,WAAW,GAAG,IAAI,QAAQ,MAAM,CAAC,IAAI;AAChE,QAAM,QAAQ,SAAS,WAAW,MAAM,GAAG,EAAE,CAAC,KAAK,IAAI,EAAE;AACzD,SAAO,OAAO,SAAS,KAAK,IAAI,QAAQ;AAC1C;AAyBO,SAAS,0BAA0B,SAAyB;AACjE,QAAM,UAAU,QAAQ,KAAK;AAE7B,QAAM,cAAc,QAAQ,MAAM,uCAAuC;AACzE,MAAI,aAAa;AACf,UAAM,CAAC,EAAE,OAAO,OAAO,MAAM,EAAE,IAAI;AACnC,WAAO,GAAG,KAAK,IAAI,KAAK,GAAG,GAAG;AAAA,EAChC;AAEA,MAAI,+BAA+B,KAAK,OAAO,EAAG,QAAO;AAGzD,SAAO;AACT;","names":[]}
|
package/dist/lib/version.mjs
CHANGED
|
@@ -1,10 +1,4 @@
|
|
|
1
|
-
|
|
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
|
-
const LIBRARY_VERSION = "12.0.0";
|
|
1
|
+
const LIBRARY_VERSION = "12.0.1";
|
|
8
2
|
const ADCP_VERSION = "3.1.2";
|
|
9
3
|
const ADCP_MAJOR_VERSION = 3;
|
|
10
4
|
const COMPATIBLE_ADCP_VERSIONS = [
|
|
@@ -36,10 +30,10 @@ const COMPATIBLE_ADCP_VERSIONS = [
|
|
|
36
30
|
"3.1.2"
|
|
37
31
|
];
|
|
38
32
|
const VERSION_INFO = {
|
|
39
|
-
library: "12.0.
|
|
33
|
+
library: "12.0.1",
|
|
40
34
|
adcp: "3.1.2",
|
|
41
35
|
compatibleVersions: COMPATIBLE_ADCP_VERSIONS,
|
|
42
|
-
generatedAt: "2026-07-
|
|
36
|
+
generatedAt: "2026-07-17T15:43:08.232Z"
|
|
43
37
|
};
|
|
44
38
|
function getAdcpVersion() {
|
|
45
39
|
return ADCP_VERSION;
|
package/dist/lib/version.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/lib/version.ts"],"sourcesContent":["// Generated version information\n// This file is auto-generated by sync-version.ts\n\n/**\n * AdCP SDK library version\n */\nexport const LIBRARY_VERSION = '12.0.
|
|
1
|
+
{"version":3,"sources":["../../src/lib/version.ts"],"sourcesContent":["// Generated version information\n// This file is auto-generated by sync-version.ts\n\n/**\n * AdCP SDK library version\n */\nexport const LIBRARY_VERSION = '12.0.1';\n\n/**\n * AdCP specification version this library is built for\n */\nexport const ADCP_VERSION = '3.1.2';\n\n/**\n * AdCP major version sent with every request (adcp_major_version field).\n * Sellers validate this against their supported versions and return\n * VERSION_UNSUPPORTED if the version is not in range.\n */\nexport const ADCP_MAJOR_VERSION = 3;\n\n/**\n * AdCP versions this library maintains backward compatibility with.\n *\n * Auto-derived from `ADCP_VERSION` by scripts/sync-version.ts. Do not edit\n * this list by hand; bumping the AdCP pin via `npm run sync-version`\n * extends it.\n */\nexport const COMPATIBLE_ADCP_VERSIONS = [\n 'v2.5',\n 'v2.6',\n 'v3',\n '3.0.0-beta.1',\n '3.0-beta.1',\n '3.0-beta',\n '3.0.0-beta.3',\n '3.0-beta.3',\n '3.0.0',\n '3.0',\n '3.0.1',\n '3.0.2',\n '3.0.3',\n '3.0.4',\n '3.0.5',\n '3.0.6',\n '3.0.7',\n '3.0.8',\n '3.0.9',\n '3.0.10',\n '3.0.11',\n '3.0.12',\n '3.1.0',\n '3.1',\n '3.1.1',\n '3.1.2',\n] as const;\n\n/**\n * String literal union of every AdCP version the SDK formally supports.\n *\n * Used by the per-instance `adcpVersion` constructor option to give callers\n * autocomplete in editors. The intersection with `(string & {})` in the\n * config type preserves the escape hatch — any string is still accepted at\n * the type level — while the literal union surfaces canonical values first.\n */\nexport type AdcpVersion = (typeof COMPATIBLE_ADCP_VERSIONS)[number];\n\n/**\n * Full version information\n */\nexport const VERSION_INFO = {\n library: '12.0.1',\n adcp: '3.1.2',\n compatibleVersions: COMPATIBLE_ADCP_VERSIONS,\n generatedAt: '2026-07-17T15:43:08.232Z',\n} as const;\n\n/**\n * Get the AdCP specification version this library is built for\n */\nexport function getAdcpVersion(): string {\n return ADCP_VERSION;\n}\n\n/**\n * Get the library version\n */\nexport function getLibraryVersion(): string {\n return LIBRARY_VERSION;\n}\n\n/**\n * Check if this library version is compatible with a given AdCP version\n */\nexport function isCompatibleWith(adcpVersion: string): boolean {\n return (COMPATIBLE_ADCP_VERSIONS as readonly string[]).includes(adcpVersion);\n}\n\n/**\n * Get all AdCP versions this library is compatible with\n */\nexport function getCompatibleVersions(): readonly string[] {\n return COMPATIBLE_ADCP_VERSIONS;\n}\n\n/**\n * Extract the major version number from an AdCP version string.\n *\n * Accepts:\n * - Semver: '3.0.0', '3.0.1', '3.1.0-beta.1' → 3\n * - Legacy aliases: 'v3' → 3, 'v2.5' / 'v2.6' → 2\n *\n * Returns NaN for unrecognized strings — callers should validate before passing.\n */\nexport function parseAdcpMajorVersion(version: string): number {\n const trimmed = version.trim();\n const semverLike = trimmed.startsWith('v') ? trimmed.slice(1) : trimmed;\n const major = parseInt(semverLike.split('.')[0] ?? '', 10);\n return Number.isFinite(major) ? major : NaN;\n}\n\n/**\n * Normalize a full-semver AdCP version (`MAJOR.MINOR.PATCH[-prerelease]`) to\n * the release-precision form that AdCP 3.1+ requires on the wire:\n * `MAJOR.MINOR[-prerelease]` — the patch digit is dropped.\n *\n * Per the spec note on `adcp_version`: \"SDKs that read full-semver values\n * from bundle metadata (e.g. `ComplianceIndex.published_version =\n * \"3.1.0-beta.1\"`) MUST normalize to release-precision (`\"3.1-beta.1\"`)\n * before emitting on the wire — meta-field values are NOT valid wire\n * values.\" The wire regex (`^\\d+\\.\\d+(-[a-zA-Z0-9.-]+)?$`) rejects strings\n * with a patch digit.\n *\n * Behavior:\n * - `\"3.1.0-beta.7\"` → `\"3.1-beta.7\"`\n * - `\"3.1.0\"` → `\"3.1\"`\n * - `\"3.0.12\"` → `\"3.0\"`\n * - Already-release-precision input (`\"3.1\"`, `\"3.1-beta.7\"`) passes through\n * - Legacy aliases (`\"v2.5\"`, `\"v3\"`) pass through unchanged — the wire\n * regex doesn't accept them anyway; the v2.5 path uses\n * `adcp_major_version` instead of `adcp_version` for transport.\n * - Unrecognized strings pass through unchanged so callers can detect drift\n * via the wire validator rather than have it masked by this helper.\n */\nexport function toReleasePrecisionVersion(version: string): string {\n const trimmed = version.trim();\n // Pre-release form `MAJOR.MINOR.PATCH-prerelease` → `MAJOR.MINOR-prerelease`\n const semverMatch = trimmed.match(/^(\\d+)\\.(\\d+)\\.\\d+(-[A-Za-z0-9.-]+)?$/);\n if (semverMatch) {\n const [, major, minor, pre = ''] = semverMatch;\n return `${major}.${minor}${pre}`;\n }\n // Already release-precision (no patch digit). Includes `3.1`, `3.1-beta.7`.\n if (/^\\d+\\.\\d+(-[A-Za-z0-9.-]+)?$/.test(trimmed)) return trimmed;\n // Legacy aliases (`v3`, `v2.5`, `v2.6`) and anything we don't recognize —\n // pass through so the wire validator can flag genuine drift.\n return version;\n}\n"],"mappings":"AAMO,MAAM,kBAAkB;AAKxB,MAAM,eAAe;AAOrB,MAAM,qBAAqB;AAS3B,MAAM,2BAA2B;AAAA,EACtC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAeO,MAAM,eAAe;AAAA,EAC1B,SAAS;AAAA,EACT,MAAM;AAAA,EACN,oBAAoB;AAAA,EACpB,aAAa;AACf;AAKO,SAAS,iBAAyB;AACvC,SAAO;AACT;AAKO,SAAS,oBAA4B;AAC1C,SAAO;AACT;AAKO,SAAS,iBAAiB,aAA8B;AAC7D,SAAQ,yBAA+C,SAAS,WAAW;AAC7E;AAKO,SAAS,wBAA2C;AACzD,SAAO;AACT;AAWO,SAAS,sBAAsB,SAAyB;AAC7D,QAAM,UAAU,QAAQ,KAAK;AAC7B,QAAM,aAAa,QAAQ,WAAW,GAAG,IAAI,QAAQ,MAAM,CAAC,IAAI;AAChE,QAAM,QAAQ,SAAS,WAAW,MAAM,GAAG,EAAE,CAAC,KAAK,IAAI,EAAE;AACzD,SAAO,OAAO,SAAS,KAAK,IAAI,QAAQ;AAC1C;AAyBO,SAAS,0BAA0B,SAAyB;AACjE,QAAM,UAAU,QAAQ,KAAK;AAE7B,QAAM,cAAc,QAAQ,MAAM,uCAAuC;AACzE,MAAI,aAAa;AACf,UAAM,CAAC,EAAE,OAAO,OAAO,MAAM,EAAE,IAAI;AACnC,WAAO,GAAG,KAAK,IAAI,KAAK,GAAG,GAAG;AAAA,EAChC;AAEA,MAAI,+BAA+B,KAAK,OAAO,EAAG,QAAO;AAGzD,SAAO;AACT;","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, timingSafeEqual } from "crypto";
|
|
8
2
|
import {
|
|
9
3
|
normalizeWholesaleFeedWebhookNotification,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/lib/webhooks/index.ts"],"sourcesContent":["import { createHmac, timingSafeEqual } from 'crypto';\n\nexport {\n normalizeWholesaleFeedWebhookNotification,\n parseWholesaleFeedWebhookNotification,\n WholesaleFeedWebhookNotificationError,\n} from '../wholesale-feed-sync/webhook-notification';\nexport type {\n NormalizedWholesaleFeedWebhookNotification,\n WholesaleFeedWebhookAffectedEntityType,\n WholesaleFeedWebhookCacheScope,\n WholesaleFeedWebhookNotificationErrorCode,\n WholesaleFeedWebhookNotificationErrorDetails,\n WholesaleFeedWebhookNotificationType,\n} from '../wholesale-feed-sync/webhook-notification';\n\nexport type WebhookHeaderValue = string | number | readonly string[] | null | undefined;\nexport type WebhookHeadersLike = Headers | Record<string, WebhookHeaderValue>;\n\nexport type VerifyWebhookFailureReason =\n | 'missing_secret'\n | 'missing_headers'\n | 'ambiguous_headers'\n | 'invalid_timestamp'\n | 'stale_timestamp'\n | 'malformed_signature'\n | 'bad_signature';\n\nexport interface VerifyWebhookRequestOptions {\n /**\n * Raw HTTP body bytes captured before JSON parsing. Strings are interpreted\n * as UTF-8; pass Buffer/Uint8Array when your framework exposes bytes.\n */\n rawBody: string | Buffer | Uint8Array;\n /**\n * Shared HMAC secret. `globalSecret` is accepted as an alias for callers\n * matching ADCP_WEBHOOK_SECRET naming.\n */\n secret?: string;\n globalSecret?: string;\n /**\n * Headers object from your framework. Header names are matched\n * case-insensitively.\n */\n headers?: WebhookHeadersLike;\n /** Explicit x-adcp-signature header value. When `headers` is also provided, it must match. */\n signature?: WebhookHeaderValue;\n /** Explicit x-adcp-timestamp header value. When `headers` is also provided, it must match. */\n timestamp?: WebhookHeaderValue;\n /** Allowed absolute timestamp skew in seconds. Defaults to 300. */\n skewSeconds?: number;\n /** Current unix time in seconds. Defaults to `Date.now() / 1000`. */\n now?: () => number;\n}\n\nexport type VerifyWebhookRequestResult =\n | {\n ok: true;\n signature: string;\n timestamp: number;\n verifiedAt: number;\n }\n | {\n ok: false;\n reason: VerifyWebhookFailureReason;\n message: string;\n };\n\n/**\n * Verify a legacy AdCP HMAC-SHA256 webhook request.\n *\n * This verifies the deprecated `x-adcp-signature: sha256=...` +\n * `x-adcp-timestamp` profile. Spec-current webhook verification uses RFC 9421\n * via `verifyWebhookSignature` / `createWebhookVerifier` from\n * `@adcp/sdk/signing/server`.\n */\nexport function verifyWebhookRequest(options: VerifyWebhookRequestOptions): VerifyWebhookRequestResult {\n const secret = options.secret ?? options.globalSecret;\n if (!secret) {\n return fail('missing_secret', 'A webhook HMAC secret is required.');\n }\n\n const signature = resolveHeader('x-adcp-signature', options.signature, options.headers);\n if (signature.reason) return fail(signature.reason, signature.message);\n\n const timestamp = resolveHeader('x-adcp-timestamp', options.timestamp, options.headers);\n if (timestamp.reason) return fail(timestamp.reason, timestamp.message);\n\n if (!signature.value || !timestamp.value) {\n return fail('missing_headers', 'Webhook is missing x-adcp-signature or x-adcp-timestamp.');\n }\n\n const parsedTimestamp = parseTimestamp(timestamp.value);\n if (parsedTimestamp === undefined) {\n return fail('invalid_timestamp', 'x-adcp-timestamp must be an integer unix timestamp in seconds.');\n }\n\n const now = options.now ? Math.floor(options.now()) : Math.floor(Date.now() / 1000);\n const skewSeconds = options.skewSeconds ?? 300;\n if (!Number.isFinite(skewSeconds) || skewSeconds < 0) {\n return fail('invalid_timestamp', 'skewSeconds must be a non-negative number.');\n }\n if (Math.abs(now - parsedTimestamp) > skewSeconds) {\n return fail('stale_timestamp', `Webhook timestamp is outside the allowed ${skewSeconds}s skew window.`);\n }\n\n if (!/^sha256=[a-f0-9]{64}$/.test(signature.value)) {\n return fail('malformed_signature', 'x-adcp-signature must match sha256=<64 lowercase hex chars>.');\n }\n\n const hmac = createHmac('sha256', secret);\n hmac.update(String(parsedTimestamp), 'utf8');\n hmac.update('.', 'utf8');\n hmac.update(toBodyBytes(options.rawBody));\n const expected = `sha256=${hmac.digest('hex')}`;\n\n const expectedBytes = Buffer.from(expected, 'utf8');\n const actualBytes = Buffer.from(signature.value, 'utf8');\n if (actualBytes.length !== expectedBytes.length || !timingSafeEqual(actualBytes, expectedBytes)) {\n return fail('bad_signature', 'Webhook HMAC signature does not match the request body and timestamp.');\n }\n\n return {\n ok: true,\n signature: signature.value,\n timestamp: parsedTimestamp,\n verifiedAt: now,\n };\n}\n\nfunction fail(reason: VerifyWebhookFailureReason, message: string): VerifyWebhookRequestResult {\n return { ok: false, reason, message };\n}\n\nfunction toBodyBytes(rawBody: string | Buffer | Uint8Array): Buffer | Uint8Array {\n return typeof rawBody === 'string' ? Buffer.from(rawBody, 'utf8') : rawBody;\n}\n\nfunction parseTimestamp(value: string): number | undefined {\n if (!/^\\d+$/.test(value)) return undefined;\n const parsed = Number(value);\n return Number.isSafeInteger(parsed) ? parsed : undefined;\n}\n\nfunction resolveHeader(\n name: string,\n explicit: WebhookHeaderValue,\n headers: WebhookHeadersLike | undefined\n): { value?: string; reason?: VerifyWebhookFailureReason; message: string } {\n const explicitValue = normalizeHeaderValue(explicit);\n const headerValue: { value?: string; reason?: VerifyWebhookFailureReason; message: string } = headers\n ? readHeader(headers, name)\n : { message: '' };\n\n if (explicitValue.reason) return explicitValue;\n if (headerValue.reason) return headerValue;\n if (explicitValue.value && headerValue.value && explicitValue.value !== headerValue.value) {\n return {\n reason: 'ambiguous_headers',\n message: `Explicit ${name} does not match the header bag.`,\n };\n }\n return explicitValue.value ? explicitValue : headerValue;\n}\n\nfunction readHeader(\n headers: WebhookHeadersLike,\n name: string\n): { value?: string; reason?: VerifyWebhookFailureReason; message: string } {\n if (isHeaders(headers)) {\n const value = headers.get(name);\n if (value?.includes(',')) {\n return {\n reason: 'ambiguous_headers',\n message: `Multiple ${name} header values were provided.`,\n };\n }\n return normalizeHeaderValue(value);\n }\n\n const matches: WebhookHeaderValue[] = [];\n for (const [key, value] of Object.entries(headers)) {\n if (key.toLowerCase() === name) matches.push(value);\n }\n\n if (matches.length > 1) {\n return {\n reason: 'ambiguous_headers',\n message: `Multiple ${name} headers were provided with different casing.`,\n };\n }\n\n const normalized = normalizeHeaderValue(matches[0]);\n if (normalized.value?.includes(',')) {\n return {\n reason: 'ambiguous_headers',\n message: `Multiple ${name} header values were provided.`,\n };\n }\n return normalized;\n}\n\nfunction normalizeHeaderValue(value: WebhookHeaderValue): {\n value?: string;\n reason?: VerifyWebhookFailureReason;\n message: string;\n} {\n if (value == null) return { message: '' };\n if (Array.isArray(value)) {\n if (value.length !== 1) {\n return {\n reason: 'ambiguous_headers',\n message: 'Expected exactly one webhook header value.',\n };\n }\n return normalizeHeaderValue(value[0]);\n }\n const normalized = String(value).trim();\n return normalized ? { value: normalized, message: '' } : { message: '' };\n}\n\nfunction isHeaders(headers: WebhookHeadersLike): headers is Headers {\n return typeof (headers as Headers).get === 'function';\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../../src/lib/webhooks/index.ts"],"sourcesContent":["import { createHmac, timingSafeEqual } from 'crypto';\n\nexport {\n normalizeWholesaleFeedWebhookNotification,\n parseWholesaleFeedWebhookNotification,\n WholesaleFeedWebhookNotificationError,\n} from '../wholesale-feed-sync/webhook-notification';\nexport type {\n NormalizedWholesaleFeedWebhookNotification,\n WholesaleFeedWebhookAffectedEntityType,\n WholesaleFeedWebhookCacheScope,\n WholesaleFeedWebhookNotificationErrorCode,\n WholesaleFeedWebhookNotificationErrorDetails,\n WholesaleFeedWebhookNotificationType,\n} from '../wholesale-feed-sync/webhook-notification';\n\nexport type WebhookHeaderValue = string | number | readonly string[] | null | undefined;\nexport type WebhookHeadersLike = Headers | Record<string, WebhookHeaderValue>;\n\nexport type VerifyWebhookFailureReason =\n | 'missing_secret'\n | 'missing_headers'\n | 'ambiguous_headers'\n | 'invalid_timestamp'\n | 'stale_timestamp'\n | 'malformed_signature'\n | 'bad_signature';\n\nexport interface VerifyWebhookRequestOptions {\n /**\n * Raw HTTP body bytes captured before JSON parsing. Strings are interpreted\n * as UTF-8; pass Buffer/Uint8Array when your framework exposes bytes.\n */\n rawBody: string | Buffer | Uint8Array;\n /**\n * Shared HMAC secret. `globalSecret` is accepted as an alias for callers\n * matching ADCP_WEBHOOK_SECRET naming.\n */\n secret?: string;\n globalSecret?: string;\n /**\n * Headers object from your framework. Header names are matched\n * case-insensitively.\n */\n headers?: WebhookHeadersLike;\n /** Explicit x-adcp-signature header value. When `headers` is also provided, it must match. */\n signature?: WebhookHeaderValue;\n /** Explicit x-adcp-timestamp header value. When `headers` is also provided, it must match. */\n timestamp?: WebhookHeaderValue;\n /** Allowed absolute timestamp skew in seconds. Defaults to 300. */\n skewSeconds?: number;\n /** Current unix time in seconds. Defaults to `Date.now() / 1000`. */\n now?: () => number;\n}\n\nexport type VerifyWebhookRequestResult =\n | {\n ok: true;\n signature: string;\n timestamp: number;\n verifiedAt: number;\n }\n | {\n ok: false;\n reason: VerifyWebhookFailureReason;\n message: string;\n };\n\n/**\n * Verify a legacy AdCP HMAC-SHA256 webhook request.\n *\n * This verifies the deprecated `x-adcp-signature: sha256=...` +\n * `x-adcp-timestamp` profile. Spec-current webhook verification uses RFC 9421\n * via `verifyWebhookSignature` / `createWebhookVerifier` from\n * `@adcp/sdk/signing/server`.\n */\nexport function verifyWebhookRequest(options: VerifyWebhookRequestOptions): VerifyWebhookRequestResult {\n const secret = options.secret ?? options.globalSecret;\n if (!secret) {\n return fail('missing_secret', 'A webhook HMAC secret is required.');\n }\n\n const signature = resolveHeader('x-adcp-signature', options.signature, options.headers);\n if (signature.reason) return fail(signature.reason, signature.message);\n\n const timestamp = resolveHeader('x-adcp-timestamp', options.timestamp, options.headers);\n if (timestamp.reason) return fail(timestamp.reason, timestamp.message);\n\n if (!signature.value || !timestamp.value) {\n return fail('missing_headers', 'Webhook is missing x-adcp-signature or x-adcp-timestamp.');\n }\n\n const parsedTimestamp = parseTimestamp(timestamp.value);\n if (parsedTimestamp === undefined) {\n return fail('invalid_timestamp', 'x-adcp-timestamp must be an integer unix timestamp in seconds.');\n }\n\n const now = options.now ? Math.floor(options.now()) : Math.floor(Date.now() / 1000);\n const skewSeconds = options.skewSeconds ?? 300;\n if (!Number.isFinite(skewSeconds) || skewSeconds < 0) {\n return fail('invalid_timestamp', 'skewSeconds must be a non-negative number.');\n }\n if (Math.abs(now - parsedTimestamp) > skewSeconds) {\n return fail('stale_timestamp', `Webhook timestamp is outside the allowed ${skewSeconds}s skew window.`);\n }\n\n if (!/^sha256=[a-f0-9]{64}$/.test(signature.value)) {\n return fail('malformed_signature', 'x-adcp-signature must match sha256=<64 lowercase hex chars>.');\n }\n\n const hmac = createHmac('sha256', secret);\n hmac.update(String(parsedTimestamp), 'utf8');\n hmac.update('.', 'utf8');\n hmac.update(toBodyBytes(options.rawBody));\n const expected = `sha256=${hmac.digest('hex')}`;\n\n const expectedBytes = Buffer.from(expected, 'utf8');\n const actualBytes = Buffer.from(signature.value, 'utf8');\n if (actualBytes.length !== expectedBytes.length || !timingSafeEqual(actualBytes, expectedBytes)) {\n return fail('bad_signature', 'Webhook HMAC signature does not match the request body and timestamp.');\n }\n\n return {\n ok: true,\n signature: signature.value,\n timestamp: parsedTimestamp,\n verifiedAt: now,\n };\n}\n\nfunction fail(reason: VerifyWebhookFailureReason, message: string): VerifyWebhookRequestResult {\n return { ok: false, reason, message };\n}\n\nfunction toBodyBytes(rawBody: string | Buffer | Uint8Array): Buffer | Uint8Array {\n return typeof rawBody === 'string' ? Buffer.from(rawBody, 'utf8') : rawBody;\n}\n\nfunction parseTimestamp(value: string): number | undefined {\n if (!/^\\d+$/.test(value)) return undefined;\n const parsed = Number(value);\n return Number.isSafeInteger(parsed) ? parsed : undefined;\n}\n\nfunction resolveHeader(\n name: string,\n explicit: WebhookHeaderValue,\n headers: WebhookHeadersLike | undefined\n): { value?: string; reason?: VerifyWebhookFailureReason; message: string } {\n const explicitValue = normalizeHeaderValue(explicit);\n const headerValue: { value?: string; reason?: VerifyWebhookFailureReason; message: string } = headers\n ? readHeader(headers, name)\n : { message: '' };\n\n if (explicitValue.reason) return explicitValue;\n if (headerValue.reason) return headerValue;\n if (explicitValue.value && headerValue.value && explicitValue.value !== headerValue.value) {\n return {\n reason: 'ambiguous_headers',\n message: `Explicit ${name} does not match the header bag.`,\n };\n }\n return explicitValue.value ? explicitValue : headerValue;\n}\n\nfunction readHeader(\n headers: WebhookHeadersLike,\n name: string\n): { value?: string; reason?: VerifyWebhookFailureReason; message: string } {\n if (isHeaders(headers)) {\n const value = headers.get(name);\n if (value?.includes(',')) {\n return {\n reason: 'ambiguous_headers',\n message: `Multiple ${name} header values were provided.`,\n };\n }\n return normalizeHeaderValue(value);\n }\n\n const matches: WebhookHeaderValue[] = [];\n for (const [key, value] of Object.entries(headers)) {\n if (key.toLowerCase() === name) matches.push(value);\n }\n\n if (matches.length > 1) {\n return {\n reason: 'ambiguous_headers',\n message: `Multiple ${name} headers were provided with different casing.`,\n };\n }\n\n const normalized = normalizeHeaderValue(matches[0]);\n if (normalized.value?.includes(',')) {\n return {\n reason: 'ambiguous_headers',\n message: `Multiple ${name} header values were provided.`,\n };\n }\n return normalized;\n}\n\nfunction normalizeHeaderValue(value: WebhookHeaderValue): {\n value?: string;\n reason?: VerifyWebhookFailureReason;\n message: string;\n} {\n if (value == null) return { message: '' };\n if (Array.isArray(value)) {\n if (value.length !== 1) {\n return {\n reason: 'ambiguous_headers',\n message: 'Expected exactly one webhook header value.',\n };\n }\n return normalizeHeaderValue(value[0]);\n }\n const normalized = String(value).trim();\n return normalized ? { value: normalized, message: '' } : { message: '' };\n}\n\nfunction isHeaders(headers: WebhookHeadersLike): headers is Headers {\n return typeof (headers as Headers).get === 'function';\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1,9 +1,3 @@
|
|
|
1
|
-
import { fileURLToPath as __adcpFileURLToPath } from 'node:url';
|
|
2
|
-
import { dirname as __adcpDirname } from 'node:path';
|
|
3
|
-
import { createRequire as __adcpCreateRequire } from 'node:module';
|
|
4
|
-
const __filename = __adcpFileURLToPath(import.meta.url);
|
|
5
|
-
const __dirname = __adcpDirname(__filename);
|
|
6
|
-
const require = __adcpCreateRequire(import.meta.url);
|
|
7
1
|
import { WholesaleFeedSync } from "./sync.mjs";
|
|
8
2
|
import {
|
|
9
3
|
normalizeWholesaleFeedWebhookNotification,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/lib/wholesale-feed-sync/index.ts"],"sourcesContent":["// WholesaleFeedSync — in-memory mirror of an AdCP agent's wholesale product and\n// signal feeds. Discovers the agent's wholesale-feed capabilities at start() and\n// picks the highest-capability sync strategy the agent supports (auto-poll\n// conditional fetch or manual bootstrap).\n//\n// Companion to the AdCP 3.1 wholesale feed surfaces. Activates against 3.1+\n// agents that declare `wholesale_feed_versioning` and/or\n// `wholesale_feed_webhooks`; falls back to manual-mode bootstrap against 3.0\n// agents.\n\nexport { WholesaleFeedSync } from './sync';\nexport {\n normalizeWholesaleFeedWebhookNotification,\n parseWholesaleFeedWebhookNotification,\n WholesaleFeedWebhookNotificationError,\n} from './webhook-notification';\nexport type {\n WholesaleFeedSyncClient,\n WholesaleFeedSyncConfig,\n WholesaleFeedSyncEvents,\n WholesaleFeedSyncMode,\n WholesaleFeedSyncState,\n ProductFilter,\n ResolvedCapabilities,\n SignalFilter,\n} from './types';\nexport type {\n NormalizedWholesaleFeedWebhookNotification,\n WholesaleFeedWebhookAffectedEntityType,\n WholesaleFeedWebhookCacheScope,\n WholesaleFeedWebhookNotificationErrorCode,\n WholesaleFeedWebhookNotificationErrorDetails,\n WholesaleFeedWebhookNotificationType,\n} from './webhook-notification';\n"],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../../../src/lib/wholesale-feed-sync/index.ts"],"sourcesContent":["// WholesaleFeedSync — in-memory mirror of an AdCP agent's wholesale product and\n// signal feeds. Discovers the agent's wholesale-feed capabilities at start() and\n// picks the highest-capability sync strategy the agent supports (auto-poll\n// conditional fetch or manual bootstrap).\n//\n// Companion to the AdCP 3.1 wholesale feed surfaces. Activates against 3.1+\n// agents that declare `wholesale_feed_versioning` and/or\n// `wholesale_feed_webhooks`; falls back to manual-mode bootstrap against 3.0\n// agents.\n\nexport { WholesaleFeedSync } from './sync';\nexport {\n normalizeWholesaleFeedWebhookNotification,\n parseWholesaleFeedWebhookNotification,\n WholesaleFeedWebhookNotificationError,\n} from './webhook-notification';\nexport type {\n WholesaleFeedSyncClient,\n WholesaleFeedSyncConfig,\n WholesaleFeedSyncEvents,\n WholesaleFeedSyncMode,\n WholesaleFeedSyncState,\n ProductFilter,\n ResolvedCapabilities,\n SignalFilter,\n} from './types';\nexport type {\n NormalizedWholesaleFeedWebhookNotification,\n WholesaleFeedWebhookAffectedEntityType,\n WholesaleFeedWebhookCacheScope,\n WholesaleFeedWebhookNotificationErrorCode,\n WholesaleFeedWebhookNotificationErrorDetails,\n WholesaleFeedWebhookNotificationType,\n} from './webhook-notification';\n"],"mappings":"AAUA,SAAS,yBAAyB;AAClC;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OACK;","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 { EventEmitter } from "node:events";
|
|
8
2
|
import { isDeepStrictEqual } from "node:util";
|
|
9
3
|
import { randomUUID } from "node:crypto";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/lib/wholesale-feed-sync/sync.ts"],"sourcesContent":["import { EventEmitter } from 'node:events';\nimport { isDeepStrictEqual } from 'node:util';\nimport { randomUUID } from 'node:crypto';\nimport type * as V31Beta from '../types/v3-1-beta';\nimport type {\n WholesaleFeedSyncClient,\n WholesaleFeedSyncConfig,\n WholesaleFeedSyncEvents,\n WholesaleFeedSyncMode,\n WholesaleFeedSyncState,\n ProductFilter,\n ResolvedCapabilities,\n SignalFilter,\n} from './types';\n\ntype Product = V31Beta.Product;\n// `signals` is an inline array type on GetSignalsResponse (no top-level\n// Signal export in the generated bundle). Extract the element type so\n// the index map and search helpers stay strongly-typed.\ntype Signal = NonNullable<V31Beta.GetSignalsResponse['signals']>[number];\ntype FeedMetadata = {\n wholesaleFeedVersion: string | undefined;\n pricingVersion: string | undefined;\n cacheScope: 'public' | 'account';\n};\ntype BootstrapFeedResult<T> = {\n cancelled: boolean;\n unchanged: boolean;\n items: Map<string, T>;\n metadata: FeedMetadata;\n};\n\nconst DEFAULT_PROBE_INTERVAL_MS = 600_000;\nconst DEFAULT_CAPABILITY_REFRESH_INTERVAL_MS = 86_400_000;\nconst DEFAULT_BOOTSTRAP_PAGE_LIMIT = 100;\nconst VERSION_MISMATCH_RECOVERY_ATTEMPTS = 3;\nconst VERSION_MISMATCH_RECOVERY_BACKOFF_MS = 5;\n\n/**\n * In-memory mirror of an AdCP agent's wholesale product and signal feeds.\n *\n * Discovers the agent's wholesale-feed capabilities at `start()`, picks the\n * highest-capability sync strategy the agent supports, and maintains a\n * local index for zero-latency lookups. Falls back gracefully to manual\n * bootstrap when the agent does not advertise conditional-fetch tokens.\n *\n * @example\n * ```ts\n * import { AdCPClient } from '@adcp/sdk';\n * import { WholesaleFeedSync } from '@adcp/sdk/wholesale-feed-sync';\n *\n * const client = new AdCPClient({ agentUrl, adcpVersion: '3.1-beta' });\n * const sync = new WholesaleFeedSync({ client });\n *\n * sync.on('product.priced', ({ event }) => {\n * const p = event.payload as { product_id: string; pricing_options: unknown[] };\n * console.log('reprice:', p.product_id);\n * });\n *\n * await sync.start();\n * // sync.mode is 'auto-poll' / 'manual' depending on the agent\n * console.log(`syncing ${sync.products.count} products via ${sync.mode} mode`);\n * ```\n */\nexport class WholesaleFeedSync extends EventEmitter<WholesaleFeedSyncEvents> {\n private readonly client: WholesaleFeedSyncClient;\n private readonly account: V31Beta.AccountReference | undefined;\n private readonly webhookScope: NonNullable<WholesaleFeedSyncConfig['webhookScope']> | undefined;\n private readonly webhookDedupStore: WholesaleFeedSyncConfig['webhookDedupStore'] | undefined;\n private readonly probeIntervalMs: number;\n private readonly capabilityRefreshIntervalMs: number;\n private readonly errorHandler: ((error: Error) => void) | undefined;\n private startPromise: Promise<void> | null = null;\n private startPromiseEpoch: number | null = null;\n private signalsQueryableWarned = false;\n private readonly processedWebhookKeys = new Set<string>();\n private readonly processedWebhookEventKeys = new Set<string>();\n private lastWebhookEventId: string | undefined;\n\n private _state: WholesaleFeedSyncState = 'idle';\n private _mode: WholesaleFeedSyncMode = 'manual';\n private _capabilities: ResolvedCapabilities = {\n wholesaleFeedVersioning: false,\n webhooks: false,\n eventTypes: [],\n };\n private _lastSyncedAt: Date | undefined;\n private _lastEventAt: Date | undefined;\n\n private productIndex = new Map<string, Product>();\n private signalIndex = new Map<string, Signal>();\n\n private productWholesaleFeedVersion: string | undefined;\n private productPricingVersion: string | undefined;\n private productCacheScope: 'public' | 'account' = 'public';\n private signalWholesaleFeedVersion: string | undefined;\n private signalPricingVersion: string | undefined;\n private signalCacheScope: 'public' | 'account' = 'public';\n\n private probeTimer: ReturnType<typeof setTimeout> | null = null;\n private capabilityTimer: ReturnType<typeof setTimeout> | null = null;\n private lifecycleEpoch = 0;\n\n /**\n * Read-only view of the in-memory product index. The `mode` reflects the\n * sync strategy for product events specifically — in mixed-capability\n * agents (products-feed + signals-wholesale-only, or vice versa) this\n * may differ from `signals.mode`.\n */\n readonly products = {\n list: (): Product[] => [...this.productIndex.values()],\n get: (productId: string): Product | undefined => this.productIndex.get(productId),\n search: (filter: ProductFilter): Product[] => this.searchProducts(filter),\n get count(): number {\n return this.list().length;\n },\n get mode(): WholesaleFeedSyncMode {\n // Per-entity mode is the lowest mode for which the agent declares\n // the entity's event family. Future extension: when capability vectors\n // diverge per entity, return the entity-specific resolution here. v1\n // mirrors the top-level mode.\n return this._mode;\n },\n // Allow the inline getter `mode` to reach private state without binding.\n // Assigned in the constructor below.\n _mode: 'manual' as WholesaleFeedSyncMode,\n };\n\n /** Read-only view of the in-memory signal index. */\n readonly signals = {\n list: (): Signal[] => {\n this.warnIfSignalsNotQueryable();\n return [...this.signalIndex.values()];\n },\n get: (signalAgentSegmentId: string): Signal | undefined => this.signalIndex.get(signalAgentSegmentId),\n search: (filter: SignalFilter): Signal[] => {\n this.warnIfSignalsNotQueryable();\n return this.searchSignals(filter);\n },\n get count(): number {\n return this.list().length;\n },\n get mode(): WholesaleFeedSyncMode {\n return this._mode;\n },\n _mode: 'manual' as WholesaleFeedSyncMode,\n /**\n * `true` when the agent supports `discovery_mode: 'wholesale'` on\n * `get_signals` (i.e., signals are browsable). When `false`, the\n * agent only supports brief-mode discovery — `signals.list()` will\n * be empty until adopters call into the agent with their own briefs.\n */\n queryable: true,\n };\n\n /**\n * One-shot console warning when adopters call `signals.list()` or\n * `signals.search()` against an agent that doesn't support wholesale\n * signal enumeration. Without this, empty results read as \"no signals\n * match\" rather than \"the agent doesn't browse, only briefs.\"\n */\n private warnIfSignalsNotQueryable(): void {\n if (this.signals.queryable || this.signalsQueryableWarned) return;\n if (this._state === 'idle' || this._state === 'bootstrapping') return; // pre-start; nothing to warn about\n this.signalsQueryableWarned = true;\n // eslint-disable-next-line no-console\n console.warn(\n `[WholesaleFeedSync] signals.list()/search() returned an empty replica because the agent does not declare ` +\n `signals.discovery_modes: [\"wholesale\"]. Brief-mode signal discovery isn't mirrored — call ` +\n `client.getSignals({ signal_spec, ... }) with your brief instead, or omit this surface for this agent.`\n );\n }\n\n constructor(config: WholesaleFeedSyncConfig) {\n super();\n this.client = config.client;\n this.account = config.account;\n this.webhookScope = config.webhookScope;\n this.webhookDedupStore = config.webhookDedupStore;\n this.probeIntervalMs = config.probeIntervalMs ?? DEFAULT_PROBE_INTERVAL_MS;\n this.capabilityRefreshIntervalMs = config.capabilityRefreshIntervalMs ?? DEFAULT_CAPABILITY_REFRESH_INTERVAL_MS;\n this.errorHandler = config.onError;\n }\n\n // ====== Lifecycle ======\n\n /**\n * Probe the agent's capabilities, pick a sync mode, and bootstrap the\n * in-memory replica via wholesale enumeration. In `'auto-poll'` mode\n * starts the conditional wholesale-feed version probe loop.\n *\n * Safe to call repeatedly — concurrent calls await the in-flight\n * bootstrap and return when it completes (no duplicate bootstrap, no\n * silent drop). Sequential calls re-probe capabilities and re-bootstrap,\n * equivalent to calling `refresh()` after a mode upgrade.\n */\n async start(): Promise<void> {\n if (this.startPromise && this.startPromiseEpoch === this.lifecycleEpoch) return this.startPromise;\n const promise = this.startInner().finally(() => {\n if (this.startPromise === promise) {\n this.startPromise = null;\n this.startPromiseEpoch = null;\n }\n });\n this.startPromise = promise;\n this.startPromiseEpoch = this.lifecycleEpoch;\n return promise;\n }\n\n private async startInner(): Promise<void> {\n this.stop();\n const epoch = this.lifecycleEpoch;\n if (!(await this.resolveMode(epoch))) return;\n if (!(await this.bootstrap({ epoch }))) return;\n if (this._mode === 'auto-poll') {\n this.scheduleProbe(epoch);\n }\n if (this.capabilityRefreshIntervalMs > 0) {\n this.scheduleCapabilityRefresh(epoch);\n }\n }\n\n /** Stop all background activity. Preserves in-memory state and version tokens. */\n stop(): void {\n this.lifecycleEpoch++;\n if (this.probeTimer) clearTimeout(this.probeTimer);\n if (this.capabilityTimer) clearTimeout(this.capabilityTimer);\n this.probeTimer = null;\n this.capabilityTimer = null;\n if (this._state === 'syncing' || this._state === 'bootstrapping') this.setState('idle');\n }\n\n /**\n * Stop, clear all indexes and version tokens. Call `start()` again to\n * re-bootstrap from scratch.\n */\n async reset(): Promise<void> {\n this.stop();\n this.productIndex.clear();\n this.signalIndex.clear();\n this.productWholesaleFeedVersion = undefined;\n this.productPricingVersion = undefined;\n this.productCacheScope = 'public';\n this.signalWholesaleFeedVersion = undefined;\n this.signalPricingVersion = undefined;\n this.signalCacheScope = 'public';\n this._lastSyncedAt = undefined;\n this._lastEventAt = undefined;\n this.setState('idle');\n }\n\n /**\n * Force a manual re-bootstrap. Available in all modes. Fires diff events\n * for changes detected between the current replica and the freshly\n * fetched wholesale feed.\n */\n async refresh(): Promise<void> {\n const epoch = this.lifecycleEpoch;\n this.emit('resyncing', { reason: 'manual' });\n await this.bootstrap({ emitDiffs: true, epoch });\n }\n\n /**\n * Apply one beta-3 account-level wholesale feed webhook to the local mirror.\n * Call this from your HTTP webhook receiver after signature/auth validation.\n * Stale or out-of-order deliveries repair through conditional wholesale\n * reads instead of applying a suspect delta.\n */\n async applyWebhook(webhook: V31Beta.WholesaleFeedWebhook): Promise<void> {\n const epoch = this.lifecycleEpoch;\n const event = webhook.event;\n if (!event || webhook.notification_type !== event.event_type) {\n throw new Error('WholesaleFeedSync: wholesale feed webhook notification_type does not match event.event_type.');\n }\n if (webhook.notification_id !== event.event_id) {\n throw new Error('WholesaleFeedSync: wholesale feed webhook notification_id does not match event.event_id.');\n }\n this.assertWebhookScope(webhook);\n\n const payloadScope = (event.payload as { applies_to?: { scope?: string } }).applies_to?.scope;\n if (payloadScope && payloadScope !== webhook.cache_scope) {\n throw new Error(\n 'WholesaleFeedSync: wholesale feed webhook cache_scope does not match event.payload.applies_to.scope.'\n );\n }\n const payloadAccountIds = (event.payload as { applies_to?: { account_ids?: unknown } }).applies_to?.account_ids;\n const expectedAccountId = this.expectedWebhookAccountId();\n if (\n webhook.cache_scope === 'account' &&\n expectedAccountId &&\n Array.isArray(payloadAccountIds) &&\n !payloadAccountIds.includes(expectedAccountId)\n ) {\n throw new Error(\n 'WholesaleFeedSync: wholesale feed webhook account overlay does not include this mirror account.'\n );\n }\n const dedupeKey = this.webhookDedupeKey(webhook);\n const eventDedupeKey = this.webhookEventDedupeKey(webhook);\n if (await this.hasProcessedWebhook(dedupeKey, eventDedupeKey)) return;\n if (!this.isLifecycleCurrent(epoch)) return;\n\n if (this.lastWebhookEventId && compareUuidV7(event.event_id, this.lastWebhookEventId) <= 0) {\n if (!(await this.recoverFromVersionMismatch(event, epoch))) return;\n await this.markWebhookProcessed(dedupeKey, eventDedupeKey);\n return;\n }\n\n let currentVersion: string | undefined;\n try {\n currentVersion = this.currentWholesaleFeedVersionForEvent(event);\n } catch (err) {\n await this.markWebhookProcessed(dedupeKey, eventDedupeKey);\n this.rememberLastWebhookEventId(event.event_id);\n throw err;\n }\n if (\n webhook.previous_wholesale_feed_version &&\n currentVersion &&\n webhook.previous_wholesale_feed_version !== currentVersion\n ) {\n if (!(await this.recoverFromVersionMismatch(event, epoch))) return;\n await this.markWebhookProcessed(dedupeKey, eventDedupeKey);\n return;\n }\n\n if (event.event_type === 'wholesale_feed.bulk_change') {\n this.emit('wholesale_feed.bulk_change', { event });\n try {\n if (!(await this.recoverFromBulkChange(event, epoch))) return;\n } catch (err) {\n await this.markWebhookProcessed(dedupeKey, eventDedupeKey);\n this.rememberLastWebhookEventId(event.event_id);\n throw err;\n }\n await this.markWebhookProcessed(dedupeKey, eventDedupeKey);\n this.rememberLastWebhookEventId(event.event_id);\n return;\n }\n\n this.applyEvent(event);\n this.rememberWebhookVersion(webhook);\n this.emit('event', { event });\n this.emitTypedEvent(event);\n await this.markWebhookProcessed(dedupeKey, eventDedupeKey);\n this.rememberLastWebhookEventId(event.event_id);\n this._lastEventAt = new Date();\n this._lastSyncedAt = new Date();\n this.emit('sync', { eventsApplied: 1 });\n }\n\n // ====== Public state ======\n\n get state(): WholesaleFeedSyncState {\n return this._state;\n }\n get mode(): WholesaleFeedSyncMode {\n return this._mode;\n }\n get capabilities(): Readonly<ResolvedCapabilities> {\n // Return a fresh clone — `Readonly<T>` is shallow, and an adopter\n // mutating `sync.capabilities.eventTypes` (a JS array) would\n // otherwise corrupt internal state. Deep-clone is cheap (a handful\n // of primitives + one string array).\n return structuredClone(this._capabilities);\n }\n get lastSyncedAt(): Date | undefined {\n return this._lastSyncedAt;\n }\n get lastEventAt(): Date | undefined {\n return this._lastEventAt;\n }\n\n // ====== Private: capability resolution ======\n\n private async resolveMode(epoch = this.lifecycleEpoch): Promise<boolean> {\n const caps = await this.client.getAdcpCapabilities({});\n if (!this.isLifecycleCurrent(epoch)) return false;\n // TaskResult union — only `success` carries a typed `data` field.\n // Other task-arms (`deferred`, `input-required`, `error`) leave us\n // without enough info to pick a mode confidently. Spec says we MAY\n // fall back to manual wholesale reads against agents that don't\n // declare the surfaces — but that masks real auth/config\n // failures (e.g., a 401 returned via the `error` arm). Surface the\n // condition via an `error` event so adopters see it, then fall back.\n const status = (caps as { status?: string }).status;\n if (typeof status === 'string' && status !== 'success' && status !== 'completed') {\n const message =\n (caps as { error?: { message?: string } }).error?.message ?? `get_adcp_capabilities returned status=${status}`;\n const err = new Error(`WholesaleFeedSync: capability probe returned non-success status: ${message}`);\n this.errorHandler?.(err);\n this.emit('error', { error: err });\n // Fall through to the empty-stanza path below so the sync still\n // boots in manual mode.\n }\n const data = (caps as { data?: unknown }).data;\n const stanza = (data ?? {}) as {\n wholesale_feed_webhooks?: {\n supported?: boolean;\n event_types?: string[];\n };\n wholesale_feed_versioning?: { supported?: boolean };\n signals?: { discovery_modes?: string[] };\n };\n const wholesaleFeedVersioning = stanza.wholesale_feed_versioning?.supported === true;\n const webhooks = stanza.wholesale_feed_webhooks?.supported === true;\n const eventTypes = Array.isArray(stanza.wholesale_feed_webhooks?.event_types)\n ? [...stanza.wholesale_feed_webhooks!.event_types!]\n : [];\n const wholesaleSignals = stanza.signals?.discovery_modes?.includes('wholesale') ?? false;\n\n const resolved: ResolvedCapabilities = {\n wholesaleFeedVersioning,\n webhooks,\n eventTypes,\n };\n\n const mode: WholesaleFeedSyncMode = wholesaleFeedVersioning ? 'auto-poll' : 'manual';\n this._capabilities = resolved;\n this._mode = mode;\n this.products._mode = mode;\n this.signals._mode = mode;\n this.signals.queryable = wholesaleSignals;\n this.emit('mode_resolved', { mode, capabilities: resolved });\n return true;\n }\n\n // ====== Private: bootstrap (wholesale enumeration) ======\n\n private async bootstrap(\n options: { emitDiffs?: boolean; entities?: 'products' | 'signals' | 'all'; epoch?: number } = {}\n ): Promise<boolean> {\n const epoch = options.epoch ?? this.lifecycleEpoch;\n if (!this.isLifecycleCurrent(epoch)) return false;\n this.setState('bootstrapping');\n try {\n // Build into local maps and atomically swap on success. The previous\n // implementation cleared the live indexes BEFORE fetching, so an\n // `unchanged: true` short-circuit on the conditional-fetch path\n // would wipe the replica (the seller correctly tells us \"no\n // change,\" and we lose every product). Build-then-swap guarantees\n // the in-memory replica is never in a torn state and is only\n // mutated on a successful, fresh fetch.\n const previousProducts = new Map(this.productIndex);\n const previousSignals = new Map(this.signalIndex);\n let productResult: BootstrapFeedResult<Product> | undefined;\n let signalResult: BootstrapFeedResult<Signal> | undefined;\n const entities = options.entities ?? 'all';\n const refreshProducts = entities !== 'signals';\n const refreshSignals = entities !== 'products' && this.signals.queryable;\n\n if (refreshProducts) {\n productResult = await this.bootstrapProducts(epoch);\n if (productResult.cancelled) return false;\n }\n if (refreshSignals) {\n signalResult = await this.bootstrapSignals(epoch);\n if (signalResult.cancelled) return false;\n }\n\n if (!this.isLifecycleCurrent(epoch)) return false;\n\n if (refreshProducts && productResult) {\n this.commitProductMetadata(productResult.metadata);\n if (!productResult.unchanged) {\n this.productIndex = productResult.items;\n }\n }\n if (refreshSignals && signalResult) {\n this.commitSignalMetadata(signalResult.metadata);\n if (!signalResult.unchanged) {\n this.signalIndex = signalResult.items;\n }\n }\n\n if (options.emitDiffs) {\n this.emitDiffs(previousProducts, previousSignals);\n }\n\n this.setState('syncing');\n this._lastSyncedAt = new Date();\n this.emit('bootstrap', {\n productCount: this.productIndex.size,\n signalCount: this.signalIndex.size,\n mode: this._mode,\n });\n return true;\n } catch (err) {\n if (!this.isLifecycleCurrent(epoch)) return false;\n this.setState('error');\n const error = err instanceof Error ? err : new Error(String(err));\n this.errorHandler?.(error);\n this.emit('error', { error });\n throw error;\n }\n }\n\n /** Returns `true` when the seller short-circuited with `unchanged: true`. */\n private async bootstrapProducts(epoch: number): Promise<BootstrapFeedResult<Product>> {\n let cursor: string | undefined;\n const into = new Map<string, Product>();\n let metadata = this.currentProductMetadata();\n do {\n const params: Record<string, unknown> = {\n buying_mode: 'wholesale',\n pagination: { max_results: DEFAULT_BOOTSTRAP_PAGE_LIMIT, ...(cursor && { cursor }) },\n ...(this.account && { account: this.account }),\n };\n // Conditional fetch on the page-0 call when we already have a cached\n // version. Per the spec, the seller short-circuits with\n // `unchanged: true` and no payload — caller keeps the previous index.\n if (!cursor && metadata.wholesaleFeedVersion && this._capabilities.wholesaleFeedVersioning) {\n params.if_wholesale_feed_version = metadata.wholesaleFeedVersion;\n if (metadata.pricingVersion) params.if_pricing_version = metadata.pricingVersion;\n }\n const result = (await this.client.getProducts(params as never)) as {\n data?: V31Beta.GetProductsResponse;\n };\n if (!this.isLifecycleCurrent(epoch)) return { cancelled: true, unchanged: false, items: into, metadata };\n const body = result.data;\n if (!body) return { cancelled: false, unchanged: false, items: into, metadata };\n if (body.unchanged) {\n // Echo any newer pricing_version / cache_scope the seller\n // returned alongside the unchanged signal, then tell the caller\n // to keep the existing index.\n metadata = mergeFeedMetadata(metadata, body);\n return { cancelled: false, unchanged: true, items: into, metadata };\n }\n const products = Array.isArray(body.products) ? body.products : [];\n for (const product of products) {\n const id = (product as { product_id?: string }).product_id;\n if (typeof id === 'string') into.set(id, product as Product);\n }\n metadata = mergeFeedMetadata(metadata, body);\n cursor = body.pagination?.has_more ? body.pagination?.cursor : undefined;\n } while (cursor);\n return { cancelled: false, unchanged: false, items: into, metadata };\n }\n\n private async bootstrapSignals(epoch: number): Promise<BootstrapFeedResult<Signal>> {\n let cursor: string | undefined;\n const into = new Map<string, Signal>();\n let metadata = this.currentSignalMetadata();\n do {\n const params: Record<string, unknown> = {\n discovery_mode: 'wholesale',\n pagination: { max_results: DEFAULT_BOOTSTRAP_PAGE_LIMIT, ...(cursor && { cursor }) },\n ...(this.account && { account: this.account }),\n };\n if (!cursor && metadata.wholesaleFeedVersion && this._capabilities.wholesaleFeedVersioning) {\n params.if_wholesale_feed_version = metadata.wholesaleFeedVersion;\n if (metadata.pricingVersion) params.if_pricing_version = metadata.pricingVersion;\n }\n const result = (await this.client.getSignals(params as never)) as {\n data?: V31Beta.GetSignalsResponse;\n };\n if (!this.isLifecycleCurrent(epoch)) return { cancelled: true, unchanged: false, items: into, metadata };\n const body = result.data;\n if (!body) return { cancelled: false, unchanged: false, items: into, metadata };\n if (body.unchanged) {\n metadata = mergeFeedMetadata(metadata, body);\n return { cancelled: false, unchanged: true, items: into, metadata };\n }\n const signals = Array.isArray(body.signals) ? body.signals : [];\n for (const signal of signals) {\n const id = (signal as { signal_agent_segment_id?: string }).signal_agent_segment_id;\n if (typeof id === 'string') into.set(id, signal as Signal);\n }\n metadata = mergeFeedMetadata(metadata, body);\n cursor = body.pagination?.has_more ? body.pagination?.cursor : undefined;\n } while (cursor);\n return { cancelled: false, unchanged: false, items: into, metadata };\n }\n\n private async recoverFromBulkChange(\n event: V31Beta.WholesaleFeedEvent,\n epoch = this.lifecycleEpoch\n ): Promise<boolean> {\n this.emit('resyncing', { reason: 'bulk_change' });\n const affected = this.bulkChangeAffectedEntityType(event);\n if (affected === 'signal' && !this.signals.queryable) {\n throw new Error(\n 'WholesaleFeedSync: signal bulk_change cannot repair because the agent does not declare wholesale signal discovery.'\n );\n }\n const entities = affected === 'product' ? 'products' : 'signals';\n return this.bootstrap({ emitDiffs: true, entities, epoch });\n }\n\n private async recoverFromVersionMismatch(\n event: V31Beta.WholesaleFeedEvent,\n epoch = this.lifecycleEpoch\n ): Promise<boolean> {\n this.emit('resyncing', { reason: 'version_mismatch' });\n const beforeVersion = this.currentWholesaleFeedVersionForEvent(event);\n for (let attempt = 1; attempt <= VERSION_MISMATCH_RECOVERY_ATTEMPTS; attempt++) {\n const recovered = await this.bootstrap({ emitDiffs: true, epoch });\n if (!recovered) return false;\n const afterVersion = this.currentWholesaleFeedVersionForEvent(event);\n if (afterVersion !== beforeVersion) return true;\n if (attempt < VERSION_MISMATCH_RECOVERY_ATTEMPTS) {\n await sleep(VERSION_MISMATCH_RECOVERY_BACKOFF_MS * attempt);\n if (!this.isLifecycleCurrent(epoch)) return false;\n }\n }\n // At-least-once delivery can replay stale webhooks after the mirror has\n // already caught up. If bounded conditional reads do not advance the\n // opaque version token, acknowledge the delivery instead of poisoning\n // the seller's retry queue.\n return true;\n }\n\n // ====== Private: auto-poll mode version probe ======\n\n private scheduleProbe(epoch = this.lifecycleEpoch): void {\n if (!this.isLifecycleCurrent(epoch)) return;\n this.probeTimer = setTimeout(() => this.probeLoop(epoch), this.probeIntervalMs);\n }\n\n private async probeLoop(epoch: number): Promise<void> {\n if (!this.isLifecycleCurrent(epoch)) return;\n try {\n await this.probeVersion(epoch);\n } catch (err) {\n if (!this.isLifecycleCurrent(epoch)) return;\n const error = err instanceof Error ? err : new Error(String(err));\n this.emit('error', { error });\n this.errorHandler?.(error);\n }\n if (this.isLifecycleCurrent(epoch) && this._state === 'syncing' && this._mode === 'auto-poll') {\n this.scheduleProbe(epoch);\n }\n }\n\n private async probeVersion(epoch: number): Promise<void> {\n await this.bootstrap({ emitDiffs: true, epoch });\n }\n\n // ====== Private: capability refresh ======\n\n private scheduleCapabilityRefresh(epoch = this.lifecycleEpoch): void {\n if (!this.isLifecycleCurrent(epoch)) return;\n this.capabilityTimer = setTimeout(() => this.capabilityRefreshLoop(epoch), this.capabilityRefreshIntervalMs);\n }\n\n private async capabilityRefreshLoop(epoch: number): Promise<void> {\n if (!this.isLifecycleCurrent(epoch)) return;\n try {\n const previousMode = this._mode;\n if (!(await this.resolveMode(epoch))) return;\n if (this._mode !== previousMode) {\n // Capability upgrade or downgrade — re-establish background sync.\n await this.startInner();\n return;\n }\n } catch (err) {\n if (!this.isLifecycleCurrent(epoch)) return;\n const error = err instanceof Error ? err : new Error(String(err));\n this.emit('error', { error });\n this.errorHandler?.(error);\n }\n if (this.isLifecycleCurrent(epoch) && this._state === 'syncing' && this.capabilityRefreshIntervalMs > 0) {\n this.scheduleCapabilityRefresh(epoch);\n }\n }\n\n // ====== Private: event application ======\n\n private currentWholesaleFeedVersionForEvent(event: V31Beta.WholesaleFeedEvent): string | undefined {\n if (event.event_type.startsWith('product.')) return this.productWholesaleFeedVersion;\n if (event.event_type.startsWith('signal.')) return this.signalWholesaleFeedVersion;\n const affected = this.bulkChangeAffectedEntityType(event);\n return affected === 'signal' ? this.signalWholesaleFeedVersion : this.productWholesaleFeedVersion;\n }\n\n private bulkChangeAffectedEntityType(event: V31Beta.WholesaleFeedEvent): 'product' | 'signal' {\n const affected = (event.payload as { affected_entity_type?: string }).affected_entity_type;\n if (affected === 'product' || affected === 'signal') return affected;\n throw new Error(\n 'WholesaleFeedSync: wholesale_feed.bulk_change payload missing or invalid required affected_entity_type.'\n );\n }\n\n private currentProductMetadata(): FeedMetadata {\n return {\n wholesaleFeedVersion: this.productWholesaleFeedVersion,\n pricingVersion: this.productPricingVersion,\n cacheScope: this.productCacheScope,\n };\n }\n\n private currentSignalMetadata(): FeedMetadata {\n return {\n wholesaleFeedVersion: this.signalWholesaleFeedVersion,\n pricingVersion: this.signalPricingVersion,\n cacheScope: this.signalCacheScope,\n };\n }\n\n private commitProductMetadata(metadata: FeedMetadata): void {\n this.productWholesaleFeedVersion = metadata.wholesaleFeedVersion;\n this.productPricingVersion = metadata.pricingVersion;\n this.productCacheScope = metadata.cacheScope;\n }\n\n private commitSignalMetadata(metadata: FeedMetadata): void {\n this.signalWholesaleFeedVersion = metadata.wholesaleFeedVersion;\n this.signalPricingVersion = metadata.pricingVersion;\n this.signalCacheScope = metadata.cacheScope;\n }\n\n private rememberWebhookVersion(webhook: V31Beta.WholesaleFeedWebhook): void {\n const event = webhook.event;\n if (event.event_type.startsWith('product.')) {\n this.productWholesaleFeedVersion = webhook.wholesale_feed_version;\n this.productCacheScope = webhook.cache_scope;\n return;\n }\n if (event.event_type.startsWith('signal.')) {\n this.signalWholesaleFeedVersion = webhook.wholesale_feed_version;\n this.signalCacheScope = webhook.cache_scope;\n }\n }\n\n private assertWebhookScope(webhook: V31Beta.WholesaleFeedWebhook): void {\n const expectedAccountId = this.expectedWebhookAccountId();\n if (expectedAccountId && webhook.account_id !== expectedAccountId) {\n throw new Error('WholesaleFeedSync: wholesale feed webhook account_id does not match this mirror.');\n }\n if (this.webhookScope?.subscriberId && webhook.subscriber_id !== this.webhookScope.subscriberId) {\n throw new Error('WholesaleFeedSync: wholesale feed webhook subscriber_id does not match this mirror.');\n }\n }\n\n private expectedWebhookAccountId(): string | undefined {\n if (this.webhookScope?.accountId) return this.webhookScope.accountId;\n return this.account && 'account_id' in this.account ? this.account.account_id : undefined;\n }\n\n private webhookDedupeKey(webhook: V31Beta.WholesaleFeedWebhook): string {\n return [\n this.webhookScope?.senderId ?? 'default',\n webhook.account_id,\n webhook.subscriber_id,\n webhook.idempotency_key,\n ].join(':');\n }\n\n private webhookEventDedupeKey(webhook: V31Beta.WholesaleFeedWebhook): string {\n return [\n this.webhookScope?.senderId ?? 'default',\n webhook.account_id,\n webhook.subscriber_id,\n webhook.event.event_id,\n ].join(':');\n }\n\n private async hasProcessedWebhook(dedupeKey: string, eventDedupeKey: string): Promise<boolean> {\n if (this.processedWebhookKeys.has(dedupeKey) || this.processedWebhookEventKeys.has(eventDedupeKey)) return true;\n if (!this.webhookDedupStore) return false;\n return (await this.webhookDedupStore.has(dedupeKey)) || (await this.webhookDedupStore.has(eventDedupeKey));\n }\n\n private async markWebhookProcessed(dedupeKey: string, eventDedupeKey: string): Promise<void> {\n this.processedWebhookKeys.add(dedupeKey);\n this.processedWebhookEventKeys.add(eventDedupeKey);\n await this.webhookDedupStore?.add(dedupeKey);\n await this.webhookDedupStore?.add(eventDedupeKey);\n }\n\n private rememberLastWebhookEventId(eventId: string): void {\n if (!isUuidV7(eventId)) return;\n if (!this.lastWebhookEventId || compareUuidV7(eventId, this.lastWebhookEventId) > 0) {\n this.lastWebhookEventId = eventId;\n }\n }\n\n private applyEvent(event: V31Beta.WholesaleFeedEvent): void {\n switch (event.event_type) {\n case 'product.created':\n case 'product.updated': {\n const payload = event.payload as {\n product_id: string;\n product?: Product;\n changed_fields?: string[];\n [k: string]: unknown;\n };\n if (typeof payload.product_id !== 'string') return;\n if (payload.product) {\n // Full denorm — replace the entry entirely.\n this.productIndex.set(payload.product_id, payload.product);\n return;\n }\n return;\n }\n case 'product.priced': {\n const payload = event.payload as {\n product_id: string;\n pricing_options?: unknown[];\n };\n const existing = this.productIndex.get(payload.product_id);\n if (existing && Array.isArray(payload.pricing_options)) {\n this.productIndex.set(payload.product_id, {\n ...existing,\n pricing_options: payload.pricing_options as Product['pricing_options'],\n });\n }\n return;\n }\n case 'product.removed': {\n const payload = event.payload as { product_id: string };\n if (typeof payload.product_id === 'string') this.productIndex.delete(payload.product_id);\n return;\n }\n case 'signal.created':\n case 'signal.updated': {\n const payload = event.payload as {\n signal_agent_segment_id: string;\n signal?: Signal;\n };\n if (typeof payload.signal_agent_segment_id !== 'string') return;\n if (payload.signal) {\n this.signalIndex.set(payload.signal_agent_segment_id, payload.signal);\n }\n return;\n }\n case 'signal.priced': {\n const payload = event.payload as {\n signal_agent_segment_id: string;\n pricing_options?: unknown[];\n };\n const existing = this.signalIndex.get(payload.signal_agent_segment_id);\n if (existing && Array.isArray(payload.pricing_options)) {\n this.signalIndex.set(payload.signal_agent_segment_id, {\n ...existing,\n pricing_options: payload.pricing_options as Signal['pricing_options'],\n });\n }\n return;\n }\n case 'signal.removed': {\n const payload = event.payload as { signal_agent_segment_id: string };\n if (typeof payload.signal_agent_segment_id === 'string') {\n this.signalIndex.delete(payload.signal_agent_segment_id);\n }\n return;\n }\n case 'wholesale_feed.bulk_change':\n // Bulk change events trigger re-bootstrap in applyWebhook before\n // reaching this method.\n return;\n }\n }\n\n private emitTypedEvent(event: V31Beta.WholesaleFeedEvent): void {\n // event_type is the discriminator; every value maps to a typed listener\n // name. The switch keeps TypeScript honest about exhaustiveness.\n switch (event.event_type) {\n case 'product.created':\n this.emit('product.created', { event });\n return;\n case 'product.updated':\n this.emit('product.updated', { event });\n return;\n case 'product.priced':\n this.emit('product.priced', { event });\n return;\n case 'product.removed':\n this.emit('product.removed', { event });\n return;\n case 'signal.created':\n this.emit('signal.created', { event });\n return;\n case 'signal.updated':\n this.emit('signal.updated', { event });\n return;\n case 'signal.priced':\n this.emit('signal.priced', { event });\n return;\n case 'signal.removed':\n this.emit('signal.removed', { event });\n return;\n case 'wholesale_feed.bulk_change':\n // Already emitted in applyWebhook before recovery.\n return;\n }\n }\n\n // ====== Private: diff emission (auto-poll / manual refresh) ======\n\n private emitDiffs(previousProducts: Map<string, Product>, previousSignals: Map<string, Signal>): void {\n const now = new Date().toISOString();\n const makeEvent = (\n event_type: V31Beta.WholesaleFeedEvent['event_type'],\n entity_type: V31Beta.WholesaleFeedEvent['entity_type'],\n entity_id: string,\n payload: object\n ): V31Beta.WholesaleFeedEvent =>\n ({\n // crypto.randomUUID() emits a v4 UUID, NOT v7. Synthetic events\n // are flagged via `synthetic: true` on the emit envelope so\n // adopters writing event_ids to a dedupe table know not to\n // treat the ID as seller-authored. Real webhook events carry the\n // agent's authoritative event_id.\n event_id: randomUUID(),\n event_type,\n entity_type,\n entity_id,\n created_at: now,\n payload,\n }) as V31Beta.WholesaleFeedEvent;\n const emit = (channel: keyof WholesaleFeedSyncEvents, event: V31Beta.WholesaleFeedEvent): void => {\n this.emit('event', { event, synthetic: true });\n this.emit(channel as 'product.created', { event, synthetic: true });\n };\n\n for (const [id, product] of this.productIndex) {\n const prev = previousProducts.get(id);\n if (!prev) {\n emit(\n 'product.created',\n makeEvent('product.created', 'product', id, {\n product_id: id,\n product,\n applies_to: { scope: this.productCacheScope },\n })\n );\n } else if (priceChanged(prev, product)) {\n emit(\n 'product.priced',\n makeEvent('product.priced', 'product', id, {\n product_id: id,\n pricing_options: product.pricing_options ?? [],\n applies_to: { scope: this.productCacheScope },\n })\n );\n } else if (!isDeepStrictEqual(prev, product)) {\n emit(\n 'product.updated',\n makeEvent('product.updated', 'product', id, {\n product_id: id,\n product,\n applies_to: { scope: this.productCacheScope },\n })\n );\n }\n }\n for (const [id] of previousProducts) {\n if (!this.productIndex.has(id)) {\n emit(\n 'product.removed',\n makeEvent('product.removed', 'product', id, {\n product_id: id,\n applies_to: { scope: this.productCacheScope },\n })\n );\n }\n }\n for (const [id, signal] of this.signalIndex) {\n const prev = previousSignals.get(id);\n if (!prev) {\n emit(\n 'signal.created',\n makeEvent('signal.created', 'signal', id, {\n signal_agent_segment_id: id,\n signal,\n applies_to: { scope: this.signalCacheScope },\n })\n );\n } else if (signalPriceChanged(prev, signal)) {\n emit(\n 'signal.priced',\n makeEvent('signal.priced', 'signal', id, {\n signal_agent_segment_id: id,\n pricing_options: (signal as { pricing_options?: unknown[] }).pricing_options ?? [],\n applies_to: { scope: this.signalCacheScope },\n })\n );\n } else if (!isDeepStrictEqual(prev, signal)) {\n emit(\n 'signal.updated',\n makeEvent('signal.updated', 'signal', id, {\n signal_agent_segment_id: id,\n signal,\n applies_to: { scope: this.signalCacheScope },\n })\n );\n }\n }\n for (const [id] of previousSignals) {\n if (!this.signalIndex.has(id)) {\n emit(\n 'signal.removed',\n makeEvent('signal.removed', 'signal', id, {\n signal_agent_segment_id: id,\n applies_to: { scope: this.signalCacheScope },\n })\n );\n }\n }\n }\n\n // ====== Private: search ======\n\n private searchProducts(filter: ProductFilter): Product[] {\n const text = filter.text?.toLowerCase();\n return this.products.list().filter(product => {\n if (filter.product_ids?.length) {\n const id = (product as { product_id?: string }).product_id;\n if (!id || !filter.product_ids.includes(id)) return false;\n }\n if (filter.delivery_types?.length) {\n const dt = (product as { delivery_type?: string }).delivery_type;\n if (!dt || !filter.delivery_types.includes(dt)) return false;\n }\n if (filter.format_ids?.length) {\n const formats = (product as { format_ids?: Array<{ id?: string }> | string[] }).format_ids;\n const ids = (Array.isArray(formats) ? formats : []).map(f => (typeof f === 'string' ? f : (f?.id ?? '')));\n if (!filter.format_ids.some(want => ids.includes(want))) return false;\n }\n if (text) {\n const haystack = [(product as { name?: string }).name, (product as { description?: string }).description]\n .filter((s): s is string => typeof s === 'string')\n .join(' ')\n .toLowerCase();\n if (!haystack.includes(text)) return false;\n }\n return true;\n });\n }\n\n private searchSignals(filter: SignalFilter): Signal[] {\n const text = filter.text?.toLowerCase();\n const provider = filter.data_provider?.toLowerCase();\n return this.signals.list().filter(signal => {\n const s = signal as {\n signal_agent_segment_id?: string;\n signal_type?: string;\n data_provider?: string;\n name?: string;\n description?: string;\n };\n if (filter.signal_agent_segment_ids?.length) {\n if (!s.signal_agent_segment_id || !filter.signal_agent_segment_ids.includes(s.signal_agent_segment_id))\n return false;\n }\n if (filter.signal_types?.length) {\n if (!s.signal_type || !filter.signal_types.includes(s.signal_type)) return false;\n }\n if (provider) {\n if (!s.data_provider || !s.data_provider.toLowerCase().includes(provider)) return false;\n }\n if (text) {\n const haystack = [s.name, s.description]\n .filter((v): v is string => typeof v === 'string')\n .join(' ')\n .toLowerCase();\n if (!haystack.includes(text)) return false;\n }\n return true;\n });\n }\n\n // ====== Private: state ======\n\n private setState(next: WholesaleFeedSyncState): void {\n const from = this._state;\n if (from === next) return;\n this._state = next;\n this.emit('stateChange', { from, to: next });\n }\n\n private isLifecycleCurrent(epoch: number): boolean {\n return epoch === this.lifecycleEpoch;\n }\n}\n\n// ====== Diff helpers ======\n\nfunction priceChanged(prev: Product, next: Product): boolean {\n const a = (prev as { pricing_options?: unknown[] }).pricing_options;\n const b = (next as { pricing_options?: unknown[] }).pricing_options;\n return !isDeepStrictEqual(a, b);\n}\n\nfunction signalPriceChanged(prev: Signal, next: Signal): boolean {\n const a = (prev as { pricing_options?: unknown[] }).pricing_options;\n const b = (next as { pricing_options?: unknown[] }).pricing_options;\n return !isDeepStrictEqual(a, b);\n}\n\nfunction isUuidV7(value: string): boolean {\n return /^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(value);\n}\n\nfunction compareUuidV7(a: string, b: string): number {\n if (!isUuidV7(a) || !isUuidV7(b)) return 1;\n const normalizedA = a.toLowerCase();\n const normalizedB = b.toLowerCase();\n return normalizedA === normalizedB ? 0 : normalizedA > normalizedB ? 1 : -1;\n}\n\nfunction mergeFeedMetadata(\n current: FeedMetadata,\n body: {\n wholesale_feed_version?: unknown;\n pricing_version?: unknown;\n cache_scope?: unknown;\n }\n): FeedMetadata {\n return {\n wholesaleFeedVersion:\n typeof body.wholesale_feed_version === 'string' ? body.wholesale_feed_version : current.wholesaleFeedVersion,\n pricingVersion: typeof body.pricing_version === 'string' ? body.pricing_version : current.pricingVersion,\n cacheScope: body.cache_scope === 'public' || body.cache_scope === 'account' ? body.cache_scope : current.cacheScope,\n };\n}\n\nasync function sleep(ms: number): Promise<void> {\n await new Promise(resolve => setTimeout(resolve, ms));\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../../src/lib/wholesale-feed-sync/sync.ts"],"sourcesContent":["import { EventEmitter } from 'node:events';\nimport { isDeepStrictEqual } from 'node:util';\nimport { randomUUID } from 'node:crypto';\nimport type * as V31Beta from '../types/v3-1-beta';\nimport type {\n WholesaleFeedSyncClient,\n WholesaleFeedSyncConfig,\n WholesaleFeedSyncEvents,\n WholesaleFeedSyncMode,\n WholesaleFeedSyncState,\n ProductFilter,\n ResolvedCapabilities,\n SignalFilter,\n} from './types';\n\ntype Product = V31Beta.Product;\n// `signals` is an inline array type on GetSignalsResponse (no top-level\n// Signal export in the generated bundle). Extract the element type so\n// the index map and search helpers stay strongly-typed.\ntype Signal = NonNullable<V31Beta.GetSignalsResponse['signals']>[number];\ntype FeedMetadata = {\n wholesaleFeedVersion: string | undefined;\n pricingVersion: string | undefined;\n cacheScope: 'public' | 'account';\n};\ntype BootstrapFeedResult<T> = {\n cancelled: boolean;\n unchanged: boolean;\n items: Map<string, T>;\n metadata: FeedMetadata;\n};\n\nconst DEFAULT_PROBE_INTERVAL_MS = 600_000;\nconst DEFAULT_CAPABILITY_REFRESH_INTERVAL_MS = 86_400_000;\nconst DEFAULT_BOOTSTRAP_PAGE_LIMIT = 100;\nconst VERSION_MISMATCH_RECOVERY_ATTEMPTS = 3;\nconst VERSION_MISMATCH_RECOVERY_BACKOFF_MS = 5;\n\n/**\n * In-memory mirror of an AdCP agent's wholesale product and signal feeds.\n *\n * Discovers the agent's wholesale-feed capabilities at `start()`, picks the\n * highest-capability sync strategy the agent supports, and maintains a\n * local index for zero-latency lookups. Falls back gracefully to manual\n * bootstrap when the agent does not advertise conditional-fetch tokens.\n *\n * @example\n * ```ts\n * import { AdCPClient } from '@adcp/sdk';\n * import { WholesaleFeedSync } from '@adcp/sdk/wholesale-feed-sync';\n *\n * const client = new AdCPClient({ agentUrl, adcpVersion: '3.1-beta' });\n * const sync = new WholesaleFeedSync({ client });\n *\n * sync.on('product.priced', ({ event }) => {\n * const p = event.payload as { product_id: string; pricing_options: unknown[] };\n * console.log('reprice:', p.product_id);\n * });\n *\n * await sync.start();\n * // sync.mode is 'auto-poll' / 'manual' depending on the agent\n * console.log(`syncing ${sync.products.count} products via ${sync.mode} mode`);\n * ```\n */\nexport class WholesaleFeedSync extends EventEmitter<WholesaleFeedSyncEvents> {\n private readonly client: WholesaleFeedSyncClient;\n private readonly account: V31Beta.AccountReference | undefined;\n private readonly webhookScope: NonNullable<WholesaleFeedSyncConfig['webhookScope']> | undefined;\n private readonly webhookDedupStore: WholesaleFeedSyncConfig['webhookDedupStore'] | undefined;\n private readonly probeIntervalMs: number;\n private readonly capabilityRefreshIntervalMs: number;\n private readonly errorHandler: ((error: Error) => void) | undefined;\n private startPromise: Promise<void> | null = null;\n private startPromiseEpoch: number | null = null;\n private signalsQueryableWarned = false;\n private readonly processedWebhookKeys = new Set<string>();\n private readonly processedWebhookEventKeys = new Set<string>();\n private lastWebhookEventId: string | undefined;\n\n private _state: WholesaleFeedSyncState = 'idle';\n private _mode: WholesaleFeedSyncMode = 'manual';\n private _capabilities: ResolvedCapabilities = {\n wholesaleFeedVersioning: false,\n webhooks: false,\n eventTypes: [],\n };\n private _lastSyncedAt: Date | undefined;\n private _lastEventAt: Date | undefined;\n\n private productIndex = new Map<string, Product>();\n private signalIndex = new Map<string, Signal>();\n\n private productWholesaleFeedVersion: string | undefined;\n private productPricingVersion: string | undefined;\n private productCacheScope: 'public' | 'account' = 'public';\n private signalWholesaleFeedVersion: string | undefined;\n private signalPricingVersion: string | undefined;\n private signalCacheScope: 'public' | 'account' = 'public';\n\n private probeTimer: ReturnType<typeof setTimeout> | null = null;\n private capabilityTimer: ReturnType<typeof setTimeout> | null = null;\n private lifecycleEpoch = 0;\n\n /**\n * Read-only view of the in-memory product index. The `mode` reflects the\n * sync strategy for product events specifically — in mixed-capability\n * agents (products-feed + signals-wholesale-only, or vice versa) this\n * may differ from `signals.mode`.\n */\n readonly products = {\n list: (): Product[] => [...this.productIndex.values()],\n get: (productId: string): Product | undefined => this.productIndex.get(productId),\n search: (filter: ProductFilter): Product[] => this.searchProducts(filter),\n get count(): number {\n return this.list().length;\n },\n get mode(): WholesaleFeedSyncMode {\n // Per-entity mode is the lowest mode for which the agent declares\n // the entity's event family. Future extension: when capability vectors\n // diverge per entity, return the entity-specific resolution here. v1\n // mirrors the top-level mode.\n return this._mode;\n },\n // Allow the inline getter `mode` to reach private state without binding.\n // Assigned in the constructor below.\n _mode: 'manual' as WholesaleFeedSyncMode,\n };\n\n /** Read-only view of the in-memory signal index. */\n readonly signals = {\n list: (): Signal[] => {\n this.warnIfSignalsNotQueryable();\n return [...this.signalIndex.values()];\n },\n get: (signalAgentSegmentId: string): Signal | undefined => this.signalIndex.get(signalAgentSegmentId),\n search: (filter: SignalFilter): Signal[] => {\n this.warnIfSignalsNotQueryable();\n return this.searchSignals(filter);\n },\n get count(): number {\n return this.list().length;\n },\n get mode(): WholesaleFeedSyncMode {\n return this._mode;\n },\n _mode: 'manual' as WholesaleFeedSyncMode,\n /**\n * `true` when the agent supports `discovery_mode: 'wholesale'` on\n * `get_signals` (i.e., signals are browsable). When `false`, the\n * agent only supports brief-mode discovery — `signals.list()` will\n * be empty until adopters call into the agent with their own briefs.\n */\n queryable: true,\n };\n\n /**\n * One-shot console warning when adopters call `signals.list()` or\n * `signals.search()` against an agent that doesn't support wholesale\n * signal enumeration. Without this, empty results read as \"no signals\n * match\" rather than \"the agent doesn't browse, only briefs.\"\n */\n private warnIfSignalsNotQueryable(): void {\n if (this.signals.queryable || this.signalsQueryableWarned) return;\n if (this._state === 'idle' || this._state === 'bootstrapping') return; // pre-start; nothing to warn about\n this.signalsQueryableWarned = true;\n // eslint-disable-next-line no-console\n console.warn(\n `[WholesaleFeedSync] signals.list()/search() returned an empty replica because the agent does not declare ` +\n `signals.discovery_modes: [\"wholesale\"]. Brief-mode signal discovery isn't mirrored — call ` +\n `client.getSignals({ signal_spec, ... }) with your brief instead, or omit this surface for this agent.`\n );\n }\n\n constructor(config: WholesaleFeedSyncConfig) {\n super();\n this.client = config.client;\n this.account = config.account;\n this.webhookScope = config.webhookScope;\n this.webhookDedupStore = config.webhookDedupStore;\n this.probeIntervalMs = config.probeIntervalMs ?? DEFAULT_PROBE_INTERVAL_MS;\n this.capabilityRefreshIntervalMs = config.capabilityRefreshIntervalMs ?? DEFAULT_CAPABILITY_REFRESH_INTERVAL_MS;\n this.errorHandler = config.onError;\n }\n\n // ====== Lifecycle ======\n\n /**\n * Probe the agent's capabilities, pick a sync mode, and bootstrap the\n * in-memory replica via wholesale enumeration. In `'auto-poll'` mode\n * starts the conditional wholesale-feed version probe loop.\n *\n * Safe to call repeatedly — concurrent calls await the in-flight\n * bootstrap and return when it completes (no duplicate bootstrap, no\n * silent drop). Sequential calls re-probe capabilities and re-bootstrap,\n * equivalent to calling `refresh()` after a mode upgrade.\n */\n async start(): Promise<void> {\n if (this.startPromise && this.startPromiseEpoch === this.lifecycleEpoch) return this.startPromise;\n const promise = this.startInner().finally(() => {\n if (this.startPromise === promise) {\n this.startPromise = null;\n this.startPromiseEpoch = null;\n }\n });\n this.startPromise = promise;\n this.startPromiseEpoch = this.lifecycleEpoch;\n return promise;\n }\n\n private async startInner(): Promise<void> {\n this.stop();\n const epoch = this.lifecycleEpoch;\n if (!(await this.resolveMode(epoch))) return;\n if (!(await this.bootstrap({ epoch }))) return;\n if (this._mode === 'auto-poll') {\n this.scheduleProbe(epoch);\n }\n if (this.capabilityRefreshIntervalMs > 0) {\n this.scheduleCapabilityRefresh(epoch);\n }\n }\n\n /** Stop all background activity. Preserves in-memory state and version tokens. */\n stop(): void {\n this.lifecycleEpoch++;\n if (this.probeTimer) clearTimeout(this.probeTimer);\n if (this.capabilityTimer) clearTimeout(this.capabilityTimer);\n this.probeTimer = null;\n this.capabilityTimer = null;\n if (this._state === 'syncing' || this._state === 'bootstrapping') this.setState('idle');\n }\n\n /**\n * Stop, clear all indexes and version tokens. Call `start()` again to\n * re-bootstrap from scratch.\n */\n async reset(): Promise<void> {\n this.stop();\n this.productIndex.clear();\n this.signalIndex.clear();\n this.productWholesaleFeedVersion = undefined;\n this.productPricingVersion = undefined;\n this.productCacheScope = 'public';\n this.signalWholesaleFeedVersion = undefined;\n this.signalPricingVersion = undefined;\n this.signalCacheScope = 'public';\n this._lastSyncedAt = undefined;\n this._lastEventAt = undefined;\n this.setState('idle');\n }\n\n /**\n * Force a manual re-bootstrap. Available in all modes. Fires diff events\n * for changes detected between the current replica and the freshly\n * fetched wholesale feed.\n */\n async refresh(): Promise<void> {\n const epoch = this.lifecycleEpoch;\n this.emit('resyncing', { reason: 'manual' });\n await this.bootstrap({ emitDiffs: true, epoch });\n }\n\n /**\n * Apply one beta-3 account-level wholesale feed webhook to the local mirror.\n * Call this from your HTTP webhook receiver after signature/auth validation.\n * Stale or out-of-order deliveries repair through conditional wholesale\n * reads instead of applying a suspect delta.\n */\n async applyWebhook(webhook: V31Beta.WholesaleFeedWebhook): Promise<void> {\n const epoch = this.lifecycleEpoch;\n const event = webhook.event;\n if (!event || webhook.notification_type !== event.event_type) {\n throw new Error('WholesaleFeedSync: wholesale feed webhook notification_type does not match event.event_type.');\n }\n if (webhook.notification_id !== event.event_id) {\n throw new Error('WholesaleFeedSync: wholesale feed webhook notification_id does not match event.event_id.');\n }\n this.assertWebhookScope(webhook);\n\n const payloadScope = (event.payload as { applies_to?: { scope?: string } }).applies_to?.scope;\n if (payloadScope && payloadScope !== webhook.cache_scope) {\n throw new Error(\n 'WholesaleFeedSync: wholesale feed webhook cache_scope does not match event.payload.applies_to.scope.'\n );\n }\n const payloadAccountIds = (event.payload as { applies_to?: { account_ids?: unknown } }).applies_to?.account_ids;\n const expectedAccountId = this.expectedWebhookAccountId();\n if (\n webhook.cache_scope === 'account' &&\n expectedAccountId &&\n Array.isArray(payloadAccountIds) &&\n !payloadAccountIds.includes(expectedAccountId)\n ) {\n throw new Error(\n 'WholesaleFeedSync: wholesale feed webhook account overlay does not include this mirror account.'\n );\n }\n const dedupeKey = this.webhookDedupeKey(webhook);\n const eventDedupeKey = this.webhookEventDedupeKey(webhook);\n if (await this.hasProcessedWebhook(dedupeKey, eventDedupeKey)) return;\n if (!this.isLifecycleCurrent(epoch)) return;\n\n if (this.lastWebhookEventId && compareUuidV7(event.event_id, this.lastWebhookEventId) <= 0) {\n if (!(await this.recoverFromVersionMismatch(event, epoch))) return;\n await this.markWebhookProcessed(dedupeKey, eventDedupeKey);\n return;\n }\n\n let currentVersion: string | undefined;\n try {\n currentVersion = this.currentWholesaleFeedVersionForEvent(event);\n } catch (err) {\n await this.markWebhookProcessed(dedupeKey, eventDedupeKey);\n this.rememberLastWebhookEventId(event.event_id);\n throw err;\n }\n if (\n webhook.previous_wholesale_feed_version &&\n currentVersion &&\n webhook.previous_wholesale_feed_version !== currentVersion\n ) {\n if (!(await this.recoverFromVersionMismatch(event, epoch))) return;\n await this.markWebhookProcessed(dedupeKey, eventDedupeKey);\n return;\n }\n\n if (event.event_type === 'wholesale_feed.bulk_change') {\n this.emit('wholesale_feed.bulk_change', { event });\n try {\n if (!(await this.recoverFromBulkChange(event, epoch))) return;\n } catch (err) {\n await this.markWebhookProcessed(dedupeKey, eventDedupeKey);\n this.rememberLastWebhookEventId(event.event_id);\n throw err;\n }\n await this.markWebhookProcessed(dedupeKey, eventDedupeKey);\n this.rememberLastWebhookEventId(event.event_id);\n return;\n }\n\n this.applyEvent(event);\n this.rememberWebhookVersion(webhook);\n this.emit('event', { event });\n this.emitTypedEvent(event);\n await this.markWebhookProcessed(dedupeKey, eventDedupeKey);\n this.rememberLastWebhookEventId(event.event_id);\n this._lastEventAt = new Date();\n this._lastSyncedAt = new Date();\n this.emit('sync', { eventsApplied: 1 });\n }\n\n // ====== Public state ======\n\n get state(): WholesaleFeedSyncState {\n return this._state;\n }\n get mode(): WholesaleFeedSyncMode {\n return this._mode;\n }\n get capabilities(): Readonly<ResolvedCapabilities> {\n // Return a fresh clone — `Readonly<T>` is shallow, and an adopter\n // mutating `sync.capabilities.eventTypes` (a JS array) would\n // otherwise corrupt internal state. Deep-clone is cheap (a handful\n // of primitives + one string array).\n return structuredClone(this._capabilities);\n }\n get lastSyncedAt(): Date | undefined {\n return this._lastSyncedAt;\n }\n get lastEventAt(): Date | undefined {\n return this._lastEventAt;\n }\n\n // ====== Private: capability resolution ======\n\n private async resolveMode(epoch = this.lifecycleEpoch): Promise<boolean> {\n const caps = await this.client.getAdcpCapabilities({});\n if (!this.isLifecycleCurrent(epoch)) return false;\n // TaskResult union — only `success` carries a typed `data` field.\n // Other task-arms (`deferred`, `input-required`, `error`) leave us\n // without enough info to pick a mode confidently. Spec says we MAY\n // fall back to manual wholesale reads against agents that don't\n // declare the surfaces — but that masks real auth/config\n // failures (e.g., a 401 returned via the `error` arm). Surface the\n // condition via an `error` event so adopters see it, then fall back.\n const status = (caps as { status?: string }).status;\n if (typeof status === 'string' && status !== 'success' && status !== 'completed') {\n const message =\n (caps as { error?: { message?: string } }).error?.message ?? `get_adcp_capabilities returned status=${status}`;\n const err = new Error(`WholesaleFeedSync: capability probe returned non-success status: ${message}`);\n this.errorHandler?.(err);\n this.emit('error', { error: err });\n // Fall through to the empty-stanza path below so the sync still\n // boots in manual mode.\n }\n const data = (caps as { data?: unknown }).data;\n const stanza = (data ?? {}) as {\n wholesale_feed_webhooks?: {\n supported?: boolean;\n event_types?: string[];\n };\n wholesale_feed_versioning?: { supported?: boolean };\n signals?: { discovery_modes?: string[] };\n };\n const wholesaleFeedVersioning = stanza.wholesale_feed_versioning?.supported === true;\n const webhooks = stanza.wholesale_feed_webhooks?.supported === true;\n const eventTypes = Array.isArray(stanza.wholesale_feed_webhooks?.event_types)\n ? [...stanza.wholesale_feed_webhooks!.event_types!]\n : [];\n const wholesaleSignals = stanza.signals?.discovery_modes?.includes('wholesale') ?? false;\n\n const resolved: ResolvedCapabilities = {\n wholesaleFeedVersioning,\n webhooks,\n eventTypes,\n };\n\n const mode: WholesaleFeedSyncMode = wholesaleFeedVersioning ? 'auto-poll' : 'manual';\n this._capabilities = resolved;\n this._mode = mode;\n this.products._mode = mode;\n this.signals._mode = mode;\n this.signals.queryable = wholesaleSignals;\n this.emit('mode_resolved', { mode, capabilities: resolved });\n return true;\n }\n\n // ====== Private: bootstrap (wholesale enumeration) ======\n\n private async bootstrap(\n options: { emitDiffs?: boolean; entities?: 'products' | 'signals' | 'all'; epoch?: number } = {}\n ): Promise<boolean> {\n const epoch = options.epoch ?? this.lifecycleEpoch;\n if (!this.isLifecycleCurrent(epoch)) return false;\n this.setState('bootstrapping');\n try {\n // Build into local maps and atomically swap on success. The previous\n // implementation cleared the live indexes BEFORE fetching, so an\n // `unchanged: true` short-circuit on the conditional-fetch path\n // would wipe the replica (the seller correctly tells us \"no\n // change,\" and we lose every product). Build-then-swap guarantees\n // the in-memory replica is never in a torn state and is only\n // mutated on a successful, fresh fetch.\n const previousProducts = new Map(this.productIndex);\n const previousSignals = new Map(this.signalIndex);\n let productResult: BootstrapFeedResult<Product> | undefined;\n let signalResult: BootstrapFeedResult<Signal> | undefined;\n const entities = options.entities ?? 'all';\n const refreshProducts = entities !== 'signals';\n const refreshSignals = entities !== 'products' && this.signals.queryable;\n\n if (refreshProducts) {\n productResult = await this.bootstrapProducts(epoch);\n if (productResult.cancelled) return false;\n }\n if (refreshSignals) {\n signalResult = await this.bootstrapSignals(epoch);\n if (signalResult.cancelled) return false;\n }\n\n if (!this.isLifecycleCurrent(epoch)) return false;\n\n if (refreshProducts && productResult) {\n this.commitProductMetadata(productResult.metadata);\n if (!productResult.unchanged) {\n this.productIndex = productResult.items;\n }\n }\n if (refreshSignals && signalResult) {\n this.commitSignalMetadata(signalResult.metadata);\n if (!signalResult.unchanged) {\n this.signalIndex = signalResult.items;\n }\n }\n\n if (options.emitDiffs) {\n this.emitDiffs(previousProducts, previousSignals);\n }\n\n this.setState('syncing');\n this._lastSyncedAt = new Date();\n this.emit('bootstrap', {\n productCount: this.productIndex.size,\n signalCount: this.signalIndex.size,\n mode: this._mode,\n });\n return true;\n } catch (err) {\n if (!this.isLifecycleCurrent(epoch)) return false;\n this.setState('error');\n const error = err instanceof Error ? err : new Error(String(err));\n this.errorHandler?.(error);\n this.emit('error', { error });\n throw error;\n }\n }\n\n /** Returns `true` when the seller short-circuited with `unchanged: true`. */\n private async bootstrapProducts(epoch: number): Promise<BootstrapFeedResult<Product>> {\n let cursor: string | undefined;\n const into = new Map<string, Product>();\n let metadata = this.currentProductMetadata();\n do {\n const params: Record<string, unknown> = {\n buying_mode: 'wholesale',\n pagination: { max_results: DEFAULT_BOOTSTRAP_PAGE_LIMIT, ...(cursor && { cursor }) },\n ...(this.account && { account: this.account }),\n };\n // Conditional fetch on the page-0 call when we already have a cached\n // version. Per the spec, the seller short-circuits with\n // `unchanged: true` and no payload — caller keeps the previous index.\n if (!cursor && metadata.wholesaleFeedVersion && this._capabilities.wholesaleFeedVersioning) {\n params.if_wholesale_feed_version = metadata.wholesaleFeedVersion;\n if (metadata.pricingVersion) params.if_pricing_version = metadata.pricingVersion;\n }\n const result = (await this.client.getProducts(params as never)) as {\n data?: V31Beta.GetProductsResponse;\n };\n if (!this.isLifecycleCurrent(epoch)) return { cancelled: true, unchanged: false, items: into, metadata };\n const body = result.data;\n if (!body) return { cancelled: false, unchanged: false, items: into, metadata };\n if (body.unchanged) {\n // Echo any newer pricing_version / cache_scope the seller\n // returned alongside the unchanged signal, then tell the caller\n // to keep the existing index.\n metadata = mergeFeedMetadata(metadata, body);\n return { cancelled: false, unchanged: true, items: into, metadata };\n }\n const products = Array.isArray(body.products) ? body.products : [];\n for (const product of products) {\n const id = (product as { product_id?: string }).product_id;\n if (typeof id === 'string') into.set(id, product as Product);\n }\n metadata = mergeFeedMetadata(metadata, body);\n cursor = body.pagination?.has_more ? body.pagination?.cursor : undefined;\n } while (cursor);\n return { cancelled: false, unchanged: false, items: into, metadata };\n }\n\n private async bootstrapSignals(epoch: number): Promise<BootstrapFeedResult<Signal>> {\n let cursor: string | undefined;\n const into = new Map<string, Signal>();\n let metadata = this.currentSignalMetadata();\n do {\n const params: Record<string, unknown> = {\n discovery_mode: 'wholesale',\n pagination: { max_results: DEFAULT_BOOTSTRAP_PAGE_LIMIT, ...(cursor && { cursor }) },\n ...(this.account && { account: this.account }),\n };\n if (!cursor && metadata.wholesaleFeedVersion && this._capabilities.wholesaleFeedVersioning) {\n params.if_wholesale_feed_version = metadata.wholesaleFeedVersion;\n if (metadata.pricingVersion) params.if_pricing_version = metadata.pricingVersion;\n }\n const result = (await this.client.getSignals(params as never)) as {\n data?: V31Beta.GetSignalsResponse;\n };\n if (!this.isLifecycleCurrent(epoch)) return { cancelled: true, unchanged: false, items: into, metadata };\n const body = result.data;\n if (!body) return { cancelled: false, unchanged: false, items: into, metadata };\n if (body.unchanged) {\n metadata = mergeFeedMetadata(metadata, body);\n return { cancelled: false, unchanged: true, items: into, metadata };\n }\n const signals = Array.isArray(body.signals) ? body.signals : [];\n for (const signal of signals) {\n const id = (signal as { signal_agent_segment_id?: string }).signal_agent_segment_id;\n if (typeof id === 'string') into.set(id, signal as Signal);\n }\n metadata = mergeFeedMetadata(metadata, body);\n cursor = body.pagination?.has_more ? body.pagination?.cursor : undefined;\n } while (cursor);\n return { cancelled: false, unchanged: false, items: into, metadata };\n }\n\n private async recoverFromBulkChange(\n event: V31Beta.WholesaleFeedEvent,\n epoch = this.lifecycleEpoch\n ): Promise<boolean> {\n this.emit('resyncing', { reason: 'bulk_change' });\n const affected = this.bulkChangeAffectedEntityType(event);\n if (affected === 'signal' && !this.signals.queryable) {\n throw new Error(\n 'WholesaleFeedSync: signal bulk_change cannot repair because the agent does not declare wholesale signal discovery.'\n );\n }\n const entities = affected === 'product' ? 'products' : 'signals';\n return this.bootstrap({ emitDiffs: true, entities, epoch });\n }\n\n private async recoverFromVersionMismatch(\n event: V31Beta.WholesaleFeedEvent,\n epoch = this.lifecycleEpoch\n ): Promise<boolean> {\n this.emit('resyncing', { reason: 'version_mismatch' });\n const beforeVersion = this.currentWholesaleFeedVersionForEvent(event);\n for (let attempt = 1; attempt <= VERSION_MISMATCH_RECOVERY_ATTEMPTS; attempt++) {\n const recovered = await this.bootstrap({ emitDiffs: true, epoch });\n if (!recovered) return false;\n const afterVersion = this.currentWholesaleFeedVersionForEvent(event);\n if (afterVersion !== beforeVersion) return true;\n if (attempt < VERSION_MISMATCH_RECOVERY_ATTEMPTS) {\n await sleep(VERSION_MISMATCH_RECOVERY_BACKOFF_MS * attempt);\n if (!this.isLifecycleCurrent(epoch)) return false;\n }\n }\n // At-least-once delivery can replay stale webhooks after the mirror has\n // already caught up. If bounded conditional reads do not advance the\n // opaque version token, acknowledge the delivery instead of poisoning\n // the seller's retry queue.\n return true;\n }\n\n // ====== Private: auto-poll mode version probe ======\n\n private scheduleProbe(epoch = this.lifecycleEpoch): void {\n if (!this.isLifecycleCurrent(epoch)) return;\n this.probeTimer = setTimeout(() => this.probeLoop(epoch), this.probeIntervalMs);\n }\n\n private async probeLoop(epoch: number): Promise<void> {\n if (!this.isLifecycleCurrent(epoch)) return;\n try {\n await this.probeVersion(epoch);\n } catch (err) {\n if (!this.isLifecycleCurrent(epoch)) return;\n const error = err instanceof Error ? err : new Error(String(err));\n this.emit('error', { error });\n this.errorHandler?.(error);\n }\n if (this.isLifecycleCurrent(epoch) && this._state === 'syncing' && this._mode === 'auto-poll') {\n this.scheduleProbe(epoch);\n }\n }\n\n private async probeVersion(epoch: number): Promise<void> {\n await this.bootstrap({ emitDiffs: true, epoch });\n }\n\n // ====== Private: capability refresh ======\n\n private scheduleCapabilityRefresh(epoch = this.lifecycleEpoch): void {\n if (!this.isLifecycleCurrent(epoch)) return;\n this.capabilityTimer = setTimeout(() => this.capabilityRefreshLoop(epoch), this.capabilityRefreshIntervalMs);\n }\n\n private async capabilityRefreshLoop(epoch: number): Promise<void> {\n if (!this.isLifecycleCurrent(epoch)) return;\n try {\n const previousMode = this._mode;\n if (!(await this.resolveMode(epoch))) return;\n if (this._mode !== previousMode) {\n // Capability upgrade or downgrade — re-establish background sync.\n await this.startInner();\n return;\n }\n } catch (err) {\n if (!this.isLifecycleCurrent(epoch)) return;\n const error = err instanceof Error ? err : new Error(String(err));\n this.emit('error', { error });\n this.errorHandler?.(error);\n }\n if (this.isLifecycleCurrent(epoch) && this._state === 'syncing' && this.capabilityRefreshIntervalMs > 0) {\n this.scheduleCapabilityRefresh(epoch);\n }\n }\n\n // ====== Private: event application ======\n\n private currentWholesaleFeedVersionForEvent(event: V31Beta.WholesaleFeedEvent): string | undefined {\n if (event.event_type.startsWith('product.')) return this.productWholesaleFeedVersion;\n if (event.event_type.startsWith('signal.')) return this.signalWholesaleFeedVersion;\n const affected = this.bulkChangeAffectedEntityType(event);\n return affected === 'signal' ? this.signalWholesaleFeedVersion : this.productWholesaleFeedVersion;\n }\n\n private bulkChangeAffectedEntityType(event: V31Beta.WholesaleFeedEvent): 'product' | 'signal' {\n const affected = (event.payload as { affected_entity_type?: string }).affected_entity_type;\n if (affected === 'product' || affected === 'signal') return affected;\n throw new Error(\n 'WholesaleFeedSync: wholesale_feed.bulk_change payload missing or invalid required affected_entity_type.'\n );\n }\n\n private currentProductMetadata(): FeedMetadata {\n return {\n wholesaleFeedVersion: this.productWholesaleFeedVersion,\n pricingVersion: this.productPricingVersion,\n cacheScope: this.productCacheScope,\n };\n }\n\n private currentSignalMetadata(): FeedMetadata {\n return {\n wholesaleFeedVersion: this.signalWholesaleFeedVersion,\n pricingVersion: this.signalPricingVersion,\n cacheScope: this.signalCacheScope,\n };\n }\n\n private commitProductMetadata(metadata: FeedMetadata): void {\n this.productWholesaleFeedVersion = metadata.wholesaleFeedVersion;\n this.productPricingVersion = metadata.pricingVersion;\n this.productCacheScope = metadata.cacheScope;\n }\n\n private commitSignalMetadata(metadata: FeedMetadata): void {\n this.signalWholesaleFeedVersion = metadata.wholesaleFeedVersion;\n this.signalPricingVersion = metadata.pricingVersion;\n this.signalCacheScope = metadata.cacheScope;\n }\n\n private rememberWebhookVersion(webhook: V31Beta.WholesaleFeedWebhook): void {\n const event = webhook.event;\n if (event.event_type.startsWith('product.')) {\n this.productWholesaleFeedVersion = webhook.wholesale_feed_version;\n this.productCacheScope = webhook.cache_scope;\n return;\n }\n if (event.event_type.startsWith('signal.')) {\n this.signalWholesaleFeedVersion = webhook.wholesale_feed_version;\n this.signalCacheScope = webhook.cache_scope;\n }\n }\n\n private assertWebhookScope(webhook: V31Beta.WholesaleFeedWebhook): void {\n const expectedAccountId = this.expectedWebhookAccountId();\n if (expectedAccountId && webhook.account_id !== expectedAccountId) {\n throw new Error('WholesaleFeedSync: wholesale feed webhook account_id does not match this mirror.');\n }\n if (this.webhookScope?.subscriberId && webhook.subscriber_id !== this.webhookScope.subscriberId) {\n throw new Error('WholesaleFeedSync: wholesale feed webhook subscriber_id does not match this mirror.');\n }\n }\n\n private expectedWebhookAccountId(): string | undefined {\n if (this.webhookScope?.accountId) return this.webhookScope.accountId;\n return this.account && 'account_id' in this.account ? this.account.account_id : undefined;\n }\n\n private webhookDedupeKey(webhook: V31Beta.WholesaleFeedWebhook): string {\n return [\n this.webhookScope?.senderId ?? 'default',\n webhook.account_id,\n webhook.subscriber_id,\n webhook.idempotency_key,\n ].join(':');\n }\n\n private webhookEventDedupeKey(webhook: V31Beta.WholesaleFeedWebhook): string {\n return [\n this.webhookScope?.senderId ?? 'default',\n webhook.account_id,\n webhook.subscriber_id,\n webhook.event.event_id,\n ].join(':');\n }\n\n private async hasProcessedWebhook(dedupeKey: string, eventDedupeKey: string): Promise<boolean> {\n if (this.processedWebhookKeys.has(dedupeKey) || this.processedWebhookEventKeys.has(eventDedupeKey)) return true;\n if (!this.webhookDedupStore) return false;\n return (await this.webhookDedupStore.has(dedupeKey)) || (await this.webhookDedupStore.has(eventDedupeKey));\n }\n\n private async markWebhookProcessed(dedupeKey: string, eventDedupeKey: string): Promise<void> {\n this.processedWebhookKeys.add(dedupeKey);\n this.processedWebhookEventKeys.add(eventDedupeKey);\n await this.webhookDedupStore?.add(dedupeKey);\n await this.webhookDedupStore?.add(eventDedupeKey);\n }\n\n private rememberLastWebhookEventId(eventId: string): void {\n if (!isUuidV7(eventId)) return;\n if (!this.lastWebhookEventId || compareUuidV7(eventId, this.lastWebhookEventId) > 0) {\n this.lastWebhookEventId = eventId;\n }\n }\n\n private applyEvent(event: V31Beta.WholesaleFeedEvent): void {\n switch (event.event_type) {\n case 'product.created':\n case 'product.updated': {\n const payload = event.payload as {\n product_id: string;\n product?: Product;\n changed_fields?: string[];\n [k: string]: unknown;\n };\n if (typeof payload.product_id !== 'string') return;\n if (payload.product) {\n // Full denorm — replace the entry entirely.\n this.productIndex.set(payload.product_id, payload.product);\n return;\n }\n return;\n }\n case 'product.priced': {\n const payload = event.payload as {\n product_id: string;\n pricing_options?: unknown[];\n };\n const existing = this.productIndex.get(payload.product_id);\n if (existing && Array.isArray(payload.pricing_options)) {\n this.productIndex.set(payload.product_id, {\n ...existing,\n pricing_options: payload.pricing_options as Product['pricing_options'],\n });\n }\n return;\n }\n case 'product.removed': {\n const payload = event.payload as { product_id: string };\n if (typeof payload.product_id === 'string') this.productIndex.delete(payload.product_id);\n return;\n }\n case 'signal.created':\n case 'signal.updated': {\n const payload = event.payload as {\n signal_agent_segment_id: string;\n signal?: Signal;\n };\n if (typeof payload.signal_agent_segment_id !== 'string') return;\n if (payload.signal) {\n this.signalIndex.set(payload.signal_agent_segment_id, payload.signal);\n }\n return;\n }\n case 'signal.priced': {\n const payload = event.payload as {\n signal_agent_segment_id: string;\n pricing_options?: unknown[];\n };\n const existing = this.signalIndex.get(payload.signal_agent_segment_id);\n if (existing && Array.isArray(payload.pricing_options)) {\n this.signalIndex.set(payload.signal_agent_segment_id, {\n ...existing,\n pricing_options: payload.pricing_options as Signal['pricing_options'],\n });\n }\n return;\n }\n case 'signal.removed': {\n const payload = event.payload as { signal_agent_segment_id: string };\n if (typeof payload.signal_agent_segment_id === 'string') {\n this.signalIndex.delete(payload.signal_agent_segment_id);\n }\n return;\n }\n case 'wholesale_feed.bulk_change':\n // Bulk change events trigger re-bootstrap in applyWebhook before\n // reaching this method.\n return;\n }\n }\n\n private emitTypedEvent(event: V31Beta.WholesaleFeedEvent): void {\n // event_type is the discriminator; every value maps to a typed listener\n // name. The switch keeps TypeScript honest about exhaustiveness.\n switch (event.event_type) {\n case 'product.created':\n this.emit('product.created', { event });\n return;\n case 'product.updated':\n this.emit('product.updated', { event });\n return;\n case 'product.priced':\n this.emit('product.priced', { event });\n return;\n case 'product.removed':\n this.emit('product.removed', { event });\n return;\n case 'signal.created':\n this.emit('signal.created', { event });\n return;\n case 'signal.updated':\n this.emit('signal.updated', { event });\n return;\n case 'signal.priced':\n this.emit('signal.priced', { event });\n return;\n case 'signal.removed':\n this.emit('signal.removed', { event });\n return;\n case 'wholesale_feed.bulk_change':\n // Already emitted in applyWebhook before recovery.\n return;\n }\n }\n\n // ====== Private: diff emission (auto-poll / manual refresh) ======\n\n private emitDiffs(previousProducts: Map<string, Product>, previousSignals: Map<string, Signal>): void {\n const now = new Date().toISOString();\n const makeEvent = (\n event_type: V31Beta.WholesaleFeedEvent['event_type'],\n entity_type: V31Beta.WholesaleFeedEvent['entity_type'],\n entity_id: string,\n payload: object\n ): V31Beta.WholesaleFeedEvent =>\n ({\n // crypto.randomUUID() emits a v4 UUID, NOT v7. Synthetic events\n // are flagged via `synthetic: true` on the emit envelope so\n // adopters writing event_ids to a dedupe table know not to\n // treat the ID as seller-authored. Real webhook events carry the\n // agent's authoritative event_id.\n event_id: randomUUID(),\n event_type,\n entity_type,\n entity_id,\n created_at: now,\n payload,\n }) as V31Beta.WholesaleFeedEvent;\n const emit = (channel: keyof WholesaleFeedSyncEvents, event: V31Beta.WholesaleFeedEvent): void => {\n this.emit('event', { event, synthetic: true });\n this.emit(channel as 'product.created', { event, synthetic: true });\n };\n\n for (const [id, product] of this.productIndex) {\n const prev = previousProducts.get(id);\n if (!prev) {\n emit(\n 'product.created',\n makeEvent('product.created', 'product', id, {\n product_id: id,\n product,\n applies_to: { scope: this.productCacheScope },\n })\n );\n } else if (priceChanged(prev, product)) {\n emit(\n 'product.priced',\n makeEvent('product.priced', 'product', id, {\n product_id: id,\n pricing_options: product.pricing_options ?? [],\n applies_to: { scope: this.productCacheScope },\n })\n );\n } else if (!isDeepStrictEqual(prev, product)) {\n emit(\n 'product.updated',\n makeEvent('product.updated', 'product', id, {\n product_id: id,\n product,\n applies_to: { scope: this.productCacheScope },\n })\n );\n }\n }\n for (const [id] of previousProducts) {\n if (!this.productIndex.has(id)) {\n emit(\n 'product.removed',\n makeEvent('product.removed', 'product', id, {\n product_id: id,\n applies_to: { scope: this.productCacheScope },\n })\n );\n }\n }\n for (const [id, signal] of this.signalIndex) {\n const prev = previousSignals.get(id);\n if (!prev) {\n emit(\n 'signal.created',\n makeEvent('signal.created', 'signal', id, {\n signal_agent_segment_id: id,\n signal,\n applies_to: { scope: this.signalCacheScope },\n })\n );\n } else if (signalPriceChanged(prev, signal)) {\n emit(\n 'signal.priced',\n makeEvent('signal.priced', 'signal', id, {\n signal_agent_segment_id: id,\n pricing_options: (signal as { pricing_options?: unknown[] }).pricing_options ?? [],\n applies_to: { scope: this.signalCacheScope },\n })\n );\n } else if (!isDeepStrictEqual(prev, signal)) {\n emit(\n 'signal.updated',\n makeEvent('signal.updated', 'signal', id, {\n signal_agent_segment_id: id,\n signal,\n applies_to: { scope: this.signalCacheScope },\n })\n );\n }\n }\n for (const [id] of previousSignals) {\n if (!this.signalIndex.has(id)) {\n emit(\n 'signal.removed',\n makeEvent('signal.removed', 'signal', id, {\n signal_agent_segment_id: id,\n applies_to: { scope: this.signalCacheScope },\n })\n );\n }\n }\n }\n\n // ====== Private: search ======\n\n private searchProducts(filter: ProductFilter): Product[] {\n const text = filter.text?.toLowerCase();\n return this.products.list().filter(product => {\n if (filter.product_ids?.length) {\n const id = (product as { product_id?: string }).product_id;\n if (!id || !filter.product_ids.includes(id)) return false;\n }\n if (filter.delivery_types?.length) {\n const dt = (product as { delivery_type?: string }).delivery_type;\n if (!dt || !filter.delivery_types.includes(dt)) return false;\n }\n if (filter.format_ids?.length) {\n const formats = (product as { format_ids?: Array<{ id?: string }> | string[] }).format_ids;\n const ids = (Array.isArray(formats) ? formats : []).map(f => (typeof f === 'string' ? f : (f?.id ?? '')));\n if (!filter.format_ids.some(want => ids.includes(want))) return false;\n }\n if (text) {\n const haystack = [(product as { name?: string }).name, (product as { description?: string }).description]\n .filter((s): s is string => typeof s === 'string')\n .join(' ')\n .toLowerCase();\n if (!haystack.includes(text)) return false;\n }\n return true;\n });\n }\n\n private searchSignals(filter: SignalFilter): Signal[] {\n const text = filter.text?.toLowerCase();\n const provider = filter.data_provider?.toLowerCase();\n return this.signals.list().filter(signal => {\n const s = signal as {\n signal_agent_segment_id?: string;\n signal_type?: string;\n data_provider?: string;\n name?: string;\n description?: string;\n };\n if (filter.signal_agent_segment_ids?.length) {\n if (!s.signal_agent_segment_id || !filter.signal_agent_segment_ids.includes(s.signal_agent_segment_id))\n return false;\n }\n if (filter.signal_types?.length) {\n if (!s.signal_type || !filter.signal_types.includes(s.signal_type)) return false;\n }\n if (provider) {\n if (!s.data_provider || !s.data_provider.toLowerCase().includes(provider)) return false;\n }\n if (text) {\n const haystack = [s.name, s.description]\n .filter((v): v is string => typeof v === 'string')\n .join(' ')\n .toLowerCase();\n if (!haystack.includes(text)) return false;\n }\n return true;\n });\n }\n\n // ====== Private: state ======\n\n private setState(next: WholesaleFeedSyncState): void {\n const from = this._state;\n if (from === next) return;\n this._state = next;\n this.emit('stateChange', { from, to: next });\n }\n\n private isLifecycleCurrent(epoch: number): boolean {\n return epoch === this.lifecycleEpoch;\n }\n}\n\n// ====== Diff helpers ======\n\nfunction priceChanged(prev: Product, next: Product): boolean {\n const a = (prev as { pricing_options?: unknown[] }).pricing_options;\n const b = (next as { pricing_options?: unknown[] }).pricing_options;\n return !isDeepStrictEqual(a, b);\n}\n\nfunction signalPriceChanged(prev: Signal, next: Signal): boolean {\n const a = (prev as { pricing_options?: unknown[] }).pricing_options;\n const b = (next as { pricing_options?: unknown[] }).pricing_options;\n return !isDeepStrictEqual(a, b);\n}\n\nfunction isUuidV7(value: string): boolean {\n return /^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(value);\n}\n\nfunction compareUuidV7(a: string, b: string): number {\n if (!isUuidV7(a) || !isUuidV7(b)) return 1;\n const normalizedA = a.toLowerCase();\n const normalizedB = b.toLowerCase();\n return normalizedA === normalizedB ? 0 : normalizedA > normalizedB ? 1 : -1;\n}\n\nfunction mergeFeedMetadata(\n current: FeedMetadata,\n body: {\n wholesale_feed_version?: unknown;\n pricing_version?: unknown;\n cache_scope?: unknown;\n }\n): FeedMetadata {\n return {\n wholesaleFeedVersion:\n typeof body.wholesale_feed_version === 'string' ? body.wholesale_feed_version : current.wholesaleFeedVersion,\n pricingVersion: typeof body.pricing_version === 'string' ? body.pricing_version : current.pricingVersion,\n cacheScope: body.cache_scope === 'public' || body.cache_scope === 'account' ? body.cache_scope : current.cacheScope,\n };\n}\n\nasync function sleep(ms: number): Promise<void> {\n await new Promise(resolve => setTimeout(resolve, ms));\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1,7 +1 @@
|
|
|
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
|
//# sourceMappingURL=types.mjs.map
|
|
@@ -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 { ADCPError } from "../errors/index.mjs";
|
|
8
2
|
class WholesaleFeedWebhookNotificationError extends ADCPError {
|
|
9
3
|
code;
|