@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/mock-server/sales-guaranteed/server.ts"],"sourcesContent":["import { createServer, type IncomingMessage, type ServerResponse } from 'node:http';\nimport { createHash, randomUUID } from 'node:crypto';\nimport {\n AD_UNITS,\n DEFAULT_API_KEY,\n NETWORKS,\n PRODUCTS,\n type MockAdUnit,\n type MockNetwork,\n type MockProduct,\n} from './seed-data';\nimport {\n createMockScenarioController,\n idempotencyKeyFromBody,\n stableFingerprint,\n writeCachedResponse,\n type MockScenarioHandle,\n} from '../scenario';\n\nexport interface BootOptions {\n port: number;\n apiKey?: string;\n networks?: MockNetwork[];\n adUnits?: MockAdUnit[];\n products?: MockProduct[];\n}\n\nexport interface BootResult {\n url: string;\n close: () => Promise<void>;\n scenario: MockScenarioHandle;\n}\n\ntype OrderStatus = 'draft' | 'pending_approval' | 'approved' | 'delivering' | 'completed' | 'canceled' | 'rejected';\ntype LineItemStatus = 'pending_creatives' | 'ready' | 'paused' | 'delivering' | 'completed';\ntype TaskStatus = 'submitted' | 'working' | 'completed' | 'rejected';\n\ninterface OrderState {\n order_id: string;\n network_code: string;\n name: string;\n status: OrderStatus;\n advertiser_id: string;\n currency: string;\n budget?: number;\n approval_task_id?: string;\n rejection_reason?: string;\n /** Line-item children, keyed by line_item_id. */\n line_items: Map<string, LineItemState>;\n /** Conversions ingested via /conversions/ — count + dedup-key set. */\n conversions: { count: number; dedup_keys: Set<string>; total_value: number };\n body_fingerprint: string;\n created_at: string;\n updated_at: string;\n}\n\ninterface LineItemState {\n line_item_id: string;\n order_id: string;\n product_id: string;\n status: LineItemStatus;\n budget: number;\n ad_unit_targeting: string[];\n creative_ids: string[];\n body_fingerprint: string;\n created_at: string;\n}\n\ninterface CreativeState {\n creative_id: string;\n network_code: string;\n name: string;\n format_id: string;\n advertiser_id: string;\n snippet?: string;\n status: 'active' | 'paused' | 'archived';\n body_fingerprint: string;\n created_at: string;\n}\n\ninterface TaskState {\n task_id: string;\n order_id: string;\n status: TaskStatus;\n /** Number of times the task has been polled. Used to auto-promote\n * `submitted → working → completed` so adapters exercise the polling\n * pattern without the matrix run dragging. */\n poll_count: number;\n result?: { outcome: 'approved' | 'rejected'; reviewer_note: string };\n created_at: string;\n updated_at: string;\n}\n\ntype ProposalStatus = 'draft' | 'committed' | 'expired' | 'rejected';\n\n/**\n * Upstream proposal record. Proposals are the lifecycle-aware shape on\n * top of products: `draft` (indicative pricing, no inventory hold) →\n * `committed` (locked pricing + reserved inventory until `expires_at`).\n *\n * Mirrors GAM's `Proposal` shape: a sellable plan that an adopter\n * curates from the product catalog, refines with the buyer, and then\n * finalizes (locking pricing + reserving inventory before the buyer\n * commits with `create_media_buy`).\n */\ninterface ProposalState {\n proposal_id: string;\n network_code: string;\n status: ProposalStatus;\n brief?: string;\n /** Product allocations the proposal recommends. Indicative pricing\n * pre-finalize; locked + line-item-template-allocated post-finalize. */\n allocations: Array<{\n product_id: string;\n allocation_percentage: number;\n indicative_cpm: number;\n locked_cpm?: number;\n upstream_line_item_template_id?: string;\n }>;\n total_budget?: { amount: number; currency: string };\n /** Set on finalize; inventory hold deadline. */\n expires_at?: string;\n created_at: string;\n updated_at: string;\n}\n\nexport async function bootSalesGuaranteed(options: BootOptions): Promise<BootResult> {\n const apiKey = options.apiKey ?? DEFAULT_API_KEY;\n const networks = options.networks ?? NETWORKS;\n const adUnits = options.adUnits ?? AD_UNITS;\n const products = options.products ?? PRODUCTS;\n\n const orders = new Map<string, OrderState>();\n const creatives = new Map<string, CreativeState>();\n const tasks = new Map<string, TaskState>();\n const proposals = new Map<string, ProposalState>();\n // Idempotency table — keyed `<network_code>::<resource_kind>::<client_request_id>`.\n const idempotency = new Map<string, string>();\n\n // Traffic counters keyed by `<METHOD> <route-template>`. Harness queries\n // `GET /_debug/traffic` after the storyboard run and asserts headline\n // routes were hit ≥1. Façade adapters that skip the upstream produce zero\n // counters and fail the assertion. adcontextprotocol/adcp-client#1225.\n const traffic = new Map<string, number>();\n const bump = (routeTemplate: string): void => {\n traffic.set(routeTemplate, (traffic.get(routeTemplate) ?? 0) + 1);\n };\n const scenario = createMockScenarioController({\n specialism: 'sales-guaranteed',\n snapshot: () => ({\n orders: orders.size,\n creatives: creatives.size,\n tasks: tasks.size,\n proposals: proposals.size,\n idempotency: idempotency.size,\n traffic: Object.fromEntries(traffic),\n }),\n reset: () => {\n orders.clear();\n creatives.clear();\n tasks.clear();\n proposals.clear();\n idempotency.clear();\n traffic.clear();\n },\n });\n\n const server = createServer((req, res) => {\n handleRequest(req, res).catch(err => {\n writeJson(res, 500, { code: 'internal_error', message: err?.message ?? 'unexpected error' });\n });\n });\n\n await new Promise<void>((resolve, reject) => {\n server.once('error', reject);\n server.listen(options.port, '127.0.0.1', () => {\n server.removeListener('error', reject);\n resolve();\n });\n });\n\n const addr = server.address();\n const boundPort = typeof addr === 'object' && addr ? addr.port : options.port;\n const url = `http://127.0.0.1:${boundPort}`;\n return {\n url,\n scenario: scenario.handle,\n close: () =>\n new Promise<void>((resolve, reject) => {\n server.close(err => (err ? reject(err) : resolve()));\n }),\n };\n\n async function handleRequest(req: IncomingMessage, res: ServerResponse): Promise<void> {\n const url = new URL(req.url ?? '/', 'http://127.0.0.1');\n const path = url.pathname;\n const method = req.method ?? 'GET';\n\n if (await scenario.handleControlRequest(req, res, method, path)) return;\n\n // Façade-detection traffic dump — harness-only, no auth required.\n if (method === 'GET' && path === '/_debug/traffic') {\n writeJson(res, 200, { traffic: Object.fromEntries(traffic) });\n return;\n }\n\n // Discovery endpoint — replaces the hardcoded principal-mapping table the\n // harness used to inline. Adapters resolve at runtime by querying with\n // the AdCP-side identifier they receive from buyers (`account.publisher`,\n // `account.brand.domain`). No auth required — discovery happens before\n // the agent has any network context. Issue #1225.\n if (method === 'GET' && path === '/_lookup/network') {\n bump('GET /_lookup/network');\n const adcpPublisher = url.searchParams.get('adcp_publisher');\n if (!adcpPublisher) {\n writeJson(res, 400, {\n code: 'invalid_request',\n message: 'adcp_publisher query parameter is required.',\n });\n return;\n }\n const match = networks.find(n => n.adcp_publisher === adcpPublisher);\n if (!match) {\n writeJson(res, 404, {\n code: 'network_not_found',\n message: `No upstream network registered for adcp_publisher=${adcpPublisher}.`,\n });\n return;\n }\n writeJson(res, 200, {\n adcp_publisher: match.adcp_publisher,\n network_code: match.network_code,\n display_name: match.display_name,\n });\n return;\n }\n\n const auth = req.headers['authorization'];\n if (!auth || !auth.startsWith('Bearer ') || auth.slice(7) !== apiKey) {\n writeJson(res, 401, { code: 'unauthorized', message: 'Missing or invalid bearer credential.' });\n return;\n }\n const networkHeader = req.headers['x-network-code'];\n const networkCode = Array.isArray(networkHeader) ? networkHeader[0] : networkHeader;\n if (!networkCode) {\n writeJson(res, 403, {\n code: 'network_required',\n message: 'X-Network-Code header is required on every request.',\n });\n return;\n }\n const network = networks.find(n => n.network_code === networkCode);\n if (!network) {\n writeJson(res, 403, { code: 'unknown_network', message: `Unknown network: ${networkCode}` });\n return;\n }\n\n if (await scenario.handleScriptedResponse(res, method, path, (m, p) => bump(`${m} ${p}`))) return;\n\n if (method === 'GET' && path === '/v1/inventory') {\n bump('GET /v1/inventory');\n return handleListInventory(network, res);\n }\n if (method === 'GET' && path === '/v1/products') {\n bump('GET /v1/products');\n return handleListProducts(url, network, res);\n }\n if (method === 'POST' && path === '/v1/forecast') {\n bump('POST /v1/forecast');\n return handleForecast(req, network, res);\n }\n if (method === 'POST' && path === '/v1/availability') {\n bump('POST /v1/availability');\n return handleAvailability(req, network, res);\n }\n if (method === 'GET' && path === '/v1/creatives') {\n bump('GET /v1/creatives');\n return handleListCreatives(network, res);\n }\n if (method === 'POST' && path === '/v1/creatives') {\n bump('POST /v1/creatives');\n return handleCreateCreative(req, network, res);\n }\n\n if (method === 'POST' && path === '/v1/proposals') {\n bump('POST /v1/proposals');\n return handleCreateProposal(req, network, res);\n }\n const proposalMatch = path.match(/^\\/v1\\/proposals\\/([^/]+)(\\/.*)?$/);\n if (proposalMatch && proposalMatch[1]) {\n const proposalId = decodeURIComponent(proposalMatch[1]);\n const subPath = proposalMatch[2] ?? '/';\n const proposal = proposals.get(proposalId);\n if (!proposal || proposal.network_code !== network.network_code) {\n writeJson(res, 404, { code: 'proposal_not_found', message: `Proposal ${proposalId} not found.` });\n return;\n }\n if (method === 'GET' && subPath === '/') {\n bump('GET /v1/proposals/{id}');\n return handleGetProposal(proposal, res);\n }\n if (method === 'POST' && subPath === '/refine') {\n bump('POST /v1/proposals/{id}/refine');\n return handleRefineProposal(req, proposal, res);\n }\n if (method === 'POST' && subPath === '/finalize') {\n bump('POST /v1/proposals/{id}/finalize');\n return handleFinalizeProposal(proposal, res);\n }\n }\n\n if (method === 'GET' && path === '/v1/orders') {\n bump('GET /v1/orders');\n return handleListOrders(network, res);\n }\n if (method === 'POST' && path === '/v1/orders') {\n bump('POST /v1/orders');\n return handleCreateOrder(req, network, res);\n }\n\n const orderMatch = path.match(/^\\/v1\\/orders\\/([^/]+)(\\/.*)?$/);\n if (orderMatch && orderMatch[1]) {\n const orderId = decodeURIComponent(orderMatch[1]);\n const subPath = orderMatch[2] ?? '/';\n const order = orders.get(orderId);\n if (!order || order.network_code !== network.network_code) {\n writeJson(res, 404, { code: 'order_not_found', message: `Order ${orderId} not found.` });\n return;\n }\n if (method === 'GET' && subPath === '/') {\n bump('GET /v1/orders/{id}');\n return handleGetOrder(order, res);\n }\n if (method === 'GET' && subPath === '/lineitems') {\n bump('GET /v1/orders/{id}/lineitems');\n return handleListLineItems(order, res);\n }\n if (method === 'POST' && subPath === '/lineitems') {\n bump('POST /v1/orders/{id}/lineitems');\n return handleCreateLineItem(req, order, res);\n }\n const liAttachMatch = subPath.match(/^\\/lineitems\\/([^/]+)\\/creative-attach$/);\n if (method === 'POST' && liAttachMatch && liAttachMatch[1]) {\n bump('POST /v1/orders/{id}/lineitems/{li}/creative-attach');\n return handleAttachCreative(req, order, decodeURIComponent(liAttachMatch[1]), res);\n }\n if (method === 'GET' && subPath === '/delivery') {\n bump('GET /v1/orders/{id}/delivery');\n return handleGetDelivery(order, res);\n }\n if (method === 'POST' && subPath === '/conversions') {\n bump('POST /v1/orders/{id}/conversions');\n return handleIngestConversions(req, order, res);\n }\n }\n\n const taskMatch = path.match(/^\\/v1\\/tasks\\/([^/]+)$/);\n if (method === 'GET' && taskMatch && taskMatch[1]) {\n bump('GET /v1/tasks/{id}');\n return handleGetTask(decodeURIComponent(taskMatch[1]), network, res);\n }\n\n writeJson(res, 404, { code: 'not_found', message: `No route for ${method} ${path}` });\n }\n\n // ────────────────────────────────────────────────────────────\n // Inventory + Products + Creatives\n // ────────────────────────────────────────────────────────────\n function handleListInventory(network: MockNetwork, res: ServerResponse): void {\n const visible = adUnits.filter(au => au.network_code === network.network_code);\n writeJson(res, 200, { ad_units: visible });\n }\n\n function handleListProducts(url: URL, network: MockNetwork, res: ServerResponse): void {\n let visible = products.filter(p => p.network_code === network.network_code);\n const deliveryType = url.searchParams.get('delivery_type');\n const channel = url.searchParams.get('channel');\n if (deliveryType) visible = visible.filter(p => p.delivery_type === deliveryType);\n if (channel) visible = visible.filter(p => p.channel === channel);\n\n // Per-query forecast embedding. When the caller passes any of\n // `targeting`, `flight_start`, `flight_end`, or `budget`, attach a\n // deterministic-seeded forecast keyed on those inputs so a single\n // get_products call surfaces both the catalog and the forecast curve\n // without a follow-up POST /v1/forecast. Mirrors GAM's\n // `forecastService.getAvailabilityForecast` returning availability inline\n // with product metadata when a brief is supplied.\n const targeting = url.searchParams.get('targeting');\n const flightStart = parseDateParam(url.searchParams.get('flight_start'));\n const flightEnd = parseDateParam(url.searchParams.get('flight_end'));\n const budget = parsePositiveNumber(url.searchParams.get('budget'));\n const hasQuery = Boolean(targeting || flightStart || flightEnd || budget !== undefined);\n if (hasQuery) {\n const dates = { start: flightStart, end: flightEnd };\n const decorated = visible.map(p => ({\n ...p,\n forecast: synthForecast(p, { targeting, dates, budget }),\n }));\n writeJson(res, 200, { products: decorated });\n return;\n }\n writeJson(res, 200, { products: visible });\n }\n\n // ────────────────────────────────────────────────────────────\n // Forecast + availability (GAM-style getDeliveryForecast)\n // ────────────────────────────────────────────────────────────\n async function handleForecast(req: IncomingMessage, network: MockNetwork, res: ServerResponse): Promise<void> {\n const body = await readJsonObject(req, res);\n if (!body) return;\n const { product_id, targeting, flight_dates, budget } = body as Record<string, unknown>;\n if (typeof product_id !== 'string') {\n writeJson(res, 400, { code: 'invalid_request', message: 'product_id is required.' });\n return;\n }\n const product = products.find(p => p.product_id === product_id && p.network_code === network.network_code);\n if (!product) {\n writeJson(res, 404, { code: 'product_not_found', message: `Product ${product_id} not found.` });\n return;\n }\n const dates = isObject(flight_dates) ? flight_dates : {};\n const targetingKey = serializeTargeting(targeting);\n const forecast = synthForecast(product, {\n targeting: targetingKey,\n dates: {\n start: typeof dates.start === 'string' ? dates.start : undefined,\n end: typeof dates.end === 'string' ? dates.end : undefined,\n },\n budget: typeof budget === 'number' ? budget : undefined,\n });\n writeJson(res, 200, forecast);\n }\n\n async function handleAvailability(req: IncomingMessage, network: MockNetwork, res: ServerResponse): Promise<void> {\n const body = await readJsonObject(req, res);\n if (!body) return;\n const { items, dry_run } = body as Record<string, unknown>;\n if (!Array.isArray(items) || items.length === 0) {\n writeJson(res, 400, {\n code: 'invalid_request',\n message: 'items must be a non-empty array of { product_id, budget?, flight_dates? }.',\n });\n return;\n }\n if (dry_run === false) {\n writeJson(res, 400, {\n code: 'invalid_request',\n message: 'availability is dry-run only; reservations happen via POST /v1/orders.',\n });\n return;\n }\n\n // Track cumulative reservations across overlapping line items so the\n // second LI sees reduced inventory when its targeting overlaps the first.\n // Mirrors GAM's getCompetitiveForecast semantics.\n const reservedByProduct = new Map<string, number>();\n const conflicts: Array<{ product_id: string; reason: string }> = [];\n const results: Array<Record<string, unknown>> = [];\n\n for (const raw of items) {\n if (!isObject(raw)) {\n writeJson(res, 400, { code: 'invalid_request', message: 'each item must be an object.' });\n return;\n }\n const itemProductId = typeof raw.product_id === 'string' ? raw.product_id : null;\n if (!itemProductId) {\n writeJson(res, 400, { code: 'invalid_request', message: 'each item requires product_id.' });\n return;\n }\n const product = products.find(p => p.product_id === itemProductId && p.network_code === network.network_code);\n if (!product) {\n results.push({ product_id: itemProductId, available: false, reason: 'product_not_found' });\n conflicts.push({ product_id: itemProductId, reason: 'product_not_found' });\n continue;\n }\n const itemDates = isObject(raw.flight_dates) ? raw.flight_dates : {};\n const itemBudget = typeof raw.budget === 'number' ? raw.budget : undefined;\n const itemTargeting = serializeTargeting(raw.targeting);\n\n const forecast = synthForecast(product, {\n targeting: itemTargeting,\n dates: {\n start: typeof itemDates.start === 'string' ? itemDates.start : undefined,\n end: typeof itemDates.end === 'string' ? itemDates.end : undefined,\n },\n budget: itemBudget,\n });\n\n const availabilityPoint = forecast.points.find((pt: ForecastPoint) => pt.budget === undefined);\n const availableImpressions = availabilityPoint?.metrics.impressions?.mid ?? 0;\n const alreadyReserved = reservedByProduct.get(itemProductId) ?? 0;\n const remaining = Math.max(0, availableImpressions - alreadyReserved);\n const cpmForCalc = product.pricing.cpm > 0 ? product.pricing.cpm : 1;\n const requiredImpressions = itemBudget ? Math.floor((itemBudget / cpmForCalc) * 1000) : 0;\n const fits = requiredImpressions === 0 || remaining >= requiredImpressions;\n\n if (!fits) {\n conflicts.push({\n product_id: itemProductId,\n reason: `Requested ${requiredImpressions.toLocaleString()} impressions but only ${remaining.toLocaleString()} remain after prior items in this proposal.`,\n });\n }\n reservedByProduct.set(itemProductId, alreadyReserved + requiredImpressions);\n\n results.push({\n product_id: itemProductId,\n available: fits,\n forecast,\n tier_pricing: tierPricing(product),\n ...(itemBudget !== undefined && {\n required_impressions: requiredImpressions,\n remaining_after_prior_items: remaining,\n }),\n });\n }\n\n writeJson(res, 200, {\n available: conflicts.length === 0,\n items: results,\n ...(conflicts.length > 0 && { conflicts }),\n });\n }\n\n function handleListCreatives(network: MockNetwork, res: ServerResponse): void {\n const list = Array.from(creatives.values()).filter(c => c.network_code === network.network_code);\n writeJson(res, 200, { creatives: list.map(stripBodyFingerprint) });\n }\n\n async function handleCreateCreative(req: IncomingMessage, network: MockNetwork, res: ServerResponse): Promise<void> {\n const body = await readJsonObject(req, res);\n if (!body) return;\n const exactReplay = scenario.idempotency.check(\n `${network.network_code}::creative`,\n idempotencyKeyFromBody(body),\n stableFingerprint(body)\n );\n if (exactReplay.kind === 'replay' || exactReplay.kind === 'conflict') {\n writeCachedResponse(res, exactReplay.response);\n return;\n }\n const { name, format_id, advertiser_id, snippet, client_request_id } = body as Record<string, unknown>;\n if (typeof name !== 'string' || typeof format_id !== 'string' || typeof advertiser_id !== 'string') {\n writeJson(res, 400, { code: 'invalid_request', message: 'name, format_id, advertiser_id are required.' });\n return;\n }\n const fingerprint = JSON.stringify({ name, format_id, advertiser_id, snippet });\n const replay = checkIdempotentReplay(network.network_code, 'creative', client_request_id, fingerprint);\n if (replay.kind === 'conflict') {\n writeJson(res, 409, { code: 'idempotency_conflict', message: replay.message });\n return;\n }\n if (replay.kind === 'replay') {\n const existing = creatives.get(replay.id);\n if (existing) {\n writeJson(res, 200, stripBodyFingerprint(existing));\n return;\n }\n }\n const id = `cr_${randomUUID().replace(/-/g, '').slice(0, 16)}`;\n const cr: CreativeState = {\n creative_id: id,\n network_code: network.network_code,\n name,\n format_id,\n advertiser_id,\n snippet: typeof snippet === 'string' ? snippet : undefined,\n status: 'active',\n body_fingerprint: fingerprint,\n created_at: new Date().toISOString(),\n };\n creatives.set(id, cr);\n if (typeof client_request_id === 'string' && client_request_id.length > 0) {\n idempotency.set(`${network.network_code}::creative::${client_request_id}`, id);\n }\n const responseBody = stripBodyFingerprint(cr);\n if (exactReplay.kind === 'fresh') exactReplay.record({ status: 201, body: responseBody });\n writeJson(res, 201, responseBody);\n }\n\n // ────────────────────────────────────────────────────────────\n // Orders + state machine\n // ────────────────────────────────────────────────────────────\n // ────────────────────────────────────────────────────────────\n // Proposals (lifecycle-aware: draft → committed)\n // ────────────────────────────────────────────────────────────\n\n async function handleCreateProposal(req: IncomingMessage, network: MockNetwork, res: ServerResponse): Promise<void> {\n const body = await readJsonObject(req, res);\n if (!body) return;\n const exactReplay = scenario.idempotency.check(\n `${network.network_code}::proposal`,\n idempotencyKeyFromBody(body),\n stableFingerprint(body)\n );\n if (exactReplay.kind === 'replay' || exactReplay.kind === 'conflict') {\n writeCachedResponse(res, exactReplay.response);\n return;\n }\n const { brief, total_budget, product_ids } = body as Record<string, unknown>;\n const briefStr = typeof brief === 'string' ? brief : undefined;\n const budget = isObject(total_budget)\n ? {\n amount: typeof total_budget.amount === 'number' ? total_budget.amount : 0,\n currency: typeof total_budget.currency === 'string' ? total_budget.currency : 'USD',\n }\n : undefined;\n // Pick referenced products OR fall back to all guaranteed products\n // for this network. Mirrors a real planner's behaviour: caller\n // either steers the seller toward specific inventory or lets the\n // seller curate.\n const eligible = products.filter(p => p.network_code === network.network_code && p.delivery_type === 'guaranteed');\n let pickList: MockProduct[];\n if (Array.isArray(product_ids) && product_ids.length > 0) {\n const ids = new Set(product_ids.filter((p): p is string => typeof p === 'string'));\n pickList = eligible.filter(p => ids.has(p.product_id));\n if (pickList.length === 0) {\n writeJson(res, 400, {\n code: 'invalid_request',\n message: 'No matching guaranteed products for the supplied product_ids.',\n });\n return;\n }\n } else {\n pickList = eligible.slice(0, 3); // default curated set\n }\n if (pickList.length === 0) {\n writeJson(res, 400, {\n code: 'no_inventory',\n message: 'No guaranteed products available for this network.',\n });\n return;\n }\n // Even allocation across the picked products. Real planners weight\n // by forecast / brief alignment; the mock keeps it simple.\n const evenSplit = Math.floor(100 / pickList.length);\n const remainder = 100 - evenSplit * pickList.length;\n const allocations = pickList.map((p, i) => ({\n product_id: p.product_id,\n allocation_percentage: evenSplit + (i === 0 ? remainder : 0),\n indicative_cpm: p.pricing.cpm,\n }));\n const proposalId = `prop_${randomUUID()}`;\n const now = new Date().toISOString();\n const proposal: ProposalState = {\n proposal_id: proposalId,\n network_code: network.network_code,\n status: 'draft',\n ...(briefStr !== undefined && { brief: briefStr }),\n allocations,\n ...(budget && { total_budget: budget }),\n created_at: now,\n updated_at: now,\n };\n proposals.set(proposalId, proposal);\n const responseBody = serializeProposal(proposal);\n if (exactReplay.kind === 'fresh') exactReplay.record({ status: 201, body: responseBody });\n writeJson(res, 201, responseBody);\n }\n\n function handleGetProposal(proposal: ProposalState, res: ServerResponse): void {\n writeJson(res, 200, serializeProposal(proposal));\n }\n\n async function handleRefineProposal(\n req: IncomingMessage,\n proposal: ProposalState,\n res: ServerResponse\n ): Promise<void> {\n if (proposal.status !== 'draft') {\n writeJson(res, 409, {\n code: 'invalid_state',\n message: `Cannot refine proposal in state ${proposal.status}; only draft proposals are mutable.`,\n });\n return;\n }\n const body = await readJsonObject(req, res);\n if (!body) return;\n const { ask, allocation_overrides } = body as Record<string, unknown>;\n const askStr = typeof ask === 'string' ? ask.toLowerCase() : '';\n // Apply targeted overrides first (typed steering).\n if (Array.isArray(allocation_overrides)) {\n for (const raw of allocation_overrides) {\n if (!isObject(raw)) continue;\n const productId = raw.product_id;\n const pct = raw.allocation_percentage;\n if (typeof productId !== 'string' || typeof pct !== 'number') continue;\n const target = proposal.allocations.find(a => a.product_id === productId);\n if (target) target.allocation_percentage = pct;\n }\n }\n // Free-text hints: simple keyword steering. Real planners run an LLM\n // here; the mock is deterministic so storyboards don't flake.\n if (askStr.includes('shift') && askStr.includes('ctv')) {\n // Bias toward CTV products.\n bias(proposal, p => p.channel === 'ctv', 1.5);\n } else if (askStr.includes('shift') && (askStr.includes('video') || askStr.includes('preroll'))) {\n bias(proposal, p => p.channel === 'video', 1.5);\n }\n // Renormalise to 100.\n renormalize(proposal);\n proposal.updated_at = new Date().toISOString();\n writeJson(res, 200, serializeProposal(proposal));\n }\n\n function handleFinalizeProposal(proposal: ProposalState, res: ServerResponse): void {\n if (proposal.status === 'committed') {\n // Idempotent: re-finalize on a committed proposal returns the\n // same record. Real upstreams either reject or no-op.\n writeJson(res, 200, serializeProposal(proposal));\n return;\n }\n if (proposal.status !== 'draft') {\n writeJson(res, 409, {\n code: 'invalid_state',\n message: `Cannot finalize proposal in state ${proposal.status}.`,\n });\n return;\n }\n // Lock pricing — copy indicative_cpm to locked_cpm and allocate\n // upstream line-item template ids the adapter will pass on\n // create_media_buy.\n for (const allocation of proposal.allocations) {\n allocation.locked_cpm = allocation.indicative_cpm;\n allocation.upstream_line_item_template_id = `lit_${randomUUID().slice(0, 8)}`;\n }\n proposal.status = 'committed';\n // 24h inventory hold — the adopter's `expiresAtGraceSeconds`\n // capability extends this on the AdCP side.\n proposal.expires_at = new Date(Date.now() + 24 * 60 * 60 * 1000).toISOString();\n proposal.updated_at = new Date().toISOString();\n writeJson(res, 200, serializeProposal(proposal));\n }\n\n function bias(proposal: ProposalState, predicate: (p: MockProduct) => boolean, factor: number): void {\n for (const allocation of proposal.allocations) {\n const product = products.find(p => p.product_id === allocation.product_id);\n if (product && predicate(product)) {\n allocation.allocation_percentage = Math.round(allocation.allocation_percentage * factor);\n }\n }\n }\n\n function renormalize(proposal: ProposalState): void {\n const total = proposal.allocations.reduce((s, a) => s + a.allocation_percentage, 0);\n if (total === 0 || total === 100) return;\n const scale = 100 / total;\n for (const allocation of proposal.allocations) {\n allocation.allocation_percentage = Math.round(allocation.allocation_percentage * scale);\n }\n // Round-trip drift: assign remainder to the largest allocation.\n const drift = 100 - proposal.allocations.reduce((s, a) => s + a.allocation_percentage, 0);\n if (drift !== 0 && proposal.allocations.length > 0) {\n proposal.allocations.sort((a, b) => b.allocation_percentage - a.allocation_percentage);\n proposal.allocations[0]!.allocation_percentage += drift;\n }\n }\n\n function serializeProposal(proposal: ProposalState): Record<string, unknown> {\n return {\n proposal_id: proposal.proposal_id,\n network_code: proposal.network_code,\n status: proposal.status,\n ...(proposal.brief !== undefined && { brief: proposal.brief }),\n allocations: proposal.allocations.map(a => ({\n product_id: a.product_id,\n allocation_percentage: a.allocation_percentage,\n indicative_cpm: a.indicative_cpm,\n ...(a.locked_cpm !== undefined && { locked_cpm: a.locked_cpm }),\n ...(a.upstream_line_item_template_id !== undefined && {\n upstream_line_item_template_id: a.upstream_line_item_template_id,\n }),\n })),\n ...(proposal.total_budget && { total_budget: proposal.total_budget }),\n ...(proposal.expires_at !== undefined && { expires_at: proposal.expires_at }),\n created_at: proposal.created_at,\n updated_at: proposal.updated_at,\n };\n }\n\n // ────────────────────────────────────────────────────────────\n // Orders\n // ────────────────────────────────────────────────────────────\n\n function handleListOrders(network: MockNetwork, res: ServerResponse): void {\n const list = Array.from(orders.values()).filter(o => o.network_code === network.network_code);\n writeJson(res, 200, { orders: list.map(serializeOrder) });\n }\n\n async function handleCreateOrder(req: IncomingMessage, network: MockNetwork, res: ServerResponse): Promise<void> {\n const body = await readJsonObject(req, res);\n if (!body) return;\n const exactReplay = scenario.idempotency.check(\n `${network.network_code}::order`,\n idempotencyKeyFromBody(body),\n stableFingerprint(body)\n );\n if (exactReplay.kind === 'replay' || exactReplay.kind === 'conflict') {\n writeCachedResponse(res, exactReplay.response);\n return;\n }\n const { name, advertiser_id, currency, budget, client_request_id } = body as Record<string, unknown>;\n if (\n typeof name !== 'string' ||\n typeof advertiser_id !== 'string' ||\n typeof currency !== 'string' ||\n typeof budget !== 'number'\n ) {\n writeJson(res, 400, {\n code: 'invalid_request',\n message: 'name, advertiser_id, currency, budget are all required.',\n });\n return;\n }\n const fingerprint = JSON.stringify({ name, advertiser_id, currency, budget });\n const replay = checkIdempotentReplay(network.network_code, 'order', client_request_id, fingerprint);\n if (replay.kind === 'conflict') {\n writeJson(res, 409, { code: 'idempotency_conflict', message: replay.message });\n return;\n }\n if (replay.kind === 'replay') {\n const existing = orders.get(replay.id);\n if (existing) {\n writeJson(res, 200, serializeOrder(existing));\n return;\n }\n }\n const id = `ord_${randomUUID().replace(/-/g, '').slice(0, 16)}`;\n const taskId = `task_${randomUUID().replace(/-/g, '').slice(0, 16)}`;\n const now = new Date().toISOString();\n const order: OrderState = {\n order_id: id,\n network_code: network.network_code,\n name,\n status: 'pending_approval',\n advertiser_id,\n currency,\n budget,\n approval_task_id: taskId,\n line_items: new Map(),\n conversions: { count: 0, dedup_keys: new Set(), total_value: 0 },\n body_fingerprint: fingerprint,\n created_at: now,\n updated_at: now,\n };\n orders.set(id, order);\n tasks.set(taskId, {\n task_id: taskId,\n order_id: id,\n status: 'submitted',\n poll_count: 0,\n created_at: now,\n updated_at: now,\n });\n if (typeof client_request_id === 'string' && client_request_id.length > 0) {\n idempotency.set(`${network.network_code}::order::${client_request_id}`, id);\n }\n const responseBody = serializeOrder(order);\n if (exactReplay.kind === 'fresh') exactReplay.record({ status: 201, body: responseBody });\n writeJson(res, 201, responseBody);\n }\n\n function handleGetOrder(order: OrderState, res: ServerResponse): void {\n // Auto-promote pending_approval orders by checking the task. Real\n // platforms rely on a human review workflow; the mock advances on\n // poll counts so adapters exercise the polling pattern without the\n // matrix run dragging.\n if (order.status === 'pending_approval' && order.approval_task_id) {\n const task = tasks.get(order.approval_task_id);\n if (task && task.status === 'completed' && task.result?.outcome === 'approved') {\n order.status = 'approved';\n order.updated_at = new Date().toISOString();\n order.approval_task_id = undefined;\n // Promote any pending line items that have creatives → delivering.\n for (const li of order.line_items.values()) {\n if (li.creative_ids.length > 0 && li.status === 'pending_creatives') {\n li.status = 'delivering';\n }\n }\n } else if (task && task.status === 'rejected') {\n order.status = 'rejected';\n order.rejection_reason = task.result?.reviewer_note ?? 'Order rejected by IO review.';\n order.updated_at = new Date().toISOString();\n order.approval_task_id = undefined;\n }\n }\n if (order.status === 'approved') {\n // After approval, naturally transition to delivering on first GET.\n // Mirrors GAM's auto-activation once IO is signed.\n order.status = 'delivering';\n order.updated_at = new Date().toISOString();\n }\n writeJson(res, 200, serializeOrder(order));\n }\n\n function handleListLineItems(order: OrderState, res: ServerResponse): void {\n writeJson(res, 200, {\n line_items: Array.from(order.line_items.values()).map(stripBodyFingerprint),\n });\n }\n\n async function handleCreateLineItem(req: IncomingMessage, order: OrderState, res: ServerResponse): Promise<void> {\n const body = await readJsonObject(req, res);\n if (!body) return;\n const exactReplay = scenario.idempotency.check(\n `${order.network_code}::${order.order_id}::lineitem`,\n idempotencyKeyFromBody(body),\n stableFingerprint({ order_id: order.order_id, body })\n );\n if (exactReplay.kind === 'replay' || exactReplay.kind === 'conflict') {\n writeCachedResponse(res, exactReplay.response);\n return;\n }\n if (order.status === 'completed' || order.status === 'canceled' || order.status === 'rejected') {\n writeJson(res, 422, {\n code: 'invalid_state_transition',\n message: `Cannot add line items to an order in terminal status: ${order.status}.`,\n });\n return;\n }\n const { product_id, budget, ad_unit_targeting, client_request_id } = body as Record<string, unknown>;\n if (typeof product_id !== 'string' || typeof budget !== 'number') {\n writeJson(res, 400, { code: 'invalid_request', message: 'product_id and budget are required.' });\n return;\n }\n const targeting = Array.isArray(ad_unit_targeting)\n ? (ad_unit_targeting.filter(x => typeof x === 'string') as string[])\n : [];\n const fingerprint = JSON.stringify({ order_id: order.order_id, product_id, budget, ad_unit_targeting: targeting });\n const replay = checkIdempotentReplay(order.network_code, 'lineitem', client_request_id, fingerprint);\n if (replay.kind === 'conflict') {\n writeJson(res, 409, { code: 'idempotency_conflict', message: replay.message });\n return;\n }\n if (replay.kind === 'replay') {\n const existing = order.line_items.get(replay.id);\n if (existing) {\n writeJson(res, 200, stripBodyFingerprint(existing));\n return;\n }\n }\n const id = `li_${randomUUID().replace(/-/g, '').slice(0, 16)}`;\n const li: LineItemState = {\n line_item_id: id,\n order_id: order.order_id,\n product_id,\n status: 'pending_creatives',\n budget,\n ad_unit_targeting: targeting,\n creative_ids: [],\n body_fingerprint: fingerprint,\n created_at: new Date().toISOString(),\n };\n order.line_items.set(id, li);\n if (typeof client_request_id === 'string' && client_request_id.length > 0) {\n idempotency.set(`${order.network_code}::lineitem::${client_request_id}`, id);\n }\n const responseBody = stripBodyFingerprint(li);\n if (exactReplay.kind === 'fresh') exactReplay.record({ status: 201, body: responseBody });\n writeJson(res, 201, responseBody);\n }\n\n function handleAttachCreative(\n req: IncomingMessage,\n order: OrderState,\n lineItemId: string,\n res: ServerResponse\n ): void {\n void readJsonObject(req, res).then(body => {\n if (!body) return;\n const li = order.line_items.get(lineItemId);\n if (!li) {\n writeJson(res, 404, { code: 'line_item_not_found', message: `Line item ${lineItemId} not found.` });\n return;\n }\n const { creative_id } = body as Record<string, unknown>;\n if (typeof creative_id !== 'string') {\n writeJson(res, 400, { code: 'invalid_request', message: 'creative_id is required.' });\n return;\n }\n if (!li.creative_ids.includes(creative_id)) li.creative_ids.push(creative_id);\n // Promote the line item to delivering if the order is already approved.\n if (order.status === 'delivering' || order.status === 'approved') {\n li.status = 'delivering';\n } else {\n li.status = 'ready';\n }\n writeJson(res, 200, stripBodyFingerprint(li));\n });\n }\n\n // ────────────────────────────────────────────────────────────\n // Approval task polling — auto-progress submitted → working → completed\n // ────────────────────────────────────────────────────────────\n function handleGetTask(taskId: string, network: MockNetwork, res: ServerResponse): void {\n const task = tasks.get(taskId);\n if (!task) {\n writeJson(res, 404, { code: 'task_not_found', message: `Task ${taskId} not found.` });\n return;\n }\n const order = orders.get(task.order_id);\n if (!order || order.network_code !== network.network_code) {\n writeJson(res, 404, { code: 'task_not_found', message: `Task ${taskId} not found.` });\n return;\n }\n task.poll_count++;\n if (task.status === 'submitted' && task.poll_count >= 1) {\n task.status = 'working';\n task.updated_at = new Date().toISOString();\n } else if (task.status === 'working' && task.poll_count >= 2) {\n task.status = 'completed';\n task.result = { outcome: 'approved', reviewer_note: 'IO signed; approved for delivery.' };\n task.updated_at = new Date().toISOString();\n }\n writeJson(res, 200, {\n task_id: task.task_id,\n order_id: task.order_id,\n status: task.status,\n result: task.result,\n created_at: task.created_at,\n updated_at: task.updated_at,\n });\n }\n\n // ────────────────────────────────────────────────────────────\n // Delivery reporting + CAPI conversion ingestion\n // ────────────────────────────────────────────────────────────\n function handleGetDelivery(order: OrderState, res: ServerResponse): void {\n // Synthesize plausible delivery numbers based on order budget and\n // status. Real platforms compute from impression logs; the mock\n // produces stable, deterministic-feeling numbers for storyboard graders.\n const isLive = order.status === 'delivering' || order.status === 'completed';\n const budget = order.budget ?? 50_000;\n const totalSpend = isLive ? Math.min(budget * 0.4, budget) : 0;\n const cpm = 35;\n const impressions = isLive ? Math.floor((totalSpend / cpm) * 1000) : 0;\n const clicks = Math.floor(impressions * 0.0042);\n const viewable = Math.floor(impressions * 0.71);\n const completions = Math.floor(impressions * 0.78);\n writeJson(res, 200, {\n order_id: order.order_id,\n currency: order.currency,\n reporting_period: {\n start: order.created_at,\n end: new Date().toISOString(),\n },\n totals: {\n impressions,\n clicks,\n spend: totalSpend,\n viewable_impressions: viewable,\n video_completions: completions,\n conversions: order.conversions.count,\n },\n line_item_breakdown: Array.from(order.line_items.values()).map(li => ({\n line_item_id: li.line_item_id,\n impressions: Math.floor(impressions / Math.max(1, order.line_items.size)),\n spend: totalSpend / Math.max(1, order.line_items.size),\n })),\n });\n }\n\n async function handleIngestConversions(req: IncomingMessage, order: OrderState, res: ServerResponse): Promise<void> {\n const body = await readJsonObject(req, res);\n if (!body) return;\n const { conversions } = body as Record<string, unknown>;\n if (!Array.isArray(conversions) || conversions.length === 0) {\n writeJson(res, 400, { code: 'empty_conversions', message: 'conversions must be a non-empty array.' });\n return;\n }\n let received = 0;\n let dedup = 0;\n for (const c of conversions) {\n if (!c || typeof c !== 'object') continue;\n const conv = c as Record<string, unknown>;\n if (typeof conv.event_name !== 'string' || typeof conv.event_time !== 'number') continue;\n const value = typeof conv.value === 'number' ? conv.value : 0;\n const dedupKey = typeof conv.dedup_key === 'string' ? conv.dedup_key : null;\n if (dedupKey && order.conversions.dedup_keys.has(dedupKey)) {\n dedup++;\n continue;\n }\n if (dedupKey) order.conversions.dedup_keys.add(dedupKey);\n order.conversions.count++;\n order.conversions.total_value += value;\n received++;\n }\n writeJson(res, 200, {\n order_id: order.order_id,\n events_received: received,\n events_deduplicated: dedup,\n });\n }\n\n // ────────────────────────────────────────────────────────────\n // Helpers\n // ────────────────────────────────────────────────────────────\n function checkIdempotentReplay(\n networkCode: string,\n resourceKind: string,\n clientRequestId: unknown,\n fingerprint: string\n ): { kind: 'replay'; id: string } | { kind: 'conflict'; message: string } | { kind: 'fresh' } {\n if (typeof clientRequestId !== 'string' || clientRequestId.length === 0) return { kind: 'fresh' };\n const key = `${networkCode}::${resourceKind}::${clientRequestId}`;\n const existingId = idempotency.get(key);\n if (!existingId) return { kind: 'fresh' };\n const stored = lookupResource(resourceKind, existingId);\n if (!stored) return { kind: 'fresh' };\n if (stored.body_fingerprint !== fingerprint) {\n return {\n kind: 'conflict',\n message: `client_request_id ${clientRequestId} was previously used with a different body. Use a fresh idempotency key for distinct requests.`,\n };\n }\n return { kind: 'replay', id: existingId };\n }\n\n function lookupResource(kind: string, id: string): { body_fingerprint: string } | undefined {\n if (kind === 'order') return orders.get(id);\n if (kind === 'creative') return creatives.get(id);\n if (kind === 'lineitem') {\n for (const order of orders.values()) {\n const li = order.line_items.get(id);\n if (li) return li;\n }\n return undefined;\n }\n return undefined;\n }\n\n function serializeOrder(order: OrderState): Record<string, unknown> {\n const { body_fingerprint, line_items, conversions, ...rest } = order;\n return rest;\n }\n}\n\nfunction stripBodyFingerprint<T extends { body_fingerprint?: string }>(record: T): Omit<T, 'body_fingerprint'> {\n const { body_fingerprint, ...rest } = record;\n return rest;\n}\n\nasync function readJsonObject(req: IncomingMessage, res: ServerResponse): Promise<Record<string, unknown> | null> {\n let body: unknown;\n try {\n body = await readJson(req);\n } catch {\n writeJson(res, 400, { code: 'invalid_json', message: 'Request body must be valid JSON.' });\n return null;\n }\n if (!body || typeof body !== 'object' || Array.isArray(body)) {\n writeJson(res, 400, { code: 'invalid_request', message: 'Body must be a JSON object.' });\n return null;\n }\n return body as Record<string, unknown>;\n}\n\nfunction readJson(req: IncomingMessage): Promise<unknown> {\n return new Promise((resolve, reject) => {\n const chunks: Buffer[] = [];\n req.on('data', c => chunks.push(c));\n req.on('error', reject);\n req.on('end', () => {\n const raw = Buffer.concat(chunks).toString('utf8');\n if (!raw) {\n resolve({});\n return;\n }\n try {\n resolve(JSON.parse(raw));\n } catch (err) {\n reject(err);\n }\n });\n });\n}\n\nfunction writeJson(res: ServerResponse, status: number, body: unknown): void {\n const json = JSON.stringify(body);\n res.writeHead(status, {\n 'content-type': 'application/json; charset=utf-8',\n 'content-length': Buffer.byteLength(json),\n });\n res.end(json);\n}\n\ninterface ForecastRange {\n low: number;\n mid: number;\n high: number;\n}\ninterface ForecastPoint {\n label?: string;\n budget?: number;\n metrics: {\n impressions?: ForecastRange;\n reach?: ForecastRange;\n frequency?: ForecastRange;\n spend?: ForecastRange;\n };\n}\ninterface SyntheticForecast {\n points: ForecastPoint[];\n forecast_range_unit: 'spend' | 'availability';\n /** `guaranteed` for availability checks (the GAM-style commit-to-deliver),\n * `modeled` for spend curves where a budget is supplied. Matches the AdCP\n * `forecast-method` enum semantics: guaranteed = \"Contractually committed\n * delivery levels backed by reserved inventory\". */\n method: 'modeled' | 'guaranteed';\n currency: string;\n generated_at: string;\n}\n\n/**\n * Deterministic forecast generator. Same (product, targeting, dates, budget)\n * inputs always yield the same numbers — storyboard graders can assert exact\n * values without flake. Different targeting hashes produce different\n * availability levels so adapters can demonstrate that targeting actually\n * affects the forecast.\n */\nfunction synthForecast(\n product: MockProduct,\n query: {\n targeting?: string | null;\n dates: { start?: string; end?: string };\n budget?: number;\n }\n): SyntheticForecast {\n const seedKey = stableStringify({\n product_id: product.product_id,\n targeting: query.targeting ?? null,\n dates: query.dates,\n });\n const seed = seedFromString(seedKey);\n const baseImpressions = product.availability?.available_impressions ?? 10_000_000;\n // Targeting tightens supply: hash → fraction in [0.35, 0.95].\n const supplyFraction = 0.35 + (seed.next() % 6001) / 10_000;\n const availability = Math.floor(baseImpressions * supplyFraction);\n\n // Guard against zero-CPM seed entries — would NaN out availabilityCost\n // and the spend-curve tiers below. Real seeds never hit zero, but a\n // misconfigured override would.\n const cpm = product.pricing.cpm > 0 ? product.pricing.cpm : 1;\n const availabilityCost = (availability / 1000) * cpm;\n const reachAvail = Math.floor(availability * 0.42);\n\n const availabilityPoint: ForecastPoint = {\n label: 'available inventory',\n metrics: {\n impressions: range(availability, 0.85, 1.1),\n reach: range(reachAvail, 0.85, 1.1),\n frequency: range(availability / Math.max(1, reachAvail), 0.95, 1.05),\n spend: range(availabilityCost, 0.95, 1.05),\n },\n };\n\n // Spend-curve points. If the caller passed a budget we anchor at it; else\n // we generate three plausible budget tiers under the availability ceiling.\n const anchorBudget = query.budget ?? availabilityCost * 0.5;\n const tiers = [anchorBudget * 0.5, anchorBudget, anchorBudget * 1.5];\n const spendPoints: ForecastPoint[] = tiers.map(b => {\n const impressions = Math.min(availability, Math.floor((b / cpm) * 1000));\n const reach = Math.floor(impressions * 0.42);\n return {\n budget: Math.round(b),\n metrics: {\n impressions: range(impressions, 0.9, 1.05),\n reach: range(reach, 0.9, 1.05),\n frequency: range(impressions / Math.max(1, reach), 0.97, 1.03),\n },\n };\n });\n\n return {\n points: [availabilityPoint, ...spendPoints],\n forecast_range_unit: query.budget !== undefined ? 'spend' : 'availability',\n method: query.budget !== undefined ? 'modeled' : 'guaranteed',\n currency: product.pricing.currency,\n generated_at: '2026-04-01T00:00:00.000Z',\n };\n}\n\nfunction tierPricing(product: MockProduct): Array<{ tier: string; cpm: number; currency: string }> {\n // Plausible-feeling, deterministic per-product tiers so the adapter has\n // something concrete to project onto a rate card. Real platforms vary\n // tier composition (daypart, geo, audience); we expose three tiers so the\n // adapter can demonstrate that pricing is not a single scalar.\n const base = product.pricing.cpm;\n return [\n { tier: 'open', cpm: base, currency: product.pricing.currency },\n { tier: 'preferred', cpm: roundCpm(base * 1.15), currency: product.pricing.currency },\n { tier: 'premium', cpm: roundCpm(base * 1.4), currency: product.pricing.currency },\n ];\n}\n\nfunction roundCpm(n: number): number {\n return Math.round(n * 100) / 100;\n}\n\nfunction range(mid: number, lowFactor: number, highFactor: number): ForecastRange {\n return {\n low: Math.max(0, Math.floor(mid * lowFactor)),\n mid: Math.max(0, Math.floor(mid)),\n high: Math.max(0, Math.floor(mid * highFactor)),\n };\n}\n\nfunction isObject(v: unknown): v is Record<string, unknown> {\n return Boolean(v) && typeof v === 'object' && !Array.isArray(v);\n}\n\nfunction parsePositiveNumber(raw: string | null | undefined): number | undefined {\n if (raw === null || raw === undefined || raw === '') return undefined;\n const n = Number(raw);\n return Number.isFinite(n) && n >= 0 ? n : undefined;\n}\n\nfunction parseDateParam(raw: string | null | undefined): string | undefined {\n if (!raw) return undefined;\n // OpenAPI declares `format: date` (YYYY-MM-DD). Tighten beyond `Date.parse`\n // so `?flight_start=2026` (which Date.parse accepts as Jan 1) doesn't hash\n // to a different seed than `?flight_start=2026-01-01`. Storyboards that\n // mix abbreviated and full dates would otherwise produce unstable forecasts.\n if (!/^\\d{4}-\\d{2}-\\d{2}$/.test(raw)) return undefined;\n return Number.isFinite(Date.parse(raw)) ? raw : undefined;\n}\n\nfunction serializeTargeting(t: unknown): string | null {\n if (t === null || t === undefined) return null;\n if (typeof t === 'string') return t;\n try {\n return stableStringify(t);\n } catch {\n return null;\n }\n}\n\n/**\n * Recursive deterministic JSON stringifier — sorts object keys at every\n * depth so two equivalent payloads with different key insertion orders\n * hash identically. Plain `JSON.stringify(t, keys.sort())` only sorts the\n * top level AND treats the array as a key allowlist (silently dropping\n * nested fields).\n */\nfunction stableStringify(v: unknown): string {\n if (v === null || typeof v !== 'object') return JSON.stringify(v);\n if (Array.isArray(v)) return `[${v.map(stableStringify).join(',')}]`;\n const obj = v as Record<string, unknown>;\n const keys = Object.keys(obj).sort();\n const parts = keys.map(k => `${JSON.stringify(k)}:${stableStringify(obj[k])}`);\n return `{${parts.join(',')}}`;\n}\n\ninterface DeterministicSeed {\n next: () => number;\n}\n\nfunction seedFromString(key: string): DeterministicSeed {\n // SHA-256 → consume 4-byte windows as uint32 stream. Stable across Node\n // versions; storyboards assert exact forecast numbers.\n const digest = createHash('sha256').update(key).digest();\n let offset = 0;\n return {\n next: () => {\n if (offset + 4 > digest.length) {\n // Re-hash to extend the stream if a caller exhausts it.\n const extended = createHash('sha256').update(digest).digest();\n digest.set(extended);\n offset = 0;\n }\n const v = digest.readUInt32BE(offset);\n offset += 4;\n return v;\n },\n };\n}\n"],"mappings":"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","names":["url"]}
|
|
1
|
+
{"version":3,"sources":["../../../../src/lib/mock-server/sales-guaranteed/server.ts"],"sourcesContent":["import { createServer, type IncomingMessage, type ServerResponse } from 'node:http';\nimport { createHash, randomUUID } from 'node:crypto';\nimport {\n AD_UNITS,\n DEFAULT_API_KEY,\n NETWORKS,\n PRODUCTS,\n type MockAdUnit,\n type MockNetwork,\n type MockProduct,\n} from './seed-data';\nimport {\n createMockScenarioController,\n idempotencyKeyFromBody,\n stableFingerprint,\n writeCachedResponse,\n type MockScenarioHandle,\n} from '../scenario';\n\nexport interface BootOptions {\n port: number;\n apiKey?: string;\n networks?: MockNetwork[];\n adUnits?: MockAdUnit[];\n products?: MockProduct[];\n}\n\nexport interface BootResult {\n url: string;\n close: () => Promise<void>;\n scenario: MockScenarioHandle;\n}\n\ntype OrderStatus = 'draft' | 'pending_approval' | 'approved' | 'delivering' | 'completed' | 'canceled' | 'rejected';\ntype LineItemStatus = 'pending_creatives' | 'ready' | 'paused' | 'delivering' | 'completed';\ntype TaskStatus = 'submitted' | 'working' | 'completed' | 'rejected';\n\ninterface OrderState {\n order_id: string;\n network_code: string;\n name: string;\n status: OrderStatus;\n advertiser_id: string;\n currency: string;\n budget?: number;\n approval_task_id?: string;\n rejection_reason?: string;\n /** Line-item children, keyed by line_item_id. */\n line_items: Map<string, LineItemState>;\n /** Conversions ingested via /conversions/ — count + dedup-key set. */\n conversions: { count: number; dedup_keys: Set<string>; total_value: number };\n body_fingerprint: string;\n created_at: string;\n updated_at: string;\n}\n\ninterface LineItemState {\n line_item_id: string;\n order_id: string;\n product_id: string;\n status: LineItemStatus;\n budget: number;\n ad_unit_targeting: string[];\n creative_ids: string[];\n body_fingerprint: string;\n created_at: string;\n}\n\ninterface CreativeState {\n creative_id: string;\n network_code: string;\n name: string;\n format_id: string;\n advertiser_id: string;\n snippet?: string;\n status: 'active' | 'paused' | 'archived';\n body_fingerprint: string;\n created_at: string;\n}\n\ninterface TaskState {\n task_id: string;\n order_id: string;\n status: TaskStatus;\n /** Number of times the task has been polled. Used to auto-promote\n * `submitted → working → completed` so adapters exercise the polling\n * pattern without the matrix run dragging. */\n poll_count: number;\n result?: { outcome: 'approved' | 'rejected'; reviewer_note: string };\n created_at: string;\n updated_at: string;\n}\n\ntype ProposalStatus = 'draft' | 'committed' | 'expired' | 'rejected';\n\n/**\n * Upstream proposal record. Proposals are the lifecycle-aware shape on\n * top of products: `draft` (indicative pricing, no inventory hold) →\n * `committed` (locked pricing + reserved inventory until `expires_at`).\n *\n * Mirrors GAM's `Proposal` shape: a sellable plan that an adopter\n * curates from the product catalog, refines with the buyer, and then\n * finalizes (locking pricing + reserving inventory before the buyer\n * commits with `create_media_buy`).\n */\ninterface ProposalState {\n proposal_id: string;\n network_code: string;\n status: ProposalStatus;\n brief?: string;\n /** Product allocations the proposal recommends. Indicative pricing\n * pre-finalize; locked + line-item-template-allocated post-finalize. */\n allocations: Array<{\n product_id: string;\n allocation_percentage: number;\n indicative_cpm: number;\n locked_cpm?: number;\n upstream_line_item_template_id?: string;\n }>;\n total_budget?: { amount: number; currency: string };\n /** Set on finalize; inventory hold deadline. */\n expires_at?: string;\n created_at: string;\n updated_at: string;\n}\n\nexport async function bootSalesGuaranteed(options: BootOptions): Promise<BootResult> {\n const apiKey = options.apiKey ?? DEFAULT_API_KEY;\n const networks = options.networks ?? NETWORKS;\n const adUnits = options.adUnits ?? AD_UNITS;\n const products = options.products ?? PRODUCTS;\n\n const orders = new Map<string, OrderState>();\n const creatives = new Map<string, CreativeState>();\n const tasks = new Map<string, TaskState>();\n const proposals = new Map<string, ProposalState>();\n // Idempotency table — keyed `<network_code>::<resource_kind>::<client_request_id>`.\n const idempotency = new Map<string, string>();\n\n // Traffic counters keyed by `<METHOD> <route-template>`. Harness queries\n // `GET /_debug/traffic` after the storyboard run and asserts headline\n // routes were hit ≥1. Façade adapters that skip the upstream produce zero\n // counters and fail the assertion. adcontextprotocol/adcp-client#1225.\n const traffic = new Map<string, number>();\n const bump = (routeTemplate: string): void => {\n traffic.set(routeTemplate, (traffic.get(routeTemplate) ?? 0) + 1);\n };\n const scenario = createMockScenarioController({\n specialism: 'sales-guaranteed',\n snapshot: () => ({\n orders: orders.size,\n creatives: creatives.size,\n tasks: tasks.size,\n proposals: proposals.size,\n idempotency: idempotency.size,\n traffic: Object.fromEntries(traffic),\n }),\n reset: () => {\n orders.clear();\n creatives.clear();\n tasks.clear();\n proposals.clear();\n idempotency.clear();\n traffic.clear();\n },\n });\n\n const server = createServer((req, res) => {\n handleRequest(req, res).catch(err => {\n writeJson(res, 500, { code: 'internal_error', message: err?.message ?? 'unexpected error' });\n });\n });\n\n await new Promise<void>((resolve, reject) => {\n server.once('error', reject);\n server.listen(options.port, '127.0.0.1', () => {\n server.removeListener('error', reject);\n resolve();\n });\n });\n\n const addr = server.address();\n const boundPort = typeof addr === 'object' && addr ? addr.port : options.port;\n const url = `http://127.0.0.1:${boundPort}`;\n return {\n url,\n scenario: scenario.handle,\n close: () =>\n new Promise<void>((resolve, reject) => {\n server.close(err => (err ? reject(err) : resolve()));\n }),\n };\n\n async function handleRequest(req: IncomingMessage, res: ServerResponse): Promise<void> {\n const url = new URL(req.url ?? '/', 'http://127.0.0.1');\n const path = url.pathname;\n const method = req.method ?? 'GET';\n\n if (await scenario.handleControlRequest(req, res, method, path)) return;\n\n // Façade-detection traffic dump — harness-only, no auth required.\n if (method === 'GET' && path === '/_debug/traffic') {\n writeJson(res, 200, { traffic: Object.fromEntries(traffic) });\n return;\n }\n\n // Discovery endpoint — replaces the hardcoded principal-mapping table the\n // harness used to inline. Adapters resolve at runtime by querying with\n // the AdCP-side identifier they receive from buyers (`account.publisher`,\n // `account.brand.domain`). No auth required — discovery happens before\n // the agent has any network context. Issue #1225.\n if (method === 'GET' && path === '/_lookup/network') {\n bump('GET /_lookup/network');\n const adcpPublisher = url.searchParams.get('adcp_publisher');\n if (!adcpPublisher) {\n writeJson(res, 400, {\n code: 'invalid_request',\n message: 'adcp_publisher query parameter is required.',\n });\n return;\n }\n const match = networks.find(n => n.adcp_publisher === adcpPublisher);\n if (!match) {\n writeJson(res, 404, {\n code: 'network_not_found',\n message: `No upstream network registered for adcp_publisher=${adcpPublisher}.`,\n });\n return;\n }\n writeJson(res, 200, {\n adcp_publisher: match.adcp_publisher,\n network_code: match.network_code,\n display_name: match.display_name,\n });\n return;\n }\n\n const auth = req.headers['authorization'];\n if (!auth || !auth.startsWith('Bearer ') || auth.slice(7) !== apiKey) {\n writeJson(res, 401, { code: 'unauthorized', message: 'Missing or invalid bearer credential.' });\n return;\n }\n const networkHeader = req.headers['x-network-code'];\n const networkCode = Array.isArray(networkHeader) ? networkHeader[0] : networkHeader;\n if (!networkCode) {\n writeJson(res, 403, {\n code: 'network_required',\n message: 'X-Network-Code header is required on every request.',\n });\n return;\n }\n const network = networks.find(n => n.network_code === networkCode);\n if (!network) {\n writeJson(res, 403, { code: 'unknown_network', message: `Unknown network: ${networkCode}` });\n return;\n }\n\n if (await scenario.handleScriptedResponse(res, method, path, (m, p) => bump(`${m} ${p}`))) return;\n\n if (method === 'GET' && path === '/v1/inventory') {\n bump('GET /v1/inventory');\n return handleListInventory(network, res);\n }\n if (method === 'GET' && path === '/v1/products') {\n bump('GET /v1/products');\n return handleListProducts(url, network, res);\n }\n if (method === 'POST' && path === '/v1/forecast') {\n bump('POST /v1/forecast');\n return handleForecast(req, network, res);\n }\n if (method === 'POST' && path === '/v1/availability') {\n bump('POST /v1/availability');\n return handleAvailability(req, network, res);\n }\n if (method === 'GET' && path === '/v1/creatives') {\n bump('GET /v1/creatives');\n return handleListCreatives(network, res);\n }\n if (method === 'POST' && path === '/v1/creatives') {\n bump('POST /v1/creatives');\n return handleCreateCreative(req, network, res);\n }\n\n if (method === 'POST' && path === '/v1/proposals') {\n bump('POST /v1/proposals');\n return handleCreateProposal(req, network, res);\n }\n const proposalMatch = path.match(/^\\/v1\\/proposals\\/([^/]+)(\\/.*)?$/);\n if (proposalMatch && proposalMatch[1]) {\n const proposalId = decodeURIComponent(proposalMatch[1]);\n const subPath = proposalMatch[2] ?? '/';\n const proposal = proposals.get(proposalId);\n if (!proposal || proposal.network_code !== network.network_code) {\n writeJson(res, 404, { code: 'proposal_not_found', message: `Proposal ${proposalId} not found.` });\n return;\n }\n if (method === 'GET' && subPath === '/') {\n bump('GET /v1/proposals/{id}');\n return handleGetProposal(proposal, res);\n }\n if (method === 'POST' && subPath === '/refine') {\n bump('POST /v1/proposals/{id}/refine');\n return handleRefineProposal(req, proposal, res);\n }\n if (method === 'POST' && subPath === '/finalize') {\n bump('POST /v1/proposals/{id}/finalize');\n return handleFinalizeProposal(proposal, res);\n }\n }\n\n if (method === 'GET' && path === '/v1/orders') {\n bump('GET /v1/orders');\n return handleListOrders(network, res);\n }\n if (method === 'POST' && path === '/v1/orders') {\n bump('POST /v1/orders');\n return handleCreateOrder(req, network, res);\n }\n\n const orderMatch = path.match(/^\\/v1\\/orders\\/([^/]+)(\\/.*)?$/);\n if (orderMatch && orderMatch[1]) {\n const orderId = decodeURIComponent(orderMatch[1]);\n const subPath = orderMatch[2] ?? '/';\n const order = orders.get(orderId);\n if (!order || order.network_code !== network.network_code) {\n writeJson(res, 404, { code: 'order_not_found', message: `Order ${orderId} not found.` });\n return;\n }\n if (method === 'GET' && subPath === '/') {\n bump('GET /v1/orders/{id}');\n return handleGetOrder(order, res);\n }\n if (method === 'GET' && subPath === '/lineitems') {\n bump('GET /v1/orders/{id}/lineitems');\n return handleListLineItems(order, res);\n }\n if (method === 'POST' && subPath === '/lineitems') {\n bump('POST /v1/orders/{id}/lineitems');\n return handleCreateLineItem(req, order, res);\n }\n const liAttachMatch = subPath.match(/^\\/lineitems\\/([^/]+)\\/creative-attach$/);\n if (method === 'POST' && liAttachMatch && liAttachMatch[1]) {\n bump('POST /v1/orders/{id}/lineitems/{li}/creative-attach');\n return handleAttachCreative(req, order, decodeURIComponent(liAttachMatch[1]), res);\n }\n if (method === 'GET' && subPath === '/delivery') {\n bump('GET /v1/orders/{id}/delivery');\n return handleGetDelivery(order, res);\n }\n if (method === 'POST' && subPath === '/conversions') {\n bump('POST /v1/orders/{id}/conversions');\n return handleIngestConversions(req, order, res);\n }\n }\n\n const taskMatch = path.match(/^\\/v1\\/tasks\\/([^/]+)$/);\n if (method === 'GET' && taskMatch && taskMatch[1]) {\n bump('GET /v1/tasks/{id}');\n return handleGetTask(decodeURIComponent(taskMatch[1]), network, res);\n }\n\n writeJson(res, 404, { code: 'not_found', message: `No route for ${method} ${path}` });\n }\n\n // ────────────────────────────────────────────────────────────\n // Inventory + Products + Creatives\n // ────────────────────────────────────────────────────────────\n function handleListInventory(network: MockNetwork, res: ServerResponse): void {\n const visible = adUnits.filter(au => au.network_code === network.network_code);\n writeJson(res, 200, { ad_units: visible });\n }\n\n function handleListProducts(url: URL, network: MockNetwork, res: ServerResponse): void {\n let visible = products.filter(p => p.network_code === network.network_code);\n const deliveryType = url.searchParams.get('delivery_type');\n const channel = url.searchParams.get('channel');\n if (deliveryType) visible = visible.filter(p => p.delivery_type === deliveryType);\n if (channel) visible = visible.filter(p => p.channel === channel);\n\n // Per-query forecast embedding. When the caller passes any of\n // `targeting`, `flight_start`, `flight_end`, or `budget`, attach a\n // deterministic-seeded forecast keyed on those inputs so a single\n // get_products call surfaces both the catalog and the forecast curve\n // without a follow-up POST /v1/forecast. Mirrors GAM's\n // `forecastService.getAvailabilityForecast` returning availability inline\n // with product metadata when a brief is supplied.\n const targeting = url.searchParams.get('targeting');\n const flightStart = parseDateParam(url.searchParams.get('flight_start'));\n const flightEnd = parseDateParam(url.searchParams.get('flight_end'));\n const budget = parsePositiveNumber(url.searchParams.get('budget'));\n const hasQuery = Boolean(targeting || flightStart || flightEnd || budget !== undefined);\n if (hasQuery) {\n const dates = { start: flightStart, end: flightEnd };\n const decorated = visible.map(p => ({\n ...p,\n forecast: synthForecast(p, { targeting, dates, budget }),\n }));\n writeJson(res, 200, { products: decorated });\n return;\n }\n writeJson(res, 200, { products: visible });\n }\n\n // ────────────────────────────────────────────────────────────\n // Forecast + availability (GAM-style getDeliveryForecast)\n // ────────────────────────────────────────────────────────────\n async function handleForecast(req: IncomingMessage, network: MockNetwork, res: ServerResponse): Promise<void> {\n const body = await readJsonObject(req, res);\n if (!body) return;\n const { product_id, targeting, flight_dates, budget } = body as Record<string, unknown>;\n if (typeof product_id !== 'string') {\n writeJson(res, 400, { code: 'invalid_request', message: 'product_id is required.' });\n return;\n }\n const product = products.find(p => p.product_id === product_id && p.network_code === network.network_code);\n if (!product) {\n writeJson(res, 404, { code: 'product_not_found', message: `Product ${product_id} not found.` });\n return;\n }\n const dates = isObject(flight_dates) ? flight_dates : {};\n const targetingKey = serializeTargeting(targeting);\n const forecast = synthForecast(product, {\n targeting: targetingKey,\n dates: {\n start: typeof dates.start === 'string' ? dates.start : undefined,\n end: typeof dates.end === 'string' ? dates.end : undefined,\n },\n budget: typeof budget === 'number' ? budget : undefined,\n });\n writeJson(res, 200, forecast);\n }\n\n async function handleAvailability(req: IncomingMessage, network: MockNetwork, res: ServerResponse): Promise<void> {\n const body = await readJsonObject(req, res);\n if (!body) return;\n const { items, dry_run } = body as Record<string, unknown>;\n if (!Array.isArray(items) || items.length === 0) {\n writeJson(res, 400, {\n code: 'invalid_request',\n message: 'items must be a non-empty array of { product_id, budget?, flight_dates? }.',\n });\n return;\n }\n if (dry_run === false) {\n writeJson(res, 400, {\n code: 'invalid_request',\n message: 'availability is dry-run only; reservations happen via POST /v1/orders.',\n });\n return;\n }\n\n // Track cumulative reservations across overlapping line items so the\n // second LI sees reduced inventory when its targeting overlaps the first.\n // Mirrors GAM's getCompetitiveForecast semantics.\n const reservedByProduct = new Map<string, number>();\n const conflicts: Array<{ product_id: string; reason: string }> = [];\n const results: Array<Record<string, unknown>> = [];\n\n for (const raw of items) {\n if (!isObject(raw)) {\n writeJson(res, 400, { code: 'invalid_request', message: 'each item must be an object.' });\n return;\n }\n const itemProductId = typeof raw.product_id === 'string' ? raw.product_id : null;\n if (!itemProductId) {\n writeJson(res, 400, { code: 'invalid_request', message: 'each item requires product_id.' });\n return;\n }\n const product = products.find(p => p.product_id === itemProductId && p.network_code === network.network_code);\n if (!product) {\n results.push({ product_id: itemProductId, available: false, reason: 'product_not_found' });\n conflicts.push({ product_id: itemProductId, reason: 'product_not_found' });\n continue;\n }\n const itemDates = isObject(raw.flight_dates) ? raw.flight_dates : {};\n const itemBudget = typeof raw.budget === 'number' ? raw.budget : undefined;\n const itemTargeting = serializeTargeting(raw.targeting);\n\n const forecast = synthForecast(product, {\n targeting: itemTargeting,\n dates: {\n start: typeof itemDates.start === 'string' ? itemDates.start : undefined,\n end: typeof itemDates.end === 'string' ? itemDates.end : undefined,\n },\n budget: itemBudget,\n });\n\n const availabilityPoint = forecast.points.find((pt: ForecastPoint) => pt.budget === undefined);\n const availableImpressions = availabilityPoint?.metrics.impressions?.mid ?? 0;\n const alreadyReserved = reservedByProduct.get(itemProductId) ?? 0;\n const remaining = Math.max(0, availableImpressions - alreadyReserved);\n const cpmForCalc = product.pricing.cpm > 0 ? product.pricing.cpm : 1;\n const requiredImpressions = itemBudget ? Math.floor((itemBudget / cpmForCalc) * 1000) : 0;\n const fits = requiredImpressions === 0 || remaining >= requiredImpressions;\n\n if (!fits) {\n conflicts.push({\n product_id: itemProductId,\n reason: `Requested ${requiredImpressions.toLocaleString()} impressions but only ${remaining.toLocaleString()} remain after prior items in this proposal.`,\n });\n }\n reservedByProduct.set(itemProductId, alreadyReserved + requiredImpressions);\n\n results.push({\n product_id: itemProductId,\n available: fits,\n forecast,\n tier_pricing: tierPricing(product),\n ...(itemBudget !== undefined && {\n required_impressions: requiredImpressions,\n remaining_after_prior_items: remaining,\n }),\n });\n }\n\n writeJson(res, 200, {\n available: conflicts.length === 0,\n items: results,\n ...(conflicts.length > 0 && { conflicts }),\n });\n }\n\n function handleListCreatives(network: MockNetwork, res: ServerResponse): void {\n const list = Array.from(creatives.values()).filter(c => c.network_code === network.network_code);\n writeJson(res, 200, { creatives: list.map(stripBodyFingerprint) });\n }\n\n async function handleCreateCreative(req: IncomingMessage, network: MockNetwork, res: ServerResponse): Promise<void> {\n const body = await readJsonObject(req, res);\n if (!body) return;\n const exactReplay = scenario.idempotency.check(\n `${network.network_code}::creative`,\n idempotencyKeyFromBody(body),\n stableFingerprint(body)\n );\n if (exactReplay.kind === 'replay' || exactReplay.kind === 'conflict') {\n writeCachedResponse(res, exactReplay.response);\n return;\n }\n const { name, format_id, advertiser_id, snippet, client_request_id } = body as Record<string, unknown>;\n if (typeof name !== 'string' || typeof format_id !== 'string' || typeof advertiser_id !== 'string') {\n writeJson(res, 400, { code: 'invalid_request', message: 'name, format_id, advertiser_id are required.' });\n return;\n }\n const fingerprint = JSON.stringify({ name, format_id, advertiser_id, snippet });\n const replay = checkIdempotentReplay(network.network_code, 'creative', client_request_id, fingerprint);\n if (replay.kind === 'conflict') {\n writeJson(res, 409, { code: 'idempotency_conflict', message: replay.message });\n return;\n }\n if (replay.kind === 'replay') {\n const existing = creatives.get(replay.id);\n if (existing) {\n writeJson(res, 200, stripBodyFingerprint(existing));\n return;\n }\n }\n const id = `cr_${randomUUID().replace(/-/g, '').slice(0, 16)}`;\n const cr: CreativeState = {\n creative_id: id,\n network_code: network.network_code,\n name,\n format_id,\n advertiser_id,\n snippet: typeof snippet === 'string' ? snippet : undefined,\n status: 'active',\n body_fingerprint: fingerprint,\n created_at: new Date().toISOString(),\n };\n creatives.set(id, cr);\n if (typeof client_request_id === 'string' && client_request_id.length > 0) {\n idempotency.set(`${network.network_code}::creative::${client_request_id}`, id);\n }\n const responseBody = stripBodyFingerprint(cr);\n if (exactReplay.kind === 'fresh') exactReplay.record({ status: 201, body: responseBody });\n writeJson(res, 201, responseBody);\n }\n\n // ────────────────────────────────────────────────────────────\n // Orders + state machine\n // ────────────────────────────────────────────────────────────\n // ────────────────────────────────────────────────────────────\n // Proposals (lifecycle-aware: draft → committed)\n // ────────────────────────────────────────────────────────────\n\n async function handleCreateProposal(req: IncomingMessage, network: MockNetwork, res: ServerResponse): Promise<void> {\n const body = await readJsonObject(req, res);\n if (!body) return;\n const exactReplay = scenario.idempotency.check(\n `${network.network_code}::proposal`,\n idempotencyKeyFromBody(body),\n stableFingerprint(body)\n );\n if (exactReplay.kind === 'replay' || exactReplay.kind === 'conflict') {\n writeCachedResponse(res, exactReplay.response);\n return;\n }\n const { brief, total_budget, product_ids } = body as Record<string, unknown>;\n const briefStr = typeof brief === 'string' ? brief : undefined;\n const budget = isObject(total_budget)\n ? {\n amount: typeof total_budget.amount === 'number' ? total_budget.amount : 0,\n currency: typeof total_budget.currency === 'string' ? total_budget.currency : 'USD',\n }\n : undefined;\n // Pick referenced products OR fall back to all guaranteed products\n // for this network. Mirrors a real planner's behaviour: caller\n // either steers the seller toward specific inventory or lets the\n // seller curate.\n const eligible = products.filter(p => p.network_code === network.network_code && p.delivery_type === 'guaranteed');\n let pickList: MockProduct[];\n if (Array.isArray(product_ids) && product_ids.length > 0) {\n const ids = new Set(product_ids.filter((p): p is string => typeof p === 'string'));\n pickList = eligible.filter(p => ids.has(p.product_id));\n if (pickList.length === 0) {\n writeJson(res, 400, {\n code: 'invalid_request',\n message: 'No matching guaranteed products for the supplied product_ids.',\n });\n return;\n }\n } else {\n pickList = eligible.slice(0, 3); // default curated set\n }\n if (pickList.length === 0) {\n writeJson(res, 400, {\n code: 'no_inventory',\n message: 'No guaranteed products available for this network.',\n });\n return;\n }\n // Even allocation across the picked products. Real planners weight\n // by forecast / brief alignment; the mock keeps it simple.\n const evenSplit = Math.floor(100 / pickList.length);\n const remainder = 100 - evenSplit * pickList.length;\n const allocations = pickList.map((p, i) => ({\n product_id: p.product_id,\n allocation_percentage: evenSplit + (i === 0 ? remainder : 0),\n indicative_cpm: p.pricing.cpm,\n }));\n const proposalId = `prop_${randomUUID()}`;\n const now = new Date().toISOString();\n const proposal: ProposalState = {\n proposal_id: proposalId,\n network_code: network.network_code,\n status: 'draft',\n ...(briefStr !== undefined && { brief: briefStr }),\n allocations,\n ...(budget && { total_budget: budget }),\n created_at: now,\n updated_at: now,\n };\n proposals.set(proposalId, proposal);\n const responseBody = serializeProposal(proposal);\n if (exactReplay.kind === 'fresh') exactReplay.record({ status: 201, body: responseBody });\n writeJson(res, 201, responseBody);\n }\n\n function handleGetProposal(proposal: ProposalState, res: ServerResponse): void {\n writeJson(res, 200, serializeProposal(proposal));\n }\n\n async function handleRefineProposal(\n req: IncomingMessage,\n proposal: ProposalState,\n res: ServerResponse\n ): Promise<void> {\n if (proposal.status !== 'draft') {\n writeJson(res, 409, {\n code: 'invalid_state',\n message: `Cannot refine proposal in state ${proposal.status}; only draft proposals are mutable.`,\n });\n return;\n }\n const body = await readJsonObject(req, res);\n if (!body) return;\n const { ask, allocation_overrides } = body as Record<string, unknown>;\n const askStr = typeof ask === 'string' ? ask.toLowerCase() : '';\n // Apply targeted overrides first (typed steering).\n if (Array.isArray(allocation_overrides)) {\n for (const raw of allocation_overrides) {\n if (!isObject(raw)) continue;\n const productId = raw.product_id;\n const pct = raw.allocation_percentage;\n if (typeof productId !== 'string' || typeof pct !== 'number') continue;\n const target = proposal.allocations.find(a => a.product_id === productId);\n if (target) target.allocation_percentage = pct;\n }\n }\n // Free-text hints: simple keyword steering. Real planners run an LLM\n // here; the mock is deterministic so storyboards don't flake.\n if (askStr.includes('shift') && askStr.includes('ctv')) {\n // Bias toward CTV products.\n bias(proposal, p => p.channel === 'ctv', 1.5);\n } else if (askStr.includes('shift') && (askStr.includes('video') || askStr.includes('preroll'))) {\n bias(proposal, p => p.channel === 'video', 1.5);\n }\n // Renormalise to 100.\n renormalize(proposal);\n proposal.updated_at = new Date().toISOString();\n writeJson(res, 200, serializeProposal(proposal));\n }\n\n function handleFinalizeProposal(proposal: ProposalState, res: ServerResponse): void {\n if (proposal.status === 'committed') {\n // Idempotent: re-finalize on a committed proposal returns the\n // same record. Real upstreams either reject or no-op.\n writeJson(res, 200, serializeProposal(proposal));\n return;\n }\n if (proposal.status !== 'draft') {\n writeJson(res, 409, {\n code: 'invalid_state',\n message: `Cannot finalize proposal in state ${proposal.status}.`,\n });\n return;\n }\n // Lock pricing — copy indicative_cpm to locked_cpm and allocate\n // upstream line-item template ids the adapter will pass on\n // create_media_buy.\n for (const allocation of proposal.allocations) {\n allocation.locked_cpm = allocation.indicative_cpm;\n allocation.upstream_line_item_template_id = `lit_${randomUUID().slice(0, 8)}`;\n }\n proposal.status = 'committed';\n // 24h inventory hold — the adopter's `expiresAtGraceSeconds`\n // capability extends this on the AdCP side.\n proposal.expires_at = new Date(Date.now() + 24 * 60 * 60 * 1000).toISOString();\n proposal.updated_at = new Date().toISOString();\n writeJson(res, 200, serializeProposal(proposal));\n }\n\n function bias(proposal: ProposalState, predicate: (p: MockProduct) => boolean, factor: number): void {\n for (const allocation of proposal.allocations) {\n const product = products.find(p => p.product_id === allocation.product_id);\n if (product && predicate(product)) {\n allocation.allocation_percentage = Math.round(allocation.allocation_percentage * factor);\n }\n }\n }\n\n function renormalize(proposal: ProposalState): void {\n const total = proposal.allocations.reduce((s, a) => s + a.allocation_percentage, 0);\n if (total === 0 || total === 100) return;\n const scale = 100 / total;\n for (const allocation of proposal.allocations) {\n allocation.allocation_percentage = Math.round(allocation.allocation_percentage * scale);\n }\n // Round-trip drift: assign remainder to the largest allocation.\n const drift = 100 - proposal.allocations.reduce((s, a) => s + a.allocation_percentage, 0);\n if (drift !== 0 && proposal.allocations.length > 0) {\n proposal.allocations.sort((a, b) => b.allocation_percentage - a.allocation_percentage);\n proposal.allocations[0]!.allocation_percentage += drift;\n }\n }\n\n function serializeProposal(proposal: ProposalState): Record<string, unknown> {\n return {\n proposal_id: proposal.proposal_id,\n network_code: proposal.network_code,\n status: proposal.status,\n ...(proposal.brief !== undefined && { brief: proposal.brief }),\n allocations: proposal.allocations.map(a => ({\n product_id: a.product_id,\n allocation_percentage: a.allocation_percentage,\n indicative_cpm: a.indicative_cpm,\n ...(a.locked_cpm !== undefined && { locked_cpm: a.locked_cpm }),\n ...(a.upstream_line_item_template_id !== undefined && {\n upstream_line_item_template_id: a.upstream_line_item_template_id,\n }),\n })),\n ...(proposal.total_budget && { total_budget: proposal.total_budget }),\n ...(proposal.expires_at !== undefined && { expires_at: proposal.expires_at }),\n created_at: proposal.created_at,\n updated_at: proposal.updated_at,\n };\n }\n\n // ────────────────────────────────────────────────────────────\n // Orders\n // ────────────────────────────────────────────────────────────\n\n function handleListOrders(network: MockNetwork, res: ServerResponse): void {\n const list = Array.from(orders.values()).filter(o => o.network_code === network.network_code);\n writeJson(res, 200, { orders: list.map(serializeOrder) });\n }\n\n async function handleCreateOrder(req: IncomingMessage, network: MockNetwork, res: ServerResponse): Promise<void> {\n const body = await readJsonObject(req, res);\n if (!body) return;\n const exactReplay = scenario.idempotency.check(\n `${network.network_code}::order`,\n idempotencyKeyFromBody(body),\n stableFingerprint(body)\n );\n if (exactReplay.kind === 'replay' || exactReplay.kind === 'conflict') {\n writeCachedResponse(res, exactReplay.response);\n return;\n }\n const { name, advertiser_id, currency, budget, client_request_id } = body as Record<string, unknown>;\n if (\n typeof name !== 'string' ||\n typeof advertiser_id !== 'string' ||\n typeof currency !== 'string' ||\n typeof budget !== 'number'\n ) {\n writeJson(res, 400, {\n code: 'invalid_request',\n message: 'name, advertiser_id, currency, budget are all required.',\n });\n return;\n }\n const fingerprint = JSON.stringify({ name, advertiser_id, currency, budget });\n const replay = checkIdempotentReplay(network.network_code, 'order', client_request_id, fingerprint);\n if (replay.kind === 'conflict') {\n writeJson(res, 409, { code: 'idempotency_conflict', message: replay.message });\n return;\n }\n if (replay.kind === 'replay') {\n const existing = orders.get(replay.id);\n if (existing) {\n writeJson(res, 200, serializeOrder(existing));\n return;\n }\n }\n const id = `ord_${randomUUID().replace(/-/g, '').slice(0, 16)}`;\n const taskId = `task_${randomUUID().replace(/-/g, '').slice(0, 16)}`;\n const now = new Date().toISOString();\n const order: OrderState = {\n order_id: id,\n network_code: network.network_code,\n name,\n status: 'pending_approval',\n advertiser_id,\n currency,\n budget,\n approval_task_id: taskId,\n line_items: new Map(),\n conversions: { count: 0, dedup_keys: new Set(), total_value: 0 },\n body_fingerprint: fingerprint,\n created_at: now,\n updated_at: now,\n };\n orders.set(id, order);\n tasks.set(taskId, {\n task_id: taskId,\n order_id: id,\n status: 'submitted',\n poll_count: 0,\n created_at: now,\n updated_at: now,\n });\n if (typeof client_request_id === 'string' && client_request_id.length > 0) {\n idempotency.set(`${network.network_code}::order::${client_request_id}`, id);\n }\n const responseBody = serializeOrder(order);\n if (exactReplay.kind === 'fresh') exactReplay.record({ status: 201, body: responseBody });\n writeJson(res, 201, responseBody);\n }\n\n function handleGetOrder(order: OrderState, res: ServerResponse): void {\n // Auto-promote pending_approval orders by checking the task. Real\n // platforms rely on a human review workflow; the mock advances on\n // poll counts so adapters exercise the polling pattern without the\n // matrix run dragging.\n if (order.status === 'pending_approval' && order.approval_task_id) {\n const task = tasks.get(order.approval_task_id);\n if (task && task.status === 'completed' && task.result?.outcome === 'approved') {\n order.status = 'approved';\n order.updated_at = new Date().toISOString();\n order.approval_task_id = undefined;\n // Promote any pending line items that have creatives → delivering.\n for (const li of order.line_items.values()) {\n if (li.creative_ids.length > 0 && li.status === 'pending_creatives') {\n li.status = 'delivering';\n }\n }\n } else if (task && task.status === 'rejected') {\n order.status = 'rejected';\n order.rejection_reason = task.result?.reviewer_note ?? 'Order rejected by IO review.';\n order.updated_at = new Date().toISOString();\n order.approval_task_id = undefined;\n }\n }\n if (order.status === 'approved') {\n // After approval, naturally transition to delivering on first GET.\n // Mirrors GAM's auto-activation once IO is signed.\n order.status = 'delivering';\n order.updated_at = new Date().toISOString();\n }\n writeJson(res, 200, serializeOrder(order));\n }\n\n function handleListLineItems(order: OrderState, res: ServerResponse): void {\n writeJson(res, 200, {\n line_items: Array.from(order.line_items.values()).map(stripBodyFingerprint),\n });\n }\n\n async function handleCreateLineItem(req: IncomingMessage, order: OrderState, res: ServerResponse): Promise<void> {\n const body = await readJsonObject(req, res);\n if (!body) return;\n const exactReplay = scenario.idempotency.check(\n `${order.network_code}::${order.order_id}::lineitem`,\n idempotencyKeyFromBody(body),\n stableFingerprint({ order_id: order.order_id, body })\n );\n if (exactReplay.kind === 'replay' || exactReplay.kind === 'conflict') {\n writeCachedResponse(res, exactReplay.response);\n return;\n }\n if (order.status === 'completed' || order.status === 'canceled' || order.status === 'rejected') {\n writeJson(res, 422, {\n code: 'invalid_state_transition',\n message: `Cannot add line items to an order in terminal status: ${order.status}.`,\n });\n return;\n }\n const { product_id, budget, ad_unit_targeting, client_request_id } = body as Record<string, unknown>;\n if (typeof product_id !== 'string' || typeof budget !== 'number') {\n writeJson(res, 400, { code: 'invalid_request', message: 'product_id and budget are required.' });\n return;\n }\n const targeting = Array.isArray(ad_unit_targeting)\n ? (ad_unit_targeting.filter(x => typeof x === 'string') as string[])\n : [];\n const fingerprint = JSON.stringify({ order_id: order.order_id, product_id, budget, ad_unit_targeting: targeting });\n const replay = checkIdempotentReplay(order.network_code, 'lineitem', client_request_id, fingerprint);\n if (replay.kind === 'conflict') {\n writeJson(res, 409, { code: 'idempotency_conflict', message: replay.message });\n return;\n }\n if (replay.kind === 'replay') {\n const existing = order.line_items.get(replay.id);\n if (existing) {\n writeJson(res, 200, stripBodyFingerprint(existing));\n return;\n }\n }\n const id = `li_${randomUUID().replace(/-/g, '').slice(0, 16)}`;\n const li: LineItemState = {\n line_item_id: id,\n order_id: order.order_id,\n product_id,\n status: 'pending_creatives',\n budget,\n ad_unit_targeting: targeting,\n creative_ids: [],\n body_fingerprint: fingerprint,\n created_at: new Date().toISOString(),\n };\n order.line_items.set(id, li);\n if (typeof client_request_id === 'string' && client_request_id.length > 0) {\n idempotency.set(`${order.network_code}::lineitem::${client_request_id}`, id);\n }\n const responseBody = stripBodyFingerprint(li);\n if (exactReplay.kind === 'fresh') exactReplay.record({ status: 201, body: responseBody });\n writeJson(res, 201, responseBody);\n }\n\n function handleAttachCreative(\n req: IncomingMessage,\n order: OrderState,\n lineItemId: string,\n res: ServerResponse\n ): void {\n void readJsonObject(req, res).then(body => {\n if (!body) return;\n const li = order.line_items.get(lineItemId);\n if (!li) {\n writeJson(res, 404, { code: 'line_item_not_found', message: `Line item ${lineItemId} not found.` });\n return;\n }\n const { creative_id } = body as Record<string, unknown>;\n if (typeof creative_id !== 'string') {\n writeJson(res, 400, { code: 'invalid_request', message: 'creative_id is required.' });\n return;\n }\n if (!li.creative_ids.includes(creative_id)) li.creative_ids.push(creative_id);\n // Promote the line item to delivering if the order is already approved.\n if (order.status === 'delivering' || order.status === 'approved') {\n li.status = 'delivering';\n } else {\n li.status = 'ready';\n }\n writeJson(res, 200, stripBodyFingerprint(li));\n });\n }\n\n // ────────────────────────────────────────────────────────────\n // Approval task polling — auto-progress submitted → working → completed\n // ────────────────────────────────────────────────────────────\n function handleGetTask(taskId: string, network: MockNetwork, res: ServerResponse): void {\n const task = tasks.get(taskId);\n if (!task) {\n writeJson(res, 404, { code: 'task_not_found', message: `Task ${taskId} not found.` });\n return;\n }\n const order = orders.get(task.order_id);\n if (!order || order.network_code !== network.network_code) {\n writeJson(res, 404, { code: 'task_not_found', message: `Task ${taskId} not found.` });\n return;\n }\n task.poll_count++;\n if (task.status === 'submitted' && task.poll_count >= 1) {\n task.status = 'working';\n task.updated_at = new Date().toISOString();\n } else if (task.status === 'working' && task.poll_count >= 2) {\n task.status = 'completed';\n task.result = { outcome: 'approved', reviewer_note: 'IO signed; approved for delivery.' };\n task.updated_at = new Date().toISOString();\n }\n writeJson(res, 200, {\n task_id: task.task_id,\n order_id: task.order_id,\n status: task.status,\n result: task.result,\n created_at: task.created_at,\n updated_at: task.updated_at,\n });\n }\n\n // ────────────────────────────────────────────────────────────\n // Delivery reporting + CAPI conversion ingestion\n // ────────────────────────────────────────────────────────────\n function handleGetDelivery(order: OrderState, res: ServerResponse): void {\n // Synthesize plausible delivery numbers based on order budget and\n // status. Real platforms compute from impression logs; the mock\n // produces stable, deterministic-feeling numbers for storyboard graders.\n const isLive = order.status === 'delivering' || order.status === 'completed';\n const budget = order.budget ?? 50_000;\n const totalSpend = isLive ? Math.min(budget * 0.4, budget) : 0;\n const cpm = 35;\n const impressions = isLive ? Math.floor((totalSpend / cpm) * 1000) : 0;\n const clicks = Math.floor(impressions * 0.0042);\n const viewable = Math.floor(impressions * 0.71);\n const completions = Math.floor(impressions * 0.78);\n writeJson(res, 200, {\n order_id: order.order_id,\n currency: order.currency,\n reporting_period: {\n start: order.created_at,\n end: new Date().toISOString(),\n },\n totals: {\n impressions,\n clicks,\n spend: totalSpend,\n viewable_impressions: viewable,\n video_completions: completions,\n conversions: order.conversions.count,\n },\n line_item_breakdown: Array.from(order.line_items.values()).map(li => ({\n line_item_id: li.line_item_id,\n impressions: Math.floor(impressions / Math.max(1, order.line_items.size)),\n spend: totalSpend / Math.max(1, order.line_items.size),\n })),\n });\n }\n\n async function handleIngestConversions(req: IncomingMessage, order: OrderState, res: ServerResponse): Promise<void> {\n const body = await readJsonObject(req, res);\n if (!body) return;\n const { conversions } = body as Record<string, unknown>;\n if (!Array.isArray(conversions) || conversions.length === 0) {\n writeJson(res, 400, { code: 'empty_conversions', message: 'conversions must be a non-empty array.' });\n return;\n }\n let received = 0;\n let dedup = 0;\n for (const c of conversions) {\n if (!c || typeof c !== 'object') continue;\n const conv = c as Record<string, unknown>;\n if (typeof conv.event_name !== 'string' || typeof conv.event_time !== 'number') continue;\n const value = typeof conv.value === 'number' ? conv.value : 0;\n const dedupKey = typeof conv.dedup_key === 'string' ? conv.dedup_key : null;\n if (dedupKey && order.conversions.dedup_keys.has(dedupKey)) {\n dedup++;\n continue;\n }\n if (dedupKey) order.conversions.dedup_keys.add(dedupKey);\n order.conversions.count++;\n order.conversions.total_value += value;\n received++;\n }\n writeJson(res, 200, {\n order_id: order.order_id,\n events_received: received,\n events_deduplicated: dedup,\n });\n }\n\n // ────────────────────────────────────────────────────────────\n // Helpers\n // ────────────────────────────────────────────────────────────\n function checkIdempotentReplay(\n networkCode: string,\n resourceKind: string,\n clientRequestId: unknown,\n fingerprint: string\n ): { kind: 'replay'; id: string } | { kind: 'conflict'; message: string } | { kind: 'fresh' } {\n if (typeof clientRequestId !== 'string' || clientRequestId.length === 0) return { kind: 'fresh' };\n const key = `${networkCode}::${resourceKind}::${clientRequestId}`;\n const existingId = idempotency.get(key);\n if (!existingId) return { kind: 'fresh' };\n const stored = lookupResource(resourceKind, existingId);\n if (!stored) return { kind: 'fresh' };\n if (stored.body_fingerprint !== fingerprint) {\n return {\n kind: 'conflict',\n message: `client_request_id ${clientRequestId} was previously used with a different body. Use a fresh idempotency key for distinct requests.`,\n };\n }\n return { kind: 'replay', id: existingId };\n }\n\n function lookupResource(kind: string, id: string): { body_fingerprint: string } | undefined {\n if (kind === 'order') return orders.get(id);\n if (kind === 'creative') return creatives.get(id);\n if (kind === 'lineitem') {\n for (const order of orders.values()) {\n const li = order.line_items.get(id);\n if (li) return li;\n }\n return undefined;\n }\n return undefined;\n }\n\n function serializeOrder(order: OrderState): Record<string, unknown> {\n const { body_fingerprint, line_items, conversions, ...rest } = order;\n return rest;\n }\n}\n\nfunction stripBodyFingerprint<T extends { body_fingerprint?: string }>(record: T): Omit<T, 'body_fingerprint'> {\n const { body_fingerprint, ...rest } = record;\n return rest;\n}\n\nasync function readJsonObject(req: IncomingMessage, res: ServerResponse): Promise<Record<string, unknown> | null> {\n let body: unknown;\n try {\n body = await readJson(req);\n } catch {\n writeJson(res, 400, { code: 'invalid_json', message: 'Request body must be valid JSON.' });\n return null;\n }\n if (!body || typeof body !== 'object' || Array.isArray(body)) {\n writeJson(res, 400, { code: 'invalid_request', message: 'Body must be a JSON object.' });\n return null;\n }\n return body as Record<string, unknown>;\n}\n\nfunction readJson(req: IncomingMessage): Promise<unknown> {\n return new Promise((resolve, reject) => {\n const chunks: Buffer[] = [];\n req.on('data', c => chunks.push(c));\n req.on('error', reject);\n req.on('end', () => {\n const raw = Buffer.concat(chunks).toString('utf8');\n if (!raw) {\n resolve({});\n return;\n }\n try {\n resolve(JSON.parse(raw));\n } catch (err) {\n reject(err);\n }\n });\n });\n}\n\nfunction writeJson(res: ServerResponse, status: number, body: unknown): void {\n const json = JSON.stringify(body);\n res.writeHead(status, {\n 'content-type': 'application/json; charset=utf-8',\n 'content-length': Buffer.byteLength(json),\n });\n res.end(json);\n}\n\ninterface ForecastRange {\n low: number;\n mid: number;\n high: number;\n}\ninterface ForecastPoint {\n label?: string;\n budget?: number;\n metrics: {\n impressions?: ForecastRange;\n reach?: ForecastRange;\n frequency?: ForecastRange;\n spend?: ForecastRange;\n };\n}\ninterface SyntheticForecast {\n points: ForecastPoint[];\n forecast_range_unit: 'spend' | 'availability';\n /** `guaranteed` for availability checks (the GAM-style commit-to-deliver),\n * `modeled` for spend curves where a budget is supplied. Matches the AdCP\n * `forecast-method` enum semantics: guaranteed = \"Contractually committed\n * delivery levels backed by reserved inventory\". */\n method: 'modeled' | 'guaranteed';\n currency: string;\n generated_at: string;\n}\n\n/**\n * Deterministic forecast generator. Same (product, targeting, dates, budget)\n * inputs always yield the same numbers — storyboard graders can assert exact\n * values without flake. Different targeting hashes produce different\n * availability levels so adapters can demonstrate that targeting actually\n * affects the forecast.\n */\nfunction synthForecast(\n product: MockProduct,\n query: {\n targeting?: string | null;\n dates: { start?: string; end?: string };\n budget?: number;\n }\n): SyntheticForecast {\n const seedKey = stableStringify({\n product_id: product.product_id,\n targeting: query.targeting ?? null,\n dates: query.dates,\n });\n const seed = seedFromString(seedKey);\n const baseImpressions = product.availability?.available_impressions ?? 10_000_000;\n // Targeting tightens supply: hash → fraction in [0.35, 0.95].\n const supplyFraction = 0.35 + (seed.next() % 6001) / 10_000;\n const availability = Math.floor(baseImpressions * supplyFraction);\n\n // Guard against zero-CPM seed entries — would NaN out availabilityCost\n // and the spend-curve tiers below. Real seeds never hit zero, but a\n // misconfigured override would.\n const cpm = product.pricing.cpm > 0 ? product.pricing.cpm : 1;\n const availabilityCost = (availability / 1000) * cpm;\n const reachAvail = Math.floor(availability * 0.42);\n\n const availabilityPoint: ForecastPoint = {\n label: 'available inventory',\n metrics: {\n impressions: range(availability, 0.85, 1.1),\n reach: range(reachAvail, 0.85, 1.1),\n frequency: range(availability / Math.max(1, reachAvail), 0.95, 1.05),\n spend: range(availabilityCost, 0.95, 1.05),\n },\n };\n\n // Spend-curve points. If the caller passed a budget we anchor at it; else\n // we generate three plausible budget tiers under the availability ceiling.\n const anchorBudget = query.budget ?? availabilityCost * 0.5;\n const tiers = [anchorBudget * 0.5, anchorBudget, anchorBudget * 1.5];\n const spendPoints: ForecastPoint[] = tiers.map(b => {\n const impressions = Math.min(availability, Math.floor((b / cpm) * 1000));\n const reach = Math.floor(impressions * 0.42);\n return {\n budget: Math.round(b),\n metrics: {\n impressions: range(impressions, 0.9, 1.05),\n reach: range(reach, 0.9, 1.05),\n frequency: range(impressions / Math.max(1, reach), 0.97, 1.03),\n },\n };\n });\n\n return {\n points: [availabilityPoint, ...spendPoints],\n forecast_range_unit: query.budget !== undefined ? 'spend' : 'availability',\n method: query.budget !== undefined ? 'modeled' : 'guaranteed',\n currency: product.pricing.currency,\n generated_at: '2026-04-01T00:00:00.000Z',\n };\n}\n\nfunction tierPricing(product: MockProduct): Array<{ tier: string; cpm: number; currency: string }> {\n // Plausible-feeling, deterministic per-product tiers so the adapter has\n // something concrete to project onto a rate card. Real platforms vary\n // tier composition (daypart, geo, audience); we expose three tiers so the\n // adapter can demonstrate that pricing is not a single scalar.\n const base = product.pricing.cpm;\n return [\n { tier: 'open', cpm: base, currency: product.pricing.currency },\n { tier: 'preferred', cpm: roundCpm(base * 1.15), currency: product.pricing.currency },\n { tier: 'premium', cpm: roundCpm(base * 1.4), currency: product.pricing.currency },\n ];\n}\n\nfunction roundCpm(n: number): number {\n return Math.round(n * 100) / 100;\n}\n\nfunction range(mid: number, lowFactor: number, highFactor: number): ForecastRange {\n return {\n low: Math.max(0, Math.floor(mid * lowFactor)),\n mid: Math.max(0, Math.floor(mid)),\n high: Math.max(0, Math.floor(mid * highFactor)),\n };\n}\n\nfunction isObject(v: unknown): v is Record<string, unknown> {\n return Boolean(v) && typeof v === 'object' && !Array.isArray(v);\n}\n\nfunction parsePositiveNumber(raw: string | null | undefined): number | undefined {\n if (raw === null || raw === undefined || raw === '') return undefined;\n const n = Number(raw);\n return Number.isFinite(n) && n >= 0 ? n : undefined;\n}\n\nfunction parseDateParam(raw: string | null | undefined): string | undefined {\n if (!raw) return undefined;\n // OpenAPI declares `format: date` (YYYY-MM-DD). Tighten beyond `Date.parse`\n // so `?flight_start=2026` (which Date.parse accepts as Jan 1) doesn't hash\n // to a different seed than `?flight_start=2026-01-01`. Storyboards that\n // mix abbreviated and full dates would otherwise produce unstable forecasts.\n if (!/^\\d{4}-\\d{2}-\\d{2}$/.test(raw)) return undefined;\n return Number.isFinite(Date.parse(raw)) ? raw : undefined;\n}\n\nfunction serializeTargeting(t: unknown): string | null {\n if (t === null || t === undefined) return null;\n if (typeof t === 'string') return t;\n try {\n return stableStringify(t);\n } catch {\n return null;\n }\n}\n\n/**\n * Recursive deterministic JSON stringifier — sorts object keys at every\n * depth so two equivalent payloads with different key insertion orders\n * hash identically. Plain `JSON.stringify(t, keys.sort())` only sorts the\n * top level AND treats the array as a key allowlist (silently dropping\n * nested fields).\n */\nfunction stableStringify(v: unknown): string {\n if (v === null || typeof v !== 'object') return JSON.stringify(v);\n if (Array.isArray(v)) return `[${v.map(stableStringify).join(',')}]`;\n const obj = v as Record<string, unknown>;\n const keys = Object.keys(obj).sort();\n const parts = keys.map(k => `${JSON.stringify(k)}:${stableStringify(obj[k])}`);\n return `{${parts.join(',')}}`;\n}\n\ninterface DeterministicSeed {\n next: () => number;\n}\n\nfunction seedFromString(key: string): DeterministicSeed {\n // SHA-256 → consume 4-byte windows as uint32 stream. Stable across Node\n // versions; storyboards assert exact forecast numbers.\n const digest = createHash('sha256').update(key).digest();\n let offset = 0;\n return {\n next: () => {\n if (offset + 4 > digest.length) {\n // Re-hash to extend the stream if a caller exhausts it.\n const extended = createHash('sha256').update(digest).digest();\n digest.set(extended);\n offset = 0;\n }\n const v = digest.readUInt32BE(offset);\n offset += 4;\n return v;\n },\n };\n}\n"],"mappings":"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","names":["url"]}
|
|
@@ -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 AUCTION_LIKE_OVERLAP = {
|
|
8
2
|
// Lowercase matches the AdCP wire `pricing_model` enum so the framework's
|
|
9
3
|
// `overlap ⊆ wire` validation passes.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/lib/mock-server/sales-non-guaranteed/recipe.ts"],"sourcesContent":["/**\n * `AuctionLikeRecipe` — canonical {@link Recipe} shape for hello adapters\n * wrapping the `sales-non-guaranteed` mock-server upstream.\n *\n * Auction-cleared programmatic remnant: floor pricing per zone (=\n * AdCP `ad_unit`), no inventory hold, no draft→committed lifecycle.\n * The recipe captures *how to flight a bid into the auction* — flight\n * id, zone targeting, priority, floor CPM. Generic across decision-\n * engine backends (Kevel) and exchange backends (OpenRTB DSPs/SSPs,\n * Beeswax, Adelphic) — adopters who want a sharper-typed shape declare\n * their own `recipe_kind: 'kevel' | 'openrtb' | ...` subtype on top.\n *\n * **No proposal lifecycle.** Non-guaranteed sells \"right of first refusal\n * at floor\"; there's no draft→committed ceremony. The recipe lands on\n * the buyer's first `create_media_buy` (no preceding finalize step).\n *\n * @public\n * @packageDocumentation\n */\n\nimport type { CapabilityOverlap, Recipe } from '../../server/decisioning/proposal';\nimport type { MockProduct } from './seed-data';\n\n/**\n * Canonical recipe for hello adapters wrapping an auction-cleared\n * remnant upstream. Generic across decision-engine and exchange\n * backends — fields map cleanly onto Kevel `Flight`, OpenRTB `imp`\n * + deal, Beeswax `Strategy`, etc. Adopters with platform-specific\n * fields (Kevel `frequency_caps`, Beeswax `bid_modifier_strategies`)\n * either extend in `extensions` or declare a sharper `recipe_kind`\n * subtype.\n *\n * @public\n */\nexport interface AuctionLikeRecipe extends Recipe {\n recipe_kind: 'auction';\n\n /** Upstream tenant — the publisher's network/account code. */\n network_code: string;\n\n /**\n * Zones (= AdCP `ad_unit`s) the bid flights into. Mirrors Kevel\n * `Flight.zone_ids` / OpenRTB `imp.tagid[]`.\n */\n zone_ids: readonly string[];\n\n /**\n * Auction-priority weight. Kevel default 5 (higher = more\n * aggressive); OpenRTB-flavored adapters typically map to deal\n * priority or `bidfloor` tier.\n */\n weight: number;\n\n /** Pricing the upstream will bid at. */\n pricing: {\n /** Floor / minimum CPM the upstream accepts. Bids below this are dropped. */\n floor_cpm: number;\n /**\n * Optional historical clearing CPM — typically 1.2-1.5x `floor_cpm`\n * at modest spend, saturating toward 2x at high budgets. Used by\n * the adapter to project effective CPM at the requested budget.\n */\n target_cpm?: number;\n currency: string;\n };\n\n /** Goal axis the auction's pacing optimizes toward. */\n goal_type: 'impressions' | 'click' | 'spend';\n\n /** Optional minimum spend threshold the upstream enforces. */\n min_spend?: number;\n\n /**\n * Native upstream identifier populated post-`create_media_buy`. Empty\n * pre-buy (the upstream allocates this on flight creation).\n */\n upstream_ids?: {\n flight_id?: string;\n };\n\n /**\n * Adopter-extension slot for platform-specific fields (Kevel\n * `frequency_caps`, OpenRTB `private_auction`, Beeswax\n * `bid_modifier_strategies`, etc.) so adopters carrying richer\n * upstream payloads don't have to fork `recipe_kind`. Opaque to the\n * framework. Subtype the recipe with a literal `recipe_kind` and\n * typed `extensions` if you want stricter shape enforcement.\n *\n * **MUST NOT carry credentials** (auction-house API keys, OAuth\n * tokens, HMAC secrets). The framework strips the entire\n * `implementation_config` envelope from buyer-facing wire responses,\n * so credentials here are protected *by coincidence of strip*, not\n * by a credential scan. Re-derive credentials per request from\n * `ctx.authInfo` + your token cache; embed only non-secret upstream\n * identifiers here. Same hazard class as `ctx_metadata` and `ext` —\n * see `docs/guides/CTX-METADATA-SAFETY.md`.\n */\n extensions?: Record<string, unknown>;\n}\n\n/**\n * Maximum capability set the auction-remnant model supports — every\n * product is CPM-only non-guaranteed; targeting axes are the ones\n * exchanges and decision engines commonly enforce. Per-product\n * `capability_overlap` is derived from this in {@link buildAuctionLikeRecipe}\n * intersected with the product's actual offering.\n *\n * @public\n */\nexport const AUCTION_LIKE_OVERLAP: CapabilityOverlap = {\n // Lowercase matches the AdCP wire `pricing_model` enum so the framework's\n // `overlap ⊆ wire` validation passes.\n pricingModels: new Set(['cpm']),\n deliveryTypes: new Set(['non_guaranteed']),\n targetingDimensions: new Set(['geo', 'device_type', 'language']),\n};\n\n/**\n * Build an {@link AuctionLikeRecipe} from a {@link MockProduct} returned\n * by the `sales-non-guaranteed` mock-server's `/v1/products` endpoint.\n *\n * Hello adapters call this inside their `proposalManager.getProducts`\n * (or `sales.getProducts` if no proposal lifecycle is wired) to project\n * the upstream's native shape onto the recipe contract.\n *\n * @public\n */\nexport function buildAuctionLikeRecipe(\n product: MockProduct,\n options: {\n /** Override the auction-priority weight. Defaults to `5`. */\n weight?: number;\n /**\n * Goal axis. Defaults to `'impressions'` (typical for\n * floor-priced remnant).\n */\n goal_type?: AuctionLikeRecipe['goal_type'];\n /** Set post-`create_media_buy`. */\n upstream_ids?: AuctionLikeRecipe['upstream_ids'];\n /** Adopter-supplied extension blob. */\n extensions?: Record<string, unknown>;\n } = {}\n): AuctionLikeRecipe {\n const recipe: AuctionLikeRecipe = {\n recipe_kind: 'auction',\n network_code: product.network_code,\n zone_ids: product.ad_unit_ids,\n weight: options.weight ?? 5,\n pricing: {\n floor_cpm: product.pricing.min_cpm,\n currency: product.pricing.currency,\n ...(product.pricing.target_cpm !== undefined && { target_cpm: product.pricing.target_cpm }),\n },\n goal_type: options.goal_type ?? 'impressions',\n // Per-product overlap: matches the auction-remnant model where\n // every product is CPM-only non-guaranteed. We derive per-product\n // (rather than reusing AUCTION_LIKE_OVERLAP wholesale) to keep the\n // pattern consistent with GAM-like and to surface adopter drift\n // when a product's wire shape doesn't match the recipe overlap.\n capability_overlap: {\n pricingModels: new Set(['cpm']),\n deliveryTypes: new Set(['non_guaranteed']),\n targetingDimensions: AUCTION_LIKE_OVERLAP.targetingDimensions,\n },\n };\n if (product.pricing.min_spend !== undefined) recipe.min_spend = product.pricing.min_spend;\n if (options.upstream_ids) recipe.upstream_ids = options.upstream_ids;\n if (options.extensions) recipe.extensions = options.extensions;\n return recipe;\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../../../../src/lib/mock-server/sales-non-guaranteed/recipe.ts"],"sourcesContent":["/**\n * `AuctionLikeRecipe` — canonical {@link Recipe} shape for hello adapters\n * wrapping the `sales-non-guaranteed` mock-server upstream.\n *\n * Auction-cleared programmatic remnant: floor pricing per zone (=\n * AdCP `ad_unit`), no inventory hold, no draft→committed lifecycle.\n * The recipe captures *how to flight a bid into the auction* — flight\n * id, zone targeting, priority, floor CPM. Generic across decision-\n * engine backends (Kevel) and exchange backends (OpenRTB DSPs/SSPs,\n * Beeswax, Adelphic) — adopters who want a sharper-typed shape declare\n * their own `recipe_kind: 'kevel' | 'openrtb' | ...` subtype on top.\n *\n * **No proposal lifecycle.** Non-guaranteed sells \"right of first refusal\n * at floor\"; there's no draft→committed ceremony. The recipe lands on\n * the buyer's first `create_media_buy` (no preceding finalize step).\n *\n * @public\n * @packageDocumentation\n */\n\nimport type { CapabilityOverlap, Recipe } from '../../server/decisioning/proposal';\nimport type { MockProduct } from './seed-data';\n\n/**\n * Canonical recipe for hello adapters wrapping an auction-cleared\n * remnant upstream. Generic across decision-engine and exchange\n * backends — fields map cleanly onto Kevel `Flight`, OpenRTB `imp`\n * + deal, Beeswax `Strategy`, etc. Adopters with platform-specific\n * fields (Kevel `frequency_caps`, Beeswax `bid_modifier_strategies`)\n * either extend in `extensions` or declare a sharper `recipe_kind`\n * subtype.\n *\n * @public\n */\nexport interface AuctionLikeRecipe extends Recipe {\n recipe_kind: 'auction';\n\n /** Upstream tenant — the publisher's network/account code. */\n network_code: string;\n\n /**\n * Zones (= AdCP `ad_unit`s) the bid flights into. Mirrors Kevel\n * `Flight.zone_ids` / OpenRTB `imp.tagid[]`.\n */\n zone_ids: readonly string[];\n\n /**\n * Auction-priority weight. Kevel default 5 (higher = more\n * aggressive); OpenRTB-flavored adapters typically map to deal\n * priority or `bidfloor` tier.\n */\n weight: number;\n\n /** Pricing the upstream will bid at. */\n pricing: {\n /** Floor / minimum CPM the upstream accepts. Bids below this are dropped. */\n floor_cpm: number;\n /**\n * Optional historical clearing CPM — typically 1.2-1.5x `floor_cpm`\n * at modest spend, saturating toward 2x at high budgets. Used by\n * the adapter to project effective CPM at the requested budget.\n */\n target_cpm?: number;\n currency: string;\n };\n\n /** Goal axis the auction's pacing optimizes toward. */\n goal_type: 'impressions' | 'click' | 'spend';\n\n /** Optional minimum spend threshold the upstream enforces. */\n min_spend?: number;\n\n /**\n * Native upstream identifier populated post-`create_media_buy`. Empty\n * pre-buy (the upstream allocates this on flight creation).\n */\n upstream_ids?: {\n flight_id?: string;\n };\n\n /**\n * Adopter-extension slot for platform-specific fields (Kevel\n * `frequency_caps`, OpenRTB `private_auction`, Beeswax\n * `bid_modifier_strategies`, etc.) so adopters carrying richer\n * upstream payloads don't have to fork `recipe_kind`. Opaque to the\n * framework. Subtype the recipe with a literal `recipe_kind` and\n * typed `extensions` if you want stricter shape enforcement.\n *\n * **MUST NOT carry credentials** (auction-house API keys, OAuth\n * tokens, HMAC secrets). The framework strips the entire\n * `implementation_config` envelope from buyer-facing wire responses,\n * so credentials here are protected *by coincidence of strip*, not\n * by a credential scan. Re-derive credentials per request from\n * `ctx.authInfo` + your token cache; embed only non-secret upstream\n * identifiers here. Same hazard class as `ctx_metadata` and `ext` —\n * see `docs/guides/CTX-METADATA-SAFETY.md`.\n */\n extensions?: Record<string, unknown>;\n}\n\n/**\n * Maximum capability set the auction-remnant model supports — every\n * product is CPM-only non-guaranteed; targeting axes are the ones\n * exchanges and decision engines commonly enforce. Per-product\n * `capability_overlap` is derived from this in {@link buildAuctionLikeRecipe}\n * intersected with the product's actual offering.\n *\n * @public\n */\nexport const AUCTION_LIKE_OVERLAP: CapabilityOverlap = {\n // Lowercase matches the AdCP wire `pricing_model` enum so the framework's\n // `overlap ⊆ wire` validation passes.\n pricingModels: new Set(['cpm']),\n deliveryTypes: new Set(['non_guaranteed']),\n targetingDimensions: new Set(['geo', 'device_type', 'language']),\n};\n\n/**\n * Build an {@link AuctionLikeRecipe} from a {@link MockProduct} returned\n * by the `sales-non-guaranteed` mock-server's `/v1/products` endpoint.\n *\n * Hello adapters call this inside their `proposalManager.getProducts`\n * (or `sales.getProducts` if no proposal lifecycle is wired) to project\n * the upstream's native shape onto the recipe contract.\n *\n * @public\n */\nexport function buildAuctionLikeRecipe(\n product: MockProduct,\n options: {\n /** Override the auction-priority weight. Defaults to `5`. */\n weight?: number;\n /**\n * Goal axis. Defaults to `'impressions'` (typical for\n * floor-priced remnant).\n */\n goal_type?: AuctionLikeRecipe['goal_type'];\n /** Set post-`create_media_buy`. */\n upstream_ids?: AuctionLikeRecipe['upstream_ids'];\n /** Adopter-supplied extension blob. */\n extensions?: Record<string, unknown>;\n } = {}\n): AuctionLikeRecipe {\n const recipe: AuctionLikeRecipe = {\n recipe_kind: 'auction',\n network_code: product.network_code,\n zone_ids: product.ad_unit_ids,\n weight: options.weight ?? 5,\n pricing: {\n floor_cpm: product.pricing.min_cpm,\n currency: product.pricing.currency,\n ...(product.pricing.target_cpm !== undefined && { target_cpm: product.pricing.target_cpm }),\n },\n goal_type: options.goal_type ?? 'impressions',\n // Per-product overlap: matches the auction-remnant model where\n // every product is CPM-only non-guaranteed. We derive per-product\n // (rather than reusing AUCTION_LIKE_OVERLAP wholesale) to keep the\n // pattern consistent with GAM-like and to surface adopter drift\n // when a product's wire shape doesn't match the recipe overlap.\n capability_overlap: {\n pricingModels: new Set(['cpm']),\n deliveryTypes: new Set(['non_guaranteed']),\n targetingDimensions: AUCTION_LIKE_OVERLAP.targetingDimensions,\n },\n };\n if (product.pricing.min_spend !== undefined) recipe.min_spend = product.pricing.min_spend;\n if (options.upstream_ids) recipe.upstream_ids = options.upstream_ids;\n if (options.extensions) recipe.extensions = options.extensions;\n return recipe;\n}\n"],"mappings":"AA6GO,MAAM,uBAA0C;AAAA;AAAA;AAAA,EAGrD,eAAe,oBAAI,IAAI,CAAC,KAAK,CAAC;AAAA,EAC9B,eAAe,oBAAI,IAAI,CAAC,gBAAgB,CAAC;AAAA,EACzC,qBAAqB,oBAAI,IAAI,CAAC,OAAO,eAAe,UAAU,CAAC;AACjE;AAYO,SAAS,uBACd,SACA,UAYI,CAAC,GACc;AACnB,QAAM,SAA4B;AAAA,IAChC,aAAa;AAAA,IACb,cAAc,QAAQ;AAAA,IACtB,UAAU,QAAQ;AAAA,IAClB,QAAQ,QAAQ,UAAU;AAAA,IAC1B,SAAS;AAAA,MACP,WAAW,QAAQ,QAAQ;AAAA,MAC3B,UAAU,QAAQ,QAAQ;AAAA,MAC1B,GAAI,QAAQ,QAAQ,eAAe,UAAa,EAAE,YAAY,QAAQ,QAAQ,WAAW;AAAA,IAC3F;AAAA,IACA,WAAW,QAAQ,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAMhC,oBAAoB;AAAA,MAClB,eAAe,oBAAI,IAAI,CAAC,KAAK,CAAC;AAAA,MAC9B,eAAe,oBAAI,IAAI,CAAC,gBAAgB,CAAC;AAAA,MACzC,qBAAqB,qBAAqB;AAAA,IAC5C;AAAA,EACF;AACA,MAAI,QAAQ,QAAQ,cAAc,OAAW,QAAO,YAAY,QAAQ,QAAQ;AAChF,MAAI,QAAQ,aAAc,QAAO,eAAe,QAAQ;AACxD,MAAI,QAAQ,WAAY,QAAO,aAAa,QAAQ;AACpD,SAAO;AACT;","names":[]}
|
|
@@ -1,9 +1,3 @@
|
|
|
1
|
-
import { fileURLToPath as __adcpFileURLToPath } from 'node:url';
|
|
2
|
-
import { dirname as __adcpDirname } from 'node:path';
|
|
3
|
-
import { createRequire as __adcpCreateRequire } from 'node:module';
|
|
4
|
-
const __filename = __adcpFileURLToPath(import.meta.url);
|
|
5
|
-
const __dirname = __adcpDirname(__filename);
|
|
6
|
-
const require = __adcpCreateRequire(import.meta.url);
|
|
7
1
|
const NETWORKS = [
|
|
8
2
|
{
|
|
9
3
|
network_code: "net_remnant_us",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/lib/mock-server/sales-non-guaranteed/seed-data.ts"],"sourcesContent":["/**\n * Seed data for the `sales-non-guaranteed` mock-server.\n *\n * Closes #1457 (sub-issue of #1381). Programmatic-auction shape:\n * floor pricing per product (`min_cpm`), sync confirmation on\n * `POST /v1/orders` (no HITL approval), single-bucket delivery\n * scaling with budget × pacing curve. No guaranteed-availability\n * surface — forecast is `spend`-only with saturating returns at\n * high budgets (auction-clearing premium ~1.3x floor at modest\n * budgets, asymptoting at ~2x).\n *\n * Compare to `sales-guaranteed/seed-data.ts`:\n * - `MockProduct.pricing.cpm` (fixed) → `MockProduct.pricing.min_cpm` (floor) + optional `target_cpm`.\n * - `MockProduct.availability.available_impressions` → out of scope (programmatic).\n * - `MockProduct.delivery_type: 'guaranteed'` → always `'non_guaranteed'`.\n */\n\nexport interface MockNetwork {\n network_code: string;\n display_name: string;\n /** AdCP-side identifier the adapter receives (typically `account.publisher`). */\n adcp_publisher: string;\n}\n\nexport interface MockAdUnit {\n ad_unit_id: string;\n name: string;\n path: string;\n network_code: string;\n sizes: Array<{ width: number; height: number }>;\n environment: 'web' | 'mobile_app' | 'ctv' | 'audio';\n targetable: boolean;\n}\n\nexport interface MockProduct {\n product_id: string;\n name: string;\n network_code: string;\n /** Always `'non_guaranteed'` for this mock — auction-cleared programmatic remnant. */\n delivery_type: 'non_guaranteed';\n channel: 'video' | 'ctv' | 'display' | 'audio';\n format_ids: string[];\n ad_unit_ids: string[];\n pricing: {\n /** Floor (minimum) CPM in `currency`. Sellers accept any bid ≥ floor. */\n min_cpm: number;\n /** Optional historical clearing CPM — typically 1.2-1.5x `min_cpm` at\n * modest spend, saturating toward 2x at high budgets. Used by the\n * forecast endpoint to project effective CPM at the requested budget. */\n target_cpm?: number;\n currency: string;\n /** Optional minimum spend to access this product. Pacing/learning-floor\n * style, not a guarantee threshold. */\n min_spend?: number;\n };\n}\n\nexport const NETWORKS: MockNetwork[] = [\n {\n network_code: 'net_remnant_us',\n display_name: 'Programmatic Remnant Network — US',\n adcp_publisher: 'remnant-network.example',\n },\n {\n network_code: 'net_remnant_eu',\n display_name: 'Programmatic Remnant Network — EU',\n adcp_publisher: 'remnant-network.eu',\n },\n // Storyboard-fixture-aligned entries — the `sales_non_guaranteed`\n // storyboard sends payloads with these publisher domains. Mirrors the\n // pattern from `sales-guaranteed/seed-data.ts`. Without seeded fixture\n // domains, every `_lookup/network` returns 404 and a blind agent has\n // to invent a fallback that contradicts the skill's \"fail closed on\n // 404\" advice. Track upstream-fixture rationale at adcontextprotocol/adcp#3822.\n {\n network_code: 'net_acmeoutdoor',\n display_name: 'Acme Outdoor Media',\n adcp_publisher: 'acmeoutdoor.example',\n },\n {\n network_code: 'net_pinnacle',\n display_name: 'Pinnacle Agency',\n adcp_publisher: 'pinnacle-agency.example',\n },\n];\n\nexport const AD_UNITS: MockAdUnit[] = [\n {\n ad_unit_id: 'au_us_display_medrec',\n name: 'US Display Medrec — Run of Network',\n path: '/remnant/us/display/medrec',\n network_code: 'net_remnant_us',\n sizes: [{ width: 300, height: 250 }],\n environment: 'web',\n targetable: true,\n },\n {\n ad_unit_id: 'au_us_display_leaderboard',\n name: 'US Display Leaderboard — Run of Network',\n path: '/remnant/us/display/leaderboard',\n network_code: 'net_remnant_us',\n sizes: [{ width: 728, height: 90 }],\n environment: 'web',\n targetable: true,\n },\n {\n ad_unit_id: 'au_us_video_outstream',\n name: 'US Video Outstream — Run of Network',\n path: '/remnant/us/video/outstream',\n network_code: 'net_remnant_us',\n sizes: [{ width: 640, height: 360 }],\n environment: 'web',\n targetable: true,\n },\n {\n ad_unit_id: 'au_us_ctv_15s',\n name: 'US CTV 15s — Programmatic Remnant',\n path: '/remnant/us/ctv/15s',\n network_code: 'net_remnant_us',\n sizes: [{ width: 1920, height: 1080 }],\n environment: 'ctv',\n targetable: true,\n },\n {\n ad_unit_id: 'au_eu_display_medrec',\n name: 'EU Display Medrec — Run of Network',\n path: '/remnant/eu/display/medrec',\n network_code: 'net_remnant_eu',\n sizes: [{ width: 300, height: 250 }],\n environment: 'web',\n targetable: true,\n },\n // Storyboard-fixture-aligned ad units.\n {\n ad_unit_id: 'au_acmeoutdoor_dooh',\n name: 'Acme Outdoor — DOOH Programmatic',\n path: '/acme/outdoor/dooh',\n network_code: 'net_acmeoutdoor',\n sizes: [{ width: 1920, height: 1080 }],\n environment: 'web',\n targetable: true,\n },\n {\n ad_unit_id: 'au_acmeoutdoor_display',\n name: 'Acme Outdoor — Display Programmatic',\n path: '/acme/outdoor/display',\n network_code: 'net_acmeoutdoor',\n sizes: [{ width: 300, height: 250 }],\n environment: 'web',\n targetable: true,\n },\n {\n ad_unit_id: 'au_pinnacle_remnant',\n name: 'Pinnacle Display Remnant',\n path: '/pinnacle/display/remnant',\n network_code: 'net_pinnacle',\n sizes: [{ width: 300, height: 250 }],\n environment: 'web',\n targetable: true,\n },\n];\n\nexport const PRODUCTS: MockProduct[] = [\n {\n product_id: 'display_medrec_remnant',\n name: 'Display Medrec — Remnant',\n network_code: 'net_remnant_us',\n delivery_type: 'non_guaranteed',\n channel: 'display',\n format_ids: ['display_300x250'],\n ad_unit_ids: ['au_us_display_medrec'],\n pricing: { min_cpm: 1.5, target_cpm: 2.25, currency: 'USD' },\n },\n {\n product_id: 'display_leaderboard_remnant',\n name: 'Display Leaderboard — Remnant',\n network_code: 'net_remnant_us',\n delivery_type: 'non_guaranteed',\n channel: 'display',\n format_ids: ['display_728x90'],\n ad_unit_ids: ['au_us_display_leaderboard'],\n pricing: { min_cpm: 1.0, target_cpm: 1.5, currency: 'USD' },\n },\n {\n product_id: 'video_outstream_remnant',\n name: 'Video Outstream — Remnant',\n network_code: 'net_remnant_us',\n delivery_type: 'non_guaranteed',\n channel: 'video',\n format_ids: ['video_30s', 'video_15s'],\n ad_unit_ids: ['au_us_video_outstream'],\n pricing: { min_cpm: 8.0, target_cpm: 12.0, currency: 'USD', min_spend: 1_000 },\n },\n {\n product_id: 'ctv_15s_remnant',\n name: 'CTV 15s — Programmatic Remnant',\n network_code: 'net_remnant_us',\n delivery_type: 'non_guaranteed',\n channel: 'ctv',\n format_ids: ['video_15s'],\n ad_unit_ids: ['au_us_ctv_15s'],\n pricing: { min_cpm: 15.0, target_cpm: 22.0, currency: 'USD', min_spend: 5_000 },\n },\n {\n product_id: 'display_medrec_remnant_eu',\n name: 'Display Medrec — Remnant (EU)',\n network_code: 'net_remnant_eu',\n delivery_type: 'non_guaranteed',\n channel: 'display',\n format_ids: ['display_300x250'],\n ad_unit_ids: ['au_eu_display_medrec'],\n pricing: { min_cpm: 1.2, target_cpm: 1.8, currency: 'EUR' },\n },\n // Storyboard-fixture-aligned products.\n {\n product_id: 'acme_dooh_remnant_q2',\n name: 'Acme Outdoor — DOOH Programmatic Q2',\n network_code: 'net_acmeoutdoor',\n delivery_type: 'non_guaranteed',\n channel: 'video',\n format_ids: ['video_15s'],\n ad_unit_ids: ['au_acmeoutdoor_dooh'],\n pricing: { min_cpm: 6.0, target_cpm: 9.0, currency: 'USD', min_spend: 500 },\n },\n {\n product_id: 'acme_display_remnant_q2',\n name: 'Acme Outdoor — Display Programmatic Q2',\n network_code: 'net_acmeoutdoor',\n delivery_type: 'non_guaranteed',\n channel: 'display',\n format_ids: ['display_300x250'],\n ad_unit_ids: ['au_acmeoutdoor_display'],\n pricing: { min_cpm: 1.25, target_cpm: 1.9, currency: 'USD', min_spend: 500 },\n },\n {\n product_id: 'pinnacle_display_remnant_q2',\n name: 'Pinnacle Display Remnant Q2',\n network_code: 'net_pinnacle',\n delivery_type: 'non_guaranteed',\n channel: 'display',\n format_ids: ['display_300x250'],\n ad_unit_ids: ['au_pinnacle_remnant'],\n pricing: { min_cpm: 0.85, target_cpm: 1.3, currency: 'USD' },\n },\n];\n\n/** Default static API key (Bearer). Real DSPs / SSPs typically use OAuth\n * or signed-request auth; static Bearer keeps the test surface varied\n * (sales-social already exercises OAuth, sales-guaranteed uses static\n * Bearer too — this mock matches the latter to focus on the auction\n * shape rather than re-exercising OAuth). */\nexport const DEFAULT_API_KEY = 'mock_sales_non_guaranteed_key_do_not_use_in_prod';\n"],"mappings":";;;;;;AAyDO,MAAM,WAA0B;AAAA,EACrC;AAAA,IACE,cAAc;AAAA,IACd,cAAc;AAAA,IACd,gBAAgB;AAAA,EAClB;AAAA,EACA;AAAA,IACE,cAAc;AAAA,IACd,cAAc;AAAA,IACd,gBAAgB;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA;AAAA,IACE,cAAc;AAAA,IACd,cAAc;AAAA,IACd,gBAAgB;AAAA,EAClB;AAAA,EACA;AAAA,IACE,cAAc;AAAA,IACd,cAAc;AAAA,IACd,gBAAgB;AAAA,EAClB;AACF;AAEO,MAAM,WAAyB;AAAA,EACpC;AAAA,IACE,YAAY;AAAA,IACZ,MAAM;AAAA,IACN,MAAM;AAAA,IACN,cAAc;AAAA,IACd,OAAO,CAAC,EAAE,OAAO,KAAK,QAAQ,IAAI,CAAC;AAAA,IACnC,aAAa;AAAA,IACb,YAAY;AAAA,EACd;AAAA,EACA;AAAA,IACE,YAAY;AAAA,IACZ,MAAM;AAAA,IACN,MAAM;AAAA,IACN,cAAc;AAAA,IACd,OAAO,CAAC,EAAE,OAAO,KAAK,QAAQ,GAAG,CAAC;AAAA,IAClC,aAAa;AAAA,IACb,YAAY;AAAA,EACd;AAAA,EACA;AAAA,IACE,YAAY;AAAA,IACZ,MAAM;AAAA,IACN,MAAM;AAAA,IACN,cAAc;AAAA,IACd,OAAO,CAAC,EAAE,OAAO,KAAK,QAAQ,IAAI,CAAC;AAAA,IACnC,aAAa;AAAA,IACb,YAAY;AAAA,EACd;AAAA,EACA;AAAA,IACE,YAAY;AAAA,IACZ,MAAM;AAAA,IACN,MAAM;AAAA,IACN,cAAc;AAAA,IACd,OAAO,CAAC,EAAE,OAAO,MAAM,QAAQ,KAAK,CAAC;AAAA,IACrC,aAAa;AAAA,IACb,YAAY;AAAA,EACd;AAAA,EACA;AAAA,IACE,YAAY;AAAA,IACZ,MAAM;AAAA,IACN,MAAM;AAAA,IACN,cAAc;AAAA,IACd,OAAO,CAAC,EAAE,OAAO,KAAK,QAAQ,IAAI,CAAC;AAAA,IACnC,aAAa;AAAA,IACb,YAAY;AAAA,EACd;AAAA;AAAA,EAEA;AAAA,IACE,YAAY;AAAA,IACZ,MAAM;AAAA,IACN,MAAM;AAAA,IACN,cAAc;AAAA,IACd,OAAO,CAAC,EAAE,OAAO,MAAM,QAAQ,KAAK,CAAC;AAAA,IACrC,aAAa;AAAA,IACb,YAAY;AAAA,EACd;AAAA,EACA;AAAA,IACE,YAAY;AAAA,IACZ,MAAM;AAAA,IACN,MAAM;AAAA,IACN,cAAc;AAAA,IACd,OAAO,CAAC,EAAE,OAAO,KAAK,QAAQ,IAAI,CAAC;AAAA,IACnC,aAAa;AAAA,IACb,YAAY;AAAA,EACd;AAAA,EACA;AAAA,IACE,YAAY;AAAA,IACZ,MAAM;AAAA,IACN,MAAM;AAAA,IACN,cAAc;AAAA,IACd,OAAO,CAAC,EAAE,OAAO,KAAK,QAAQ,IAAI,CAAC;AAAA,IACnC,aAAa;AAAA,IACb,YAAY;AAAA,EACd;AACF;AAEO,MAAM,WAA0B;AAAA,EACrC;AAAA,IACE,YAAY;AAAA,IACZ,MAAM;AAAA,IACN,cAAc;AAAA,IACd,eAAe;AAAA,IACf,SAAS;AAAA,IACT,YAAY,CAAC,iBAAiB;AAAA,IAC9B,aAAa,CAAC,sBAAsB;AAAA,IACpC,SAAS,EAAE,SAAS,KAAK,YAAY,MAAM,UAAU,MAAM;AAAA,EAC7D;AAAA,EACA;AAAA,IACE,YAAY;AAAA,IACZ,MAAM;AAAA,IACN,cAAc;AAAA,IACd,eAAe;AAAA,IACf,SAAS;AAAA,IACT,YAAY,CAAC,gBAAgB;AAAA,IAC7B,aAAa,CAAC,2BAA2B;AAAA,IACzC,SAAS,EAAE,SAAS,GAAK,YAAY,KAAK,UAAU,MAAM;AAAA,EAC5D;AAAA,EACA;AAAA,IACE,YAAY;AAAA,IACZ,MAAM;AAAA,IACN,cAAc;AAAA,IACd,eAAe;AAAA,IACf,SAAS;AAAA,IACT,YAAY,CAAC,aAAa,WAAW;AAAA,IACrC,aAAa,CAAC,uBAAuB;AAAA,IACrC,SAAS,EAAE,SAAS,GAAK,YAAY,IAAM,UAAU,OAAO,WAAW,IAAM;AAAA,EAC/E;AAAA,EACA;AAAA,IACE,YAAY;AAAA,IACZ,MAAM;AAAA,IACN,cAAc;AAAA,IACd,eAAe;AAAA,IACf,SAAS;AAAA,IACT,YAAY,CAAC,WAAW;AAAA,IACxB,aAAa,CAAC,eAAe;AAAA,IAC7B,SAAS,EAAE,SAAS,IAAM,YAAY,IAAM,UAAU,OAAO,WAAW,IAAM;AAAA,EAChF;AAAA,EACA;AAAA,IACE,YAAY;AAAA,IACZ,MAAM;AAAA,IACN,cAAc;AAAA,IACd,eAAe;AAAA,IACf,SAAS;AAAA,IACT,YAAY,CAAC,iBAAiB;AAAA,IAC9B,aAAa,CAAC,sBAAsB;AAAA,IACpC,SAAS,EAAE,SAAS,KAAK,YAAY,KAAK,UAAU,MAAM;AAAA,EAC5D;AAAA;AAAA,EAEA;AAAA,IACE,YAAY;AAAA,IACZ,MAAM;AAAA,IACN,cAAc;AAAA,IACd,eAAe;AAAA,IACf,SAAS;AAAA,IACT,YAAY,CAAC,WAAW;AAAA,IACxB,aAAa,CAAC,qBAAqB;AAAA,IACnC,SAAS,EAAE,SAAS,GAAK,YAAY,GAAK,UAAU,OAAO,WAAW,IAAI;AAAA,EAC5E;AAAA,EACA;AAAA,IACE,YAAY;AAAA,IACZ,MAAM;AAAA,IACN,cAAc;AAAA,IACd,eAAe;AAAA,IACf,SAAS;AAAA,IACT,YAAY,CAAC,iBAAiB;AAAA,IAC9B,aAAa,CAAC,wBAAwB;AAAA,IACtC,SAAS,EAAE,SAAS,MAAM,YAAY,KAAK,UAAU,OAAO,WAAW,IAAI;AAAA,EAC7E;AAAA,EACA;AAAA,IACE,YAAY;AAAA,IACZ,MAAM;AAAA,IACN,cAAc;AAAA,IACd,eAAe;AAAA,IACf,SAAS;AAAA,IACT,YAAY,CAAC,iBAAiB;AAAA,IAC9B,aAAa,CAAC,qBAAqB;AAAA,IACnC,SAAS,EAAE,SAAS,MAAM,YAAY,KAAK,UAAU,MAAM;AAAA,EAC7D;AACF;AAOO,MAAM,kBAAkB;","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../../../src/lib/mock-server/sales-non-guaranteed/seed-data.ts"],"sourcesContent":["/**\n * Seed data for the `sales-non-guaranteed` mock-server.\n *\n * Closes #1457 (sub-issue of #1381). Programmatic-auction shape:\n * floor pricing per product (`min_cpm`), sync confirmation on\n * `POST /v1/orders` (no HITL approval), single-bucket delivery\n * scaling with budget × pacing curve. No guaranteed-availability\n * surface — forecast is `spend`-only with saturating returns at\n * high budgets (auction-clearing premium ~1.3x floor at modest\n * budgets, asymptoting at ~2x).\n *\n * Compare to `sales-guaranteed/seed-data.ts`:\n * - `MockProduct.pricing.cpm` (fixed) → `MockProduct.pricing.min_cpm` (floor) + optional `target_cpm`.\n * - `MockProduct.availability.available_impressions` → out of scope (programmatic).\n * - `MockProduct.delivery_type: 'guaranteed'` → always `'non_guaranteed'`.\n */\n\nexport interface MockNetwork {\n network_code: string;\n display_name: string;\n /** AdCP-side identifier the adapter receives (typically `account.publisher`). */\n adcp_publisher: string;\n}\n\nexport interface MockAdUnit {\n ad_unit_id: string;\n name: string;\n path: string;\n network_code: string;\n sizes: Array<{ width: number; height: number }>;\n environment: 'web' | 'mobile_app' | 'ctv' | 'audio';\n targetable: boolean;\n}\n\nexport interface MockProduct {\n product_id: string;\n name: string;\n network_code: string;\n /** Always `'non_guaranteed'` for this mock — auction-cleared programmatic remnant. */\n delivery_type: 'non_guaranteed';\n channel: 'video' | 'ctv' | 'display' | 'audio';\n format_ids: string[];\n ad_unit_ids: string[];\n pricing: {\n /** Floor (minimum) CPM in `currency`. Sellers accept any bid ≥ floor. */\n min_cpm: number;\n /** Optional historical clearing CPM — typically 1.2-1.5x `min_cpm` at\n * modest spend, saturating toward 2x at high budgets. Used by the\n * forecast endpoint to project effective CPM at the requested budget. */\n target_cpm?: number;\n currency: string;\n /** Optional minimum spend to access this product. Pacing/learning-floor\n * style, not a guarantee threshold. */\n min_spend?: number;\n };\n}\n\nexport const NETWORKS: MockNetwork[] = [\n {\n network_code: 'net_remnant_us',\n display_name: 'Programmatic Remnant Network — US',\n adcp_publisher: 'remnant-network.example',\n },\n {\n network_code: 'net_remnant_eu',\n display_name: 'Programmatic Remnant Network — EU',\n adcp_publisher: 'remnant-network.eu',\n },\n // Storyboard-fixture-aligned entries — the `sales_non_guaranteed`\n // storyboard sends payloads with these publisher domains. Mirrors the\n // pattern from `sales-guaranteed/seed-data.ts`. Without seeded fixture\n // domains, every `_lookup/network` returns 404 and a blind agent has\n // to invent a fallback that contradicts the skill's \"fail closed on\n // 404\" advice. Track upstream-fixture rationale at adcontextprotocol/adcp#3822.\n {\n network_code: 'net_acmeoutdoor',\n display_name: 'Acme Outdoor Media',\n adcp_publisher: 'acmeoutdoor.example',\n },\n {\n network_code: 'net_pinnacle',\n display_name: 'Pinnacle Agency',\n adcp_publisher: 'pinnacle-agency.example',\n },\n];\n\nexport const AD_UNITS: MockAdUnit[] = [\n {\n ad_unit_id: 'au_us_display_medrec',\n name: 'US Display Medrec — Run of Network',\n path: '/remnant/us/display/medrec',\n network_code: 'net_remnant_us',\n sizes: [{ width: 300, height: 250 }],\n environment: 'web',\n targetable: true,\n },\n {\n ad_unit_id: 'au_us_display_leaderboard',\n name: 'US Display Leaderboard — Run of Network',\n path: '/remnant/us/display/leaderboard',\n network_code: 'net_remnant_us',\n sizes: [{ width: 728, height: 90 }],\n environment: 'web',\n targetable: true,\n },\n {\n ad_unit_id: 'au_us_video_outstream',\n name: 'US Video Outstream — Run of Network',\n path: '/remnant/us/video/outstream',\n network_code: 'net_remnant_us',\n sizes: [{ width: 640, height: 360 }],\n environment: 'web',\n targetable: true,\n },\n {\n ad_unit_id: 'au_us_ctv_15s',\n name: 'US CTV 15s — Programmatic Remnant',\n path: '/remnant/us/ctv/15s',\n network_code: 'net_remnant_us',\n sizes: [{ width: 1920, height: 1080 }],\n environment: 'ctv',\n targetable: true,\n },\n {\n ad_unit_id: 'au_eu_display_medrec',\n name: 'EU Display Medrec — Run of Network',\n path: '/remnant/eu/display/medrec',\n network_code: 'net_remnant_eu',\n sizes: [{ width: 300, height: 250 }],\n environment: 'web',\n targetable: true,\n },\n // Storyboard-fixture-aligned ad units.\n {\n ad_unit_id: 'au_acmeoutdoor_dooh',\n name: 'Acme Outdoor — DOOH Programmatic',\n path: '/acme/outdoor/dooh',\n network_code: 'net_acmeoutdoor',\n sizes: [{ width: 1920, height: 1080 }],\n environment: 'web',\n targetable: true,\n },\n {\n ad_unit_id: 'au_acmeoutdoor_display',\n name: 'Acme Outdoor — Display Programmatic',\n path: '/acme/outdoor/display',\n network_code: 'net_acmeoutdoor',\n sizes: [{ width: 300, height: 250 }],\n environment: 'web',\n targetable: true,\n },\n {\n ad_unit_id: 'au_pinnacle_remnant',\n name: 'Pinnacle Display Remnant',\n path: '/pinnacle/display/remnant',\n network_code: 'net_pinnacle',\n sizes: [{ width: 300, height: 250 }],\n environment: 'web',\n targetable: true,\n },\n];\n\nexport const PRODUCTS: MockProduct[] = [\n {\n product_id: 'display_medrec_remnant',\n name: 'Display Medrec — Remnant',\n network_code: 'net_remnant_us',\n delivery_type: 'non_guaranteed',\n channel: 'display',\n format_ids: ['display_300x250'],\n ad_unit_ids: ['au_us_display_medrec'],\n pricing: { min_cpm: 1.5, target_cpm: 2.25, currency: 'USD' },\n },\n {\n product_id: 'display_leaderboard_remnant',\n name: 'Display Leaderboard — Remnant',\n network_code: 'net_remnant_us',\n delivery_type: 'non_guaranteed',\n channel: 'display',\n format_ids: ['display_728x90'],\n ad_unit_ids: ['au_us_display_leaderboard'],\n pricing: { min_cpm: 1.0, target_cpm: 1.5, currency: 'USD' },\n },\n {\n product_id: 'video_outstream_remnant',\n name: 'Video Outstream — Remnant',\n network_code: 'net_remnant_us',\n delivery_type: 'non_guaranteed',\n channel: 'video',\n format_ids: ['video_30s', 'video_15s'],\n ad_unit_ids: ['au_us_video_outstream'],\n pricing: { min_cpm: 8.0, target_cpm: 12.0, currency: 'USD', min_spend: 1_000 },\n },\n {\n product_id: 'ctv_15s_remnant',\n name: 'CTV 15s — Programmatic Remnant',\n network_code: 'net_remnant_us',\n delivery_type: 'non_guaranteed',\n channel: 'ctv',\n format_ids: ['video_15s'],\n ad_unit_ids: ['au_us_ctv_15s'],\n pricing: { min_cpm: 15.0, target_cpm: 22.0, currency: 'USD', min_spend: 5_000 },\n },\n {\n product_id: 'display_medrec_remnant_eu',\n name: 'Display Medrec — Remnant (EU)',\n network_code: 'net_remnant_eu',\n delivery_type: 'non_guaranteed',\n channel: 'display',\n format_ids: ['display_300x250'],\n ad_unit_ids: ['au_eu_display_medrec'],\n pricing: { min_cpm: 1.2, target_cpm: 1.8, currency: 'EUR' },\n },\n // Storyboard-fixture-aligned products.\n {\n product_id: 'acme_dooh_remnant_q2',\n name: 'Acme Outdoor — DOOH Programmatic Q2',\n network_code: 'net_acmeoutdoor',\n delivery_type: 'non_guaranteed',\n channel: 'video',\n format_ids: ['video_15s'],\n ad_unit_ids: ['au_acmeoutdoor_dooh'],\n pricing: { min_cpm: 6.0, target_cpm: 9.0, currency: 'USD', min_spend: 500 },\n },\n {\n product_id: 'acme_display_remnant_q2',\n name: 'Acme Outdoor — Display Programmatic Q2',\n network_code: 'net_acmeoutdoor',\n delivery_type: 'non_guaranteed',\n channel: 'display',\n format_ids: ['display_300x250'],\n ad_unit_ids: ['au_acmeoutdoor_display'],\n pricing: { min_cpm: 1.25, target_cpm: 1.9, currency: 'USD', min_spend: 500 },\n },\n {\n product_id: 'pinnacle_display_remnant_q2',\n name: 'Pinnacle Display Remnant Q2',\n network_code: 'net_pinnacle',\n delivery_type: 'non_guaranteed',\n channel: 'display',\n format_ids: ['display_300x250'],\n ad_unit_ids: ['au_pinnacle_remnant'],\n pricing: { min_cpm: 0.85, target_cpm: 1.3, currency: 'USD' },\n },\n];\n\n/** Default static API key (Bearer). Real DSPs / SSPs typically use OAuth\n * or signed-request auth; static Bearer keeps the test surface varied\n * (sales-social already exercises OAuth, sales-guaranteed uses static\n * Bearer too — this mock matches the latter to focus on the auction\n * shape rather than re-exercising OAuth). */\nexport const DEFAULT_API_KEY = 'mock_sales_non_guaranteed_key_do_not_use_in_prod';\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 { createServer } from "node:http";
|
|
8
2
|
import { createHash, randomUUID } from "node:crypto";
|
|
9
3
|
import {
|