@adcp/sdk 12.0.0 → 12.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/lib/adapters/content-standards-adapter.mjs +0 -6
- package/dist/lib/adapters/content-standards-adapter.mjs.map +1 -1
- package/dist/lib/adapters/derived-account-store.mjs +0 -6
- package/dist/lib/adapters/derived-account-store.mjs.map +1 -1
- package/dist/lib/adapters/governance-adapter.mjs +0 -6
- package/dist/lib/adapters/governance-adapter.mjs.map +1 -1
- package/dist/lib/adapters/implicit-account-store.mjs +0 -6
- package/dist/lib/adapters/implicit-account-store.mjs.map +1 -1
- package/dist/lib/adapters/index.mjs +0 -6
- package/dist/lib/adapters/index.mjs.map +1 -1
- package/dist/lib/adapters/legacy/v2-5/create_media_buy.mjs +0 -6
- package/dist/lib/adapters/legacy/v2-5/create_media_buy.mjs.map +1 -1
- package/dist/lib/adapters/legacy/v2-5/get_products.mjs +0 -6
- package/dist/lib/adapters/legacy/v2-5/get_products.mjs.map +1 -1
- package/dist/lib/adapters/legacy/v2-5/index.mjs +0 -6
- package/dist/lib/adapters/legacy/v2-5/index.mjs.map +1 -1
- package/dist/lib/adapters/legacy/v2-5/list_creative_formats.mjs +0 -6
- package/dist/lib/adapters/legacy/v2-5/list_creative_formats.mjs.map +1 -1
- package/dist/lib/adapters/legacy/v2-5/preview_creative.mjs +0 -6
- package/dist/lib/adapters/legacy/v2-5/preview_creative.mjs.map +1 -1
- package/dist/lib/adapters/legacy/v2-5/sync_creatives.mjs +0 -6
- package/dist/lib/adapters/legacy/v2-5/sync_creatives.mjs.map +1 -1
- package/dist/lib/adapters/legacy/v2-5/types.mjs +0 -6
- package/dist/lib/adapters/legacy/v2-5/update_media_buy.mjs +0 -6
- package/dist/lib/adapters/legacy/v2-5/update_media_buy.mjs.map +1 -1
- package/dist/lib/adapters/oauth-passthrough-resolver.mjs +0 -6
- package/dist/lib/adapters/oauth-passthrough-resolver.mjs.map +1 -1
- package/dist/lib/adapters/property-list-adapter.mjs +0 -6
- package/dist/lib/adapters/property-list-adapter.mjs.map +1 -1
- package/dist/lib/adapters/roster-account-store.mjs +0 -6
- package/dist/lib/adapters/roster-account-store.mjs.map +1 -1
- package/dist/lib/adapters/si-session-manager.mjs +0 -6
- package/dist/lib/adapters/si-session-manager.mjs.map +1 -1
- package/dist/lib/adapters/version/3.0/brand-fields.mjs +0 -6
- package/dist/lib/adapters/version/3.0/brand-fields.mjs.map +1 -1
- package/dist/lib/adapters/version/3.0/get-products.mjs +0 -6
- package/dist/lib/adapters/version/3.0/get-products.mjs.map +1 -1
- package/dist/lib/adapters/version/3.0/index.mjs +0 -6
- package/dist/lib/adapters/version/3.0/index.mjs.map +1 -1
- package/dist/lib/adapters/version/3.0/sync-accounts.mjs +0 -6
- package/dist/lib/adapters/version/3.0/sync-accounts.mjs.map +1 -1
- package/dist/lib/adapters/version/index.mjs +0 -6
- package/dist/lib/adapters/version/index.mjs.map +1 -1
- package/dist/lib/adapters/version/types.mjs +0 -6
- package/dist/lib/advanced.mjs +0 -6
- package/dist/lib/advanced.mjs.map +1 -1
- package/dist/lib/agents/index.generated.mjs +0 -6
- package/dist/lib/agents/index.generated.mjs.map +1 -1
- package/dist/lib/auth/index.mjs +0 -6
- package/dist/lib/auth/index.mjs.map +1 -1
- package/dist/lib/auth/oauth/CLIFlowHandler.mjs +0 -6
- package/dist/lib/auth/oauth/CLIFlowHandler.mjs.map +1 -1
- package/dist/lib/auth/oauth/ClientCredentialsFlow.mjs +0 -6
- package/dist/lib/auth/oauth/ClientCredentialsFlow.mjs.map +1 -1
- package/dist/lib/auth/oauth/MCPOAuthProvider.mjs +0 -6
- package/dist/lib/auth/oauth/MCPOAuthProvider.mjs.map +1 -1
- package/dist/lib/auth/oauth/NonInteractiveFlowHandler.mjs +0 -6
- package/dist/lib/auth/oauth/NonInteractiveFlowHandler.mjs.map +1 -1
- package/dist/lib/auth/oauth/authorization-required.mjs +0 -6
- package/dist/lib/auth/oauth/authorization-required.mjs.map +1 -1
- package/dist/lib/auth/oauth/diagnose.mjs +0 -6
- package/dist/lib/auth/oauth/diagnose.mjs.map +1 -1
- package/dist/lib/auth/oauth/diagnostics.mjs +0 -6
- package/dist/lib/auth/oauth/diagnostics.mjs.map +1 -1
- package/dist/lib/auth/oauth/discovery.mjs +0 -6
- package/dist/lib/auth/oauth/discovery.mjs.map +1 -1
- package/dist/lib/auth/oauth/file-storage.mjs +0 -6
- package/dist/lib/auth/oauth/file-storage.mjs.map +1 -1
- package/dist/lib/auth/oauth/index.mjs +0 -6
- package/dist/lib/auth/oauth/index.mjs.map +1 -1
- package/dist/lib/auth/oauth/secret-resolver.mjs +0 -6
- package/dist/lib/auth/oauth/secret-resolver.mjs.map +1 -1
- package/dist/lib/auth/oauth/storage-registry.mjs +0 -6
- package/dist/lib/auth/oauth/storage-registry.mjs.map +1 -1
- package/dist/lib/auth/oauth/types.mjs +0 -6
- package/dist/lib/auth/oauth/types.mjs.map +1 -1
- package/dist/lib/auth/oauth/web-flow.mjs +0 -6
- package/dist/lib/auth/oauth/web-flow.mjs.map +1 -1
- package/dist/lib/brand/index.mjs +0 -6
- package/dist/lib/brand/index.mjs.map +1 -1
- package/dist/lib/canonical-references/index.mjs +6 -7
- package/dist/lib/canonical-references/index.mjs.map +1 -1
- package/dist/lib/client/index.mjs +0 -6
- package/dist/lib/client/index.mjs.map +1 -1
- package/dist/lib/compliance/index.mjs +0 -6
- package/dist/lib/compliance/index.mjs.map +1 -1
- package/dist/lib/compliance-fixtures/index.mjs +0 -6
- package/dist/lib/compliance-fixtures/index.mjs.map +1 -1
- package/dist/lib/compliance-fixtures/test-authorization-server.mjs +0 -6
- package/dist/lib/compliance-fixtures/test-authorization-server.mjs.map +1 -1
- package/dist/lib/conformance/index.mjs +0 -6
- package/dist/lib/conformance/index.mjs.map +1 -1
- package/dist/lib/conformance/invariants/uniformError.mjs +0 -6
- package/dist/lib/conformance/invariants/uniformError.mjs.map +1 -1
- package/dist/lib/conformance/invariants/uniformErrorComparator.mjs +0 -6
- package/dist/lib/conformance/invariants/uniformErrorComparator.mjs.map +1 -1
- package/dist/lib/conformance/oracle.mjs +0 -6
- package/dist/lib/conformance/oracle.mjs.map +1 -1
- package/dist/lib/conformance/runConformance.mjs +0 -6
- package/dist/lib/conformance/runConformance.mjs.map +1 -1
- package/dist/lib/conformance/runners.mjs +0 -6
- package/dist/lib/conformance/runners.mjs.map +1 -1
- package/dist/lib/conformance/schemaArbitrary.mjs +0 -6
- package/dist/lib/conformance/schemaArbitrary.mjs.map +1 -1
- package/dist/lib/conformance/schemaLoader.mjs +5 -6
- package/dist/lib/conformance/schemaLoader.mjs.map +1 -1
- package/dist/lib/conformance/seeder.mjs +0 -6
- package/dist/lib/conformance/seeder.mjs.map +1 -1
- package/dist/lib/conformance/types.mjs +0 -6
- package/dist/lib/conformance/types.mjs.map +1 -1
- package/dist/lib/conformance/webhook.mjs +0 -6
- package/dist/lib/conformance/webhook.mjs.map +1 -1
- package/dist/lib/core/ADCPMultiAgentClient.mjs +0 -6
- package/dist/lib/core/ADCPMultiAgentClient.mjs.map +1 -1
- package/dist/lib/core/AgentClient.mjs +0 -6
- package/dist/lib/core/AgentClient.mjs.map +1 -1
- package/dist/lib/core/AsyncHandler.mjs +0 -6
- package/dist/lib/core/AsyncHandler.mjs.map +1 -1
- package/dist/lib/core/ConfigurationManager.mjs +0 -6
- package/dist/lib/core/ConfigurationManager.mjs.map +1 -1
- package/dist/lib/core/ConversationTypes.mjs +0 -6
- package/dist/lib/core/CreativeAgentClient.mjs +0 -6
- package/dist/lib/core/CreativeAgentClient.mjs.map +1 -1
- package/dist/lib/core/GovernanceMiddleware.mjs +0 -6
- package/dist/lib/core/GovernanceMiddleware.mjs.map +1 -1
- package/dist/lib/core/GovernanceTypes.mjs +0 -6
- package/dist/lib/core/GovernanceTypes.mjs.map +1 -1
- package/dist/lib/core/ProtocolResponseParser.mjs +0 -6
- package/dist/lib/core/ProtocolResponseParser.mjs.map +1 -1
- package/dist/lib/core/ResponseValidator.mjs +0 -6
- package/dist/lib/core/ResponseValidator.mjs.map +1 -1
- package/dist/lib/core/SingleAgentClient.mjs +0 -6
- package/dist/lib/core/SingleAgentClient.mjs.map +1 -1
- package/dist/lib/core/TaskEventTypes.mjs +0 -6
- package/dist/lib/core/TaskEventTypes.mjs.map +1 -1
- package/dist/lib/core/TaskExecutor.mjs +0 -6
- package/dist/lib/core/TaskExecutor.mjs.map +1 -1
- package/dist/lib/core/match.mjs +0 -6
- package/dist/lib/core/match.mjs.map +1 -1
- package/dist/lib/core/task-status.mjs +0 -6
- package/dist/lib/core/task-status.mjs.map +1 -1
- package/dist/lib/core/webhook-url.mjs +0 -6
- package/dist/lib/core/webhook-url.mjs.map +1 -1
- package/dist/lib/discovery/adagents-redirects.mjs +0 -6
- package/dist/lib/discovery/adagents-redirects.mjs.map +1 -1
- package/dist/lib/discovery/agent-directory.mjs +0 -6
- package/dist/lib/discovery/agent-directory.mjs.map +1 -1
- package/dist/lib/discovery/inline-publisher-properties.mjs +0 -6
- package/dist/lib/discovery/inline-publisher-properties.mjs.map +1 -1
- package/dist/lib/discovery/network-consistency-checker.mjs +0 -6
- package/dist/lib/discovery/network-consistency-checker.mjs.map +1 -1
- package/dist/lib/discovery/property-crawler.mjs +0 -6
- package/dist/lib/discovery/property-crawler.mjs.map +1 -1
- package/dist/lib/discovery/property-index.mjs +0 -6
- package/dist/lib/discovery/property-index.mjs.map +1 -1
- package/dist/lib/discovery/publisher-property-selector.mjs +0 -6
- package/dist/lib/discovery/publisher-property-selector.mjs.map +1 -1
- package/dist/lib/discovery/resolve-agent-properties.mjs +0 -6
- package/dist/lib/discovery/resolve-agent-properties.mjs.map +1 -1
- package/dist/lib/discovery/types.mjs +0 -6
- package/dist/lib/discovery/validate-adagents.mjs +0 -6
- package/dist/lib/discovery/validate-adagents.mjs.map +1 -1
- package/dist/lib/enums.mjs +0 -6
- package/dist/lib/enums.mjs.map +1 -1
- package/dist/lib/errors/index.mjs +0 -6
- package/dist/lib/errors/index.mjs.map +1 -1
- package/dist/lib/express-mcp/index.mjs +0 -6
- package/dist/lib/express-mcp/index.mjs.map +1 -1
- package/dist/lib/governance/index.mjs +0 -6
- package/dist/lib/governance/index.mjs.map +1 -1
- package/dist/lib/handlers/types.mjs +0 -6
- package/dist/lib/handlers/types.mjs.map +1 -1
- package/dist/lib/index.d.mts +1 -1
- package/dist/lib/index.d.ts +1 -1
- package/dist/lib/index.d.ts.map +1 -1
- package/dist/lib/index.js.map +1 -1
- package/dist/lib/index.mjs +0 -6
- package/dist/lib/index.mjs.map +1 -1
- package/dist/lib/media-buy/available-actions.mjs +0 -6
- package/dist/lib/media-buy/available-actions.mjs.map +1 -1
- package/dist/lib/media-buy/index.mjs +0 -6
- package/dist/lib/media-buy/index.mjs.map +1 -1
- package/dist/lib/media-buy/preflight.mjs +0 -6
- package/dist/lib/media-buy/preflight.mjs.map +1 -1
- package/dist/lib/media-buy/property-policy.mjs +0 -6
- package/dist/lib/media-buy/property-policy.mjs.map +1 -1
- package/dist/lib/media-buy/types.mjs +0 -6
- package/dist/lib/media-buy/types.mjs.map +1 -1
- package/dist/lib/media-buy/update-fields.generated.mjs +0 -6
- package/dist/lib/media-buy/update-fields.generated.mjs.map +1 -1
- package/dist/lib/mock-server/creative-ad-server/seed-data.mjs +0 -6
- package/dist/lib/mock-server/creative-ad-server/seed-data.mjs.map +1 -1
- package/dist/lib/mock-server/creative-ad-server/server.mjs +0 -6
- package/dist/lib/mock-server/creative-ad-server/server.mjs.map +1 -1
- package/dist/lib/mock-server/creative-template/seed-data.mjs +0 -6
- package/dist/lib/mock-server/creative-template/seed-data.mjs.map +1 -1
- package/dist/lib/mock-server/creative-template/server.mjs +0 -6
- package/dist/lib/mock-server/creative-template/server.mjs.map +1 -1
- package/dist/lib/mock-server/index.mjs +0 -6
- package/dist/lib/mock-server/index.mjs.map +1 -1
- package/dist/lib/mock-server/sales-guaranteed/recipe.mjs +0 -6
- package/dist/lib/mock-server/sales-guaranteed/recipe.mjs.map +1 -1
- package/dist/lib/mock-server/sales-guaranteed/seed-data.mjs +0 -6
- package/dist/lib/mock-server/sales-guaranteed/seed-data.mjs.map +1 -1
- package/dist/lib/mock-server/sales-guaranteed/server.mjs +0 -6
- package/dist/lib/mock-server/sales-guaranteed/server.mjs.map +1 -1
- package/dist/lib/mock-server/sales-non-guaranteed/recipe.mjs +0 -6
- package/dist/lib/mock-server/sales-non-guaranteed/recipe.mjs.map +1 -1
- package/dist/lib/mock-server/sales-non-guaranteed/seed-data.mjs +0 -6
- package/dist/lib/mock-server/sales-non-guaranteed/seed-data.mjs.map +1 -1
- package/dist/lib/mock-server/sales-non-guaranteed/server.mjs +0 -6
- package/dist/lib/mock-server/sales-non-guaranteed/server.mjs.map +1 -1
- package/dist/lib/mock-server/sales-social/seed-data.mjs +0 -6
- package/dist/lib/mock-server/sales-social/seed-data.mjs.map +1 -1
- package/dist/lib/mock-server/sales-social/server.mjs +0 -6
- package/dist/lib/mock-server/sales-social/server.mjs.map +1 -1
- package/dist/lib/mock-server/scenario.mjs +0 -6
- package/dist/lib/mock-server/scenario.mjs.map +1 -1
- package/dist/lib/mock-server/signal-marketplace/seed-data.mjs +0 -6
- package/dist/lib/mock-server/signal-marketplace/seed-data.mjs.map +1 -1
- package/dist/lib/mock-server/signal-marketplace/server.mjs +0 -6
- package/dist/lib/mock-server/signal-marketplace/server.mjs.map +1 -1
- package/dist/lib/mock-server/sponsored-intelligence/seed-data.mjs +0 -6
- package/dist/lib/mock-server/sponsored-intelligence/seed-data.mjs.map +1 -1
- package/dist/lib/mock-server/sponsored-intelligence/server.mjs +0 -6
- package/dist/lib/mock-server/sponsored-intelligence/server.mjs.map +1 -1
- package/dist/lib/net/address-guards.mjs +0 -6
- package/dist/lib/net/address-guards.mjs.map +1 -1
- package/dist/lib/net/index.mjs +0 -6
- package/dist/lib/net/index.mjs.map +1 -1
- package/dist/lib/net/ssrf-fetch.mjs +0 -6
- package/dist/lib/net/ssrf-fetch.mjs.map +1 -1
- package/dist/lib/observability/index.mjs +0 -6
- package/dist/lib/observability/index.mjs.map +1 -1
- package/dist/lib/observability/tracing.mjs +6 -7
- package/dist/lib/observability/tracing.mjs.map +1 -1
- package/dist/lib/protocols/a2a.mjs +0 -6
- package/dist/lib/protocols/a2a.mjs.map +1 -1
- package/dist/lib/protocols/abort.mjs +0 -6
- package/dist/lib/protocols/abort.mjs.map +1 -1
- package/dist/lib/protocols/index.mjs +0 -6
- package/dist/lib/protocols/index.mjs.map +1 -1
- package/dist/lib/protocols/mcp-modern.mjs +0 -6
- package/dist/lib/protocols/mcp-modern.mjs.map +1 -1
- package/dist/lib/protocols/mcp-tasks.mjs +0 -6
- package/dist/lib/protocols/mcp-tasks.mjs.map +1 -1
- package/dist/lib/protocols/mcp.mjs +0 -6
- package/dist/lib/protocols/mcp.mjs.map +1 -1
- package/dist/lib/protocols/rawResponseCapture.mjs +0 -6
- package/dist/lib/protocols/rawResponseCapture.mjs.map +1 -1
- package/dist/lib/protocols/responseSizeLimit.mjs +0 -6
- package/dist/lib/protocols/responseSizeLimit.mjs.map +1 -1
- package/dist/lib/protocols/transportDiagnostics.mjs +0 -6
- package/dist/lib/protocols/transportDiagnostics.mjs.map +1 -1
- package/dist/lib/registry/cursor-store.mjs +0 -6
- package/dist/lib/registry/cursor-store.mjs.map +1 -1
- package/dist/lib/registry/feed-stream.mjs +0 -6
- package/dist/lib/registry/feed-stream.mjs.map +1 -1
- package/dist/lib/registry/index.mjs +0 -6
- package/dist/lib/registry/index.mjs.map +1 -1
- package/dist/lib/registry/property-registry.mjs +0 -6
- package/dist/lib/registry/property-registry.mjs.map +1 -1
- package/dist/lib/registry/sync.mjs +0 -6
- package/dist/lib/registry/sync.mjs.map +1 -1
- package/dist/lib/registry/types.generated.mjs +0 -6
- package/dist/lib/registry/types.mjs +0 -6
- package/dist/lib/schemas/index.mjs +0 -6
- package/dist/lib/schemas/index.mjs.map +1 -1
- package/dist/lib/schemas-data/v2.5/_provenance.json +1 -1
- package/dist/lib/server/a2a-adapter.mjs +0 -6
- package/dist/lib/server/a2a-adapter.mjs.map +1 -1
- package/dist/lib/server/account-mode.mjs +0 -6
- package/dist/lib/server/account-mode.mjs.map +1 -1
- package/dist/lib/server/adcp-server.mjs +0 -6
- package/dist/lib/server/adcp-server.mjs.map +1 -1
- package/dist/lib/server/auth-introspection.mjs +0 -6
- package/dist/lib/server/auth-introspection.mjs.map +1 -1
- package/dist/lib/server/auth-signature.mjs +0 -6
- package/dist/lib/server/auth-signature.mjs.map +1 -1
- package/dist/lib/server/auth.mjs +0 -6
- package/dist/lib/server/auth.mjs.map +1 -1
- package/dist/lib/server/create-adcp-server.d.mts +13 -0
- package/dist/lib/server/create-adcp-server.d.ts +13 -0
- package/dist/lib/server/create-adcp-server.d.ts.map +1 -1
- package/dist/lib/server/create-adcp-server.js +3 -2
- package/dist/lib/server/create-adcp-server.js.map +1 -1
- package/dist/lib/server/create-adcp-server.mjs +3 -8
- package/dist/lib/server/create-adcp-server.mjs.map +1 -1
- package/dist/lib/server/credential-policy.mjs +0 -6
- package/dist/lib/server/credential-policy.mjs.map +1 -1
- package/dist/lib/server/ctx-metadata/backends/memory.mjs +0 -6
- package/dist/lib/server/ctx-metadata/backends/memory.mjs.map +1 -1
- package/dist/lib/server/ctx-metadata/backends/pg.mjs +0 -6
- package/dist/lib/server/ctx-metadata/backends/pg.mjs.map +1 -1
- package/dist/lib/server/ctx-metadata/backends/redis.mjs +0 -6
- package/dist/lib/server/ctx-metadata/backends/redis.mjs.map +1 -1
- package/dist/lib/server/ctx-metadata/index.mjs +0 -6
- package/dist/lib/server/ctx-metadata/index.mjs.map +1 -1
- package/dist/lib/server/ctx-metadata/store.mjs +0 -6
- package/dist/lib/server/ctx-metadata/store.mjs.map +1 -1
- package/dist/lib/server/ctx-metadata/wire-shape.mjs +0 -6
- package/dist/lib/server/ctx-metadata/wire-shape.mjs.map +1 -1
- package/dist/lib/server/decisioning/account.mjs +0 -6
- package/dist/lib/server/decisioning/account.mjs.map +1 -1
- package/dist/lib/server/decisioning/admin-router.mjs +0 -6
- package/dist/lib/server/decisioning/admin-router.mjs.map +1 -1
- package/dist/lib/server/decisioning/assembly-helpers.mjs +0 -6
- package/dist/lib/server/decisioning/assembly-helpers.mjs.map +1 -1
- package/dist/lib/server/decisioning/async-outcome.mjs +0 -6
- package/dist/lib/server/decisioning/async-outcome.mjs.map +1 -1
- package/dist/lib/server/decisioning/buyer-agent.mjs +0 -6
- package/dist/lib/server/decisioning/buyer-agent.mjs.map +1 -1
- package/dist/lib/server/decisioning/capabilities.mjs +0 -6
- package/dist/lib/server/decisioning/capabilities.mjs.map +1 -1
- package/dist/lib/server/decisioning/compose.mjs +0 -6
- package/dist/lib/server/decisioning/compose.mjs.map +1 -1
- package/dist/lib/server/decisioning/context.mjs +0 -6
- package/dist/lib/server/decisioning/errors-typed.mjs +0 -6
- package/dist/lib/server/decisioning/errors-typed.mjs.map +1 -1
- package/dist/lib/server/decisioning/helpers.mjs +0 -6
- package/dist/lib/server/decisioning/helpers.mjs.map +1 -1
- package/dist/lib/server/decisioning/index.mjs +0 -6
- package/dist/lib/server/decisioning/index.mjs.map +1 -1
- package/dist/lib/server/decisioning/list-helpers.mjs +0 -6
- package/dist/lib/server/decisioning/list-helpers.mjs.map +1 -1
- package/dist/lib/server/decisioning/manifest-helpers.mjs +0 -6
- package/dist/lib/server/decisioning/manifest-helpers.mjs.map +1 -1
- package/dist/lib/server/decisioning/pagination.mjs +0 -6
- package/dist/lib/server/decisioning/platform-helpers.mjs +0 -6
- package/dist/lib/server/decisioning/platform-helpers.mjs.map +1 -1
- package/dist/lib/server/decisioning/platform.mjs +0 -6
- package/dist/lib/server/decisioning/proposal/dispatch.mjs +0 -6
- package/dist/lib/server/decisioning/proposal/dispatch.mjs.map +1 -1
- package/dist/lib/server/decisioning/proposal/index.mjs +0 -6
- package/dist/lib/server/decisioning/proposal/index.mjs.map +1 -1
- package/dist/lib/server/decisioning/proposal/lifecycle.mjs +0 -6
- package/dist/lib/server/decisioning/proposal/lifecycle.mjs.map +1 -1
- package/dist/lib/server/decisioning/proposal/mock-manager.mjs +0 -6
- package/dist/lib/server/decisioning/proposal/mock-manager.mjs.map +1 -1
- package/dist/lib/server/decisioning/proposal/store.mjs +0 -6
- package/dist/lib/server/decisioning/proposal/store.mjs.map +1 -1
- package/dist/lib/server/decisioning/proposal/types.mjs +0 -6
- package/dist/lib/server/decisioning/proposal/types.mjs.map +1 -1
- package/dist/lib/server/decisioning/resolve-presets.mjs +0 -6
- package/dist/lib/server/decisioning/resolve-presets.mjs.map +1 -1
- package/dist/lib/server/decisioning/runtime/entity-hydration.generated.mjs +0 -6
- package/dist/lib/server/decisioning/runtime/entity-hydration.generated.mjs.map +1 -1
- package/dist/lib/server/decisioning/runtime/from-platform.mjs +0 -6
- package/dist/lib/server/decisioning/runtime/from-platform.mjs.map +1 -1
- package/dist/lib/server/decisioning/runtime/observed-modes.mjs +0 -6
- package/dist/lib/server/decisioning/runtime/observed-modes.mjs.map +1 -1
- package/dist/lib/server/decisioning/runtime/postgres-task-registry.mjs +0 -6
- package/dist/lib/server/decisioning/runtime/postgres-task-registry.mjs.map +1 -1
- package/dist/lib/server/decisioning/runtime/protocol-for-tool.mjs +0 -6
- package/dist/lib/server/decisioning/runtime/protocol-for-tool.mjs.map +1 -1
- package/dist/lib/server/decisioning/runtime/task-registry.mjs +0 -6
- package/dist/lib/server/decisioning/runtime/task-registry.mjs.map +1 -1
- package/dist/lib/server/decisioning/runtime/to-context.mjs +0 -6
- package/dist/lib/server/decisioning/runtime/to-context.mjs.map +1 -1
- package/dist/lib/server/decisioning/runtime/validate-platform.mjs +0 -6
- package/dist/lib/server/decisioning/runtime/validate-platform.mjs.map +1 -1
- package/dist/lib/server/decisioning/specialisms/audiences.mjs +0 -6
- package/dist/lib/server/decisioning/specialisms/brand-rights.mjs +0 -6
- package/dist/lib/server/decisioning/specialisms/campaign-governance.mjs +0 -6
- package/dist/lib/server/decisioning/specialisms/content-standards.mjs +0 -6
- package/dist/lib/server/decisioning/specialisms/creative-ad-server.mjs +0 -6
- package/dist/lib/server/decisioning/specialisms/creative.mjs +0 -6
- package/dist/lib/server/decisioning/specialisms/lists.mjs +0 -6
- package/dist/lib/server/decisioning/specialisms/sales.mjs +0 -6
- package/dist/lib/server/decisioning/specialisms/signals.mjs +0 -6
- package/dist/lib/server/decisioning/specialisms/sponsored-intelligence.mjs +0 -6
- package/dist/lib/server/decisioning/start-time.mjs +0 -6
- package/dist/lib/server/decisioning/start-time.mjs.map +1 -1
- package/dist/lib/server/decisioning/status-changes.mjs +0 -6
- package/dist/lib/server/decisioning/status-changes.mjs.map +1 -1
- package/dist/lib/server/decisioning/status-mappers.mjs +0 -6
- package/dist/lib/server/decisioning/status-mappers.mjs.map +1 -1
- package/dist/lib/server/decisioning/tenant-registry.mjs +0 -6
- package/dist/lib/server/decisioning/tenant-registry.mjs.map +1 -1
- package/dist/lib/server/decisioning/tenant-store.mjs +0 -6
- package/dist/lib/server/decisioning/tenant-store.mjs.map +1 -1
- package/dist/lib/server/decisioning/validate-specialisms.mjs +0 -6
- package/dist/lib/server/decisioning/validate-specialisms.mjs.map +1 -1
- package/dist/lib/server/dynamic-registry.mjs +0 -6
- package/dist/lib/server/dynamic-registry.mjs.map +1 -1
- package/dist/lib/server/envelope-allowlist.mjs +0 -6
- package/dist/lib/server/envelope-allowlist.mjs.map +1 -1
- package/dist/lib/server/error-arm-tools.mjs +5 -6
- package/dist/lib/server/error-arm-tools.mjs.map +1 -1
- package/dist/lib/server/errors.mjs +0 -6
- package/dist/lib/server/errors.mjs.map +1 -1
- package/dist/lib/server/example-tld-guard.mjs +0 -6
- package/dist/lib/server/example-tld-guard.mjs.map +1 -1
- package/dist/lib/server/express-adapter.mjs +0 -6
- package/dist/lib/server/express-adapter.mjs.map +1 -1
- package/dist/lib/server/governance.mjs +0 -6
- package/dist/lib/server/governance.mjs.map +1 -1
- package/dist/lib/server/idempotency/backends/lazy.mjs +0 -6
- package/dist/lib/server/idempotency/backends/lazy.mjs.map +1 -1
- package/dist/lib/server/idempotency/backends/memory.mjs +0 -6
- package/dist/lib/server/idempotency/backends/memory.mjs.map +1 -1
- package/dist/lib/server/idempotency/backends/pg.mjs +0 -6
- package/dist/lib/server/idempotency/backends/pg.mjs.map +1 -1
- package/dist/lib/server/idempotency/backends/redis.mjs +0 -6
- package/dist/lib/server/idempotency/backends/redis.mjs.map +1 -1
- package/dist/lib/server/idempotency/index.mjs +0 -6
- package/dist/lib/server/idempotency/index.mjs.map +1 -1
- package/dist/lib/server/idempotency/store.mjs +0 -6
- package/dist/lib/server/idempotency/store.mjs.map +1 -1
- package/dist/lib/server/index.d.mts +1 -1
- package/dist/lib/server/index.d.ts +1 -1
- package/dist/lib/server/index.d.ts.map +1 -1
- package/dist/lib/server/index.js.map +1 -1
- package/dist/lib/server/index.mjs +0 -6
- package/dist/lib/server/index.mjs.map +1 -1
- package/dist/lib/server/legacy/v5/index.d.mts +1 -1
- package/dist/lib/server/legacy/v5/index.d.ts +1 -1
- package/dist/lib/server/legacy/v5/index.d.ts.map +1 -1
- package/dist/lib/server/legacy/v5/index.js.map +1 -1
- package/dist/lib/server/legacy/v5/index.mjs +0 -6
- package/dist/lib/server/legacy/v5/index.mjs.map +1 -1
- package/dist/lib/server/mcp-modern-server.mjs +0 -6
- package/dist/lib/server/mcp-modern-server.mjs.map +1 -1
- package/dist/lib/server/media-buy-actions.mjs +0 -6
- package/dist/lib/server/media-buy-actions.mjs.map +1 -1
- package/dist/lib/server/media-buy-helpers.mjs +0 -6
- package/dist/lib/server/media-buy-helpers.mjs.map +1 -1
- package/dist/lib/server/media-buy-store.mjs +0 -6
- package/dist/lib/server/media-buy-store.mjs.map +1 -1
- package/dist/lib/server/normalize-errors.mjs +0 -6
- package/dist/lib/server/normalize-errors.mjs.map +1 -1
- package/dist/lib/server/operational-platform.mjs +0 -6
- package/dist/lib/server/operational-platform.mjs.map +1 -1
- package/dist/lib/server/pick-safe-details.mjs +0 -6
- package/dist/lib/server/pick-safe-details.mjs.map +1 -1
- package/dist/lib/server/pin-and-bind-fetch.mjs +0 -6
- package/dist/lib/server/pin-and-bind-fetch.mjs.map +1 -1
- package/dist/lib/server/postgres-state-store.mjs +0 -6
- package/dist/lib/server/postgres-state-store.mjs.map +1 -1
- package/dist/lib/server/postgres-task-store.mjs +0 -6
- package/dist/lib/server/postgres-task-store.mjs.map +1 -1
- package/dist/lib/server/product-defaults.mjs +0 -6
- package/dist/lib/server/product-defaults.mjs.map +1 -1
- package/dist/lib/server/redact.mjs +0 -6
- package/dist/lib/server/redact.mjs.map +1 -1
- package/dist/lib/server/responses.mjs +0 -6
- package/dist/lib/server/responses.mjs.map +1 -1
- package/dist/lib/server/serve.mjs +0 -6
- package/dist/lib/server/serve.mjs.map +1 -1
- package/dist/lib/server/socket-mode/conformance-client.mjs +0 -6
- package/dist/lib/server/socket-mode/conformance-client.mjs.map +1 -1
- package/dist/lib/server/socket-mode/index.mjs +0 -6
- package/dist/lib/server/socket-mode/index.mjs.map +1 -1
- package/dist/lib/server/socket-mode/ws-transport.mjs +0 -6
- package/dist/lib/server/socket-mode/ws-transport.mjs.map +1 -1
- package/dist/lib/server/state-machine.mjs +0 -6
- package/dist/lib/server/state-machine.mjs.map +1 -1
- package/dist/lib/server/state-store.mjs +0 -6
- package/dist/lib/server/state-store.mjs.map +1 -1
- package/dist/lib/server/structured-serialize.mjs +0 -6
- package/dist/lib/server/structured-serialize.mjs.map +1 -1
- package/dist/lib/server/targeting-helpers.mjs +0 -6
- package/dist/lib/server/targeting-helpers.mjs.map +1 -1
- package/dist/lib/server/tasks.mjs +0 -6
- package/dist/lib/server/tasks.mjs.map +1 -1
- package/dist/lib/server/test-controller-bridge.mjs +0 -6
- package/dist/lib/server/test-controller-bridge.mjs.map +1 -1
- package/dist/lib/server/test-controller.mjs +0 -6
- package/dist/lib/server/test-controller.mjs.map +1 -1
- package/dist/lib/server/upstream-helpers.mjs +0 -6
- package/dist/lib/server/upstream-helpers.mjs.map +1 -1
- package/dist/lib/server/webhook-emitter.mjs +0 -6
- package/dist/lib/server/webhook-emitter.mjs.map +1 -1
- package/dist/lib/server/wire-safe.mjs +0 -6
- package/dist/lib/server/wire-safe.mjs.map +1 -1
- package/dist/lib/server/wire-spec-fields.generated.mjs +0 -6
- package/dist/lib/server/wire-spec-fields.generated.mjs.map +1 -1
- package/dist/lib/server/wrap-envelope.mjs +0 -6
- package/dist/lib/server/wrap-envelope.mjs.map +1 -1
- package/dist/lib/signing/agent-context.mjs +0 -6
- package/dist/lib/signing/agent-context.mjs.map +1 -1
- package/dist/lib/signing/agent-fetch.mjs +0 -6
- package/dist/lib/signing/agent-fetch.mjs.map +1 -1
- package/dist/lib/signing/agent-resolver/canonicalize.mjs +0 -6
- package/dist/lib/signing/agent-resolver/canonicalize.mjs.map +1 -1
- package/dist/lib/signing/agent-resolver/capabilities-types.mjs +0 -6
- package/dist/lib/signing/agent-resolver/capabilities-types.mjs.map +1 -1
- package/dist/lib/signing/agent-resolver/consistency.mjs +0 -6
- package/dist/lib/signing/agent-resolver/consistency.mjs.map +1 -1
- package/dist/lib/signing/agent-resolver/errors.mjs +0 -6
- package/dist/lib/signing/agent-resolver/errors.mjs.map +1 -1
- package/dist/lib/signing/agent-resolver/etld.mjs +0 -6
- package/dist/lib/signing/agent-resolver/etld.mjs.map +1 -1
- package/dist/lib/signing/agent-resolver/fetch-helpers.mjs +0 -6
- package/dist/lib/signing/agent-resolver/fetch-helpers.mjs.map +1 -1
- package/dist/lib/signing/agent-resolver/index.mjs +0 -6
- package/dist/lib/signing/agent-resolver/index.mjs.map +1 -1
- package/dist/lib/signing/agent-resolver/jwks-set.mjs +0 -6
- package/dist/lib/signing/agent-resolver/jwks-set.mjs.map +1 -1
- package/dist/lib/signing/agent-resolver/resolve-agent.mjs +0 -6
- package/dist/lib/signing/agent-resolver/resolve-agent.mjs.map +1 -1
- package/dist/lib/signing/agent-resolver/select-agent.mjs +0 -6
- package/dist/lib/signing/agent-resolver/select-agent.mjs.map +1 -1
- package/dist/lib/signing/agent-resolver/strict-json.mjs +0 -6
- package/dist/lib/signing/agent-resolver/strict-json.mjs.map +1 -1
- package/dist/lib/signing/brand-jwks.mjs +0 -6
- package/dist/lib/signing/brand-jwks.mjs.map +1 -1
- package/dist/lib/signing/canonicalize.mjs +0 -6
- package/dist/lib/signing/canonicalize.mjs.map +1 -1
- package/dist/lib/signing/capability-cache.mjs +0 -6
- package/dist/lib/signing/capability-cache.mjs.map +1 -1
- package/dist/lib/signing/capability-priming.mjs +0 -6
- package/dist/lib/signing/capability-priming.mjs.map +1 -1
- package/dist/lib/signing/client.mjs +0 -6
- package/dist/lib/signing/client.mjs.map +1 -1
- package/dist/lib/signing/content-digest.mjs +0 -6
- package/dist/lib/signing/content-digest.mjs.map +1 -1
- package/dist/lib/signing/crypto.mjs +0 -6
- package/dist/lib/signing/crypto.mjs.map +1 -1
- package/dist/lib/signing/ecdsa-encoding.mjs +0 -6
- package/dist/lib/signing/ecdsa-encoding.mjs.map +1 -1
- package/dist/lib/signing/errors.mjs +0 -6
- package/dist/lib/signing/errors.mjs.map +1 -1
- package/dist/lib/signing/fetch-async.mjs +0 -6
- package/dist/lib/signing/fetch-async.mjs.map +1 -1
- package/dist/lib/signing/fetch.mjs +0 -6
- package/dist/lib/signing/fetch.mjs.map +1 -1
- package/dist/lib/signing/index.mjs +0 -6
- package/dist/lib/signing/index.mjs.map +1 -1
- package/dist/lib/signing/jwks-helpers.mjs +0 -6
- package/dist/lib/signing/jwks-helpers.mjs.map +1 -1
- package/dist/lib/signing/jwks-https.mjs +0 -6
- package/dist/lib/signing/jwks-https.mjs.map +1 -1
- package/dist/lib/signing/jwks.mjs +0 -6
- package/dist/lib/signing/jwks.mjs.map +1 -1
- package/dist/lib/signing/middleware.mjs +0 -6
- package/dist/lib/signing/middleware.mjs.map +1 -1
- package/dist/lib/signing/parser.mjs +0 -6
- package/dist/lib/signing/parser.mjs.map +1 -1
- package/dist/lib/signing/postgres-replay-store.mjs +0 -6
- package/dist/lib/signing/postgres-replay-store.mjs.map +1 -1
- package/dist/lib/signing/protocol-response.mjs +0 -6
- package/dist/lib/signing/protocol-response.mjs.map +1 -1
- package/dist/lib/signing/provider.mjs +0 -6
- package/dist/lib/signing/redis-replay-store.mjs +0 -6
- package/dist/lib/signing/redis-replay-store.mjs.map +1 -1
- package/dist/lib/signing/replay.mjs +0 -6
- package/dist/lib/signing/replay.mjs.map +1 -1
- package/dist/lib/signing/request-context.mjs +0 -6
- package/dist/lib/signing/request-context.mjs.map +1 -1
- package/dist/lib/signing/revocation-https.mjs +0 -6
- package/dist/lib/signing/revocation-https.mjs.map +1 -1
- package/dist/lib/signing/revocation.mjs +0 -6
- package/dist/lib/signing/revocation.mjs.map +1 -1
- package/dist/lib/signing/server.mjs +0 -6
- package/dist/lib/signing/server.mjs.map +1 -1
- package/dist/lib/signing/signer-async.mjs +0 -6
- package/dist/lib/signing/signer-async.mjs.map +1 -1
- package/dist/lib/signing/signer.mjs +0 -6
- package/dist/lib/signing/signer.mjs.map +1 -1
- package/dist/lib/signing/testing.mjs +0 -6
- package/dist/lib/signing/testing.mjs.map +1 -1
- package/dist/lib/signing/types.mjs +0 -6
- package/dist/lib/signing/types.mjs.map +1 -1
- package/dist/lib/signing/verifier.mjs +0 -6
- package/dist/lib/signing/verifier.mjs.map +1 -1
- package/dist/lib/signing/webhook-auth-detection.mjs +0 -6
- package/dist/lib/signing/webhook-auth-detection.mjs.map +1 -1
- package/dist/lib/signing/webhook-verifier.mjs +0 -6
- package/dist/lib/signing/webhook-verifier.mjs.map +1 -1
- package/dist/lib/storage/MemoryStorage.mjs +0 -6
- package/dist/lib/storage/MemoryStorage.mjs.map +1 -1
- package/dist/lib/storage/interfaces.mjs +0 -6
- package/dist/lib/substitution/encoder/SubstitutionEncoder.mjs +0 -6
- package/dist/lib/substitution/encoder/SubstitutionEncoder.mjs.map +1 -1
- package/dist/lib/substitution/encoder/index.mjs +0 -6
- package/dist/lib/substitution/encoder/index.mjs.map +1 -1
- package/dist/lib/substitution/index.mjs +0 -6
- package/dist/lib/substitution/index.mjs.map +1 -1
- package/dist/lib/substitution/observer/SubstitutionObserver.mjs +0 -6
- package/dist/lib/substitution/observer/SubstitutionObserver.mjs.map +1 -1
- package/dist/lib/substitution/observer/alignment.mjs +0 -6
- package/dist/lib/substitution/observer/alignment.mjs.map +1 -1
- package/dist/lib/substitution/observer/assertions.mjs +0 -6
- package/dist/lib/substitution/observer/assertions.mjs.map +1 -1
- package/dist/lib/substitution/observer/html-parser.mjs +0 -6
- package/dist/lib/substitution/observer/html-parser.mjs.map +1 -1
- package/dist/lib/substitution/observer/index.mjs +0 -6
- package/dist/lib/substitution/observer/index.mjs.map +1 -1
- package/dist/lib/substitution/observer/ssrf.mjs +0 -6
- package/dist/lib/substitution/observer/ssrf.mjs.map +1 -1
- package/dist/lib/substitution/rfc3986.mjs +0 -6
- package/dist/lib/substitution/rfc3986.mjs.map +1 -1
- package/dist/lib/substitution/translate.mjs +0 -6
- package/dist/lib/substitution/translate.mjs.map +1 -1
- package/dist/lib/substitution/types.mjs +0 -6
- package/dist/lib/substitution/vectors.mjs +0 -6
- package/dist/lib/substitution/vectors.mjs.map +1 -1
- package/dist/lib/testing/agent-tester.mjs +0 -6
- package/dist/lib/testing/agent-tester.mjs.map +1 -1
- package/dist/lib/testing/client.mjs +0 -6
- package/dist/lib/testing/client.mjs.map +1 -1
- package/dist/lib/testing/compliance/briefs.mjs +0 -6
- package/dist/lib/testing/compliance/briefs.mjs.map +1 -1
- package/dist/lib/testing/compliance/comply.mjs +0 -6
- package/dist/lib/testing/compliance/comply.mjs.map +1 -1
- package/dist/lib/testing/compliance/index.mjs +0 -6
- package/dist/lib/testing/compliance/index.mjs.map +1 -1
- package/dist/lib/testing/compliance/spec-conformance.mjs +0 -6
- package/dist/lib/testing/compliance/spec-conformance.mjs.map +1 -1
- package/dist/lib/testing/compliance/storyboard-tracks.mjs +0 -6
- package/dist/lib/testing/compliance/storyboard-tracks.mjs.map +1 -1
- package/dist/lib/testing/compliance/summary.mjs +0 -6
- package/dist/lib/testing/compliance/summary.mjs.map +1 -1
- package/dist/lib/testing/compliance/types.mjs +0 -6
- package/dist/lib/testing/comply-controller.mjs +0 -6
- package/dist/lib/testing/comply-controller.mjs.map +1 -1
- package/dist/lib/testing/controller-assertions.mjs +0 -6
- package/dist/lib/testing/controller-assertions.mjs.map +1 -1
- package/dist/lib/testing/formatter.mjs +0 -6
- package/dist/lib/testing/formatter.mjs.map +1 -1
- package/dist/lib/testing/index.mjs +0 -6
- package/dist/lib/testing/index.mjs.map +1 -1
- package/dist/lib/testing/local-agent-runner.mjs +0 -6
- package/dist/lib/testing/local-agent-runner.mjs.map +1 -1
- package/dist/lib/testing/orchestrator.mjs +0 -6
- package/dist/lib/testing/orchestrator.mjs.map +1 -1
- package/dist/lib/testing/personas/index.mjs +0 -6
- package/dist/lib/testing/personas/index.mjs.map +1 -1
- package/dist/lib/testing/scenarios/brand-rights.mjs +0 -6
- package/dist/lib/testing/scenarios/brand-rights.mjs.map +1 -1
- package/dist/lib/testing/scenarios/capabilities.mjs +0 -6
- package/dist/lib/testing/scenarios/capabilities.mjs.map +1 -1
- package/dist/lib/testing/scenarios/creative.mjs +0 -6
- package/dist/lib/testing/scenarios/creative.mjs.map +1 -1
- package/dist/lib/testing/scenarios/deterministic.mjs +0 -6
- package/dist/lib/testing/scenarios/deterministic.mjs.map +1 -1
- package/dist/lib/testing/scenarios/discovery.mjs +0 -6
- package/dist/lib/testing/scenarios/discovery.mjs.map +1 -1
- package/dist/lib/testing/scenarios/edge-cases.mjs +0 -6
- package/dist/lib/testing/scenarios/edge-cases.mjs.map +1 -1
- package/dist/lib/testing/scenarios/error-compliance.mjs +0 -6
- package/dist/lib/testing/scenarios/error-compliance.mjs.map +1 -1
- package/dist/lib/testing/scenarios/governance.mjs +0 -6
- package/dist/lib/testing/scenarios/governance.mjs.map +1 -1
- package/dist/lib/testing/scenarios/health.mjs +0 -6
- package/dist/lib/testing/scenarios/health.mjs.map +1 -1
- package/dist/lib/testing/scenarios/index.mjs +0 -6
- package/dist/lib/testing/scenarios/index.mjs.map +1 -1
- package/dist/lib/testing/scenarios/media-buy.mjs +0 -6
- package/dist/lib/testing/scenarios/media-buy.mjs.map +1 -1
- package/dist/lib/testing/scenarios/schema-compliance.mjs +0 -6
- package/dist/lib/testing/scenarios/schema-compliance.mjs.map +1 -1
- package/dist/lib/testing/scenarios/signals.mjs +0 -6
- package/dist/lib/testing/scenarios/signals.mjs.map +1 -1
- package/dist/lib/testing/scenarios/sponsored-intelligence.mjs +0 -6
- package/dist/lib/testing/scenarios/sponsored-intelligence.mjs.map +1 -1
- package/dist/lib/testing/scenarios/trusted-match.mjs +0 -6
- package/dist/lib/testing/scenarios/trusted-match.mjs.map +1 -1
- package/dist/lib/testing/seed-merge.mjs +0 -6
- package/dist/lib/testing/seed-merge.mjs.map +1 -1
- package/dist/lib/testing/storyboard/agent-routing.mjs +0 -6
- package/dist/lib/testing/storyboard/agent-routing.mjs.map +1 -1
- package/dist/lib/testing/storyboard/assertions.mjs +0 -6
- package/dist/lib/testing/storyboard/assertions.mjs.map +1 -1
- package/dist/lib/testing/storyboard/canonical-format-satisfaction.mjs +0 -6
- package/dist/lib/testing/storyboard/canonical-format-satisfaction.mjs.map +1 -1
- package/dist/lib/testing/storyboard/compliance.mjs +5 -6
- package/dist/lib/testing/storyboard/compliance.mjs.map +1 -1
- package/dist/lib/testing/storyboard/context.mjs +0 -6
- package/dist/lib/testing/storyboard/context.mjs.map +1 -1
- package/dist/lib/testing/storyboard/default-invariants.mjs +0 -6
- package/dist/lib/testing/storyboard/default-invariants.mjs.map +1 -1
- package/dist/lib/testing/storyboard/index.mjs +0 -6
- package/dist/lib/testing/storyboard/index.mjs.map +1 -1
- package/dist/lib/testing/storyboard/junit.mjs +0 -6
- package/dist/lib/testing/storyboard/junit.mjs.map +1 -1
- package/dist/lib/testing/storyboard/loader.mjs +0 -6
- package/dist/lib/testing/storyboard/loader.mjs.map +1 -1
- package/dist/lib/testing/storyboard/parallel-dispatch.mjs +0 -6
- package/dist/lib/testing/storyboard/parallel-dispatch.mjs.map +1 -1
- package/dist/lib/testing/storyboard/path.mjs +0 -6
- package/dist/lib/testing/storyboard/path.mjs.map +1 -1
- package/dist/lib/testing/storyboard/probes.mjs +0 -6
- package/dist/lib/testing/storyboard/probes.mjs.map +1 -1
- package/dist/lib/testing/storyboard/rate-limit-trip.mjs +0 -6
- package/dist/lib/testing/storyboard/rate-limit-trip.mjs.map +1 -1
- package/dist/lib/testing/storyboard/rejection-hints.mjs +0 -6
- package/dist/lib/testing/storyboard/rejection-hints.mjs.map +1 -1
- package/dist/lib/testing/storyboard/request-builder.mjs +0 -6
- package/dist/lib/testing/storyboard/request-builder.mjs.map +1 -1
- package/dist/lib/testing/storyboard/request-signing/builder.mjs +0 -6
- package/dist/lib/testing/storyboard/request-signing/builder.mjs.map +1 -1
- package/dist/lib/testing/storyboard/request-signing/grader.mjs +0 -6
- package/dist/lib/testing/storyboard/request-signing/grader.mjs.map +1 -1
- package/dist/lib/testing/storyboard/request-signing/index.mjs +0 -6
- package/dist/lib/testing/storyboard/request-signing/index.mjs.map +1 -1
- package/dist/lib/testing/storyboard/request-signing/probe-dispatch.mjs +0 -6
- package/dist/lib/testing/storyboard/request-signing/probe-dispatch.mjs.map +1 -1
- package/dist/lib/testing/storyboard/request-signing/probe.mjs +0 -6
- package/dist/lib/testing/storyboard/request-signing/probe.mjs.map +1 -1
- package/dist/lib/testing/storyboard/request-signing/synthesize.mjs +0 -6
- package/dist/lib/testing/storyboard/request-signing/synthesize.mjs.map +1 -1
- package/dist/lib/testing/storyboard/request-signing/test-kit.mjs +0 -6
- package/dist/lib/testing/storyboard/request-signing/test-kit.mjs.map +1 -1
- package/dist/lib/testing/storyboard/request-signing/types.mjs +0 -6
- package/dist/lib/testing/storyboard/request-signing/types.mjs.map +1 -1
- package/dist/lib/testing/storyboard/request-signing/vector-loader.mjs +0 -6
- package/dist/lib/testing/storyboard/request-signing/vector-loader.mjs.map +1 -1
- package/dist/lib/testing/storyboard/runner.mjs +0 -6
- package/dist/lib/testing/storyboard/runner.mjs.map +1 -1
- package/dist/lib/testing/storyboard/sandbox-entities.mjs +0 -6
- package/dist/lib/testing/storyboard/sandbox-entities.mjs.map +1 -1
- package/dist/lib/testing/storyboard/seeding.mjs +0 -6
- package/dist/lib/testing/storyboard/seeding.mjs.map +1 -1
- package/dist/lib/testing/storyboard/shape-drift-hints.mjs +0 -6
- package/dist/lib/testing/storyboard/shape-drift-hints.mjs.map +1 -1
- package/dist/lib/testing/storyboard/signer-grader/grader.mjs +0 -6
- package/dist/lib/testing/storyboard/signer-grader/grader.mjs.map +1 -1
- package/dist/lib/testing/storyboard/signer-grader/index.mjs +0 -6
- package/dist/lib/testing/storyboard/signer-grader/index.mjs.map +1 -1
- package/dist/lib/testing/storyboard/signer-grader/types.mjs +0 -6
- package/dist/lib/testing/storyboard/strict-validation-hints.mjs +0 -6
- package/dist/lib/testing/storyboard/strict-validation-hints.mjs.map +1 -1
- package/dist/lib/testing/storyboard/task-map.mjs +0 -6
- package/dist/lib/testing/storyboard/task-map.mjs.map +1 -1
- package/dist/lib/testing/storyboard/test-kit.mjs +0 -6
- package/dist/lib/testing/storyboard/test-kit.mjs.map +1 -1
- package/dist/lib/testing/storyboard/types.mjs +0 -6
- package/dist/lib/testing/storyboard/types.mjs.map +1 -1
- package/dist/lib/testing/storyboard/validations.mjs +0 -6
- package/dist/lib/testing/storyboard/validations.mjs.map +1 -1
- package/dist/lib/testing/storyboard/webhook-assertions.mjs +0 -6
- package/dist/lib/testing/storyboard/webhook-assertions.mjs.map +1 -1
- package/dist/lib/testing/storyboard/webhook-receiver.mjs +0 -6
- package/dist/lib/testing/storyboard/webhook-receiver.mjs.map +1 -1
- package/dist/lib/testing/stubs/governance-agent-stub.mjs +0 -6
- package/dist/lib/testing/stubs/governance-agent-stub.mjs.map +1 -1
- package/dist/lib/testing/stubs/index.mjs +0 -6
- package/dist/lib/testing/stubs/index.mjs.map +1 -1
- package/dist/lib/testing/test-controller.mjs +0 -6
- package/dist/lib/testing/test-controller.mjs.map +1 -1
- package/dist/lib/testing/test-helpers.mjs +0 -6
- package/dist/lib/testing/test-helpers.mjs.map +1 -1
- package/dist/lib/testing/types.mjs +0 -6
- package/dist/lib/types/adcp.mjs +0 -6
- package/dist/lib/types/adcp.mjs.map +1 -1
- package/dist/lib/types/asset-instances.mjs +0 -6
- package/dist/lib/types/compat.mjs +0 -6
- package/dist/lib/types/compat.mjs.map +1 -1
- package/dist/lib/types/core.generated.mjs +0 -6
- package/dist/lib/types/enums.generated.mjs +0 -6
- package/dist/lib/types/enums.generated.mjs.map +1 -1
- package/dist/lib/types/error-codes.mjs +0 -6
- package/dist/lib/types/error-codes.mjs.map +1 -1
- package/dist/lib/types/error-details.aliases.mjs +0 -6
- package/dist/lib/types/error-details.aliases.mjs.map +1 -1
- package/dist/lib/types/format-asset-slots.mjs +0 -6
- package/dist/lib/types/forward-compat-error-codes.mjs +0 -6
- package/dist/lib/types/forward-compat-error-codes.mjs.map +1 -1
- package/dist/lib/types/index.mjs +0 -6
- package/dist/lib/types/index.mjs.map +1 -1
- package/dist/lib/types/inline-enums.aliases.mjs +0 -6
- package/dist/lib/types/inline-enums.aliases.mjs.map +1 -1
- package/dist/lib/types/inline-enums.generated.mjs +0 -6
- package/dist/lib/types/inline-enums.generated.mjs.map +1 -1
- package/dist/lib/types/manifest.generated.mjs +0 -6
- package/dist/lib/types/manifest.generated.mjs.map +1 -1
- package/dist/lib/types/schemas.generated.mjs +0 -6
- package/dist/lib/types/schemas.generated.mjs.map +1 -1
- package/dist/lib/types/server-payload-aliases.mjs +0 -6
- package/dist/lib/types/server-payload.mjs +0 -6
- package/dist/lib/types/sync-rows.mjs +0 -6
- package/dist/lib/types/tools.generated.mjs +0 -6
- package/dist/lib/types/v2-5/index.mjs +0 -6
- package/dist/lib/types/v2-5/index.mjs.map +1 -1
- package/dist/lib/types/v2-5/tools.generated.mjs +0 -6
- package/dist/lib/types/v3-1-beta/index.mjs +0 -6
- package/dist/lib/types/v3-1-beta/index.mjs.map +1 -1
- package/dist/lib/types/v3-1-beta/tools.generated.mjs +0 -6
- package/dist/lib/types/wellknown-schemas.generated.mjs +0 -6
- package/dist/lib/types/wellknown-schemas.generated.mjs.map +1 -1
- package/dist/lib/upstream-recorder/constants.mjs +0 -6
- package/dist/lib/upstream-recorder/constants.mjs.map +1 -1
- package/dist/lib/upstream-recorder/index.mjs +0 -6
- package/dist/lib/upstream-recorder/index.mjs.map +1 -1
- package/dist/lib/upstream-recorder/recorder.mjs +0 -6
- package/dist/lib/upstream-recorder/recorder.mjs.map +1 -1
- package/dist/lib/upstream-recorder/types.mjs +0 -6
- package/dist/lib/upstream-recorder/types.mjs.map +1 -1
- package/dist/lib/utils/a2a-artifacts.mjs +0 -6
- package/dist/lib/utils/a2a-artifacts.mjs.map +1 -1
- package/dist/lib/utils/a2a-discovery.mjs +0 -6
- package/dist/lib/utils/a2a-discovery.mjs.map +1 -1
- package/dist/lib/utils/activation-key-builders.mjs +0 -6
- package/dist/lib/utils/activation-key-builders.mjs.map +1 -1
- package/dist/lib/utils/adcp-version-config.mjs +0 -6
- package/dist/lib/utils/adcp-version-config.mjs.map +1 -1
- package/dist/lib/utils/asset-builders.mjs +0 -6
- package/dist/lib/utils/asset-builders.mjs.map +1 -1
- package/dist/lib/utils/build-creative-return-builders.mjs +0 -6
- package/dist/lib/utils/build-creative-return-builders.mjs.map +1 -1
- package/dist/lib/utils/buyer-retry-policy.mjs +0 -6
- package/dist/lib/utils/buyer-retry-policy.mjs.map +1 -1
- package/dist/lib/utils/capabilities.mjs +0 -6
- package/dist/lib/utils/capabilities.mjs.map +1 -1
- package/dist/lib/utils/capability-rollups.mjs +0 -6
- package/dist/lib/utils/capability-rollups.mjs.map +1 -1
- package/dist/lib/utils/creative-adapter.mjs +0 -6
- package/dist/lib/utils/creative-adapter.mjs.map +1 -1
- package/dist/lib/utils/creative-delivery.mjs +0 -6
- package/dist/lib/utils/creative-delivery.mjs.map +1 -1
- package/dist/lib/utils/deprecation.mjs +0 -6
- package/dist/lib/utils/deprecation.mjs.map +1 -1
- package/dist/lib/utils/envelope-status-compat.mjs +0 -6
- package/dist/lib/utils/envelope-status-compat.mjs.map +1 -1
- package/dist/lib/utils/error-extraction.mjs +0 -6
- package/dist/lib/utils/error-extraction.mjs.map +1 -1
- package/dist/lib/utils/extract-result.mjs +0 -6
- package/dist/lib/utils/extract-result.mjs.map +1 -1
- package/dist/lib/utils/format-asset-slot-builders.mjs +0 -6
- package/dist/lib/utils/format-asset-slot-builders.mjs.map +1 -1
- package/dist/lib/utils/format-assets.mjs +0 -6
- package/dist/lib/utils/format-assets.mjs.map +1 -1
- package/dist/lib/utils/format-render-builders.mjs +0 -6
- package/dist/lib/utils/format-render-builders.mjs.map +1 -1
- package/dist/lib/utils/format-renders.mjs +0 -6
- package/dist/lib/utils/format-renders.mjs.map +1 -1
- package/dist/lib/utils/get-products-cache-scope.mjs +0 -6
- package/dist/lib/utils/get-products-cache-scope.mjs.map +1 -1
- package/dist/lib/utils/glob.mjs +0 -6
- package/dist/lib/utils/glob.mjs.map +1 -1
- package/dist/lib/utils/global-async-local-storage.mjs +0 -6
- package/dist/lib/utils/global-async-local-storage.mjs.map +1 -1
- package/dist/lib/utils/idempotency.mjs +0 -6
- package/dist/lib/utils/idempotency.mjs.map +1 -1
- package/dist/lib/utils/index.mjs +0 -6
- package/dist/lib/utils/index.mjs.map +1 -1
- package/dist/lib/utils/jcs.mjs +0 -6
- package/dist/lib/utils/jcs.mjs.map +1 -1
- package/dist/lib/utils/json-depth.mjs +0 -6
- package/dist/lib/utils/json-depth.mjs.map +1 -1
- package/dist/lib/utils/logger.mjs +0 -6
- package/dist/lib/utils/logger.mjs.map +1 -1
- package/dist/lib/utils/media-buy-delivery-notification-builders.mjs +0 -6
- package/dist/lib/utils/media-buy-delivery-notification-builders.mjs.map +1 -1
- package/dist/lib/utils/media-buy-status.mjs +0 -6
- package/dist/lib/utils/media-buy-status.mjs.map +1 -1
- package/dist/lib/utils/pagination.mjs +0 -6
- package/dist/lib/utils/pagination.mjs.map +1 -1
- package/dist/lib/utils/preview-creative-builders.mjs +0 -6
- package/dist/lib/utils/preview-creative-builders.mjs.map +1 -1
- package/dist/lib/utils/preview-normalizer.mjs +0 -6
- package/dist/lib/utils/preview-normalizer.mjs.map +1 -1
- package/dist/lib/utils/preview-utils.mjs +0 -6
- package/dist/lib/utils/preview-utils.mjs.map +1 -1
- package/dist/lib/utils/pricing-adapter.mjs +0 -6
- package/dist/lib/utils/pricing-adapter.mjs.map +1 -1
- package/dist/lib/utils/probe-policy.mjs +0 -6
- package/dist/lib/utils/probe-policy.mjs.map +1 -1
- package/dist/lib/utils/protocol-detection.mjs +0 -6
- package/dist/lib/utils/protocol-detection.mjs.map +1 -1
- package/dist/lib/utils/redact-secrets.mjs +0 -6
- package/dist/lib/utils/redact-secrets.mjs.map +1 -1
- package/dist/lib/utils/redis-default-prefix-warn.mjs +0 -6
- package/dist/lib/utils/redis-default-prefix-warn.mjs.map +1 -1
- package/dist/lib/utils/render-builders.mjs +0 -6
- package/dist/lib/utils/render-builders.mjs.map +1 -1
- package/dist/lib/utils/request-normalizer.mjs +0 -6
- package/dist/lib/utils/request-normalizer.mjs.map +1 -1
- package/dist/lib/utils/response-schemas.mjs +0 -6
- package/dist/lib/utils/response-schemas.mjs.map +1 -1
- package/dist/lib/utils/response-unwrapper.mjs +0 -6
- package/dist/lib/utils/response-unwrapper.mjs.map +1 -1
- package/dist/lib/utils/retry.mjs +0 -6
- package/dist/lib/utils/retry.mjs.map +1 -1
- package/dist/lib/utils/signal-discovery-helpers.mjs +0 -6
- package/dist/lib/utils/signal-discovery-helpers.mjs.map +1 -1
- package/dist/lib/utils/signal-id-builders.mjs +0 -6
- package/dist/lib/utils/signal-id-builders.mjs.map +1 -1
- package/dist/lib/utils/sync-creatives-adapter.mjs +0 -6
- package/dist/lib/utils/sync-creatives-adapter.mjs.map +1 -1
- package/dist/lib/utils/task-state.mjs +0 -6
- package/dist/lib/utils/task-state.mjs.map +1 -1
- package/dist/lib/utils/tool-request-schemas.mjs +0 -6
- package/dist/lib/utils/tool-request-schemas.mjs.map +1 -1
- package/dist/lib/utils/typeGuards.mjs +0 -6
- package/dist/lib/utils/typeGuards.mjs.map +1 -1
- package/dist/lib/utils/union-errors.mjs +0 -6
- package/dist/lib/utils/union-errors.mjs.map +1 -1
- package/dist/lib/utils/validate-user-agent.mjs +0 -6
- package/dist/lib/utils/validate-user-agent.mjs.map +1 -1
- package/dist/lib/v2/format-schema/fetch.mjs +0 -6
- package/dist/lib/v2/format-schema/fetch.mjs.map +1 -1
- package/dist/lib/v2/format-schema/index.mjs +0 -6
- package/dist/lib/v2/format-schema/index.mjs.map +1 -1
- package/dist/lib/v2/format-schema/regex-safety.mjs +0 -6
- package/dist/lib/v2/format-schema/regex-safety.mjs.map +1 -1
- package/dist/lib/v2/format-schema/resolver.mjs +7 -8
- package/dist/lib/v2/format-schema/resolver.mjs.map +1 -1
- package/dist/lib/v2/format-schema/sandbox-refs.mjs +0 -6
- package/dist/lib/v2/format-schema/sandbox-refs.mjs.map +1 -1
- package/dist/lib/v2/projection/augment-response.mjs +0 -6
- package/dist/lib/v2/projection/augment-response.mjs.map +1 -1
- package/dist/lib/v2/projection/builders.mjs +0 -6
- package/dist/lib/v2/projection/builders.mjs.map +1 -1
- package/dist/lib/v2/projection/cache-versions.mjs +0 -6
- package/dist/lib/v2/projection/cache-versions.mjs.map +1 -1
- package/dist/lib/v2/projection/canonical-properties.mjs +5 -6
- package/dist/lib/v2/projection/canonical-properties.mjs.map +1 -1
- package/dist/lib/v2/projection/catalog.mjs +5 -6
- package/dist/lib/v2/projection/catalog.mjs.map +1 -1
- package/dist/lib/v2/projection/constants.mjs +0 -6
- package/dist/lib/v2/projection/constants.mjs.map +1 -1
- package/dist/lib/v2/projection/index.mjs +0 -6
- package/dist/lib/v2/projection/index.mjs.map +1 -1
- package/dist/lib/v2/projection/registry.mjs +5 -6
- package/dist/lib/v2/projection/registry.mjs.map +1 -1
- package/dist/lib/v2/projection/types.mjs +0 -6
- package/dist/lib/v2/projection/v1-to-v2.mjs +0 -6
- package/dist/lib/v2/projection/v1-to-v2.mjs.map +1 -1
- package/dist/lib/v2/projection/v2-to-v1.mjs +0 -6
- package/dist/lib/v2/projection/v2-to-v1.mjs.map +1 -1
- package/dist/lib/v2/projection/write-side.mjs +0 -6
- package/dist/lib/v2/projection/write-side.mjs.map +1 -1
- package/dist/lib/v2/publisher-catalog/formats.mjs +0 -6
- package/dist/lib/v2/publisher-catalog/formats.mjs.map +1 -1
- package/dist/lib/v2/publisher-catalog/index.mjs +0 -6
- package/dist/lib/v2/publisher-catalog/index.mjs.map +1 -1
- package/dist/lib/validation/client-hooks.mjs +0 -6
- package/dist/lib/validation/client-hooks.mjs.map +1 -1
- package/dist/lib/validation/hints.mjs +0 -6
- package/dist/lib/validation/hints.mjs.map +1 -1
- package/dist/lib/validation/index.mjs +0 -6
- package/dist/lib/validation/index.mjs.map +1 -1
- package/dist/lib/validation/schema-errors.mjs +0 -6
- package/dist/lib/validation/schema-errors.mjs.map +1 -1
- package/dist/lib/validation/schema-loader.mjs +5 -6
- package/dist/lib/validation/schema-loader.mjs.map +1 -1
- package/dist/lib/validation/schema-validator.mjs +0 -6
- package/dist/lib/validation/schema-validator.mjs.map +1 -1
- package/dist/lib/validation/sync-creatives.mjs +0 -6
- package/dist/lib/validation/sync-creatives.mjs.map +1 -1
- package/dist/lib/version.d.mts +3 -3
- package/dist/lib/version.d.ts +3 -3
- package/dist/lib/version.js +3 -3
- package/dist/lib/version.js.map +1 -1
- package/dist/lib/version.mjs +3 -9
- package/dist/lib/version.mjs.map +1 -1
- package/dist/lib/webhooks/index.mjs +0 -6
- package/dist/lib/webhooks/index.mjs.map +1 -1
- package/dist/lib/wholesale-feed-sync/index.mjs +0 -6
- package/dist/lib/wholesale-feed-sync/index.mjs.map +1 -1
- package/dist/lib/wholesale-feed-sync/sync.mjs +0 -6
- package/dist/lib/wholesale-feed-sync/sync.mjs.map +1 -1
- package/dist/lib/wholesale-feed-sync/types.mjs +0 -6
- package/dist/lib/wholesale-feed-sync/webhook-notification.mjs +0 -6
- package/dist/lib/wholesale-feed-sync/webhook-notification.mjs.map +1 -1
- package/package.json +2 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../src/lib/server/idempotency/backends/memory.ts"],"sourcesContent":["/**\n * In-process memory backend for the idempotency store.\n *\n * Useful for tests and single-process training agents. Not suitable for\n * production across multiple replicas — use `pgBackend` or a similar\n * shared store when horizontal scaling matters.\n *\n * Returns deep-cloned entries on read so middleware mutations (e.g.,\n * injecting `replayed: true` or echo-back `context`) don't leak back\n * into the cache and poison subsequent replays.\n */\n\nimport type { IdempotencyBackend, IdempotencyCacheEntry } from '../store';\n\nexport interface MemoryBackendOptions {\n /**\n * How often (in ms) to sweep expired entries from the map. Defaults to\n * 60_000 (60s). Set to 0 to disable — entries will still be rejected on\n * lookup, but memory won't be reclaimed until the process restarts.\n */\n sweepIntervalMs?: number;\n}\n\nexport function memoryBackend(options: MemoryBackendOptions = {}): IdempotencyBackend {\n const store = new Map<string, IdempotencyCacheEntry>();\n const sweepIntervalMs = options.sweepIntervalMs ?? 60_000;\n\n let sweeper: NodeJS.Timeout | undefined;\n if (sweepIntervalMs > 0) {\n sweeper = setInterval(() => {\n const nowSeconds = Math.floor(Date.now() / 1000);\n for (const [k, entry] of store) {\n if (entry.expiresAt < nowSeconds) store.delete(k);\n }\n }, sweepIntervalMs);\n // Don't hold the event loop open for this timer.\n if (typeof sweeper.unref === 'function') sweeper.unref();\n }\n\n return {\n async get(scopedKey: string): Promise<IdempotencyCacheEntry | null> {\n const entry = store.get(scopedKey);\n if (!entry) return null;\n // Clone on read: the middleware mutates the returned envelope to set\n // `replayed: true` and echo-back `context`. Sharing the reference\n // would bake the first caller's context into the cache and leak it\n // to every subsequent replay.\n return cloneEntry(entry);\n },\n async put(scopedKey: string, entry: IdempotencyCacheEntry): Promise<void> {\n // Clone on write so the caller can't mutate their local copy later\n // and retroactively change what's cached.\n store.set(scopedKey, cloneEntry(entry));\n },\n async putIfAbsent(scopedKey: string, entry: IdempotencyCacheEntry): Promise<boolean> {\n const existing = store.get(scopedKey);\n if (existing) {\n const nowSeconds = Math.floor(Date.now() / 1000);\n if (existing.expiresAt >= nowSeconds) return false;\n // Expired entry — replace it (lets a stale claim be reclaimed).\n }\n store.set(scopedKey, cloneEntry(entry));\n return true;\n },\n async delete(scopedKey: string): Promise<void> {\n store.delete(scopedKey);\n },\n async close(): Promise<void> {\n if (sweeper) clearInterval(sweeper);\n store.clear();\n },\n async clearAll(): Promise<void> {\n store.clear();\n },\n };\n}\n\nfunction cloneEntry(entry: IdempotencyCacheEntry): IdempotencyCacheEntry {\n return {\n payloadHash: entry.payloadHash,\n response: entry.response == null ? entry.response : structuredClone(entry.response),\n expiresAt: entry.expiresAt,\n };\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../../../../../src/lib/server/idempotency/backends/memory.ts"],"sourcesContent":["/**\n * In-process memory backend for the idempotency store.\n *\n * Useful for tests and single-process training agents. Not suitable for\n * production across multiple replicas — use `pgBackend` or a similar\n * shared store when horizontal scaling matters.\n *\n * Returns deep-cloned entries on read so middleware mutations (e.g.,\n * injecting `replayed: true` or echo-back `context`) don't leak back\n * into the cache and poison subsequent replays.\n */\n\nimport type { IdempotencyBackend, IdempotencyCacheEntry } from '../store';\n\nexport interface MemoryBackendOptions {\n /**\n * How often (in ms) to sweep expired entries from the map. Defaults to\n * 60_000 (60s). Set to 0 to disable — entries will still be rejected on\n * lookup, but memory won't be reclaimed until the process restarts.\n */\n sweepIntervalMs?: number;\n}\n\nexport function memoryBackend(options: MemoryBackendOptions = {}): IdempotencyBackend {\n const store = new Map<string, IdempotencyCacheEntry>();\n const sweepIntervalMs = options.sweepIntervalMs ?? 60_000;\n\n let sweeper: NodeJS.Timeout | undefined;\n if (sweepIntervalMs > 0) {\n sweeper = setInterval(() => {\n const nowSeconds = Math.floor(Date.now() / 1000);\n for (const [k, entry] of store) {\n if (entry.expiresAt < nowSeconds) store.delete(k);\n }\n }, sweepIntervalMs);\n // Don't hold the event loop open for this timer.\n if (typeof sweeper.unref === 'function') sweeper.unref();\n }\n\n return {\n async get(scopedKey: string): Promise<IdempotencyCacheEntry | null> {\n const entry = store.get(scopedKey);\n if (!entry) return null;\n // Clone on read: the middleware mutates the returned envelope to set\n // `replayed: true` and echo-back `context`. Sharing the reference\n // would bake the first caller's context into the cache and leak it\n // to every subsequent replay.\n return cloneEntry(entry);\n },\n async put(scopedKey: string, entry: IdempotencyCacheEntry): Promise<void> {\n // Clone on write so the caller can't mutate their local copy later\n // and retroactively change what's cached.\n store.set(scopedKey, cloneEntry(entry));\n },\n async putIfAbsent(scopedKey: string, entry: IdempotencyCacheEntry): Promise<boolean> {\n const existing = store.get(scopedKey);\n if (existing) {\n const nowSeconds = Math.floor(Date.now() / 1000);\n if (existing.expiresAt >= nowSeconds) return false;\n // Expired entry — replace it (lets a stale claim be reclaimed).\n }\n store.set(scopedKey, cloneEntry(entry));\n return true;\n },\n async delete(scopedKey: string): Promise<void> {\n store.delete(scopedKey);\n },\n async close(): Promise<void> {\n if (sweeper) clearInterval(sweeper);\n store.clear();\n },\n async clearAll(): Promise<void> {\n store.clear();\n },\n };\n}\n\nfunction cloneEntry(entry: IdempotencyCacheEntry): IdempotencyCacheEntry {\n return {\n payloadHash: entry.payloadHash,\n response: entry.response == null ? entry.response : structuredClone(entry.response),\n expiresAt: entry.expiresAt,\n };\n}\n"],"mappings":"AAuBO,SAAS,cAAc,UAAgC,CAAC,GAAuB;AACpF,QAAM,QAAQ,oBAAI,IAAmC;AACrD,QAAM,kBAAkB,QAAQ,mBAAmB;AAEnD,MAAI;AACJ,MAAI,kBAAkB,GAAG;AACvB,cAAU,YAAY,MAAM;AAC1B,YAAM,aAAa,KAAK,MAAM,KAAK,IAAI,IAAI,GAAI;AAC/C,iBAAW,CAAC,GAAG,KAAK,KAAK,OAAO;AAC9B,YAAI,MAAM,YAAY,WAAY,OAAM,OAAO,CAAC;AAAA,MAClD;AAAA,IACF,GAAG,eAAe;AAElB,QAAI,OAAO,QAAQ,UAAU,WAAY,SAAQ,MAAM;AAAA,EACzD;AAEA,SAAO;AAAA,IACL,MAAM,IAAI,WAA0D;AAClE,YAAM,QAAQ,MAAM,IAAI,SAAS;AACjC,UAAI,CAAC,MAAO,QAAO;AAKnB,aAAO,WAAW,KAAK;AAAA,IACzB;AAAA,IACA,MAAM,IAAI,WAAmB,OAA6C;AAGxE,YAAM,IAAI,WAAW,WAAW,KAAK,CAAC;AAAA,IACxC;AAAA,IACA,MAAM,YAAY,WAAmB,OAAgD;AACnF,YAAM,WAAW,MAAM,IAAI,SAAS;AACpC,UAAI,UAAU;AACZ,cAAM,aAAa,KAAK,MAAM,KAAK,IAAI,IAAI,GAAI;AAC/C,YAAI,SAAS,aAAa,WAAY,QAAO;AAAA,MAE/C;AACA,YAAM,IAAI,WAAW,WAAW,KAAK,CAAC;AACtC,aAAO;AAAA,IACT;AAAA,IACA,MAAM,OAAO,WAAkC;AAC7C,YAAM,OAAO,SAAS;AAAA,IACxB;AAAA,IACA,MAAM,QAAuB;AAC3B,UAAI,QAAS,eAAc,OAAO;AAClC,YAAM,MAAM;AAAA,IACd;AAAA,IACA,MAAM,WAA0B;AAC9B,YAAM,MAAM;AAAA,IACd;AAAA,EACF;AACF;AAEA,SAAS,WAAW,OAAqD;AACvE,SAAO;AAAA,IACL,aAAa,MAAM;AAAA,IACnB,UAAU,MAAM,YAAY,OAAO,MAAM,WAAW,gBAAgB,MAAM,QAAQ;AAAA,IAClF,WAAW,MAAM;AAAA,EACnB;AACF;","names":[]}
|
|
@@ -1,9 +1,3 @@
|
|
|
1
|
-
import { fileURLToPath as __adcpFileURLToPath } from 'node:url';
|
|
2
|
-
import { dirname as __adcpDirname } from 'node:path';
|
|
3
|
-
import { createRequire as __adcpCreateRequire } from 'node:module';
|
|
4
|
-
const __filename = __adcpFileURLToPath(import.meta.url);
|
|
5
|
-
const __dirname = __adcpDirname(__filename);
|
|
6
|
-
const require = __adcpCreateRequire(import.meta.url);
|
|
7
1
|
const DEFAULT_TABLE = "adcp_idempotency";
|
|
8
2
|
const VALID_IDENTIFIER = /^[a-z_][a-z0-9_]*$/;
|
|
9
3
|
function quoteIdent(name) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../src/lib/server/idempotency/backends/pg.ts"],"sourcesContent":["/**\n * Postgres backend for the idempotency store.\n *\n * Stores one row per `(principal, key, [extraScope])` with the canonical\n * payload hash, the cached response (JSONB), and an `expires_at`\n * timestamp. Lookups index on `scoped_key` (PRIMARY KEY).\n *\n * **Atomicity caveat.** The middleware calls `check()` → handler →\n * `save()`. The `save()` write runs AFTER the handler commits its own\n * business writes, in a separate transaction. A crash between \"handler\n * commits\" and \"save() commits\" can leak side effects without an\n * idempotency row, so a retry re-executes. To get strict\n * exactly-once behavior, either:\n *\n * - Run the handler's business writes and the idempotency save in the\n * same transaction (pass the transaction client as `PgQueryable` when\n * constructing the backend for that request), OR\n * - Accept that a crash window exists and rely on the handler's own\n * natural-key checks to dedup on retry.\n *\n * The middleware as-shipped does the latter. Callers who need the\n * former can construct a request-scoped `pgBackend(tx)` and pass it as\n * the idempotency store per-request.\n */\n\nimport type { IdempotencyBackend, IdempotencyCacheEntry } from '../store';\nimport type { PgQueryable } from '../../postgres-task-store';\n\nconst DEFAULT_TABLE = 'adcp_idempotency';\nconst VALID_IDENTIFIER = /^[a-z_][a-z0-9_]*$/;\n\nexport interface PgBackendOptions {\n /** Table name. Must be lowercase letters/digits/underscores. Defaults to `\"adcp_idempotency\"`. */\n tableName?: string;\n}\n\n/**\n * Validate a SQL identifier against the allowlist and return it quoted.\n * Centralizes the defense-in-depth check so every query uses a\n * consistently-quoted identifier — future edits to the allowlist only\n * have to happen here.\n */\nfunction quoteIdent(name: string): string {\n if (!VALID_IDENTIFIER.test(name)) {\n throw new Error(`Invalid SQL identifier \"${name}\": must match ${VALID_IDENTIFIER}`);\n }\n return `\"${name}\"`;\n}\n\n/**\n * Generate the DDL for the idempotency table.\n *\n * @example\n * ```typescript\n * import { getIdempotencyMigration } from '@adcp/sdk/server';\n * await pool.query(getIdempotencyMigration());\n * ```\n */\nexport function getIdempotencyMigration(options?: PgBackendOptions): string {\n const tableName = options?.tableName ?? DEFAULT_TABLE;\n const table = quoteIdent(tableName);\n const indexTable = tableName; // already validated by quoteIdent, safe to interpolate\n return `\nCREATE TABLE IF NOT EXISTS ${table} (\n scoped_key TEXT PRIMARY KEY,\n payload_hash TEXT NOT NULL,\n response JSONB NOT NULL,\n expires_at TIMESTAMPTZ NOT NULL,\n created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()\n);\n\nCREATE INDEX IF NOT EXISTS idx_${indexTable}_expires_at\n ON ${table}(expires_at);\n`.trim();\n}\n\n/**\n * Backward-compatible constant using the default table name.\n */\nexport const IDEMPOTENCY_MIGRATION = getIdempotencyMigration();\n\n/**\n * Create a Postgres-backed idempotency cache.\n *\n * Pass a connection pool (or any `PgQueryable`) and optionally a custom\n * table name. Run `getIdempotencyMigration()` once per deployment to\n * create the table.\n *\n * **Startup probe.** Call `store.probe()` (or `probeIdempotencyStore(store)`)\n * before your server starts accepting traffic to catch a bad `DATABASE_URL`\n * at boot rather than on the first mutating request. Wire it via:\n *\n * ```ts\n * serve(createAgent, {\n * readinessCheck: () => store.probe(),\n * });\n * ```\n *\n * **Idle-client errors.** `pg.Pool` re-emits network drop / PG restart\n * errors on the pool itself. Without a listener, Node's `EventEmitter`\n * default-throws and crashes the process. Add one in your bootstrap:\n *\n * ```ts\n * pool.on('error', (err) => console.error('pg pool error', err));\n * ```\n */\nexport function pgBackend(db: PgQueryable, options: PgBackendOptions = {}): IdempotencyBackend {\n // tableName is trusted SDK config (compile-time / startup), not user input —\n // quoteIdent validates the identifier shape and is safe to interpolate.\n const table = quoteIdent(options.tableName ?? DEFAULT_TABLE);\n\n return {\n async probe(): Promise<void> {\n try {\n await db.query(`SELECT 1 FROM ${table} LIMIT 0`);\n } catch (err) {\n const cause = err instanceof Error ? err.message : String(err);\n throw new Error(\n `idempotency backend probe failed: cannot reach the \"${options.tableName ?? DEFAULT_TABLE}\" table. ` +\n `The pool is unreachable or the table has not been migrated — the server would advertise ` +\n `IdempotencySupported but every mutating call would fail. ` +\n `Run getIdempotencyMigration() to create the table, or check DATABASE_URL. Cause: ${cause}`\n );\n }\n },\n\n async get(scopedKey: string): Promise<IdempotencyCacheEntry | null> {\n const result = await db.query(\n `SELECT payload_hash, response, EXTRACT(EPOCH FROM expires_at)::BIGINT AS expires_at FROM ${table} WHERE scoped_key = $1`,\n [scopedKey]\n );\n const row = result.rows[0];\n if (!row) return null;\n return {\n payloadHash: row.payload_hash as string,\n response: row.response as unknown,\n expiresAt: Number(row.expires_at),\n };\n },\n\n async put(scopedKey: string, entry: IdempotencyCacheEntry): Promise<void> {\n await db.query(\n `INSERT INTO ${table} (scoped_key, payload_hash, response, expires_at)\n VALUES ($1, $2, $3::jsonb, TO_TIMESTAMP($4))\n ON CONFLICT (scoped_key) DO UPDATE SET\n payload_hash = EXCLUDED.payload_hash,\n response = EXCLUDED.response,\n expires_at = EXCLUDED.expires_at`,\n [scopedKey, entry.payloadHash, JSON.stringify(entry.response), entry.expiresAt]\n );\n },\n\n async putIfAbsent(scopedKey: string, entry: IdempotencyCacheEntry): Promise<boolean> {\n // Insert only if absent OR the existing row is expired — this lets a\n // stale claim from a crashed handler be reclaimed on retry.\n const result = await db.query(\n `INSERT INTO ${table} (scoped_key, payload_hash, response, expires_at)\n VALUES ($1, $2, $3::jsonb, TO_TIMESTAMP($4))\n ON CONFLICT (scoped_key) DO UPDATE SET\n payload_hash = EXCLUDED.payload_hash,\n response = EXCLUDED.response,\n expires_at = EXCLUDED.expires_at\n WHERE ${table}.expires_at < NOW()\n RETURNING scoped_key`,\n [scopedKey, entry.payloadHash, JSON.stringify(entry.response), entry.expiresAt]\n );\n return (result.rowCount ?? 0) > 0;\n },\n\n async delete(scopedKey: string): Promise<void> {\n await db.query(`DELETE FROM ${table} WHERE scoped_key = $1`, [scopedKey]);\n },\n };\n}\n\n/**\n * Delete expired entries. Run periodically (e.g., every hour) to bound\n * table size. Returns the number of rows deleted.\n */\nexport async function cleanupExpiredIdempotency(db: PgQueryable, options: PgBackendOptions = {}): Promise<number> {\n const table = quoteIdent(options.tableName ?? DEFAULT_TABLE);\n const result = await db.query(`DELETE FROM ${table} WHERE expires_at < NOW()`);\n return result.rowCount ?? 0;\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../../../../../src/lib/server/idempotency/backends/pg.ts"],"sourcesContent":["/**\n * Postgres backend for the idempotency store.\n *\n * Stores one row per `(principal, key, [extraScope])` with the canonical\n * payload hash, the cached response (JSONB), and an `expires_at`\n * timestamp. Lookups index on `scoped_key` (PRIMARY KEY).\n *\n * **Atomicity caveat.** The middleware calls `check()` → handler →\n * `save()`. The `save()` write runs AFTER the handler commits its own\n * business writes, in a separate transaction. A crash between \"handler\n * commits\" and \"save() commits\" can leak side effects without an\n * idempotency row, so a retry re-executes. To get strict\n * exactly-once behavior, either:\n *\n * - Run the handler's business writes and the idempotency save in the\n * same transaction (pass the transaction client as `PgQueryable` when\n * constructing the backend for that request), OR\n * - Accept that a crash window exists and rely on the handler's own\n * natural-key checks to dedup on retry.\n *\n * The middleware as-shipped does the latter. Callers who need the\n * former can construct a request-scoped `pgBackend(tx)` and pass it as\n * the idempotency store per-request.\n */\n\nimport type { IdempotencyBackend, IdempotencyCacheEntry } from '../store';\nimport type { PgQueryable } from '../../postgres-task-store';\n\nconst DEFAULT_TABLE = 'adcp_idempotency';\nconst VALID_IDENTIFIER = /^[a-z_][a-z0-9_]*$/;\n\nexport interface PgBackendOptions {\n /** Table name. Must be lowercase letters/digits/underscores. Defaults to `\"adcp_idempotency\"`. */\n tableName?: string;\n}\n\n/**\n * Validate a SQL identifier against the allowlist and return it quoted.\n * Centralizes the defense-in-depth check so every query uses a\n * consistently-quoted identifier — future edits to the allowlist only\n * have to happen here.\n */\nfunction quoteIdent(name: string): string {\n if (!VALID_IDENTIFIER.test(name)) {\n throw new Error(`Invalid SQL identifier \"${name}\": must match ${VALID_IDENTIFIER}`);\n }\n return `\"${name}\"`;\n}\n\n/**\n * Generate the DDL for the idempotency table.\n *\n * @example\n * ```typescript\n * import { getIdempotencyMigration } from '@adcp/sdk/server';\n * await pool.query(getIdempotencyMigration());\n * ```\n */\nexport function getIdempotencyMigration(options?: PgBackendOptions): string {\n const tableName = options?.tableName ?? DEFAULT_TABLE;\n const table = quoteIdent(tableName);\n const indexTable = tableName; // already validated by quoteIdent, safe to interpolate\n return `\nCREATE TABLE IF NOT EXISTS ${table} (\n scoped_key TEXT PRIMARY KEY,\n payload_hash TEXT NOT NULL,\n response JSONB NOT NULL,\n expires_at TIMESTAMPTZ NOT NULL,\n created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()\n);\n\nCREATE INDEX IF NOT EXISTS idx_${indexTable}_expires_at\n ON ${table}(expires_at);\n`.trim();\n}\n\n/**\n * Backward-compatible constant using the default table name.\n */\nexport const IDEMPOTENCY_MIGRATION = getIdempotencyMigration();\n\n/**\n * Create a Postgres-backed idempotency cache.\n *\n * Pass a connection pool (or any `PgQueryable`) and optionally a custom\n * table name. Run `getIdempotencyMigration()` once per deployment to\n * create the table.\n *\n * **Startup probe.** Call `store.probe()` (or `probeIdempotencyStore(store)`)\n * before your server starts accepting traffic to catch a bad `DATABASE_URL`\n * at boot rather than on the first mutating request. Wire it via:\n *\n * ```ts\n * serve(createAgent, {\n * readinessCheck: () => store.probe(),\n * });\n * ```\n *\n * **Idle-client errors.** `pg.Pool` re-emits network drop / PG restart\n * errors on the pool itself. Without a listener, Node's `EventEmitter`\n * default-throws and crashes the process. Add one in your bootstrap:\n *\n * ```ts\n * pool.on('error', (err) => console.error('pg pool error', err));\n * ```\n */\nexport function pgBackend(db: PgQueryable, options: PgBackendOptions = {}): IdempotencyBackend {\n // tableName is trusted SDK config (compile-time / startup), not user input —\n // quoteIdent validates the identifier shape and is safe to interpolate.\n const table = quoteIdent(options.tableName ?? DEFAULT_TABLE);\n\n return {\n async probe(): Promise<void> {\n try {\n await db.query(`SELECT 1 FROM ${table} LIMIT 0`);\n } catch (err) {\n const cause = err instanceof Error ? err.message : String(err);\n throw new Error(\n `idempotency backend probe failed: cannot reach the \"${options.tableName ?? DEFAULT_TABLE}\" table. ` +\n `The pool is unreachable or the table has not been migrated — the server would advertise ` +\n `IdempotencySupported but every mutating call would fail. ` +\n `Run getIdempotencyMigration() to create the table, or check DATABASE_URL. Cause: ${cause}`\n );\n }\n },\n\n async get(scopedKey: string): Promise<IdempotencyCacheEntry | null> {\n const result = await db.query(\n `SELECT payload_hash, response, EXTRACT(EPOCH FROM expires_at)::BIGINT AS expires_at FROM ${table} WHERE scoped_key = $1`,\n [scopedKey]\n );\n const row = result.rows[0];\n if (!row) return null;\n return {\n payloadHash: row.payload_hash as string,\n response: row.response as unknown,\n expiresAt: Number(row.expires_at),\n };\n },\n\n async put(scopedKey: string, entry: IdempotencyCacheEntry): Promise<void> {\n await db.query(\n `INSERT INTO ${table} (scoped_key, payload_hash, response, expires_at)\n VALUES ($1, $2, $3::jsonb, TO_TIMESTAMP($4))\n ON CONFLICT (scoped_key) DO UPDATE SET\n payload_hash = EXCLUDED.payload_hash,\n response = EXCLUDED.response,\n expires_at = EXCLUDED.expires_at`,\n [scopedKey, entry.payloadHash, JSON.stringify(entry.response), entry.expiresAt]\n );\n },\n\n async putIfAbsent(scopedKey: string, entry: IdempotencyCacheEntry): Promise<boolean> {\n // Insert only if absent OR the existing row is expired — this lets a\n // stale claim from a crashed handler be reclaimed on retry.\n const result = await db.query(\n `INSERT INTO ${table} (scoped_key, payload_hash, response, expires_at)\n VALUES ($1, $2, $3::jsonb, TO_TIMESTAMP($4))\n ON CONFLICT (scoped_key) DO UPDATE SET\n payload_hash = EXCLUDED.payload_hash,\n response = EXCLUDED.response,\n expires_at = EXCLUDED.expires_at\n WHERE ${table}.expires_at < NOW()\n RETURNING scoped_key`,\n [scopedKey, entry.payloadHash, JSON.stringify(entry.response), entry.expiresAt]\n );\n return (result.rowCount ?? 0) > 0;\n },\n\n async delete(scopedKey: string): Promise<void> {\n await db.query(`DELETE FROM ${table} WHERE scoped_key = $1`, [scopedKey]);\n },\n };\n}\n\n/**\n * Delete expired entries. Run periodically (e.g., every hour) to bound\n * table size. Returns the number of rows deleted.\n */\nexport async function cleanupExpiredIdempotency(db: PgQueryable, options: PgBackendOptions = {}): Promise<number> {\n const table = quoteIdent(options.tableName ?? DEFAULT_TABLE);\n const result = await db.query(`DELETE FROM ${table} WHERE expires_at < NOW()`);\n return result.rowCount ?? 0;\n}\n"],"mappings":"AA4BA,MAAM,gBAAgB;AACtB,MAAM,mBAAmB;AAazB,SAAS,WAAW,MAAsB;AACxC,MAAI,CAAC,iBAAiB,KAAK,IAAI,GAAG;AAChC,UAAM,IAAI,MAAM,2BAA2B,IAAI,iBAAiB,gBAAgB,EAAE;AAAA,EACpF;AACA,SAAO,IAAI,IAAI;AACjB;AAWO,SAAS,wBAAwB,SAAoC;AAC1E,QAAM,YAAY,SAAS,aAAa;AACxC,QAAM,QAAQ,WAAW,SAAS;AAClC,QAAM,aAAa;AACnB,SAAO;AAAA,6BACoB,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iCAQD,UAAU;AAAA,OACpC,KAAK;AAAA,EACV,KAAK;AACP;AAKO,MAAM,wBAAwB,wBAAwB;AA2BtD,SAAS,UAAU,IAAiB,UAA4B,CAAC,GAAuB;AAG7F,QAAM,QAAQ,WAAW,QAAQ,aAAa,aAAa;AAE3D,SAAO;AAAA,IACL,MAAM,QAAuB;AAC3B,UAAI;AACF,cAAM,GAAG,MAAM,iBAAiB,KAAK,UAAU;AAAA,MACjD,SAAS,KAAK;AACZ,cAAM,QAAQ,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAC7D,cAAM,IAAI;AAAA,UACR,uDAAuD,QAAQ,aAAa,aAAa,mPAGH,KAAK;AAAA,QAC7F;AAAA,MACF;AAAA,IACF;AAAA,IAEA,MAAM,IAAI,WAA0D;AAClE,YAAM,SAAS,MAAM,GAAG;AAAA,QACtB,4FAA4F,KAAK;AAAA,QACjG,CAAC,SAAS;AAAA,MACZ;AACA,YAAM,MAAM,OAAO,KAAK,CAAC;AACzB,UAAI,CAAC,IAAK,QAAO;AACjB,aAAO;AAAA,QACL,aAAa,IAAI;AAAA,QACjB,UAAU,IAAI;AAAA,QACd,WAAW,OAAO,IAAI,UAAU;AAAA,MAClC;AAAA,IACF;AAAA,IAEA,MAAM,IAAI,WAAmB,OAA6C;AACxE,YAAM,GAAG;AAAA,QACP,eAAe,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAMpB,CAAC,WAAW,MAAM,aAAa,KAAK,UAAU,MAAM,QAAQ,GAAG,MAAM,SAAS;AAAA,MAChF;AAAA,IACF;AAAA,IAEA,MAAM,YAAY,WAAmB,OAAgD;AAGnF,YAAM,SAAS,MAAM,GAAG;AAAA,QACtB,eAAe,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iBAMX,KAAK;AAAA;AAAA,QAEd,CAAC,WAAW,MAAM,aAAa,KAAK,UAAU,MAAM,QAAQ,GAAG,MAAM,SAAS;AAAA,MAChF;AACA,cAAQ,OAAO,YAAY,KAAK;AAAA,IAClC;AAAA,IAEA,MAAM,OAAO,WAAkC;AAC7C,YAAM,GAAG,MAAM,eAAe,KAAK,0BAA0B,CAAC,SAAS,CAAC;AAAA,IAC1E;AAAA,EACF;AACF;AAMA,eAAsB,0BAA0B,IAAiB,UAA4B,CAAC,GAAoB;AAChH,QAAM,QAAQ,WAAW,QAAQ,aAAa,aAAa;AAC3D,QAAM,SAAS,MAAM,GAAG,MAAM,eAAe,KAAK,2BAA2B;AAC7E,SAAO,OAAO,YAAY;AAC5B;","names":[]}
|
|
@@ -1,9 +1,3 @@
|
|
|
1
|
-
import { fileURLToPath as __adcpFileURLToPath } from 'node:url';
|
|
2
|
-
import { dirname as __adcpDirname } from 'node:path';
|
|
3
|
-
import { createRequire as __adcpCreateRequire } from 'node:module';
|
|
4
|
-
const __filename = __adcpFileURLToPath(import.meta.url);
|
|
5
|
-
const __dirname = __adcpDirname(__filename);
|
|
6
|
-
const require = __adcpCreateRequire(import.meta.url);
|
|
7
1
|
const DEFAULT_KEY_PREFIX = "adcp:idem:";
|
|
8
2
|
const DEFAULT_EXPIRED_GRACE_SECONDS = 120;
|
|
9
3
|
let hasWarnedAboutDefaultPrefix = false;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../src/lib/server/idempotency/backends/redis.ts"],"sourcesContent":["/**\n * Redis backend for the idempotency store.\n *\n * Stores one key per `(principal, key, [extraScope])` carrying the JSON\n * payload `{ payloadHash, response, expiresAt }`. Expiry is enforced by\n * Redis itself via the key TTL — no sweeper job required.\n *\n * **Reclaim semantics.** The `putIfAbsent` claim maps to `SET … NX EX`:\n * because Redis auto-deletes expired keys, a crashed in-flight claim is\n * naturally reclaimable on retry without the explicit `WHERE expires_at <\n * NOW()` dance the Postgres backend needs.\n *\n * **`expired` vs `miss` parity.** The store layer distinguishes `expired`\n * (cached key past TTL within clock-skew window) from `miss` (no cached\n * key) — that affects whether the buyer sees `IDEMPOTENCY_EXPIRED` or a\n * fresh execution. Postgres rows linger past `expires_at` until cleanup;\n * Redis would evict them at the second they expire, collapsing `expired`\n * into `miss`. We hold the key alive for an extra `expiredGraceSeconds`\n * (defaults to 120s — covers the store's default 60s clock skew plus a\n * margin) so the store layer can read `expiresAt` from the value and\n * return `expired` correctly within the skew window.\n *\n * **`clearAll` intentionally omitted.** A shared Redis instance is a\n * production resource — accidentally calling `FLUSHDB` from a compliance\n * reset hook would nuke unrelated keys. Test setups that want a clean\n * slate should run against a dedicated Redis db (`REDIS_URL=…/15`) and\n * call `FLUSHDB` themselves.\n *\n * @example\n * ```typescript\n * import { createClient } from 'redis';\n * import { createIdempotencyStore, createLazyBackend, redisBackend } from '@adcp/sdk/server';\n *\n * const client = createClient({ url: process.env.REDIS_URL });\n * client.on('error', (err) => console.error('redis error', err));\n * await client.connect();\n *\n * const store = createIdempotencyStore({\n * backend: redisBackend(client),\n * ttlSeconds: 86400,\n * });\n *\n * const lazyStore = createIdempotencyStore({\n * backend: createLazyBackend(async () => redisBackend(await getRedisClient(), { keyPrefix: 'adcp:idem:prod:' })),\n * ttlSeconds: 86400,\n * });\n * ```\n */\n\nimport type { IdempotencyBackend, IdempotencyCacheEntry } from '../store';\n// `import type` is erased at emit, so this does NOT make `redis` a hard\n// dependency at runtime — adopters who never use `redisBackend` never\n// load the redis package. The optional peer-dep declaration in\n// package.json still governs install behavior.\nimport type { RedisClientType } from 'redis';\n\n/**\n * Escape-hatch interface for adopters not using the official `redis`\n * client (node-redis v4/v5) — e.g., `ioredis`, Upstash, a test double.\n *\n * Mirrors the four methods this backend actually calls. The `set`\n * signature follows node-redis's options-object form; `ioredis` users\n * pass a thin shim that maps to its positional API.\n *\n * @example ioredis adapter\n * ```typescript\n * import Redis from 'ioredis';\n * const ioredis = new Redis(process.env.REDIS_URL!);\n *\n * const client: RedisLikeClient = {\n * get: (k) => ioredis.get(k),\n * set: (k, v, { EX, NX }) =>\n * NX\n * ? ioredis.set(k, v, 'EX', EX, 'NX').then(r => (r === 'OK' ? 'OK' : null))\n * : ioredis.set(k, v, 'EX', EX),\n * del: (k) => ioredis.del(k as string),\n * ping: () => ioredis.ping(),\n * };\n * ```\n */\nexport interface RedisLikeClient {\n get(key: string): Promise<string | null>;\n set(key: string, value: string, options: { EX: number; NX?: boolean }): Promise<string | null>;\n del(key: string | string[]): Promise<number>;\n ping(): Promise<string>;\n}\n\n/**\n * Accepted client shape: either a real `redis` (node-redis v4/v5)\n * `RedisClientType` (the typical path — pass `createClient(...)` straight\n * in) or an adapter that conforms to `RedisLikeClient` (for `ioredis`,\n * Upstash, or test doubles). The union avoids forcing node-redis users\n * to write `as unknown as RedisLikeClient` casts on the documented path.\n */\nexport type RedisBackendClient = RedisClientType<any, any, any> | RedisLikeClient;\n\nexport interface RedisBackendOptions {\n /**\n * Key prefix prepended to every scoped key written to Redis. Defaults\n * to `\"adcp:idem:\"`.\n *\n * **Sharing a Redis db across deployments? Override this.** The default\n * is fine for a dedicated Redis (or a dedicated db index) and for\n * coexisting with non-AdCP applications. But two AdCP servers sharing\n * the *same* db with the *same* default prefix will collide on any\n * overlapping principal namespace (e.g., both deployments having a\n * tenant called `acme`) — the principal segment is per-tenant, not\n * per-deployment, so it's the wrong layer to do deployment isolation.\n * Set a deployment-unique prefix (`\"adcp:idem:prod-eu:\"`, etc.) or use\n * separate Redis dbs.\n */\n keyPrefix?: string;\n /**\n * Suppress the one-time `console.warn` emitted at construction when the\n * default `keyPrefix` is used against a node-redis client that appears\n * to be on db 0 (the most likely signal of a shared, non-dedicated\n * Redis). Set to `true` if you know your Redis is dedicated to this\n * AdCP deployment and don't want the warning noise. The recommended\n * fix is to set `keyPrefix` explicitly, not to suppress.\n */\n suppressDefaultPrefixWarning?: boolean;\n /**\n * How many seconds past `expiresAt` to keep the key alive in Redis, so\n * the store layer can still read it during the clock-skew window and\n * return `IDEMPOTENCY_EXPIRED` (rather than treating it as a fresh\n * miss). Defaults to 120s — covers the store's default 60s skew with\n * margin. Set to 0 to collapse `expired` into `miss` (not recommended\n * — buyers lose the explicit expired signal).\n */\n expiredGraceSeconds?: number;\n}\n\nconst DEFAULT_KEY_PREFIX = 'adcp:idem:';\nconst DEFAULT_EXPIRED_GRACE_SECONDS = 120;\n\n/**\n * Module-level once-flag: the default-prefix-on-db-0 warning fires at\n * most once per process across all redisBackend instances. Operators\n * standing up multiple backends (sharded, multi-region) shouldn't see\n * N identical warnings.\n */\nlet hasWarnedAboutDefaultPrefix = false;\n\ninterface SerializedEntry {\n payloadHash: string;\n response: unknown;\n expiresAt: number;\n}\n\n/**\n * Best-effort introspection: detect the Redis db index when the client\n * is a node-redis v4/v5 `RedisClientType`. Returns `null` for escape-\n * hatch clients (ioredis, Upstash, test doubles, mocks) where we can't\n * tell — prefer false-negative over a noisy false-positive warning.\n *\n * The default-prefix warning uses this to decide whether to fire: db 0\n * is the strong signal of a shared/non-dedicated Redis (the typical\n * \"I just spun up Redis\" path); db > 0 is the signal of an operator\n * who already partitioned, who doesn't need the nag.\n */\nfunction detectNodeRedisDbIndex(client: unknown): number | null {\n if (!client || typeof client !== 'object') return null;\n const opts = (client as { options?: Record<string, unknown> }).options;\n if (!opts || typeof opts !== 'object') return null;\n if (typeof opts.database === 'number') return opts.database;\n if (typeof opts.url === 'string') {\n try {\n const u = new URL(opts.url);\n if (u.protocol !== 'redis:' && u.protocol !== 'rediss:') return null;\n const path = u.pathname.replace(/^\\//, '');\n if (path === '') return 0;\n const n = Number(path);\n return Number.isInteger(n) && n >= 0 ? n : null;\n } catch {\n return null;\n }\n }\n return null;\n}\n\n/**\n * Test-only escape hatch to reset the once-warn flag between test runs.\n * Not exported through any index — adopters can't reach it from outside\n * this file.\n */\nexport function __resetDefaultPrefixWarningForTests(): void {\n hasWarnedAboutDefaultPrefix = false;\n}\n\n/**\n * Create a Redis-backed idempotency cache.\n *\n * **Startup probe.** Call `store.probe()` (or `probeIdempotencyStore(store)`)\n * before serving traffic to catch a bad `REDIS_URL` or unreachable\n * instance at boot rather than on the first mutating request. Wire it via:\n *\n * ```ts\n * serve(createAgent, { readinessCheck: () => store.probe() });\n * ```\n *\n * **Client error handling.** node-redis emits errors on the client itself\n * for transient connection drops. Without a listener, Node's\n * `EventEmitter` default-throws and crashes the process. Add one in your\n * bootstrap:\n *\n * ```ts\n * client.on('error', (err) => console.error('redis error', err));\n * ```\n *\n * **Redis memory policy — set this on the deployment.** A buyer with a\n * valid principal can mint unbounded distinct `idempotency_key` values\n * and hit any mutating tool; each write adds a key to Redis with the\n * configured `ttlSeconds` (default 24h). A sufficient rate can pressure\n * Redis memory before TTLs evict naturally. Configure your Redis with:\n *\n * - **`maxmemory-policy volatile-lru`** (recommended) — evicts only\n * TTL'd keys, containing blast radius to AdCP's keyspace if the\n * instance is shared with other apps. All keys this backend writes\n * carry TTL, so this is safe.\n * - **`maxmemory-policy allkeys-lru`** — only on a Redis db dedicated\n * to AdCP. Will evict your other keys if shared.\n * - **`maxmemory-policy noeviction`** (Redis default) — fail-closed:\n * the backend's writes will start erroring once memory fills, and\n * mutating requests will fail. Operationally noisy but never serves\n * stale data; choose this only if you'd rather page than evict.\n *\n * Pair with alerting on a per-principal `VALIDATION_ERROR` rate — a\n * drifted handler hit by a retrying buyer writes 10s-TTL entries on\n * every fresh key, amplifying the rate of cache fill. Steady-state\n * `VALIDATION_ERROR` should be zero.\n */\nexport function redisBackend(client: RedisBackendClient, options: RedisBackendOptions = {}): IdempotencyBackend {\n // The function calls only the four methods on RedisLikeClient. The\n // wider RedisClientType union covers the node-redis happy path without\n // forcing a cast at the call site; internally we narrow.\n const c = client as RedisLikeClient;\n\n const keyPrefix = options.keyPrefix ?? DEFAULT_KEY_PREFIX;\n const expiredGraceSeconds = options.expiredGraceSeconds ?? DEFAULT_EXPIRED_GRACE_SECONDS;\n\n if (!Number.isFinite(expiredGraceSeconds) || expiredGraceSeconds < 0) {\n throw new Error(\n `redisBackend: expiredGraceSeconds must be a non-negative finite number. Got ${expiredGraceSeconds}.`\n );\n }\n\n // One-time warning when the default keyPrefix is paired with a\n // node-redis client we can confidently identify as being on db 0 —\n // the strong signal of a shared/non-dedicated Redis where the\n // default prefix is most likely to collide with another deployment.\n // Stays silent for escape-hatch clients (ioredis, test doubles)\n // because we can't introspect their db index.\n if (\n options.keyPrefix === undefined &&\n !options.suppressDefaultPrefixWarning &&\n !hasWarnedAboutDefaultPrefix &&\n detectNodeRedisDbIndex(client) === 0\n ) {\n hasWarnedAboutDefaultPrefix = true;\n console.warn(\n `redisBackend: using the default keyPrefix \"${DEFAULT_KEY_PREFIX}\" against Redis db 0. ` +\n `If this Redis db is shared with another AdCP deployment (or other apps), the principal ` +\n `segment alone is not enough to prevent cross-deployment collision. Set a deployment-unique ` +\n `keyPrefix (e.g., \"adcp:idem:prod-eu:\") or use a dedicated Redis db. ` +\n `Pass { suppressDefaultPrefixWarning: true } to silence this once you've confirmed isolation.`\n );\n }\n\n function prefixed(scopedKey: string): string {\n return `${keyPrefix}${scopedKey}`;\n }\n\n /**\n * Compute the Redis TTL for an entry. The store records absolute\n * `expiresAt`; Redis wants relative seconds. Add `expiredGraceSeconds`\n * so the value lingers through the store's clock-skew window.\n *\n * Throws if the resulting TTL is non-positive — that would mean a\n * caller is writing an entry whose `expiresAt` is already past, which\n * is a logic bug, not a substrate-papering case. A silent `EX 1`\n * clamp would let the entry vanish in 1s and the next caller would\n * see `miss` and re-execute the side effect.\n */\n function ttlFor(expiresAt: number): number {\n const nowSeconds = Math.floor(Date.now() / 1000);\n const ttl = Math.floor(expiresAt - nowSeconds + expiredGraceSeconds);\n if (ttl <= 0) {\n throw new Error(\n `redisBackend: refusing to write an entry whose expiresAt (${expiresAt}) is already past — ` +\n `the substrate-level TTL would be ${ttl}s. Caller logic error.`\n );\n }\n return ttl;\n }\n\n return {\n async probe(): Promise<void> {\n try {\n await c.ping();\n } catch (err) {\n // Generic user-facing message; the underlying error rides on\n // `Error.cause` for operators who log it. Avoids leaking infra\n // shape (`ECONNREFUSED 10.0.x.x`, `WRONGPASS …`) into any\n // adopter that wires probe failures into an external-facing\n // `/healthz` body.\n throw new Error(\n `idempotency backend probe failed: Redis is unreachable or misconfigured. ` +\n `The server would advertise IdempotencySupported but every mutating call would fail. ` +\n `Check REDIS_URL and that the instance is up. See server logs for the underlying cause.`,\n { cause: err }\n );\n }\n },\n\n async get(scopedKey: string): Promise<IdempotencyCacheEntry | null> {\n const raw = await c.get(prefixed(scopedKey));\n if (raw === null) return null;\n let parsed: SerializedEntry;\n try {\n parsed = JSON.parse(raw) as SerializedEntry;\n } catch (err) {\n // A corrupt value at our key is a bigger problem than a single\n // cache miss — surface it loudly so an operator can investigate\n // (key collision with another app, manual tampering, etc.). The\n // scoped key contains the principal — omit it from the public\n // message and attach the parse error as Error.cause so server\n // logs retain the detail without leaking via response bodies.\n throw new Error('redisBackend: corrupt cache entry — not valid JSON. See server logs for key + parse error.', {\n cause: err,\n });\n }\n return {\n payloadHash: parsed.payloadHash,\n response: parsed.response,\n expiresAt: parsed.expiresAt,\n };\n },\n\n async put(scopedKey: string, entry: IdempotencyCacheEntry): Promise<void> {\n await c.set(prefixed(scopedKey), JSON.stringify(entry), { EX: ttlFor(entry.expiresAt) });\n },\n\n async putIfAbsent(scopedKey: string, entry: IdempotencyCacheEntry): Promise<boolean> {\n // SET … NX EX: atomic claim. Redis returns 'OK' on success and\n // null when NX prevented the write. Expired keys are already gone\n // from Redis, so the reclaim-stale-claim case the pg backend\n // handles explicitly is automatic here.\n const result = await c.set(prefixed(scopedKey), JSON.stringify(entry), {\n EX: ttlFor(entry.expiresAt),\n NX: true,\n });\n return result !== null;\n },\n\n async delete(scopedKey: string): Promise<void> {\n await c.del(prefixed(scopedKey));\n },\n };\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../../../../src/lib/server/idempotency/backends/redis.ts"],"sourcesContent":["/**\n * Redis backend for the idempotency store.\n *\n * Stores one key per `(principal, key, [extraScope])` carrying the JSON\n * payload `{ payloadHash, response, expiresAt }`. Expiry is enforced by\n * Redis itself via the key TTL — no sweeper job required.\n *\n * **Reclaim semantics.** The `putIfAbsent` claim maps to `SET … NX EX`:\n * because Redis auto-deletes expired keys, a crashed in-flight claim is\n * naturally reclaimable on retry without the explicit `WHERE expires_at <\n * NOW()` dance the Postgres backend needs.\n *\n * **`expired` vs `miss` parity.** The store layer distinguishes `expired`\n * (cached key past TTL within clock-skew window) from `miss` (no cached\n * key) — that affects whether the buyer sees `IDEMPOTENCY_EXPIRED` or a\n * fresh execution. Postgres rows linger past `expires_at` until cleanup;\n * Redis would evict them at the second they expire, collapsing `expired`\n * into `miss`. We hold the key alive for an extra `expiredGraceSeconds`\n * (defaults to 120s — covers the store's default 60s clock skew plus a\n * margin) so the store layer can read `expiresAt` from the value and\n * return `expired` correctly within the skew window.\n *\n * **`clearAll` intentionally omitted.** A shared Redis instance is a\n * production resource — accidentally calling `FLUSHDB` from a compliance\n * reset hook would nuke unrelated keys. Test setups that want a clean\n * slate should run against a dedicated Redis db (`REDIS_URL=…/15`) and\n * call `FLUSHDB` themselves.\n *\n * @example\n * ```typescript\n * import { createClient } from 'redis';\n * import { createIdempotencyStore, createLazyBackend, redisBackend } from '@adcp/sdk/server';\n *\n * const client = createClient({ url: process.env.REDIS_URL });\n * client.on('error', (err) => console.error('redis error', err));\n * await client.connect();\n *\n * const store = createIdempotencyStore({\n * backend: redisBackend(client),\n * ttlSeconds: 86400,\n * });\n *\n * const lazyStore = createIdempotencyStore({\n * backend: createLazyBackend(async () => redisBackend(await getRedisClient(), { keyPrefix: 'adcp:idem:prod:' })),\n * ttlSeconds: 86400,\n * });\n * ```\n */\n\nimport type { IdempotencyBackend, IdempotencyCacheEntry } from '../store';\n// `import type` is erased at emit, so this does NOT make `redis` a hard\n// dependency at runtime — adopters who never use `redisBackend` never\n// load the redis package. The optional peer-dep declaration in\n// package.json still governs install behavior.\nimport type { RedisClientType } from 'redis';\n\n/**\n * Escape-hatch interface for adopters not using the official `redis`\n * client (node-redis v4/v5) — e.g., `ioredis`, Upstash, a test double.\n *\n * Mirrors the four methods this backend actually calls. The `set`\n * signature follows node-redis's options-object form; `ioredis` users\n * pass a thin shim that maps to its positional API.\n *\n * @example ioredis adapter\n * ```typescript\n * import Redis from 'ioredis';\n * const ioredis = new Redis(process.env.REDIS_URL!);\n *\n * const client: RedisLikeClient = {\n * get: (k) => ioredis.get(k),\n * set: (k, v, { EX, NX }) =>\n * NX\n * ? ioredis.set(k, v, 'EX', EX, 'NX').then(r => (r === 'OK' ? 'OK' : null))\n * : ioredis.set(k, v, 'EX', EX),\n * del: (k) => ioredis.del(k as string),\n * ping: () => ioredis.ping(),\n * };\n * ```\n */\nexport interface RedisLikeClient {\n get(key: string): Promise<string | null>;\n set(key: string, value: string, options: { EX: number; NX?: boolean }): Promise<string | null>;\n del(key: string | string[]): Promise<number>;\n ping(): Promise<string>;\n}\n\n/**\n * Accepted client shape: either a real `redis` (node-redis v4/v5)\n * `RedisClientType` (the typical path — pass `createClient(...)` straight\n * in) or an adapter that conforms to `RedisLikeClient` (for `ioredis`,\n * Upstash, or test doubles). The union avoids forcing node-redis users\n * to write `as unknown as RedisLikeClient` casts on the documented path.\n */\nexport type RedisBackendClient = RedisClientType<any, any, any> | RedisLikeClient;\n\nexport interface RedisBackendOptions {\n /**\n * Key prefix prepended to every scoped key written to Redis. Defaults\n * to `\"adcp:idem:\"`.\n *\n * **Sharing a Redis db across deployments? Override this.** The default\n * is fine for a dedicated Redis (or a dedicated db index) and for\n * coexisting with non-AdCP applications. But two AdCP servers sharing\n * the *same* db with the *same* default prefix will collide on any\n * overlapping principal namespace (e.g., both deployments having a\n * tenant called `acme`) — the principal segment is per-tenant, not\n * per-deployment, so it's the wrong layer to do deployment isolation.\n * Set a deployment-unique prefix (`\"adcp:idem:prod-eu:\"`, etc.) or use\n * separate Redis dbs.\n */\n keyPrefix?: string;\n /**\n * Suppress the one-time `console.warn` emitted at construction when the\n * default `keyPrefix` is used against a node-redis client that appears\n * to be on db 0 (the most likely signal of a shared, non-dedicated\n * Redis). Set to `true` if you know your Redis is dedicated to this\n * AdCP deployment and don't want the warning noise. The recommended\n * fix is to set `keyPrefix` explicitly, not to suppress.\n */\n suppressDefaultPrefixWarning?: boolean;\n /**\n * How many seconds past `expiresAt` to keep the key alive in Redis, so\n * the store layer can still read it during the clock-skew window and\n * return `IDEMPOTENCY_EXPIRED` (rather than treating it as a fresh\n * miss). Defaults to 120s — covers the store's default 60s skew with\n * margin. Set to 0 to collapse `expired` into `miss` (not recommended\n * — buyers lose the explicit expired signal).\n */\n expiredGraceSeconds?: number;\n}\n\nconst DEFAULT_KEY_PREFIX = 'adcp:idem:';\nconst DEFAULT_EXPIRED_GRACE_SECONDS = 120;\n\n/**\n * Module-level once-flag: the default-prefix-on-db-0 warning fires at\n * most once per process across all redisBackend instances. Operators\n * standing up multiple backends (sharded, multi-region) shouldn't see\n * N identical warnings.\n */\nlet hasWarnedAboutDefaultPrefix = false;\n\ninterface SerializedEntry {\n payloadHash: string;\n response: unknown;\n expiresAt: number;\n}\n\n/**\n * Best-effort introspection: detect the Redis db index when the client\n * is a node-redis v4/v5 `RedisClientType`. Returns `null` for escape-\n * hatch clients (ioredis, Upstash, test doubles, mocks) where we can't\n * tell — prefer false-negative over a noisy false-positive warning.\n *\n * The default-prefix warning uses this to decide whether to fire: db 0\n * is the strong signal of a shared/non-dedicated Redis (the typical\n * \"I just spun up Redis\" path); db > 0 is the signal of an operator\n * who already partitioned, who doesn't need the nag.\n */\nfunction detectNodeRedisDbIndex(client: unknown): number | null {\n if (!client || typeof client !== 'object') return null;\n const opts = (client as { options?: Record<string, unknown> }).options;\n if (!opts || typeof opts !== 'object') return null;\n if (typeof opts.database === 'number') return opts.database;\n if (typeof opts.url === 'string') {\n try {\n const u = new URL(opts.url);\n if (u.protocol !== 'redis:' && u.protocol !== 'rediss:') return null;\n const path = u.pathname.replace(/^\\//, '');\n if (path === '') return 0;\n const n = Number(path);\n return Number.isInteger(n) && n >= 0 ? n : null;\n } catch {\n return null;\n }\n }\n return null;\n}\n\n/**\n * Test-only escape hatch to reset the once-warn flag between test runs.\n * Not exported through any index — adopters can't reach it from outside\n * this file.\n */\nexport function __resetDefaultPrefixWarningForTests(): void {\n hasWarnedAboutDefaultPrefix = false;\n}\n\n/**\n * Create a Redis-backed idempotency cache.\n *\n * **Startup probe.** Call `store.probe()` (or `probeIdempotencyStore(store)`)\n * before serving traffic to catch a bad `REDIS_URL` or unreachable\n * instance at boot rather than on the first mutating request. Wire it via:\n *\n * ```ts\n * serve(createAgent, { readinessCheck: () => store.probe() });\n * ```\n *\n * **Client error handling.** node-redis emits errors on the client itself\n * for transient connection drops. Without a listener, Node's\n * `EventEmitter` default-throws and crashes the process. Add one in your\n * bootstrap:\n *\n * ```ts\n * client.on('error', (err) => console.error('redis error', err));\n * ```\n *\n * **Redis memory policy — set this on the deployment.** A buyer with a\n * valid principal can mint unbounded distinct `idempotency_key` values\n * and hit any mutating tool; each write adds a key to Redis with the\n * configured `ttlSeconds` (default 24h). A sufficient rate can pressure\n * Redis memory before TTLs evict naturally. Configure your Redis with:\n *\n * - **`maxmemory-policy volatile-lru`** (recommended) — evicts only\n * TTL'd keys, containing blast radius to AdCP's keyspace if the\n * instance is shared with other apps. All keys this backend writes\n * carry TTL, so this is safe.\n * - **`maxmemory-policy allkeys-lru`** — only on a Redis db dedicated\n * to AdCP. Will evict your other keys if shared.\n * - **`maxmemory-policy noeviction`** (Redis default) — fail-closed:\n * the backend's writes will start erroring once memory fills, and\n * mutating requests will fail. Operationally noisy but never serves\n * stale data; choose this only if you'd rather page than evict.\n *\n * Pair with alerting on a per-principal `VALIDATION_ERROR` rate — a\n * drifted handler hit by a retrying buyer writes 10s-TTL entries on\n * every fresh key, amplifying the rate of cache fill. Steady-state\n * `VALIDATION_ERROR` should be zero.\n */\nexport function redisBackend(client: RedisBackendClient, options: RedisBackendOptions = {}): IdempotencyBackend {\n // The function calls only the four methods on RedisLikeClient. The\n // wider RedisClientType union covers the node-redis happy path without\n // forcing a cast at the call site; internally we narrow.\n const c = client as RedisLikeClient;\n\n const keyPrefix = options.keyPrefix ?? DEFAULT_KEY_PREFIX;\n const expiredGraceSeconds = options.expiredGraceSeconds ?? DEFAULT_EXPIRED_GRACE_SECONDS;\n\n if (!Number.isFinite(expiredGraceSeconds) || expiredGraceSeconds < 0) {\n throw new Error(\n `redisBackend: expiredGraceSeconds must be a non-negative finite number. Got ${expiredGraceSeconds}.`\n );\n }\n\n // One-time warning when the default keyPrefix is paired with a\n // node-redis client we can confidently identify as being on db 0 —\n // the strong signal of a shared/non-dedicated Redis where the\n // default prefix is most likely to collide with another deployment.\n // Stays silent for escape-hatch clients (ioredis, test doubles)\n // because we can't introspect their db index.\n if (\n options.keyPrefix === undefined &&\n !options.suppressDefaultPrefixWarning &&\n !hasWarnedAboutDefaultPrefix &&\n detectNodeRedisDbIndex(client) === 0\n ) {\n hasWarnedAboutDefaultPrefix = true;\n console.warn(\n `redisBackend: using the default keyPrefix \"${DEFAULT_KEY_PREFIX}\" against Redis db 0. ` +\n `If this Redis db is shared with another AdCP deployment (or other apps), the principal ` +\n `segment alone is not enough to prevent cross-deployment collision. Set a deployment-unique ` +\n `keyPrefix (e.g., \"adcp:idem:prod-eu:\") or use a dedicated Redis db. ` +\n `Pass { suppressDefaultPrefixWarning: true } to silence this once you've confirmed isolation.`\n );\n }\n\n function prefixed(scopedKey: string): string {\n return `${keyPrefix}${scopedKey}`;\n }\n\n /**\n * Compute the Redis TTL for an entry. The store records absolute\n * `expiresAt`; Redis wants relative seconds. Add `expiredGraceSeconds`\n * so the value lingers through the store's clock-skew window.\n *\n * Throws if the resulting TTL is non-positive — that would mean a\n * caller is writing an entry whose `expiresAt` is already past, which\n * is a logic bug, not a substrate-papering case. A silent `EX 1`\n * clamp would let the entry vanish in 1s and the next caller would\n * see `miss` and re-execute the side effect.\n */\n function ttlFor(expiresAt: number): number {\n const nowSeconds = Math.floor(Date.now() / 1000);\n const ttl = Math.floor(expiresAt - nowSeconds + expiredGraceSeconds);\n if (ttl <= 0) {\n throw new Error(\n `redisBackend: refusing to write an entry whose expiresAt (${expiresAt}) is already past — ` +\n `the substrate-level TTL would be ${ttl}s. Caller logic error.`\n );\n }\n return ttl;\n }\n\n return {\n async probe(): Promise<void> {\n try {\n await c.ping();\n } catch (err) {\n // Generic user-facing message; the underlying error rides on\n // `Error.cause` for operators who log it. Avoids leaking infra\n // shape (`ECONNREFUSED 10.0.x.x`, `WRONGPASS …`) into any\n // adopter that wires probe failures into an external-facing\n // `/healthz` body.\n throw new Error(\n `idempotency backend probe failed: Redis is unreachable or misconfigured. ` +\n `The server would advertise IdempotencySupported but every mutating call would fail. ` +\n `Check REDIS_URL and that the instance is up. See server logs for the underlying cause.`,\n { cause: err }\n );\n }\n },\n\n async get(scopedKey: string): Promise<IdempotencyCacheEntry | null> {\n const raw = await c.get(prefixed(scopedKey));\n if (raw === null) return null;\n let parsed: SerializedEntry;\n try {\n parsed = JSON.parse(raw) as SerializedEntry;\n } catch (err) {\n // A corrupt value at our key is a bigger problem than a single\n // cache miss — surface it loudly so an operator can investigate\n // (key collision with another app, manual tampering, etc.). The\n // scoped key contains the principal — omit it from the public\n // message and attach the parse error as Error.cause so server\n // logs retain the detail without leaking via response bodies.\n throw new Error('redisBackend: corrupt cache entry — not valid JSON. See server logs for key + parse error.', {\n cause: err,\n });\n }\n return {\n payloadHash: parsed.payloadHash,\n response: parsed.response,\n expiresAt: parsed.expiresAt,\n };\n },\n\n async put(scopedKey: string, entry: IdempotencyCacheEntry): Promise<void> {\n await c.set(prefixed(scopedKey), JSON.stringify(entry), { EX: ttlFor(entry.expiresAt) });\n },\n\n async putIfAbsent(scopedKey: string, entry: IdempotencyCacheEntry): Promise<boolean> {\n // SET … NX EX: atomic claim. Redis returns 'OK' on success and\n // null when NX prevented the write. Expired keys are already gone\n // from Redis, so the reclaim-stale-claim case the pg backend\n // handles explicitly is automatic here.\n const result = await c.set(prefixed(scopedKey), JSON.stringify(entry), {\n EX: ttlFor(entry.expiresAt),\n NX: true,\n });\n return result !== null;\n },\n\n async delete(scopedKey: string): Promise<void> {\n await c.del(prefixed(scopedKey));\n },\n };\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1,9 +1,3 @@
|
|
|
1
|
-
import { fileURLToPath as __adcpFileURLToPath } from 'node:url';
|
|
2
|
-
import { dirname as __adcpDirname } from 'node:path';
|
|
3
|
-
import { createRequire as __adcpCreateRequire } from 'node:module';
|
|
4
|
-
const __filename = __adcpFileURLToPath(import.meta.url);
|
|
5
|
-
const __dirname = __adcpDirname(__filename);
|
|
6
|
-
const require = __adcpCreateRequire(import.meta.url);
|
|
7
1
|
import { createIdempotencyStore, hashPayload, probeIdempotencyStore } from "./store.mjs";
|
|
8
2
|
import { memoryBackend } from "./backends/memory.mjs";
|
|
9
3
|
import { pgBackend, getIdempotencyMigration, IDEMPOTENCY_MIGRATION, cleanupExpiredIdempotency } from "./backends/pg.mjs";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/lib/server/idempotency/index.ts"],"sourcesContent":["export { createIdempotencyStore, hashPayload, probeIdempotencyStore } from './store';\nexport type {\n IdempotencyStore,\n IdempotencyStoreConfig,\n IdempotencyBackend,\n IdempotencyCacheEntry,\n IdempotencyCheckResult,\n} from './store';\nexport { memoryBackend } from './backends/memory';\nexport type { MemoryBackendOptions } from './backends/memory';\nexport { pgBackend, getIdempotencyMigration, IDEMPOTENCY_MIGRATION, cleanupExpiredIdempotency } from './backends/pg';\nexport type { PgBackendOptions } from './backends/pg';\nexport { redisBackend } from './backends/redis';\nexport type { RedisBackendOptions, RedisBackendClient, RedisLikeClient } from './backends/redis';\nexport { createLazyBackend } from './backends/lazy';\nexport type { LazyBackendFactory, LazyBackendOptions } from './backends/lazy';\n"],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../../../../src/lib/server/idempotency/index.ts"],"sourcesContent":["export { createIdempotencyStore, hashPayload, probeIdempotencyStore } from './store';\nexport type {\n IdempotencyStore,\n IdempotencyStoreConfig,\n IdempotencyBackend,\n IdempotencyCacheEntry,\n IdempotencyCheckResult,\n} from './store';\nexport { memoryBackend } from './backends/memory';\nexport type { MemoryBackendOptions } from './backends/memory';\nexport { pgBackend, getIdempotencyMigration, IDEMPOTENCY_MIGRATION, cleanupExpiredIdempotency } from './backends/pg';\nexport type { PgBackendOptions } from './backends/pg';\nexport { redisBackend } from './backends/redis';\nexport type { RedisBackendOptions, RedisBackendClient, RedisLikeClient } from './backends/redis';\nexport { createLazyBackend } from './backends/lazy';\nexport type { LazyBackendFactory, LazyBackendOptions } from './backends/lazy';\n"],"mappings":"AAAA,SAAS,wBAAwB,aAAa,6BAA6B;AAQ3E,SAAS,qBAAqB;AAE9B,SAAS,WAAW,yBAAyB,uBAAuB,iCAAiC;AAErG,SAAS,oBAAoB;AAE7B,SAAS,yBAAyB;","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 { canonicalJsonSha256 } from "../../utils/jcs.mjs";
|
|
8
2
|
const HASH_EXCLUSION_FIELDS = ["idempotency_key", "governance_context"];
|
|
9
3
|
const MIN_TTL = 3600;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/lib/server/idempotency/store.ts"],"sourcesContent":["/**\n * Idempotency store for AdCP server handlers.\n *\n * AdCP v3 requires `idempotency_key` on every mutating request. This store:\n *\n * 1. Hashes the canonical request payload (RFC 8785 JCS) to detect same-key\n * reuse with a different payload → `IDEMPOTENCY_CONFLICT`.\n * 2. Caches successful response payloads per `(principal, key)` for the\n * declared replay window, so retries of the same key return the same\n * response — without re-executing side effects.\n * 3. Rejects keys past the TTL (with ±60s clock-skew tolerance) as\n * `IDEMPOTENCY_EXPIRED`, turning the silent-double-book footgun into\n * a loud failure.\n * 4. Declares the window on `get_adcp_capabilities` so buyers can reason\n * about retry safety.\n *\n * Scope is `(principal, key)` — keys don't need to be globally unique,\n * just unique per principal. Per-principal scoping prevents cross-tenant\n * replay oracles where one tenant could probe another's cached responses.\n *\n * @example\n * ```typescript\n * import { createAdcpServer, createIdempotencyStore, memoryBackend } from '@adcp/sdk/server/legacy/v5';\n *\n * const idempotency = createIdempotencyStore({\n * backend: memoryBackend(),\n * ttlSeconds: 86400,\n * });\n *\n * createAdcpServer({\n * idempotency,\n * resolveSessionKey: (ctx) => ctx.account?.id, // doubles as idempotency principal\n * mediaBuy: { createMediaBuy: async (params, ctx) => {...} },\n * });\n * ```\n */\n\nimport { canonicalJsonSha256 } from '../../utils/jcs';\n\n/**\n * Fields excluded from the canonical payload hash.\n *\n * Closed list — future additions are a breaking change to equivalence\n * semantics. Keep in sync with the upstream spec exclusion list:\n *\n * - `idempotency_key` — excluded by definition (it IS the dedup key)\n * - `context` — varies on retry by design (correlation IDs, etc.) BUT\n * only when it's the standard object echo-back shape. Some tools\n * (`si_initiate_session`, `si_get_offering`) use `context` as a\n * load-bearing string; strings are kept in the hash so that a retry\n * with a different handoff description is correctly flagged as\n * IDEMPOTENCY_CONFLICT.\n * - `governance_context` — may be a refreshed signed token on retry\n * - `push_notification_config.authentication.credentials` — may be a rotated\n * bearer/HMAC credential. The URL and scheme stay in the hash; only the\n * credential value is excluded.\n */\nconst HASH_EXCLUSION_FIELDS = ['idempotency_key', 'governance_context'] as const;\n\n/**\n * A stored cache entry for a successfully-executed mutating request.\n */\nexport interface IdempotencyCacheEntry {\n /** SHA-256 of the RFC 8785 JCS form of the request payload (excluding exclusion list). */\n payloadHash: string;\n /** The response payload to replay. Does NOT include the envelope — envelope fields vary per response. */\n response: unknown;\n /** Unix epoch seconds when this entry expires. */\n expiresAt: number;\n}\n\n/**\n * Storage backend interface. Swap implementations for memory, Postgres, Redis, etc.\n *\n * Keys are already composed as `{principal}\\u001f{key}` (or with extra\n * scope segments for per-session tools) before reaching the backend —\n * backends don't need to know about scoping. The separator is U+001F\n * (unit separator) rather than NUL because Postgres TEXT columns reject\n * NUL bytes; either way the middleware's key-pattern validation\n * (`^[A-Za-z0-9_.:-]{16,255}$`) guarantees the separator cannot appear\n * in a legitimate key.\n *\n * **Object-identity contract.** Implementations MUST NOT return the same\n * object reference on subsequent `get` calls — the middleware injects\n * envelope fields (`replayed: true`, echo-back `context`) onto the\n * returned value, and a shared reference would leak those mutations\n * across requests. Implementations that store values by reference (e.g.,\n * `memoryBackend`) MUST deep-clone on read; implementations that\n * serialize (e.g., `pgBackend` via JSON) get this for free.\n */\nexport interface IdempotencyBackend {\n get(scopedKey: string): Promise<IdempotencyCacheEntry | null>;\n /**\n * Atomically insert an entry only if no entry exists for `scopedKey`.\n * Used as a claim step by the middleware to close the concurrent-miss\n * race (two parallel requests with the same fresh key both seeing\n * `miss` and both executing side effects). Returns `true` if the\n * caller \"won\" the claim and should proceed to run the handler;\n * `false` if another request claimed first (the caller should treat\n * the result as a replay or conflict on re-check).\n */\n putIfAbsent(scopedKey: string, entry: IdempotencyCacheEntry): Promise<boolean>;\n /**\n * Store an entry, overwriting any existing entry with the same\n * `scopedKey`. Used by the middleware to replace the in-flight\n * placeholder (written via `putIfAbsent` at claim time) with the final\n * response after the handler completes.\n */\n put(scopedKey: string, entry: IdempotencyCacheEntry): Promise<void>;\n /**\n * Delete an entry. Used by the middleware to release the claim when\n * the handler fails — errors MUST NOT be cached, so the placeholder\n * is rolled back on error so a retry can re-execute.\n */\n delete(scopedKey: string): Promise<void>;\n /**\n * Optional startup probe. Implementations that wrap an external store\n * (e.g., `pgBackend`) should implement this to eagerly validate the\n * connection before the server starts accepting traffic. Called by\n * `probeIdempotencyStore()` and by `serve()` when `readinessCheck` is\n * wired. Throws a descriptive error when the backend is unreachable or\n * the required schema is missing.\n */\n probe?(): Promise<void>;\n /**\n * Optional hook for implementations that need to release resources\n * (close pools, clear timers). Called by `store.close()`.\n */\n close?(): Promise<void>;\n /**\n * Optional test-harness hook that drops every cached entry without\n * releasing backend resources. Used by `AdcpServer.compliance.reset()`\n * between storyboards so idempotency cache hits from one storyboard\n * don't replay into the next (shared brand domain, same key prefix).\n *\n * Production backends that can't cheaply flush everything (e.g., a\n * shared Postgres cluster) should leave this undefined — the reset\n * hook refuses to run when this method is missing unless the caller\n * explicitly opts in with `{ force: true }`.\n */\n clearAll?(): Promise<void>;\n}\n\n/**\n * Result of checking the store for a given key + payload.\n */\nexport type IdempotencyCheckResult =\n | {\n /** Cache hit with matching payload — replay the cached response. */\n kind: 'replay';\n response: unknown;\n }\n | {\n /** Cache hit with different payload — reject as IDEMPOTENCY_CONFLICT. */\n kind: 'conflict';\n }\n | {\n /** Cached key exists but is past TTL — reject as IDEMPOTENCY_EXPIRED. */\n kind: 'expired';\n }\n | {\n /** A parallel request is currently executing the same key — the caller should retry the check. */\n kind: 'in-flight';\n /**\n * Suggested retry delay in seconds, derived from the remaining TTL on\n * the first request's in-flight claim (`expiresAt - now`, capped at\n * `IN_FLIGHT_RETRY_HINT_CAP_SECONDS`). The middleware surfaces this as\n * the `retry_after` hint on the `IDEMPOTENCY_IN_FLIGHT` response so a\n * buyer's transient-retry decays toward the expected completion\n * instead of slamming back instantly. Always `>= 1`.\n */\n retryAfterSeconds: number;\n }\n | {\n /** No prior execution for this key — caller should run the handler and save. */\n kind: 'miss';\n payloadHash: string;\n };\n\n/**\n * Configuration for `createIdempotencyStore`.\n *\n * **Cached responses at rest — handler responsibility.** The store\n * caches whatever the handler returned as the response payload, then\n * `JSON.stringify`-s it into the configured backend for the declared\n * `ttlSeconds` (default 24h, max 7d). The hash-exclusion list strips\n * `idempotency_key`, `governance_context`, and\n * `push_notification_config.authentication.credentials` from the\n * **hash** so a rotated credential on retry doesn't false-conflict,\n * but the **stored response** is the handler's verbatim output.\n *\n * If a handler returns a response that includes:\n *\n * - a refreshed bearer / OAuth access token,\n * - a signed governance / auth payload,\n * - `push_notification_config.authentication.credentials` (a buyer-\n * supplied write-only secret — the contract is that sellers MUST\n * NOT echo it back; receipt correlation uses\n * `push_notification_config.token` instead),\n * - any other secret material,\n *\n * those secrets sit at rest in the backend for `ttlSeconds`. On Redis\n * without TLS, they're also plaintext over the wire. The framework\n * does not scrub responses before caching — the AdCP spec doesn't\n * require it of either party, and a built-in scrubber would change\n * the wire shape of legitimate adopter responses without warning.\n *\n * Practical guidance:\n *\n * - **Don't return credentials in handler responses.** No AdCP tool's\n * response schema asks for them; if your adapter is echoing them\n * back, refactor. `push_notification_config.credentials` in\n * particular is write-only — `token` is the field a seller uses to\n * confirm receipt.\n * - If a handler nonetheless must produce a secret-bearing response\n * (e.g., an internal-only echo for adapter debugging), wrap your\n * handler to scrub before returning, OR use a custom\n * `IdempotencyBackend` that transforms entries on the write path.\n *\n * See also `docs/guides/CTX-METADATA-SAFETY.md` for related guidance\n * on what NOT to put in `ctx_metadata` (which has its own caching\n * surface with the same at-rest concern).\n */\nexport interface IdempotencyStoreConfig {\n /** Storage backend. Use `memoryBackend()` for tests, `pgBackend(pool)` for production. */\n backend: IdempotencyBackend;\n /**\n * Replay window in seconds. MUST be between 3600 (1h) and 604800 (7d)\n * per spec. Out-of-range values throw at construction — silent clamping\n * would hide operator misconfiguration (e.g., `60` meaning \"one minute\"\n * becoming `3600` and getting declared to buyers as a 1h replay window).\n * Defaults to 86400 (24h).\n */\n ttlSeconds?: number;\n /**\n * Clock-skew tolerance in seconds. A key is treated as still valid for\n * this many seconds past its actual expiry, to avoid spurious\n * IDEMPOTENCY_EXPIRED rejections when the buyer's clock drifts forward.\n * Defaults to 60 (1 minute).\n */\n clockSkewSeconds?: number;\n}\n\n/**\n * Additional scope contributors for a specific tool, composed into the\n * cache key alongside `(principal, key)`. Used for tools with per-session\n * semantics (`si_send_message` scopes by `session_id`).\n */\nexport type ExtraScopeResolver = (args: { toolName: string; params: Record<string, unknown> }) => string | undefined;\n\nexport interface IdempotencyStore {\n /**\n * Check the store for `(principal, key, payload)` and return whether the\n * caller should replay, reject, or execute fresh.\n *\n * On `miss`, the store writes an in-flight placeholder atomically via\n * the backend's `putIfAbsent`. Only the caller that wins the claim gets\n * `miss`; parallel callers with the same key see `in-flight` and should\n * retry the check after a brief delay. The returned `payloadHash` MUST\n * be passed back to `save()` to avoid double-hashing.\n */\n check(params: {\n principal: string;\n key: string;\n payload: unknown;\n extraScope?: string;\n }): Promise<IdempotencyCheckResult>;\n /**\n * Save a successful execution's response to the cache, replacing the\n * in-flight placeholder written at check time.\n */\n save(params: {\n principal: string;\n key: string;\n payloadHash: string;\n response: unknown;\n extraScope?: string;\n }): Promise<void>;\n /**\n * Release the in-flight claim written at check time — used by the\n * middleware when the handler fails, so a retry can re-execute rather\n * than replay a cached error.\n */\n release(params: { principal: string; key: string; extraScope?: string }): Promise<void>;\n /**\n * Short-TTL cache for an error envelope that the handler is guaranteed\n * to reproduce on re-execution (currently: strict-mode response\n * VALIDATION_ERROR driven by handler drift).\n *\n * Optional on the interface so custom store implementations aren't\n * forced to migrate — when absent, the dispatcher falls back to\n * `release()` (the pre-#758 behavior). Stores backed by\n * `createIdempotencyStore` always include it.\n *\n * Retry-storm guard, not a spec replay. Without it, a drifted handler\n * under strict validation + a retrying buyer produces unbounded\n * re-execution (release-on-error lets every retry hit the handler again\n * with the same drift). Caching for `TRANSIENT_ERROR_TTL_SECONDS` (10s)\n * short-circuits retries within the buyer's typical backoff window.\n *\n * **Operational note — DoS primitive.** A drifted handler reachable by\n * a hostile buyer is a cache-fill vector: every fresh idempotency_key\n * writes a new 10s-TTL entry, cheap because the handler fails fast.\n * Alert on sustained `VALIDATION_ERROR` rates per principal — they\n * indicate either a broken handler (deploy regression) or a buyer\n * probing for drift. Steady-state `VALIDATION_ERROR` should be zero.\n *\n * **Dev-experience note — TTL opacity.** After deploying a handler fix,\n * same-key retries within the 10s window still replay the cached error\n * before the fix takes effect. Iterative handler authors should use a\n * fresh `idempotency_key` to bypass the cache during development.\n */\n saveTransientError?(params: {\n principal: string;\n key: string;\n payloadHash: string;\n response: unknown;\n extraScope?: string;\n }): Promise<void>;\n /**\n * Probe the backend at server startup. Delegates to `backend.probe()` if\n * the backend implements it; otherwise resolves immediately. Wire into\n * `serve()` via `readinessCheck: () => store.probe()` so the server\n * never accepts traffic with a broken pool.\n */\n probe?(): Promise<void>;\n /**\n * Capability fragment for `get_adcp_capabilities` — tells buyers the\n * replay window so they can reason about retry safety. Pass to\n * `createAdcpServer` via `capabilities.idempotency`.\n */\n capability(): { replay_ttl_seconds: number };\n /** The replay window in seconds (already bounds-checked at construction). */\n readonly ttlSeconds: number;\n /** Release backend resources (close pools, clear timers). */\n close(): Promise<void>;\n /**\n * Drop every cached entry without releasing backend resources.\n * Present only when the configured backend supports it (e.g.,\n * `memoryBackend`). Production-leaning backends leave this undefined\n * so an accidental production call can't flush the cache.\n *\n * Only invoked from `AdcpServer.compliance.reset()` — do not call from\n * production code paths.\n */\n clearAll?(): Promise<void>;\n}\n\nconst MIN_TTL = 3600; // 1 hour\nconst MAX_TTL = 604800; // 7 days\nconst DEFAULT_TTL = 86400; // 24 hours\nconst DEFAULT_CLOCK_SKEW = 60;\n/**\n * How long an in-flight claim lives before it can be reclaimed. Matches\n * the AdCP working-response timeout (120s): a handler that's still\n * running after 120s should have returned `submitted` with a task_id\n * already, so this bounds the \"crashed handler\" recovery window without\n * holding parallel requests hostage for the full replay TTL.\n */\nconst IN_FLIGHT_TTL_SECONDS = 120;\n/**\n * How long a transient-error cache entry lives. Long enough to absorb a\n * buyer SDK's retry storm (typical exponential backoff takes ~2–3\n * attempts past 10s), short enough that genuine fixes by the handler\n * author aren't gated on TTL expiry during iterative development.\n */\nconst TRANSIENT_ERROR_TTL_SECONDS = 10;\n/**\n * Payload hash for in-flight claims. Different from any real hash so a\n * parallel `check()` with the same payload sees the claim as\n * `in-flight`, not `replay` (an empty claim shouldn't pretend to be a\n * valid cached response).\n */\nconst IN_FLIGHT_HASH = '__adcp_in_flight__';\n/**\n * Soft cap on the retry hint surfaced to buyers on the in-flight branch.\n * Without a cap, a freshly-claimed key (120s remaining) would tell the buyer\n * to wait 120s — worse than the spec's \"retry shortly\" intent and worse than\n * the buyer's own retry barrier. 30s amortizes a slow handler's tail latency\n * without stalling buyers behind a fresh long-tail claim.\n */\nconst IN_FLIGHT_RETRY_HINT_CAP_SECONDS = 30;\n\n/**\n * Derive the buyer-facing `retry_after` hint from how much time is left on\n * the in-flight claim (`expiresAt - now`). A freshly-claimed key surfaces\n * `IN_FLIGHT_RETRY_HINT_CAP_SECONDS`; the hint decays as the claim ages so\n * a buyer retrying just before expiry doesn't over-wait. Always clamped to\n * `>= 1` so a near-expired claim doesn't tell the buyer to retry instantly.\n */\nfunction inFlightRetryAfter(expiresAt: number, nowSeconds: number): number {\n const remaining = expiresAt - nowSeconds;\n return Math.max(1, Math.min(IN_FLIGHT_RETRY_HINT_CAP_SECONDS, remaining));\n}\n\n/**\n * Create an idempotency store bound to a specific backend and replay window.\n *\n * Throws if `ttlSeconds` is out of spec bounds (1h–7d) — silent clamping\n * would hide operator misconfiguration and lie to buyers about the\n * effective replay window.\n */\nexport function createIdempotencyStore(config: IdempotencyStoreConfig): IdempotencyStore {\n if (!config || typeof config !== 'object') {\n throw new TypeError(\n 'createIdempotencyStore requires an IdempotencyStoreConfig. ' +\n 'For tests / single-process: `createIdempotencyStore({ backend: memoryBackend() })`. ' +\n 'For production: `createIdempotencyStore({ backend: pgBackend(pool) })`.'\n );\n }\n if (!config.backend) {\n throw new TypeError(\n 'createIdempotencyStore: config.backend is required. ' +\n 'Pass `memoryBackend()` for tests / single-process deployments or `pgBackend(pool)` for production.'\n );\n }\n const ttlSeconds = validateTtl(config.ttlSeconds ?? DEFAULT_TTL);\n const clockSkewSeconds = config.clockSkewSeconds ?? DEFAULT_CLOCK_SKEW;\n const backend = config.backend;\n\n return {\n ttlSeconds,\n\n async check({ principal, key, payload, extraScope }): Promise<IdempotencyCheckResult> {\n const scopedKey = scope(principal, key, extraScope);\n const payloadHash = hashPayload(payload);\n\n const cached = await backend.get(scopedKey);\n if (cached) {\n const nowSeconds = Math.floor(Date.now() / 1000);\n if (cached.expiresAt + clockSkewSeconds < nowSeconds) {\n return { kind: 'expired' };\n }\n if (cached.payloadHash === IN_FLIGHT_HASH) {\n return { kind: 'in-flight', retryAfterSeconds: inFlightRetryAfter(cached.expiresAt, nowSeconds) };\n }\n if (cached.payloadHash !== payloadHash) {\n return { kind: 'conflict' };\n }\n return { kind: 'replay', response: cached.response };\n }\n\n // Claim the key so parallel requests with the same key see 'in-flight'\n // rather than racing us to execute the handler. Claim TTL is short\n // (120s) so a crashed handler's claim is reclaimable, without\n // holding parallel requests hostage for the full replay window.\n const expiresAt = Math.floor(Date.now() / 1000) + IN_FLIGHT_TTL_SECONDS;\n const claimed = await backend.putIfAbsent(scopedKey, {\n payloadHash: IN_FLIGHT_HASH,\n response: null,\n expiresAt,\n });\n\n if (!claimed) {\n // Someone beat us to the claim — re-read to find out what they did.\n const recheck = await backend.get(scopedKey);\n const nowSeconds = Math.floor(Date.now() / 1000);\n if (!recheck) return { kind: 'in-flight', retryAfterSeconds: 1 };\n if (recheck.payloadHash === IN_FLIGHT_HASH) {\n return { kind: 'in-flight', retryAfterSeconds: inFlightRetryAfter(recheck.expiresAt, nowSeconds) };\n }\n if (recheck.payloadHash !== payloadHash) return { kind: 'conflict' };\n return { kind: 'replay', response: recheck.response };\n }\n\n return { kind: 'miss', payloadHash };\n },\n\n async save({ principal, key, payloadHash, response, extraScope }): Promise<void> {\n const scopedKey = scope(principal, key, extraScope);\n const expiresAt = Math.floor(Date.now() / 1000) + ttlSeconds;\n await backend.put(scopedKey, { payloadHash, response, expiresAt });\n },\n\n async release({ principal, key, extraScope }): Promise<void> {\n const scopedKey = scope(principal, key, extraScope);\n await backend.delete(scopedKey);\n },\n\n async saveTransientError({ principal, key, payloadHash, response, extraScope }): Promise<void> {\n const scopedKey = scope(principal, key, extraScope);\n const expiresAt = Math.floor(Date.now() / 1000) + TRANSIENT_ERROR_TTL_SECONDS;\n await backend.put(scopedKey, { payloadHash, response, expiresAt });\n },\n\n async probe() {\n if (backend.probe) await backend.probe();\n },\n\n capability() {\n return { replay_ttl_seconds: ttlSeconds };\n },\n\n async close() {\n if (backend.close) await backend.close();\n },\n\n ...(backend.clearAll\n ? {\n async clearAll() {\n await backend.clearAll!();\n },\n }\n : {}),\n };\n}\n\n/**\n * Compute the canonical payload hash used for idempotency equivalence.\n *\n * Strips the closed exclusion list (`idempotency_key`, `context` when\n * it's the echo-back object, `governance_context`, and\n * `push_notification_config.authentication.credentials`) before hashing\n * with RFC 8785 JCS + SHA-256.\n */\nexport function hashPayload(payload: unknown): string {\n return canonicalJsonSha256(stripExclusions(payload));\n}\n\nfunction stripExclusions(payload: unknown): unknown {\n if (payload == null || typeof payload !== 'object' || Array.isArray(payload)) {\n return payload;\n }\n const src = payload as Record<string, unknown>;\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(src)) {\n if ((HASH_EXCLUSION_FIELDS as readonly string[]).includes(k)) continue;\n // Exclude `context` only when it's the echo-back object shape. SI tools\n // (`si_initiate_session`, `si_get_offering`) use `context` as a\n // load-bearing string (handoff description, offering context); those\n // MUST stay in the hash so a retry with different text is correctly\n // rejected as IDEMPOTENCY_CONFLICT.\n if (k === 'context' && v !== null && typeof v === 'object' && !Array.isArray(v)) continue;\n if (k === 'push_notification_config' && v && typeof v === 'object' && !Array.isArray(v)) {\n out[k] = stripPushNotificationCredentials(v as Record<string, unknown>);\n } else {\n out[k] = v;\n }\n }\n return out;\n}\n\nfunction stripPushNotificationCredentials(pnc: Record<string, unknown>): Record<string, unknown> {\n const auth = pnc.authentication;\n if (!auth || typeof auth !== 'object' || Array.isArray(auth)) return pnc;\n const authCopy: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(auth as Record<string, unknown>)) {\n if (k !== 'credentials') authCopy[k] = v;\n }\n return { ...pnc, authentication: authCopy };\n}\n\n// ASCII unit separator (U+001F). Used to join scope segments without\n// risking ambiguity — the middleware's key-pattern validation bans\n// control characters in the key, and principals are server-controlled,\n// so this byte can't appear in either segment by legitimate input.\n// NUL bytes (U+0000) would be simpler but Postgres TEXT columns reject\n// them, so we pick the next-safest non-printable separator.\nconst SCOPE_SEPARATOR = '\\u001f';\n\nfunction scope(principal: string, key: string, extraScope?: string): string {\n return extraScope\n ? `${principal}${SCOPE_SEPARATOR}${extraScope}${SCOPE_SEPARATOR}${key}`\n : `${principal}${SCOPE_SEPARATOR}${key}`;\n}\n\n/**\n * Escape-hatch for callers that manage their own lifecycle (Lambda, custom\n * HTTP frameworks) and cannot use `serve({ readinessCheck })`. Delegates to\n * `store.probe()`. For servers built with `serve()`, prefer:\n *\n * ```ts\n * serve(createAgent, { readinessCheck: () => store.probe() });\n * ```\n *\n * Resolves immediately when the backend has no `probe()` (e.g., `memoryBackend`).\n * Throws with a descriptive error when the backend is unreachable or its\n * required schema is missing.\n */\nexport async function probeIdempotencyStore(store: IdempotencyStore): Promise<void> {\n if (store.probe) await store.probe();\n}\n\nfunction validateTtl(seconds: number): number {\n if (!Number.isFinite(seconds) || !Number.isInteger(seconds)) {\n throw new Error(`createIdempotencyStore: ttlSeconds must be a finite integer. Got ${seconds}.`);\n }\n if (seconds < MIN_TTL) {\n throw new Error(\n `createIdempotencyStore: ttlSeconds must be >= ${MIN_TTL} (1 hour per AdCP spec). Got ${seconds} — did you mean minutes?`\n );\n }\n if (seconds > MAX_TTL) {\n throw new Error(`createIdempotencyStore: ttlSeconds must be <= ${MAX_TTL} (7 days per AdCP spec). Got ${seconds}.`);\n }\n return seconds;\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../../../src/lib/server/idempotency/store.ts"],"sourcesContent":["/**\n * Idempotency store for AdCP server handlers.\n *\n * AdCP v3 requires `idempotency_key` on every mutating request. This store:\n *\n * 1. Hashes the canonical request payload (RFC 8785 JCS) to detect same-key\n * reuse with a different payload → `IDEMPOTENCY_CONFLICT`.\n * 2. Caches successful response payloads per `(principal, key)` for the\n * declared replay window, so retries of the same key return the same\n * response — without re-executing side effects.\n * 3. Rejects keys past the TTL (with ±60s clock-skew tolerance) as\n * `IDEMPOTENCY_EXPIRED`, turning the silent-double-book footgun into\n * a loud failure.\n * 4. Declares the window on `get_adcp_capabilities` so buyers can reason\n * about retry safety.\n *\n * Scope is `(principal, key)` — keys don't need to be globally unique,\n * just unique per principal. Per-principal scoping prevents cross-tenant\n * replay oracles where one tenant could probe another's cached responses.\n *\n * @example\n * ```typescript\n * import { createAdcpServer, createIdempotencyStore, memoryBackend } from '@adcp/sdk/server/legacy/v5';\n *\n * const idempotency = createIdempotencyStore({\n * backend: memoryBackend(),\n * ttlSeconds: 86400,\n * });\n *\n * createAdcpServer({\n * idempotency,\n * resolveSessionKey: (ctx) => ctx.account?.id, // doubles as idempotency principal\n * mediaBuy: { createMediaBuy: async (params, ctx) => {...} },\n * });\n * ```\n */\n\nimport { canonicalJsonSha256 } from '../../utils/jcs';\n\n/**\n * Fields excluded from the canonical payload hash.\n *\n * Closed list — future additions are a breaking change to equivalence\n * semantics. Keep in sync with the upstream spec exclusion list:\n *\n * - `idempotency_key` — excluded by definition (it IS the dedup key)\n * - `context` — varies on retry by design (correlation IDs, etc.) BUT\n * only when it's the standard object echo-back shape. Some tools\n * (`si_initiate_session`, `si_get_offering`) use `context` as a\n * load-bearing string; strings are kept in the hash so that a retry\n * with a different handoff description is correctly flagged as\n * IDEMPOTENCY_CONFLICT.\n * - `governance_context` — may be a refreshed signed token on retry\n * - `push_notification_config.authentication.credentials` — may be a rotated\n * bearer/HMAC credential. The URL and scheme stay in the hash; only the\n * credential value is excluded.\n */\nconst HASH_EXCLUSION_FIELDS = ['idempotency_key', 'governance_context'] as const;\n\n/**\n * A stored cache entry for a successfully-executed mutating request.\n */\nexport interface IdempotencyCacheEntry {\n /** SHA-256 of the RFC 8785 JCS form of the request payload (excluding exclusion list). */\n payloadHash: string;\n /** The response payload to replay. Does NOT include the envelope — envelope fields vary per response. */\n response: unknown;\n /** Unix epoch seconds when this entry expires. */\n expiresAt: number;\n}\n\n/**\n * Storage backend interface. Swap implementations for memory, Postgres, Redis, etc.\n *\n * Keys are already composed as `{principal}\\u001f{key}` (or with extra\n * scope segments for per-session tools) before reaching the backend —\n * backends don't need to know about scoping. The separator is U+001F\n * (unit separator) rather than NUL because Postgres TEXT columns reject\n * NUL bytes; either way the middleware's key-pattern validation\n * (`^[A-Za-z0-9_.:-]{16,255}$`) guarantees the separator cannot appear\n * in a legitimate key.\n *\n * **Object-identity contract.** Implementations MUST NOT return the same\n * object reference on subsequent `get` calls — the middleware injects\n * envelope fields (`replayed: true`, echo-back `context`) onto the\n * returned value, and a shared reference would leak those mutations\n * across requests. Implementations that store values by reference (e.g.,\n * `memoryBackend`) MUST deep-clone on read; implementations that\n * serialize (e.g., `pgBackend` via JSON) get this for free.\n */\nexport interface IdempotencyBackend {\n get(scopedKey: string): Promise<IdempotencyCacheEntry | null>;\n /**\n * Atomically insert an entry only if no entry exists for `scopedKey`.\n * Used as a claim step by the middleware to close the concurrent-miss\n * race (two parallel requests with the same fresh key both seeing\n * `miss` and both executing side effects). Returns `true` if the\n * caller \"won\" the claim and should proceed to run the handler;\n * `false` if another request claimed first (the caller should treat\n * the result as a replay or conflict on re-check).\n */\n putIfAbsent(scopedKey: string, entry: IdempotencyCacheEntry): Promise<boolean>;\n /**\n * Store an entry, overwriting any existing entry with the same\n * `scopedKey`. Used by the middleware to replace the in-flight\n * placeholder (written via `putIfAbsent` at claim time) with the final\n * response after the handler completes.\n */\n put(scopedKey: string, entry: IdempotencyCacheEntry): Promise<void>;\n /**\n * Delete an entry. Used by the middleware to release the claim when\n * the handler fails — errors MUST NOT be cached, so the placeholder\n * is rolled back on error so a retry can re-execute.\n */\n delete(scopedKey: string): Promise<void>;\n /**\n * Optional startup probe. Implementations that wrap an external store\n * (e.g., `pgBackend`) should implement this to eagerly validate the\n * connection before the server starts accepting traffic. Called by\n * `probeIdempotencyStore()` and by `serve()` when `readinessCheck` is\n * wired. Throws a descriptive error when the backend is unreachable or\n * the required schema is missing.\n */\n probe?(): Promise<void>;\n /**\n * Optional hook for implementations that need to release resources\n * (close pools, clear timers). Called by `store.close()`.\n */\n close?(): Promise<void>;\n /**\n * Optional test-harness hook that drops every cached entry without\n * releasing backend resources. Used by `AdcpServer.compliance.reset()`\n * between storyboards so idempotency cache hits from one storyboard\n * don't replay into the next (shared brand domain, same key prefix).\n *\n * Production backends that can't cheaply flush everything (e.g., a\n * shared Postgres cluster) should leave this undefined — the reset\n * hook refuses to run when this method is missing unless the caller\n * explicitly opts in with `{ force: true }`.\n */\n clearAll?(): Promise<void>;\n}\n\n/**\n * Result of checking the store for a given key + payload.\n */\nexport type IdempotencyCheckResult =\n | {\n /** Cache hit with matching payload — replay the cached response. */\n kind: 'replay';\n response: unknown;\n }\n | {\n /** Cache hit with different payload — reject as IDEMPOTENCY_CONFLICT. */\n kind: 'conflict';\n }\n | {\n /** Cached key exists but is past TTL — reject as IDEMPOTENCY_EXPIRED. */\n kind: 'expired';\n }\n | {\n /** A parallel request is currently executing the same key — the caller should retry the check. */\n kind: 'in-flight';\n /**\n * Suggested retry delay in seconds, derived from the remaining TTL on\n * the first request's in-flight claim (`expiresAt - now`, capped at\n * `IN_FLIGHT_RETRY_HINT_CAP_SECONDS`). The middleware surfaces this as\n * the `retry_after` hint on the `IDEMPOTENCY_IN_FLIGHT` response so a\n * buyer's transient-retry decays toward the expected completion\n * instead of slamming back instantly. Always `>= 1`.\n */\n retryAfterSeconds: number;\n }\n | {\n /** No prior execution for this key — caller should run the handler and save. */\n kind: 'miss';\n payloadHash: string;\n };\n\n/**\n * Configuration for `createIdempotencyStore`.\n *\n * **Cached responses at rest — handler responsibility.** The store\n * caches whatever the handler returned as the response payload, then\n * `JSON.stringify`-s it into the configured backend for the declared\n * `ttlSeconds` (default 24h, max 7d). The hash-exclusion list strips\n * `idempotency_key`, `governance_context`, and\n * `push_notification_config.authentication.credentials` from the\n * **hash** so a rotated credential on retry doesn't false-conflict,\n * but the **stored response** is the handler's verbatim output.\n *\n * If a handler returns a response that includes:\n *\n * - a refreshed bearer / OAuth access token,\n * - a signed governance / auth payload,\n * - `push_notification_config.authentication.credentials` (a buyer-\n * supplied write-only secret — the contract is that sellers MUST\n * NOT echo it back; receipt correlation uses\n * `push_notification_config.token` instead),\n * - any other secret material,\n *\n * those secrets sit at rest in the backend for `ttlSeconds`. On Redis\n * without TLS, they're also plaintext over the wire. The framework\n * does not scrub responses before caching — the AdCP spec doesn't\n * require it of either party, and a built-in scrubber would change\n * the wire shape of legitimate adopter responses without warning.\n *\n * Practical guidance:\n *\n * - **Don't return credentials in handler responses.** No AdCP tool's\n * response schema asks for them; if your adapter is echoing them\n * back, refactor. `push_notification_config.credentials` in\n * particular is write-only — `token` is the field a seller uses to\n * confirm receipt.\n * - If a handler nonetheless must produce a secret-bearing response\n * (e.g., an internal-only echo for adapter debugging), wrap your\n * handler to scrub before returning, OR use a custom\n * `IdempotencyBackend` that transforms entries on the write path.\n *\n * See also `docs/guides/CTX-METADATA-SAFETY.md` for related guidance\n * on what NOT to put in `ctx_metadata` (which has its own caching\n * surface with the same at-rest concern).\n */\nexport interface IdempotencyStoreConfig {\n /** Storage backend. Use `memoryBackend()` for tests, `pgBackend(pool)` for production. */\n backend: IdempotencyBackend;\n /**\n * Replay window in seconds. MUST be between 3600 (1h) and 604800 (7d)\n * per spec. Out-of-range values throw at construction — silent clamping\n * would hide operator misconfiguration (e.g., `60` meaning \"one minute\"\n * becoming `3600` and getting declared to buyers as a 1h replay window).\n * Defaults to 86400 (24h).\n */\n ttlSeconds?: number;\n /**\n * Clock-skew tolerance in seconds. A key is treated as still valid for\n * this many seconds past its actual expiry, to avoid spurious\n * IDEMPOTENCY_EXPIRED rejections when the buyer's clock drifts forward.\n * Defaults to 60 (1 minute).\n */\n clockSkewSeconds?: number;\n}\n\n/**\n * Additional scope contributors for a specific tool, composed into the\n * cache key alongside `(principal, key)`. Used for tools with per-session\n * semantics (`si_send_message` scopes by `session_id`).\n */\nexport type ExtraScopeResolver = (args: { toolName: string; params: Record<string, unknown> }) => string | undefined;\n\nexport interface IdempotencyStore {\n /**\n * Check the store for `(principal, key, payload)` and return whether the\n * caller should replay, reject, or execute fresh.\n *\n * On `miss`, the store writes an in-flight placeholder atomically via\n * the backend's `putIfAbsent`. Only the caller that wins the claim gets\n * `miss`; parallel callers with the same key see `in-flight` and should\n * retry the check after a brief delay. The returned `payloadHash` MUST\n * be passed back to `save()` to avoid double-hashing.\n */\n check(params: {\n principal: string;\n key: string;\n payload: unknown;\n extraScope?: string;\n }): Promise<IdempotencyCheckResult>;\n /**\n * Save a successful execution's response to the cache, replacing the\n * in-flight placeholder written at check time.\n */\n save(params: {\n principal: string;\n key: string;\n payloadHash: string;\n response: unknown;\n extraScope?: string;\n }): Promise<void>;\n /**\n * Release the in-flight claim written at check time — used by the\n * middleware when the handler fails, so a retry can re-execute rather\n * than replay a cached error.\n */\n release(params: { principal: string; key: string; extraScope?: string }): Promise<void>;\n /**\n * Short-TTL cache for an error envelope that the handler is guaranteed\n * to reproduce on re-execution (currently: strict-mode response\n * VALIDATION_ERROR driven by handler drift).\n *\n * Optional on the interface so custom store implementations aren't\n * forced to migrate — when absent, the dispatcher falls back to\n * `release()` (the pre-#758 behavior). Stores backed by\n * `createIdempotencyStore` always include it.\n *\n * Retry-storm guard, not a spec replay. Without it, a drifted handler\n * under strict validation + a retrying buyer produces unbounded\n * re-execution (release-on-error lets every retry hit the handler again\n * with the same drift). Caching for `TRANSIENT_ERROR_TTL_SECONDS` (10s)\n * short-circuits retries within the buyer's typical backoff window.\n *\n * **Operational note — DoS primitive.** A drifted handler reachable by\n * a hostile buyer is a cache-fill vector: every fresh idempotency_key\n * writes a new 10s-TTL entry, cheap because the handler fails fast.\n * Alert on sustained `VALIDATION_ERROR` rates per principal — they\n * indicate either a broken handler (deploy regression) or a buyer\n * probing for drift. Steady-state `VALIDATION_ERROR` should be zero.\n *\n * **Dev-experience note — TTL opacity.** After deploying a handler fix,\n * same-key retries within the 10s window still replay the cached error\n * before the fix takes effect. Iterative handler authors should use a\n * fresh `idempotency_key` to bypass the cache during development.\n */\n saveTransientError?(params: {\n principal: string;\n key: string;\n payloadHash: string;\n response: unknown;\n extraScope?: string;\n }): Promise<void>;\n /**\n * Probe the backend at server startup. Delegates to `backend.probe()` if\n * the backend implements it; otherwise resolves immediately. Wire into\n * `serve()` via `readinessCheck: () => store.probe()` so the server\n * never accepts traffic with a broken pool.\n */\n probe?(): Promise<void>;\n /**\n * Capability fragment for `get_adcp_capabilities` — tells buyers the\n * replay window so they can reason about retry safety. Pass to\n * `createAdcpServer` via `capabilities.idempotency`.\n */\n capability(): { replay_ttl_seconds: number };\n /** The replay window in seconds (already bounds-checked at construction). */\n readonly ttlSeconds: number;\n /** Release backend resources (close pools, clear timers). */\n close(): Promise<void>;\n /**\n * Drop every cached entry without releasing backend resources.\n * Present only when the configured backend supports it (e.g.,\n * `memoryBackend`). Production-leaning backends leave this undefined\n * so an accidental production call can't flush the cache.\n *\n * Only invoked from `AdcpServer.compliance.reset()` — do not call from\n * production code paths.\n */\n clearAll?(): Promise<void>;\n}\n\nconst MIN_TTL = 3600; // 1 hour\nconst MAX_TTL = 604800; // 7 days\nconst DEFAULT_TTL = 86400; // 24 hours\nconst DEFAULT_CLOCK_SKEW = 60;\n/**\n * How long an in-flight claim lives before it can be reclaimed. Matches\n * the AdCP working-response timeout (120s): a handler that's still\n * running after 120s should have returned `submitted` with a task_id\n * already, so this bounds the \"crashed handler\" recovery window without\n * holding parallel requests hostage for the full replay TTL.\n */\nconst IN_FLIGHT_TTL_SECONDS = 120;\n/**\n * How long a transient-error cache entry lives. Long enough to absorb a\n * buyer SDK's retry storm (typical exponential backoff takes ~2–3\n * attempts past 10s), short enough that genuine fixes by the handler\n * author aren't gated on TTL expiry during iterative development.\n */\nconst TRANSIENT_ERROR_TTL_SECONDS = 10;\n/**\n * Payload hash for in-flight claims. Different from any real hash so a\n * parallel `check()` with the same payload sees the claim as\n * `in-flight`, not `replay` (an empty claim shouldn't pretend to be a\n * valid cached response).\n */\nconst IN_FLIGHT_HASH = '__adcp_in_flight__';\n/**\n * Soft cap on the retry hint surfaced to buyers on the in-flight branch.\n * Without a cap, a freshly-claimed key (120s remaining) would tell the buyer\n * to wait 120s — worse than the spec's \"retry shortly\" intent and worse than\n * the buyer's own retry barrier. 30s amortizes a slow handler's tail latency\n * without stalling buyers behind a fresh long-tail claim.\n */\nconst IN_FLIGHT_RETRY_HINT_CAP_SECONDS = 30;\n\n/**\n * Derive the buyer-facing `retry_after` hint from how much time is left on\n * the in-flight claim (`expiresAt - now`). A freshly-claimed key surfaces\n * `IN_FLIGHT_RETRY_HINT_CAP_SECONDS`; the hint decays as the claim ages so\n * a buyer retrying just before expiry doesn't over-wait. Always clamped to\n * `>= 1` so a near-expired claim doesn't tell the buyer to retry instantly.\n */\nfunction inFlightRetryAfter(expiresAt: number, nowSeconds: number): number {\n const remaining = expiresAt - nowSeconds;\n return Math.max(1, Math.min(IN_FLIGHT_RETRY_HINT_CAP_SECONDS, remaining));\n}\n\n/**\n * Create an idempotency store bound to a specific backend and replay window.\n *\n * Throws if `ttlSeconds` is out of spec bounds (1h–7d) — silent clamping\n * would hide operator misconfiguration and lie to buyers about the\n * effective replay window.\n */\nexport function createIdempotencyStore(config: IdempotencyStoreConfig): IdempotencyStore {\n if (!config || typeof config !== 'object') {\n throw new TypeError(\n 'createIdempotencyStore requires an IdempotencyStoreConfig. ' +\n 'For tests / single-process: `createIdempotencyStore({ backend: memoryBackend() })`. ' +\n 'For production: `createIdempotencyStore({ backend: pgBackend(pool) })`.'\n );\n }\n if (!config.backend) {\n throw new TypeError(\n 'createIdempotencyStore: config.backend is required. ' +\n 'Pass `memoryBackend()` for tests / single-process deployments or `pgBackend(pool)` for production.'\n );\n }\n const ttlSeconds = validateTtl(config.ttlSeconds ?? DEFAULT_TTL);\n const clockSkewSeconds = config.clockSkewSeconds ?? DEFAULT_CLOCK_SKEW;\n const backend = config.backend;\n\n return {\n ttlSeconds,\n\n async check({ principal, key, payload, extraScope }): Promise<IdempotencyCheckResult> {\n const scopedKey = scope(principal, key, extraScope);\n const payloadHash = hashPayload(payload);\n\n const cached = await backend.get(scopedKey);\n if (cached) {\n const nowSeconds = Math.floor(Date.now() / 1000);\n if (cached.expiresAt + clockSkewSeconds < nowSeconds) {\n return { kind: 'expired' };\n }\n if (cached.payloadHash === IN_FLIGHT_HASH) {\n return { kind: 'in-flight', retryAfterSeconds: inFlightRetryAfter(cached.expiresAt, nowSeconds) };\n }\n if (cached.payloadHash !== payloadHash) {\n return { kind: 'conflict' };\n }\n return { kind: 'replay', response: cached.response };\n }\n\n // Claim the key so parallel requests with the same key see 'in-flight'\n // rather than racing us to execute the handler. Claim TTL is short\n // (120s) so a crashed handler's claim is reclaimable, without\n // holding parallel requests hostage for the full replay window.\n const expiresAt = Math.floor(Date.now() / 1000) + IN_FLIGHT_TTL_SECONDS;\n const claimed = await backend.putIfAbsent(scopedKey, {\n payloadHash: IN_FLIGHT_HASH,\n response: null,\n expiresAt,\n });\n\n if (!claimed) {\n // Someone beat us to the claim — re-read to find out what they did.\n const recheck = await backend.get(scopedKey);\n const nowSeconds = Math.floor(Date.now() / 1000);\n if (!recheck) return { kind: 'in-flight', retryAfterSeconds: 1 };\n if (recheck.payloadHash === IN_FLIGHT_HASH) {\n return { kind: 'in-flight', retryAfterSeconds: inFlightRetryAfter(recheck.expiresAt, nowSeconds) };\n }\n if (recheck.payloadHash !== payloadHash) return { kind: 'conflict' };\n return { kind: 'replay', response: recheck.response };\n }\n\n return { kind: 'miss', payloadHash };\n },\n\n async save({ principal, key, payloadHash, response, extraScope }): Promise<void> {\n const scopedKey = scope(principal, key, extraScope);\n const expiresAt = Math.floor(Date.now() / 1000) + ttlSeconds;\n await backend.put(scopedKey, { payloadHash, response, expiresAt });\n },\n\n async release({ principal, key, extraScope }): Promise<void> {\n const scopedKey = scope(principal, key, extraScope);\n await backend.delete(scopedKey);\n },\n\n async saveTransientError({ principal, key, payloadHash, response, extraScope }): Promise<void> {\n const scopedKey = scope(principal, key, extraScope);\n const expiresAt = Math.floor(Date.now() / 1000) + TRANSIENT_ERROR_TTL_SECONDS;\n await backend.put(scopedKey, { payloadHash, response, expiresAt });\n },\n\n async probe() {\n if (backend.probe) await backend.probe();\n },\n\n capability() {\n return { replay_ttl_seconds: ttlSeconds };\n },\n\n async close() {\n if (backend.close) await backend.close();\n },\n\n ...(backend.clearAll\n ? {\n async clearAll() {\n await backend.clearAll!();\n },\n }\n : {}),\n };\n}\n\n/**\n * Compute the canonical payload hash used for idempotency equivalence.\n *\n * Strips the closed exclusion list (`idempotency_key`, `context` when\n * it's the echo-back object, `governance_context`, and\n * `push_notification_config.authentication.credentials`) before hashing\n * with RFC 8785 JCS + SHA-256.\n */\nexport function hashPayload(payload: unknown): string {\n return canonicalJsonSha256(stripExclusions(payload));\n}\n\nfunction stripExclusions(payload: unknown): unknown {\n if (payload == null || typeof payload !== 'object' || Array.isArray(payload)) {\n return payload;\n }\n const src = payload as Record<string, unknown>;\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(src)) {\n if ((HASH_EXCLUSION_FIELDS as readonly string[]).includes(k)) continue;\n // Exclude `context` only when it's the echo-back object shape. SI tools\n // (`si_initiate_session`, `si_get_offering`) use `context` as a\n // load-bearing string (handoff description, offering context); those\n // MUST stay in the hash so a retry with different text is correctly\n // rejected as IDEMPOTENCY_CONFLICT.\n if (k === 'context' && v !== null && typeof v === 'object' && !Array.isArray(v)) continue;\n if (k === 'push_notification_config' && v && typeof v === 'object' && !Array.isArray(v)) {\n out[k] = stripPushNotificationCredentials(v as Record<string, unknown>);\n } else {\n out[k] = v;\n }\n }\n return out;\n}\n\nfunction stripPushNotificationCredentials(pnc: Record<string, unknown>): Record<string, unknown> {\n const auth = pnc.authentication;\n if (!auth || typeof auth !== 'object' || Array.isArray(auth)) return pnc;\n const authCopy: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(auth as Record<string, unknown>)) {\n if (k !== 'credentials') authCopy[k] = v;\n }\n return { ...pnc, authentication: authCopy };\n}\n\n// ASCII unit separator (U+001F). Used to join scope segments without\n// risking ambiguity — the middleware's key-pattern validation bans\n// control characters in the key, and principals are server-controlled,\n// so this byte can't appear in either segment by legitimate input.\n// NUL bytes (U+0000) would be simpler but Postgres TEXT columns reject\n// them, so we pick the next-safest non-printable separator.\nconst SCOPE_SEPARATOR = '\\u001f';\n\nfunction scope(principal: string, key: string, extraScope?: string): string {\n return extraScope\n ? `${principal}${SCOPE_SEPARATOR}${extraScope}${SCOPE_SEPARATOR}${key}`\n : `${principal}${SCOPE_SEPARATOR}${key}`;\n}\n\n/**\n * Escape-hatch for callers that manage their own lifecycle (Lambda, custom\n * HTTP frameworks) and cannot use `serve({ readinessCheck })`. Delegates to\n * `store.probe()`. For servers built with `serve()`, prefer:\n *\n * ```ts\n * serve(createAgent, { readinessCheck: () => store.probe() });\n * ```\n *\n * Resolves immediately when the backend has no `probe()` (e.g., `memoryBackend`).\n * Throws with a descriptive error when the backend is unreachable or its\n * required schema is missing.\n */\nexport async function probeIdempotencyStore(store: IdempotencyStore): Promise<void> {\n if (store.probe) await store.probe();\n}\n\nfunction validateTtl(seconds: number): number {\n if (!Number.isFinite(seconds) || !Number.isInteger(seconds)) {\n throw new Error(`createIdempotencyStore: ttlSeconds must be a finite integer. Got ${seconds}.`);\n }\n if (seconds < MIN_TTL) {\n throw new Error(\n `createIdempotencyStore: ttlSeconds must be >= ${MIN_TTL} (1 hour per AdCP spec). Got ${seconds} — did you mean minutes?`\n );\n }\n if (seconds > MAX_TTL) {\n throw new Error(`createIdempotencyStore: ttlSeconds must be <= ${MAX_TTL} (7 days per AdCP spec). Got ${seconds}.`);\n }\n return seconds;\n}\n"],"mappings":"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","names":[]}
|
|
@@ -54,7 +54,7 @@ export { structuredSerialize, structuredDeserialize } from './structured-seriali
|
|
|
54
54
|
export { requireSessionKey, ADCP_PRE_TRANSPORT, ADCP_SIGNED_REQUESTS_STATE, ADCP_INSTRUCTIONS_FN, } from './create-adcp-server.mjs';
|
|
55
55
|
export type { SessionContext, OnInstructionsError, MaybePromise, BridgeMarker } from './create-adcp-server.mjs';
|
|
56
56
|
export type { AdcpServer, AdcpServerComplianceApi, AdcpServerTransport, AdcpTestRequest, AdcpTestToolsCallRequest, AdcpTestResponse, } from './adcp-server.mjs';
|
|
57
|
-
export type { AdcpServerConfig, WebhooksConfig, AdcpToolMap, AdcpServerToolName, AdcpCapabilitiesConfig, AdcpCapabilitiesOverrides, AdcpCustomToolConfig, AdcpLogger, SignedRequestsConfig, AdcpPreTransport, AdcpSignedRequestsState, HandlerContext, SessionKeyContext, MediaBuyHandlers, SignalsHandlers, CreativeHandlers, GovernanceHandlers, AccountHandlers, EventTrackingHandlers, SponsoredIntelligenceHandlers, ResolveAccountContext, } from './create-adcp-server.mjs';
|
|
57
|
+
export type { AdcpServerConfig, WebhooksConfig, AdcpToolMap, AdcpServerToolName, AdcpCapabilitiesConfig, AdcpCapabilitiesOverrides, AdcpCustomToolConfig, McpAppUiMeta, McpAppMeta, AdcpLogger, SignedRequestsConfig, AdcpPreTransport, AdcpSignedRequestsState, HandlerContext, SessionKeyContext, MediaBuyHandlers, SignalsHandlers, CreativeHandlers, GovernanceHandlers, AccountHandlers, EventTrackingHandlers, SponsoredIntelligenceHandlers, ResolveAccountContext, } from './create-adcp-server.mjs';
|
|
58
58
|
export { DEFAULT_REPORTING_CAPABILITIES } from './product-defaults.mjs';
|
|
59
59
|
export { isSandboxRequest, mergeSeededProductsIntoResponse, filterValidSeededProducts, filterValidSeededCreatives, filterValidSeededMediaBuys, filterValidSeededAccounts, filterValidSeededAccountFinancials, filterValidSeededCreativeFormats, mergeSeededCreativesIntoResponse, mergeSeededMediaBuysIntoResponse, mergeSeededAccountsIntoResponse, mergeSeededCreativeFormatsIntoResponse, pickSeededAccountFinancialsForRequest, replaceAccountFinancialsIfSeeded, bridgeFromTestControllerStore, bridgeFromSessionStore, } from './test-controller-bridge.mjs';
|
|
60
60
|
export type { TestControllerBridge, TestControllerBridgeContext, BridgeFromSessionStoreOptions, SeededCreative, SeededMediaBuy, SeededAccountFinancials, } from './test-controller-bridge.mjs';
|
|
@@ -54,7 +54,7 @@ export { structuredSerialize, structuredDeserialize } from './structured-seriali
|
|
|
54
54
|
export { requireSessionKey, ADCP_PRE_TRANSPORT, ADCP_SIGNED_REQUESTS_STATE, ADCP_INSTRUCTIONS_FN, } from './create-adcp-server';
|
|
55
55
|
export type { SessionContext, OnInstructionsError, MaybePromise, BridgeMarker } from './create-adcp-server';
|
|
56
56
|
export type { AdcpServer, AdcpServerComplianceApi, AdcpServerTransport, AdcpTestRequest, AdcpTestToolsCallRequest, AdcpTestResponse, } from './adcp-server';
|
|
57
|
-
export type { AdcpServerConfig, WebhooksConfig, AdcpToolMap, AdcpServerToolName, AdcpCapabilitiesConfig, AdcpCapabilitiesOverrides, AdcpCustomToolConfig, AdcpLogger, SignedRequestsConfig, AdcpPreTransport, AdcpSignedRequestsState, HandlerContext, SessionKeyContext, MediaBuyHandlers, SignalsHandlers, CreativeHandlers, GovernanceHandlers, AccountHandlers, EventTrackingHandlers, SponsoredIntelligenceHandlers, ResolveAccountContext, } from './create-adcp-server';
|
|
57
|
+
export type { AdcpServerConfig, WebhooksConfig, AdcpToolMap, AdcpServerToolName, AdcpCapabilitiesConfig, AdcpCapabilitiesOverrides, AdcpCustomToolConfig, McpAppUiMeta, McpAppMeta, AdcpLogger, SignedRequestsConfig, AdcpPreTransport, AdcpSignedRequestsState, HandlerContext, SessionKeyContext, MediaBuyHandlers, SignalsHandlers, CreativeHandlers, GovernanceHandlers, AccountHandlers, EventTrackingHandlers, SponsoredIntelligenceHandlers, ResolveAccountContext, } from './create-adcp-server';
|
|
58
58
|
export { DEFAULT_REPORTING_CAPABILITIES } from './product-defaults';
|
|
59
59
|
export { isSandboxRequest, mergeSeededProductsIntoResponse, filterValidSeededProducts, filterValidSeededCreatives, filterValidSeededMediaBuys, filterValidSeededAccounts, filterValidSeededAccountFinancials, filterValidSeededCreativeFormats, mergeSeededCreativesIntoResponse, mergeSeededMediaBuysIntoResponse, mergeSeededAccountsIntoResponse, mergeSeededCreativeFormatsIntoResponse, pickSeededAccountFinancialsForRequest, replaceAccountFinancialsIfSeeded, bridgeFromTestControllerStore, bridgeFromSessionStore, } from './test-controller-bridge';
|
|
60
60
|
export type { TestControllerBridge, TestControllerBridgeContext, BridgeFromSessionStoreOptions, SeededCreative, SeededMediaBuy, SeededAccountFinancials, } from './test-controller-bridge';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/server/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/server/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/lib/server/index.ts"],"sourcesContent":["export { adcpError } from './errors';\nexport type { AdcpErrorOptions, AdcpErrorPayload, AdcpErrorResponse } from './errors';\n\nexport { normalizeError, normalizeErrors } from './normalize-errors';\nexport type { NormalizedError } from './normalize-errors';\n\nexport { pickSafeDetails } from './pick-safe-details';\nexport type { PickSafeDetailsOptions } from './pick-safe-details';\n\nexport { wrapEnvelope } from './wrap-envelope';\nexport type { WrapEnvelopeOptions } from './wrap-envelope';\n\nexport {\n ERROR_ENVELOPE_FIELD_ALLOWLIST,\n DEFAULT_ERROR_ENVELOPE_FIELDS,\n ADCP_ERROR_FIELD_ALLOWLIST,\n CONFLICT_ADCP_ERROR_ALLOWLIST,\n} from './envelope-allowlist';\n\nexport { scanArgsForCredentials, DEFAULT_CREDENTIAL_PATTERNS } from './credential-policy';\nexport type {\n CredentialPolicy,\n CredentialPolicyMode,\n CredentialPolicyConfig,\n CredentialPatternsConfig,\n} from './credential-policy';\n\nexport { createDynamicRegistry } from './dynamic-registry';\nexport type {\n DynamicRegistry,\n DynamicRegistryConfig,\n DynamicRegistryRegisterOptions,\n PendingRegistries,\n RegistryShape,\n} from './dynamic-registry';\n\nexport { defineOperationalPlatform } from './operational-platform';\nexport type { OperationalPlatform, OperationalContext } from './operational-platform';\n\nexport { pickWireSpecFields, scrubExtensions, WIRE_SPEC_FIELDS } from './wire-safe';\nexport type { WireSafe, WireSpecRequestName, ScrubExtensionsOptions } from './wire-safe';\nexport type { RequireCacheScopeWhenProducts, ServerPayload } from '../types/server-payload';\nexport type {\n ActivateSignalPayload,\n AcquireRightsAcquiredPayload,\n AcquireRightsPayload,\n AcquireRightsPendingApprovalPayload,\n AcquireRightsRejectedPayload,\n BuildCreativeMultiPayload,\n BuildCreativePayload,\n CalibrateContentPayload,\n CheckGovernancePayload,\n CreateCollectionListPayload,\n CreateContentStandardsPayload,\n CreateMediaBuyPayload,\n CreatePropertyListPayload,\n CreativeApprovalPayload,\n CreativeApprovedPayload,\n CreativePendingReviewPayload,\n CreativeRejectedPayload,\n DeleteCollectionListPayload,\n DeletePropertyListPayload,\n GetAccountFinancialsPayload,\n GetAccountFinancialsSuccessPayload,\n GetAdCPCapabilitiesPayload,\n GetBrandIdentityPayload,\n GetCollectionListPayload,\n GetContentStandardsPayload,\n GetCreativeDeliveryPayload,\n GetCreativeFeaturesPayload,\n GetMediaBuyArtifactsPayload,\n GetMediaBuyDeliveryPayload,\n GetMediaBuysPayload,\n GetPlanAuditLogsPayload,\n GetProductsPayload,\n GetPropertyListPayload,\n GetRightsPayload,\n GetRightsResponsePayload,\n GetSignalsPayload,\n ListAccountsPayload,\n ListCollectionListsPayload,\n ListContentStandardsPayload,\n ListCreativeFormatsPayload,\n ListCreativeFormatsResponsePayload,\n ListCreativeFormatsServerPayload,\n ListCreativesPayload,\n ListPropertyListsPayload,\n LogEventPayload,\n PreviewCreativePayload,\n ProvidePerformanceFeedbackPayload,\n ReportPlanOutcomePayload,\n ReportUsagePayload,\n SIGetOfferingPayload,\n SIInitiateSessionPayload,\n SISendMessagePayload,\n SITerminateSessionPayload,\n SyncAccountsPayload,\n SyncAccountsSuccessPayload,\n SyncAudiencesPayload,\n SyncCatalogsPayload,\n SyncCreativesErrorPayload,\n SyncCreativesPayload,\n SyncCreativesSuccessPayload,\n SyncEventSourcesPayload,\n SyncGovernancePayload,\n SyncGovernanceSuccessPayload,\n SyncPlansPayload,\n UpdateCollectionListPayload,\n UpdateContentStandardsPayload,\n UpdateMediaBuyPayload,\n UpdatePropertyListPayload,\n UpdateRightsPayload,\n ValidateContentDeliveryPayload,\n} from '../types/server-payload-aliases';\n\nexport { assertNoExampleTlds } from './example-tld-guard';\nexport type { AssertNoExampleTldsOptions } from './example-tld-guard';\n\nexport {\n capabilitiesResponse,\n productsResponse,\n mediaBuyResponse,\n deliveryResponse,\n listAccountsResponse,\n listCreativeFormatsResponse,\n updateMediaBuyResponse,\n getMediaBuysResponse,\n performanceFeedbackResponse,\n buildCreativeResponse,\n buildCreativeMultiResponse,\n previewCreativeResponse,\n creativeDeliveryResponse,\n listCreativesResponse,\n listPropertyListsResponse,\n listCollectionListsResponse,\n listContentStandardsResponse,\n getPlanAuditLogsResponse,\n syncCreativesResponse,\n getSignalsResponse,\n activateSignalResponse,\n cancelMediaBuyResponse,\n acquireRightsResponse,\n acquireRightsAcquired,\n acquireRightsPendingApproval,\n acquireRightsRejected,\n updateRightsResponse,\n updateRightsSuccess,\n creativeApprovalResponse,\n creativeApprovalApproved,\n creativeApprovalRejected,\n creativeApprovalPendingReview,\n creativeApprovalError,\n syncAccountsResponse,\n syncGovernanceResponse,\n reportUsageResponse,\n toStructuredContent,\n} from './responses';\nexport type { McpToolResponse } from './responses';\n\nexport { validActionsForStatus } from './media-buy-helpers';\nexport type { ValidAction, CancelMediaBuyInput } from './media-buy-helpers';\nexport { assertUpdateMediaBuyAllowed } from './media-buy-actions';\nexport type { AssertUpdateMediaBuyAllowedOptions } from './media-buy-actions';\n\nexport { createMediaBuyStore, DEFAULT_MEDIA_BUY_STORE_COLLECTION } from './media-buy-store';\nexport type {\n MediaBuyStore,\n CreateMediaBuyStoreOptions,\n CreateMediaBuyInputForStore,\n CreateMediaBuyResultForStore,\n UpdateMediaBuyInputForStore,\n GetMediaBuysResultForStore,\n} from './media-buy-store';\n\nexport {\n MEDIA_BUY_TRANSITIONS,\n CREATIVE_ASSET_TRANSITIONS,\n isLegalMediaBuyTransition,\n isLegalCreativeTransition,\n assertMediaBuyTransition,\n assertCreativeTransition,\n} from './state-machine';\n\nexport { getAccountMode, isSandboxOrMockAccount, assertSandboxAccount } from './account-mode';\nexport type { AccountMode } from './account-mode';\n\nexport {\n taskToolResponse,\n registerAdcpTaskTool,\n createTaskCapableServer,\n InMemoryTaskStore,\n isTerminal,\n} from './tasks';\nexport type {\n AdcpTaskToolConfig,\n TaskStore,\n TaskMessageQueue,\n CreateTaskOptions,\n ToolTaskHandler,\n CreateTaskRequestHandlerExtra,\n TaskRequestHandlerExtra,\n CreateTaskResult,\n GetTaskResult,\n Task,\n} from './tasks';\n\nexport {\n PostgresTaskStore,\n cleanupExpiredTasks,\n getMcpTasksMigration,\n MCP_TASKS_MIGRATION,\n} from './postgres-task-store';\nexport type { PgQueryable, PostgresTaskStoreOptions } from './postgres-task-store';\n\nexport {\n registerTestController,\n handleTestControllerRequest,\n TestControllerError,\n toMcpResponse,\n TOOL_INPUT_SHAPE,\n CONTROLLER_SCENARIOS,\n DISCOVERY_ARM_SCENARIOS,\n SEED_SCENARIOS,\n SEED_MESSAGES,\n SESSION_ENTRY_CAP,\n enforceMapCap,\n createSeedFixtureCache,\n} from './test-controller';\nexport type {\n TestControllerStore,\n TestControllerStoreFactory,\n TestControllerStoreOrFactory,\n ControllerScenario,\n SeedScenario,\n SeedFixtureCache,\n} from './test-controller';\n\nexport { serve, UnknownHostError, hostname, resolveHost } from './serve';\nexport type { ServeContext, ServeOptions, ProtectedResourceMetadata } from './serve';\n\nexport { createExpressAdapter } from './express-adapter';\nexport type { ExpressAdapter, ExpressAdapterOptions } from './express-adapter';\n\nexport {\n verifyApiKey,\n verifyBearer,\n anyOf,\n extractBearerToken,\n respondUnauthorized,\n signatureErrorCodeFromCause,\n AuthError,\n AUTH_NEEDS_RAW_BODY,\n tagAuthenticatorNeedsRawBody,\n authenticatorNeedsRawBody,\n AUTH_PRESENCE_GATED,\n tagAuthenticatorPresenceGated,\n isAuthenticatorPresenceGated,\n ADCP_SERVE_REQUEST_CONTEXT,\n getServeRequestContext,\n DEFAULT_JWT_ALGORITHMS,\n DEFAULT_JWT_CLOCK_TOLERANCE_SECONDS,\n} from './auth';\nexport type {\n Authenticator,\n AuthPrincipal,\n AuthResult,\n VerifyApiKeyOptions,\n VerifyBearerOptions,\n RespondUnauthorizedOptions,\n ServeRequestContext,\n} from './auth';\n\nexport { verifyIntrospection } from './auth-introspection';\nexport type {\n VerifyIntrospectionOptions,\n IntrospectionCacheOptions,\n IntrospectionResponse,\n} from './auth-introspection';\n\nexport {\n verifySignatureAsAuthenticator,\n requireSignatureWhenPresent,\n requireAuthenticatedOrSigned,\n mcpToolNameResolver,\n} from './auth-signature';\nexport type {\n VerifySignatureAsAuthenticatorOptions,\n RequireSignatureWhenPresentOptions,\n RequireAuthenticatedOrSignedOptions,\n} from './auth-signature';\n\nexport {\n InMemoryStateStore,\n StateError,\n PatchConflictError,\n DEFAULT_MAX_DOCUMENT_BYTES,\n SESSION_KEY_FIELD,\n createSessionedStore,\n scopedStore,\n patchWithRetry,\n isPutIfMatchConflict,\n validateCollection,\n validateId,\n validatePayloadSize,\n validateWrite,\n} from './state-store';\nexport type {\n AdcpStateStore,\n InMemoryStateStoreOptions,\n ListOptions,\n ListResult,\n PatchWithRetryOptions,\n PutIfMatchResult,\n StateErrorCode,\n VersionedDocument,\n} from './state-store';\n\nexport { PostgresStateStore, getAdcpStateMigration, ADCP_STATE_MIGRATION } from './postgres-state-store';\nexport type { PostgresStateStoreOptions } from './postgres-state-store';\n\nexport { structuredSerialize, structuredDeserialize } from './structured-serialize';\n\n// `createAdcpServer` is NOT re-exported from `@adcp/sdk/server` anymore —\n// LLMs scaffolding from skills consistently latched onto it as the canonical\n// entry point despite the @deprecated JSDoc. Removing the top-level export\n// forces new code to either reach for `createAdcpServerFromPlatform` (the v6\n// canonical) or import from `@adcp/sdk/server/legacy/v5` (mid-migration /\n// escape-hatch only). Breaking change: v5 adopters see a hard import error\n// and update their import path. The migration is one line; the LLM-output\n// quality win is significant. See `docs/migration-5.x-to-6.x.md`.\nexport {\n requireSessionKey,\n ADCP_PRE_TRANSPORT,\n ADCP_SIGNED_REQUESTS_STATE,\n ADCP_INSTRUCTIONS_FN,\n} from './create-adcp-server';\nexport type { SessionContext, OnInstructionsError, MaybePromise, BridgeMarker } from './create-adcp-server';\nexport type {\n AdcpServer,\n AdcpServerComplianceApi,\n AdcpServerTransport,\n AdcpTestRequest,\n AdcpTestToolsCallRequest,\n AdcpTestResponse,\n} from './adcp-server';\nexport type {\n AdcpServerConfig,\n WebhooksConfig,\n AdcpToolMap,\n AdcpServerToolName,\n AdcpCapabilitiesConfig,\n AdcpCapabilitiesOverrides,\n AdcpCustomToolConfig,\n AdcpLogger,\n SignedRequestsConfig,\n AdcpPreTransport,\n AdcpSignedRequestsState,\n HandlerContext,\n SessionKeyContext,\n MediaBuyHandlers,\n SignalsHandlers,\n CreativeHandlers,\n GovernanceHandlers,\n AccountHandlers,\n EventTrackingHandlers,\n SponsoredIntelligenceHandlers,\n ResolveAccountContext,\n} from './create-adcp-server';\n\nexport { DEFAULT_REPORTING_CAPABILITIES } from './product-defaults';\n\nexport {\n isSandboxRequest,\n mergeSeededProductsIntoResponse,\n filterValidSeededProducts,\n filterValidSeededCreatives,\n filterValidSeededMediaBuys,\n filterValidSeededAccounts,\n filterValidSeededAccountFinancials,\n filterValidSeededCreativeFormats,\n mergeSeededCreativesIntoResponse,\n mergeSeededMediaBuysIntoResponse,\n mergeSeededAccountsIntoResponse,\n mergeSeededCreativeFormatsIntoResponse,\n pickSeededAccountFinancialsForRequest,\n replaceAccountFinancialsIfSeeded,\n bridgeFromTestControllerStore,\n bridgeFromSessionStore,\n} from './test-controller-bridge';\nexport type {\n TestControllerBridge,\n TestControllerBridgeContext,\n BridgeFromSessionStoreOptions,\n SeededCreative,\n SeededMediaBuy,\n SeededAccountFinancials,\n} from './test-controller-bridge';\n\nexport {\n createIdempotencyStore,\n probeIdempotencyStore,\n memoryBackend,\n pgBackend,\n getIdempotencyMigration,\n IDEMPOTENCY_MIGRATION,\n cleanupExpiredIdempotency,\n redisBackend,\n createLazyBackend,\n hashPayload,\n} from './idempotency';\nexport type {\n IdempotencyStore,\n IdempotencyStoreConfig,\n IdempotencyBackend,\n IdempotencyCacheEntry,\n IdempotencyCheckResult,\n MemoryBackendOptions,\n PgBackendOptions,\n RedisBackendOptions,\n RedisBackendClient,\n RedisLikeClient,\n LazyBackendFactory,\n LazyBackendOptions,\n} from './idempotency';\n\nexport { createA2AAdapter, A2AInvocationError } from './a2a-adapter';\nexport type {\n A2AAdapter,\n A2AAdapterOptions,\n A2AAgentCardOverrides,\n A2AMountOptions,\n ExpressAppLike,\n} from './a2a-adapter';\n\nexport { createWebhookEmitter, memoryWebhookKeyStore } from './webhook-emitter';\nexport type {\n WebhookEmitter,\n WebhookEmitterOptions,\n WebhookEmitParams,\n WebhookEmitResult,\n WebhookEmitAttempt,\n WebhookEmitAttemptResult,\n WebhookIdempotencyKeyStore,\n WebhookRetryOptions,\n WebhookAuthentication,\n} from './webhook-emitter';\nexport type { SigningProvider } from '../signing/provider';\n\nexport { createPinAndBindFetch, WEBHOOK_SSRF_POLICY, LOOPBACK_OK_WEBHOOK_SSRF_POLICY } from './pin-and-bind-fetch';\nexport type { PinAndBindFetchOptions, DnsLookupAll } from './pin-and-bind-fetch';\n\nexport { checkGovernance, governanceDeniedError } from './governance';\nexport type {\n CheckGovernanceOptions,\n GovernanceCallResult,\n GovernanceApproved,\n GovernanceDenied,\n GovernanceConditions,\n} from './governance';\n\nexport {\n clearDefaultResolvedListCache,\n createResolvedListCache,\n DEFAULT_RESOLVE_LIST_PAGE_SIZE,\n defaultResolvedListCache,\n resolvePropertyList,\n resolveCollectionList,\n resolvedListCacheKey,\n matchesPropertyList,\n matchesCollectionList,\n} from './targeting-helpers';\nexport type {\n ResolvedListCache,\n ResolvedListCacheEntry,\n ResolvedListCacheValue,\n ResolvedListKind,\n ResolvedPropertyList,\n ResolvedCollectionList,\n ResolvedCollection,\n ResolveListCallTool,\n ResolveListOptions,\n} from './targeting-helpers';\n\n// ---------------------------------------------------------------------------\n// Platform-shaped server entry point (recommended for new agents)\n// ---------------------------------------------------------------------------\n//\n// `createAdcpServerFromPlatform` wraps `createAdcpServer` (the lower-level\n// handler-bag entry above) with compile-time specialism enforcement\n// (`RequiredPlatformsFor<S>`), capability projection, idempotency wiring,\n// async tasks, status normalization, multi-tenant routing, and webhook\n// auto-emit. Adopters declare a typed `DecisioningPlatform` per-specialism\n// and the framework wires the rest. See `docs/migration-5.x-to-6.x.md`\n// and `skills/build-decisioning-platform/` for the full walkthrough.\n//\n// Both `createAdcpServer` and `createAdcpServerFromPlatform` live on the\n// same import path so adopters discover them as siblings; pick the\n// function shape that matches your agent. The platform path internally\n// builds an `AdcpServerConfig` and calls `createAdcpServer` — they're\n// not adjacent surfaces, they're parent-child layers of the same SDK.\n//\n// **Pin to v5 long-term?** Import from `@adcp/sdk/server/legacy/v5`\n// instead. The subpath is the stable home for the v5 handler-bag\n// constructor; the top-level re-export here may be removed in a\n// future major. New code should not pin against `legacy/v5` either —\n// reach for `createAdcpServerFromPlatform` first.\nexport * from './decisioning';\n\n// ---------------------------------------------------------------------------\n// Ctx-metadata store — opaque-blob round-trip for adapter-internal state\n// ---------------------------------------------------------------------------\n//\n// Publishers attach platform-specific opaque blobs to any returned resource\n// (product, media_buy, package, creative, audience, signal, rights_grant);\n// the framework persists by `(account_id, kind, id)`, strips from buyer-\n// facing wire payloads, threads back into the publisher's request context\n// on subsequent calls referencing the same resource ID. See\n// `docs/proposals/decisioning-platform-v6-1-ctx-metadata.md`.\nexport {\n createCtxMetadataStore,\n memoryCtxMetadataStore,\n pgCtxMetadataStore,\n redisCtxMetadataStore,\n getCtxMetadataMigration,\n cleanupExpiredCtxMetadata,\n CTX_METADATA_MIGRATION,\n CtxMetadataValidationError,\n ADCP_INTERNAL_TAG,\n DEFAULT_MAX_VALUE_BYTES,\n MAX_TTL_SECONDS,\n stripCtxMetadata,\n hasCtxMetadata,\n stripImplementationConfig,\n hasImplementationConfig,\n ctxMetadataResultKey,\n scopeCtxMetadataKey,\n} from './ctx-metadata';\nexport type {\n CtxMetadataStore,\n CtxMetadataStoreConfig,\n CtxMetadataBackend,\n CtxMetadataEntry,\n CtxMetadataRef,\n ResourceKind as CtxMetadataResourceKind,\n MemoryCtxMetadataStoreOptions,\n PgCtxMetadataBackendOptions,\n RedisCtxMetadataBackendOptions,\n CtxMetadataRedisBackendClient,\n CtxMetadataRedisLikeClient,\n WireShape,\n} from './ctx-metadata';\n\nexport { createTranslationMap, createUpstreamHttpClient } from './upstream-helpers';\nexport type {\n TranslationMap,\n UpstreamAuth,\n AuthContext,\n UpstreamCallOptions,\n UpstreamHttpClientOptions,\n UpstreamHttpClient,\n UpstreamHttpResult,\n} from './upstream-helpers';\n\n// ---------------------------------------------------------------------------\n// Server-side adapters\n// ---------------------------------------------------------------------------\nexport {\n InMemoryImplicitAccountStore,\n defaultImplicitKeyFn,\n type ImplicitAccountStoreOptions,\n} from '../adapters/implicit-account-store';\n\nexport {\n createOAuthPassthroughResolver,\n type OAuthPassthroughResolverOptions,\n} from '../adapters/oauth-passthrough-resolver';\n\nexport { createRosterAccountStore, type RosterAccountStoreOptions } from '../adapters/roster-account-store';\n\nexport { createDerivedAccountStore, type DerivedAccountStoreOptions } from '../adapters/derived-account-store';\n\n// ---------------------------------------------------------------------------\n// Socket Mode — outbound WebSocket bridge for adopter dev environments\n// ---------------------------------------------------------------------------\nexport {\n ConformanceClient,\n WebSocketTransport,\n type ConformanceClientOptions,\n type ConformanceStatus,\n} from './socket-mode';\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAA0B;AAG1B,8BAAgD;AAGhD,+BAAgC;AAGhC,2BAA6B;AAG7B,gCAKO;AAEP,+BAAoE;AAQpE,8BAAsC;AAStC,kCAA0C;AAG1C,uBAAsE;AA4EtE,+BAAoC;AAGpC,uBAsCO;AAGP,+BAAsC;AAEtC,+BAA4C;AAG5C,6BAAwE;AAUxE,2BAOO;AAEP,0BAA6E;AAG7E,mBAMO;AAcP,iCAKO;AAGP,6BAaO;AAUP,mBAA+D;AAG/D,6BAAqC;AAGrC,kBAkBO;AAWP,gCAAoC;AAOpC,4BAKO;AAOP,yBAcO;AAYP,kCAAgF;AAGhF,kCAA2D;AAU3D,gCAKO;AAkCP,8BAA+C;AAE/C,oCAiBO;AAUP,yBAWO;AAgBP,yBAAqD;AASrD,6BAA4D;AAc5D,gCAA4F;AAG5F,wBAAuD;AASvD,+BAUO;AAoCP,2BAAc,0BA1fd;AAsgBA,0BAkBO;AAgBP,8BAA+D;AAc/D,oCAIO;AAEP,wCAGO;AAEP,kCAAyE;AAEzE,mCAA2E;AAK3E,yBAKO;","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../../src/lib/server/index.ts"],"sourcesContent":["export { adcpError } from './errors';\nexport type { AdcpErrorOptions, AdcpErrorPayload, AdcpErrorResponse } from './errors';\n\nexport { normalizeError, normalizeErrors } from './normalize-errors';\nexport type { NormalizedError } from './normalize-errors';\n\nexport { pickSafeDetails } from './pick-safe-details';\nexport type { PickSafeDetailsOptions } from './pick-safe-details';\n\nexport { wrapEnvelope } from './wrap-envelope';\nexport type { WrapEnvelopeOptions } from './wrap-envelope';\n\nexport {\n ERROR_ENVELOPE_FIELD_ALLOWLIST,\n DEFAULT_ERROR_ENVELOPE_FIELDS,\n ADCP_ERROR_FIELD_ALLOWLIST,\n CONFLICT_ADCP_ERROR_ALLOWLIST,\n} from './envelope-allowlist';\n\nexport { scanArgsForCredentials, DEFAULT_CREDENTIAL_PATTERNS } from './credential-policy';\nexport type {\n CredentialPolicy,\n CredentialPolicyMode,\n CredentialPolicyConfig,\n CredentialPatternsConfig,\n} from './credential-policy';\n\nexport { createDynamicRegistry } from './dynamic-registry';\nexport type {\n DynamicRegistry,\n DynamicRegistryConfig,\n DynamicRegistryRegisterOptions,\n PendingRegistries,\n RegistryShape,\n} from './dynamic-registry';\n\nexport { defineOperationalPlatform } from './operational-platform';\nexport type { OperationalPlatform, OperationalContext } from './operational-platform';\n\nexport { pickWireSpecFields, scrubExtensions, WIRE_SPEC_FIELDS } from './wire-safe';\nexport type { WireSafe, WireSpecRequestName, ScrubExtensionsOptions } from './wire-safe';\nexport type { RequireCacheScopeWhenProducts, ServerPayload } from '../types/server-payload';\nexport type {\n ActivateSignalPayload,\n AcquireRightsAcquiredPayload,\n AcquireRightsPayload,\n AcquireRightsPendingApprovalPayload,\n AcquireRightsRejectedPayload,\n BuildCreativeMultiPayload,\n BuildCreativePayload,\n CalibrateContentPayload,\n CheckGovernancePayload,\n CreateCollectionListPayload,\n CreateContentStandardsPayload,\n CreateMediaBuyPayload,\n CreatePropertyListPayload,\n CreativeApprovalPayload,\n CreativeApprovedPayload,\n CreativePendingReviewPayload,\n CreativeRejectedPayload,\n DeleteCollectionListPayload,\n DeletePropertyListPayload,\n GetAccountFinancialsPayload,\n GetAccountFinancialsSuccessPayload,\n GetAdCPCapabilitiesPayload,\n GetBrandIdentityPayload,\n GetCollectionListPayload,\n GetContentStandardsPayload,\n GetCreativeDeliveryPayload,\n GetCreativeFeaturesPayload,\n GetMediaBuyArtifactsPayload,\n GetMediaBuyDeliveryPayload,\n GetMediaBuysPayload,\n GetPlanAuditLogsPayload,\n GetProductsPayload,\n GetPropertyListPayload,\n GetRightsPayload,\n GetRightsResponsePayload,\n GetSignalsPayload,\n ListAccountsPayload,\n ListCollectionListsPayload,\n ListContentStandardsPayload,\n ListCreativeFormatsPayload,\n ListCreativeFormatsResponsePayload,\n ListCreativeFormatsServerPayload,\n ListCreativesPayload,\n ListPropertyListsPayload,\n LogEventPayload,\n PreviewCreativePayload,\n ProvidePerformanceFeedbackPayload,\n ReportPlanOutcomePayload,\n ReportUsagePayload,\n SIGetOfferingPayload,\n SIInitiateSessionPayload,\n SISendMessagePayload,\n SITerminateSessionPayload,\n SyncAccountsPayload,\n SyncAccountsSuccessPayload,\n SyncAudiencesPayload,\n SyncCatalogsPayload,\n SyncCreativesErrorPayload,\n SyncCreativesPayload,\n SyncCreativesSuccessPayload,\n SyncEventSourcesPayload,\n SyncGovernancePayload,\n SyncGovernanceSuccessPayload,\n SyncPlansPayload,\n UpdateCollectionListPayload,\n UpdateContentStandardsPayload,\n UpdateMediaBuyPayload,\n UpdatePropertyListPayload,\n UpdateRightsPayload,\n ValidateContentDeliveryPayload,\n} from '../types/server-payload-aliases';\n\nexport { assertNoExampleTlds } from './example-tld-guard';\nexport type { AssertNoExampleTldsOptions } from './example-tld-guard';\n\nexport {\n capabilitiesResponse,\n productsResponse,\n mediaBuyResponse,\n deliveryResponse,\n listAccountsResponse,\n listCreativeFormatsResponse,\n updateMediaBuyResponse,\n getMediaBuysResponse,\n performanceFeedbackResponse,\n buildCreativeResponse,\n buildCreativeMultiResponse,\n previewCreativeResponse,\n creativeDeliveryResponse,\n listCreativesResponse,\n listPropertyListsResponse,\n listCollectionListsResponse,\n listContentStandardsResponse,\n getPlanAuditLogsResponse,\n syncCreativesResponse,\n getSignalsResponse,\n activateSignalResponse,\n cancelMediaBuyResponse,\n acquireRightsResponse,\n acquireRightsAcquired,\n acquireRightsPendingApproval,\n acquireRightsRejected,\n updateRightsResponse,\n updateRightsSuccess,\n creativeApprovalResponse,\n creativeApprovalApproved,\n creativeApprovalRejected,\n creativeApprovalPendingReview,\n creativeApprovalError,\n syncAccountsResponse,\n syncGovernanceResponse,\n reportUsageResponse,\n toStructuredContent,\n} from './responses';\nexport type { McpToolResponse } from './responses';\n\nexport { validActionsForStatus } from './media-buy-helpers';\nexport type { ValidAction, CancelMediaBuyInput } from './media-buy-helpers';\nexport { assertUpdateMediaBuyAllowed } from './media-buy-actions';\nexport type { AssertUpdateMediaBuyAllowedOptions } from './media-buy-actions';\n\nexport { createMediaBuyStore, DEFAULT_MEDIA_BUY_STORE_COLLECTION } from './media-buy-store';\nexport type {\n MediaBuyStore,\n CreateMediaBuyStoreOptions,\n CreateMediaBuyInputForStore,\n CreateMediaBuyResultForStore,\n UpdateMediaBuyInputForStore,\n GetMediaBuysResultForStore,\n} from './media-buy-store';\n\nexport {\n MEDIA_BUY_TRANSITIONS,\n CREATIVE_ASSET_TRANSITIONS,\n isLegalMediaBuyTransition,\n isLegalCreativeTransition,\n assertMediaBuyTransition,\n assertCreativeTransition,\n} from './state-machine';\n\nexport { getAccountMode, isSandboxOrMockAccount, assertSandboxAccount } from './account-mode';\nexport type { AccountMode } from './account-mode';\n\nexport {\n taskToolResponse,\n registerAdcpTaskTool,\n createTaskCapableServer,\n InMemoryTaskStore,\n isTerminal,\n} from './tasks';\nexport type {\n AdcpTaskToolConfig,\n TaskStore,\n TaskMessageQueue,\n CreateTaskOptions,\n ToolTaskHandler,\n CreateTaskRequestHandlerExtra,\n TaskRequestHandlerExtra,\n CreateTaskResult,\n GetTaskResult,\n Task,\n} from './tasks';\n\nexport {\n PostgresTaskStore,\n cleanupExpiredTasks,\n getMcpTasksMigration,\n MCP_TASKS_MIGRATION,\n} from './postgres-task-store';\nexport type { PgQueryable, PostgresTaskStoreOptions } from './postgres-task-store';\n\nexport {\n registerTestController,\n handleTestControllerRequest,\n TestControllerError,\n toMcpResponse,\n TOOL_INPUT_SHAPE,\n CONTROLLER_SCENARIOS,\n DISCOVERY_ARM_SCENARIOS,\n SEED_SCENARIOS,\n SEED_MESSAGES,\n SESSION_ENTRY_CAP,\n enforceMapCap,\n createSeedFixtureCache,\n} from './test-controller';\nexport type {\n TestControllerStore,\n TestControllerStoreFactory,\n TestControllerStoreOrFactory,\n ControllerScenario,\n SeedScenario,\n SeedFixtureCache,\n} from './test-controller';\n\nexport { serve, UnknownHostError, hostname, resolveHost } from './serve';\nexport type { ServeContext, ServeOptions, ProtectedResourceMetadata } from './serve';\n\nexport { createExpressAdapter } from './express-adapter';\nexport type { ExpressAdapter, ExpressAdapterOptions } from './express-adapter';\n\nexport {\n verifyApiKey,\n verifyBearer,\n anyOf,\n extractBearerToken,\n respondUnauthorized,\n signatureErrorCodeFromCause,\n AuthError,\n AUTH_NEEDS_RAW_BODY,\n tagAuthenticatorNeedsRawBody,\n authenticatorNeedsRawBody,\n AUTH_PRESENCE_GATED,\n tagAuthenticatorPresenceGated,\n isAuthenticatorPresenceGated,\n ADCP_SERVE_REQUEST_CONTEXT,\n getServeRequestContext,\n DEFAULT_JWT_ALGORITHMS,\n DEFAULT_JWT_CLOCK_TOLERANCE_SECONDS,\n} from './auth';\nexport type {\n Authenticator,\n AuthPrincipal,\n AuthResult,\n VerifyApiKeyOptions,\n VerifyBearerOptions,\n RespondUnauthorizedOptions,\n ServeRequestContext,\n} from './auth';\n\nexport { verifyIntrospection } from './auth-introspection';\nexport type {\n VerifyIntrospectionOptions,\n IntrospectionCacheOptions,\n IntrospectionResponse,\n} from './auth-introspection';\n\nexport {\n verifySignatureAsAuthenticator,\n requireSignatureWhenPresent,\n requireAuthenticatedOrSigned,\n mcpToolNameResolver,\n} from './auth-signature';\nexport type {\n VerifySignatureAsAuthenticatorOptions,\n RequireSignatureWhenPresentOptions,\n RequireAuthenticatedOrSignedOptions,\n} from './auth-signature';\n\nexport {\n InMemoryStateStore,\n StateError,\n PatchConflictError,\n DEFAULT_MAX_DOCUMENT_BYTES,\n SESSION_KEY_FIELD,\n createSessionedStore,\n scopedStore,\n patchWithRetry,\n isPutIfMatchConflict,\n validateCollection,\n validateId,\n validatePayloadSize,\n validateWrite,\n} from './state-store';\nexport type {\n AdcpStateStore,\n InMemoryStateStoreOptions,\n ListOptions,\n ListResult,\n PatchWithRetryOptions,\n PutIfMatchResult,\n StateErrorCode,\n VersionedDocument,\n} from './state-store';\n\nexport { PostgresStateStore, getAdcpStateMigration, ADCP_STATE_MIGRATION } from './postgres-state-store';\nexport type { PostgresStateStoreOptions } from './postgres-state-store';\n\nexport { structuredSerialize, structuredDeserialize } from './structured-serialize';\n\n// `createAdcpServer` is NOT re-exported from `@adcp/sdk/server` anymore —\n// LLMs scaffolding from skills consistently latched onto it as the canonical\n// entry point despite the @deprecated JSDoc. Removing the top-level export\n// forces new code to either reach for `createAdcpServerFromPlatform` (the v6\n// canonical) or import from `@adcp/sdk/server/legacy/v5` (mid-migration /\n// escape-hatch only). Breaking change: v5 adopters see a hard import error\n// and update their import path. The migration is one line; the LLM-output\n// quality win is significant. See `docs/migration-5.x-to-6.x.md`.\nexport {\n requireSessionKey,\n ADCP_PRE_TRANSPORT,\n ADCP_SIGNED_REQUESTS_STATE,\n ADCP_INSTRUCTIONS_FN,\n} from './create-adcp-server';\nexport type { SessionContext, OnInstructionsError, MaybePromise, BridgeMarker } from './create-adcp-server';\nexport type {\n AdcpServer,\n AdcpServerComplianceApi,\n AdcpServerTransport,\n AdcpTestRequest,\n AdcpTestToolsCallRequest,\n AdcpTestResponse,\n} from './adcp-server';\nexport type {\n AdcpServerConfig,\n WebhooksConfig,\n AdcpToolMap,\n AdcpServerToolName,\n AdcpCapabilitiesConfig,\n AdcpCapabilitiesOverrides,\n AdcpCustomToolConfig,\n McpAppUiMeta,\n McpAppMeta,\n AdcpLogger,\n SignedRequestsConfig,\n AdcpPreTransport,\n AdcpSignedRequestsState,\n HandlerContext,\n SessionKeyContext,\n MediaBuyHandlers,\n SignalsHandlers,\n CreativeHandlers,\n GovernanceHandlers,\n AccountHandlers,\n EventTrackingHandlers,\n SponsoredIntelligenceHandlers,\n ResolveAccountContext,\n} from './create-adcp-server';\n\nexport { DEFAULT_REPORTING_CAPABILITIES } from './product-defaults';\n\nexport {\n isSandboxRequest,\n mergeSeededProductsIntoResponse,\n filterValidSeededProducts,\n filterValidSeededCreatives,\n filterValidSeededMediaBuys,\n filterValidSeededAccounts,\n filterValidSeededAccountFinancials,\n filterValidSeededCreativeFormats,\n mergeSeededCreativesIntoResponse,\n mergeSeededMediaBuysIntoResponse,\n mergeSeededAccountsIntoResponse,\n mergeSeededCreativeFormatsIntoResponse,\n pickSeededAccountFinancialsForRequest,\n replaceAccountFinancialsIfSeeded,\n bridgeFromTestControllerStore,\n bridgeFromSessionStore,\n} from './test-controller-bridge';\nexport type {\n TestControllerBridge,\n TestControllerBridgeContext,\n BridgeFromSessionStoreOptions,\n SeededCreative,\n SeededMediaBuy,\n SeededAccountFinancials,\n} from './test-controller-bridge';\n\nexport {\n createIdempotencyStore,\n probeIdempotencyStore,\n memoryBackend,\n pgBackend,\n getIdempotencyMigration,\n IDEMPOTENCY_MIGRATION,\n cleanupExpiredIdempotency,\n redisBackend,\n createLazyBackend,\n hashPayload,\n} from './idempotency';\nexport type {\n IdempotencyStore,\n IdempotencyStoreConfig,\n IdempotencyBackend,\n IdempotencyCacheEntry,\n IdempotencyCheckResult,\n MemoryBackendOptions,\n PgBackendOptions,\n RedisBackendOptions,\n RedisBackendClient,\n RedisLikeClient,\n LazyBackendFactory,\n LazyBackendOptions,\n} from './idempotency';\n\nexport { createA2AAdapter, A2AInvocationError } from './a2a-adapter';\nexport type {\n A2AAdapter,\n A2AAdapterOptions,\n A2AAgentCardOverrides,\n A2AMountOptions,\n ExpressAppLike,\n} from './a2a-adapter';\n\nexport { createWebhookEmitter, memoryWebhookKeyStore } from './webhook-emitter';\nexport type {\n WebhookEmitter,\n WebhookEmitterOptions,\n WebhookEmitParams,\n WebhookEmitResult,\n WebhookEmitAttempt,\n WebhookEmitAttemptResult,\n WebhookIdempotencyKeyStore,\n WebhookRetryOptions,\n WebhookAuthentication,\n} from './webhook-emitter';\nexport type { SigningProvider } from '../signing/provider';\n\nexport { createPinAndBindFetch, WEBHOOK_SSRF_POLICY, LOOPBACK_OK_WEBHOOK_SSRF_POLICY } from './pin-and-bind-fetch';\nexport type { PinAndBindFetchOptions, DnsLookupAll } from './pin-and-bind-fetch';\n\nexport { checkGovernance, governanceDeniedError } from './governance';\nexport type {\n CheckGovernanceOptions,\n GovernanceCallResult,\n GovernanceApproved,\n GovernanceDenied,\n GovernanceConditions,\n} from './governance';\n\nexport {\n clearDefaultResolvedListCache,\n createResolvedListCache,\n DEFAULT_RESOLVE_LIST_PAGE_SIZE,\n defaultResolvedListCache,\n resolvePropertyList,\n resolveCollectionList,\n resolvedListCacheKey,\n matchesPropertyList,\n matchesCollectionList,\n} from './targeting-helpers';\nexport type {\n ResolvedListCache,\n ResolvedListCacheEntry,\n ResolvedListCacheValue,\n ResolvedListKind,\n ResolvedPropertyList,\n ResolvedCollectionList,\n ResolvedCollection,\n ResolveListCallTool,\n ResolveListOptions,\n} from './targeting-helpers';\n\n// ---------------------------------------------------------------------------\n// Platform-shaped server entry point (recommended for new agents)\n// ---------------------------------------------------------------------------\n//\n// `createAdcpServerFromPlatform` wraps `createAdcpServer` (the lower-level\n// handler-bag entry above) with compile-time specialism enforcement\n// (`RequiredPlatformsFor<S>`), capability projection, idempotency wiring,\n// async tasks, status normalization, multi-tenant routing, and webhook\n// auto-emit. Adopters declare a typed `DecisioningPlatform` per-specialism\n// and the framework wires the rest. See `docs/migration-5.x-to-6.x.md`\n// and `skills/build-decisioning-platform/` for the full walkthrough.\n//\n// Both `createAdcpServer` and `createAdcpServerFromPlatform` live on the\n// same import path so adopters discover them as siblings; pick the\n// function shape that matches your agent. The platform path internally\n// builds an `AdcpServerConfig` and calls `createAdcpServer` — they're\n// not adjacent surfaces, they're parent-child layers of the same SDK.\n//\n// **Pin to v5 long-term?** Import from `@adcp/sdk/server/legacy/v5`\n// instead. The subpath is the stable home for the v5 handler-bag\n// constructor; the top-level re-export here may be removed in a\n// future major. New code should not pin against `legacy/v5` either —\n// reach for `createAdcpServerFromPlatform` first.\nexport * from './decisioning';\n\n// ---------------------------------------------------------------------------\n// Ctx-metadata store — opaque-blob round-trip for adapter-internal state\n// ---------------------------------------------------------------------------\n//\n// Publishers attach platform-specific opaque blobs to any returned resource\n// (product, media_buy, package, creative, audience, signal, rights_grant);\n// the framework persists by `(account_id, kind, id)`, strips from buyer-\n// facing wire payloads, threads back into the publisher's request context\n// on subsequent calls referencing the same resource ID. See\n// `docs/proposals/decisioning-platform-v6-1-ctx-metadata.md`.\nexport {\n createCtxMetadataStore,\n memoryCtxMetadataStore,\n pgCtxMetadataStore,\n redisCtxMetadataStore,\n getCtxMetadataMigration,\n cleanupExpiredCtxMetadata,\n CTX_METADATA_MIGRATION,\n CtxMetadataValidationError,\n ADCP_INTERNAL_TAG,\n DEFAULT_MAX_VALUE_BYTES,\n MAX_TTL_SECONDS,\n stripCtxMetadata,\n hasCtxMetadata,\n stripImplementationConfig,\n hasImplementationConfig,\n ctxMetadataResultKey,\n scopeCtxMetadataKey,\n} from './ctx-metadata';\nexport type {\n CtxMetadataStore,\n CtxMetadataStoreConfig,\n CtxMetadataBackend,\n CtxMetadataEntry,\n CtxMetadataRef,\n ResourceKind as CtxMetadataResourceKind,\n MemoryCtxMetadataStoreOptions,\n PgCtxMetadataBackendOptions,\n RedisCtxMetadataBackendOptions,\n CtxMetadataRedisBackendClient,\n CtxMetadataRedisLikeClient,\n WireShape,\n} from './ctx-metadata';\n\nexport { createTranslationMap, createUpstreamHttpClient } from './upstream-helpers';\nexport type {\n TranslationMap,\n UpstreamAuth,\n AuthContext,\n UpstreamCallOptions,\n UpstreamHttpClientOptions,\n UpstreamHttpClient,\n UpstreamHttpResult,\n} from './upstream-helpers';\n\n// ---------------------------------------------------------------------------\n// Server-side adapters\n// ---------------------------------------------------------------------------\nexport {\n InMemoryImplicitAccountStore,\n defaultImplicitKeyFn,\n type ImplicitAccountStoreOptions,\n} from '../adapters/implicit-account-store';\n\nexport {\n createOAuthPassthroughResolver,\n type OAuthPassthroughResolverOptions,\n} from '../adapters/oauth-passthrough-resolver';\n\nexport { createRosterAccountStore, type RosterAccountStoreOptions } from '../adapters/roster-account-store';\n\nexport { createDerivedAccountStore, type DerivedAccountStoreOptions } from '../adapters/derived-account-store';\n\n// ---------------------------------------------------------------------------\n// Socket Mode — outbound WebSocket bridge for adopter dev environments\n// ---------------------------------------------------------------------------\nexport {\n ConformanceClient,\n WebSocketTransport,\n type ConformanceClientOptions,\n type ConformanceStatus,\n} from './socket-mode';\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAA0B;AAG1B,8BAAgD;AAGhD,+BAAgC;AAGhC,2BAA6B;AAG7B,gCAKO;AAEP,+BAAoE;AAQpE,8BAAsC;AAStC,kCAA0C;AAG1C,uBAAsE;AA4EtE,+BAAoC;AAGpC,uBAsCO;AAGP,+BAAsC;AAEtC,+BAA4C;AAG5C,6BAAwE;AAUxE,2BAOO;AAEP,0BAA6E;AAG7E,mBAMO;AAcP,iCAKO;AAGP,6BAaO;AAUP,mBAA+D;AAG/D,6BAAqC;AAGrC,kBAkBO;AAWP,gCAAoC;AAOpC,4BAKO;AAOP,yBAcO;AAYP,kCAAgF;AAGhF,kCAA2D;AAU3D,gCAKO;AAoCP,8BAA+C;AAE/C,oCAiBO;AAUP,yBAWO;AAgBP,yBAAqD;AASrD,6BAA4D;AAc5D,gCAA4F;AAG5F,wBAAuD;AASvD,+BAUO;AAoCP,2BAAc,0BA5fd;AAwgBA,0BAkBO;AAgBP,8BAA+D;AAc/D,oCAIO;AAEP,wCAGO;AAEP,kCAAyE;AAEzE,mCAA2E;AAK3E,yBAKO;","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 { adcpError } from "./errors.mjs";
|
|
8
2
|
import { normalizeError, normalizeErrors } from "./normalize-errors.mjs";
|
|
9
3
|
import { pickSafeDetails } from "./pick-safe-details.mjs";
|