@adcp/sdk 16.0.0-beta.7 → 16.0.0-beta.9
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/AGENTS.md +3 -3
- package/README.md +20 -0
- package/bin/adcp.js +10 -13
- package/dist/lib/conformance/index.d.mts +2 -0
- package/dist/lib/conformance/index.d.ts +2 -0
- package/dist/lib/conformance/index.js +3 -0
- package/dist/lib/conformance/index.mjs +2 -0
- package/dist/lib/conformance/property-lists.d.mts +14 -0
- package/dist/lib/conformance/property-lists.d.ts +14 -0
- package/dist/lib/conformance/property-lists.js +45 -0
- package/dist/lib/conformance/property-lists.mjs +21 -0
- package/dist/lib/conformance/runConformance.js +20 -1
- package/dist/lib/conformance/runConformance.mjs +20 -1
- package/dist/lib/conformance/types.d.mts +3 -0
- package/dist/lib/conformance/types.d.ts +3 -0
- package/dist/lib/core/AgentClient.d.mts +8 -5
- package/dist/lib/core/AgentClient.d.ts +8 -5
- package/dist/lib/core/AgentClient.js +9 -4
- package/dist/lib/core/AgentClient.mjs +9 -4
- package/dist/lib/core/SingleAgentClient.d.mts +32 -115
- package/dist/lib/core/SingleAgentClient.d.ts +32 -115
- package/dist/lib/core/SingleAgentClient.js +379 -273
- package/dist/lib/core/SingleAgentClient.mjs +387 -275
- package/dist/lib/core/TaskExecutor.d.mts +1 -16
- package/dist/lib/core/TaskExecutor.d.ts +1 -16
- package/dist/lib/core/TaskExecutor.js +34 -51
- package/dist/lib/core/TaskExecutor.mjs +12 -29
- package/dist/lib/core/product-cache.d.mts +3 -1
- package/dist/lib/core/product-cache.d.ts +3 -1
- package/dist/lib/core/product-cache.js +2 -1
- package/dist/lib/core/product-cache.mjs +2 -1
- package/dist/lib/errors/index.d.mts +2 -8
- package/dist/lib/errors/index.d.ts +2 -8
- package/dist/lib/errors/index.js +4 -4
- package/dist/lib/errors/index.mjs +4 -4
- package/dist/lib/identifiers.d.mts +53 -0
- package/dist/lib/identifiers.d.ts +53 -0
- package/dist/lib/identifiers.js +212 -0
- package/dist/lib/identifiers.mjs +163 -0
- package/dist/lib/index.d.mts +7 -5
- package/dist/lib/index.d.ts +7 -5
- package/dist/lib/index.js +2 -14
- package/dist/lib/index.mjs +1 -14
- package/dist/lib/media-buy/compatibility.d.mts +1 -1
- package/dist/lib/media-buy/compatibility.d.ts +1 -1
- package/dist/lib/media-buy/compatibility.js +26 -45
- package/dist/lib/media-buy/compatibility.mjs +26 -45
- package/dist/lib/media-buy/index.d.mts +1 -1
- package/dist/lib/media-buy/index.d.ts +1 -1
- package/dist/lib/media-buy/legacy-purchase-continuation.d.mts +2 -2
- package/dist/lib/media-buy/legacy-purchase-continuation.d.ts +2 -2
- package/dist/lib/media-buy/property-policy.d.mts +15 -1
- package/dist/lib/media-buy/property-policy.d.ts +15 -1
- package/dist/lib/media-buy/property-policy.js +135 -3
- package/dist/lib/media-buy/property-policy.mjs +134 -3
- package/dist/lib/protocols/index.js +14 -22
- package/dist/lib/protocols/index.mjs +5 -13
- package/dist/lib/registry/index.d.mts +12 -0
- package/dist/lib/registry/index.d.ts +12 -0
- package/dist/lib/registry/index.js +159 -5
- package/dist/lib/registry/index.mjs +156 -4
- package/dist/lib/registry/types.d.mts +26 -2
- package/dist/lib/registry/types.d.ts +26 -2
- package/dist/lib/registry/types.generated.d.mts +51 -11
- package/dist/lib/registry/types.generated.d.ts +51 -11
- package/dist/lib/reporting/source/conformance.d.mts +8 -8
- package/dist/lib/reporting/source/conformance.d.ts +8 -8
- package/dist/lib/reporting/source/manifest.d.mts +27 -27
- package/dist/lib/reporting/source/manifest.d.ts +27 -27
- package/dist/lib/server/create-adcp-server.js +6 -0
- package/dist/lib/server/create-adcp-server.mjs +6 -0
- package/dist/lib/server/decisioning/specialisms/lists.d.mts +4 -4
- package/dist/lib/server/decisioning/specialisms/lists.d.ts +4 -4
- package/dist/lib/server/index.d.mts +3 -0
- package/dist/lib/server/index.d.ts +3 -0
- package/dist/lib/server/index.js +8 -1
- package/dist/lib/server/index.mjs +4 -0
- package/dist/lib/server/property-lists.d.mts +36 -0
- package/dist/lib/server/property-lists.d.ts +36 -0
- package/dist/lib/server/property-lists.js +154 -0
- package/dist/lib/server/property-lists.mjs +129 -0
- package/dist/lib/server/targeting-helpers.d.mts +2 -0
- package/dist/lib/server/targeting-helpers.d.ts +2 -0
- package/dist/lib/server/targeting-helpers.js +28 -1
- package/dist/lib/server/targeting-helpers.mjs +18 -1
- package/dist/lib/signing/parser.js +2 -2
- package/dist/lib/signing/parser.mjs +2 -2
- package/dist/lib/signing/server.d.mts +1 -1
- package/dist/lib/signing/server.d.ts +1 -1
- package/dist/lib/signing/server.mjs +5 -1
- package/dist/lib/signing/webhook-verifier.d.mts +11 -0
- package/dist/lib/signing/webhook-verifier.d.ts +11 -0
- package/dist/lib/signing/webhook-verifier.js +11 -3
- package/dist/lib/signing/webhook-verifier.mjs +11 -3
- package/dist/lib/supply-path/verify.js +12 -2
- package/dist/lib/supply-path/verify.mjs +2 -2
- package/dist/lib/testing/compliance/comply.js +0 -8
- package/dist/lib/testing/compliance/comply.mjs +0 -8
- package/dist/lib/testing/compliance/storyboard-tracks.js +11 -0
- package/dist/lib/testing/compliance/storyboard-tracks.mjs +11 -0
- package/dist/lib/testing/index.d.mts +2 -0
- package/dist/lib/testing/index.d.ts +2 -0
- package/dist/lib/testing/index.js +5 -0
- package/dist/lib/testing/index.mjs +3 -0
- package/dist/lib/testing/scenarios/capabilities.d.mts +2 -2
- package/dist/lib/testing/scenarios/capabilities.d.ts +2 -2
- package/dist/lib/testing/scenarios/capabilities.js +8 -41
- package/dist/lib/testing/scenarios/capabilities.mjs +9 -42
- package/dist/lib/testing/storyboard/creative-build-probe.d.mts +34 -0
- package/dist/lib/testing/storyboard/creative-build-probe.d.ts +34 -0
- package/dist/lib/testing/storyboard/creative-build-probe.js +395 -0
- package/dist/lib/testing/storyboard/creative-build-probe.mjs +373 -0
- package/dist/lib/testing/storyboard/index.d.mts +2 -0
- package/dist/lib/testing/storyboard/index.d.ts +2 -0
- package/dist/lib/testing/storyboard/index.js +5 -0
- package/dist/lib/testing/storyboard/index.mjs +3 -0
- package/dist/lib/testing/storyboard/loader.js +12 -0
- package/dist/lib/testing/storyboard/loader.mjs +12 -0
- package/dist/lib/testing/storyboard/property-list-reference.d.mts +15 -0
- package/dist/lib/testing/storyboard/property-list-reference.d.ts +15 -0
- package/dist/lib/testing/storyboard/property-list-reference.js +514 -0
- package/dist/lib/testing/storyboard/property-list-reference.mjs +487 -0
- package/dist/lib/testing/storyboard/runner.js +318 -58
- package/dist/lib/testing/storyboard/runner.mjs +322 -58
- package/dist/lib/testing/storyboard/types.d.mts +38 -16
- package/dist/lib/testing/storyboard/types.d.ts +38 -16
- package/dist/lib/testing/storyboard/types.js +1 -0
- package/dist/lib/testing/storyboard/types.mjs +1 -0
- package/dist/lib/testing/storyboard/validations.d.mts +1 -1
- package/dist/lib/testing/storyboard/validations.d.ts +1 -1
- package/dist/lib/testing/storyboard/validations.js +64 -0
- package/dist/lib/testing/storyboard/validations.mjs +67 -1
- package/dist/lib/testing/types.d.mts +15 -1
- package/dist/lib/testing/types.d.ts +15 -1
- package/dist/lib/types/schemas.generated.d.ts +65 -65
- package/dist/lib/types/wellknown-schemas.generated.d.mts +21 -21
- package/dist/lib/types/wellknown-schemas.generated.d.ts +21 -21
- package/dist/lib/utils/adcp-version-config.js +6 -0
- package/dist/lib/utils/adcp-version-config.mjs +6 -0
- package/dist/lib/utils/capabilities.d.mts +7 -9
- package/dist/lib/utils/capabilities.d.ts +7 -9
- package/dist/lib/utils/capabilities.js +14 -28
- package/dist/lib/utils/capabilities.mjs +14 -27
- package/dist/lib/utils/creative-adapter.d.mts +15 -113
- package/dist/lib/utils/creative-adapter.d.ts +15 -113
- package/dist/lib/utils/creative-adapter.js +7 -106
- package/dist/lib/utils/creative-adapter.mjs +7 -102
- package/dist/lib/utils/format-renders.d.mts +20 -80
- package/dist/lib/utils/format-renders.d.ts +20 -80
- package/dist/lib/utils/format-renders.js +7 -67
- package/dist/lib/utils/format-renders.mjs +7 -66
- package/dist/lib/utils/index.d.mts +1 -2
- package/dist/lib/utils/index.d.ts +1 -2
- package/dist/lib/utils/index.js +0 -7
- package/dist/lib/utils/index.mjs +0 -6
- package/dist/lib/utils/preview-normalizer.d.mts +31 -80
- package/dist/lib/utils/preview-normalizer.d.ts +31 -80
- package/dist/lib/utils/preview-normalizer.js +5 -50
- package/dist/lib/utils/preview-normalizer.mjs +5 -49
- package/dist/lib/utils/pricing-adapter.d.mts +2 -36
- package/dist/lib/utils/pricing-adapter.d.ts +2 -36
- package/dist/lib/utils/pricing-adapter.js +0 -105
- package/dist/lib/utils/pricing-adapter.mjs +0 -100
- package/dist/lib/utils/request-normalizer.d.mts +1 -2
- package/dist/lib/utils/request-normalizer.d.ts +1 -2
- package/dist/lib/v2/projection/creative-delivery.d.mts +2 -0
- package/dist/lib/v2/projection/creative-delivery.d.ts +2 -0
- package/dist/lib/v2/projection/creative-delivery.js +7 -0
- package/dist/lib/v2/projection/creative-delivery.mjs +6 -0
- package/dist/lib/v2/projection/legacy-metadata.d.mts +12 -0
- package/dist/lib/v2/projection/legacy-metadata.d.ts +12 -0
- package/dist/lib/v2/projection/legacy-metadata.js +41 -1
- package/dist/lib/v2/projection/legacy-metadata.mjs +37 -1
- package/dist/lib/v2/projection/legacy-normalization.d.mts +1 -1
- package/dist/lib/v2/projection/legacy-normalization.d.ts +1 -1
- package/dist/lib/v2/projection/v1-to-v2.js +13 -0
- package/dist/lib/v2/projection/v1-to-v2.mjs +14 -0
- package/dist/lib/validation/client-hooks.d.mts +1 -4
- package/dist/lib/validation/client-hooks.d.ts +1 -4
- package/dist/lib/validation/get-products-request.d.mts +1 -1
- package/dist/lib/validation/get-products-request.d.ts +1 -1
- package/dist/lib/validation/schema-loader.js +6 -0
- package/dist/lib/validation/schema-loader.mjs +6 -0
- package/dist/lib/validation/schema-validator.js +1 -26
- package/dist/lib/validation/schema-validator.mjs +1 -26
- package/dist/lib/version.d.mts +5 -5
- package/dist/lib/version.d.ts +5 -5
- package/dist/lib/version.js +3 -5
- package/dist/lib/version.mjs +3 -5
- package/docs/TYPE-SUMMARY.md +2 -2
- package/docs/development/PROTOCOL_DIFFERENCES.md +1 -1
- package/docs/guides/CONFORMANCE.md +25 -0
- package/docs/guides/CREATIVE-BUILD-PROBE.md +156 -0
- package/docs/guides/CREATIVE-DELIVERY.md +45 -6
- package/docs/guides/MEDIA-BUY-3.2-COMPATIBILITY.md +15 -18
- package/docs/guides/PROPERTY-LISTS.md +264 -0
- package/docs/guides/SIGNING-GUIDE.md +25 -0
- package/docs/guides/VALIDATE-YOUR-AGENT.md +5 -0
- package/docs/llms.txt +2 -2
- package/docs/migration-13-to-14.md +20 -16
- package/docs/migration-14.x-rc-worksheet.md +5 -5
- package/docs/migration-4.x-to-5.x.md +12 -7
- package/docs/migration-drop-adcp-2.md +25 -0
- package/package.json +3 -18
- package/skills/call-adcp-agent/SKILL.md +23 -25
- package/dist/lib/adapters/legacy/v2-5/create_media_buy.d.mts +0 -3
- package/dist/lib/adapters/legacy/v2-5/create_media_buy.d.ts +0 -3
- package/dist/lib/adapters/legacy/v2-5/create_media_buy.js +0 -33
- package/dist/lib/adapters/legacy/v2-5/create_media_buy.mjs +0 -9
- package/dist/lib/adapters/legacy/v2-5/get_products.d.mts +0 -8
- package/dist/lib/adapters/legacy/v2-5/get_products.d.ts +0 -8
- package/dist/lib/adapters/legacy/v2-5/get_products.js +0 -33
- package/dist/lib/adapters/legacy/v2-5/get_products.mjs +0 -9
- package/dist/lib/adapters/legacy/v2-5/index.d.mts +0 -34
- package/dist/lib/adapters/legacy/v2-5/index.d.ts +0 -34
- package/dist/lib/adapters/legacy/v2-5/index.js +0 -50
- package/dist/lib/adapters/legacy/v2-5/index.mjs +0 -25
- package/dist/lib/adapters/legacy/v2-5/list_creative_formats.d.mts +0 -8
- package/dist/lib/adapters/legacy/v2-5/list_creative_formats.d.ts +0 -8
- package/dist/lib/adapters/legacy/v2-5/list_creative_formats.js +0 -33
- package/dist/lib/adapters/legacy/v2-5/list_creative_formats.mjs +0 -9
- package/dist/lib/adapters/legacy/v2-5/preview_creative.d.mts +0 -3
- package/dist/lib/adapters/legacy/v2-5/preview_creative.d.ts +0 -3
- package/dist/lib/adapters/legacy/v2-5/preview_creative.js +0 -33
- package/dist/lib/adapters/legacy/v2-5/preview_creative.mjs +0 -9
- package/dist/lib/adapters/legacy/v2-5/sync_creatives.d.mts +0 -11
- package/dist/lib/adapters/legacy/v2-5/sync_creatives.d.ts +0 -11
- package/dist/lib/adapters/legacy/v2-5/sync_creatives.js +0 -32
- package/dist/lib/adapters/legacy/v2-5/sync_creatives.mjs +0 -8
- package/dist/lib/adapters/legacy/v2-5/types.d.mts +0 -39
- package/dist/lib/adapters/legacy/v2-5/types.d.ts +0 -39
- package/dist/lib/adapters/legacy/v2-5/types.js +0 -16
- package/dist/lib/adapters/legacy/v2-5/types.mjs +0 -0
- package/dist/lib/adapters/legacy/v2-5/update_media_buy.d.mts +0 -3
- package/dist/lib/adapters/legacy/v2-5/update_media_buy.d.ts +0 -3
- package/dist/lib/adapters/legacy/v2-5/update_media_buy.js +0 -35
- package/dist/lib/adapters/legacy/v2-5/update_media_buy.mjs +0 -11
- package/dist/lib/schemas-data/v2.5/_provenance.json +0 -8
- package/dist/lib/schemas-data/v2.5/adagents.json +0 -494
- package/dist/lib/schemas-data/v2.5/core/activation-key.json +0 -50
- package/dist/lib/schemas-data/v2.5/core/assets/audio-asset.json +0 -32
- package/dist/lib/schemas-data/v2.5/core/assets/css-asset.json +0 -21
- package/dist/lib/schemas-data/v2.5/core/assets/daast-asset.json +0 -87
- package/dist/lib/schemas-data/v2.5/core/assets/html-asset.json +0 -21
- package/dist/lib/schemas-data/v2.5/core/assets/image-asset.json +0 -38
- package/dist/lib/schemas-data/v2.5/core/assets/javascript-asset.json +0 -21
- package/dist/lib/schemas-data/v2.5/core/assets/markdown-asset.json +0 -31
- package/dist/lib/schemas-data/v2.5/core/assets/text-asset.json +0 -21
- package/dist/lib/schemas-data/v2.5/core/assets/url-asset.json +0 -26
- package/dist/lib/schemas-data/v2.5/core/assets/vast-asset.json +0 -87
- package/dist/lib/schemas-data/v2.5/core/assets/video-asset.json +0 -44
- package/dist/lib/schemas-data/v2.5/core/assets/webhook-asset.json +0 -71
- package/dist/lib/schemas-data/v2.5/core/async-response-data.json +0 -88
- package/dist/lib/schemas-data/v2.5/core/brand-manifest-ref.json +0 -33
- package/dist/lib/schemas-data/v2.5/core/brand-manifest.json +0 -409
- package/dist/lib/schemas-data/v2.5/core/context.json +0 -8
- package/dist/lib/schemas-data/v2.5/core/creative-asset.json +0 -125
- package/dist/lib/schemas-data/v2.5/core/creative-assignment.json +0 -31
- package/dist/lib/schemas-data/v2.5/core/creative-filters.json +0 -111
- package/dist/lib/schemas-data/v2.5/core/creative-manifest.json +0 -72
- package/dist/lib/schemas-data/v2.5/core/creative-policy.json +0 -27
- package/dist/lib/schemas-data/v2.5/core/delivery-metrics.json +0 -171
- package/dist/lib/schemas-data/v2.5/core/deployment.json +0 -93
- package/dist/lib/schemas-data/v2.5/core/destination.json +0 -53
- package/dist/lib/schemas-data/v2.5/core/error.json +0 -40
- package/dist/lib/schemas-data/v2.5/core/ext.json +0 -8
- package/dist/lib/schemas-data/v2.5/core/format-id.json +0 -47
- package/dist/lib/schemas-data/v2.5/core/format.json +0 -324
- package/dist/lib/schemas-data/v2.5/core/frequency-cap.json +0 -18
- package/dist/lib/schemas-data/v2.5/core/mcp-webhook-payload.json +0 -152
- package/dist/lib/schemas-data/v2.5/core/measurement.json +0 -48
- package/dist/lib/schemas-data/v2.5/core/media-buy.json +0 -62
- package/dist/lib/schemas-data/v2.5/core/package.json +0 -72
- package/dist/lib/schemas-data/v2.5/core/performance-feedback.json +0 -90
- package/dist/lib/schemas-data/v2.5/core/placement.json +0 -34
- package/dist/lib/schemas-data/v2.5/core/pricing-option.json +0 -35
- package/dist/lib/schemas-data/v2.5/core/product-filters.json +0 -102
- package/dist/lib/schemas-data/v2.5/core/product.json +0 -153
- package/dist/lib/schemas-data/v2.5/core/promoted-offerings.json +0 -115
- package/dist/lib/schemas-data/v2.5/core/promoted-products.json +0 -67
- package/dist/lib/schemas-data/v2.5/core/property-id.json +0 -14
- package/dist/lib/schemas-data/v2.5/core/property-tag.json +0 -16
- package/dist/lib/schemas-data/v2.5/core/property.json +0 -62
- package/dist/lib/schemas-data/v2.5/core/protocol-envelope.json +0 -146
- package/dist/lib/schemas-data/v2.5/core/publisher-property-selector.json +0 -92
- package/dist/lib/schemas-data/v2.5/core/push-notification-config.json +0 -48
- package/dist/lib/schemas-data/v2.5/core/reporting-capabilities.json +0 -71
- package/dist/lib/schemas-data/v2.5/core/response.json +0 -24
- package/dist/lib/schemas-data/v2.5/core/signal-filters.json +0 -35
- package/dist/lib/schemas-data/v2.5/core/start-timing.json +0 -18
- package/dist/lib/schemas-data/v2.5/core/sub-asset.json +0 -79
- package/dist/lib/schemas-data/v2.5/core/targeting.json +0 -50
- package/dist/lib/schemas-data/v2.5/core/tasks-get-request.json +0 -43
- package/dist/lib/schemas-data/v2.5/core/tasks-get-response.json +0 -166
- package/dist/lib/schemas-data/v2.5/core/tasks-list-request.json +0 -192
- package/dist/lib/schemas-data/v2.5/core/tasks-list-response.json +0 -183
- package/dist/lib/schemas-data/v2.5/creative/asset-types/index.json +0 -101
- package/dist/lib/schemas-data/v2.5/creative/list-creative-formats-request.json +0 -73
- package/dist/lib/schemas-data/v2.5/creative/list-creative-formats-response.json +0 -61
- package/dist/lib/schemas-data/v2.5/creative/preview-creative-request.json +0 -164
- package/dist/lib/schemas-data/v2.5/creative/preview-creative-response.json +0 -245
- package/dist/lib/schemas-data/v2.5/creative/preview-render.json +0 -225
- package/dist/lib/schemas-data/v2.5/enums/adcp-domain.json +0 -11
- package/dist/lib/schemas-data/v2.5/enums/asset-content-type.json +0 -22
- package/dist/lib/schemas-data/v2.5/enums/auth-scheme.json +0 -11
- package/dist/lib/schemas-data/v2.5/enums/available-metric.json +0 -18
- package/dist/lib/schemas-data/v2.5/enums/channels.json +0 -18
- package/dist/lib/schemas-data/v2.5/enums/co-branding-requirement.json +0 -12
- package/dist/lib/schemas-data/v2.5/enums/creative-action.json +0 -14
- package/dist/lib/schemas-data/v2.5/enums/creative-agent-capability.json +0 -13
- package/dist/lib/schemas-data/v2.5/enums/creative-sort-field.json +0 -15
- package/dist/lib/schemas-data/v2.5/enums/creative-status.json +0 -19
- package/dist/lib/schemas-data/v2.5/enums/daast-tracking-event.json +0 -20
- package/dist/lib/schemas-data/v2.5/enums/daast-version.json +0 -11
- package/dist/lib/schemas-data/v2.5/enums/delivery-type.json +0 -15
- package/dist/lib/schemas-data/v2.5/enums/dimension-unit.json +0 -13
- package/dist/lib/schemas-data/v2.5/enums/feed-format.json +0 -12
- package/dist/lib/schemas-data/v2.5/enums/feedback-source.json +0 -13
- package/dist/lib/schemas-data/v2.5/enums/format-category.json +0 -16
- package/dist/lib/schemas-data/v2.5/enums/format-id-parameter.json +0 -11
- package/dist/lib/schemas-data/v2.5/enums/frequency-cap-scope.json +0 -13
- package/dist/lib/schemas-data/v2.5/enums/history-entry-type.json +0 -11
- package/dist/lib/schemas-data/v2.5/enums/http-method.json +0 -11
- package/dist/lib/schemas-data/v2.5/enums/identifier-types.json +0 -34
- package/dist/lib/schemas-data/v2.5/enums/javascript-module-type.json +0 -12
- package/dist/lib/schemas-data/v2.5/enums/landing-page-requirement.json +0 -12
- package/dist/lib/schemas-data/v2.5/enums/markdown-flavor.json +0 -11
- package/dist/lib/schemas-data/v2.5/enums/media-buy-status.json +0 -19
- package/dist/lib/schemas-data/v2.5/enums/metric-type.json +0 -17
- package/dist/lib/schemas-data/v2.5/enums/notification-type.json +0 -13
- package/dist/lib/schemas-data/v2.5/enums/pacing.json +0 -17
- package/dist/lib/schemas-data/v2.5/enums/preview-output-format.json +0 -11
- package/dist/lib/schemas-data/v2.5/enums/pricing-model.json +0 -25
- package/dist/lib/schemas-data/v2.5/enums/property-type.json +0 -16
- package/dist/lib/schemas-data/v2.5/enums/publisher-identifier-types.json +0 -19
- package/dist/lib/schemas-data/v2.5/enums/reporting-frequency.json +0 -12
- package/dist/lib/schemas-data/v2.5/enums/signal-catalog-type.json +0 -12
- package/dist/lib/schemas-data/v2.5/enums/sort-direction.json +0 -11
- package/dist/lib/schemas-data/v2.5/enums/standard-format-ids.json +0 -103
- package/dist/lib/schemas-data/v2.5/enums/task-status.json +0 -29
- package/dist/lib/schemas-data/v2.5/enums/task-type.json +0 -27
- package/dist/lib/schemas-data/v2.5/enums/update-frequency.json +0 -13
- package/dist/lib/schemas-data/v2.5/enums/url-asset-type.json +0 -12
- package/dist/lib/schemas-data/v2.5/enums/validation-mode.json +0 -11
- package/dist/lib/schemas-data/v2.5/enums/vast-tracking-event.json +0 -25
- package/dist/lib/schemas-data/v2.5/enums/vast-version.json +0 -14
- package/dist/lib/schemas-data/v2.5/enums/webhook-response-type.json +0 -13
- package/dist/lib/schemas-data/v2.5/enums/webhook-security-method.json +0 -12
- package/dist/lib/schemas-data/v2.5/index.json +0 -604
- package/dist/lib/schemas-data/v2.5/media-buy/build-creative-request.json +0 -31
- package/dist/lib/schemas-data/v2.5/media-buy/build-creative-response.json +0 -65
- package/dist/lib/schemas-data/v2.5/media-buy/create-media-buy-async-response-input-required.json +0 -31
- package/dist/lib/schemas-data/v2.5/media-buy/create-media-buy-async-response-submitted.json +0 -16
- package/dist/lib/schemas-data/v2.5/media-buy/create-media-buy-async-response-working.json +0 -36
- package/dist/lib/schemas-data/v2.5/media-buy/create-media-buy-request.json +0 -126
- package/dist/lib/schemas-data/v2.5/media-buy/create-media-buy-response.json +0 -97
- package/dist/lib/schemas-data/v2.5/media-buy/get-media-buy-delivery-request.json +0 -54
- package/dist/lib/schemas-data/v2.5/media-buy/get-media-buy-delivery-response.json +0 -285
- package/dist/lib/schemas-data/v2.5/media-buy/get-products-async-response-input-required.json +0 -38
- package/dist/lib/schemas-data/v2.5/media-buy/get-products-async-response-submitted.json +0 -21
- package/dist/lib/schemas-data/v2.5/media-buy/get-products-async-response-working.json +0 -34
- package/dist/lib/schemas-data/v2.5/media-buy/get-products-request.json +0 -28
- package/dist/lib/schemas-data/v2.5/media-buy/get-products-response.json +0 -33
- package/dist/lib/schemas-data/v2.5/media-buy/list-authorized-properties-request.json +0 -26
- package/dist/lib/schemas-data/v2.5/media-buy/list-authorized-properties-response.json +0 -70
- package/dist/lib/schemas-data/v2.5/media-buy/list-creative-formats-request.json +0 -58
- package/dist/lib/schemas-data/v2.5/media-buy/list-creative-formats-response.json +0 -61
- package/dist/lib/schemas-data/v2.5/media-buy/list-creatives-request.json +0 -137
- package/dist/lib/schemas-data/v2.5/media-buy/list-creatives-response.json +0 -437
- package/dist/lib/schemas-data/v2.5/media-buy/package-request.json +0 -80
- package/dist/lib/schemas-data/v2.5/media-buy/provide-performance-feedback-request.json +0 -88
- package/dist/lib/schemas-data/v2.5/media-buy/provide-performance-feedback-response.json +0 -66
- package/dist/lib/schemas-data/v2.5/media-buy/sync-creatives-async-response-input-required.json +0 -25
- package/dist/lib/schemas-data/v2.5/media-buy/sync-creatives-async-response-submitted.json +0 -16
- package/dist/lib/schemas-data/v2.5/media-buy/sync-creatives-async-response-working.json +0 -46
- package/dist/lib/schemas-data/v2.5/media-buy/sync-creatives-request.json +0 -178
- package/dist/lib/schemas-data/v2.5/media-buy/sync-creatives-response.json +0 -149
- package/dist/lib/schemas-data/v2.5/media-buy/update-media-buy-async-response-input-required.json +0 -24
- package/dist/lib/schemas-data/v2.5/media-buy/update-media-buy-async-response-submitted.json +0 -16
- package/dist/lib/schemas-data/v2.5/media-buy/update-media-buy-async-response-working.json +0 -36
- package/dist/lib/schemas-data/v2.5/media-buy/update-media-buy-request.json +0 -129
- package/dist/lib/schemas-data/v2.5/media-buy/update-media-buy-response.json +0 -99
- package/dist/lib/schemas-data/v2.5/pricing-options/cpc-option.json +0 -52
- package/dist/lib/schemas-data/v2.5/pricing-options/cpcv-option.json +0 -52
- package/dist/lib/schemas-data/v2.5/pricing-options/cpm-auction-option.json +0 -81
- package/dist/lib/schemas-data/v2.5/pricing-options/cpm-fixed-option.json +0 -52
- package/dist/lib/schemas-data/v2.5/pricing-options/cpp-option.json +0 -73
- package/dist/lib/schemas-data/v2.5/pricing-options/cpv-option.json +0 -88
- package/dist/lib/schemas-data/v2.5/pricing-options/flat-rate-option.json +0 -93
- package/dist/lib/schemas-data/v2.5/pricing-options/vcpm-auction-option.json +0 -81
- package/dist/lib/schemas-data/v2.5/pricing-options/vcpm-fixed-option.json +0 -52
- package/dist/lib/schemas-data/v2.5/protocols/adcp-extension.json +0 -33
- package/dist/lib/schemas-data/v2.5/signals/activate-signal-request.json +0 -32
- package/dist/lib/schemas-data/v2.5/signals/activate-signal-response.json +0 -68
- package/dist/lib/schemas-data/v2.5/signals/get-signals-request.json +0 -59
- package/dist/lib/schemas-data/v2.5/signals/get-signals-response.json +0 -100
- package/dist/lib/types/v2-5/index.d.mts +0 -1
- package/dist/lib/types/v2-5/index.d.ts +0 -1
- package/dist/lib/types/v2-5/index.js +0 -22
- package/dist/lib/types/v2-5/index.mjs +0 -1
- package/dist/lib/types/v2-5/tools.generated.d.mts +0 -3568
- package/dist/lib/types/v2-5/tools.generated.d.ts +0 -3568
- package/dist/lib/types/v2-5/tools.generated.js +0 -16
- package/dist/lib/types/v2-5/tools.generated.mjs +0 -0
- package/dist/lib/utils/sync-creatives-adapter.d.mts +0 -33
- package/dist/lib/utils/sync-creatives-adapter.d.ts +0 -33
- package/dist/lib/utils/sync-creatives-adapter.js +0 -83
- package/dist/lib/utils/sync-creatives-adapter.mjs +0 -59
|
@@ -280,7 +280,7 @@ authoritative completion reconciliation after restart.
|
|
|
280
280
|
|
|
281
281
|
### Tokenless catalog and products-only legacy continuations
|
|
282
282
|
|
|
283
|
-
An established
|
|
283
|
+
An established 3.0 or 3.1 seller may return purchasable catalog products
|
|
284
284
|
without a wholesale feed token, or answer a brief with products but no
|
|
285
285
|
proposal. The SDK never invents a proposal, terms digest, or feed fence. When
|
|
286
286
|
`principalScope`, an account, and stable seller-session binding are available,
|
|
@@ -301,7 +301,7 @@ invocation receives a fresh continuation even when the catalog is unchanged:
|
|
|
301
301
|
const continuations = createInMemoryLegacyPurchaseContinuationStore();
|
|
302
302
|
const lifecycle = await agent.negotiateMediaBuyLifecycle({
|
|
303
303
|
principalScope: authenticatedPrincipalId,
|
|
304
|
-
// Required for established
|
|
304
|
+
// Required for established 3.0 and 3.1 sellers that provide no server
|
|
305
305
|
// context ID. Persist this non-secret authenticated session ID across rehydration.
|
|
306
306
|
legacyPurchaseSellerSessionScope: authenticatedSellerSessionId,
|
|
307
307
|
legacyPurchaseContinuationStore: continuations,
|
|
@@ -331,9 +331,9 @@ after accepting the exact returned loss set. If the application requires an
|
|
|
331
331
|
enforceable observed catalog/pricing fence, do not accept the continuation;
|
|
332
332
|
the tokenless catalog is read-only for that policy.
|
|
333
333
|
|
|
334
|
-
On
|
|
335
|
-
|
|
336
|
-
|
|
334
|
+
On 3.0 and 3.1 the loss set includes `mutation_idempotency_not_guaranteed`
|
|
335
|
+
whenever the seller does not advertise a usable replay TTL. All tokenless
|
|
336
|
+
catalog continuations include
|
|
337
337
|
`feed_version_not_atomic` and `pricing_version_not_atomic`.
|
|
338
338
|
|
|
339
339
|
The in-memory store is a single-process reference implementation. Production
|
|
@@ -462,13 +462,12 @@ issued. It must be a stable, non-secret ID derived by the application from the
|
|
|
462
462
|
authenticated seller/account session—not a bearer token. Persist and reuse it
|
|
463
463
|
with the continuation store so a restarted coordinator can redeem or replay
|
|
464
464
|
the same operation without making the token portable to another credentialed
|
|
465
|
-
session. This applies to
|
|
465
|
+
session. This applies to 3.0 and 3.1; endpoint identity is not an
|
|
466
466
|
authenticated session identity. URL userinfo and presigned URLs are rejected
|
|
467
467
|
before the discovered payload can enter durable storage.
|
|
468
468
|
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
advertise a usable replay TTL; accepting an idempotency key alone is not treated
|
|
469
|
+
3.0/3.1 continuations declare `mutation_idempotency_not_guaranteed` whenever
|
|
470
|
+
the seller does not advertise a usable replay TTL; accepting an idempotency key alone is not treated
|
|
472
471
|
as evidence that a mutation can be replayed safely. Submitted completions are
|
|
473
472
|
accepted only for the exact seller task ID recorded at dispatch. Unstructured
|
|
474
473
|
or SDK-synthetic terminal errors remain ambiguous and retain the durable fence.
|
|
@@ -584,15 +583,17 @@ mutating prior state.
|
|
|
584
583
|
|
|
585
584
|
## Buyer projection policy
|
|
586
585
|
|
|
586
|
+
All compatibility lanes require AdCP 3. AdCP 2 agents are rejected during discovery before a coordinator operation can dispatch; see the [AdCP 2 retirement guide](../migration-drop-adcp-2.md).
|
|
587
|
+
|
|
587
588
|
| Coordinator operation | Compact tool | Established projection | Boundary |
|
|
588
589
|
|---|---|---|---|
|
|
589
|
-
| `listProducts` | `list_products` | `get_products(buying_mode='wholesale')` | Representable `criteria.offer_filters` map field-by-field through the negotiated legacy offer-filter schema; country remains `filters.countries` and is never recast as delivery targeting. Other structured criteria report their exact unsupported field before dispatch. Actual `wholesale_feed_version` is renamed to `feed_version`; no value is invented. An eligible tokenless catalog may expose the SDK-local `purchase_continuation` described above while `raw` remains the canonical SDK source object. The stable response exposes `next_cursor` and `unchanged` in both lanes. The established request includes `pagination` only when the caller supplies a cursor or `max_results`; the SDK does not fabricate a page-size default.
|
|
590
|
+
| `listProducts` | `list_products` | `get_products(buying_mode='wholesale')` | Representable `criteria.offer_filters` map field-by-field through the negotiated legacy offer-filter schema; country remains `filters.countries` and is never recast as delivery targeting. Other structured criteria report their exact unsupported field before dispatch. Actual `wholesale_feed_version` is renamed to `feed_version`; no value is invented. An eligible tokenless catalog may expose the SDK-local `purchase_continuation` described above while `raw` remains the canonical SDK source object. The stable response exposes `next_cursor` and `unchanged` in both lanes. The established request includes `pagination` only when the caller supplies a cursor or `max_results`; the SDK does not fabricate a page-size default. Pre-3.1 conditional feed/pricing reads and response-field names absent from the negotiated enum are typed unsupported. |
|
|
590
591
|
| `requestProposals` | `request_proposals` | `get_products(buying_mode='brief')` | Only offer-filter fields and metric values defined by the negotiated release map field-by-field, plus policy IDs. Compact catalog selection lacks the complete legacy catalog metadata and fails closed. Targeting-overlay requirements are forwarded only to a 3.2 established surface; 3.0/3.1 cannot represent them. Product-ID filters, compact-only offer prerequisites, `ext`, opportunity, and governance context fail preflight. |
|
|
591
592
|
| `refineProposals` | `refine_proposals` | `get_products(buying_mode='refine')` | Ask and product include/omit map for revisions. Finalize maps only when it contains no additional refinement fields. Hard constraints, alternatives, criteria, amendment kinds, and finalize extras fail before dispatch. |
|
|
592
593
|
| `declineProposals` | `decline_proposals` | proposal-scoped legacy omit | Rejected by default because omit is not a terminal decline and cannot carry the required compact reason/detail. Explicit opt-in reports `proposal_decline_not_terminal` and `proposal_decline_reason_not_forwarded`. |
|
|
593
|
-
| `buyProducts` | `buy_products` | `create_media_buy` | Feed/pricing fencing is not atomic. Rejected by default; explicit opt-in names `feed_version_not_atomic` and, when present, `pricing_version_not_atomic`. A missing `feed_version` remains unsupported here; tokenless catalogs use the separate SDK-local `continueLegacyPurchase()` handoff. Shared package fields and nested targeting/reporting enums map against the negotiated schema, including 3.1+ `format_option_refs`; newer targeting, metric, and postal shapes fail closed.
|
|
594
|
+
| `buyProducts` | `buy_products` | `create_media_buy` | Feed/pricing fencing is not atomic. Rejected by default; explicit opt-in names `feed_version_not_atomic` and, when present, `pricing_version_not_atomic`. A missing `feed_version` remains unsupported here; tokenless catalogs use the separate SDK-local `continueLegacyPurchase()` handoff. Shared package fields and nested targeting/reporting enums map against the negotiated schema, including 3.1+ `format_option_refs`; newer targeting, metric, and postal shapes fail closed. A direct compact `total_budget` and fields introduced on the 3.2 established surface—including allocation, budget-cap, bidding, governance, opportunity, and newer package controls—map only on a negotiated 3.2 established lane. Compact `catalog_ids` and resolved `pricing` remain typed unsupported. |
|
|
594
595
|
| `acceptProposal` | `accept_proposal` | `create_media_buy(proposal_id=...)` | A compact-shaped proposal retains strict digest, immutable-snapshot, account-scope, kind/status, and expiry checks. Caller values cannot override digest-bound budget, budget-cap, timezone, or purchase-order terms. An honest 3.0/3.1 proposal remains executable with its ordinary `proposal_id` semantics only after explicit opt-in to `proposal_terms_digest_not_enforced`, `proposal_terms_digest_unavailable`, and `proposal_snapshot_not_immutable` (plus `proposal_hold_not_verifiable` when it has no expiry). The caller supplies the original brand/flight as `established_fallback`; the SDK does not claim those values came from the seller or synthesize a digest. |
|
|
595
|
-
| `controlMediaBuy` | `control_media_buy` | `update_media_buy` | Account, media-buy ID, and a positive revision are required. Revision and identically shaped fields present in the negotiated established schema map directly; `name` maps on the 3.2 established surface and fails closed on 3.0/3.1, whose update schemas do not define it.
|
|
596
|
+
| `controlMediaBuy` | `control_media_buy` | `update_media_buy` | Account, media-buy ID, and a positive revision are required. Revision and identically shaped fields present in the negotiated established schema map directly; `name` maps on the 3.2 established surface and fails closed on 3.0/3.1, whose update schemas do not define it. Pre-3.2 lanes reject the broader compact optimization-goal union and nested targeting/keyword shapes they cannot represent. Compact `catalog_ids` cannot be cast to established `catalogs` objects, so it fails closed in every established lane. |
|
|
596
597
|
| Readback | shared tools | `get_media_buys`, `get_media_buy_delivery` | Same public calls and canonical creative projection in every lane. Versioned request additions fail closed: webhook-activity and delivery-window/granularity options require 3.1+, while `indicator_types`, demographic breakdowns, and spot breakdowns require 3.2. Native postal reporting shapes require 3.1+. |
|
|
597
598
|
|
|
598
599
|
Lossy mutations are fail-closed. An adopter may opt into only the exact named
|
|
@@ -735,8 +736,7 @@ trusted namespaces, never a buyer-supplied proposal ID alone.
|
|
|
735
736
|
|
|
736
737
|
| Buyer surface | Seller surface | Expected path | Guarantee |
|
|
737
738
|
|---|---|---|---|
|
|
738
|
-
| Established `getProducts` / `createMediaBuy` / `updateMediaBuy` | AdCP
|
|
739
|
-
| Compact-first coordinator | AdCP 2.5 | `list_products` → `get_products`; purchase → `create_media_buy`; supported control → `update_media_buy` | The direct common subset remains usable. Proposal objects/binding, media-buy readback, pagination, cancellation, v3-only top-level/package fields, and update reporting-webhook changes are typed unsupported rather than sent into v2.5's permissive additional-properties boundary. Feed fencing and optimistic revision enforcement require their named loss opt-ins. |
|
|
739
|
+
| Established `getProducts` / `createMediaBuy` / `updateMediaBuy` | AdCP 3.0/3.1 or a dual-surface 3.2 seller | Established tools are called directly | Existing application behavior remains unchanged; the compact coordinator is not involved. |
|
|
740
740
|
| Compact-first coordinator | AdCP 3.0, 3.1, or 3.2 legacy-only | `list_products` → `get_products`; proposal discovery/refinement → `get_products`; control → `update_media_buy`; purchase → `create_media_buy` only when its named loss policy permits it | Common-subset reads and control are lossless. Atomic feed/pricing fencing, digest enforcement, and terminal decline are not representable and fail before mutation by default. |
|
|
741
741
|
| Compact-first coordinator | AdCP 3.2 dual-surface | Compact tools are preferred; `preferredLifecycle: 'established'` exercises the compatibility facade | Native by default; the forced established lane has the same explicit boundaries as older sellers. |
|
|
742
742
|
| Compact-first coordinator | AdCP 3.2 compact-only | Compact lifecycle tools | Native compact guarantees. |
|
|
@@ -749,7 +749,7 @@ that a 3.0 seller can enforce a 3.2-only atomicity or digest guarantee. The SDK
|
|
|
749
749
|
must reject that case or report the exact explicitly accepted loss; it must
|
|
750
750
|
never label the weaker mutation as equivalent.
|
|
751
751
|
|
|
752
|
-
The coordinator test matrix covers
|
|
752
|
+
The coordinator test matrix covers compact-first callers against
|
|
753
753
|
3.0, 3.1, 3.2 legacy-only, 3.2 dual-surface (compact preferred and established
|
|
754
754
|
forced), and 3.2 compact-only discovery. The dual-surface MCP lane also holds
|
|
755
755
|
the maximum at 3.2 while defaulting unversioned discovery and dispatch to 3.1,
|
|
@@ -761,9 +761,6 @@ validating every request and response against the corresponding cached wire
|
|
|
761
761
|
bundle. Those lanes assert canonical format projection, pagination,
|
|
762
762
|
feed/pricing provenance, account/brand/context/currency continuity, exact
|
|
763
763
|
replay, changed-payload conflict, no duplicate mutation, control, and shared
|
|
764
|
-
readback. The honest v2.5 fixture executes its complete representable direct
|
|
765
|
-
subset, validates exact legacy wire, and asserts typed failures for pagination,
|
|
766
|
-
proposals, cancellation, unsupported create/update fields, and media-buy
|
|
767
764
|
readback. Versioned MCP fixtures also preserve submitted and input-required
|
|
768
765
|
proposal states without inventing completed outcomes. A normal 3.2 server
|
|
769
766
|
profile is exercised by 3.0 and 3.1 buyers through hidden established routes,
|
|
@@ -0,0 +1,264 @@
|
|
|
1
|
+
# Property lists: matching, registry contribution, and serving
|
|
2
|
+
|
|
3
|
+
## Buyer enforcement
|
|
4
|
+
|
|
5
|
+
`validation.productPropertyPolicy` reads `get_products.filters.property_list`
|
|
6
|
+
and the deprecated top-level `property_list`. When both are present they must
|
|
7
|
+
have the same `agent_url`, `list_id`, and `auth_token`; conflicting references
|
|
8
|
+
fail closed with `property_list_conflicting_references`. A malformed nested
|
|
9
|
+
reference never falls back to the top-level field. The same reference is kept
|
|
10
|
+
for polling, tracking, and webhook completions.
|
|
11
|
+
|
|
12
|
+
These location and mixed-identifier fixes ship together. As before, request
|
|
13
|
+
list enforcement defaults to enabled. Set `enforceRequestPropertyList: false`
|
|
14
|
+
to disable local resolution, or `productPropertyPolicy: false` to disable the
|
|
15
|
+
policy entirely. Resolution errors (including a non-MCP list URL) fail closed.
|
|
16
|
+
|
|
17
|
+
Lists may mix domains, app bundles, and CTV store IDs. Non-domain types no
|
|
18
|
+
longer cause an unconditional response failure. A product's
|
|
19
|
+
`publisher_properties` contains publisher selectors, not app IDs: `property_ids`
|
|
20
|
+
are opaque names scoped to a publisher. Supply complete catalogs to match
|
|
21
|
+
their real identifiers:
|
|
22
|
+
|
|
23
|
+
```typescript
|
|
24
|
+
import { AdCPClient, type ProductPolicyResolvedProperty } from '@adcp/sdk';
|
|
25
|
+
|
|
26
|
+
declare const loadPublisherCatalog: (
|
|
27
|
+
domain: string
|
|
28
|
+
) => Promise<readonly ProductPolicyResolvedProperty[] | undefined>;
|
|
29
|
+
|
|
30
|
+
const client = new AdCPClient(agents, {
|
|
31
|
+
validation: {
|
|
32
|
+
productPropertyPolicy: {
|
|
33
|
+
enforceRequestPropertyList: true,
|
|
34
|
+
unknownSelectorBehavior: 'flag',
|
|
35
|
+
resolvePublisherProperties: loadPublisherCatalog,
|
|
36
|
+
},
|
|
37
|
+
},
|
|
38
|
+
});
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
The resolver receives normalized, untrusted publisher hostnames and an optional
|
|
42
|
+
`{ signal }` argument. It returns the complete
|
|
43
|
+
catalog of `{ property_id?, identifiers: [{ type, value }], tags? }` records
|
|
44
|
+
from your publisher metadata store or discovery layer. Alternatively provide
|
|
45
|
+
`publisherProperties: { [publisherDomain]: catalog }` directly. Keys use the exact
|
|
46
|
+
normalized publisher hostname, including `www.` when present; catalogs are not
|
|
47
|
+
shared across host aliases. When catalogs are configured, missing or failed
|
|
48
|
+
lookups mean unknown metadata; `[]` means a known empty catalog. This hook does
|
|
49
|
+
not initiate any additional registry or publisher lookups unless you implement
|
|
50
|
+
them. Identifier type and value must match exactly for non-domain identifiers;
|
|
51
|
+
bundle casing is preserved. `all`, `by_id`, and `by_tag` selectors are resolved
|
|
52
|
+
against these records. Products with `property_targeting_allowed: true` may
|
|
53
|
+
retain a proven eligible subset; other products must satisfy the policy for
|
|
54
|
+
every selected property.
|
|
55
|
+
|
|
56
|
+
Catalog loading is limited to 100 distinct lookups per response, 10 seconds
|
|
57
|
+
per lookup, and a 10-second total budget by default (`maxPublisherLookups`,
|
|
58
|
+
`publisherLookupTimeoutMs`, `publisherLookupBudgetMs`).
|
|
59
|
+
Overflow and failed/timed-out lookups stay unknown even when a domain matches.
|
|
60
|
+
Literal IP and localhost inputs do not reach the hook. For network discovery,
|
|
61
|
+
use the SDK's SSRF-safe networking utilities to protect DNS resolution too;
|
|
62
|
+
catalog identity/ownership verification remains the catalog provider's job.
|
|
63
|
+
|
|
64
|
+
Products whose membership cannot be judged follow `unknownSelectorBehavior`
|
|
65
|
+
(`allow`, `flag`, or `reject`). Request-derived policies remain strict by
|
|
66
|
+
default, so the default unknown behavior is `reject`; choose `flag` explicitly
|
|
67
|
+
to retain uncertain products. Known disallowed properties still reject even
|
|
68
|
+
when another property is unknown. Diagnostics appear under
|
|
69
|
+
`metadata.productPropertyPolicy`, including per-product
|
|
70
|
+
`unresolved_property_identifiers` / `identifier_types` and
|
|
71
|
+
`request_property_list.unsupported_identifier_types` for unrecognized types.
|
|
72
|
+
|
|
73
|
+
## Identifier normalization and registration
|
|
74
|
+
|
|
75
|
+
`normalizePropertyIdentifier(type, value)` (also exported as
|
|
76
|
+
`validatePropertyIdentifier`) returns either `{ ok: true, value, rewrite? }`
|
|
77
|
+
or `{ ok: false, error: IdentifierValidationError }`. Named normalizers cover
|
|
78
|
+
domain, subdomain, iOS/Android bundles, Apple/Google/Roku/Samsung store IDs,
|
|
79
|
+
Fire TV ASINs, and Apple TV/generic bundles. Each normalizer validates too.
|
|
80
|
+
|
|
81
|
+
Domain normalization accepts HTTP(S) URLs and reports their reduction to a
|
|
82
|
+
hostname, lowercases IDNs, and preserves wildcards. It preserves `www.` and
|
|
83
|
+
`m.` because removing those labels would broaden an explicit allowlist.
|
|
84
|
+
`subdomain` rejects wildcards. Platform names preserve case; numeric IDs stay
|
|
85
|
+
strings without losing precision. Formats for app/store identifiers are SDK
|
|
86
|
+
input hygiene rules, not assertions of registration, ownership, or existence.
|
|
87
|
+
Opaque identifier families retain their spelling (including station names
|
|
88
|
+
with spaces). Use these opt-in helpers before storing or matching values:
|
|
89
|
+
|
|
90
|
+
```typescript
|
|
91
|
+
import { normalizePropertyIdentifier } from '@adcp/sdk';
|
|
92
|
+
|
|
93
|
+
const checked = normalizePropertyIdentifier('domain', submittedValue);
|
|
94
|
+
if (!checked.ok) throw checked.error;
|
|
95
|
+
await identifierStore.save({ type: 'domain', value: checked.value });
|
|
96
|
+
// checked.rewrite, when present, records { from, to } for your review/audit UI.
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
`validatePublisherDomain(value)` is deliberately stricter: a publisher
|
|
100
|
+
registration must already be a lowercase bare hostname. URLs, wildcards,
|
|
101
|
+
ports, whitespace, trailing dots, malformed labels, and IP literals reject
|
|
102
|
+
with `IdentifierValidationError.code === 'invalid_publisher_domain'`.
|
|
103
|
+
`RegistryClient.saveProperty()` always performs this validation before HTTP.
|
|
104
|
+
`saveProperties()` uses the same check for every record; failed records retain
|
|
105
|
+
the existing `error` string and expose the typed error as `cause`.
|
|
106
|
+
|
|
107
|
+
## Bulk catalog contribution
|
|
108
|
+
|
|
109
|
+
`resolveIdentifiers()` in default `resolve` mode is the primary bulk catalog
|
|
110
|
+
registration path: it contributes provenance, creates missing entries, and
|
|
111
|
+
returns stable `property_rid` handles. Use `mode: 'lookup'` for read-only lookup.
|
|
112
|
+
A RID is a join handle and does not grant advertising authorization.
|
|
113
|
+
|
|
114
|
+
```typescript
|
|
115
|
+
import { RegistryClient, isRegistryRequestError } from '@adcp/sdk';
|
|
116
|
+
|
|
117
|
+
const registry = new RegistryClient({ apiKey: process.env.ADCP_REGISTRY_API_KEY });
|
|
118
|
+
const outcomes = await registry.resolveIdentifiersAll({
|
|
119
|
+
identifiers,
|
|
120
|
+
provenance: { type: 'agency_allowlist', context: campaignId },
|
|
121
|
+
// Omit mode to register/contribute. Use mode: 'lookup' for a pure read.
|
|
122
|
+
}, {
|
|
123
|
+
batchSize: 10_000,
|
|
124
|
+
maxRequestBytes: 1024 * 1024,
|
|
125
|
+
concurrency: 2,
|
|
126
|
+
maxRetries: 3,
|
|
127
|
+
maxRetryDelayMs: 60_000,
|
|
128
|
+
});
|
|
129
|
+
|
|
130
|
+
for (const outcome of outcomes) {
|
|
131
|
+
if (outcome.success) useCatalogHandle(outcome.identifier, outcome.result.property_rid);
|
|
132
|
+
else if (isRegistryRequestError(outcome.error)) {
|
|
133
|
+
reportRegistryFailure(outcome.index, outcome.error.status, outcome.error.retryAfterMs);
|
|
134
|
+
} else reportInputFailure(outcome.index, outcome.error);
|
|
135
|
+
}
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
The helper caps each request at 10,000 identifiers and the configured UTF-8
|
|
139
|
+
JSON byte limit, including provenance. It limits concurrency, honors
|
|
140
|
+
`retryAfterMs` on HTTP 429, and returns an outcome for each input in input order,
|
|
141
|
+
including duplicates. Oversized individual items, missing/malformed response
|
|
142
|
+
entries, and failed batches become per-input errors; successful batches remain
|
|
143
|
+
available. Inputs should already use canonical identifier spelling so registry
|
|
144
|
+
results can be correlated by type and value. Empty input returns `[]`.
|
|
145
|
+
|
|
146
|
+
Only rate limits are retried automatically. A server delay exceeding
|
|
147
|
+
`maxRetryDelayMs` stops pending requests and returns the typed 429 (including
|
|
148
|
+
its `retryAfterMs`) for callers to reschedule, without retrying early.
|
|
149
|
+
Network and 5xx failures may have
|
|
150
|
+
already contributed activity: identifier-to-RID resolution is idempotent, but
|
|
151
|
+
the activity log is additive. The single-call API guards the 10,000-item limit;
|
|
152
|
+
use the helper for byte-based splitting. `/api/registry/resolve` accepts responses
|
|
153
|
+
up to 16 MiB by default; explicit `RegistryClientConfig.maxBodyBytes` still wins.
|
|
154
|
+
|
|
155
|
+
Use `saveProperty()` when publishing or updating hosted publisher
|
|
156
|
+
configuration (names, property identities, tags), rather than contributing a
|
|
157
|
+
large identifier catalog. `saveProperties()` is a bounded client-side fan-out
|
|
158
|
+
over that endpoint, intended for configuration updates. Its results are keyed
|
|
159
|
+
by publisher domain; submit one configuration per domain.
|
|
160
|
+
|
|
161
|
+
Registry HTTP failures use the exported `RegistryRequestError` /
|
|
162
|
+
`isRegistryRequestError` contract, with `status`, `method`, `retryAfterMs`, and
|
|
163
|
+
bounded untrusted `details`. Do not parse `error.message` for status or retry
|
|
164
|
+
timing. Input validation and transport failures are separate errors.
|
|
165
|
+
|
|
166
|
+
## Serve buyer-issued references over MCP
|
|
167
|
+
|
|
168
|
+
`registerPropertyListTool` registers a real MCP `get_property_list` tool using
|
|
169
|
+
the official MCP server. The reference's `auth_token` must authorize its exact
|
|
170
|
+
`list_id`. It arrives in `Authorization: Bearer` or `x-adcp-auth`, never as a
|
|
171
|
+
tool argument. The verifier runs before storage is read, on every page.
|
|
172
|
+
|
|
173
|
+
```typescript
|
|
174
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
175
|
+
import { serve } from '@adcp/sdk';
|
|
176
|
+
import { registerPropertyListTool } from '@adcp/sdk/server';
|
|
177
|
+
|
|
178
|
+
serve(() => {
|
|
179
|
+
const server = new McpServer({ name: 'Buyer property lists', version: '1.0.0' });
|
|
180
|
+
registerPropertyListTool(server, {
|
|
181
|
+
verifyToken: ({ listId, token }) => listStore.verifyListToken(listId, token),
|
|
182
|
+
loadPage: (request, principal) => listStore.loadAuthorizedPage(request, principal),
|
|
183
|
+
});
|
|
184
|
+
return server;
|
|
185
|
+
}, {
|
|
186
|
+
path: '/property-lists/mcp',
|
|
187
|
+
publicUrl: 'https://buyer.example/property-lists/mcp',
|
|
188
|
+
authenticate: listEndpointAuthenticator,
|
|
189
|
+
});
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
Use your list endpoint's authenticator to validate list tokens globally and
|
|
193
|
+
return `{ principal, token }`; the per-tool verifier still checks exact list
|
|
194
|
+
access. Mount this read-only endpoint separately if your normal platform auth
|
|
195
|
+
only accepts account bearers. Its proxy/auth middleware must allow the list
|
|
196
|
+
token through. Ordinary MCP initialization needs no list ID. The helper also
|
|
197
|
+
supports raw HTTP headers when a transport does not populate `authInfo`.
|
|
198
|
+
It denies conflicting credentials and does not expose verifier/storage errors.
|
|
199
|
+
|
|
200
|
+
`loadPage` receives a verified principal and the validated request, including
|
|
201
|
+
`resolve` and `pagination`. Return `{ list, identifiers, pagination?,
|
|
202
|
+
resolved_at?, cache_valid_until? }`. The list includes at least `list_id` and
|
|
203
|
+
`name`; `identifiers` must be an array when resolving, including `[]` for an
|
|
204
|
+
empty list. For `resolve: false`, return metadata without resolving identifiers.
|
|
205
|
+
Honor the requested page limit (default 1,000; maximum 10,000). Provide a
|
|
206
|
+
nonempty continuation cursor only when `has_more` is true, and bind cursors to
|
|
207
|
+
the list, principal, and catalog revision. `list.property_count` is the total
|
|
208
|
+
property count, not the current page's identifier count. Return coherent
|
|
209
|
+
`cache_valid_until` timestamps across pages. The helper adds completion status
|
|
210
|
+
and echoes request context on success and errors.
|
|
211
|
+
|
|
212
|
+
Issue references whose `agent_url` points at this MCP endpoint. A plain REST
|
|
213
|
+
URL returning JSON does not implement `get_property_list`.
|
|
214
|
+
|
|
215
|
+
## Signed change notifications and certification
|
|
216
|
+
|
|
217
|
+
Use your configured SDK `WebhookEmitter` (or the emitter from
|
|
218
|
+
`createPostgresWebhookRuntime`) so signing, bounded retries, durable delivery
|
|
219
|
+
bindings, and crash recovery use the same infrastructure as other webhooks:
|
|
220
|
+
|
|
221
|
+
```typescript
|
|
222
|
+
import { sendPropertyListChanged } from '@adcp/sdk/server';
|
|
223
|
+
|
|
224
|
+
const result = await sendPropertyListChanged(
|
|
225
|
+
webhooks.emitter.forTenantScope(trustedTenantId),
|
|
226
|
+
{
|
|
227
|
+
url: subscriber.webhookUrl,
|
|
228
|
+
delivery_id: persistedDeliveryId,
|
|
229
|
+
notification: {
|
|
230
|
+
list_id: changedListId,
|
|
231
|
+
resolved_at: resolvedAt.toISOString(),
|
|
232
|
+
change_summary: { properties_added: added, properties_removed: removed, total_properties: total },
|
|
233
|
+
},
|
|
234
|
+
},
|
|
235
|
+
);
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
Retain the same delivery ID and exact notification for retries. Each distinct
|
|
239
|
+
event/subscriber delivery needs its own ID. The helper selects RFC 9421,
|
|
240
|
+
includes the compatibility marker `signature: 'rfc9421'`, and lets the emitter
|
|
241
|
+
bind a stable cryptographic `idempotency_key`. It sends a summary; receivers
|
|
242
|
+
refresh through `get_property_list`. Configure production delivery storage,
|
|
243
|
+
recovery, signing keys, and per-attempt subscription authorization on the
|
|
244
|
+
emitter; see [the runtime reference](../TYPE-SUMMARY.md#postgresql-webhook-runtime).
|
|
245
|
+
|
|
246
|
+
Before certifying a buyer, resolve references it actually issued:
|
|
247
|
+
|
|
248
|
+
```typescript
|
|
249
|
+
import { runPropertyListConformance, runConformance } from '@adcp/sdk/conformance';
|
|
250
|
+
|
|
251
|
+
const report = await runPropertyListConformance(issuedReferences);
|
|
252
|
+
if (report.totalFailures) throw new Error('Buyer-issued property lists are not resolvable');
|
|
253
|
+
|
|
254
|
+
// Or include them in the main certification report/failure count:
|
|
255
|
+
const fullReport = await runConformance(buyerAgentUrl, {
|
|
256
|
+
propertyListReferences: issuedReferences,
|
|
257
|
+
});
|
|
258
|
+
```
|
|
259
|
+
|
|
260
|
+
Certification disables caches, validates each resolved page, checks list
|
|
261
|
+
identity, rejects failure envelopes/oversized pages/cursor cycles, and uses
|
|
262
|
+
the same MCP resolver as sellers. Reports identify inputs by index and never
|
|
263
|
+
echo the reference token, URL, or remote exception. Empty lists are valid;
|
|
264
|
+
unresolvable references fail the report rather than silently certifying.
|
|
@@ -503,6 +503,31 @@ app.post('/webhook', async (req, res) => {
|
|
|
503
503
|
});
|
|
504
504
|
```
|
|
505
505
|
|
|
506
|
+
Webhook-v1 uses unpadded Base64URL for `Signature` throughout AdCP 3.x,
|
|
507
|
+
including 3.2. Its URL canonicalization follows AdCP 3.2 independently of
|
|
508
|
+
that encoding. The 3.2 request-signing migration to padded standard Base64
|
|
509
|
+
does not change the webhook-v1 profile. Python senders should use
|
|
510
|
+
`adcp.signing.webhook_signer.sign_webhook` rather than a generic
|
|
511
|
+
`sign_request` call with `signing_profile_version="3.2"` and the webhook tag.
|
|
512
|
+
See the [protocol's binary-value encoding rules](https://github.com/adcontextprotocol/adcp/blob/v3.2.5/docs/building/by-layer/L1/security.mdx#adcp-rfc-9421-profile).
|
|
513
|
+
|
|
514
|
+
When a known peer uses a generic RFC 9421 signer that emits standard padded
|
|
515
|
+
Base64, configure that receiver route explicitly:
|
|
516
|
+
|
|
517
|
+
```typescript
|
|
518
|
+
await verifyWebhookSignature(req, {
|
|
519
|
+
jwks,
|
|
520
|
+
replayStore,
|
|
521
|
+
revocationStore,
|
|
522
|
+
signatureEncoding: 'rfc8941-base64',
|
|
523
|
+
});
|
|
524
|
+
```
|
|
525
|
+
|
|
526
|
+
`createWebhookVerifier` accepts the same option. Each mode strictly parses
|
|
527
|
+
its configured encoding; neither retries the other encoding. Select this
|
|
528
|
+
option from trusted integration configuration, independently of incoming
|
|
529
|
+
headers or webhook payloads.
|
|
530
|
+
|
|
506
531
|
## Step 6: Sign Outbound Webhooks (Seller)
|
|
507
532
|
|
|
508
533
|
Configure `createAdcpServerFromPlatform` with a webhook signing key:
|
|
@@ -835,3 +835,8 @@ Random seed on nightly broadens the surface; fixed seed on per-PR keeps reproduc
|
|
|
835
835
|
- [`MULTI-INSTANCE-TESTING.md`](./MULTI-INSTANCE-TESTING.md) — horizontal scaling bug hunt
|
|
836
836
|
- [`BUILD-AN-AGENT.md`](./BUILD-AN-AGENT.md) — server-side implementation
|
|
837
837
|
- `skills/build-*-agent/SKILL.md` — per-specialism obligations and storyboard IDs
|
|
838
|
+
|
|
839
|
+
|
|
840
|
+
For creative evaluator security fixtures, see
|
|
841
|
+
[Creative evaluator build probes](CREATIVE-BUILD-PROBE.md) for valid route/input
|
|
842
|
+
preparation, provisioned legacy selectors and explicit coverage gaps.
|
package/docs/llms.txt
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# Ad Context Protocol (AdCP)
|
|
2
2
|
|
|
3
|
-
> Generated at: 2026-10-
|
|
4
|
-
> Library: @adcp/sdk v16.0.0-beta.
|
|
3
|
+
> Generated at: 2026-10-19
|
|
4
|
+
> Library: @adcp/sdk v16.0.0-beta.9
|
|
5
5
|
> AdCP major version: 3
|
|
6
6
|
> Canonical URL: https://adcontextprotocol.github.io/adcp-client/llms.txt
|
|
7
7
|
> Note: the `Library` stamp reflects the package.json version at doc-generation time. The narrative below describes the surface that lands on the next-published minor — including any 6.7 helpers documented here ahead of the release tag.
|
|
@@ -929,10 +929,12 @@ acceptance, caller-supplied budget,
|
|
|
929
929
|
budget-cap, timezone, or purchase-order values must match any digest-bound
|
|
930
930
|
seller terms; a conflict fails before `create_media_buy`.
|
|
931
931
|
|
|
932
|
-
|
|
933
|
-
cancellation, and v3-only package controls
|
|
934
|
-
|
|
935
|
-
because v2.5 has no optimistic revision token.
|
|
932
|
+
Historically, the SDK 14 v2.5 lane rejected proposal operations,
|
|
933
|
+
`get_media_buys`, pagination, cancellation, and v3-only package controls with
|
|
934
|
+
typed unsupported errors. Pause/resume updates required explicit
|
|
935
|
+
`revision_not_atomic` opt-in because v2.5 has no optimistic revision token.
|
|
936
|
+
SDK 16 removes that lane and rejects AdCP 2 agents before dispatch; see the
|
|
937
|
+
[AdCP 2 retirement guide](./migration-drop-adcp-2.md).
|
|
936
938
|
|
|
937
939
|
Run the same compact CLI storyboards against established sellers with
|
|
938
940
|
`--media-buy-lifecycle-compat`. Use `--media-buy-compat-losses` only for the
|
|
@@ -1171,18 +1173,20 @@ configuration error; a tool or response variant absent from an installed
|
|
|
1171
1173
|
bundle returns `undefined`. Neither case silently falls back to the current
|
|
1172
1174
|
schema.
|
|
1173
1175
|
|
|
1174
|
-
|
|
1175
|
-
`serverVersion: 'v2' | 'v3'`. `serverVersionSynthetic`
|
|
1176
|
-
authoritative capability declaration (`false`) from the SDK's
|
|
1177
|
-
fallback (`true`). Both fields survive submitted/deferred
|
|
1178
|
-
durable restart recovery. `adcpVersion` remains the distinct,
|
|
1179
|
-
value echoed by a seller response.
|
|
1180
|
-
|
|
1181
|
-
|
|
1182
|
-
|
|
1183
|
-
|
|
1184
|
-
|
|
1185
|
-
|
|
1176
|
+
In SDK 14, every `TaskResult.metadata` exposed the selected seller wire
|
|
1177
|
+
generation as `serverVersion: 'v2' | 'v3'`. `serverVersionSynthetic`
|
|
1178
|
+
distinguishes an authoritative capability declaration (`false`) from the SDK's
|
|
1179
|
+
compatibility fallback (`true`). Both fields survive submitted/deferred
|
|
1180
|
+
continuations and durable restart recovery. `adcpVersion` remains the distinct,
|
|
1181
|
+
release-precision value echoed by a seller response. SDK 16 only dispatches
|
|
1182
|
+
AdCP 3 and rejects stored AdCP 2 continuations before resuming them; see the
|
|
1183
|
+
[AdCP 2 retirement guide](./migration-drop-adcp-2.md).
|
|
1184
|
+
|
|
1185
|
+
The SDK 14 v2.5 `get_products` response adapter also accepted explicitly zoned
|
|
1186
|
+
legacy forecast timestamps, including offset variants and single `$date`/`value`
|
|
1187
|
+
wrappers. It converted them to UTC RFC 3339 without losing fractional precision;
|
|
1188
|
+
ambiguous or unzoned values remained untouched, and the preserved seller wire
|
|
1189
|
+
object was not mutated. That AdCP 2 adapter was removed in SDK 16.
|
|
1186
1190
|
|
|
1187
1191
|
SDK 14 also adds semantic refinements to public object schemas. Behavior when
|
|
1188
1192
|
composing a refined schema varies across supported Zod 4 releases: `.extend()`
|
|
@@ -16,18 +16,18 @@ pin using `ADCP_VERSION` inside that tarball.
|
|
|
16
16
|
|
|
17
17
|
| Fact | Value |
|
|
18
18
|
| --- | --- |
|
|
19
|
-
| Checkout `package.json` version | `@adcp/sdk@16.0.0-beta.
|
|
20
|
-
| npm integrity | registry-derived after publication; run `npm view @adcp/sdk@16.0.0-beta.
|
|
19
|
+
| Checkout `package.json` version | `@adcp/sdk@16.0.0-beta.9` |
|
|
20
|
+
| npm integrity | registry-derived after publication; run `npm view @adcp/sdk@16.0.0-beta.9 dist.integrity` |
|
|
21
21
|
| Node.js runtime | `^20.19.0 || >=22.12.0` |
|
|
22
22
|
| Default AdCP wire release | `3.2.5` |
|
|
23
|
-
| Maintained wire releases | `
|
|
23
|
+
| Maintained wire releases | `v3`, `3.0.0`, `3.0`, `3.0.1`, `3.0.2`, `3.0.3`, `3.0.4`, `3.0.5`, `3.0.6`, `3.0.7`, `3.0.8`, `3.0.9`, `3.0.10`, `3.0.11`, `3.0.12`, `3.0.13`, `3.0.14`, `3.0.15`, `3.0.16`, `3.0.17`, `3.0.18`, `3.0.19`, `3.0.20`, `3.0.21`, `3.0.22`, `3.0.23`, `3.0.24`, `3.0.25`, `3.1.0`, `3.1`, `3.1.1`, `3.1.2`, `3.1.3`, `3.1.4`, `3.1.5`, `3.1.6`, `3.1.7`, `3.1.8`, `3.1.9`, `3.1.10`, `3.1.11`, `3.1.12`, `3.1.13`, `3.1.14`, `3.1.15`, `3.1.16`, `3.1.17`, `3.1.18`, `3.1.19`, `3.1.20`, `3.1.21`, `3.1.22`, `3.1.23`, `3.1.24`, `3.1.25`, `3.1.26`, `3.1.27`, `3.1.28`, `3.1.29`, `3.2.1`, `3.2`, `3.2.2`, `3.2.3`, `3.2.4`, `3.2.5` |
|
|
24
24
|
| Canonical migration notes | [SDK 15 OAuth](./migration-oauth-issuer-bindings.md), [issuer-binding and storage](./guides/OAUTH-ISSUER-BINDING.md); historical [13.x → 14](./migration-13-to-14.md) |
|
|
25
25
|
|
|
26
26
|
For a checkout at the published release commit, install the exact package version:
|
|
27
27
|
|
|
28
28
|
```bash
|
|
29
|
-
npm install --save-exact '@adcp/sdk@16.0.0-beta.
|
|
30
|
-
npm view '@adcp/sdk@16.0.0-beta.
|
|
29
|
+
npm install --save-exact '@adcp/sdk@16.0.0-beta.9'
|
|
30
|
+
npm view '@adcp/sdk@16.0.0-beta.9' dist.integrity
|
|
31
31
|
```
|
|
32
32
|
|
|
33
33
|
### Required and optional peers
|
|
@@ -882,13 +882,18 @@ steps for a 4.x upgrader and are omitted here:
|
|
|
882
882
|
|
|
883
883
|
## v2 sunset
|
|
884
884
|
|
|
885
|
-
AdCP v2
|
|
886
|
-
|
|
887
|
-
|
|
888
|
-
|
|
889
|
-
|
|
890
|
-
|
|
891
|
-
|
|
885
|
+
AdCP v2 became unsupported at the April 2026 3.0 GA cutover and reached
|
|
886
|
+
full end of life on August 1, 2026; see the protocol's
|
|
887
|
+
[v2 sunset policy](https://github.com/adcontextprotocol/adcp/blob/main/docs/reference/v2-sunset.mdx).
|
|
888
|
+
In SDK 5.x, the client still executed v2 code paths and emitted a one-time
|
|
889
|
+
`console.warn` when a client instance saw explicit v2 capabilities. That
|
|
890
|
+
historical warning could be suppressed with `ADCP_ALLOW_V2=1` or
|
|
891
|
+
`adcp --allow-v2`; synthetic capabilities did not fire it.
|
|
892
|
+
|
|
893
|
+
**SDK 16 update:** AdCP 2 compatibility, `ADCP_ALLOW_V2`, and `--allow-v2`
|
|
894
|
+
have been removed. Agents must support AdCP 3 discovery before business-tool
|
|
895
|
+
dispatch. Follow the [AdCP 2 retirement guide](./migration-drop-adcp-2.md)
|
|
896
|
+
for current behavior and the last supporting SDK pins.
|
|
892
897
|
|
|
893
898
|
## Webhook HMAC legacy deprecation
|
|
894
899
|
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# Removing AdCP 2 compatibility
|
|
2
|
+
|
|
3
|
+
AdCP 2.5 reached end of life on August 1, 2026. The SDK now supports AdCP 3 agents only. This is an SDK major release change. Integrations that still require AdCP 2 can pin the last supporting beta, `npm install @adcp/sdk@16.0.0-beta.8`, or stay on the stable SDK 15 line (`npm install @adcp/sdk@15.9.6`) while upgrading their agents.
|
|
4
|
+
|
|
5
|
+
Upgrade agents to AdCP 3 before upgrading the SDK. An agent must expose `get_adcp_capabilities`. Its `adcp.supported_versions` determines its supported majors; `adcp.major_versions` is the legacy fallback. Omitting both fields no longer selects AdCP 2.
|
|
6
|
+
|
|
7
|
+
Agents that declare only AdCP 2 and agents missing capability discovery fail with `VersionUnsupportedError` (`code: 'VERSION_UNSUPPORTED'`) before a business tool is dispatched. AdCP 2 constructor pins fail with `ConfigurationError`, even if an old schema cache remains on disk.
|
|
8
|
+
|
|
9
|
+
The release removes:
|
|
10
|
+
|
|
11
|
+
- `allowV2`, `ADCP_ALLOW_V2`, and the CLI `--allow-v2` flag.
|
|
12
|
+
- `SingleAgentClient.isSyntheticV2()` and the v2 `buildSyntheticCapabilities()` helper.
|
|
13
|
+
- The `2` argument to `SingleAgentClient.supportsVersion()` and `AgentClient.supportsVersion()`; the maintained query is `supportsVersion(3)`.
|
|
14
|
+
- The `@adcp/sdk/types/v2-5` export and AdCP 2 schema bundles.
|
|
15
|
+
- Outbound AdCP 2 adapters: `adaptGetProductsRequestForV2`, `adaptPricingOptionForV2`, `adaptProductPricingForV2`, `adaptSyncCreativesRequestForV2`, `adaptPackageRequestForV2`, `adaptCreateMediaBuyRequestForV2`, and `adaptUpdateMediaBuyRequestForV2`.
|
|
16
|
+
- AdCP 2 creative/format/preview detectors: `usesV2CreativeIds`, `usesV2Dimensions`, and `usesV2RenderFields`, plus their v2-only structural types (`PackageRequestV2`, `PackageResponseV2`, `PackageAdapterContext`, `FormatV2`, and `PreviewRenderV2`).
|
|
17
|
+
- The `sync-schemas:v2.5` and `generate-types:v2.5` scripts.
|
|
18
|
+
|
|
19
|
+
Submit canonical AdCP 3 `creative_assignments`, format `renders`, and preview `render_id` / `role` fields. The maintained read helpers (`getCreativeIds`, `getCreativeAssignments`, `getFormatRenders`, `getPrimaryRender`, `getFormatDimensions`, `getRenderId`, `getRenderRole`, and preview URL/HTML accessors) still inspect valid AdCP 3 data. Their normalizers preserve that data; they no longer promote `creative_ids`, top-level format dimensions, or `output_id` into AdCP 3 fields.
|
|
20
|
+
|
|
21
|
+
Seller applications using `createAdcpServer` or `createAdcpServerFromPlatform` must remove AdCP 2 from `capabilities.major_versions` and `capabilities.supported_versions`. Startup rejects a declaration such as `[2, 3]` because this SDK no longer implements the advertised AdCP 2 surface. A buyer can still call an external agent that genuinely implements both majors: when its discovery includes AdCP 3, the SDK negotiates AdCP 3.
|
|
22
|
+
|
|
23
|
+
AdCP 3.0 and 3.1 compatibility remains available. Creative-model v2 projections and MCP v2 transport names refer to separate version schemes and remain supported.
|
|
24
|
+
|
|
25
|
+
See the protocol's [v2 sunset policy](https://github.com/adcontextprotocol/adcp/blob/main/docs/reference/v2-sunset.mdx) and [FAQ](https://github.com/adcontextprotocol/adcp/blob/main/docs/faq.mdx).
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@adcp/sdk",
|
|
3
|
-
"version": "16.0.0-beta.
|
|
3
|
+
"version": "16.0.0-beta.9",
|
|
4
4
|
"description": "AdCP SDK — client, server, and compliance harnesses for the AdContext Protocol (MCP + A2A)",
|
|
5
5
|
"workspaces": [
|
|
6
6
|
".",
|
|
@@ -81,16 +81,6 @@
|
|
|
81
81
|
"default": "./dist/lib/enums.js"
|
|
82
82
|
}
|
|
83
83
|
},
|
|
84
|
-
"./types/v2-5": {
|
|
85
|
-
"import": {
|
|
86
|
-
"types": "./dist/lib/types/v2-5/index.d.mts",
|
|
87
|
-
"default": "./dist/lib/types/v2-5/index.mjs"
|
|
88
|
-
},
|
|
89
|
-
"require": {
|
|
90
|
-
"types": "./dist/lib/types/v2-5/index.d.ts",
|
|
91
|
-
"default": "./dist/lib/types/v2-5/index.js"
|
|
92
|
-
}
|
|
93
|
-
},
|
|
94
84
|
"./types/*": {
|
|
95
85
|
"types": "./dist/lib/types/*.d.ts"
|
|
96
86
|
},
|
|
@@ -448,9 +438,6 @@
|
|
|
448
438
|
"types": [
|
|
449
439
|
"dist/lib/types/index.d.ts"
|
|
450
440
|
],
|
|
451
|
-
"types/v2-5": [
|
|
452
|
-
"dist/lib/types/v2-5/index.d.ts"
|
|
453
|
-
],
|
|
454
441
|
"wholesale-feed-sync": [
|
|
455
442
|
"dist/lib/wholesale-feed-sync/index.d.ts"
|
|
456
443
|
],
|
|
@@ -652,8 +639,7 @@
|
|
|
652
639
|
"test:protocol-comparison": "node test/utils/comprehensive-protocol-comparison.js",
|
|
653
640
|
"test:status-report": "node test/utils/final-status-report.js",
|
|
654
641
|
"sync-schemas": "tsx scripts/sync-schemas.ts",
|
|
655
|
-
"sync-schemas:
|
|
656
|
-
"sync-schemas:all": "npm run sync-schemas && npm run sync-schemas -- 3.1.29 && npm run sync-schemas -- 3.0.25 && npm run sync-schemas:v2.5",
|
|
642
|
+
"sync-schemas:all": "npm run sync-schemas && npm run sync-schemas -- 3.1.29 && npm run sync-schemas -- 3.0.25",
|
|
657
643
|
"sync:canonical-storyboard-fixtures": "tsx scripts/sync-canonical-storyboard-fixtures.ts --update",
|
|
658
644
|
"check:canonical-storyboard-fixtures": "tsx scripts/sync-canonical-storyboard-fixtures.ts --check",
|
|
659
645
|
"sync-registry-schemas": "tsx scripts/generate-registry-types.ts --sync",
|
|
@@ -662,8 +648,7 @@
|
|
|
662
648
|
"generate-types": "tsx scripts/generate-types.ts && tsx scripts/generate-enum-arrays.ts && tsx scripts/generate-inline-enum-arrays.ts && tsx scripts/generate-manifest-derived.ts && tsx scripts/generate-entity-hydration.ts && tsx scripts/generate-media-buy-update-fields.ts && tsx scripts/generate-media-buy-action-metadata.ts",
|
|
663
649
|
"generate-manifest-derived": "tsx scripts/generate-manifest-derived.ts",
|
|
664
650
|
"generate-entity-hydration": "tsx scripts/generate-entity-hydration.ts",
|
|
665
|
-
"generate-types:
|
|
666
|
-
"generate-types:all": "npm run generate-types && npm run generate-types:v2.5",
|
|
651
|
+
"generate-types:all": "npm run generate-types",
|
|
667
652
|
"generate-registry-types": "tsx scripts/generate-registry-types.ts",
|
|
668
653
|
"generate-enum-arrays": "tsx scripts/generate-enum-arrays.ts",
|
|
669
654
|
"generate-inline-enum-arrays": "tsx scripts/generate-inline-enum-arrays.ts",
|