@adcp/sdk 6.7.0 → 6.9.0
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/ADCP_VERSION +1 -1
- package/bin/adcp.js +15 -3
- package/compliance/cache/{3.0.5 → 3.0.6}/domains/media-buy/scenarios/inventory_list_targeting.yaml +5 -0
- package/compliance/cache/{3.0.5 → 3.0.6}/index.json +2 -2
- package/compliance/cache/{3.0.5 → 3.0.6}/protocols/media-buy/scenarios/inventory_list_targeting.yaml +5 -0
- package/compliance/cache/{3.0.5 → 3.0.6}/specialisms/sales-guaranteed/index.yaml +1 -1
- package/compliance/cache/{3.0.5 → 3.0.6}/universal/storyboard-schema.yaml +15 -0
- package/dist/lib/adapters/derived-account-store.d.ts +152 -0
- package/dist/lib/adapters/derived-account-store.d.ts.map +1 -0
- package/dist/lib/adapters/derived-account-store.js +135 -0
- package/dist/lib/adapters/derived-account-store.js.map +1 -0
- package/dist/lib/adapters/implicit-account-store.d.ts +3 -1
- package/dist/lib/adapters/implicit-account-store.d.ts.map +1 -1
- package/dist/lib/adapters/implicit-account-store.js +3 -1
- package/dist/lib/adapters/implicit-account-store.js.map +1 -1
- package/dist/lib/adapters/index.d.ts +1 -0
- package/dist/lib/adapters/index.d.ts.map +1 -1
- package/dist/lib/adapters/index.js +7 -1
- package/dist/lib/adapters/index.js.map +1 -1
- package/dist/lib/adapters/oauth-passthrough-resolver.d.ts +3 -1
- package/dist/lib/adapters/oauth-passthrough-resolver.d.ts.map +1 -1
- package/dist/lib/adapters/oauth-passthrough-resolver.js +3 -1
- package/dist/lib/adapters/oauth-passthrough-resolver.js.map +1 -1
- package/dist/lib/adapters/roster-account-store.d.ts +85 -24
- package/dist/lib/adapters/roster-account-store.d.ts.map +1 -1
- package/dist/lib/adapters/roster-account-store.js +52 -30
- package/dist/lib/adapters/roster-account-store.js.map +1 -1
- package/dist/lib/core/AgentClient.d.ts.map +1 -1
- package/dist/lib/core/AgentClient.js +20 -0
- package/dist/lib/core/AgentClient.js.map +1 -1
- package/dist/lib/index.d.ts +3 -3
- package/dist/lib/index.d.ts.map +1 -1
- package/dist/lib/index.js +13 -8
- package/dist/lib/index.js.map +1 -1
- package/dist/lib/mock-server/creative-ad-server/seed-data.d.ts +81 -0
- package/dist/lib/mock-server/creative-ad-server/seed-data.d.ts.map +1 -0
- package/dist/lib/mock-server/creative-ad-server/seed-data.js +200 -0
- package/dist/lib/mock-server/creative-ad-server/seed-data.js.map +1 -0
- package/dist/lib/mock-server/creative-ad-server/server.d.ts +39 -0
- package/dist/lib/mock-server/creative-ad-server/server.d.ts.map +1 -0
- package/dist/lib/mock-server/creative-ad-server/server.js +618 -0
- package/dist/lib/mock-server/creative-ad-server/server.js.map +1 -0
- package/dist/lib/mock-server/creative-template/seed-data.d.ts +1 -1
- package/dist/lib/mock-server/creative-template/seed-data.d.ts.map +1 -1
- package/dist/lib/mock-server/creative-template/seed-data.js +53 -0
- package/dist/lib/mock-server/creative-template/seed-data.js.map +1 -1
- package/dist/lib/mock-server/creative-template/server.d.ts.map +1 -1
- package/dist/lib/mock-server/creative-template/server.js +12 -0
- package/dist/lib/mock-server/creative-template/server.js.map +1 -1
- package/dist/lib/mock-server/index.d.ts.map +1 -1
- package/dist/lib/mock-server/index.js +180 -24
- package/dist/lib/mock-server/index.js.map +1 -1
- package/dist/lib/mock-server/sales-non-guaranteed/seed-data.d.ts +66 -0
- package/dist/lib/mock-server/sales-non-guaranteed/seed-data.d.ts.map +1 -0
- package/dist/lib/mock-server/sales-non-guaranteed/seed-data.js +193 -0
- package/dist/lib/mock-server/sales-non-guaranteed/seed-data.js.map +1 -0
- package/dist/lib/mock-server/sales-non-guaranteed/server.d.ts +33 -0
- package/dist/lib/mock-server/sales-non-guaranteed/server.d.ts.map +1 -0
- package/dist/lib/mock-server/sales-non-guaranteed/server.js +782 -0
- package/dist/lib/mock-server/sales-non-guaranteed/server.js.map +1 -0
- package/dist/lib/mock-server/sponsored-intelligence/seed-data.d.ts +50 -0
- package/dist/lib/mock-server/sponsored-intelligence/seed-data.d.ts.map +1 -0
- package/dist/lib/mock-server/sponsored-intelligence/seed-data.js +133 -0
- package/dist/lib/mock-server/sponsored-intelligence/seed-data.js.map +1 -0
- package/dist/lib/mock-server/sponsored-intelligence/server.d.ts +13 -0
- package/dist/lib/mock-server/sponsored-intelligence/server.d.ts.map +1 -0
- package/dist/lib/mock-server/sponsored-intelligence/server.js +609 -0
- package/dist/lib/mock-server/sponsored-intelligence/server.js.map +1 -0
- package/dist/lib/protocols/mcp.d.ts.map +1 -1
- package/dist/lib/protocols/mcp.js +1 -41
- package/dist/lib/protocols/mcp.js.map +1 -1
- package/dist/lib/schemas-data/3.0/a2ui/bound-value.json +1 -1
- package/dist/lib/schemas-data/3.0/a2ui/component.json +1 -1
- package/dist/lib/schemas-data/3.0/a2ui/si-catalog.json +25 -25
- package/dist/lib/schemas-data/3.0/a2ui/surface.json +2 -2
- package/dist/lib/schemas-data/3.0/a2ui/user-action.json +1 -1
- package/dist/lib/schemas-data/3.0/account/get-account-financials-request.json +5 -5
- package/dist/lib/schemas-data/3.0/account/get-account-financials-response.json +10 -10
- package/dist/lib/schemas-data/3.0/account/list-accounts-request.json +4 -4
- package/dist/lib/schemas-data/3.0/account/list-accounts-response.json +6 -6
- package/dist/lib/schemas-data/3.0/account/report-usage-request.json +5 -5
- package/dist/lib/schemas-data/3.0/account/report-usage-response.json +4 -4
- package/dist/lib/schemas-data/3.0/account/sync-accounts-request.json +9 -9
- package/dist/lib/schemas-data/3.0/account/sync-accounts-response.json +12 -12
- package/dist/lib/schemas-data/3.0/account/sync-governance-request.json +5 -5
- package/dist/lib/schemas-data/3.0/account/sync-governance-response.json +8 -8
- package/dist/lib/schemas-data/3.0/adagents.json +32 -32
- package/dist/lib/schemas-data/3.0/brand/acquire-rights-request.json +8 -8
- package/dist/lib/schemas-data/3.0/brand/acquire-rights-response.json +14 -14
- package/dist/lib/schemas-data/3.0/brand/creative-approval-request.json +4 -4
- package/dist/lib/schemas-data/3.0/brand/creative-approval-response.json +10 -10
- package/dist/lib/schemas-data/3.0/brand/get-brand-identity-request.json +3 -3
- package/dist/lib/schemas-data/3.0/brand/get-brand-identity-response.json +8 -8
- package/dist/lib/schemas-data/3.0/brand/get-rights-request.json +7 -7
- package/dist/lib/schemas-data/3.0/brand/get-rights-response.json +9 -9
- package/dist/lib/schemas-data/3.0/brand/revocation-notification.json +4 -4
- package/dist/lib/schemas-data/3.0/brand/rights-pricing-option.json +5 -5
- package/dist/lib/schemas-data/3.0/brand/rights-terms.json +3 -3
- package/dist/lib/schemas-data/3.0/brand/update-rights-request.json +4 -4
- package/dist/lib/schemas-data/3.0/brand/update-rights-response.json +9 -9
- package/dist/lib/schemas-data/3.0/brand.json +14 -14
- package/dist/lib/schemas-data/3.0/bundled/content-standards/calibrate-content-request.json +2 -2
- package/dist/lib/schemas-data/3.0/bundled/content-standards/calibrate-content-response.json +2 -2
- package/dist/lib/schemas-data/3.0/bundled/content-standards/create-content-standards-request.json +2 -2
- package/dist/lib/schemas-data/3.0/bundled/content-standards/create-content-standards-response.json +2 -2
- package/dist/lib/schemas-data/3.0/bundled/content-standards/get-content-standards-request.json +2 -2
- package/dist/lib/schemas-data/3.0/bundled/content-standards/get-content-standards-response.json +2 -2
- package/dist/lib/schemas-data/3.0/bundled/content-standards/get-media-buy-artifacts-request.json +2 -2
- package/dist/lib/schemas-data/3.0/bundled/content-standards/get-media-buy-artifacts-response.json +2 -2
- package/dist/lib/schemas-data/3.0/bundled/content-standards/list-content-standards-request.json +2 -2
- package/dist/lib/schemas-data/3.0/bundled/content-standards/list-content-standards-response.json +2 -2
- package/dist/lib/schemas-data/3.0/bundled/content-standards/update-content-standards-request.json +2 -2
- package/dist/lib/schemas-data/3.0/bundled/content-standards/update-content-standards-response.json +2 -2
- package/dist/lib/schemas-data/3.0/bundled/content-standards/validate-content-delivery-request.json +2 -2
- package/dist/lib/schemas-data/3.0/bundled/content-standards/validate-content-delivery-response.json +2 -2
- package/dist/lib/schemas-data/3.0/bundled/core/tasks-get-request.json +2 -2
- package/dist/lib/schemas-data/3.0/bundled/core/tasks-get-response.json +2 -2
- package/dist/lib/schemas-data/3.0/bundled/core/tasks-list-request.json +2 -2
- package/dist/lib/schemas-data/3.0/bundled/core/tasks-list-response.json +2 -2
- package/dist/lib/schemas-data/3.0/bundled/creative/get-creative-delivery-request.json +2 -2
- package/dist/lib/schemas-data/3.0/bundled/creative/get-creative-delivery-response.json +2 -2
- package/dist/lib/schemas-data/3.0/bundled/creative/get-creative-features-request.json +2 -2
- package/dist/lib/schemas-data/3.0/bundled/creative/get-creative-features-response.json +2 -2
- package/dist/lib/schemas-data/3.0/bundled/creative/list-creative-formats-request.json +2 -2
- package/dist/lib/schemas-data/3.0/bundled/creative/list-creative-formats-response.json +2 -2
- package/dist/lib/schemas-data/3.0/bundled/creative/list-creatives-request.json +2 -2
- package/dist/lib/schemas-data/3.0/bundled/creative/list-creatives-response.json +2 -2
- package/dist/lib/schemas-data/3.0/bundled/creative/preview-creative-request.json +2 -2
- package/dist/lib/schemas-data/3.0/bundled/creative/preview-creative-response.json +2 -2
- package/dist/lib/schemas-data/3.0/bundled/creative/sync-creatives-request.json +2 -2
- package/dist/lib/schemas-data/3.0/bundled/creative/sync-creatives-response.json +2 -2
- package/dist/lib/schemas-data/3.0/bundled/media-buy/build-creative-request.json +2 -2
- package/dist/lib/schemas-data/3.0/bundled/media-buy/build-creative-response.json +2 -2
- package/dist/lib/schemas-data/3.0/bundled/media-buy/create-media-buy-request.json +2 -2
- package/dist/lib/schemas-data/3.0/bundled/media-buy/create-media-buy-response.json +2 -2
- package/dist/lib/schemas-data/3.0/bundled/media-buy/get-media-buy-delivery-request.json +2 -2
- package/dist/lib/schemas-data/3.0/bundled/media-buy/get-media-buy-delivery-response.json +2 -2
- package/dist/lib/schemas-data/3.0/bundled/media-buy/get-media-buys-request.json +2 -2
- package/dist/lib/schemas-data/3.0/bundled/media-buy/get-media-buys-response.json +2 -2
- package/dist/lib/schemas-data/3.0/bundled/media-buy/get-products-request.json +2 -2
- package/dist/lib/schemas-data/3.0/bundled/media-buy/get-products-response.json +2 -2
- package/dist/lib/schemas-data/3.0/bundled/media-buy/list-creative-formats-request.json +2 -2
- package/dist/lib/schemas-data/3.0/bundled/media-buy/list-creative-formats-response.json +2 -2
- package/dist/lib/schemas-data/3.0/bundled/media-buy/log-event-request.json +2 -2
- package/dist/lib/schemas-data/3.0/bundled/media-buy/log-event-response.json +2 -2
- package/dist/lib/schemas-data/3.0/bundled/media-buy/package-request.json +2 -2
- package/dist/lib/schemas-data/3.0/bundled/media-buy/provide-performance-feedback-request.json +2 -2
- package/dist/lib/schemas-data/3.0/bundled/media-buy/provide-performance-feedback-response.json +2 -2
- package/dist/lib/schemas-data/3.0/bundled/media-buy/sync-audiences-request.json +2 -2
- package/dist/lib/schemas-data/3.0/bundled/media-buy/sync-audiences-response.json +2 -2
- package/dist/lib/schemas-data/3.0/bundled/media-buy/sync-catalogs-request.json +2 -2
- package/dist/lib/schemas-data/3.0/bundled/media-buy/sync-catalogs-response.json +2 -2
- package/dist/lib/schemas-data/3.0/bundled/media-buy/sync-event-sources-request.json +2 -2
- package/dist/lib/schemas-data/3.0/bundled/media-buy/sync-event-sources-response.json +2 -2
- package/dist/lib/schemas-data/3.0/bundled/media-buy/update-media-buy-request.json +2 -2
- package/dist/lib/schemas-data/3.0/bundled/media-buy/update-media-buy-response.json +2 -2
- package/dist/lib/schemas-data/3.0/bundled/property/create-property-list-request.json +2 -2
- package/dist/lib/schemas-data/3.0/bundled/property/create-property-list-response.json +2 -2
- package/dist/lib/schemas-data/3.0/bundled/property/delete-property-list-request.json +2 -2
- package/dist/lib/schemas-data/3.0/bundled/property/delete-property-list-response.json +2 -2
- package/dist/lib/schemas-data/3.0/bundled/property/get-property-list-request.json +2 -2
- package/dist/lib/schemas-data/3.0/bundled/property/get-property-list-response.json +2 -2
- package/dist/lib/schemas-data/3.0/bundled/property/list-property-lists-request.json +2 -2
- package/dist/lib/schemas-data/3.0/bundled/property/list-property-lists-response.json +2 -2
- package/dist/lib/schemas-data/3.0/bundled/property/update-property-list-request.json +2 -2
- package/dist/lib/schemas-data/3.0/bundled/property/update-property-list-response.json +2 -2
- package/dist/lib/schemas-data/3.0/bundled/property/validate-property-delivery-request.json +2 -2
- package/dist/lib/schemas-data/3.0/bundled/property/validate-property-delivery-response.json +2 -2
- package/dist/lib/schemas-data/3.0/bundled/protocol/get-adcp-capabilities-request.json +2 -2
- package/dist/lib/schemas-data/3.0/bundled/protocol/get-adcp-capabilities-response.json +2 -2
- package/dist/lib/schemas-data/3.0/bundled/signals/activate-signal-request.json +2 -2
- package/dist/lib/schemas-data/3.0/bundled/signals/activate-signal-response.json +2 -2
- package/dist/lib/schemas-data/3.0/bundled/signals/get-signals-request.json +2 -2
- package/dist/lib/schemas-data/3.0/bundled/signals/get-signals-response.json +2 -2
- package/dist/lib/schemas-data/3.0/bundled/sponsored-intelligence/si-get-offering-request.json +2 -2
- package/dist/lib/schemas-data/3.0/bundled/sponsored-intelligence/si-get-offering-response.json +2 -2
- package/dist/lib/schemas-data/3.0/bundled/sponsored-intelligence/si-initiate-session-request.json +2 -2
- package/dist/lib/schemas-data/3.0/bundled/sponsored-intelligence/si-initiate-session-response.json +2 -2
- package/dist/lib/schemas-data/3.0/bundled/sponsored-intelligence/si-send-message-request.json +2 -2
- package/dist/lib/schemas-data/3.0/bundled/sponsored-intelligence/si-send-message-response.json +2 -2
- package/dist/lib/schemas-data/3.0/bundled/sponsored-intelligence/si-terminate-session-request.json +2 -2
- package/dist/lib/schemas-data/3.0/bundled/sponsored-intelligence/si-terminate-session-response.json +2 -2
- package/dist/lib/schemas-data/3.0/collection/base-collection-source.json +3 -3
- package/dist/lib/schemas-data/3.0/collection/collection-list-changed-webhook.json +2 -2
- package/dist/lib/schemas-data/3.0/collection/collection-list-filters.json +7 -7
- package/dist/lib/schemas-data/3.0/collection/collection-list.json +5 -5
- package/dist/lib/schemas-data/3.0/collection/create-collection-list-request.json +7 -7
- package/dist/lib/schemas-data/3.0/collection/create-collection-list-response.json +4 -4
- package/dist/lib/schemas-data/3.0/collection/delete-collection-list-request.json +4 -4
- package/dist/lib/schemas-data/3.0/collection/delete-collection-list-response.json +3 -3
- package/dist/lib/schemas-data/3.0/collection/get-collection-list-request.json +4 -4
- package/dist/lib/schemas-data/3.0/collection/get-collection-list-response.json +10 -10
- package/dist/lib/schemas-data/3.0/collection/list-collection-lists-request.json +5 -5
- package/dist/lib/schemas-data/3.0/collection/list-collection-lists-response.json +5 -5
- package/dist/lib/schemas-data/3.0/collection/update-collection-list-request.json +7 -7
- package/dist/lib/schemas-data/3.0/collection/update-collection-list-response.json +4 -4
- package/dist/lib/schemas-data/3.0/content-standards/artifact-webhook-payload.json +3 -3
- package/dist/lib/schemas-data/3.0/content-standards/artifact.json +7 -7
- package/dist/lib/schemas-data/3.0/content-standards/calibrate-content-request.json +4 -4
- package/dist/lib/schemas-data/3.0/content-standards/calibrate-content-response.json +8 -8
- package/dist/lib/schemas-data/3.0/content-standards/content-standards.json +7 -7
- package/dist/lib/schemas-data/3.0/content-standards/create-content-standards-request.json +7 -7
- package/dist/lib/schemas-data/3.0/content-standards/create-content-standards-response.json +6 -6
- package/dist/lib/schemas-data/3.0/content-standards/get-content-standards-request.json +3 -3
- package/dist/lib/schemas-data/3.0/content-standards/get-content-standards-response.json +7 -7
- package/dist/lib/schemas-data/3.0/content-standards/get-media-buy-artifacts-request.json +4 -4
- package/dist/lib/schemas-data/3.0/content-standards/get-media-buy-artifacts-response.json +8 -8
- package/dist/lib/schemas-data/3.0/content-standards/list-content-standards-request.json +5 -5
- package/dist/lib/schemas-data/3.0/content-standards/list-content-standards-response.json +8 -8
- package/dist/lib/schemas-data/3.0/content-standards/update-content-standards-request.json +7 -7
- package/dist/lib/schemas-data/3.0/content-standards/update-content-standards-response.json +6 -6
- package/dist/lib/schemas-data/3.0/content-standards/validate-content-delivery-request.json +4 -4
- package/dist/lib/schemas-data/3.0/content-standards/validate-content-delivery-response.json +8 -8
- package/dist/lib/schemas-data/3.0/core/account-ref.json +2 -2
- package/dist/lib/schemas-data/3.0/core/account.json +9 -9
- package/dist/lib/schemas-data/3.0/core/activation-key.json +1 -1
- package/dist/lib/schemas-data/3.0/core/ad-inventory-config.json +1 -1
- package/dist/lib/schemas-data/3.0/core/agent-encryption-key.json +1 -1
- package/dist/lib/schemas-data/3.0/core/agent-signing-key.json +1 -1
- package/dist/lib/schemas-data/3.0/core/app-item.json +4 -4
- package/dist/lib/schemas-data/3.0/core/assets/asset-union.json +15 -15
- package/dist/lib/schemas-data/3.0/core/assets/audio-asset.json +3 -3
- package/dist/lib/schemas-data/3.0/core/assets/brief-asset.json +2 -2
- package/dist/lib/schemas-data/3.0/core/assets/catalog-asset.json +2 -2
- package/dist/lib/schemas-data/3.0/core/assets/css-asset.json +2 -2
- package/dist/lib/schemas-data/3.0/core/assets/daast-asset.json +4 -4
- package/dist/lib/schemas-data/3.0/core/assets/html-asset.json +2 -2
- package/dist/lib/schemas-data/3.0/core/assets/image-asset.json +2 -2
- package/dist/lib/schemas-data/3.0/core/assets/javascript-asset.json +3 -3
- package/dist/lib/schemas-data/3.0/core/assets/markdown-asset.json +2 -2
- package/dist/lib/schemas-data/3.0/core/assets/text-asset.json +2 -2
- package/dist/lib/schemas-data/3.0/core/assets/url-asset.json +3 -3
- package/dist/lib/schemas-data/3.0/core/assets/vast-asset.json +4 -4
- package/dist/lib/schemas-data/3.0/core/assets/video-asset.json +7 -7
- package/dist/lib/schemas-data/3.0/core/assets/webhook-asset.json +7 -7
- package/dist/lib/schemas-data/3.0/core/async-response-data.json +25 -25
- package/dist/lib/schemas-data/3.0/core/attribution-window.json +4 -4
- package/dist/lib/schemas-data/3.0/core/audience-member.json +3 -3
- package/dist/lib/schemas-data/3.0/core/audience-selector.json +4 -4
- package/dist/lib/schemas-data/3.0/core/brand-id.json +1 -1
- package/dist/lib/schemas-data/3.0/core/brand-ref.json +2 -2
- package/dist/lib/schemas-data/3.0/core/business-entity.json +2 -2
- package/dist/lib/schemas-data/3.0/core/cancellation-policy.json +2 -2
- package/dist/lib/schemas-data/3.0/core/catalog-field-mapping.json +2 -2
- package/dist/lib/schemas-data/3.0/core/catalog.json +7 -7
- package/dist/lib/schemas-data/3.0/core/catchment.json +5 -5
- package/dist/lib/schemas-data/3.0/core/collection-distribution.json +2 -2
- package/dist/lib/schemas-data/3.0/core/collection-list-ref.json +1 -1
- package/dist/lib/schemas-data/3.0/core/collection-selector.json +1 -1
- package/dist/lib/schemas-data/3.0/core/collection.json +13 -13
- package/dist/lib/schemas-data/3.0/core/content-rating.json +2 -2
- package/dist/lib/schemas-data/3.0/core/context.json +1 -1
- package/dist/lib/schemas-data/3.0/core/creative-asset.json +6 -6
- package/dist/lib/schemas-data/3.0/core/creative-assignment.json +1 -1
- package/dist/lib/schemas-data/3.0/core/creative-brief.json +4 -4
- package/dist/lib/schemas-data/3.0/core/creative-consumption.json +1 -1
- package/dist/lib/schemas-data/3.0/core/creative-filters.json +4 -4
- package/dist/lib/schemas-data/3.0/core/creative-item.json +1 -1
- package/dist/lib/schemas-data/3.0/core/creative-manifest.json +7 -7
- package/dist/lib/schemas-data/3.0/core/creative-policy.json +3 -3
- package/dist/lib/schemas-data/3.0/core/creative-variable.json +1 -1
- package/dist/lib/schemas-data/3.0/core/creative-variant.json +5 -5
- package/dist/lib/schemas-data/3.0/core/data-provider-signal-selector.json +1 -1
- package/dist/lib/schemas-data/3.0/core/date-range.json +1 -1
- package/dist/lib/schemas-data/3.0/core/datetime-range.json +1 -1
- package/dist/lib/schemas-data/3.0/core/daypart-target.json +2 -2
- package/dist/lib/schemas-data/3.0/core/deadline-policy.json +1 -1
- package/dist/lib/schemas-data/3.0/core/delivery-forecast.json +7 -7
- package/dist/lib/schemas-data/3.0/core/delivery-metrics.json +5 -5
- package/dist/lib/schemas-data/3.0/core/deployment.json +3 -3
- package/dist/lib/schemas-data/3.0/core/destination-item.json +4 -4
- package/dist/lib/schemas-data/3.0/core/destination.json +1 -1
- package/dist/lib/schemas-data/3.0/core/diagnostic-issue.json +1 -1
- package/dist/lib/schemas-data/3.0/core/duration.json +1 -1
- package/dist/lib/schemas-data/3.0/core/education-item.json +4 -4
- package/dist/lib/schemas-data/3.0/core/error.json +1 -1
- package/dist/lib/schemas-data/3.0/core/event-custom-data.json +2 -2
- package/dist/lib/schemas-data/3.0/core/event-source-health.json +3 -3
- package/dist/lib/schemas-data/3.0/core/event.json +6 -6
- package/dist/lib/schemas-data/3.0/core/ext.json +1 -1
- package/dist/lib/schemas-data/3.0/core/feature-requirement.json +1 -1
- package/dist/lib/schemas-data/3.0/core/flight-item.json +4 -4
- package/dist/lib/schemas-data/3.0/core/forecast-point.json +18 -18
- package/dist/lib/schemas-data/3.0/core/forecast-range.json +1 -1
- package/dist/lib/schemas-data/3.0/core/format-id.json +1 -1
- package/dist/lib/schemas-data/3.0/core/format.json +42 -42
- package/dist/lib/schemas-data/3.0/core/frequency-cap.json +4 -4
- package/dist/lib/schemas-data/3.0/core/generation-credential.json +3 -3
- package/dist/lib/schemas-data/3.0/core/geo-breakdown-support.json +3 -3
- package/dist/lib/schemas-data/3.0/core/hotel-item.json +4 -4
- package/dist/lib/schemas-data/3.0/core/identifier.json +2 -2
- package/dist/lib/schemas-data/3.0/core/industry-identifier.json +2 -2
- package/dist/lib/schemas-data/3.0/core/insertion-order.json +1 -1
- package/dist/lib/schemas-data/3.0/core/installment-deadlines.json +2 -2
- package/dist/lib/schemas-data/3.0/core/installment.json +9 -9
- package/dist/lib/schemas-data/3.0/core/job-item.json +3 -3
- package/dist/lib/schemas-data/3.0/core/limited-series.json +1 -1
- package/dist/lib/schemas-data/3.0/core/material-deadline.json +1 -1
- package/dist/lib/schemas-data/3.0/core/mcp-webhook-payload.json +5 -5
- package/dist/lib/schemas-data/3.0/core/measurement-readiness.json +5 -5
- package/dist/lib/schemas-data/3.0/core/measurement-terms.json +3 -3
- package/dist/lib/schemas-data/3.0/core/measurement-window.json +1 -1
- package/dist/lib/schemas-data/3.0/core/media-buy-features.json +1 -1
- package/dist/lib/schemas-data/3.0/core/media-buy.json +7 -7
- package/dist/lib/schemas-data/3.0/core/offering-asset-group.json +15 -15
- package/dist/lib/schemas-data/3.0/core/offering.json +5 -5
- package/dist/lib/schemas-data/3.0/core/optimization-goal.json +6 -6
- package/dist/lib/schemas-data/3.0/core/outcome-measurement.json +2 -2
- package/dist/lib/schemas-data/3.0/core/overlay.json +1 -1
- package/dist/lib/schemas-data/3.0/core/package.json +14 -14
- package/dist/lib/schemas-data/3.0/core/pagination-request.json +1 -1
- package/dist/lib/schemas-data/3.0/core/pagination-response.json +1 -1
- package/dist/lib/schemas-data/3.0/core/performance-feedback.json +3 -3
- package/dist/lib/schemas-data/3.0/core/performance-standard.json +4 -4
- package/dist/lib/schemas-data/3.0/core/placement-definition.json +5 -5
- package/dist/lib/schemas-data/3.0/core/placement.json +2 -2
- package/dist/lib/schemas-data/3.0/core/planned-delivery.json +5 -5
- package/dist/lib/schemas-data/3.0/core/price.json +1 -1
- package/dist/lib/schemas-data/3.0/core/pricing-option.json +10 -10
- package/dist/lib/schemas-data/3.0/core/product-allocation.json +4 -4
- package/dist/lib/schemas-data/3.0/core/product-filters.json +16 -16
- package/dist/lib/schemas-data/3.0/core/product.json +28 -28
- package/dist/lib/schemas-data/3.0/core/property-id.json +1 -1
- package/dist/lib/schemas-data/3.0/core/property-list-ref.json +1 -1
- package/dist/lib/schemas-data/3.0/core/property-tag.json +1 -1
- package/dist/lib/schemas-data/3.0/core/property.json +6 -6
- package/dist/lib/schemas-data/3.0/core/proposal.json +6 -6
- package/dist/lib/schemas-data/3.0/core/protocol-envelope.json +3 -3
- package/dist/lib/schemas-data/3.0/core/provenance.json +6 -6
- package/dist/lib/schemas-data/3.0/core/publisher-property-selector.json +3 -3
- package/dist/lib/schemas-data/3.0/core/push-notification-config.json +2 -2
- package/dist/lib/schemas-data/3.0/core/real-estate-item.json +4 -4
- package/dist/lib/schemas-data/3.0/core/reference-asset.json +1 -1
- package/dist/lib/schemas-data/3.0/core/reporting-capabilities.json +5 -5
- package/dist/lib/schemas-data/3.0/core/reporting-webhook.json +3 -3
- package/dist/lib/schemas-data/3.0/core/requirements/asset-requirements.json +13 -13
- package/dist/lib/schemas-data/3.0/core/requirements/audio-asset-requirements.json +1 -1
- package/dist/lib/schemas-data/3.0/core/requirements/catalog-field-binding.json +4 -4
- package/dist/lib/schemas-data/3.0/core/requirements/catalog-requirements.json +5 -5
- package/dist/lib/schemas-data/3.0/core/requirements/css-asset-requirements.json +1 -1
- package/dist/lib/schemas-data/3.0/core/requirements/daast-asset-requirements.json +1 -1
- package/dist/lib/schemas-data/3.0/core/requirements/html-asset-requirements.json +1 -1
- package/dist/lib/schemas-data/3.0/core/requirements/image-asset-requirements.json +2 -2
- package/dist/lib/schemas-data/3.0/core/requirements/javascript-asset-requirements.json +1 -1
- package/dist/lib/schemas-data/3.0/core/requirements/markdown-asset-requirements.json +1 -1
- package/dist/lib/schemas-data/3.0/core/requirements/offering-asset-constraint.json +4 -4
- package/dist/lib/schemas-data/3.0/core/requirements/text-asset-requirements.json +1 -1
- package/dist/lib/schemas-data/3.0/core/requirements/url-asset-requirements.json +1 -1
- package/dist/lib/schemas-data/3.0/core/requirements/vast-asset-requirements.json +1 -1
- package/dist/lib/schemas-data/3.0/core/requirements/video-asset-requirements.json +6 -6
- package/dist/lib/schemas-data/3.0/core/requirements/webhook-asset-requirements.json +1 -1
- package/dist/lib/schemas-data/3.0/core/response.json +1 -1
- package/dist/lib/schemas-data/3.0/core/rights-constraint.json +4 -4
- package/dist/lib/schemas-data/3.0/core/seller-agent-ref.json +1 -1
- package/dist/lib/schemas-data/3.0/core/signal-definition.json +3 -3
- package/dist/lib/schemas-data/3.0/core/signal-filters.json +2 -2
- package/dist/lib/schemas-data/3.0/core/signal-id.json +1 -1
- package/dist/lib/schemas-data/3.0/core/signal-pricing-option.json +2 -2
- package/dist/lib/schemas-data/3.0/core/signal-pricing.json +6 -6
- package/dist/lib/schemas-data/3.0/core/signal-targeting.json +4 -4
- package/dist/lib/schemas-data/3.0/core/special.json +2 -2
- package/dist/lib/schemas-data/3.0/core/start-timing.json +1 -1
- package/dist/lib/schemas-data/3.0/core/store-item.json +3 -3
- package/dist/lib/schemas-data/3.0/core/talent.json +2 -2
- package/dist/lib/schemas-data/3.0/core/targeting.json +20 -20
- package/dist/lib/schemas-data/3.0/core/tasks-get-request.json +3 -3
- package/dist/lib/schemas-data/3.0/core/tasks-get-response.json +7 -7
- package/dist/lib/schemas-data/3.0/core/tasks-list-request.json +11 -11
- package/dist/lib/schemas-data/3.0/core/tasks-list-response.json +6 -6
- package/dist/lib/schemas-data/3.0/core/user-match.json +3 -3
- package/dist/lib/schemas-data/3.0/core/vehicle-item.json +4 -4
- package/dist/lib/schemas-data/3.0/core/vendor-pricing-option.json +2 -2
- package/dist/lib/schemas-data/3.0/core/x-entity-types.json +1 -1
- package/dist/lib/schemas-data/3.0/creative/asset-types/index.json +5 -5
- package/dist/lib/schemas-data/3.0/creative/creative-feature-result.json +2 -2
- package/dist/lib/schemas-data/3.0/creative/get-creative-delivery-request.json +5 -5
- package/dist/lib/schemas-data/3.0/creative/get-creative-delivery-response.json +7 -7
- package/dist/lib/schemas-data/3.0/creative/get-creative-features-request.json +5 -5
- package/dist/lib/schemas-data/3.0/creative/get-creative-features-response.json +8 -8
- package/dist/lib/schemas-data/3.0/creative/list-creative-formats-request.json +11 -11
- package/dist/lib/schemas-data/3.0/creative/list-creative-formats-response.json +7 -7
- package/dist/lib/schemas-data/3.0/creative/list-creatives-request.json +8 -8
- package/dist/lib/schemas-data/3.0/creative/list-creatives-response.json +14 -14
- package/dist/lib/schemas-data/3.0/creative/preview-creative-request.json +11 -11
- package/dist/lib/schemas-data/3.0/creative/preview-creative-response.json +12 -12
- package/dist/lib/schemas-data/3.0/creative/preview-render.json +1 -1
- package/dist/lib/schemas-data/3.0/creative/sync-creatives-async-response-input-required.json +3 -3
- package/dist/lib/schemas-data/3.0/creative/sync-creatives-async-response-submitted.json +3 -3
- package/dist/lib/schemas-data/3.0/creative/sync-creatives-async-response-working.json +3 -3
- package/dist/lib/schemas-data/3.0/creative/sync-creatives-request.json +7 -7
- package/dist/lib/schemas-data/3.0/creative/sync-creatives-response.json +13 -13
- package/dist/lib/schemas-data/3.0/enums/account-scope.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/account-status.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/action-source.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/adcp-protocol.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/adjustment-kind.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/advertiser-industry.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/age-verification-method.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/assessment-status.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/asset-content-type.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/attribution-model.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/audience-source.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/audience-status.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/audio-channel-layout.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/auth-scheme.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/available-metric.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/billing-party.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/binary-verdict.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/brand-agent-type.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/canceled-by.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/catalog-action.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/catalog-item-status.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/catalog-type.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/channels.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/cloud-storage-protocol.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/co-branding-requirement.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/collection-cadence.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/collection-kind.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/collection-relationship.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/collection-status.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/consent-basis.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/content-id-type.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/content-rating-system.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/creative-action.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/creative-agent-capability.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/creative-approval-status.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/creative-identifier-type.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/creative-quality.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/creative-sort-field.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/creative-status.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/daast-tracking-event.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/daast-version.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/day-of-week.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/delegation-authority.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/delivery-type.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/demographic-system.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/derivative-type.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/device-platform.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/device-type.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/digital-source-type.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/dimension-unit.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/disclosure-persistence.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/disclosure-position.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/distance-unit.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/distribution-identifier-type.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/error-code.json +3 -3
- package/dist/lib/schemas-data/3.0/enums/escalation-severity.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/event-type.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/exclusivity.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/feature-check-status.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/feed-format.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/feedback-source.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/forecast-method.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/forecast-range-unit.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/forecastable-metric.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/format-id-parameter.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/frame-rate-type.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/frequency-cap-scope.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/genre-taxonomy.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/geo-level.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/gop-type.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/governance-decision.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/governance-domain.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/governance-mode.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/governance-phase.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/history-entry-type.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/http-method.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/identifier-types.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/installment-status.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/javascript-module-type.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/landing-page-requirement.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/makegood-remedy.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/markdown-flavor.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/match-id-type.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/match-type.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/media-buy-status.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/media-buy-valid-action.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/metric-type.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/metro-system.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/moov-atom-position.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/notification-type.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/outcome-type.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/pacing.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/payment-terms.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/performance-standard-metric.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/policy-category.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/policy-enforcement.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/postal-system.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/preview-output-format.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/pricing-model.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/production-quality.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/property-type.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/proposal-status.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/publisher-identifier-types.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/purchase-type.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/reach-unit.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/reporting-frequency.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/response-type.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/restricted-attribute.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/right-type.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/right-use.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/rights-billing-period.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/scan-type.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/si-session-status.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/signal-catalog-type.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/signal-source.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/signal-value-type.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/snapshot-unavailable-reason.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/sort-direction.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/sort-metric.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/special-category.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/specialism.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/talent-role.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/task-status.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/task-type.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/transport-mode.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/travel-time-unit.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/uid-type.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/universal-macro.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/update-frequency.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/url-asset-type.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/validation-mode.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/vast-tracking-event.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/vast-version.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/viewability-standard.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/wcag-level.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/webhook-response-type.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/webhook-security-method.json +1 -1
- package/dist/lib/schemas-data/3.0/error-details/account-setup-required.json +1 -1
- package/dist/lib/schemas-data/3.0/error-details/audience-too-small.json +1 -1
- package/dist/lib/schemas-data/3.0/error-details/budget-too-low.json +1 -1
- package/dist/lib/schemas-data/3.0/error-details/conflict.json +1 -1
- package/dist/lib/schemas-data/3.0/error-details/creative-rejected.json +1 -1
- package/dist/lib/schemas-data/3.0/error-details/policy-violation.json +1 -1
- package/dist/lib/schemas-data/3.0/error-details/rate-limited.json +1 -1
- package/dist/lib/schemas-data/3.0/error-details/vendor-error-codes.json +1 -1
- package/dist/lib/schemas-data/3.0/extensions/extension-meta.json +1 -1
- package/dist/lib/schemas-data/3.0/extensions/index.json +2 -2
- package/dist/lib/schemas-data/3.0/governance/attribute-definition.json +1 -1
- package/dist/lib/schemas-data/3.0/governance/audience-constraints.json +3 -3
- package/dist/lib/schemas-data/3.0/governance/check-governance-request.json +7 -7
- package/dist/lib/schemas-data/3.0/governance/check-governance-response.json +6 -6
- package/dist/lib/schemas-data/3.0/governance/get-plan-audit-logs-request.json +4 -4
- package/dist/lib/schemas-data/3.0/governance/get-plan-audit-logs-response.json +9 -9
- package/dist/lib/schemas-data/3.0/governance/policy-category-definition.json +2 -2
- package/dist/lib/schemas-data/3.0/governance/policy-entry.json +6 -6
- package/dist/lib/schemas-data/3.0/governance/policy-ref.json +1 -1
- package/dist/lib/schemas-data/3.0/governance/report-plan-outcome-request.json +6 -6
- package/dist/lib/schemas-data/3.0/governance/report-plan-outcome-response.json +4 -4
- package/dist/lib/schemas-data/3.0/governance/sync-plans-request.json +13 -13
- package/dist/lib/schemas-data/3.0/governance/sync-plans-response.json +4 -4
- package/dist/lib/schemas-data/3.0/index.json +364 -364
- package/dist/lib/schemas-data/3.0/manifest.json +5 -5
- package/dist/lib/schemas-data/3.0/manifest.schema.json +1 -1
- package/dist/lib/schemas-data/3.0/media-buy/build-creative-async-response-input-required.json +4 -4
- package/dist/lib/schemas-data/3.0/media-buy/build-creative-async-response-submitted.json +3 -3
- package/dist/lib/schemas-data/3.0/media-buy/build-creative-async-response-working.json +3 -3
- package/dist/lib/schemas-data/3.0/media-buy/build-creative-request.json +11 -11
- package/dist/lib/schemas-data/3.0/media-buy/build-creative-response.json +17 -17
- package/dist/lib/schemas-data/3.0/media-buy/create-media-buy-async-response-input-required.json +4 -4
- package/dist/lib/schemas-data/3.0/media-buy/create-media-buy-async-response-submitted.json +3 -3
- package/dist/lib/schemas-data/3.0/media-buy/create-media-buy-async-response-working.json +3 -3
- package/dist/lib/schemas-data/3.0/media-buy/create-media-buy-request.json +12 -12
- package/dist/lib/schemas-data/3.0/media-buy/create-media-buy-response.json +15 -15
- package/dist/lib/schemas-data/3.0/media-buy/get-media-buy-delivery-request.json +17 -17
- package/dist/lib/schemas-data/3.0/media-buy/get-media-buy-delivery-response.json +24 -24
- package/dist/lib/schemas-data/3.0/media-buy/get-media-buys-request.json +7 -7
- package/dist/lib/schemas-data/3.0/media-buy/get-media-buys-response.json +19 -19
- package/dist/lib/schemas-data/3.0/media-buy/get-products-async-response-input-required.json +4 -4
- package/dist/lib/schemas-data/3.0/media-buy/get-products-async-response-submitted.json +3 -3
- package/dist/lib/schemas-data/3.0/media-buy/get-products-async-response-working.json +3 -3
- package/dist/lib/schemas-data/3.0/media-buy/get-products-request.json +11 -11
- package/dist/lib/schemas-data/3.0/media-buy/get-products-response.json +8 -8
- package/dist/lib/schemas-data/3.0/media-buy/list-creative-formats-request.json +11 -11
- package/dist/lib/schemas-data/3.0/media-buy/list-creative-formats-response.json +7 -7
- package/dist/lib/schemas-data/3.0/media-buy/log-event-request.json +4 -4
- package/dist/lib/schemas-data/3.0/media-buy/log-event-response.json +6 -6
- package/dist/lib/schemas-data/3.0/media-buy/package-request.json +12 -12
- package/dist/lib/schemas-data/3.0/media-buy/package-update.json +13 -13
- package/dist/lib/schemas-data/3.0/media-buy/provide-performance-feedback-request.json +6 -6
- package/dist/lib/schemas-data/3.0/media-buy/provide-performance-feedback-response.json +6 -6
- package/dist/lib/schemas-data/3.0/media-buy/sync-audiences-request.json +7 -7
- package/dist/lib/schemas-data/3.0/media-buy/sync-audiences-response.json +9 -9
- package/dist/lib/schemas-data/3.0/media-buy/sync-catalogs-async-response-input-required.json +3 -3
- package/dist/lib/schemas-data/3.0/media-buy/sync-catalogs-async-response-submitted.json +3 -3
- package/dist/lib/schemas-data/3.0/media-buy/sync-catalogs-async-response-working.json +3 -3
- package/dist/lib/schemas-data/3.0/media-buy/sync-catalogs-request.json +7 -7
- package/dist/lib/schemas-data/3.0/media-buy/sync-catalogs-response.json +9 -9
- package/dist/lib/schemas-data/3.0/media-buy/sync-event-sources-request.json +5 -5
- package/dist/lib/schemas-data/3.0/media-buy/sync-event-sources-response.json +10 -10
- package/dist/lib/schemas-data/3.0/media-buy/update-media-buy-async-response-input-required.json +3 -3
- package/dist/lib/schemas-data/3.0/media-buy/update-media-buy-async-response-submitted.json +3 -3
- package/dist/lib/schemas-data/3.0/media-buy/update-media-buy-async-response-working.json +3 -3
- package/dist/lib/schemas-data/3.0/media-buy/update-media-buy-request.json +10 -10
- package/dist/lib/schemas-data/3.0/media-buy/update-media-buy-response.json +10 -10
- package/dist/lib/schemas-data/3.0/pricing-options/cpa-option.json +4 -4
- package/dist/lib/schemas-data/3.0/pricing-options/cpc-option.json +4 -4
- package/dist/lib/schemas-data/3.0/pricing-options/cpcv-option.json +4 -4
- package/dist/lib/schemas-data/3.0/pricing-options/cpm-option.json +4 -4
- package/dist/lib/schemas-data/3.0/pricing-options/cpp-option.json +5 -5
- package/dist/lib/schemas-data/3.0/pricing-options/cpv-option.json +4 -4
- package/dist/lib/schemas-data/3.0/pricing-options/flat-rate-option.json +4 -4
- package/dist/lib/schemas-data/3.0/pricing-options/price-breakdown.json +2 -2
- package/dist/lib/schemas-data/3.0/pricing-options/price-guidance.json +1 -1
- package/dist/lib/schemas-data/3.0/pricing-options/time-option.json +4 -4
- package/dist/lib/schemas-data/3.0/pricing-options/vcpm-option.json +4 -4
- package/dist/lib/schemas-data/3.0/property/authorization-result.json +1 -1
- package/dist/lib/schemas-data/3.0/property/base-property-source.json +4 -4
- package/dist/lib/schemas-data/3.0/property/create-property-list-request.json +7 -7
- package/dist/lib/schemas-data/3.0/property/create-property-list-response.json +4 -4
- package/dist/lib/schemas-data/3.0/property/delete-property-list-request.json +4 -4
- package/dist/lib/schemas-data/3.0/property/delete-property-list-response.json +3 -3
- package/dist/lib/schemas-data/3.0/property/delivery-record.json +3 -3
- package/dist/lib/schemas-data/3.0/property/get-property-list-request.json +4 -4
- package/dist/lib/schemas-data/3.0/property/get-property-list-response.json +7 -7
- package/dist/lib/schemas-data/3.0/property/list-property-lists-request.json +5 -5
- package/dist/lib/schemas-data/3.0/property/list-property-lists-response.json +5 -5
- package/dist/lib/schemas-data/3.0/property/property-error.json +2 -2
- package/dist/lib/schemas-data/3.0/property/property-feature-definition.json +2 -2
- package/dist/lib/schemas-data/3.0/property/property-feature-result.json +4 -4
- package/dist/lib/schemas-data/3.0/property/property-feature-value.json +2 -2
- package/dist/lib/schemas-data/3.0/property/property-feature.json +1 -1
- package/dist/lib/schemas-data/3.0/property/property-list-changed-webhook.json +2 -2
- package/dist/lib/schemas-data/3.0/property/property-list-filters.json +5 -5
- package/dist/lib/schemas-data/3.0/property/property-list.json +6 -6
- package/dist/lib/schemas-data/3.0/property/update-property-list-request.json +7 -7
- package/dist/lib/schemas-data/3.0/property/update-property-list-response.json +4 -4
- package/dist/lib/schemas-data/3.0/property/validate-property-delivery-request.json +5 -5
- package/dist/lib/schemas-data/3.0/property/validate-property-delivery-response.json +4 -4
- package/dist/lib/schemas-data/3.0/property/validation-result.json +5 -5
- package/dist/lib/schemas-data/3.0/protocol/get-adcp-capabilities-request.json +3 -3
- package/dist/lib/schemas-data/3.0/protocol/get-adcp-capabilities-response.json +25 -25
- package/dist/lib/schemas-data/3.0/signals/activate-signal-request.json +5 -5
- package/dist/lib/schemas-data/3.0/signals/activate-signal-response.json +7 -7
- package/dist/lib/schemas-data/3.0/signals/get-signals-request.json +8 -8
- package/dist/lib/schemas-data/3.0/signals/get-signals-response.json +10 -10
- package/dist/lib/schemas-data/3.0/sponsored-intelligence/si-capabilities.json +1 -1
- package/dist/lib/schemas-data/3.0/sponsored-intelligence/si-get-offering-request.json +3 -3
- package/dist/lib/schemas-data/3.0/sponsored-intelligence/si-get-offering-response.json +4 -4
- package/dist/lib/schemas-data/3.0/sponsored-intelligence/si-identity.json +1 -1
- package/dist/lib/schemas-data/3.0/sponsored-intelligence/si-initiate-session-request.json +5 -5
- package/dist/lib/schemas-data/3.0/sponsored-intelligence/si-initiate-session-response.json +7 -7
- package/dist/lib/schemas-data/3.0/sponsored-intelligence/si-send-message-request.json +3 -3
- package/dist/lib/schemas-data/3.0/sponsored-intelligence/si-send-message-response.json +7 -7
- package/dist/lib/schemas-data/3.0/sponsored-intelligence/si-terminate-session-request.json +3 -3
- package/dist/lib/schemas-data/3.0/sponsored-intelligence/si-terminate-session-response.json +5 -5
- package/dist/lib/schemas-data/3.0/sponsored-intelligence/si-ui-element.json +1 -1
- package/dist/lib/schemas-data/v2.5/_provenance.json +1 -1
- package/dist/lib/server/account-mode.d.ts +113 -0
- package/dist/lib/server/account-mode.d.ts.map +1 -0
- package/dist/lib/server/account-mode.js +125 -0
- package/dist/lib/server/account-mode.js.map +1 -0
- package/dist/lib/server/adcp-server.js +41 -0
- package/dist/lib/server/adcp-server.js.map +1 -1
- package/dist/lib/server/auth.d.ts +35 -0
- package/dist/lib/server/auth.d.ts.map +1 -1
- package/dist/lib/server/auth.js.map +1 -1
- package/dist/lib/server/create-adcp-server.d.ts +26 -9
- package/dist/lib/server/create-adcp-server.d.ts.map +1 -1
- package/dist/lib/server/create-adcp-server.js +46 -20
- package/dist/lib/server/create-adcp-server.js.map +1 -1
- package/dist/lib/server/ctx-metadata/store.d.ts +1 -1
- package/dist/lib/server/ctx-metadata/store.d.ts.map +1 -1
- package/dist/lib/server/ctx-metadata/store.js +1 -0
- package/dist/lib/server/ctx-metadata/store.js.map +1 -1
- package/dist/lib/server/decisioning/account.d.ts +19 -0
- package/dist/lib/server/decisioning/account.d.ts.map +1 -1
- package/dist/lib/server/decisioning/account.js.map +1 -1
- package/dist/lib/server/decisioning/buyer-agent.d.ts +37 -4
- package/dist/lib/server/decisioning/buyer-agent.d.ts.map +1 -1
- package/dist/lib/server/decisioning/buyer-agent.js +12 -2
- package/dist/lib/server/decisioning/buyer-agent.js.map +1 -1
- package/dist/lib/server/decisioning/compose.d.ts +33 -2
- package/dist/lib/server/decisioning/compose.d.ts.map +1 -1
- package/dist/lib/server/decisioning/compose.js +13 -46
- package/dist/lib/server/decisioning/compose.js.map +1 -1
- package/dist/lib/server/decisioning/index.d.ts +2 -1
- package/dist/lib/server/decisioning/index.d.ts.map +1 -1
- package/dist/lib/server/decisioning/index.js +2 -1
- package/dist/lib/server/decisioning/index.js.map +1 -1
- package/dist/lib/server/decisioning/platform-helpers.d.ts +18 -0
- package/dist/lib/server/decisioning/platform-helpers.d.ts.map +1 -1
- package/dist/lib/server/decisioning/platform-helpers.js +20 -0
- package/dist/lib/server/decisioning/platform-helpers.js.map +1 -1
- package/dist/lib/server/decisioning/platform.d.ts +19 -21
- package/dist/lib/server/decisioning/platform.d.ts.map +1 -1
- package/dist/lib/server/decisioning/platform.js.map +1 -1
- package/dist/lib/server/decisioning/runtime/entity-hydration.generated.js +1 -1
- package/dist/lib/server/decisioning/runtime/from-platform.d.ts.map +1 -1
- package/dist/lib/server/decisioning/runtime/from-platform.js +369 -54
- package/dist/lib/server/decisioning/runtime/from-platform.js.map +1 -1
- package/dist/lib/server/decisioning/runtime/observed-modes.d.ts +40 -0
- package/dist/lib/server/decisioning/runtime/observed-modes.d.ts.map +1 -0
- package/dist/lib/server/decisioning/runtime/observed-modes.js +82 -0
- package/dist/lib/server/decisioning/runtime/observed-modes.js.map +1 -0
- package/dist/lib/server/decisioning/runtime/protocol-for-tool.js +2 -2
- package/dist/lib/server/decisioning/runtime/protocol-for-tool.js.map +1 -1
- package/dist/lib/server/decisioning/runtime/validate-platform.d.ts.map +1 -1
- package/dist/lib/server/decisioning/runtime/validate-platform.js +9 -1
- package/dist/lib/server/decisioning/runtime/validate-platform.js.map +1 -1
- package/dist/lib/server/decisioning/specialisms/sponsored-intelligence.d.ts +125 -0
- package/dist/lib/server/decisioning/specialisms/sponsored-intelligence.d.ts.map +1 -0
- package/dist/lib/server/decisioning/specialisms/sponsored-intelligence.js +52 -0
- package/dist/lib/server/decisioning/specialisms/sponsored-intelligence.js.map +1 -0
- package/dist/lib/server/decisioning/tenant-registry.d.ts +16 -0
- package/dist/lib/server/decisioning/tenant-registry.d.ts.map +1 -1
- package/dist/lib/server/decisioning/tenant-registry.js.map +1 -1
- package/dist/lib/server/index.d.ts +5 -1
- package/dist/lib/server/index.d.ts.map +1 -1
- package/dist/lib/server/index.js +15 -3
- package/dist/lib/server/index.js.map +1 -1
- package/dist/lib/server/serve.js +20 -2
- package/dist/lib/server/serve.js.map +1 -1
- package/dist/lib/server/socket-mode/conformance-client.d.ts +83 -0
- package/dist/lib/server/socket-mode/conformance-client.d.ts.map +1 -0
- package/dist/lib/server/socket-mode/conformance-client.js +117 -0
- package/dist/lib/server/socket-mode/conformance-client.js.map +1 -0
- package/dist/lib/server/socket-mode/index.d.ts +15 -0
- package/dist/lib/server/socket-mode/index.d.ts.map +1 -0
- package/dist/lib/server/socket-mode/index.js +20 -0
- package/dist/lib/server/socket-mode/index.js.map +1 -0
- package/dist/lib/server/socket-mode/ws-transport.d.ts +26 -0
- package/dist/lib/server/socket-mode/ws-transport.d.ts.map +1 -0
- package/dist/lib/server/socket-mode/ws-transport.js +93 -0
- package/dist/lib/server/socket-mode/ws-transport.js.map +1 -0
- package/dist/lib/server/test-controller.d.ts +3 -0
- package/dist/lib/server/test-controller.d.ts.map +1 -1
- package/dist/lib/server/test-controller.js +23 -20
- package/dist/lib/server/test-controller.js.map +1 -1
- package/dist/lib/testing/comply-controller.d.ts +65 -3
- package/dist/lib/testing/comply-controller.d.ts.map +1 -1
- package/dist/lib/testing/comply-controller.js +32 -3
- package/dist/lib/testing/comply-controller.js.map +1 -1
- package/dist/lib/testing/index.d.ts +1 -1
- package/dist/lib/testing/index.d.ts.map +1 -1
- package/dist/lib/testing/index.js.map +1 -1
- package/dist/lib/testing/storyboard/request-builder.d.ts.map +1 -1
- package/dist/lib/testing/storyboard/request-builder.js +63 -40
- package/dist/lib/testing/storyboard/request-builder.js.map +1 -1
- package/dist/lib/testing/storyboard/validations.d.ts.map +1 -1
- package/dist/lib/testing/storyboard/validations.js +36 -54
- package/dist/lib/testing/storyboard/validations.js.map +1 -1
- package/dist/lib/testing/test-controller.d.ts +10 -4
- package/dist/lib/testing/test-controller.d.ts.map +1 -1
- package/dist/lib/testing/test-controller.js +9 -3
- package/dist/lib/testing/test-controller.js.map +1 -1
- package/dist/lib/types/core.generated.d.ts +54 -14
- package/dist/lib/types/core.generated.d.ts.map +1 -1
- package/dist/lib/types/core.generated.js +2 -2
- package/dist/lib/types/error-codes.d.ts +2 -2
- package/dist/lib/types/index.d.ts +4 -3
- package/dist/lib/types/index.d.ts.map +1 -1
- package/dist/lib/types/index.js +3 -0
- package/dist/lib/types/index.js.map +1 -1
- package/dist/lib/types/manifest.generated.d.ts +5 -5
- package/dist/lib/types/manifest.generated.js +3 -3
- package/dist/lib/types/manifest.generated.js.map +1 -1
- package/dist/lib/types/schemas.generated.d.ts +465 -381
- package/dist/lib/types/schemas.generated.d.ts.map +1 -1
- package/dist/lib/types/schemas.generated.js +171 -143
- package/dist/lib/types/schemas.generated.js.map +1 -1
- package/dist/lib/types/tools.generated.d.ts +42 -14
- package/dist/lib/types/tools.generated.d.ts.map +1 -1
- package/dist/lib/utils/glob.d.ts +4 -2
- package/dist/lib/utils/glob.d.ts.map +1 -1
- package/dist/lib/utils/glob.js +4 -2
- package/dist/lib/utils/glob.js.map +1 -1
- package/dist/lib/version.d.ts +7 -7
- package/dist/lib/version.d.ts.map +1 -1
- package/dist/lib/version.js +6 -5
- package/dist/lib/version.js.map +1 -1
- package/docs/llms.txt +5 -4
- package/examples/README.md +29 -13
- package/examples/hello-cluster.ts +62 -23
- package/examples/hello_creative_adapter_ad_server.ts +809 -0
- package/examples/hello_creative_adapter_template.ts +61 -6
- package/examples/hello_seller_adapter_guaranteed.ts +158 -25
- package/examples/hello_seller_adapter_multi_tenant.ts +39 -5
- package/examples/hello_seller_adapter_non_guaranteed.ts +1071 -0
- package/examples/hello_seller_adapter_social.ts +1 -1
- package/examples/hello_si_adapter_brand.ts +572 -0
- package/examples/hello_signals_adapter_marketplace.ts +34 -29
- package/package.json +7 -5
- package/skills/SHAPE-GOTCHAS.md +18 -0
- package/skills/build-brand-rights-agent/SKILL.md +61 -597
- package/skills/build-creative-agent/SKILL.md +69 -830
- package/skills/build-generative-seller-agent/SKILL.md +43 -577
- package/skills/build-governance-agent/SKILL.md +63 -950
- package/skills/build-holdco-agent/SKILL.md +8 -0
- package/skills/build-retail-media-agent/SKILL.md +46 -478
- package/skills/build-seller-agent/SKILL.md +53 -1795
- package/skills/build-seller-agent/specialisms/sales-non-guaranteed.md +9 -31
- package/skills/build-si-agent/SKILL.md +55 -318
- package/skills/build-signals-agent/SKILL.md +49 -537
- package/skills/call-adcp-agent/SKILL.md +7 -1
- package/skills/cross-cutting.md +84 -0
- package/skills/call-adcp-agent.previous/SKILL.md +0 -261
- /package/compliance/cache/{3.0.5 → 3.0.6}/domains/brand/index.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/domains/creative/index.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/domains/governance/index.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/domains/media-buy/creative-reception.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/domains/media-buy/index.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/domains/media-buy/scenarios/create_media_buy_async.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/domains/media-buy/scenarios/creative_fate_after_cancellation.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/domains/media-buy/scenarios/delivery_reporting.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/domains/media-buy/scenarios/governance_approved.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/domains/media-buy/scenarios/governance_conditions.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/domains/media-buy/scenarios/governance_denied.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/domains/media-buy/scenarios/governance_denied_recovery.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/domains/media-buy/scenarios/invalid_transitions.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/domains/media-buy/scenarios/inventory_list_no_match.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/domains/media-buy/scenarios/measurement_terms_rejected.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/domains/media-buy/scenarios/pending_creatives_to_start.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/domains/media-buy/scenarios/proposal_finalize.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/domains/media-buy/scenarios/refine_products.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/domains/media-buy/state-machine.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/domains/signals/index.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/domains/sponsored-intelligence/index.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/protocols/brand/index.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/protocols/creative/index.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/protocols/governance/index.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/protocols/media-buy/creative-reception.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/protocols/media-buy/index.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/protocols/media-buy/scenarios/create_media_buy_async.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/protocols/media-buy/scenarios/creative_fate_after_cancellation.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/protocols/media-buy/scenarios/delivery_reporting.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/protocols/media-buy/scenarios/governance_approved.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/protocols/media-buy/scenarios/governance_conditions.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/protocols/media-buy/scenarios/governance_denied.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/protocols/media-buy/scenarios/governance_denied_recovery.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/protocols/media-buy/scenarios/invalid_transitions.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/protocols/media-buy/scenarios/inventory_list_no_match.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/protocols/media-buy/scenarios/measurement_terms_rejected.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/protocols/media-buy/scenarios/pending_creatives_to_start.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/protocols/media-buy/scenarios/proposal_finalize.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/protocols/media-buy/scenarios/refine_products.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/protocols/media-buy/state-machine.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/protocols/signals/index.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/protocols/sponsored-intelligence/index.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/specialisms/audience-sync/index.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/specialisms/brand-rights/index.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/specialisms/brand-rights/scenarios/governance_denied.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/specialisms/collection-lists/index.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/specialisms/content-standards/index.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/specialisms/creative-ad-server/index.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/specialisms/creative-generative/generative-seller.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/specialisms/creative-generative/index.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/specialisms/creative-template/index.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/specialisms/governance-aware-seller/index.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/specialisms/governance-delivery-monitor/index.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/specialisms/governance-spend-authority/denied.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/specialisms/governance-spend-authority/index.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/specialisms/property-lists/index.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/specialisms/sales-broadcast-tv/index.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/specialisms/sales-catalog-driven/index.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/specialisms/sales-non-guaranteed/index.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/specialisms/sales-proposal-mode/index.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/specialisms/sales-social/index.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/specialisms/signal-marketplace/index.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/specialisms/signal-marketplace/scenarios/governance_denied.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/specialisms/signal-owned/index.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-kits/acme-outdoor.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-kits/bistro-oranje.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-kits/nova-motors.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-kits/osei-natural.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-kits/signed-requests-runner.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-kits/substitution-observer-runner.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-kits/summit-foods.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-kits/webhook-receiver-runner.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/plan-hash/001-minimal-plan.json +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/plan-hash/002-full-plan.json +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/plan-hash/003-bookkeeping-stripped.json +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/plan-hash/004a-human-review-omitted.json +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/plan-hash/004b-human-review-explicit-null.json +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/plan-hash/005a-policy-categories-order-1.json +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/plan-hash/005b-policy-categories-order-2.json +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/plan-hash/006a-ext-trace-v1.json +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/plan-hash/006b-ext-trace-v2.json +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/plan-hash/007-unicode-objectives.json +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/plan-hash/008-numeric-canonicalization.json +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/request-signing/README.md +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/request-signing/canonicalization.json +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/request-signing/keys.json +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/request-signing/negative/001-no-signature-header.json +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/request-signing/negative/002-wrong-tag.json +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/request-signing/negative/003-expired-signature.json +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/request-signing/negative/004-window-too-long.json +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/request-signing/negative/005-alg-not-allowed.json +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/request-signing/negative/006-missing-covered-component.json +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/request-signing/negative/007-missing-content-digest.json +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/request-signing/negative/008-unknown-keyid.json +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/request-signing/negative/009-key-ops-missing-verify.json +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/request-signing/negative/010-content-digest-mismatch.json +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/request-signing/negative/011-malformed-header.json +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/request-signing/negative/012-missing-expires-param.json +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/request-signing/negative/013-expires-le-created.json +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/request-signing/negative/014-missing-nonce-param.json +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/request-signing/negative/015-signature-invalid.json +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/request-signing/negative/016-replayed-nonce.json +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/request-signing/negative/017-key-revoked.json +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/request-signing/negative/018-digest-covered-when-forbidden.json +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/request-signing/negative/019-signature-without-signature-input.json +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/request-signing/negative/020-rate-abuse.json +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/request-signing/negative/021-duplicate-signature-input-label.json +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/request-signing/negative/022-multi-valued-content-type.json +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/request-signing/negative/023-multi-valued-content-digest.json +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/request-signing/negative/024-unquoted-string-param.json +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/request-signing/negative/025-jwk-alg-crv-mismatch.json +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/request-signing/negative/026-non-ascii-host.json +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/request-signing/negative/027-webhook-registration-authentication-unsigned.json +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/request-signing/positive/001-basic-post.json +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/request-signing/positive/002-post-with-content-digest.json +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/request-signing/positive/003-es256-post.json +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/request-signing/positive/004-multiple-signature-labels.json +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/request-signing/positive/005-default-port-stripped.json +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/request-signing/positive/006-dot-segment-path.json +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/request-signing/positive/007-query-byte-preserved.json +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/request-signing/positive/008-percent-encoded-path.json +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/request-signing/positive/009-percent-encoded-unreserved-decoded.json +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/request-signing/positive/010-percent-encoded-slash-preserved.json +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/request-signing/positive/011-ipv6-authority.json +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/request-signing/positive/012-ipv6-authority-default-port-stripped.json +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/webhook-signing/README.md +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/webhook-signing/keys.json +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/webhook-signing/negative/001-wrong-tag.json +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/webhook-signing/negative/002-expired-signature.json +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/webhook-signing/negative/003-window-too-long.json +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/webhook-signing/negative/004-alg-not-allowed.json +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/webhook-signing/negative/005-missing-authority-component.json +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/webhook-signing/negative/006-missing-content-digest.json +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/webhook-signing/negative/007-unknown-keyid.json +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/webhook-signing/negative/008-wrong-adcp-use.json +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/webhook-signing/negative/009-content-digest-mismatch.json +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/webhook-signing/negative/010-malformed-signature-input.json +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/webhook-signing/negative/011-signature-without-input.json +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/webhook-signing/negative/012-missing-expires-param.json +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/webhook-signing/negative/013-expires-le-created.json +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/webhook-signing/negative/014-missing-nonce-param.json +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/webhook-signing/negative/015-signature-invalid.json +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/webhook-signing/negative/016-replayed-nonce.json +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/webhook-signing/negative/017-key-revoked.json +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/webhook-signing/negative/018-rate-abuse.json +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/webhook-signing/negative/019-revocation-stale.json +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/webhook-signing/negative/020-key-ops-missing-verify.json +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/webhook-signing/negative/021-base64-alphabet-mixing.json +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/webhook-signing/positive/001-basic-post.json +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/webhook-signing/positive/002-es256-post.json +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/webhook-signing/positive/003-multiple-signature-labels.json +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/webhook-signing/positive/004-default-port-stripped.json +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/webhook-signing/positive/005-percent-encoded-path.json +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/webhook-signing/positive/006-query-byte-preserved.json +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/webhook-signing/positive/007-body-without-idempotency-key.json +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/universal/capability-discovery.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/universal/collection-lists-pagination-integrity.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/universal/content-standards-pagination-integrity.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/universal/deterministic-testing.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/universal/error-compliance.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/universal/fictional-entities.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/universal/get-media-buys-pagination-integrity.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/universal/get-signals-pagination-integrity.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/universal/idempotency.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/universal/pagination-integrity-creative-formats.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/universal/pagination-integrity-list-accounts.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/universal/pagination-integrity.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/universal/property-lists-pagination-integrity.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/universal/runner-output-contract.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/universal/schema-validation.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/universal/security.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/universal/signed-requests.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/universal/v3-envelope-integrity.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/universal/webhook-emission.yaml +0 -0
|
@@ -5,874 +5,113 @@ description: Use when building an AdCP creative agent — an ad server, creative
|
|
|
5
5
|
|
|
6
6
|
# Build a Creative Agent
|
|
7
7
|
|
|
8
|
-
|
|
8
|
+
A creative agent accepts assets from buyers, stores or transforms them, and returns serving artifacts (tags, rendered manifests, previews). The fastest path to a passing agent is to **fork a worked adapter** that matches your archetype. This skill tells you which one and what cross-cutting rules apply.
|
|
9
9
|
|
|
10
|
-
|
|
10
|
+
## Pick your fork target
|
|
11
11
|
|
|
12
|
-
|
|
12
|
+
Three creative archetypes; two have dedicated worked adapters, the third lives in `build-generative-seller-agent` because it's coupled with selling inventory.
|
|
13
13
|
|
|
14
|
-
|
|
14
|
+
| Specialism | Archetype | Fork this | Mock upstream | Storyboard |
|
|
15
|
+
| --- | --- | --- | --- | --- |
|
|
16
|
+
| `creative-ad-server` | Stateful library, pricing + billing (Innovid, Flashtalking, CM360, GAM-creative) | [`hello_creative_adapter_ad_server.ts`](../../examples/hello_creative_adapter_ad_server.ts) | `npx adcp mock-server creative-ad-server` | `creative_ad_server` |
|
|
17
|
+
| `creative-template` | Stateless transform from inline manifest (Celtra, AudioStack, ElevenLabs, Resemble) | [`hello_creative_adapter_template.ts`](../../examples/hello_creative_adapter_template.ts) | `npx adcp mock-server creative-template` | `creative_template` |
|
|
18
|
+
| `creative-generative` | Brief-to-creative generation (AI ad networks coupled with sales) | → `skills/build-generative-seller-agent/` | — | `creative_generative` |
|
|
15
19
|
|
|
16
|
-
|
|
17
|
-
- User mentions `build_creative`, `preview_creative`, `sync_creatives`, or `list_creatives`
|
|
18
|
-
- User references creative formats, VAST tags, serving tags, or creative libraries
|
|
20
|
+
The `interaction_model` in each specialism's `index.yaml` is the forcing function: `stateful_ad_server`, `stateless_transform`, `stateless_generate`. Decide which one matches your business, then fork the adapter for that row.
|
|
19
21
|
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
- Selling inventory + generating creatives → `skills/build-generative-seller-agent/`
|
|
23
|
-
- Selling inventory (no creative management) → `skills/build-seller-agent/`
|
|
24
|
-
- Serving audience segments → `skills/build-signals-agent/`
|
|
25
|
-
|
|
26
|
-
## Specialisms This Skill Covers
|
|
27
|
-
|
|
28
|
-
Creative specialisms are three distinct archetypes with materially different tool contracts. Pick the one that matches your platform — do not try to make one handler cover all three.
|
|
29
|
-
|
|
30
|
-
| Specialism | Archetype | `build_creative` behavior | `sync_creatives` behavior | See |
|
|
31
|
-
| --------------------- | ----------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------- | -------------------------------------------------------- |
|
|
32
|
-
| `creative-ad-server` | Stateful library, pricing + billing | Look up in library by `target_format_id`; return VAST/tag output with macro placeholders; price the output (`pricing_option_id`, `vendor_cost`) | Accept assets into the library; support `include_pricing=true` on `list_creatives` | [§ creative-ad-server](#specialism-creative-ad-server) |
|
|
33
|
-
| `creative-template` | Stateless transform | Build from inline `creative_manifest` in the request; no `ctx.store` lookup; support `target_format_ids` (plural) for multi-format | Not used — agents in this specialism are stateless | [§ creative-template](#specialism-creative-template) |
|
|
34
|
-
| `creative-generative` | Brief-to-creative generation | Generate assets from `message` + `brand.domain`; honor `quality: draft\|production`; support refinement (re-send manifest in) | Not used — output is ephemeral; buyer syncs to the seller separately | [§ creative-generative](#specialism-creative-generative) |
|
|
35
|
-
|
|
36
|
-
The `interaction_model` in each specialism's `index.yaml` is the forcing function: `stateful_ad_server`, `stateless_transform`, `stateless_generate`. Decide which one matches your business, then follow the archetype section below.
|
|
37
|
-
|
|
38
|
-
## Protocol-Wide Requirements
|
|
39
|
-
|
|
40
|
-
Full treatment in `skills/build-seller-agent/SKILL.md` §Protocol-Wide Requirements and §Composing. Minimum viable pointers for a creative agent:
|
|
41
|
-
|
|
42
|
-
- **`idempotency_key`** on every mutating request (`sync_creatives`, `build_creative`, `report_usage`, any `sync_*` you implement). Pass `createIdempotencyStore` to `createAdcpServerFromPlatform(platform, { idempotency })`.
|
|
43
|
-
- **Authentication** via `serve({ authenticate })` with `verifyApiKey`/`verifyBearer` from `@adcp/sdk/server`. Unauthenticated agents fail the universal `security_baseline` storyboard.
|
|
44
|
-
- **Signature-header transparency**: accept requests with `Signature-Input`/`Signature` headers even if you don't claim `signed-requests`.
|
|
45
|
-
|
|
46
|
-
## Webhooks (for async review pipelines)
|
|
47
|
-
|
|
48
|
-
Creative review flows are naturally async — `sync_creatives` may return `pending_review` with a task envelope, and your review pipeline emits completion webhooks when the creative is approved, rejected, or transitions to a new state. `build_creative` for the ad-server archetype emits `report_usage` completion webhooks. Use `ctx.emitWebhook` — don't hand-roll `fetch` with HMAC signing.
|
|
49
|
-
|
|
50
|
-
Pass `webhooks: { signerKey }` to `createAdcpServerFromPlatform(platform, { webhooks })` and call `ctx.emitWebhook({ url, payload, operation_id })` from any handler. The framework handles RFC 9421 signing, stable `idempotency_key` across retries, backoff + terminal error handling. Full pattern in [`skills/build-seller-agent/SKILL.md`](../build-seller-agent/SKILL.md) § Webhooks.
|
|
51
|
-
|
|
52
|
-
**`operation_id` rules** (the top at-least-once-delivery bug): stable across retries. `creative_review.${creative_id}` or `report_usage.${report_batch_id}` — NOT a fresh UUID per retry.
|
|
53
|
-
|
|
54
|
-
## Before Writing Code
|
|
22
|
+
For exact response shapes, error codes, and optional fields, `docs/llms.txt` is the canonical reference. The fork target stays in sync with the spec because PR #1394's three-gate contract fails CI when it drifts.
|
|
55
23
|
|
|
56
|
-
|
|
24
|
+
## When to use this skill
|
|
57
25
|
|
|
58
|
-
|
|
26
|
+
- User wants to build an ad server, creative management platform, or audio creative agent
|
|
27
|
+
- User mentions `sync_creatives`, `build_creative`, `list_creative_formats`, or VAST/tag generation
|
|
59
28
|
|
|
60
|
-
|
|
61
|
-
- **Creative management platform** (Celtra) — specialism `creative-template`. Stateless transformation from inline manifest, template rendering across formats.
|
|
62
|
-
- **Generative creative agent** — specialism `creative-generative`. Takes a brief + brand reference, generates finished creatives from scratch (no inventory sold — that's `build-generative-seller-agent`).
|
|
63
|
-
- **Publisher creative service** — accepts buyer assets, validates against publisher specs, renders previews. Usually pairs with `build-seller-agent` and doesn't claim a creative specialism on its own.
|
|
29
|
+
**Not this skill:**
|
|
64
30
|
|
|
65
|
-
|
|
31
|
+
- Brief-to-creative generation coupled with selling inventory (AI ad network) → `skills/build-generative-seller-agent/`
|
|
32
|
+
- Publisher creative service that pairs with selling — usually a `build-seller-agent` adopter that omits a creative-* specialism claim
|
|
66
33
|
|
|
67
|
-
|
|
34
|
+
## Cross-cutting rules
|
|
68
35
|
|
|
69
|
-
-
|
|
70
|
-
- **Video**: `video_30s`, `vast_30s`, `video_15s`
|
|
71
|
-
- **Native**: `native_content` (image + headline + description)
|
|
72
|
-
- **Rich media**: `html5_300x250` (interactive HTML)
|
|
36
|
+
Every creative agent hits the cross-cutting rules in [`../cross-cutting.md`](../cross-cutting.md). The high-traffic ones for creative agents (deep-linked to the rule):
|
|
73
37
|
|
|
74
|
-
|
|
38
|
+
- [`idempotency_key`](../cross-cutting.md#idempotency_key-is-required-on-every-mutating-call) on `sync_creatives`, `build_creative`, `report_usage`
|
|
39
|
+
- [Authentication](../cross-cutting.md#authentication-is-mandatory) — `serve({ authenticate })` baseline
|
|
40
|
+
- [Webhooks](../cross-cutting.md#webhooks-stable-operation_id-across-retries) — `creative_review.${creative_id}` and `report_usage.${report_batch_id}` operation_ids must be stable across retries
|
|
75
41
|
|
|
76
|
-
|
|
42
|
+
Two creative-specific notes on top of those:
|
|
77
43
|
|
|
78
|
-
|
|
79
|
-
- **List** — query the creative library with filtering (recommended)
|
|
80
|
-
- **Preview** — render a visual preview of a creative (recommended)
|
|
81
|
-
- **Build** — produce serving tags (VAST, display tags, etc.) from stored creatives (recommended)
|
|
44
|
+
### Webhooks for async review pipelines
|
|
82
45
|
|
|
83
|
-
|
|
46
|
+
Creative review is naturally async. `sync_creatives` may return `pending_review` with a task envelope; your review pipeline emits `creative_review` completion webhooks when state transitions. `build_creative` for the ad-server archetype emits `report_usage` completion webhooks. Use `ctx.emitWebhook` per the pattern in [`../cross-cutting.md` § Webhooks](../cross-cutting.md#webhooks-stable-operation_id-across-retries).
|
|
84
47
|
|
|
85
|
-
|
|
48
|
+
### `previewCreative` and `listCreativeFormats` are no-account tools
|
|
86
49
|
|
|
87
|
-
|
|
88
|
-
- **Pending review** — human or automated review before going live
|
|
89
|
-
- **Rejection** — creative fails validation (wrong dimensions, prohibited content)
|
|
50
|
+
Both run with `NoAccountCtx<TCtxMeta>` — they don't carry an authenticated account. The fork target's resolver synthesizes a default-listing network so `ctx.account` resolves cleanly inside the no-account handler (migration recipe #11). If you fork from scratch you'll trip this; let the hello adapter do it.
|
|
90
51
|
|
|
91
|
-
|
|
52
|
+
`preview_creative` should return `urlRender` or `bothRender`, **not `htmlRender` alone**. The creative-template storyboard asserts `previews[0].renders[0].preview_url` is renderable. If your platform can host a preview URL, use `urlRender`. If you only have inline HTML, use `bothRender` (emit both `preview_url` and `preview_html`).
|
|
92
53
|
|
|
93
|
-
|
|
94
|
-
>
|
|
95
|
-
> **Cross-cutting pitfalls matrix runs keep catching:**
|
|
96
|
-
>
|
|
97
|
-
> - **Declare `capabilities.specialisms: ['creative-ad-server'] as const` (or `'creative-template'` / `'creative-generative'`) on the `DecisioningPlatform` you pass to `createAdcpServerFromPlatform`.** Value is `string[]` of enum ids (not `[{id, version}]`). Agents that don't declare their specialism fail the grader with "No applicable tracks found" even if every tool works — tracks are gated on the specialism claim.
|
|
98
|
-
> - **`list_creative_formats` response — each `Format` MUST have strict-shape `renders[]` and `assets[]`** (matrix v2 PR #1207 keeps catching this).
|
|
99
|
-
> - `renders[i]` requires `role` (string) PLUS exactly one of `dimensions: { width, height }` (object — NOT `{ width, height }` inline at the render root) OR `parameters_from_format_id: true`.
|
|
100
|
-
> - `assets[i]` requires the **discriminator quartet**: `item_type: 'individual' as const` + `asset_id` + `asset_type` (`'image'`/`'video'`/`'audio'`/`'text'`/`'click_url'`/`'html'`) + `required: boolean`. Missing any of these fails strict validation with `must match exactly one schema in oneOf`.
|
|
101
|
-
>
|
|
102
|
-
> ```ts
|
|
103
|
-
> // ✗ WRONG — passes lenient mode but fails strict (the actual mistake matrix v2 catches)
|
|
104
|
-
> { format_id, renders: [{ width: 300, height: 250 }],
|
|
105
|
-
> assets: [{ asset_id: 'image', required: true }] }
|
|
106
|
-
>
|
|
107
|
-
> // ✓ RIGHT — passes strict
|
|
108
|
-
> { format_id,
|
|
109
|
-
> renders: [{ role: 'primary', dimensions: { width: 300, height: 250 } }],
|
|
110
|
-
> assets: [{
|
|
111
|
-
> item_type: 'individual' as const,
|
|
112
|
-
> asset_id: 'image',
|
|
113
|
-
> asset_type: 'image',
|
|
114
|
-
> required: true,
|
|
115
|
-
> accepted_media_types: ['image/jpeg', 'image/png'],
|
|
116
|
-
> }] }
|
|
117
|
-
> ```
|
|
118
|
-
> - `build_creative` response is `{ creative_manifest: { format_id, assets } }` (single) or `{ creative_manifests: [...] }` (multi). Platform-native fields at the top level (`tag_url`, `creative_id`, `media_type`) are **invalid** — use `buildCreativeResponse({ creative_manifest })` / `buildCreativeMultiResponse({ creative_manifests })` from `@adcp/sdk/server` to lock the shape at compile time.
|
|
119
|
-
> - Each asset in `creative_manifest.assets` requires an `asset_type` discriminator. Use the typed factories (`imageAsset`, `videoAsset`, `audioAsset`, `htmlAsset`, `urlAsset`, `textAsset`) so the discriminator is injected for you; a plain `{ serving_tag: { content: '<vast>...' } }` fails validation.
|
|
120
|
-
> - `preview_creative` renders have the same pattern — each `renders[]` entry is a oneOf on `output_format`. Use `urlRender({...})`, `htmlRender({...})`, or `bothRender({...})` to inject the discriminator and require the matching `preview_url` / `preview_html` field automatically.
|
|
121
|
-
> - `get_creative_delivery` requires **top-level `currency: string`** (ISO 4217), in addition to any per-row spend fields. `reporting_period/start` and `/end` are ISO 8601 **date-time** strings (`new Date().toISOString()`), not date-only.
|
|
122
|
-
> - `videoAsset({...})` requires `width` + `height` per GA (previously optional). Set realistic pixel values — `{ url, width: 1920, height: 1080 }`.
|
|
123
|
-
> - `list_creatives` response — each `creatives[i].pricing_options[j]` uses the **vendor-pricing discriminator**, which is different from products' `pricing_model`. Field name is `model` (not `pricing_model`), valid values are `cpm` / `percent_of_media` / `flat_fee` / `per_unit` / `custom`. Each model has its own required fields: `cpm` needs `{model, cpm, currency}`; `flat_fee` needs `{model, amount, period, currency}` (`period` is required — the schema rejects `flat_fee` without it); `percent_of_media` needs `{model, percent, currency}`; `per_unit` needs `{model, unit, unit_price, currency}`. If you echo pricing_options from a seed fixture, normalize the shape — storyboard fixtures sometimes carry abbreviated shapes that fail validation on the way out.
|
|
54
|
+
## Specialism deltas at a glance
|
|
124
55
|
|
|
125
|
-
|
|
56
|
+
The fork targets cover the baseline + specialism deltas. Quick reference for what each archetype needs that the others don't:
|
|
126
57
|
|
|
127
|
-
|
|
128
|
-
| ----------------------- | ------------------------------ | --------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
|
|
129
|
-
| `get_adcp_capabilities` | auto-generated | n/a | Do not register manually. |
|
|
130
|
-
| `list_creative_formats` | `creative.listCreativeFormats` | [`#list_creative_formats`](../../docs/llms.txt#list_creative_formats) | Each `renders[]` entry MUST have `role` + exactly one of `dimensions` (object) OR `parameters_from_format_id: true` — `{width, height}` shorthand fails. Each `assets[]` entry MUST have `item_type: 'individual' as const` + `asset_id` + `asset_type` (image/video/audio/text/click_url/html) + `required: boolean`. See the strict-shape callout above the table. |
|
|
131
|
-
| `sync_creatives` | `creative.syncCreatives` | [`#sync_creatives`](../../docs/llms.txt#sync_creatives) | Echo `creative_id`; `action` ∈ `created \| updated \| unchanged \| failed \| deleted`. |
|
|
132
|
-
| `list_creatives` | `creative.listCreatives` | [`#list_creatives`](../../docs/llms.txt#list_creatives) | Honor `args.filters?.format_ids` when present. `created_date` + `updated_date` on each row are required ISO timestamps. |
|
|
133
|
-
| `preview_creative` | `creative.previewCreative` | [`#preview_creative`](../../docs/llms.txt#preview_creative) | `renders[].output_format` is a discriminator — use `urlRender({...})`, `htmlRender({...})`, or `bothRender({...})` so the discriminator is injected and the required `preview_url`/`preview_html` field is enforced at compile time. |
|
|
134
|
-
| `build_creative` | `creative.buildCreative` | [`#build_creative`](../../docs/llms.txt#build_creative) | Check `args.target_format_id` → library lookup; fall back to `args.creative_id`. Response requires `creative_manifest.format_id` + `creative_manifest.assets`. |
|
|
58
|
+
**`creative-ad-server`** — stateful library (`POST/GET/PATCH /v1/creatives`), tag generation via macro substitution against a stored snippet, per-creative pricing (`include_pricing=true` on `list_creatives`, `pricing_option_id` echoed by `build_creative`, `report_usage` closes the loop), `getCreativeDelivery` with multi-id pass-through and required top-level `currency` + `reporting_period`. Output formats from `list_creative_formats` are **serving-tag formats** (VAST 4.2, display tag HTML, native JSON), not input visual formats.
|
|
135
59
|
|
|
136
|
-
|
|
60
|
+
**`creative-template`** — stateless: build from inline `creative_manifest` in the request, no `ctx.store` lookup. Multi-format path: `target_format_ids` (plural) returns `{ creative_manifests: [...] }` (auto-wrapped to `buildCreativeMultiResponse`); single returns `{ creative_manifest: ... }`. Formats declare `variables[]` the template substitutes.
|
|
137
61
|
|
|
138
|
-
|
|
139
|
-
- Video: `{ url: string, duration_ms: number, format: string }`
|
|
140
|
-
- Audio: `{ url: string, container_format: string, codec: string, duration_ms: number, channels?: string, sampling_rate_hz?: number }`
|
|
141
|
-
- HTML: `{ content: string }` (not `{ html: string }`)
|
|
142
|
-
- Text: `{ content: string }` (not `{ text: string }` — the field is `content`, same as HTML)
|
|
62
|
+
Audio templates (TTS / mix / master, e.g. AudioStack / ElevenLabs / Resemble) follow the same shape with two deltas: (a) format declares `parameterizedRender({ role: 'primary' })` because audio has no width/height — encode duration/codec/bitrate in `accepts_parameters`, not in render entries; (b) the upstream pipeline is naturally minutes-long (voice-over → mix → master), so the adapter returns a task envelope and emits `creative_review` webhooks on completion.
|
|
143
63
|
|
|
144
|
-
|
|
64
|
+
**Audio adopters extend `hello_creative_adapter_template.ts` with four deltas:**
|
|
145
65
|
|
|
146
|
-
|
|
66
|
+
1. Add `audio_url?: string` to `UpstreamRender.output` and extend `output_kind` to include `'audio_url'`
|
|
67
|
+
2. Add an `audio_url` arm to `outputSlot(t)` returning `FormatAsset.audio({ asset_id: 'serving_tag', required: false })` — declares the output slot in the format so build_creative's response key matches a declared asset_id per `creative-manifest.json:14`.
|
|
68
|
+
3. Add an audio-output branch to `projectRenderToManifest`:
|
|
69
|
+
```ts
|
|
70
|
+
} else if (out.audio_url) {
|
|
71
|
+
assets['serving_tag'] = audioAsset({ url: out.audio_url });
|
|
72
|
+
}
|
|
73
|
+
```
|
|
74
|
+
The `audioAsset` builder injects the `asset_type: 'audio'` discriminator the creative-manifest oneOf requires.
|
|
75
|
+
4. Seed an audio template in your upstream platform — see `tpl_audiostack_spot_30s_v1` in `src/lib/mock-server/creative-template/seed-data.ts` for the worked reference.
|
|
147
76
|
|
|
148
|
-
**
|
|
149
|
-
|
|
150
|
-
Some schemas also define an `ext` field for vendor-namespaced extensions. If your request schema includes `ext`, accept it without error. Tools with explicit `ext` support: `get_creative_delivery`, `get_creative_features`.
|
|
151
|
-
|
|
152
|
-
## SDK Quick Reference
|
|
153
|
-
|
|
154
|
-
| SDK piece | Usage |
|
|
155
|
-
| ------------------------------------------------------- | ---------------------------------------------------------------- |
|
|
156
|
-
| `createAdcpServerFromPlatform(platform, opts)` | Create server from a typed `DecisioningPlatform` — compile-time specialism enforcement, auto-capabilities |
|
|
157
|
-
| `createAdcpServer(config)` *(legacy)* | v5 handler-bag entry. Mid-migration / escape-hatch only; reach via `@adcp/sdk/server/legacy/v5` |
|
|
158
|
-
| `serve(() => createAdcpServerFromPlatform(platform, opts))` | Start HTTP server on `:3001/mcp` |
|
|
159
|
-
| `creative: { listCreativeFormats, syncCreatives, ... }` | Domain group — register handlers by name |
|
|
160
|
-
| `ctx.store.put(collection, id, data)` | Persist state (creative library) across requests |
|
|
161
|
-
| `ctx.store.get(collection, id)` | Retrieve persisted state |
|
|
162
|
-
| `ctx.store.list(collection)` | List all items in a collection (for `list_creatives`) |
|
|
163
|
-
| `listCreativeFormatsResponse(data)` | Auto-applied response builder (don't call manually) |
|
|
164
|
-
| `syncCreativesResponse(data)` | Auto-applied response builder (don't call manually) |
|
|
165
|
-
| `listCreativesResponse(data)` | Auto-applied response builder (don't call manually) |
|
|
166
|
-
| `buildCreativeResponse(data)` | Auto-applied response builder (don't call manually) |
|
|
167
|
-
| `previewCreativeResponse(data)` | Auto-applied response builder (don't call manually) |
|
|
168
|
-
| `adcpError(code, { message })` | Structured error |
|
|
169
|
-
|
|
170
|
-
Import: `import { createAdcpServerFromPlatform, serve, adcpError } from '@adcp/sdk/server';`
|
|
171
|
-
|
|
172
|
-
## Setup
|
|
77
|
+
**Storyboard coverage for audio is not yet upstream** — the `creative_template/build_creative` step asserts display-shaped assets, tracked at [adcontextprotocol/adcp#4015](https://github.com/adcontextprotocol/adcp/issues/4015). Until that ships, audio adopters validate via `npm run compliance:fork-matrix -- --test-name-pattern="hello-creative-adapter-template"` (display + video gate inherited) plus a manual round-trip against the seeded audio template:
|
|
173
78
|
|
|
174
79
|
```bash
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
"module": "Node16",
|
|
187
|
-
"moduleResolution": "Node16",
|
|
188
|
-
"strict": true,
|
|
189
|
-
"skipLibCheck": true,
|
|
190
|
-
"outDir": "dist"
|
|
191
|
-
}
|
|
192
|
-
}
|
|
80
|
+
npx adcp mock-server creative-template --port 4250
|
|
81
|
+
# In another shell:
|
|
82
|
+
curl -X POST http://127.0.0.1:4250/v3/workspaces/ws_acme_studio/renders \
|
|
83
|
+
-H 'Authorization: Bearer mock_creative_template_key_do_not_use_in_prod' \
|
|
84
|
+
-H 'Content-Type: application/json' \
|
|
85
|
+
-d '{"template_id":"tpl_audiostack_spot_30s_v1","mode":"build","inputs":[{"slot_id":"script","value":"Built for the trail."}],"client_request_id":"smoke-1"}'
|
|
86
|
+
# → { "render_id": "rnd_…", "status": "queued" }
|
|
87
|
+
# Poll twice (queued → running → complete):
|
|
88
|
+
curl -H 'Authorization: Bearer mock_creative_template_key_do_not_use_in_prod' \
|
|
89
|
+
http://127.0.0.1:4250/v3/workspaces/ws_acme_studio/renders/rnd_…
|
|
90
|
+
# Final: { ..., "status": "complete", "output": { "audio_url": "….mp3", "preview_url": "...", "assets": [{ "kind": "audio_url", "mime_type": "audio/mpeg" }] } }
|
|
193
91
|
```
|
|
194
92
|
|
|
195
|
-
`
|
|
196
|
-
|
|
197
|
-
## Implementation
|
|
198
|
-
|
|
199
|
-
1. Single `.ts` file — all tools in one file
|
|
200
|
-
2. Use `createAdcpServerFromPlatform` with `creative: CreativeAdServerPlatform` (or `CreativeBuilderPlatform`) on a `DecisioningPlatform` class — `get_adcp_capabilities` is auto-generated
|
|
201
|
-
3. Handlers return raw data objects — response builders are auto-applied
|
|
202
|
-
4. Use `ctx.store` for persisting the creative library across requests (InMemoryStateStore by default)
|
|
203
|
-
5. Register `preview_creative` manually on the returned server (union schema not in domain group)
|
|
204
|
-
6. Set `sandbox: true` on all mock/demo responses
|
|
205
|
-
7. Context passthrough is handled by the framework — no need to manually echo `args.context`
|
|
206
|
-
|
|
207
|
-
```typescript
|
|
208
|
-
import {
|
|
209
|
-
createAdcpServerFromPlatform,
|
|
210
|
-
serve,
|
|
211
|
-
adcpError,
|
|
212
|
-
urlRender,
|
|
213
|
-
createIdempotencyStore,
|
|
214
|
-
memoryBackend,
|
|
215
|
-
type DecisioningPlatform,
|
|
216
|
-
type CreativeAdServerPlatform,
|
|
217
|
-
type AccountStore,
|
|
218
|
-
} from '@adcp/sdk/server';
|
|
219
|
-
|
|
220
|
-
const formats = [
|
|
221
|
-
{
|
|
222
|
-
format_id: { agent_url: 'https://creative.example.com/mcp', id: 'display_banner_300x250' },
|
|
223
|
-
name: 'Display Banner 300x250',
|
|
224
|
-
description: 'Standard MRec display unit',
|
|
225
|
-
renders: [
|
|
226
|
-
{ role: 'primary', dimensions: { width: 300, height: 250 } }, // role + dimensions (oneOf)
|
|
227
|
-
],
|
|
228
|
-
assets: [
|
|
229
|
-
{
|
|
230
|
-
item_type: 'individual' as const,
|
|
231
|
-
asset_id: 'image',
|
|
232
|
-
asset_type: 'image',
|
|
233
|
-
required: true,
|
|
234
|
-
accepted_media_types: ['image/png', 'image/jpeg'],
|
|
235
|
-
},
|
|
236
|
-
],
|
|
237
|
-
},
|
|
238
|
-
];
|
|
239
|
-
|
|
240
|
-
// The plain literal above works, but creative agents declaring richer
|
|
241
|
-
// acceptance specs (technical `requirements`, carousel/collection wrappers)
|
|
242
|
-
// should use the typed slot builders — see "Format asset slot builders"
|
|
243
|
-
// below.
|
|
244
|
-
|
|
245
|
-
// Idempotency — required for v3 compliance on any agent with mutating
|
|
246
|
-
// handlers. `sync_creatives`, `build_creative`, and `calibrate_content`
|
|
247
|
-
// are all mutating for creative agents.
|
|
248
|
-
const idempotency = createIdempotencyStore({
|
|
249
|
-
backend: memoryBackend(), // pgBackend(pool) for production
|
|
250
|
-
ttlSeconds: 86400, // 24 hours (spec bounds: 1h–7d)
|
|
251
|
-
});
|
|
252
|
-
|
|
253
|
-
class MyCreative implements DecisioningPlatform {
|
|
254
|
-
capabilities = {
|
|
255
|
-
specialisms: ['creative-ad-server'] as const,
|
|
256
|
-
config: {},
|
|
257
|
-
};
|
|
258
|
-
|
|
259
|
-
accounts: AccountStore = {
|
|
260
|
-
resolve: async ref => ({
|
|
261
|
-
id: 'account_id' in ref ? ref.account_id : 'cr_acc_1',
|
|
262
|
-
operator: 'me',
|
|
263
|
-
ctx_metadata: {},
|
|
264
|
-
}),
|
|
265
|
-
upsert: async () => ({ ok: true, items: [] }),
|
|
266
|
-
list: async () => ({ items: [], nextCursor: null }),
|
|
267
|
-
};
|
|
268
|
-
|
|
269
|
-
creative: CreativeAdServerPlatform = {
|
|
270
|
-
listCreativeFormats: async (params, ctx) => {
|
|
271
|
-
return { formats };
|
|
272
|
-
},
|
|
273
|
-
|
|
274
|
-
syncCreatives: async (params, ctx) => {
|
|
275
|
-
const results = [];
|
|
276
|
-
for (const creative of params.creatives) {
|
|
277
|
-
const now = new Date().toISOString();
|
|
278
|
-
const existing = await ctx.store.get('creatives', creative.creative_id);
|
|
279
|
-
await ctx.store.put('creatives', creative.creative_id, {
|
|
280
|
-
...creative,
|
|
281
|
-
status: 'approved',
|
|
282
|
-
created_date: existing?.created_date ?? now,
|
|
283
|
-
updated_date: now,
|
|
284
|
-
});
|
|
285
|
-
results.push({
|
|
286
|
-
creative_id: creative.creative_id,
|
|
287
|
-
action: existing ? ('updated' as const) : ('created' as const),
|
|
288
|
-
});
|
|
289
|
-
}
|
|
290
|
-
return { creatives: results };
|
|
291
|
-
},
|
|
292
|
-
|
|
293
|
-
listCreatives: async (params, ctx) => {
|
|
294
|
-
// `ctx.store.list` returns `{ items, nextCursor? }` — destructure.
|
|
295
|
-
let { items: creatives } = await ctx.store.list('creatives');
|
|
296
|
-
if (params.filters?.format_ids) {
|
|
297
|
-
creatives = creatives.filter(c => params.filters!.format_ids!.some(fid => fid.id === c.format_id?.id));
|
|
298
|
-
}
|
|
299
|
-
return {
|
|
300
|
-
query_summary: { total_matching: creatives.length, returned: creatives.length, filters_applied: [] },
|
|
301
|
-
creatives,
|
|
302
|
-
pagination: { has_more: false },
|
|
303
|
-
};
|
|
304
|
-
},
|
|
305
|
-
|
|
306
|
-
buildCreative: async (params, ctx) => {
|
|
307
|
-
// `ctx.store.list` returns `{ items, nextCursor? }` — destructure.
|
|
308
|
-
// Calling `.find`/`.map` on the raw result throws `TypeError` and
|
|
309
|
-
// the dispatcher wraps it as `SERVICE_UNAVAILABLE`.
|
|
310
|
-
const { items: creatives } = await ctx.store.list('creatives');
|
|
311
|
-
const match = params.target_format_id
|
|
312
|
-
? creatives.find(c => c.format_id?.id === params.target_format_id!.id)
|
|
313
|
-
: params.creative_id
|
|
314
|
-
? await ctx.store.get('creatives', params.creative_id)
|
|
315
|
-
: null;
|
|
316
|
-
// Return structured errors — don't throw. The dispatcher now unwraps
|
|
317
|
-
// thrown envelopes, but throwing still releases the idempotency claim
|
|
318
|
-
// before the throw is caught. If your handler mutated state before
|
|
319
|
-
// throwing, a retry with the same key re-executes the write. Returning
|
|
320
|
-
// an error envelope has the same claim-release semantics, so the rule
|
|
321
|
-
// holds for both paths: mutate last, or don't mutate at all on error.
|
|
322
|
-
if (!match) return adcpError('CREATIVE_NOT_FOUND', { message: 'No matching creative' });
|
|
323
|
-
return {
|
|
324
|
-
creative_manifest: { format_id: match.format_id, assets: match.assets ?? {} },
|
|
325
|
-
sandbox: true,
|
|
326
|
-
};
|
|
327
|
-
},
|
|
328
|
-
|
|
329
|
-
previewCreative: async params => {
|
|
330
|
-
return {
|
|
331
|
-
response_type: 'single',
|
|
332
|
-
previews: [
|
|
333
|
-
{
|
|
334
|
-
preview_id: `prev_${Date.now()}`,
|
|
335
|
-
input: { name: params.creative_manifest?.name ?? 'Preview' },
|
|
336
|
-
renders: [
|
|
337
|
-
urlRender({
|
|
338
|
-
render_id: `r_${Date.now()}`,
|
|
339
|
-
preview_url: 'https://example.com/preview.png',
|
|
340
|
-
role: 'primary',
|
|
341
|
-
dimensions: { width: 300, height: 250 },
|
|
342
|
-
}),
|
|
343
|
-
],
|
|
344
|
-
},
|
|
345
|
-
],
|
|
346
|
-
expires_at: new Date(Date.now() + 3600000).toISOString(),
|
|
347
|
-
};
|
|
348
|
-
},
|
|
349
|
-
};
|
|
350
|
-
}
|
|
351
|
-
|
|
352
|
-
const platform = new MyCreative();
|
|
353
|
-
|
|
354
|
-
serve(() =>
|
|
355
|
-
createAdcpServerFromPlatform(platform, {
|
|
356
|
-
name: 'My Creative Agent',
|
|
357
|
-
version: '1.0.0',
|
|
358
|
-
idempotency,
|
|
359
|
-
// Principal scoping for idempotency. MUST never return undefined —
|
|
360
|
-
// every mutating request would reject as SERVICE_UNAVAILABLE.
|
|
361
|
-
resolveSessionKey: () => 'default-principal',
|
|
362
|
-
})
|
|
363
|
-
);
|
|
364
|
-
```
|
|
93
|
+
**`creative-generative`** — generate from `message` + `brand.domain`; honor `quality: draft|production`; support refinement (re-send manifest in). Goes through `skills/build-generative-seller-agent/` because it's coupled with selling inventory.
|
|
365
94
|
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
Use `ctx.store` to persist synced creatives. The framework provides `InMemoryStateStore` by default — no need for module-level Maps or external state management.
|
|
369
|
-
|
|
370
|
-
The `sync_creatives` handler adds/updates entries via `ctx.store.put('creatives', id, data)`. The `list_creatives` handler queries via `ctx.store.list('creatives')` (include `created_date` and `updated_date` in each creative). The `preview_creative` handler previews the `creative_manifest` sent in the request (no library lookup needed). The `build_creative` handler finds a synced creative by `target_format_id` (matching the format), then builds a serving tag from it.
|
|
371
|
-
|
|
372
|
-
### Format asset slot builders
|
|
373
|
-
|
|
374
|
-
Ad servers and creative management platforms declare the technical acceptance contract in `Format.assets[]` — what a buyer must submit for a creative to be accepted. The spec's closed enums and field shapes are easy to get slightly wrong in a handwritten literal; strict response validation then rejects the format even when it's structurally close.
|
|
375
|
-
|
|
376
|
-
Four recurring mistakes:
|
|
377
|
-
|
|
378
|
-
1. **Image** uses `formats: ('jpg' | 'png' | 'gif' | 'webp' | 'svg' | 'avif' | 'tiff' | 'pdf' | 'eps')[]` — not `file_types`. Image `aspect_ratio` matches `^\d+(\.\d+)?:\d+(\.\d+)?$` (single-valued).
|
|
379
|
-
2. **Video** uses `containers: ('mp4' | 'webm' | 'mov' | 'avi' | 'mkv')[]` and `codecs: ('h264' | 'h265' | 'vp8' | 'vp9' | 'av1' | 'prores')[]`. Video `aspect_ratio` is integer-only `^\d+:\d+$`. Durations are `min_duration_ms` / `max_duration_ms`.
|
|
380
|
-
3. **Audio** uses `formats: ('mp3' | 'aac' | 'wav' | 'ogg' | 'flac')[]`. Durations are `*_duration_ms`.
|
|
381
|
-
4. **`min_count` / `max_count`** live on the `repeatable_group` wrapper. Formats that render multiple items (galleries, story frames, product showcases) declare an `item_type: 'repeatable_group'` slot with `assets[]` inside — never put counts on an individual asset.
|
|
382
|
-
|
|
383
|
-
Use the typed slot builders when declaring acceptance specs. `requirements` is strictly typed per `asset_type`, so misnamed fields and wrong units fail at compile time:
|
|
384
|
-
|
|
385
|
-
```typescript
|
|
386
|
-
import {
|
|
387
|
-
imageAssetSlot,
|
|
388
|
-
videoAssetSlot,
|
|
389
|
-
repeatableGroup,
|
|
390
|
-
imageGroupAsset,
|
|
391
|
-
textGroupAsset,
|
|
392
|
-
} from '@adcp/sdk';
|
|
393
|
-
|
|
394
|
-
// MRec banner with typed image requirements
|
|
395
|
-
{
|
|
396
|
-
format_id: { agent_url: AGENT_URL, id: 'display_banner_300x250' },
|
|
397
|
-
name: 'Display Banner 300x250',
|
|
398
|
-
renders: [{ role: 'primary', dimensions: { width: 300, height: 250 } }],
|
|
399
|
-
assets: [
|
|
400
|
-
imageAssetSlot({
|
|
401
|
-
asset_id: 'image',
|
|
402
|
-
required: true,
|
|
403
|
-
requirements: { formats: ['jpg', 'png', 'webp'], max_file_size_kb: 200 },
|
|
404
|
-
}),
|
|
405
|
-
],
|
|
406
|
-
}
|
|
407
|
-
|
|
408
|
-
// In-stream video, 6–30s
|
|
409
|
-
{
|
|
410
|
-
format_id: { agent_url: AGENT_URL, id: 'video_instream_16x9' },
|
|
411
|
-
name: 'In-Stream Video 16:9',
|
|
412
|
-
renders: [{ role: 'primary', dimensions: { width: 1920, height: 1080 } }],
|
|
413
|
-
assets: [
|
|
414
|
-
videoAssetSlot({
|
|
415
|
-
asset_id: 'video',
|
|
416
|
-
required: true,
|
|
417
|
-
requirements: {
|
|
418
|
-
aspect_ratio: '16:9',
|
|
419
|
-
containers: ['mp4', 'webm'],
|
|
420
|
-
codecs: ['h264', 'h265'],
|
|
421
|
-
min_duration_ms: 6000,
|
|
422
|
-
max_duration_ms: 30000,
|
|
423
|
-
},
|
|
424
|
-
}),
|
|
425
|
-
],
|
|
426
|
-
}
|
|
427
|
-
|
|
428
|
-
// Gallery format — 3 to 8 image+headline pairs. Counts on the GROUP.
|
|
429
|
-
{
|
|
430
|
-
format_id: { agent_url: AGENT_URL, id: 'gallery_1x1' },
|
|
431
|
-
name: 'Image Gallery',
|
|
432
|
-
renders: [{ role: 'primary', dimensions: { width: 1080, height: 1080 } }],
|
|
433
|
-
assets: [
|
|
434
|
-
repeatableGroup({
|
|
435
|
-
asset_group_id: 'cards',
|
|
436
|
-
required: true,
|
|
437
|
-
min_count: 3,
|
|
438
|
-
max_count: 8,
|
|
439
|
-
selection_mode: 'sequential',
|
|
440
|
-
assets: [
|
|
441
|
-
imageGroupAsset({ asset_id: 'card_image', required: true, requirements: { aspect_ratio: '1:1', formats: ['jpg', 'png'] } }),
|
|
442
|
-
textGroupAsset({ asset_id: 'card_headline', required: true, requirements: { max_length: 40 } }),
|
|
443
|
-
],
|
|
444
|
-
}),
|
|
445
|
-
],
|
|
446
|
-
}
|
|
447
|
-
```
|
|
448
|
-
|
|
449
|
-
Ad servers whose output is a serving-tag (VAST, display tag HTML) declare those via `vastAssetSlot`, `htmlAssetSlot`, or `javascriptAssetSlot` with their respective requirement shapes (`vast_version`, `sandbox`, `module_type`).
|
|
450
|
-
|
|
451
|
-
## Idempotency
|
|
452
|
-
|
|
453
|
-
AdCP v3 requires an `idempotency_key` on every mutating request — for creative agents that's `sync_creatives`, `build_creative`, and `calibrate_content`. Idempotency is already wired in the Implementation example above. The framework then handles:
|
|
454
|
-
|
|
455
|
-
- Missing/malformed key → `INVALID_REQUEST` (spec pattern `^[A-Za-z0-9_.:-]{16,255}$`)
|
|
456
|
-
- JCS-canonicalized payload hashing with same-key-different-payload → `IDEMPOTENCY_CONFLICT` (no payload leaked in the error body)
|
|
457
|
-
- Past-TTL replay → `IDEMPOTENCY_EXPIRED` (±60s clock-skew tolerance)
|
|
458
|
-
- Cache hits replay the cached envelope with `replayed: true` injected
|
|
459
|
-
- `adcp.idempotency.replay_ttl_seconds` auto-declared on `get_adcp_capabilities`
|
|
460
|
-
- Only successful responses cache — failed renders re-execute on retry
|
|
461
|
-
- Atomic claim so concurrent retries with a fresh key don't all race to run
|
|
462
|
-
|
|
463
|
-
Scoping is per-principal via `resolveSessionKey` (override with `resolveIdempotencyPrincipal` for custom scoping). `ttlSeconds` must be 3600–604800 — out of range throws at construction. If you register mutating handlers without wiring `idempotency`, the framework logs an error at server-creation time.
|
|
464
|
-
|
|
465
|
-
## Protecting your agent
|
|
466
|
-
|
|
467
|
-
**An AdCP agent that accepts unauthenticated requests is non-compliant** (see `security_baseline` in the universal storyboard bundle). Ask the operator: "API key, OAuth, or both?" — then wire one of these into `serve()`.
|
|
468
|
-
|
|
469
|
-
```typescript
|
|
470
|
-
import { serve } from '@adcp/sdk';
|
|
471
|
-
import { verifyApiKey, verifyBearer, anyOf } from '@adcp/sdk/server';
|
|
472
|
-
|
|
473
|
-
// API key — simplest, good for B2B integrations
|
|
474
|
-
serve(createAgent, {
|
|
475
|
-
authenticate: verifyApiKey({
|
|
476
|
-
verify: async token => {
|
|
477
|
-
const row = await db.api_keys.findUnique({ where: { token } });
|
|
478
|
-
return row ? { principal: row.account_id } : null;
|
|
479
|
-
},
|
|
480
|
-
}),
|
|
481
|
-
});
|
|
482
|
-
|
|
483
|
-
// OAuth — best when buyers authenticate as themselves
|
|
484
|
-
const AGENT_URL = 'https://my-agent.example.com/mcp';
|
|
485
|
-
serve(createAgent, {
|
|
486
|
-
publicUrl: AGENT_URL, // canonical RFC 8707 audience — also served as `resource` in protected-resource metadata
|
|
487
|
-
authenticate: verifyBearer({
|
|
488
|
-
jwksUri: 'https://auth.example.com/.well-known/jwks.json',
|
|
489
|
-
issuer: 'https://auth.example.com',
|
|
490
|
-
audience: AGENT_URL, // MUST equal publicUrl
|
|
491
|
-
}),
|
|
492
|
-
protectedResource: { authorization_servers: ['https://auth.example.com'] },
|
|
493
|
-
});
|
|
494
|
-
|
|
495
|
-
// Both
|
|
496
|
-
serve(createAgent, {
|
|
497
|
-
publicUrl: AGENT_URL,
|
|
498
|
-
authenticate: anyOf(verifyApiKey({ verify: lookupKey }), verifyBearer({ jwksUri, issuer, audience: AGENT_URL })),
|
|
499
|
-
protectedResource: { authorization_servers: [issuer] },
|
|
500
|
-
});
|
|
501
|
-
```
|
|
502
|
-
|
|
503
|
-
The framework produces RFC 6750-compliant `WWW-Authenticate: Bearer` 401s on failure, and serves `/.well-known/oauth-protected-resource<mountPath>` with `publicUrl` as the `resource` field so buyers get tokens bound to the right audience. The default JWT allowlist is asymmetric-only (RS*/ES*/PS\*/EdDSA) to prevent algorithm-confusion attacks.
|
|
504
|
-
|
|
505
|
-
## Deterministic Testing (for `creative_generative/seller` and `deterministic_testing`)
|
|
506
|
-
|
|
507
|
-
Creative generative sellers — and any creative agent that wants to pass `deterministic_testing` — must expose `comply_test_controller` so the grader can force creative-status transitions deterministically. `createComplyController` handles the scaffolding:
|
|
508
|
-
|
|
509
|
-
```ts
|
|
510
|
-
import { createComplyController } from '@adcp/sdk/testing';
|
|
511
|
-
|
|
512
|
-
const controller = createComplyController({
|
|
513
|
-
sandboxGate: input => input.auth?.sandbox === true,
|
|
514
|
-
seed: {
|
|
515
|
-
creative: params => creativeRepo.upsert(params.creative_id, params.fixture),
|
|
516
|
-
},
|
|
517
|
-
force: {
|
|
518
|
-
creative_status: params => creativeRepo.transition(params.creative_id, params.status, params.rejection_reason),
|
|
519
|
-
},
|
|
520
|
-
});
|
|
521
|
-
|
|
522
|
-
controller.register(server);
|
|
523
|
-
```
|
|
524
|
-
|
|
525
|
-
`controller.register(server)` auto-emits the `capabilities.compliance_testing.scenarios` block per AdCP 3.0 — don't put `compliance_testing` in `supported_protocols`, that's a spec violation on 3.0. Throw `TestControllerError('INVALID_TRANSITION', msg, currentState)` from the adapter when the state machine disallows the transition — the helper emits the typed error envelope. Omitted adapters auto-return `UNKNOWN_SCENARIO`.
|
|
526
|
-
|
|
527
|
-
Validate with: `adcp storyboard run <agent> deterministic_testing --auth $TOKEN`.
|
|
528
|
-
|
|
529
|
-
## Validate Locally
|
|
530
|
-
|
|
531
|
-
**Full validation checklist:** [docs/guides/VALIDATE-YOUR-AGENT.md](../../docs/guides/VALIDATE-YOUR-AGENT.md). Creative-agent-specific commands:
|
|
95
|
+
## Validate locally
|
|
532
96
|
|
|
533
97
|
```bash
|
|
534
|
-
#
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
# Happy path — the archetype you're claiming
|
|
538
|
-
npx @adcp/sdk@latest storyboard run http://localhost:3001/mcp creative_ad_server --auth $TOKEN # stateful
|
|
539
|
-
npx @adcp/sdk@latest storyboard run http://localhost:3001/mcp creative_template --auth $TOKEN # stateless
|
|
540
|
-
npx @adcp/sdk@latest storyboard run http://localhost:3001/mcp creative_generative --auth $TOKEN # brief-to-creative
|
|
541
|
-
|
|
542
|
-
# Cross-cutting obligations (all creative agents)
|
|
543
|
-
npx @adcp/sdk@latest storyboard run http://localhost:3001/mcp \
|
|
544
|
-
--storyboards security_baseline,idempotency,schema_validation,error_compliance --auth $TOKEN
|
|
545
|
-
|
|
546
|
-
# Rejection-surface fuzz — includes preview_creative (referential, fixture-eligible)
|
|
547
|
-
npx @adcp/sdk@latest fuzz http://localhost:3001/mcp \
|
|
548
|
-
--tools list_creative_formats,list_creatives,get_creative_features,preview_creative \
|
|
549
|
-
--fixture creative_ids=cre_a,cre_b \
|
|
550
|
-
--auth-token $TOKEN
|
|
551
|
-
```
|
|
552
|
-
|
|
553
|
-
Common failure decoder:
|
|
554
|
-
|
|
555
|
-
- `response_schema` on `preview_creative` → the union schema requires manual registration; see § creative-template
|
|
556
|
-
- `mcp_error` on creative lifecycle → confirm `sync_creatives` status enum is `approved`/`rejected`/`pending_approval`, not a custom value
|
|
557
|
-
- `field_present` on build response → `creative_manifest` must be fully populated, not just `id`
|
|
558
|
-
|
|
559
|
-
**Keep iterating until all steps pass.** Can't bind ports? `npm run compliance:skill-matrix -- --filter creative` runs an isolated end-to-end test.
|
|
560
|
-
|
|
561
|
-
## Common Mistakes
|
|
562
|
-
|
|
563
|
-
| Mistake | Fix |
|
|
564
|
-
| ---------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------- |
|
|
565
|
-
| Using `createTaskCapableServer` + `server.tool()` | Use `createAdcpServerFromPlatform` with a typed `creative: CreativeAdServerPlatform` (or `CreativeBuilderPlatform`) field |
|
|
566
|
-
| Calling `createAdcpServer` directly in new code | Reach for `createAdcpServerFromPlatform`; `createAdcpServer` lives at `@adcp/sdk/server/legacy/v5` for mid-migration / escape-hatch only |
|
|
567
|
-
| Manually registering `get_adcp_capabilities` | Auto-generated by `createAdcpServerFromPlatform` from your typed `DecisioningPlatform` — do not register it |
|
|
568
|
-
| Calling `server.registerTool('preview_creative', ...)` | `AdcpServer` does not expose `registerTool` — put `previewCreative` in the `creative:` domain group like the other handlers |
|
|
569
|
-
| Using module-level Maps for state | Use `ctx.store.put/get/list` — framework provides `InMemoryStateStore` by default |
|
|
570
|
-
| Calling response builders manually in domain handlers | Handlers return raw data — response builders are auto-applied across the `creative:` group, including `preview_creative` |
|
|
571
|
-
| `list_creatives` ignores format filter | Check `args.filters?.format_ids` and filter results |
|
|
572
|
-
| `preview_creative` returns wrong response_type | Must be `'single'` for single creative previews |
|
|
573
|
-
| `preview_creative` looks up by creative_id | Preview the `creative_manifest` from the request — no library lookup needed |
|
|
574
|
-
| `build_creative` looks up by `args.creative_id` only | Storyboard sends `target_format_id` — find a synced creative matching that format |
|
|
575
|
-
| `build_creative` missing creative_manifest | Required field — contains the built output |
|
|
576
|
-
| `creative_manifest` includes `name` field | `CreativeManifest` has no `name` — only `format_id` and `assets` |
|
|
577
|
-
| HTML asset uses `{ html: '...' }` | Use `{ content: '...' }` — the schema field is `content`, not `html` |
|
|
578
|
-
| format_ids in list_creative_formats don't match what sellers reference | Sellers include your format_ids in their products — if the buyer can't look them up via list_creative_formats, creative sync breaks |
|
|
579
|
-
|
|
580
|
-
## Storyboards
|
|
581
|
-
|
|
582
|
-
| Storyboard | Tests |
|
|
583
|
-
| ---------------------- | ---------------------------------------------------------------- |
|
|
584
|
-
| `creative_lifecycle` | Full lifecycle: format discovery → sync → list → preview → build |
|
|
585
|
-
| `creative_template` | Stateless template rendering (build + preview only) |
|
|
586
|
-
| `creative_sales_agent` | Sales agent that accepts pushed assets |
|
|
587
|
-
| `creative_ad_server` | Ad server with pre-loaded library |
|
|
588
|
-
|
|
589
|
-
## Specialism Details
|
|
590
|
-
|
|
591
|
-
### <a name="specialism-creative-ad-server"></a>creative-ad-server
|
|
592
|
-
|
|
593
|
-
Storyboard: `creative_ad_server`. Stateful — the library is pre-loaded; buyers do **not** push assets via `sync_creatives` at runtime. Pricing and billing round-trips are first-class.
|
|
594
|
-
|
|
595
|
-
**`list_creatives`** with `include_pricing=true` returns per-creative `pricing_options`:
|
|
596
|
-
|
|
597
|
-
```typescript
|
|
598
|
-
listCreatives: async (params, ctx) => {
|
|
599
|
-
const { items } = await ctx.store.list('creatives');
|
|
600
|
-
const creatives = items.map((c) => ({
|
|
601
|
-
creative_id: c.creative_id,
|
|
602
|
-
name: c.name,
|
|
603
|
-
format_id: c.format_id,
|
|
604
|
-
status: 'approved' as const,
|
|
605
|
-
created_date: c.created_date,
|
|
606
|
-
updated_date: c.updated_date,
|
|
607
|
-
...(params.include_pricing && {
|
|
608
|
-
pricing_options: [{
|
|
609
|
-
pricing_option_id: 'standard_cpm',
|
|
610
|
-
model: 'cpm' as const,
|
|
611
|
-
cpm: 2.5,
|
|
612
|
-
currency: 'USD',
|
|
613
|
-
}],
|
|
614
|
-
}),
|
|
615
|
-
}));
|
|
616
|
-
return {
|
|
617
|
-
query_summary: { total_matching: creatives.length, returned: creatives.length, filters_applied: [] },
|
|
618
|
-
creatives,
|
|
619
|
-
pagination: { has_more: false },
|
|
620
|
-
};
|
|
621
|
-
},
|
|
622
|
-
```
|
|
623
|
-
|
|
624
|
-
**`build_creative`** receives `media_buy_id`, `package_id`, `target_format_id`, and `pricing_option_id`. Return a VAST tag with macro placeholders, plus `vendor_cost` at CPM = 0 (billing happens via `report_usage`):
|
|
625
|
-
|
|
626
|
-
```typescript
|
|
627
|
-
buildCreative: async (params, ctx) => {
|
|
628
|
-
const creative = await lookupCreativeForFormat(params.target_format_id, ctx);
|
|
629
|
-
const vast = `<?xml version="1.0"?>
|
|
630
|
-
<VAST version="4.2">
|
|
631
|
-
<Ad id="${creative.creative_id}"><InLine>
|
|
632
|
-
<Impression><![CDATA[https://adserver.example/imp?cb=[CACHEBUSTER]&mb=${params.media_buy_id}]]></Impression>
|
|
633
|
-
<Creatives><Creative>
|
|
634
|
-
<Linear><Duration>00:00:30</Duration>
|
|
635
|
-
<MediaFiles><MediaFile type="video/mp4"><![CDATA[${creative.video_url}]]></MediaFile></MediaFiles>
|
|
636
|
-
<VideoClicks><ClickThrough><![CDATA[[CLICK_URL]https://landing.example]]></ClickThrough></VideoClicks>
|
|
637
|
-
</Linear>
|
|
638
|
-
</Creative></Creatives>
|
|
639
|
-
</InLine></Ad>
|
|
640
|
-
</VAST>`;
|
|
641
|
-
|
|
642
|
-
return {
|
|
643
|
-
creative_manifest: {
|
|
644
|
-
format_id: params.target_format_id,
|
|
645
|
-
assets: { serving_tag: { content: vast } }, // HTML asset shape: { content: string }
|
|
646
|
-
},
|
|
647
|
-
pricing_option_id: params.pricing_option_id, // echo
|
|
648
|
-
vendor_cost: { amount: 0, currency: 'USD' }, // CPM at build time — billing is separate
|
|
649
|
-
sandbox: true,
|
|
650
|
-
};
|
|
651
|
-
},
|
|
652
|
-
```
|
|
653
|
-
|
|
654
|
-
**`report_usage`** is the billing reconciliation tool. Validate `idempotency_key` (return the same response for the same key) and echo `pricing_option_id` + `reporting_period`:
|
|
655
|
-
|
|
656
|
-
```typescript
|
|
657
|
-
reportUsage: async (params, ctx) => {
|
|
658
|
-
const existing = await ctx.store.get('usage_reports', params.idempotency_key);
|
|
659
|
-
if (existing) return existing; // idempotent
|
|
660
|
-
const report = {
|
|
661
|
-
idempotency_key: params.idempotency_key,
|
|
662
|
-
creative_id: params.creative_id,
|
|
663
|
-
pricing_option_id: params.pricing_option_id,
|
|
664
|
-
reporting_period: params.reporting_period,
|
|
665
|
-
billable_amount: { amount: params.impressions * 2.5 / 1000, currency: 'USD' },
|
|
666
|
-
status: 'accepted' as const,
|
|
667
|
-
};
|
|
668
|
-
await ctx.store.put('usage_reports', params.idempotency_key, report);
|
|
669
|
-
return report;
|
|
670
|
-
},
|
|
671
|
-
```
|
|
672
|
-
|
|
673
|
-
**`get_creative_delivery`** returns impressions/spend, optionally broken down by variant and filtered by `media_buy_ids`:
|
|
674
|
-
|
|
675
|
-
```typescript
|
|
676
|
-
getCreativeDelivery: async (params, ctx) => ({
|
|
677
|
-
reporting_period: params.reporting_period,
|
|
678
|
-
currency: 'USD', // required top-level per get-creative-delivery-response.json
|
|
679
|
-
creatives: (params.creative_ids ?? []).map((id) => ({
|
|
680
|
-
creative_id: id,
|
|
681
|
-
impressions: 12500,
|
|
682
|
-
spend: { amount: 31.25, currency: 'USD' },
|
|
683
|
-
by_variant: [],
|
|
684
|
-
})),
|
|
685
|
-
sandbox: true,
|
|
686
|
-
}),
|
|
687
|
-
```
|
|
688
|
-
|
|
689
|
-
Output formats returned by `list_creative_formats` for ad servers are **serving-tag formats** (VAST 4.2, display tag HTML, native JSON payload), not input visual formats.
|
|
690
|
-
|
|
691
|
-
### <a name="specialism-creative-template"></a>creative-template
|
|
692
|
-
|
|
693
|
-
Storyboard: `creative_template`. Stateless — build from the inline `creative_manifest` in the request, do not call `ctx.store`.
|
|
694
|
-
|
|
695
|
-
**Fork target**: `examples/hello_creative_adapter_template.ts` is the worked, passing reference adapter for this specialism. CI gates strict tsc + storyboard pass + upstream-traffic façade. Replace the `// SWAP:` markers with calls to your real backend.
|
|
696
|
-
|
|
697
|
-
Formats declare `variables` the template will substitute:
|
|
698
|
-
|
|
699
|
-
```typescript
|
|
700
|
-
import { displayRender } from '@adcp/sdk';
|
|
98
|
+
# Run the fork-matrix gates for both creative archetypes
|
|
99
|
+
npm run compliance:fork-matrix -- --test-name-pattern="hello-creative-adapter"
|
|
701
100
|
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
name: 'Responsive 300x250 Banner Template',
|
|
706
|
-
type: 'display' as const,
|
|
707
|
-
renders: [displayRender({ role: 'primary', dimensions: { width: 300, height: 250 } })],
|
|
708
|
-
variables: [ // template-agent specific
|
|
709
|
-
{ variable_id: 'headline', type: 'text', max_length: 40 },
|
|
710
|
-
{ variable_id: 'cta', type: 'text', max_length: 20 },
|
|
711
|
-
{ variable_id: 'hero_image', type: 'image' },
|
|
712
|
-
{ variable_id: 'accent_color', type: 'color' },
|
|
713
|
-
],
|
|
714
|
-
assets: [/* acceptance specs */],
|
|
715
|
-
}],
|
|
716
|
-
}),
|
|
101
|
+
# Or validate your forked agent directly against its storyboard
|
|
102
|
+
adcp storyboard run http://127.0.0.1:3002/mcp creative_ad_server \
|
|
103
|
+
--bearer "$ADCP_AUTH_TOKEN" --include-bundles --json
|
|
717
104
|
```
|
|
718
105
|
|
|
719
|
-
`
|
|
720
|
-
|
|
721
|
-
```typescript
|
|
722
|
-
buildCreative: async (params) => {
|
|
723
|
-
const inputManifest = params.creative_manifest; // already provided — no lookup
|
|
724
|
-
|
|
725
|
-
// Multi-format path (plural target_format_ids)
|
|
726
|
-
if (params.target_format_ids?.length) {
|
|
727
|
-
return {
|
|
728
|
-
creative_manifests: params.target_format_ids.map((fid) => renderTemplate(fid, inputManifest)),
|
|
729
|
-
sandbox: true,
|
|
730
|
-
}; // wraps to buildCreativeMultiResponse
|
|
731
|
-
}
|
|
732
|
-
|
|
733
|
-
// Single-format
|
|
734
|
-
const targetFid = params.target_format_id ?? inputManifest.format_id;
|
|
735
|
-
return {
|
|
736
|
-
creative_manifest: renderTemplate(targetFid, inputManifest),
|
|
737
|
-
sandbox: true,
|
|
738
|
-
};
|
|
739
|
-
},
|
|
740
|
-
```
|
|
741
|
-
|
|
742
|
-
Output can be HTML (`{ content: '<div>...</div>' }`), JavaScript tag (`{ content: '<script>...</script>' }`), or VAST XML. `asset_type: 'url'` is valid for click-through URLs.
|
|
743
|
-
|
|
744
|
-
`list_creative_formats` accepts filter params (`type`, `max_width`, `max_height`). Return an empty array — not an error — when nothing matches.
|
|
745
|
-
|
|
746
|
-
**`preview_creative` should return `urlRender` or `bothRender` — not `htmlRender` alone.** The creative-template storyboard asserts the preview carries a renderable URL (`previews[0].renders[0].preview_url`). An html-only render is spec-valid but fails that assertion. If your platform can render the creative to a hosted preview URL, use `urlRender`. If you only have inline HTML, use `bothRender` (emit both `preview_url: "<sandbox URL>"` and `preview_html: "<inline markup>"`).
|
|
747
|
-
|
|
748
|
-
#### Audio creative-template (TTS / mix / master)
|
|
749
|
-
|
|
750
|
-
Audio creative agents (AudioStack, ElevenLabs, Resemble) fit the `creative-template` archetype — stateless transform from an inline manifest to a rendered audio file. Three things differ from display:
|
|
751
|
-
|
|
752
|
-
1. **No width/height.** The `Format.renders[]` item schema has a `oneOf` — each render must satisfy either `dimensions` (width + height required) OR `parameters_from_format_id: true`. Audio has no dimensions, so audio renders go through the parameterized branch. Use `parameterizedRender({ role: 'primary' })` — it auto-injects `parameters_from_format_id: true`. Encode duration/codec/bitrate in the `format_id` parameters (declared via `accepts_parameters`), not in the render entry.
|
|
753
|
-
2. **Async render pipelines.** TTS → mix → master is typically minutes long. Don't block the `build_creative` call waiting for the pipeline; the platform-native SDK (AudioStack's 300s poll window, etc.) belongs inside a task worker. If the platform's API returns quickly, build synchronously; otherwise return the task envelope and emit a `creative_review` completion webhook (see the [Webhooks](#webhooks-for-async-review-pipelines) section above for the wiring).
|
|
754
|
-
3. **Inputs are text assets keyed by `asset_id`.** The buyer sends `creative_manifest.assets.script` (a `TextAsset` with `content: string`) — read `inputManifest.assets.script?.content`, not `.text`.
|
|
755
|
-
|
|
756
|
-
Format declaration:
|
|
757
|
-
|
|
758
|
-
```typescript
|
|
759
|
-
import { parameterizedRender } from '@adcp/sdk';
|
|
760
|
-
|
|
761
|
-
listCreativeFormats: async () => ({
|
|
762
|
-
formats: [{
|
|
763
|
-
format_id: {
|
|
764
|
-
agent_url: AGENT_URL,
|
|
765
|
-
id: 'audio_ad',
|
|
766
|
-
parameters: { duration_seconds: 30, codec: 'mp3' },
|
|
767
|
-
},
|
|
768
|
-
name: 'Audio Ad',
|
|
769
|
-
type: 'audio' as const,
|
|
770
|
-
accepts_parameters: [
|
|
771
|
-
{ parameter_id: 'duration_seconds', type: 'number' },
|
|
772
|
-
{ parameter_id: 'codec', type: 'string' },
|
|
773
|
-
],
|
|
774
|
-
renders: [parameterizedRender({ role: 'primary' })],
|
|
775
|
-
assets: [
|
|
776
|
-
{ asset_id: 'script', asset_type: 'text', required: true, item_type: 'individual', description: 'Ad script (~70-75 words for a 30s read)' },
|
|
777
|
-
{ asset_id: 'voice', asset_type: 'text', required: false, item_type: 'individual', description: 'TTS voice name (e.g. "sara", "isaac")' },
|
|
778
|
-
{ asset_id: 'music_template', asset_type: 'text', required: false, item_type: 'individual', description: 'Music-bed template; omit for voice-only' },
|
|
779
|
-
],
|
|
780
|
-
}],
|
|
781
|
-
}),
|
|
782
|
-
```
|
|
106
|
+
Each gate is the three-gate contract from [`docs/guides/EXAMPLE-TEST-CONTRACT.md`](../../docs/guides/EXAMPLE-TEST-CONTRACT.md): tsc strict / storyboard zero-failures / upstream façade. Adopters who fork extend the test file with their own adapter path and `expectedRoutes`.
|
|
783
107
|
|
|
784
|
-
|
|
785
|
-
|
|
786
|
-
```typescript
|
|
787
|
-
import { buildCreativeResponse, audioAsset } from '@adcp/sdk/server';
|
|
788
|
-
|
|
789
|
-
buildCreative: async (params) => {
|
|
790
|
-
const inputManifest = params.creative_manifest; // already inline — no lookup
|
|
791
|
-
const targetFid = params.target_format_id ?? inputManifest.format_id;
|
|
792
|
-
|
|
793
|
-
// Read inputs from the inline manifest's assets (TextAsset.content, not .text)
|
|
794
|
-
const script = inputManifest.assets.script?.content ?? '';
|
|
795
|
-
const voice = inputManifest.assets.voice?.content;
|
|
796
|
-
const musicTemplate = inputManifest.assets.music_template?.content;
|
|
797
|
-
|
|
798
|
-
// Platform pipeline (script → speech → mix). Wrap in a task worker if long-running.
|
|
799
|
-
const rendered = await renderAudio({ script, voice, musicTemplate });
|
|
800
|
-
|
|
801
|
-
return buildCreativeResponse({
|
|
802
|
-
creative_manifest: {
|
|
803
|
-
format_id: targetFid,
|
|
804
|
-
assets: {
|
|
805
|
-
audio: audioAsset({
|
|
806
|
-
url: rendered.url,
|
|
807
|
-
container_format: 'mp3',
|
|
808
|
-
codec: 'mp3',
|
|
809
|
-
duration_ms: rendered.durationMs,
|
|
810
|
-
channels: 'stereo',
|
|
811
|
-
sampling_rate_hz: 44100,
|
|
812
|
-
}),
|
|
813
|
-
},
|
|
814
|
-
},
|
|
815
|
-
sandbox: params.account?.sandbox === true,
|
|
816
|
-
});
|
|
817
|
-
},
|
|
818
|
-
```
|
|
819
|
-
|
|
820
|
-
Common trap — returning platform-native fields (`{ tag_url, creative_id, media_type }`) at the top level instead of wrapping in `creative_manifest`. The wire schema rejects it; `buildCreativeResponse` catches it at compile time.
|
|
821
|
-
|
|
822
|
-
### <a name="specialism-creative-generative"></a>creative-generative
|
|
823
|
-
|
|
824
|
-
Storyboard: `creative_generative`. Takes a brief (`message`) and brand reference (`brand.domain`), generates finished assets.
|
|
825
|
-
|
|
826
|
-
```typescript
|
|
827
|
-
buildCreative: (async params => {
|
|
828
|
-
const { message, brand, quality } = params;
|
|
829
|
-
const brandDomain = brand?.domain ?? 'unknown';
|
|
830
|
-
const q = quality ?? 'draft';
|
|
831
|
-
|
|
832
|
-
// Multi-format: return one manifest per target
|
|
833
|
-
if (params.target_format_ids?.length) {
|
|
834
|
-
const manifests = await Promise.all(
|
|
835
|
-
params.target_format_ids.map(fid => generateForFormat(fid, message, brandDomain, q))
|
|
836
|
-
);
|
|
837
|
-
return { creative_manifests: manifests, sandbox: true };
|
|
838
|
-
}
|
|
839
|
-
|
|
840
|
-
// Single / refinement: if params.creative_manifest is present, use its assets as a seed
|
|
841
|
-
const targetFid = params.target_format_id ?? params.creative_manifest?.format_id;
|
|
842
|
-
const manifest = await generateForFormat(targetFid, message, brandDomain, q, params.creative_manifest);
|
|
843
|
-
return { creative_manifest: manifest, sandbox: true };
|
|
844
|
-
},
|
|
845
|
-
async function generateForFormat(fid, message, brandDomain, quality, seed) {
|
|
846
|
-
const priorHeadline = seed?.assets?.headline?.text; // refinement — reuse buyer-approved copy
|
|
847
|
-
// ... call your image/copy model here
|
|
848
|
-
return {
|
|
849
|
-
format_id: fid,
|
|
850
|
-
assets: {
|
|
851
|
-
generated_image: {
|
|
852
|
-
url: `${AGENT_URL}/generated/${fid.id}-${quality}.jpg`,
|
|
853
|
-
width: 300,
|
|
854
|
-
height: 250,
|
|
855
|
-
format: 'jpeg',
|
|
856
|
-
},
|
|
857
|
-
headline: { text: priorHeadline ?? 'Generated headline' },
|
|
858
|
-
cta: { text: 'Shop now' },
|
|
859
|
-
},
|
|
860
|
-
// Provenance metadata when your output is AI-generated:
|
|
861
|
-
provenance: {
|
|
862
|
-
digital_source_type: 'ai',
|
|
863
|
-
ai_tool: 'your-generator-v1',
|
|
864
|
-
},
|
|
865
|
-
};
|
|
866
|
-
});
|
|
867
|
-
```
|
|
108
|
+
For deeper validation (fuzz, request-signing grading, custom invariants): [`docs/guides/VALIDATE-YOUR-AGENT.md`](../../docs/guides/VALIDATE-YOUR-AGENT.md).
|
|
868
109
|
|
|
869
|
-
|
|
110
|
+
## Common shape gotchas
|
|
870
111
|
|
|
871
|
-
|
|
112
|
+
`BuildCreativeReturn` has 4 valid shapes (framework auto-wraps the bare manifest). `VASTAsset` requires an embedded `delivery_type` discriminator. `Format.renders[]` is a `oneOf` — `dimensions` (width + height) OR `parameters_from_format_id: true`, never both, never neither. See [`../SHAPE-GOTCHAS.md`](../SHAPE-GOTCHAS.md) — schema validators catch these at runtime; type checkers don't.
|
|
872
113
|
|
|
873
|
-
##
|
|
114
|
+
## Migration notes
|
|
874
115
|
|
|
875
|
-
- `
|
|
876
|
-
- `docs/
|
|
877
|
-
- `docs/TYPE-SUMMARY.md` — curated type signatures
|
|
878
|
-
- `docs/llms.txt` — full protocol reference
|
|
116
|
+
- 6.6 → 6.7: `defineCreativeAdServerPlatform` family drops `req: unknown` casts; `Format.renders[]` codegen is closed-shape (#1325) so typed render builders compose under strict tsc; `NoAccountCtx<TCtxMeta>` narrows the no-account tools. See [`docs/migration-6.6-to-6.7.md`](../../docs/migration-6.6-to-6.7.md).
|
|
117
|
+
- 4.x → 5.x: [`docs/migration-4.x-to-5.x.md`](../../docs/migration-4.x-to-5.x.md).
|