@adcp/sdk 13.0.0-rc.6 → 13.0.0-rc.7
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/compliance/cache/{3.1.8 → 3.1.10}/domains/media-buy/index.yaml +1 -0
- package/compliance/cache/3.1.10/domains/media-buy/scenarios/dependency_impairment_audience.yaml +317 -0
- package/compliance/cache/{3.1.8 → 3.1.10}/index.json +3 -3
- package/compliance/cache/{3.1.8.previous/domains → 3.1.10/protocols}/media-buy/index.yaml +1 -0
- package/compliance/cache/3.1.10/protocols/media-buy/scenarios/dependency_impairment_audience.yaml +317 -0
- package/compliance/cache/{3.1.8.previous → 3.1.10}/universal/runner-output-contract.yaml +1 -1
- package/compliance/cache/{3.1.8/protocols → 3.1.10.previous/domains}/media-buy/index.yaml +1 -0
- package/compliance/cache/3.1.10.previous/domains/media-buy/scenarios/dependency_impairment_audience.yaml +317 -0
- package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/index.json +3 -3
- package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/protocols/media-buy/index.yaml +1 -0
- package/compliance/cache/3.1.10.previous/protocols/media-buy/scenarios/dependency_impairment_audience.yaml +317 -0
- package/compliance/cache/{3.1.8 → 3.1.10.previous}/universal/runner-output-contract.yaml +1 -1
- package/dist/lib/adapters/legacy/v2-5/sync_creatives.d.mts +4 -3
- package/dist/lib/adapters/legacy/v2-5/sync_creatives.d.ts +4 -3
- package/dist/lib/adapters/legacy/v2-5/sync_creatives.d.ts.map +1 -1
- package/dist/lib/adapters/legacy/v2-5/sync_creatives.js.map +1 -1
- package/dist/lib/adapters/legacy/v2-5/sync_creatives.mjs.map +1 -1
- package/dist/lib/auth/oauth/MCPOAuthProvider.d.mts +2 -0
- package/dist/lib/auth/oauth/MCPOAuthProvider.d.ts +2 -0
- package/dist/lib/auth/oauth/MCPOAuthProvider.d.ts.map +1 -1
- package/dist/lib/auth/oauth/MCPOAuthProvider.js +8 -7
- package/dist/lib/auth/oauth/MCPOAuthProvider.js.map +1 -1
- package/dist/lib/auth/oauth/MCPOAuthProvider.mjs +8 -7
- package/dist/lib/auth/oauth/MCPOAuthProvider.mjs.map +1 -1
- package/dist/lib/auth/oauth/file-storage.d.mts +2 -1
- package/dist/lib/auth/oauth/file-storage.d.ts +2 -1
- package/dist/lib/auth/oauth/file-storage.d.ts.map +1 -1
- package/dist/lib/auth/oauth/file-storage.js +5 -1
- package/dist/lib/auth/oauth/file-storage.js.map +1 -1
- package/dist/lib/auth/oauth/file-storage.mjs +5 -1
- package/dist/lib/auth/oauth/file-storage.mjs.map +1 -1
- package/dist/lib/auth/oauth/index.d.mts +5 -1
- package/dist/lib/auth/oauth/index.d.ts +5 -1
- package/dist/lib/auth/oauth/index.d.ts.map +1 -1
- package/dist/lib/auth/oauth/index.js +4 -0
- package/dist/lib/auth/oauth/index.js.map +1 -1
- package/dist/lib/auth/oauth/index.mjs +4 -0
- package/dist/lib/auth/oauth/index.mjs.map +1 -1
- package/dist/lib/auth/oauth/resource-url.d.mts +4 -0
- package/dist/lib/auth/oauth/resource-url.d.ts +5 -0
- package/dist/lib/auth/oauth/resource-url.d.ts.map +1 -0
- package/dist/lib/auth/oauth/resource-url.js +51 -0
- package/dist/lib/auth/oauth/resource-url.js.map +1 -0
- package/dist/lib/auth/oauth/resource-url.mjs +27 -0
- package/dist/lib/auth/oauth/resource-url.mjs.map +1 -0
- package/dist/lib/auth/oauth/types.d.mts +7 -0
- package/dist/lib/auth/oauth/types.d.ts +7 -0
- package/dist/lib/auth/oauth/types.d.ts.map +1 -1
- package/dist/lib/auth/oauth/types.js.map +1 -1
- package/dist/lib/auth/oauth/types.mjs.map +1 -1
- package/dist/lib/auth/oauth/web-flow.d.mts +30 -5
- package/dist/lib/auth/oauth/web-flow.d.ts +30 -5
- package/dist/lib/auth/oauth/web-flow.d.ts.map +1 -1
- package/dist/lib/auth/oauth/web-flow.js +52 -8
- package/dist/lib/auth/oauth/web-flow.js.map +1 -1
- package/dist/lib/auth/oauth/web-flow.mjs +51 -8
- package/dist/lib/auth/oauth/web-flow.mjs.map +1 -1
- package/dist/lib/core/AgentClient.d.mts +2 -2
- package/dist/lib/core/AgentClient.d.ts +2 -2
- package/dist/lib/core/AgentClient.d.ts.map +1 -1
- package/dist/lib/core/AgentClient.js.map +1 -1
- package/dist/lib/core/AgentClient.mjs.map +1 -1
- package/dist/lib/registry/types.generated.d.mts +72 -9
- package/dist/lib/registry/types.generated.d.ts +72 -9
- package/dist/lib/registry/types.generated.d.ts.map +1 -1
- package/dist/lib/registry/types.generated.js.map +1 -1
- package/dist/lib/schemas-data/3.1/a2ui/bound-value.json +1 -1
- package/dist/lib/schemas-data/3.1/a2ui/component.json +1 -1
- package/dist/lib/schemas-data/3.1/a2ui/si-catalog.json +25 -25
- package/dist/lib/schemas-data/3.1/a2ui/surface.json +2 -2
- package/dist/lib/schemas-data/3.1/a2ui/user-action.json +1 -1
- package/dist/lib/schemas-data/3.1/aao/agent-publishers.json +1 -1
- package/dist/lib/schemas-data/3.1/account/get-account-financials-request.json +6 -6
- package/dist/lib/schemas-data/3.1/account/get-account-financials-response.json +12 -12
- package/dist/lib/schemas-data/3.1/account/list-accounts-request.json +6 -6
- package/dist/lib/schemas-data/3.1/account/list-accounts-response.json +8 -8
- package/dist/lib/schemas-data/3.1/account/report-usage-request.json +6 -6
- package/dist/lib/schemas-data/3.1/account/report-usage-response.json +6 -6
- package/dist/lib/schemas-data/3.1/account/sync-accounts-request.json +12 -12
- package/dist/lib/schemas-data/3.1/account/sync-accounts-response.json +16 -16
- package/dist/lib/schemas-data/3.1/account/sync-governance-request.json +6 -6
- package/dist/lib/schemas-data/3.1/account/sync-governance-response.json +10 -10
- package/dist/lib/schemas-data/3.1/adagents.json +29 -29
- package/dist/lib/schemas-data/3.1/brand/acquire-rights-request.json +10 -10
- package/dist/lib/schemas-data/3.1/brand/acquire-rights-response.json +16 -16
- package/dist/lib/schemas-data/3.1/brand/creative-approval-request.json +5 -5
- package/dist/lib/schemas-data/3.1/brand/creative-approval-response.json +12 -12
- package/dist/lib/schemas-data/3.1/brand/get-brand-identity-request.json +4 -4
- package/dist/lib/schemas-data/3.1/brand/get-brand-identity-response.json +10 -10
- package/dist/lib/schemas-data/3.1/brand/get-rights-request.json +8 -8
- package/dist/lib/schemas-data/3.1/brand/get-rights-response.json +11 -11
- package/dist/lib/schemas-data/3.1/brand/revocation-notification.json +4 -4
- package/dist/lib/schemas-data/3.1/brand/rights-pricing-option.json +5 -5
- package/dist/lib/schemas-data/3.1/brand/rights-terms.json +3 -3
- package/dist/lib/schemas-data/3.1/brand/search-brands-request.json +6 -6
- package/dist/lib/schemas-data/3.1/brand/search-brands-response.json +11 -11
- package/dist/lib/schemas-data/3.1/brand/update-rights-request.json +6 -6
- package/dist/lib/schemas-data/3.1/brand/update-rights-response.json +11 -11
- package/dist/lib/schemas-data/3.1/brand/verification-status.json +1 -1
- package/dist/lib/schemas-data/3.1/brand/verify-brand-claim-request.json +2 -2
- package/dist/lib/schemas-data/3.1/brand/verify-brand-claim-response.json +13 -13
- package/dist/lib/schemas-data/3.1/brand/verify-brand-claims-request.json +2 -2
- package/dist/lib/schemas-data/3.1/brand/verify-brand-claims-response.json +13 -13
- package/dist/lib/schemas-data/3.1/brand.json +21 -21
- package/dist/lib/schemas-data/3.1/bundled/content-standards/calibrate-content-request.json +12 -12
- package/dist/lib/schemas-data/3.1/bundled/content-standards/calibrate-content-response.json +12 -12
- package/dist/lib/schemas-data/3.1/bundled/content-standards/create-content-standards-request.json +16 -16
- package/dist/lib/schemas-data/3.1/bundled/content-standards/create-content-standards-response.json +10 -10
- package/dist/lib/schemas-data/3.1/bundled/content-standards/get-content-standards-request.json +5 -5
- package/dist/lib/schemas-data/3.1/bundled/content-standards/get-content-standards-response.json +23 -23
- package/dist/lib/schemas-data/3.1/bundled/content-standards/get-media-buy-artifacts-request.json +16 -16
- package/dist/lib/schemas-data/3.1/bundled/content-standards/get-media-buy-artifacts-response.json +18 -18
- package/dist/lib/schemas-data/3.1/bundled/content-standards/list-content-standards-request.json +7 -7
- package/dist/lib/schemas-data/3.1/bundled/content-standards/list-content-standards-response.json +24 -24
- package/dist/lib/schemas-data/3.1/bundled/content-standards/update-content-standards-request.json +16 -16
- package/dist/lib/schemas-data/3.1/bundled/content-standards/update-content-standards-response.json +10 -10
- package/dist/lib/schemas-data/3.1/bundled/content-standards/validate-content-delivery-request.json +12 -12
- package/dist/lib/schemas-data/3.1/bundled/content-standards/validate-content-delivery-response.json +12 -12
- package/dist/lib/schemas-data/3.1/bundled/core/tasks-get-request.json +16 -16
- package/dist/lib/schemas-data/3.1/bundled/core/tasks-get-response.json +181 -181
- package/dist/lib/schemas-data/3.1/bundled/core/tasks-list-request.json +21 -21
- package/dist/lib/schemas-data/3.1/bundled/core/tasks-list-response.json +11 -11
- package/dist/lib/schemas-data/3.1/bundled/creative/get-creative-delivery-request.json +17 -17
- package/dist/lib/schemas-data/3.1/bundled/creative/get-creative-delivery-response.json +56 -56
- package/dist/lib/schemas-data/3.1/bundled/creative/get-creative-features-request.json +44 -44
- package/dist/lib/schemas-data/3.1/bundled/creative/get-creative-features-response.json +13 -13
- package/dist/lib/schemas-data/3.1/bundled/creative/list-creative-formats-request.json +16 -16
- package/dist/lib/schemas-data/3.1/bundled/creative/list-creative-formats-response.json +48 -48
- package/dist/lib/schemas-data/3.1/bundled/creative/list-creatives-request.json +17 -17
- package/dist/lib/schemas-data/3.1/bundled/creative/list-creatives-response.json +58 -58
- package/dist/lib/schemas-data/3.1/bundled/creative/list-transformers-request.json +18 -18
- package/dist/lib/schemas-data/3.1/bundled/creative/list-transformers-response.json +16 -16
- package/dist/lib/schemas-data/3.1/bundled/creative/preview-creative-request.json +44 -44
- package/dist/lib/schemas-data/3.1/bundled/creative/preview-creative-response.json +50 -50
- package/dist/lib/schemas-data/3.1/bundled/creative/sync-creatives-request.json +46 -46
- package/dist/lib/schemas-data/3.1/bundled/creative/sync-creatives-response.json +27 -27
- package/dist/lib/schemas-data/3.1/bundled/creative/validate-input-request.json +42 -42
- package/dist/lib/schemas-data/3.1/bundled/creative/validate-input-response.json +10 -10
- package/dist/lib/schemas-data/3.1/bundled/media-buy/build-creative-request.json +53 -53
- package/dist/lib/schemas-data/3.1/bundled/media-buy/build-creative-response.json +54 -54
- package/dist/lib/schemas-data/3.1/bundled/media-buy/create-media-buy-request.json +83 -83
- package/dist/lib/schemas-data/3.1/bundled/media-buy/create-media-buy-response.json +77 -77
- package/dist/lib/schemas-data/3.1/bundled/media-buy/get-media-buy-delivery-request.json +25 -25
- package/dist/lib/schemas-data/3.1/bundled/media-buy/get-media-buy-delivery-response.json +40 -40
- package/dist/lib/schemas-data/3.1/bundled/media-buy/get-media-buys-request.json +18 -18
- package/dist/lib/schemas-data/3.1/bundled/media-buy/get-media-buys-response.json +65 -65
- package/dist/lib/schemas-data/3.1/bundled/media-buy/get-products-request.json +49 -49
- package/dist/lib/schemas-data/3.1/bundled/media-buy/get-products-response.json +99 -99
- package/dist/lib/schemas-data/3.1/bundled/media-buy/list-creative-formats-request.json +12 -12
- package/dist/lib/schemas-data/3.1/bundled/media-buy/list-creative-formats-response.json +48 -48
- package/dist/lib/schemas-data/3.1/bundled/media-buy/log-event-request.json +12 -12
- package/dist/lib/schemas-data/3.1/bundled/media-buy/log-event-response.json +10 -10
- package/dist/lib/schemas-data/3.1/bundled/media-buy/package-request.json +79 -79
- package/dist/lib/schemas-data/3.1/bundled/media-buy/provide-performance-feedback-request.json +8 -8
- package/dist/lib/schemas-data/3.1/bundled/media-buy/provide-performance-feedback-response.json +10 -10
- package/dist/lib/schemas-data/3.1/bundled/media-buy/sync-audiences-request.json +18 -18
- package/dist/lib/schemas-data/3.1/bundled/media-buy/sync-audiences-response.json +12 -12
- package/dist/lib/schemas-data/3.1/bundled/media-buy/sync-catalogs-request.json +26 -26
- package/dist/lib/schemas-data/3.1/bundled/media-buy/sync-catalogs-response.json +12 -12
- package/dist/lib/schemas-data/3.1/bundled/media-buy/sync-event-sources-request.json +19 -19
- package/dist/lib/schemas-data/3.1/bundled/media-buy/sync-event-sources-response.json +16 -16
- package/dist/lib/schemas-data/3.1/bundled/media-buy/update-media-buy-request.json +79 -79
- package/dist/lib/schemas-data/3.1/bundled/media-buy/update-media-buy-response.json +71 -71
- package/dist/lib/schemas-data/3.1/bundled/property/create-property-list-request.json +18 -18
- package/dist/lib/schemas-data/3.1/bundled/property/create-property-list-response.json +26 -26
- package/dist/lib/schemas-data/3.1/bundled/property/delete-property-list-request.json +16 -16
- package/dist/lib/schemas-data/3.1/bundled/property/delete-property-list-response.json +10 -10
- package/dist/lib/schemas-data/3.1/bundled/property/get-property-list-request.json +16 -16
- package/dist/lib/schemas-data/3.1/bundled/property/get-property-list-response.json +27 -27
- package/dist/lib/schemas-data/3.1/bundled/property/list-property-lists-request.json +17 -17
- package/dist/lib/schemas-data/3.1/bundled/property/list-property-lists-response.json +27 -27
- package/dist/lib/schemas-data/3.1/bundled/property/update-property-list-request.json +18 -18
- package/dist/lib/schemas-data/3.1/bundled/property/update-property-list-response.json +26 -26
- package/dist/lib/schemas-data/3.1/bundled/property/validate-property-delivery-request.json +19 -19
- package/dist/lib/schemas-data/3.1/bundled/property/validate-property-delivery-response.json +15 -15
- package/dist/lib/schemas-data/3.1/bundled/protocol/get-adcp-capabilities-request.json +5 -5
- package/dist/lib/schemas-data/3.1/bundled/protocol/get-adcp-capabilities-response.json +35 -35
- package/dist/lib/schemas-data/3.1/bundled/protocol/get-task-status-request.json +16 -16
- package/dist/lib/schemas-data/3.1/bundled/protocol/get-task-status-response.json +181 -181
- package/dist/lib/schemas-data/3.1/bundled/protocol/list-tasks-request.json +21 -21
- package/dist/lib/schemas-data/3.1/bundled/protocol/list-tasks-response.json +11 -11
- package/dist/lib/schemas-data/3.1/bundled/signals/activate-signal-request.json +17 -17
- package/dist/lib/schemas-data/3.1/bundled/signals/activate-signal-response.json +12 -12
- package/dist/lib/schemas-data/3.1/bundled/signals/get-signals-request.json +24 -24
- package/dist/lib/schemas-data/3.1/bundled/signals/get-signals-response.json +53 -53
- package/dist/lib/schemas-data/3.1/bundled/sponsored-intelligence/si-get-offering-request.json +5 -5
- package/dist/lib/schemas-data/3.1/bundled/sponsored-intelligence/si-get-offering-response.json +23 -23
- package/dist/lib/schemas-data/3.1/bundled/sponsored-intelligence/si-initiate-session-request.json +18 -18
- package/dist/lib/schemas-data/3.1/bundled/sponsored-intelligence/si-initiate-session-response.json +25 -25
- package/dist/lib/schemas-data/3.1/bundled/sponsored-intelligence/si-send-message-request.json +16 -16
- package/dist/lib/schemas-data/3.1/bundled/sponsored-intelligence/si-send-message-response.json +26 -26
- package/dist/lib/schemas-data/3.1/bundled/sponsored-intelligence/si-terminate-session-request.json +5 -5
- package/dist/lib/schemas-data/3.1/bundled/sponsored-intelligence/si-terminate-session-response.json +11 -11
- package/dist/lib/schemas-data/3.1/collection/base-collection-source.json +3 -3
- package/dist/lib/schemas-data/3.1/collection/collection-list-changed-webhook.json +2 -2
- package/dist/lib/schemas-data/3.1/collection/collection-list-filters.json +7 -7
- package/dist/lib/schemas-data/3.1/collection/collection-list.json +5 -5
- package/dist/lib/schemas-data/3.1/collection/create-collection-list-request.json +8 -8
- package/dist/lib/schemas-data/3.1/collection/create-collection-list-response.json +6 -6
- package/dist/lib/schemas-data/3.1/collection/delete-collection-list-request.json +5 -5
- package/dist/lib/schemas-data/3.1/collection/delete-collection-list-response.json +5 -5
- package/dist/lib/schemas-data/3.1/collection/get-collection-list-request.json +5 -5
- package/dist/lib/schemas-data/3.1/collection/get-collection-list-response.json +12 -12
- package/dist/lib/schemas-data/3.1/collection/list-collection-lists-request.json +6 -6
- package/dist/lib/schemas-data/3.1/collection/list-collection-lists-response.json +7 -7
- package/dist/lib/schemas-data/3.1/collection/update-collection-list-request.json +8 -8
- package/dist/lib/schemas-data/3.1/collection/update-collection-list-response.json +6 -6
- package/dist/lib/schemas-data/3.1/content-standards/artifact-webhook-payload.json +3 -3
- package/dist/lib/schemas-data/3.1/content-standards/artifact.json +7 -7
- package/dist/lib/schemas-data/3.1/content-standards/calibrate-content-request.json +5 -5
- package/dist/lib/schemas-data/3.1/content-standards/calibrate-content-response.json +10 -10
- package/dist/lib/schemas-data/3.1/content-standards/content-standards.json +7 -7
- package/dist/lib/schemas-data/3.1/content-standards/create-content-standards-request.json +8 -8
- package/dist/lib/schemas-data/3.1/content-standards/create-content-standards-response.json +8 -8
- package/dist/lib/schemas-data/3.1/content-standards/get-content-standards-request.json +4 -4
- package/dist/lib/schemas-data/3.1/content-standards/get-content-standards-response.json +9 -9
- package/dist/lib/schemas-data/3.1/content-standards/get-media-buy-artifacts-request.json +5 -5
- package/dist/lib/schemas-data/3.1/content-standards/get-media-buy-artifacts-response.json +10 -10
- package/dist/lib/schemas-data/3.1/content-standards/list-content-standards-request.json +6 -6
- package/dist/lib/schemas-data/3.1/content-standards/list-content-standards-response.json +10 -10
- package/dist/lib/schemas-data/3.1/content-standards/update-content-standards-request.json +8 -8
- package/dist/lib/schemas-data/3.1/content-standards/update-content-standards-response.json +8 -8
- package/dist/lib/schemas-data/3.1/content-standards/validate-content-delivery-request.json +5 -5
- package/dist/lib/schemas-data/3.1/content-standards/validate-content-delivery-response.json +10 -10
- package/dist/lib/schemas-data/3.1/core/account-authorization.json +1 -1
- package/dist/lib/schemas-data/3.1/core/account-ref.json +2 -2
- package/dist/lib/schemas-data/3.1/core/account-with-authorization.json +3 -3
- package/dist/lib/schemas-data/3.1/core/account.json +10 -10
- package/dist/lib/schemas-data/3.1/core/activation-key.json +1 -1
- package/dist/lib/schemas-data/3.1/core/ad-inventory-config.json +1 -1
- package/dist/lib/schemas-data/3.1/core/agent-encryption-key.json +1 -1
- package/dist/lib/schemas-data/3.1/core/agent-signing-key.json +1 -1
- package/dist/lib/schemas-data/3.1/core/app-item.json +4 -4
- package/dist/lib/schemas-data/3.1/core/asset-group-vocabulary.json +1 -1
- package/dist/lib/schemas-data/3.1/core/assets/asset-union.json +21 -21
- package/dist/lib/schemas-data/3.1/core/assets/audio-asset.json +3 -3
- package/dist/lib/schemas-data/3.1/core/assets/brief-asset.json +2 -2
- package/dist/lib/schemas-data/3.1/core/assets/card-asset.json +6 -6
- package/dist/lib/schemas-data/3.1/core/assets/catalog-asset.json +2 -2
- package/dist/lib/schemas-data/3.1/core/assets/css-asset.json +2 -2
- package/dist/lib/schemas-data/3.1/core/assets/daast-asset.json +4 -4
- package/dist/lib/schemas-data/3.1/core/assets/daast-tracker-asset.json +3 -3
- package/dist/lib/schemas-data/3.1/core/assets/html-asset.json +2 -2
- package/dist/lib/schemas-data/3.1/core/assets/image-asset.json +2 -2
- package/dist/lib/schemas-data/3.1/core/assets/javascript-asset.json +3 -3
- package/dist/lib/schemas-data/3.1/core/assets/markdown-asset.json +2 -2
- package/dist/lib/schemas-data/3.1/core/assets/pixel-tracker-asset.json +2 -2
- package/dist/lib/schemas-data/3.1/core/assets/published-post-asset.json +2 -2
- package/dist/lib/schemas-data/3.1/core/assets/text-asset.json +2 -2
- package/dist/lib/schemas-data/3.1/core/assets/url-asset.json +3 -3
- package/dist/lib/schemas-data/3.1/core/assets/vast-asset.json +4 -4
- package/dist/lib/schemas-data/3.1/core/assets/vast-tracker-asset.json +3 -3
- package/dist/lib/schemas-data/3.1/core/assets/video-asset.json +7 -7
- package/dist/lib/schemas-data/3.1/core/assets/webhook-asset.json +7 -7
- package/dist/lib/schemas-data/3.1/core/assets/zip-asset.json +2 -2
- package/dist/lib/schemas-data/3.1/core/async-response-data.json +29 -29
- package/dist/lib/schemas-data/3.1/core/async-response-refs/creative/sync-creatives-async-response-input-required.json +3 -3
- package/dist/lib/schemas-data/3.1/core/async-response-refs/creative/sync-creatives-async-response-submitted.json +4 -4
- package/dist/lib/schemas-data/3.1/core/async-response-refs/creative/sync-creatives-async-response-working.json +3 -3
- package/dist/lib/schemas-data/3.1/core/async-response-refs/media-buy/build-creative-async-response-input-required.json +4 -4
- package/dist/lib/schemas-data/3.1/core/async-response-refs/media-buy/build-creative-async-response-submitted.json +4 -4
- package/dist/lib/schemas-data/3.1/core/async-response-refs/media-buy/build-creative-async-response-working.json +3 -3
- package/dist/lib/schemas-data/3.1/core/async-response-refs/media-buy/create-media-buy-async-response-input-required.json +4 -4
- package/dist/lib/schemas-data/3.1/core/async-response-refs/media-buy/create-media-buy-async-response-submitted.json +4 -4
- package/dist/lib/schemas-data/3.1/core/async-response-refs/media-buy/create-media-buy-async-response-working.json +3 -3
- package/dist/lib/schemas-data/3.1/core/async-response-refs/media-buy/get-products-async-response-input-required.json +4 -4
- package/dist/lib/schemas-data/3.1/core/async-response-refs/media-buy/get-products-async-response-submitted.json +4 -4
- package/dist/lib/schemas-data/3.1/core/async-response-refs/media-buy/get-products-async-response-working.json +3 -3
- package/dist/lib/schemas-data/3.1/core/async-response-refs/media-buy/sync-catalogs-async-response-input-required.json +3 -3
- package/dist/lib/schemas-data/3.1/core/async-response-refs/media-buy/sync-catalogs-async-response-submitted.json +4 -4
- package/dist/lib/schemas-data/3.1/core/async-response-refs/media-buy/sync-catalogs-async-response-working.json +3 -3
- package/dist/lib/schemas-data/3.1/core/async-response-refs/media-buy/update-media-buy-async-response-input-required.json +3 -3
- package/dist/lib/schemas-data/3.1/core/async-response-refs/media-buy/update-media-buy-async-response-submitted.json +4 -4
- package/dist/lib/schemas-data/3.1/core/async-response-refs/media-buy/update-media-buy-async-response-working.json +3 -3
- package/dist/lib/schemas-data/3.1/core/async-response-refs/signals/get-signals-async-response-submitted.json +4 -4
- package/dist/lib/schemas-data/3.1/core/async-response-refs/signals/get-signals-async-response-working.json +3 -3
- package/dist/lib/schemas-data/3.1/core/attribution-window.json +4 -4
- package/dist/lib/schemas-data/3.1/core/audience-member.json +3 -3
- package/dist/lib/schemas-data/3.1/core/audience-selector.json +7 -7
- package/dist/lib/schemas-data/3.1/core/authorized-agent-base.json +3 -3
- package/dist/lib/schemas-data/3.1/core/brand-id.json +1 -1
- package/dist/lib/schemas-data/3.1/core/brand-ref.json +3 -3
- package/dist/lib/schemas-data/3.1/core/business-entity.json +2 -2
- package/dist/lib/schemas-data/3.1/core/cancellation-policy.json +2 -2
- package/dist/lib/schemas-data/3.1/core/canonical-format-kind.json +1 -1
- package/dist/lib/schemas-data/3.1/core/canonical-projection-ref.json +3 -3
- package/dist/lib/schemas-data/3.1/core/canonical-projection-slot-override.json +1 -1
- package/dist/lib/schemas-data/3.1/core/catalog-field-mapping.json +2 -2
- package/dist/lib/schemas-data/3.1/core/catalog-item-delivery-metrics.json +3 -3
- package/dist/lib/schemas-data/3.1/core/catalog.json +7 -7
- package/dist/lib/schemas-data/3.1/core/catchment.json +5 -5
- package/dist/lib/schemas-data/3.1/core/collection-distribution.json +2 -2
- package/dist/lib/schemas-data/3.1/core/collection-list-ref.json +1 -1
- package/dist/lib/schemas-data/3.1/core/collection-selector.json +1 -1
- package/dist/lib/schemas-data/3.1/core/collection.json +13 -13
- package/dist/lib/schemas-data/3.1/core/committed-metric.json +9 -9
- package/dist/lib/schemas-data/3.1/core/content-rating.json +2 -2
- package/dist/lib/schemas-data/3.1/core/context.json +1 -1
- package/dist/lib/schemas-data/3.1/core/creative-asset.json +10 -10
- package/dist/lib/schemas-data/3.1/core/creative-assignment.json +2 -2
- package/dist/lib/schemas-data/3.1/core/creative-brief.json +4 -4
- package/dist/lib/schemas-data/3.1/core/creative-consumption.json +1 -1
- package/dist/lib/schemas-data/3.1/core/creative-delivery-metrics.json +2 -2
- package/dist/lib/schemas-data/3.1/core/creative-filters.json +5 -5
- package/dist/lib/schemas-data/3.1/core/creative-item.json +1 -1
- package/dist/lib/schemas-data/3.1/core/creative-manifest.json +11 -11
- package/dist/lib/schemas-data/3.1/core/creative-policy.json +3 -3
- package/dist/lib/schemas-data/3.1/core/creative-variable.json +1 -1
- package/dist/lib/schemas-data/3.1/core/creative-variant.json +5 -5
- package/dist/lib/schemas-data/3.1/core/data-provider-signal-selector.json +1 -1
- package/dist/lib/schemas-data/3.1/core/date-range.json +1 -1
- package/dist/lib/schemas-data/3.1/core/datetime-range.json +1 -1
- package/dist/lib/schemas-data/3.1/core/daypart-target.json +2 -2
- package/dist/lib/schemas-data/3.1/core/deadline-policy.json +1 -1
- package/dist/lib/schemas-data/3.1/core/delivery-forecast.json +7 -7
- package/dist/lib/schemas-data/3.1/core/delivery-metric-aggregate.json +9 -9
- package/dist/lib/schemas-data/3.1/core/delivery-metrics.json +8 -8
- package/dist/lib/schemas-data/3.1/core/deployment.json +3 -3
- package/dist/lib/schemas-data/3.1/core/destination-item.json +4 -4
- package/dist/lib/schemas-data/3.1/core/destination.json +1 -1
- package/dist/lib/schemas-data/3.1/core/diagnostic-issue.json +1 -1
- package/dist/lib/schemas-data/3.1/core/downstream-connection-requirement.json +1 -1
- package/dist/lib/schemas-data/3.1/core/duration.json +1 -1
- package/dist/lib/schemas-data/3.1/core/education-item.json +4 -4
- package/dist/lib/schemas-data/3.1/core/error.json +1 -1
- package/dist/lib/schemas-data/3.1/core/evaluator-spec.json +5 -5
- package/dist/lib/schemas-data/3.1/core/event-custom-data.json +2 -2
- package/dist/lib/schemas-data/3.1/core/event-source-health.json +3 -3
- package/dist/lib/schemas-data/3.1/core/event-surface.json +2 -2
- package/dist/lib/schemas-data/3.1/core/event.json +8 -8
- package/dist/lib/schemas-data/3.1/core/ext.json +1 -1
- package/dist/lib/schemas-data/3.1/core/feature-requirement.json +1 -1
- package/dist/lib/schemas-data/3.1/core/flight-item.json +4 -4
- package/dist/lib/schemas-data/3.1/core/forecast-dimension-audience.json +2 -2
- package/dist/lib/schemas-data/3.1/core/forecast-dimension-device-platform.json +2 -2
- package/dist/lib/schemas-data/3.1/core/forecast-dimension-device-type.json +2 -2
- package/dist/lib/schemas-data/3.1/core/forecast-dimension-geo.json +5 -5
- package/dist/lib/schemas-data/3.1/core/forecast-dimension-placement.json +2 -2
- package/dist/lib/schemas-data/3.1/core/forecast-dimension-signal.json +2 -2
- package/dist/lib/schemas-data/3.1/core/forecast-point-dimensions.json +7 -7
- package/dist/lib/schemas-data/3.1/core/forecast-point.json +27 -27
- package/dist/lib/schemas-data/3.1/core/forecast-range.json +1 -1
- package/dist/lib/schemas-data/3.1/core/forecast-vendor-metric-value.json +5 -5
- package/dist/lib/schemas-data/3.1/core/format-id.json +1 -1
- package/dist/lib/schemas-data/3.1/core/format-option-ref.json +1 -1
- package/dist/lib/schemas-data/3.1/core/format-shape-vocabulary.json +1 -1
- package/dist/lib/schemas-data/3.1/core/format.json +44 -44
- package/dist/lib/schemas-data/3.1/core/frequency-cap.json +4 -4
- package/dist/lib/schemas-data/3.1/core/generation-credential.json +3 -3
- package/dist/lib/schemas-data/3.1/core/geo-breakdown-support.json +3 -3
- package/dist/lib/schemas-data/3.1/core/geo-delivery-metrics.json +6 -6
- package/dist/lib/schemas-data/3.1/core/hotel-item.json +4 -4
- package/dist/lib/schemas-data/3.1/core/identifier.json +2 -2
- package/dist/lib/schemas-data/3.1/core/impairment.json +3 -3
- package/dist/lib/schemas-data/3.1/core/industry-identifier.json +2 -2
- package/dist/lib/schemas-data/3.1/core/insertion-order.json +1 -1
- package/dist/lib/schemas-data/3.1/core/installment-deadlines.json +2 -2
- package/dist/lib/schemas-data/3.1/core/installment.json +9 -9
- package/dist/lib/schemas-data/3.1/core/job-item.json +3 -3
- package/dist/lib/schemas-data/3.1/core/keyword-delivery-metrics.json +3 -3
- package/dist/lib/schemas-data/3.1/core/limited-series.json +1 -1
- package/dist/lib/schemas-data/3.1/core/material-deadline.json +1 -1
- package/dist/lib/schemas-data/3.1/core/mcp-webhook-payload.json +5 -5
- package/dist/lib/schemas-data/3.1/core/measurement-readiness.json +5 -5
- package/dist/lib/schemas-data/3.1/core/measurement-terms.json +3 -3
- package/dist/lib/schemas-data/3.1/core/measurement-window.json +1 -1
- package/dist/lib/schemas-data/3.1/core/media-buy-available-action.json +4 -4
- package/dist/lib/schemas-data/3.1/core/media-buy-features.json +1 -1
- package/dist/lib/schemas-data/3.1/core/media-buy.json +10 -10
- package/dist/lib/schemas-data/3.1/core/missing-metric.json +9 -9
- package/dist/lib/schemas-data/3.1/core/notification-config.json +4 -4
- package/dist/lib/schemas-data/3.1/core/offering-asset-group.json +16 -16
- package/dist/lib/schemas-data/3.1/core/offering.json +5 -5
- package/dist/lib/schemas-data/3.1/core/optimization-goal.json +7 -7
- package/dist/lib/schemas-data/3.1/core/outcome-measurement.json +2 -2
- package/dist/lib/schemas-data/3.1/core/overlay.json +1 -1
- package/dist/lib/schemas-data/3.1/core/package-signal-targeting-group.json +2 -2
- package/dist/lib/schemas-data/3.1/core/package-signal-targeting-groups.json +2 -2
- package/dist/lib/schemas-data/3.1/core/package-signal-targeting.json +3 -3
- package/dist/lib/schemas-data/3.1/core/package.json +17 -17
- package/dist/lib/schemas-data/3.1/core/pagination-request.json +1 -1
- package/dist/lib/schemas-data/3.1/core/pagination-response.json +1 -1
- package/dist/lib/schemas-data/3.1/core/performance-feedback.json +12 -12
- package/dist/lib/schemas-data/3.1/core/performance-standard.json +4 -4
- package/dist/lib/schemas-data/3.1/core/placement-definition.json +10 -10
- package/dist/lib/schemas-data/3.1/core/placement-ref.json +1 -1
- package/dist/lib/schemas-data/3.1/core/placement.json +7 -7
- package/dist/lib/schemas-data/3.1/core/planned-delivery.json +5 -5
- package/dist/lib/schemas-data/3.1/core/platform-extension-ref.json +1 -1
- package/dist/lib/schemas-data/3.1/core/postal-area-support.json +2 -2
- package/dist/lib/schemas-data/3.1/core/postal-area.json +4 -4
- package/dist/lib/schemas-data/3.1/core/postal-country-system.json +2 -2
- package/dist/lib/schemas-data/3.1/core/price.json +1 -1
- package/dist/lib/schemas-data/3.1/core/pricing-option.json +10 -10
- package/dist/lib/schemas-data/3.1/core/product-allocation.json +4 -4
- package/dist/lib/schemas-data/3.1/core/product-allowed-action.json +5 -5
- package/dist/lib/schemas-data/3.1/core/product-filters.json +27 -27
- package/dist/lib/schemas-data/3.1/core/product-format-declaration.json +16 -16
- package/dist/lib/schemas-data/3.1/core/product-signal-targeting-option.json +3 -3
- package/dist/lib/schemas-data/3.1/core/product.json +40 -40
- package/dist/lib/schemas-data/3.1/core/property-id.json +1 -1
- package/dist/lib/schemas-data/3.1/core/property-list-ref.json +1 -1
- package/dist/lib/schemas-data/3.1/core/property-tag.json +1 -1
- package/dist/lib/schemas-data/3.1/core/property.json +6 -6
- package/dist/lib/schemas-data/3.1/core/proposal.json +6 -6
- package/dist/lib/schemas-data/3.1/core/protocol-envelope.json +5 -5
- package/dist/lib/schemas-data/3.1/core/provenance.json +9 -9
- package/dist/lib/schemas-data/3.1/core/publisher-property-selector.json +3 -3
- package/dist/lib/schemas-data/3.1/core/push-notification-config.json +2 -2
- package/dist/lib/schemas-data/3.1/core/real-estate-item.json +4 -4
- package/dist/lib/schemas-data/3.1/core/reference-asset.json +1 -1
- package/dist/lib/schemas-data/3.1/core/registry-event.json +13 -13
- package/dist/lib/schemas-data/3.1/core/registry-feed-response.json +2 -2
- package/dist/lib/schemas-data/3.1/core/reporting-capabilities.json +8 -8
- package/dist/lib/schemas-data/3.1/core/reporting-webhook.json +3 -3
- package/dist/lib/schemas-data/3.1/core/requirements/asset-requirements.json +13 -13
- package/dist/lib/schemas-data/3.1/core/requirements/audio-asset-requirements.json +1 -1
- package/dist/lib/schemas-data/3.1/core/requirements/catalog-field-binding.json +4 -4
- package/dist/lib/schemas-data/3.1/core/requirements/catalog-requirements.json +5 -5
- package/dist/lib/schemas-data/3.1/core/requirements/css-asset-requirements.json +1 -1
- package/dist/lib/schemas-data/3.1/core/requirements/daast-asset-requirements.json +1 -1
- package/dist/lib/schemas-data/3.1/core/requirements/html-asset-requirements.json +1 -1
- package/dist/lib/schemas-data/3.1/core/requirements/image-asset-requirements.json +2 -2
- package/dist/lib/schemas-data/3.1/core/requirements/javascript-asset-requirements.json +1 -1
- package/dist/lib/schemas-data/3.1/core/requirements/markdown-asset-requirements.json +1 -1
- package/dist/lib/schemas-data/3.1/core/requirements/offering-asset-constraint.json +4 -4
- package/dist/lib/schemas-data/3.1/core/requirements/text-asset-requirements.json +1 -1
- package/dist/lib/schemas-data/3.1/core/requirements/url-asset-requirements.json +1 -1
- package/dist/lib/schemas-data/3.1/core/requirements/vast-asset-requirements.json +1 -1
- package/dist/lib/schemas-data/3.1/core/requirements/video-asset-requirements.json +6 -6
- package/dist/lib/schemas-data/3.1/core/requirements/webhook-asset-requirements.json +1 -1
- package/dist/lib/schemas-data/3.1/core/response-payload-jws-envelope.json +1 -1
- package/dist/lib/schemas-data/3.1/core/response.json +1 -1
- package/dist/lib/schemas-data/3.1/core/rights-constraint.json +4 -4
- package/dist/lib/schemas-data/3.1/core/seller-agent-ref.json +1 -1
- package/dist/lib/schemas-data/3.1/core/signal-coverage-forecast.json +5 -5
- package/dist/lib/schemas-data/3.1/core/signal-definition-enrichment.json +4 -4
- package/dist/lib/schemas-data/3.1/core/signal-definition.json +5 -5
- package/dist/lib/schemas-data/3.1/core/signal-filters.json +3 -3
- package/dist/lib/schemas-data/3.1/core/signal-id.json +1 -1
- package/dist/lib/schemas-data/3.1/core/signal-listing.json +4 -4
- package/dist/lib/schemas-data/3.1/core/signal-modeling-disclosure.json +1 -1
- package/dist/lib/schemas-data/3.1/core/signal-pricing-option.json +2 -2
- package/dist/lib/schemas-data/3.1/core/signal-pricing.json +6 -6
- package/dist/lib/schemas-data/3.1/core/signal-ref.json +1 -1
- package/dist/lib/schemas-data/3.1/core/signal-selection-group-rule.json +1 -1
- package/dist/lib/schemas-data/3.1/core/signal-targeting-expression.json +4 -4
- package/dist/lib/schemas-data/3.1/core/signal-targeting-rules.json +2 -2
- package/dist/lib/schemas-data/3.1/core/signal-targeting.json +7 -7
- package/dist/lib/schemas-data/3.1/core/sla-window.json +1 -1
- package/dist/lib/schemas-data/3.1/core/special.json +2 -2
- package/dist/lib/schemas-data/3.1/core/start-timing.json +1 -1
- package/dist/lib/schemas-data/3.1/core/store-item.json +3 -3
- package/dist/lib/schemas-data/3.1/core/talent.json +2 -2
- package/dist/lib/schemas-data/3.1/core/targeting.json +22 -22
- package/dist/lib/schemas-data/3.1/core/tasks-get-request.json +5 -5
- package/dist/lib/schemas-data/3.1/core/tasks-get-response.json +10 -10
- package/dist/lib/schemas-data/3.1/core/tasks-list-request.json +13 -13
- package/dist/lib/schemas-data/3.1/core/tasks-list-response.json +8 -8
- package/dist/lib/schemas-data/3.1/core/transformer-param.json +1 -1
- package/dist/lib/schemas-data/3.1/core/transformer.json +5 -5
- package/dist/lib/schemas-data/3.1/core/truncation-sentinel.json +1 -1
- package/dist/lib/schemas-data/3.1/core/user-match.json +3 -3
- package/dist/lib/schemas-data/3.1/core/vehicle-item.json +4 -4
- package/dist/lib/schemas-data/3.1/core/vendor-metric-id.json +1 -1
- package/dist/lib/schemas-data/3.1/core/vendor-metric-optimization-supported-metric.json +3 -3
- package/dist/lib/schemas-data/3.1/core/vendor-metric-optimization.json +2 -2
- package/dist/lib/schemas-data/3.1/core/vendor-metric-value.json +3 -3
- package/dist/lib/schemas-data/3.1/core/vendor-pricing-option.json +3 -3
- package/dist/lib/schemas-data/3.1/core/version-envelope.json +1 -1
- package/dist/lib/schemas-data/3.1/core/webhook-activity-record.json +3 -3
- package/dist/lib/schemas-data/3.1/core/webhook-challenge-response.json +1 -1
- package/dist/lib/schemas-data/3.1/core/webhook-challenge.json +2 -2
- package/dist/lib/schemas-data/3.1/core/wholesale-feed-event.json +17 -17
- package/dist/lib/schemas-data/3.1/core/wholesale-feed-webhook.json +3 -3
- package/dist/lib/schemas-data/3.1/core/x-entity-types.json +1 -1
- package/dist/lib/schemas-data/3.1/creative/asset-types/index.json +6 -6
- package/dist/lib/schemas-data/3.1/creative/audit-observation.json +2 -2
- package/dist/lib/schemas-data/3.1/creative/creative-feature-result.json +2 -2
- package/dist/lib/schemas-data/3.1/creative/creative-purged-webhook.json +3 -3
- package/dist/lib/schemas-data/3.1/creative/creative-status-changed-webhook.json +4 -4
- package/dist/lib/schemas-data/3.1/creative/get-creative-delivery-request.json +6 -6
- package/dist/lib/schemas-data/3.1/creative/get-creative-delivery-response.json +9 -9
- package/dist/lib/schemas-data/3.1/creative/get-creative-features-request.json +6 -6
- package/dist/lib/schemas-data/3.1/creative/get-creative-features-response.json +11 -11
- package/dist/lib/schemas-data/3.1/creative/list-creative-formats-request.json +13 -13
- package/dist/lib/schemas-data/3.1/creative/list-creative-formats-response.json +9 -9
- package/dist/lib/schemas-data/3.1/creative/list-creatives-request.json +9 -9
- package/dist/lib/schemas-data/3.1/creative/list-creatives-response.json +21 -21
- package/dist/lib/schemas-data/3.1/creative/list-transformers-request.json +8 -8
- package/dist/lib/schemas-data/3.1/creative/list-transformers-response.json +8 -8
- package/dist/lib/schemas-data/3.1/creative/preview-creative-request.json +12 -12
- package/dist/lib/schemas-data/3.1/creative/preview-creative-response.json +14 -14
- package/dist/lib/schemas-data/3.1/creative/preview-render.json +1 -1
- package/dist/lib/schemas-data/3.1/creative/sync-creatives-async-response-input-required.json +3 -3
- package/dist/lib/schemas-data/3.1/creative/sync-creatives-async-response-submitted.json +4 -4
- package/dist/lib/schemas-data/3.1/creative/sync-creatives-async-response-working.json +3 -3
- package/dist/lib/schemas-data/3.1/creative/sync-creatives-request.json +8 -8
- package/dist/lib/schemas-data/3.1/creative/sync-creatives-response.json +15 -15
- package/dist/lib/schemas-data/3.1/creative/validate-input-request.json +4 -4
- package/dist/lib/schemas-data/3.1/creative/validate-input-response.json +4 -4
- package/dist/lib/schemas-data/3.1/creative/validate-input-result.json +1 -1
- package/dist/lib/schemas-data/3.1/creative/video-brief.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/account-scope.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/account-status.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/action-not-allowed-reason.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/action-source.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/adcp-protocol.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/adjustment-kind.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/advertiser-industry.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/age-verification-method.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/assessment-status.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/asset-content-type.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/attestation-claim.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/attribution-methodology.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/attribution-model.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/audience-source.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/audience-status.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/audio-channel-layout.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/audio-distribution-type.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/auth-scheme.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/available-metric.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/billing-party.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/binary-verdict.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/brand-agent-type.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/c2pa-watermark-action.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/canceled-by.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/catalog-action.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/catalog-item-status.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/catalog-type.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/channels.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/cloud-storage-protocol.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/co-branding-requirement.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/collection-cadence.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/collection-kind.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/collection-relationship.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/collection-status.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/completion-source.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/consent-basis.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/content-id-type.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/content-rating-system.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/creative-action.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/creative-agent-capability.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/creative-approval-status.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/creative-event-reason-code.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/creative-identifier-type.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/creative-quality.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/creative-selection-strategy.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/creative-sort-field.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/creative-status.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/daast-tracking-event.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/daast-version.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/day-of-week.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/delegation-authority.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/delivery-type.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/demographic-system.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/derivative-type.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/device-platform.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/device-type.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/digital-source-type.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/dimension-unit.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/disclosure-persistence.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/disclosure-position.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/distance-unit.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/distribution-identifier-type.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/embedded-provenance-method.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/error-code.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/error-scope.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/escalation-severity.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/event-type.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/exclusivity.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/feature-check-status.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/feed-format.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/feedback-source.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/forecast-method.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/forecast-range-unit.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/forecastable-metric.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/format-id-parameter.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/frame-rate-type.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/frequency-cap-scope.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/genre-taxonomy.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/geo-level.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/gop-type.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/governance-decision.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/governance-domain.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/governance-mode.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/governance-phase.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/history-entry-type.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/http-method.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/identifier-types.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/impairment-offline-state.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/impairment-reason-code.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/installment-status.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/javascript-module-type.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/landing-page-requirement.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/legacy-postal-system.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/lift-dimension.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/logo-slot.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/makegood-remedy.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/markdown-flavor.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/match-id-type.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/match-type.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/media-buy-action-mode.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/media-buy-health.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/media-buy-status.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/media-buy-valid-action.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/metric-scope.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/metric-type.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/metro-system.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/moov-atom-position.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/notification-type.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/offering-availability-status.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/outcome-type.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/pacing.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/payment-terms.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/performance-standard-metric.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/policy-category.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/policy-enforcement.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/postal-system.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/preview-output-format.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/pricing-model.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/production-quality.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/property-type.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/proposal-status.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/publisher-identifier-types.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/purchase-type.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/reach-unit.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/reporting-frequency.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/response-type.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/restricted-attribute.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/right-type.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/right-use.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/rights-billing-period.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/scan-type.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/si-session-status.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/signal-catalog-type.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/signal-source.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/signal-value-type.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/snapshot-unavailable-reason.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/social-placement-surface.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/sort-direction.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/sort-metric.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/special-category.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/specialism.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/sponsored-placement-type.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/talent-role.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/task-status.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/task-type.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/transport-mode.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/travel-time-unit.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/uid-type.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/universal-macro.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/update-frequency.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/url-asset-type.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/validation-mode.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/vast-tracking-event.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/vast-version.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/video-placement-type.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/viewability-standard.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/watermark-media-type.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/wcag-level.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/webhook-response-type.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/webhook-security-method.json +1 -1
- package/dist/lib/schemas-data/3.1/error-details/account-setup-required.json +1 -1
- package/dist/lib/schemas-data/3.1/error-details/action-not-allowed.json +4 -4
- package/dist/lib/schemas-data/3.1/error-details/agent-permission-denied.json +1 -1
- package/dist/lib/schemas-data/3.1/error-details/audience-too-small.json +1 -1
- package/dist/lib/schemas-data/3.1/error-details/authorization-required.json +3 -3
- package/dist/lib/schemas-data/3.1/error-details/billing-not-permitted-for-agent.json +3 -3
- package/dist/lib/schemas-data/3.1/error-details/billing-not-supported.json +2 -2
- package/dist/lib/schemas-data/3.1/error-details/budget-too-low.json +1 -1
- package/dist/lib/schemas-data/3.1/error-details/conflict.json +1 -1
- package/dist/lib/schemas-data/3.1/error-details/creative-rejected.json +1 -1
- package/dist/lib/schemas-data/3.1/error-details/policy-violation.json +1 -1
- package/dist/lib/schemas-data/3.1/error-details/rate-limited.json +1 -1
- package/dist/lib/schemas-data/3.1/error-details/stale-response.json +1 -1
- package/dist/lib/schemas-data/3.1/error-details/vendor-error-codes.json +1 -1
- package/dist/lib/schemas-data/3.1/error-details/version-unsupported.json +2 -2
- package/dist/lib/schemas-data/3.1/extensions/extension-meta.json +1 -1
- package/dist/lib/schemas-data/3.1/extensions/index.json +2 -2
- package/dist/lib/schemas-data/3.1/formats/canonical/_base.json +5 -5
- package/dist/lib/schemas-data/3.1/formats/canonical/agent_placement.json +2 -2
- package/dist/lib/schemas-data/3.1/formats/canonical/audio_daast.json +2 -2
- package/dist/lib/schemas-data/3.1/formats/canonical/audio_hosted.json +2 -2
- package/dist/lib/schemas-data/3.1/formats/canonical/display_tag.json +2 -2
- package/dist/lib/schemas-data/3.1/formats/canonical/html5.json +2 -2
- package/dist/lib/schemas-data/3.1/formats/canonical/image.json +2 -2
- package/dist/lib/schemas-data/3.1/formats/canonical/image_carousel.json +2 -2
- package/dist/lib/schemas-data/3.1/formats/canonical/native_in_feed.json +2 -2
- package/dist/lib/schemas-data/3.1/formats/canonical/responsive_creative.json +2 -2
- package/dist/lib/schemas-data/3.1/formats/canonical/sponsored_placement.json +2 -2
- package/dist/lib/schemas-data/3.1/formats/canonical/video_hosted.json +2 -2
- package/dist/lib/schemas-data/3.1/formats/canonical/video_vast.json +2 -2
- package/dist/lib/schemas-data/3.1/governance/attribute-definition.json +1 -1
- package/dist/lib/schemas-data/3.1/governance/audience-constraints.json +3 -3
- package/dist/lib/schemas-data/3.1/governance/check-governance-request.json +8 -8
- package/dist/lib/schemas-data/3.1/governance/check-governance-response.json +7 -7
- package/dist/lib/schemas-data/3.1/governance/get-plan-audit-logs-request.json +5 -5
- package/dist/lib/schemas-data/3.1/governance/get-plan-audit-logs-response.json +11 -11
- package/dist/lib/schemas-data/3.1/governance/policy-category-definition.json +2 -2
- package/dist/lib/schemas-data/3.1/governance/policy-entry.json +6 -6
- package/dist/lib/schemas-data/3.1/governance/policy-ref.json +1 -1
- package/dist/lib/schemas-data/3.1/governance/report-plan-outcome-request.json +7 -7
- package/dist/lib/schemas-data/3.1/governance/report-plan-outcome-response.json +5 -5
- package/dist/lib/schemas-data/3.1/governance/sync-plans-request.json +14 -14
- package/dist/lib/schemas-data/3.1/governance/sync-plans-response.json +6 -6
- package/dist/lib/schemas-data/3.1/index.json +452 -440
- package/dist/lib/schemas-data/3.1/manifest.json +3 -3
- package/dist/lib/schemas-data/3.1/manifest.schema.json +1 -1
- package/dist/lib/schemas-data/3.1/media-buy/build-creative-async-response-input-required.json +4 -4
- package/dist/lib/schemas-data/3.1/media-buy/build-creative-async-response-submitted.json +4 -4
- package/dist/lib/schemas-data/3.1/media-buy/build-creative-async-response-working.json +3 -3
- package/dist/lib/schemas-data/3.1/media-buy/build-creative-request.json +16 -16
- package/dist/lib/schemas-data/3.1/media-buy/build-creative-response.json +35 -35
- package/dist/lib/schemas-data/3.1/media-buy/create-media-buy-async-response-input-required.json +4 -4
- package/dist/lib/schemas-data/3.1/media-buy/create-media-buy-async-response-submitted.json +4 -4
- package/dist/lib/schemas-data/3.1/media-buy/create-media-buy-async-response-working.json +3 -3
- package/dist/lib/schemas-data/3.1/media-buy/create-media-buy-request.json +13 -13
- package/dist/lib/schemas-data/3.1/media-buy/create-media-buy-response.json +19 -19
- package/dist/lib/schemas-data/3.1/media-buy/get-media-buy-delivery-request.json +23 -23
- package/dist/lib/schemas-data/3.1/media-buy/get-media-buy-delivery-response.json +27 -27
- package/dist/lib/schemas-data/3.1/media-buy/get-media-buys-request.json +8 -8
- package/dist/lib/schemas-data/3.1/media-buy/get-media-buys-response.json +30 -30
- package/dist/lib/schemas-data/3.1/media-buy/get-products-async-response-input-required.json +4 -4
- package/dist/lib/schemas-data/3.1/media-buy/get-products-async-response-submitted.json +4 -4
- package/dist/lib/schemas-data/3.1/media-buy/get-products-async-response-working.json +3 -3
- package/dist/lib/schemas-data/3.1/media-buy/get-products-request.json +13 -13
- package/dist/lib/schemas-data/3.1/media-buy/get-products-response.json +10 -10
- package/dist/lib/schemas-data/3.1/media-buy/list-creative-formats-request.json +13 -13
- package/dist/lib/schemas-data/3.1/media-buy/list-creative-formats-response.json +9 -9
- package/dist/lib/schemas-data/3.1/media-buy/log-event-request.json +5 -5
- package/dist/lib/schemas-data/3.1/media-buy/log-event-response.json +8 -8
- package/dist/lib/schemas-data/3.1/media-buy/media-buy-delivery-webhook-result.json +9 -9
- package/dist/lib/schemas-data/3.1/media-buy/package-request.json +23 -23
- package/dist/lib/schemas-data/3.1/media-buy/package-update.json +13 -13
- package/dist/lib/schemas-data/3.1/media-buy/provide-performance-feedback-request.json +7 -7
- package/dist/lib/schemas-data/3.1/media-buy/provide-performance-feedback-response.json +8 -8
- package/dist/lib/schemas-data/3.1/media-buy/sync-audiences-request.json +8 -8
- package/dist/lib/schemas-data/3.1/media-buy/sync-audiences-response.json +14 -14
- package/dist/lib/schemas-data/3.1/media-buy/sync-catalogs-async-response-input-required.json +3 -3
- package/dist/lib/schemas-data/3.1/media-buy/sync-catalogs-async-response-submitted.json +4 -4
- package/dist/lib/schemas-data/3.1/media-buy/sync-catalogs-async-response-working.json +3 -3
- package/dist/lib/schemas-data/3.1/media-buy/sync-catalogs-request.json +8 -8
- package/dist/lib/schemas-data/3.1/media-buy/sync-catalogs-response.json +14 -14
- package/dist/lib/schemas-data/3.1/media-buy/sync-event-sources-request.json +8 -8
- package/dist/lib/schemas-data/3.1/media-buy/sync-event-sources-response.json +14 -14
- package/dist/lib/schemas-data/3.1/media-buy/update-media-buy-async-response-input-required.json +3 -3
- package/dist/lib/schemas-data/3.1/media-buy/update-media-buy-async-response-submitted.json +4 -4
- package/dist/lib/schemas-data/3.1/media-buy/update-media-buy-async-response-working.json +3 -3
- package/dist/lib/schemas-data/3.1/media-buy/update-media-buy-request.json +11 -11
- package/dist/lib/schemas-data/3.1/media-buy/update-media-buy-response.json +17 -17
- package/dist/lib/schemas-data/3.1/pricing-options/cpa-option.json +4 -4
- package/dist/lib/schemas-data/3.1/pricing-options/cpc-option.json +4 -4
- package/dist/lib/schemas-data/3.1/pricing-options/cpcv-option.json +4 -4
- package/dist/lib/schemas-data/3.1/pricing-options/cpm-option.json +4 -4
- package/dist/lib/schemas-data/3.1/pricing-options/cpp-option.json +5 -5
- package/dist/lib/schemas-data/3.1/pricing-options/cpv-option.json +4 -4
- package/dist/lib/schemas-data/3.1/pricing-options/flat-rate-option.json +4 -4
- package/dist/lib/schemas-data/3.1/pricing-options/price-breakdown.json +2 -2
- package/dist/lib/schemas-data/3.1/pricing-options/price-guidance.json +1 -1
- package/dist/lib/schemas-data/3.1/pricing-options/time-option.json +4 -4
- package/dist/lib/schemas-data/3.1/pricing-options/vcpm-option.json +4 -4
- package/dist/lib/schemas-data/3.1/property/authorization-result.json +1 -1
- package/dist/lib/schemas-data/3.1/property/base-property-source.json +4 -4
- package/dist/lib/schemas-data/3.1/property/create-property-list-request.json +8 -8
- package/dist/lib/schemas-data/3.1/property/create-property-list-response.json +6 -6
- package/dist/lib/schemas-data/3.1/property/delete-property-list-request.json +5 -5
- package/dist/lib/schemas-data/3.1/property/delete-property-list-response.json +5 -5
- package/dist/lib/schemas-data/3.1/property/delivery-record.json +3 -3
- package/dist/lib/schemas-data/3.1/property/get-property-list-request.json +5 -5
- package/dist/lib/schemas-data/3.1/property/get-property-list-response.json +9 -9
- package/dist/lib/schemas-data/3.1/property/list-property-lists-request.json +6 -6
- package/dist/lib/schemas-data/3.1/property/list-property-lists-response.json +7 -7
- package/dist/lib/schemas-data/3.1/property/property-error.json +2 -2
- package/dist/lib/schemas-data/3.1/property/property-feature-definition.json +2 -2
- package/dist/lib/schemas-data/3.1/property/property-feature-result.json +4 -4
- package/dist/lib/schemas-data/3.1/property/property-feature-value.json +2 -2
- package/dist/lib/schemas-data/3.1/property/property-feature.json +1 -1
- package/dist/lib/schemas-data/3.1/property/property-list-changed-webhook.json +2 -2
- package/dist/lib/schemas-data/3.1/property/property-list-filters.json +5 -5
- package/dist/lib/schemas-data/3.1/property/property-list.json +6 -6
- package/dist/lib/schemas-data/3.1/property/update-property-list-request.json +8 -8
- package/dist/lib/schemas-data/3.1/property/update-property-list-response.json +6 -6
- package/dist/lib/schemas-data/3.1/property/validate-property-delivery-request.json +6 -6
- package/dist/lib/schemas-data/3.1/property/validate-property-delivery-response.json +6 -6
- package/dist/lib/schemas-data/3.1/property/validation-result.json +5 -5
- package/dist/lib/schemas-data/3.1/protocol/get-adcp-capabilities-request.json +4 -4
- package/dist/lib/schemas-data/3.1/protocol/get-adcp-capabilities-response.json +33 -33
- package/dist/lib/schemas-data/3.1/protocol/get-task-status-request.json +5 -5
- package/dist/lib/schemas-data/3.1/protocol/get-task-status-response.json +10 -10
- package/dist/lib/schemas-data/3.1/protocol/list-tasks-request.json +13 -13
- package/dist/lib/schemas-data/3.1/protocol/list-tasks-response.json +8 -8
- package/dist/lib/schemas-data/3.1/registries/v1-canonical-mapping.json +355 -5
- package/dist/lib/schemas-data/3.1/signals/activate-signal-request.json +6 -6
- package/dist/lib/schemas-data/3.1/signals/activate-signal-response.json +9 -9
- package/dist/lib/schemas-data/3.1/signals/get-signals-async-response-submitted.json +4 -4
- package/dist/lib/schemas-data/3.1/signals/get-signals-async-response-working.json +3 -3
- package/dist/lib/schemas-data/3.1/signals/get-signals-request.json +11 -11
- package/dist/lib/schemas-data/3.1/signals/get-signals-response.json +17 -17
- package/dist/lib/schemas-data/3.1/sponsored-intelligence/si-capabilities.json +1 -1
- package/dist/lib/schemas-data/3.1/sponsored-intelligence/si-context-use.json +1 -1
- package/dist/lib/schemas-data/3.1/sponsored-intelligence/si-get-offering-request.json +4 -4
- package/dist/lib/schemas-data/3.1/sponsored-intelligence/si-get-offering-response.json +9 -9
- package/dist/lib/schemas-data/3.1/sponsored-intelligence/si-identity.json +1 -1
- package/dist/lib/schemas-data/3.1/sponsored-intelligence/si-initiate-session-request.json +7 -7
- package/dist/lib/schemas-data/3.1/sponsored-intelligence/si-initiate-session-response.json +10 -10
- package/dist/lib/schemas-data/3.1/sponsored-intelligence/si-send-message-request.json +5 -5
- package/dist/lib/schemas-data/3.1/sponsored-intelligence/si-send-message-response.json +10 -10
- package/dist/lib/schemas-data/3.1/sponsored-intelligence/si-sponsored-context-receipt.json +4 -4
- package/dist/lib/schemas-data/3.1/sponsored-intelligence/si-sponsored-context.json +4 -4
- package/dist/lib/schemas-data/3.1/sponsored-intelligence/si-terminate-session-request.json +4 -4
- package/dist/lib/schemas-data/3.1/sponsored-intelligence/si-terminate-session-response.json +7 -7
- package/dist/lib/schemas-data/3.1/sponsored-intelligence/si-ui-element.json +1 -1
- package/dist/lib/schemas-data/3.1/trusted-match/available-package.json +4 -4
- package/dist/lib/schemas-data/3.1/trusted-match/context-match-request.json +5 -5
- package/dist/lib/schemas-data/3.1/trusted-match/context-match-response.json +4 -4
- package/dist/lib/schemas-data/3.1/trusted-match/error.json +1 -1
- package/dist/lib/schemas-data/3.1/trusted-match/identity-match-request.json +4 -4
- package/dist/lib/schemas-data/3.1/trusted-match/identity-match-response.json +45 -45
- package/dist/lib/schemas-data/3.1/trusted-match/offer-price.json +1 -1
- package/dist/lib/schemas-data/3.1/trusted-match/offer.json +5 -5
- package/dist/lib/schemas-data/3.1/trusted-match/provider-identity-match-response.json +90 -0
- package/dist/lib/schemas-data/3.1/trusted-match/provider-registration.json +8 -7
- package/dist/lib/schemas-data/3.1/trusted-match/publisher-tmpx-config.json +41 -0
- package/dist/lib/schemas-data/3.1/trusted-match/tmpx-chunk.json +28 -0
- package/dist/lib/schemas-data/v2.5/_provenance.json +1 -1
- package/dist/lib/server/decisioning/runtime/entity-hydration.generated.js.map +1 -1
- package/dist/lib/server/decisioning/runtime/entity-hydration.generated.mjs.map +1 -1
- package/dist/lib/server/wire-spec-fields.generated.d.mts +29 -29
- package/dist/lib/server/wire-spec-fields.generated.d.ts +29 -29
- package/dist/lib/server/wire-spec-fields.generated.d.ts.map +1 -1
- package/dist/lib/server/wire-spec-fields.generated.js +29 -29
- package/dist/lib/server/wire-spec-fields.generated.js.map +1 -1
- package/dist/lib/server/wire-spec-fields.generated.mjs +29 -29
- package/dist/lib/server/wire-spec-fields.generated.mjs.map +1 -1
- package/dist/lib/types/adcp.d.mts +10 -0
- package/dist/lib/types/adcp.d.ts +10 -0
- package/dist/lib/types/adcp.d.ts.map +1 -1
- package/dist/lib/types/adcp.js.map +1 -1
- package/dist/lib/types/adcp.mjs.map +1 -1
- package/dist/lib/types/core.generated.d.mts +125 -19
- package/dist/lib/types/core.generated.d.ts +125 -19
- package/dist/lib/types/core.generated.d.ts.map +1 -1
- package/dist/lib/types/core.generated.js.map +1 -1
- package/dist/lib/types/manifest.generated.d.mts +3 -3
- package/dist/lib/types/manifest.generated.d.ts +3 -3
- package/dist/lib/types/manifest.generated.js.map +1 -1
- package/dist/lib/types/manifest.generated.mjs.map +1 -1
- package/dist/lib/types/per-tool-index.json +1 -1
- package/dist/lib/types/schemas.generated.d.mts +124 -20
- package/dist/lib/types/schemas.generated.d.ts +124 -20
- package/dist/lib/types/schemas.generated.d.ts.map +1 -1
- package/dist/lib/types/schemas.generated.js +83 -24
- package/dist/lib/types/schemas.generated.js.map +1 -1
- package/dist/lib/types/schemas.generated.mjs +79 -24
- package/dist/lib/types/schemas.generated.mjs.map +1 -1
- package/dist/lib/utils/response-schemas.js +1 -1
- package/dist/lib/utils/response-schemas.js.map +1 -1
- package/dist/lib/utils/response-schemas.mjs +1 -1
- package/dist/lib/utils/response-schemas.mjs.map +1 -1
- package/dist/lib/utils/sync-creatives-adapter.d.mts +6 -0
- package/dist/lib/utils/sync-creatives-adapter.d.ts +6 -0
- package/dist/lib/utils/sync-creatives-adapter.d.ts.map +1 -1
- package/dist/lib/utils/sync-creatives-adapter.js +22 -1
- package/dist/lib/utils/sync-creatives-adapter.js.map +1 -1
- package/dist/lib/utils/sync-creatives-adapter.mjs +22 -1
- package/dist/lib/utils/sync-creatives-adapter.mjs.map +1 -1
- package/dist/lib/version.d.mts +7 -7
- package/dist/lib/version.d.ts +7 -7
- package/dist/lib/version.d.ts.map +1 -1
- package/dist/lib/version.js +8 -6
- package/dist/lib/version.js.map +1 -1
- package/dist/lib/version.mjs +8 -6
- package/dist/lib/version.mjs.map +1 -1
- package/docs/llms.txt +12 -2
- package/package.json +2 -2
- /package/compliance/cache/{3.1.8 → 3.1.10}/domains/brand/index.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/domains/brand/scenarios/distributed_brand_resolution.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/domains/brand/scenarios/single_side_trust_extension.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/domains/creative/index.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/domains/creative/scenarios/billing_out_of_band.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/domains/creative/scenarios/canonical_supported_formats.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/domains/creative/scenarios/creative_lifecycle_webhooks.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/domains/creative/scenarios/evaluator_auth.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/domains/creative/scenarios/native_in_feed.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/domains/governance/index.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/domains/media-buy/scenarios/audience_buy_flow.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/domains/media-buy/scenarios/available_actions.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/domains/media-buy/scenarios/billing_finality_delivery.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/domains/media-buy/scenarios/canonical_formats.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/domains/media-buy/scenarios/clicks_buy_flow.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/domains/media-buy/scenarios/completed_views_buy_flow.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/domains/media-buy/scenarios/create_media_buy_async.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/domains/media-buy/scenarios/creative_fate_after_cancellation.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/domains/media-buy/scenarios/creative_reception.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/domains/media-buy/scenarios/delivery_reporting.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/domains/media-buy/scenarios/dependency_impairment.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/domains/media-buy/scenarios/dependency_impairment_cardinality.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/domains/media-buy/scenarios/event_dedup_flow.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/domains/media-buy/scenarios/frequency_cap_enforcement.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/domains/media-buy/scenarios/get_products_async.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/domains/media-buy/scenarios/governance_approved.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/domains/media-buy/scenarios/governance_conditions.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/domains/media-buy/scenarios/governance_denied.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/domains/media-buy/scenarios/governance_denied_recovery.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/domains/media-buy/scenarios/inline_creatives_without_sync.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/domains/media-buy/scenarios/invalid_transitions.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/domains/media-buy/scenarios/inventory_list_no_match.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/domains/media-buy/scenarios/inventory_list_targeting.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/domains/media-buy/scenarios/measurement_accountability.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/domains/media-buy/scenarios/measurement_terms_rejected.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/domains/media-buy/scenarios/package_correlation_legacy_fallback.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/domains/media-buy/scenarios/pending_creatives_to_start.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/domains/media-buy/scenarios/per_creative_conversion_attribution.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/domains/media-buy/scenarios/performance_buy_flow.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/domains/media-buy/scenarios/performance_buy_flow_roas.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/domains/media-buy/scenarios/pricing_currency_filter.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/domains/media-buy/scenarios/product_signal_targeting.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/domains/media-buy/scenarios/proposal_finalize.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/domains/media-buy/scenarios/proposal_finalize_asap_timing.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/domains/media-buy/scenarios/proposal_not_found_errors.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/domains/media-buy/scenarios/provenance_audit_observation.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/domains/media-buy/scenarios/provenance_enforcement.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/domains/media-buy/scenarios/provenance_truth_of_claim.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/domains/media-buy/scenarios/reach_buy_flow.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/domains/media-buy/scenarios/refine_finalize_exclusivity.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/domains/media-buy/scenarios/refine_products.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/domains/media-buy/scenarios/vendor_metric_accountability.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/domains/media-buy/scenarios/vendor_metric_catalog_precondition.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/domains/media-buy/scenarios/vendor_metric_optimization_flow.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/domains/media-buy/state-machine.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/domains/signals/index.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/domains/signals/scenarios/get_signals_async.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/domains/sponsored-intelligence/index.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/domains/sponsored-intelligence/sponsored-context-accountability.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/protocols/brand/index.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/protocols/brand/scenarios/distributed_brand_resolution.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/protocols/brand/scenarios/single_side_trust_extension.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/protocols/creative/index.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/protocols/creative/scenarios/billing_out_of_band.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/protocols/creative/scenarios/canonical_supported_formats.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/protocols/creative/scenarios/creative_lifecycle_webhooks.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/protocols/creative/scenarios/evaluator_auth.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/protocols/creative/scenarios/native_in_feed.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/protocols/governance/index.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/protocols/media-buy/scenarios/audience_buy_flow.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/protocols/media-buy/scenarios/available_actions.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/protocols/media-buy/scenarios/billing_finality_delivery.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/protocols/media-buy/scenarios/canonical_formats.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/protocols/media-buy/scenarios/clicks_buy_flow.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/protocols/media-buy/scenarios/completed_views_buy_flow.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/protocols/media-buy/scenarios/create_media_buy_async.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/protocols/media-buy/scenarios/creative_fate_after_cancellation.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/protocols/media-buy/scenarios/creative_reception.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/protocols/media-buy/scenarios/delivery_reporting.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/protocols/media-buy/scenarios/dependency_impairment.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/protocols/media-buy/scenarios/dependency_impairment_cardinality.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/protocols/media-buy/scenarios/event_dedup_flow.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/protocols/media-buy/scenarios/frequency_cap_enforcement.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/protocols/media-buy/scenarios/get_products_async.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/protocols/media-buy/scenarios/governance_approved.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/protocols/media-buy/scenarios/governance_conditions.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/protocols/media-buy/scenarios/governance_denied.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/protocols/media-buy/scenarios/governance_denied_recovery.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/protocols/media-buy/scenarios/inline_creatives_without_sync.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/protocols/media-buy/scenarios/invalid_transitions.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/protocols/media-buy/scenarios/inventory_list_no_match.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/protocols/media-buy/scenarios/inventory_list_targeting.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/protocols/media-buy/scenarios/measurement_accountability.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/protocols/media-buy/scenarios/measurement_terms_rejected.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/protocols/media-buy/scenarios/package_correlation_legacy_fallback.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/protocols/media-buy/scenarios/pending_creatives_to_start.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/protocols/media-buy/scenarios/per_creative_conversion_attribution.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/protocols/media-buy/scenarios/performance_buy_flow.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/protocols/media-buy/scenarios/performance_buy_flow_roas.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/protocols/media-buy/scenarios/pricing_currency_filter.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/protocols/media-buy/scenarios/product_signal_targeting.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/protocols/media-buy/scenarios/proposal_finalize.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/protocols/media-buy/scenarios/proposal_finalize_asap_timing.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/protocols/media-buy/scenarios/proposal_not_found_errors.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/protocols/media-buy/scenarios/provenance_audit_observation.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/protocols/media-buy/scenarios/provenance_enforcement.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/protocols/media-buy/scenarios/provenance_truth_of_claim.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/protocols/media-buy/scenarios/reach_buy_flow.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/protocols/media-buy/scenarios/refine_finalize_exclusivity.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/protocols/media-buy/scenarios/refine_products.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/protocols/media-buy/scenarios/vendor_metric_accountability.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/protocols/media-buy/scenarios/vendor_metric_catalog_precondition.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/protocols/media-buy/scenarios/vendor_metric_optimization_flow.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/protocols/media-buy/state-machine.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/protocols/signals/index.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/protocols/signals/scenarios/get_signals_async.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/protocols/sponsored-intelligence/index.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/protocols/sponsored-intelligence/sponsored-context-accountability.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/specialisms/audience-sync/index.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/specialisms/brand-rights/index.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/specialisms/brand-rights/scenarios/governance_denied.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/specialisms/collection-lists/index.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/specialisms/content-standards/index.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/specialisms/creative-ad-server/index.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/specialisms/creative-generative/generative-seller.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/specialisms/creative-generative/index.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/specialisms/creative-template/index.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/specialisms/creative-transformers/index.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/specialisms/governance-aware-seller/index.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/specialisms/governance-aware-seller/scenarios/governance_multi_agent_rejected.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/specialisms/governance-delivery-monitor/index.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/specialisms/governance-spend-authority/denied.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/specialisms/governance-spend-authority/index.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/specialisms/property-lists/index.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/specialisms/sales-broadcast-tv/index.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/specialisms/sales-catalog-driven/index.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/specialisms/sales-guaranteed/index.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/specialisms/sales-non-guaranteed/index.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/specialisms/sales-proposal-mode/index.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/specialisms/sales-social/index.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/specialisms/signal-marketplace/index.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/specialisms/signal-marketplace/scenarios/governance_denied.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/specialisms/signal-owned/index.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/specialisms/sponsored-intelligence/index.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/test-kits/acme-outdoor-live.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/test-kits/acme-outdoor.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/test-kits/billing-gate-runner.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/test-kits/bistro-oranje.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/test-kits/distributed-brand-runner.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/test-kits/nova-motors.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/test-kits/osei-natural.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/test-kits/parallel-dispatch-runner.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/test-kits/rate-limit-trip-runner.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/test-kits/signed-requests-runner.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/test-kits/single-side-trust-runner.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/test-kits/substitution-observer-runner.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/test-kits/summit-foods.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/test-kits/webhook-receiver-runner.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/catalog-macro-substitution.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/plan-hash/001-minimal-plan.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/plan-hash/002-full-plan.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/plan-hash/003-bookkeeping-stripped.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/plan-hash/004a-human-review-omitted.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/plan-hash/004b-human-review-explicit-null.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/plan-hash/005a-policy-categories-order-1.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/plan-hash/005b-policy-categories-order-2.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/plan-hash/006a-ext-trace-v1.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/plan-hash/006b-ext-trace-v2.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/plan-hash/007-unicode-objectives.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/plan-hash/008-numeric-canonicalization.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/request-signing/README.md +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/request-signing/canonicalization.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/request-signing/keys.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/request-signing/negative/001-no-signature-header.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/request-signing/negative/002-wrong-tag.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/request-signing/negative/003-expired-signature.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/request-signing/negative/004-window-too-long.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/request-signing/negative/005-alg-not-allowed.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/request-signing/negative/006-missing-covered-component.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/request-signing/negative/007-missing-content-digest.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/request-signing/negative/008-unknown-keyid.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/request-signing/negative/009-key-ops-missing-verify.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/request-signing/negative/010-content-digest-mismatch.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/request-signing/negative/011-malformed-header.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/request-signing/negative/012-missing-expires-param.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/request-signing/negative/013-expires-le-created.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/request-signing/negative/014-missing-nonce-param.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/request-signing/negative/015-signature-invalid.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/request-signing/negative/016-replayed-nonce.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/request-signing/negative/017-key-revoked.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/request-signing/negative/018-digest-covered-when-forbidden.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/request-signing/negative/019-signature-without-signature-input.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/request-signing/negative/020-rate-abuse.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/request-signing/negative/021-duplicate-signature-input-label.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/request-signing/negative/022-multi-valued-content-type.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/request-signing/negative/023-multi-valued-content-digest.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/request-signing/negative/024-unquoted-string-param.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/request-signing/negative/025-jwk-alg-crv-mismatch.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/request-signing/negative/026-non-ascii-host.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/request-signing/negative/027-webhook-registration-authentication-unsigned.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/request-signing/negative/028-unsigned-protocol-method-required.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/request-signing/positive/001-basic-post.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/request-signing/positive/002-post-with-content-digest.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/request-signing/positive/003-es256-post.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/request-signing/positive/004-multiple-signature-labels.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/request-signing/positive/005-default-port-stripped.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/request-signing/positive/006-dot-segment-path.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/request-signing/positive/007-query-byte-preserved.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/request-signing/positive/008-percent-encoded-path.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/request-signing/positive/009-percent-encoded-unreserved-decoded.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/request-signing/positive/010-percent-encoded-slash-preserved.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/request-signing/positive/011-ipv6-authority.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/request-signing/positive/012-ipv6-authority-default-port-stripped.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/webhook-receiver-envelope.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/webhook-signing/README.md +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/webhook-signing/keys.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/webhook-signing/negative/001-wrong-tag.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/webhook-signing/negative/002-expired-signature.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/webhook-signing/negative/003-window-too-long.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/webhook-signing/negative/004-alg-not-allowed.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/webhook-signing/negative/005-missing-authority-component.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/webhook-signing/negative/006-missing-content-digest.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/webhook-signing/negative/007-unknown-keyid.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/webhook-signing/negative/008-wrong-adcp-use.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/webhook-signing/negative/009-content-digest-mismatch.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/webhook-signing/negative/010-malformed-signature-input.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/webhook-signing/negative/011-signature-without-input.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/webhook-signing/negative/012-missing-expires-param.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/webhook-signing/negative/013-expires-le-created.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/webhook-signing/negative/014-missing-nonce-param.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/webhook-signing/negative/015-signature-invalid.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/webhook-signing/negative/016-replayed-nonce.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/webhook-signing/negative/017-key-revoked.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/webhook-signing/negative/018-rate-abuse.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/webhook-signing/negative/019-revocation-stale.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/webhook-signing/negative/020-key-ops-missing-verify.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/webhook-signing/negative/021-base64-alphabet-mixing.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/webhook-signing/positive/001-basic-post.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/webhook-signing/positive/002-es256-post.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/webhook-signing/positive/003-multiple-signature-labels.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/webhook-signing/positive/004-default-port-stripped.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/webhook-signing/positive/005-percent-encoded-path.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/webhook-signing/positive/006-query-byte-preserved.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/webhook-signing/positive/007-body-without-idempotency-key.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/webhook-signing/positive/008-request-signing-key-reuse.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/universal/billing-gate-dispatch.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/universal/canonical-format-validate-input.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/universal/capability-discovery.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/universal/collection-lists-pagination-integrity.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/universal/comply-controller-mode-gate.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/universal/content-standards-pagination-integrity.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/universal/deterministic-testing.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/universal/error-compliance-signals.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/universal/error-compliance.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/universal/fictional-entities.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/universal/get-media-buys-pagination-integrity.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/universal/get-products-pagination-integrity.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/universal/get-signals-pagination-integrity.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/universal/idempotency.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/universal/notification-config-event-scope.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/universal/notification-config-lifecycle.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/universal/notification-config-rejections.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/universal/pagination-integrity-creative-formats.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/universal/pagination-integrity-list-accounts.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/universal/pagination-integrity.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/universal/property-lists-pagination-integrity.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/universal/read-tool-idempotency.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/universal/schema-validation-signals.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/universal/schema-validation.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/universal/security.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/universal/signed-requests.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/universal/stale-response-advisory.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/universal/storyboard-schema.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/universal/v3-envelope-integrity.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/universal/version-negotiation.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/universal/webhook-emission.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/universal/webhook-receiver-envelope.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/universal/wholesale-feed-bulk-webhooks.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/universal/wholesale-feed-product-webhooks.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/universal/wholesale-feed-products.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/universal/wholesale-feed-signal-webhooks.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.10}/universal/wholesale-feed-signals.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/domains/brand/index.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/domains/brand/scenarios/distributed_brand_resolution.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/domains/brand/scenarios/single_side_trust_extension.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/domains/creative/index.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/domains/creative/scenarios/billing_out_of_band.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/domains/creative/scenarios/canonical_supported_formats.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/domains/creative/scenarios/creative_lifecycle_webhooks.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/domains/creative/scenarios/evaluator_auth.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/domains/creative/scenarios/native_in_feed.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/domains/governance/index.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/domains/media-buy/scenarios/audience_buy_flow.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/domains/media-buy/scenarios/available_actions.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/domains/media-buy/scenarios/billing_finality_delivery.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/domains/media-buy/scenarios/canonical_formats.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/domains/media-buy/scenarios/clicks_buy_flow.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/domains/media-buy/scenarios/completed_views_buy_flow.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/domains/media-buy/scenarios/create_media_buy_async.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/domains/media-buy/scenarios/creative_fate_after_cancellation.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/domains/media-buy/scenarios/creative_reception.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/domains/media-buy/scenarios/delivery_reporting.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/domains/media-buy/scenarios/dependency_impairment.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/domains/media-buy/scenarios/dependency_impairment_cardinality.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/domains/media-buy/scenarios/event_dedup_flow.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/domains/media-buy/scenarios/frequency_cap_enforcement.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/domains/media-buy/scenarios/get_products_async.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/domains/media-buy/scenarios/governance_approved.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/domains/media-buy/scenarios/governance_conditions.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/domains/media-buy/scenarios/governance_denied.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/domains/media-buy/scenarios/governance_denied_recovery.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/domains/media-buy/scenarios/inline_creatives_without_sync.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/domains/media-buy/scenarios/invalid_transitions.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/domains/media-buy/scenarios/inventory_list_no_match.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/domains/media-buy/scenarios/inventory_list_targeting.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/domains/media-buy/scenarios/measurement_accountability.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/domains/media-buy/scenarios/measurement_terms_rejected.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/domains/media-buy/scenarios/package_correlation_legacy_fallback.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/domains/media-buy/scenarios/pending_creatives_to_start.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/domains/media-buy/scenarios/per_creative_conversion_attribution.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/domains/media-buy/scenarios/performance_buy_flow.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/domains/media-buy/scenarios/performance_buy_flow_roas.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/domains/media-buy/scenarios/pricing_currency_filter.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/domains/media-buy/scenarios/product_signal_targeting.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/domains/media-buy/scenarios/proposal_finalize.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/domains/media-buy/scenarios/proposal_finalize_asap_timing.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/domains/media-buy/scenarios/proposal_not_found_errors.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/domains/media-buy/scenarios/provenance_audit_observation.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/domains/media-buy/scenarios/provenance_enforcement.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/domains/media-buy/scenarios/provenance_truth_of_claim.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/domains/media-buy/scenarios/reach_buy_flow.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/domains/media-buy/scenarios/refine_finalize_exclusivity.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/domains/media-buy/scenarios/refine_products.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/domains/media-buy/scenarios/vendor_metric_accountability.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/domains/media-buy/scenarios/vendor_metric_catalog_precondition.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/domains/media-buy/scenarios/vendor_metric_optimization_flow.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/domains/media-buy/state-machine.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/domains/signals/index.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/domains/signals/scenarios/get_signals_async.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/domains/sponsored-intelligence/index.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/domains/sponsored-intelligence/sponsored-context-accountability.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/protocols/brand/index.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/protocols/brand/scenarios/distributed_brand_resolution.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/protocols/brand/scenarios/single_side_trust_extension.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/protocols/creative/index.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/protocols/creative/scenarios/billing_out_of_band.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/protocols/creative/scenarios/canonical_supported_formats.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/protocols/creative/scenarios/creative_lifecycle_webhooks.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/protocols/creative/scenarios/evaluator_auth.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/protocols/creative/scenarios/native_in_feed.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/protocols/governance/index.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/protocols/media-buy/scenarios/audience_buy_flow.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/protocols/media-buy/scenarios/available_actions.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/protocols/media-buy/scenarios/billing_finality_delivery.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/protocols/media-buy/scenarios/canonical_formats.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/protocols/media-buy/scenarios/clicks_buy_flow.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/protocols/media-buy/scenarios/completed_views_buy_flow.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/protocols/media-buy/scenarios/create_media_buy_async.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/protocols/media-buy/scenarios/creative_fate_after_cancellation.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/protocols/media-buy/scenarios/creative_reception.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/protocols/media-buy/scenarios/delivery_reporting.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/protocols/media-buy/scenarios/dependency_impairment.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/protocols/media-buy/scenarios/dependency_impairment_cardinality.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/protocols/media-buy/scenarios/event_dedup_flow.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/protocols/media-buy/scenarios/frequency_cap_enforcement.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/protocols/media-buy/scenarios/get_products_async.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/protocols/media-buy/scenarios/governance_approved.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/protocols/media-buy/scenarios/governance_conditions.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/protocols/media-buy/scenarios/governance_denied.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/protocols/media-buy/scenarios/governance_denied_recovery.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/protocols/media-buy/scenarios/inline_creatives_without_sync.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/protocols/media-buy/scenarios/invalid_transitions.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/protocols/media-buy/scenarios/inventory_list_no_match.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/protocols/media-buy/scenarios/inventory_list_targeting.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/protocols/media-buy/scenarios/measurement_accountability.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/protocols/media-buy/scenarios/measurement_terms_rejected.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/protocols/media-buy/scenarios/package_correlation_legacy_fallback.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/protocols/media-buy/scenarios/pending_creatives_to_start.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/protocols/media-buy/scenarios/per_creative_conversion_attribution.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/protocols/media-buy/scenarios/performance_buy_flow.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/protocols/media-buy/scenarios/performance_buy_flow_roas.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/protocols/media-buy/scenarios/pricing_currency_filter.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/protocols/media-buy/scenarios/product_signal_targeting.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/protocols/media-buy/scenarios/proposal_finalize.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/protocols/media-buy/scenarios/proposal_finalize_asap_timing.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/protocols/media-buy/scenarios/proposal_not_found_errors.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/protocols/media-buy/scenarios/provenance_audit_observation.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/protocols/media-buy/scenarios/provenance_enforcement.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/protocols/media-buy/scenarios/provenance_truth_of_claim.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/protocols/media-buy/scenarios/reach_buy_flow.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/protocols/media-buy/scenarios/refine_finalize_exclusivity.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/protocols/media-buy/scenarios/refine_products.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/protocols/media-buy/scenarios/vendor_metric_accountability.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/protocols/media-buy/scenarios/vendor_metric_catalog_precondition.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/protocols/media-buy/scenarios/vendor_metric_optimization_flow.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/protocols/media-buy/state-machine.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/protocols/signals/index.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/protocols/signals/scenarios/get_signals_async.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/protocols/sponsored-intelligence/index.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/protocols/sponsored-intelligence/sponsored-context-accountability.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/specialisms/audience-sync/index.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/specialisms/brand-rights/index.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/specialisms/brand-rights/scenarios/governance_denied.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/specialisms/collection-lists/index.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/specialisms/content-standards/index.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/specialisms/creative-ad-server/index.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/specialisms/creative-generative/generative-seller.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/specialisms/creative-generative/index.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/specialisms/creative-template/index.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/specialisms/creative-transformers/index.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/specialisms/governance-aware-seller/index.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/specialisms/governance-aware-seller/scenarios/governance_multi_agent_rejected.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/specialisms/governance-delivery-monitor/index.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/specialisms/governance-spend-authority/denied.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/specialisms/governance-spend-authority/index.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/specialisms/property-lists/index.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/specialisms/sales-broadcast-tv/index.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/specialisms/sales-catalog-driven/index.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/specialisms/sales-guaranteed/index.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/specialisms/sales-non-guaranteed/index.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/specialisms/sales-proposal-mode/index.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/specialisms/sales-social/index.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/specialisms/signal-marketplace/index.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/specialisms/signal-marketplace/scenarios/governance_denied.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/specialisms/signal-owned/index.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/specialisms/sponsored-intelligence/index.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-kits/acme-outdoor-live.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-kits/acme-outdoor.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-kits/billing-gate-runner.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-kits/bistro-oranje.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-kits/distributed-brand-runner.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-kits/nova-motors.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-kits/osei-natural.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-kits/parallel-dispatch-runner.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-kits/rate-limit-trip-runner.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-kits/signed-requests-runner.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-kits/single-side-trust-runner.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-kits/substitution-observer-runner.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-kits/summit-foods.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-kits/webhook-receiver-runner.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/catalog-macro-substitution.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/plan-hash/001-minimal-plan.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/plan-hash/002-full-plan.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/plan-hash/003-bookkeeping-stripped.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/plan-hash/004a-human-review-omitted.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/plan-hash/004b-human-review-explicit-null.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/plan-hash/005a-policy-categories-order-1.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/plan-hash/005b-policy-categories-order-2.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/plan-hash/006a-ext-trace-v1.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/plan-hash/006b-ext-trace-v2.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/plan-hash/007-unicode-objectives.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/plan-hash/008-numeric-canonicalization.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/request-signing/README.md +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/request-signing/canonicalization.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/request-signing/keys.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/request-signing/negative/001-no-signature-header.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/request-signing/negative/002-wrong-tag.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/request-signing/negative/003-expired-signature.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/request-signing/negative/004-window-too-long.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/request-signing/negative/005-alg-not-allowed.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/request-signing/negative/006-missing-covered-component.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/request-signing/negative/007-missing-content-digest.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/request-signing/negative/008-unknown-keyid.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/request-signing/negative/009-key-ops-missing-verify.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/request-signing/negative/010-content-digest-mismatch.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/request-signing/negative/011-malformed-header.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/request-signing/negative/012-missing-expires-param.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/request-signing/negative/013-expires-le-created.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/request-signing/negative/014-missing-nonce-param.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/request-signing/negative/015-signature-invalid.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/request-signing/negative/016-replayed-nonce.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/request-signing/negative/017-key-revoked.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/request-signing/negative/018-digest-covered-when-forbidden.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/request-signing/negative/019-signature-without-signature-input.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/request-signing/negative/020-rate-abuse.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/request-signing/negative/021-duplicate-signature-input-label.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/request-signing/negative/022-multi-valued-content-type.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/request-signing/negative/023-multi-valued-content-digest.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/request-signing/negative/024-unquoted-string-param.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/request-signing/negative/025-jwk-alg-crv-mismatch.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/request-signing/negative/026-non-ascii-host.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/request-signing/negative/027-webhook-registration-authentication-unsigned.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/request-signing/negative/028-unsigned-protocol-method-required.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/request-signing/positive/001-basic-post.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/request-signing/positive/002-post-with-content-digest.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/request-signing/positive/003-es256-post.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/request-signing/positive/004-multiple-signature-labels.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/request-signing/positive/005-default-port-stripped.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/request-signing/positive/006-dot-segment-path.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/request-signing/positive/007-query-byte-preserved.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/request-signing/positive/008-percent-encoded-path.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/request-signing/positive/009-percent-encoded-unreserved-decoded.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/request-signing/positive/010-percent-encoded-slash-preserved.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/request-signing/positive/011-ipv6-authority.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/request-signing/positive/012-ipv6-authority-default-port-stripped.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/webhook-receiver-envelope.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/webhook-signing/README.md +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/webhook-signing/keys.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/webhook-signing/negative/001-wrong-tag.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/webhook-signing/negative/002-expired-signature.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/webhook-signing/negative/003-window-too-long.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/webhook-signing/negative/004-alg-not-allowed.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/webhook-signing/negative/005-missing-authority-component.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/webhook-signing/negative/006-missing-content-digest.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/webhook-signing/negative/007-unknown-keyid.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/webhook-signing/negative/008-wrong-adcp-use.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/webhook-signing/negative/009-content-digest-mismatch.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/webhook-signing/negative/010-malformed-signature-input.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/webhook-signing/negative/011-signature-without-input.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/webhook-signing/negative/012-missing-expires-param.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/webhook-signing/negative/013-expires-le-created.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/webhook-signing/negative/014-missing-nonce-param.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/webhook-signing/negative/015-signature-invalid.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/webhook-signing/negative/016-replayed-nonce.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/webhook-signing/negative/017-key-revoked.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/webhook-signing/negative/018-rate-abuse.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/webhook-signing/negative/019-revocation-stale.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/webhook-signing/negative/020-key-ops-missing-verify.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/webhook-signing/negative/021-base64-alphabet-mixing.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/webhook-signing/positive/001-basic-post.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/webhook-signing/positive/002-es256-post.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/webhook-signing/positive/003-multiple-signature-labels.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/webhook-signing/positive/004-default-port-stripped.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/webhook-signing/positive/005-percent-encoded-path.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/webhook-signing/positive/006-query-byte-preserved.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/webhook-signing/positive/007-body-without-idempotency-key.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/webhook-signing/positive/008-request-signing-key-reuse.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/universal/billing-gate-dispatch.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/universal/canonical-format-validate-input.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/universal/capability-discovery.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/universal/collection-lists-pagination-integrity.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/universal/comply-controller-mode-gate.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/universal/content-standards-pagination-integrity.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/universal/deterministic-testing.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/universal/error-compliance-signals.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/universal/error-compliance.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/universal/fictional-entities.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/universal/get-media-buys-pagination-integrity.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/universal/get-products-pagination-integrity.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/universal/get-signals-pagination-integrity.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/universal/idempotency.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/universal/notification-config-event-scope.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/universal/notification-config-lifecycle.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/universal/notification-config-rejections.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/universal/pagination-integrity-creative-formats.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/universal/pagination-integrity-list-accounts.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/universal/pagination-integrity.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/universal/property-lists-pagination-integrity.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/universal/read-tool-idempotency.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/universal/schema-validation-signals.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/universal/schema-validation.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/universal/security.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/universal/signed-requests.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/universal/stale-response-advisory.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/universal/storyboard-schema.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/universal/v3-envelope-integrity.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/universal/version-negotiation.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/universal/webhook-emission.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/universal/webhook-receiver-envelope.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/universal/wholesale-feed-bulk-webhooks.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/universal/wholesale-feed-product-webhooks.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/universal/wholesale-feed-products.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/universal/wholesale-feed-signal-webhooks.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/universal/wholesale-feed-signals.yaml +0 -0
|
@@ -18,6 +18,7 @@ var __copyProps = (to, from, except, desc) => {
|
|
|
18
18
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
19
|
var web_flow_exports = {};
|
|
20
20
|
__export(web_flow_exports, {
|
|
21
|
+
AgentChangedDuringFlowError: () => AgentChangedDuringFlowError,
|
|
21
22
|
AgentVanishedDuringFlowError: () => AgentVanishedDuringFlowError,
|
|
22
23
|
BrowserBindingRequiredError: () => BrowserBindingRequiredError,
|
|
23
24
|
ConfidentialClientNotAllowedError: () => ConfidentialClientNotAllowedError,
|
|
@@ -36,6 +37,7 @@ var import_crypto = require("crypto");
|
|
|
36
37
|
var import_auth = require("@modelcontextprotocol/sdk/client/auth.js");
|
|
37
38
|
var import_auth_utils = require("@modelcontextprotocol/sdk/shared/auth-utils.js");
|
|
38
39
|
var import_types = require('./types.js');
|
|
40
|
+
var import_resource_url = require('./resource-url.js');
|
|
39
41
|
const DEFAULT_WEB_FLOW_TTL_MS = 10 * 60 * 1e3;
|
|
40
42
|
class InvalidOrExpiredFlowError extends import_types.OAuthError {
|
|
41
43
|
constructor(state) {
|
|
@@ -77,6 +79,16 @@ class AgentVanishedDuringFlowError extends import_types.OAuthError {
|
|
|
77
79
|
this.name = "AgentVanishedDuringFlowError";
|
|
78
80
|
}
|
|
79
81
|
}
|
|
82
|
+
class AgentChangedDuringFlowError extends import_types.OAuthError {
|
|
83
|
+
constructor(agentId) {
|
|
84
|
+
super(
|
|
85
|
+
`Agent ${agentId} changed while OAuth authorization was pending; tokens were not saved`,
|
|
86
|
+
"agent_changed_during_flow",
|
|
87
|
+
agentId
|
|
88
|
+
);
|
|
89
|
+
this.name = "AgentChangedDuringFlowError";
|
|
90
|
+
}
|
|
91
|
+
}
|
|
80
92
|
class ConfidentialClientNotAllowedError extends import_types.OAuthError {
|
|
81
93
|
constructor(agentId) {
|
|
82
94
|
super(
|
|
@@ -104,6 +116,9 @@ async function startWebOAuthFlow(opts) {
|
|
|
104
116
|
agentStorage,
|
|
105
117
|
carry,
|
|
106
118
|
scopeHint,
|
|
119
|
+
resourceOverride: requestedResourceOverride,
|
|
120
|
+
audience,
|
|
121
|
+
allowHttp = false,
|
|
107
122
|
ttlMs = DEFAULT_WEB_FLOW_TTL_MS,
|
|
108
123
|
generateState,
|
|
109
124
|
fetch: fetchFn,
|
|
@@ -113,8 +128,11 @@ async function startWebOAuthFlow(opts) {
|
|
|
113
128
|
if (!agent.agent_uri) {
|
|
114
129
|
throw new import_types.OAuthError("Agent missing agent_uri", "invalid_agent", agent.id);
|
|
115
130
|
}
|
|
131
|
+
const resourceOverrideAction = requestedResourceOverride === null ? "clear" : requestedResourceOverride !== void 0 ? "set" : void 0;
|
|
132
|
+
const rawResourceOverride = requestedResourceOverride === null ? void 0 : requestedResourceOverride ?? agent.oauth_resource;
|
|
133
|
+
const resourceOverride = rawResourceOverride ? (0, import_resource_url.validateOAuthResourceUrl)(rawResourceOverride, { allowHttp }).href : void 0;
|
|
116
134
|
const prm = await tryDiscoverPRM(agent.agent_uri, fetchFn);
|
|
117
|
-
if (prm?.resource) {
|
|
135
|
+
if (!resourceOverride && prm?.resource) {
|
|
118
136
|
assertPrmResourceMatchesAgentOrigin(agent.agent_uri, prm.resource);
|
|
119
137
|
}
|
|
120
138
|
const asUrl = resolveAuthorizationServerUrl(agent.agent_uri, prm);
|
|
@@ -122,7 +140,7 @@ async function startWebOAuthFlow(opts) {
|
|
|
122
140
|
if (!asMetadata) {
|
|
123
141
|
throw new import_types.OAuthError(`No OAuth metadata at ${asUrl.toString()}`, "no_authorization_server_metadata", agent.id);
|
|
124
142
|
}
|
|
125
|
-
const resource = prm?.resource ? new URL(prm.resource) : (0, import_auth_utils.resourceUrlFromServerUrl)(new URL(agent.agent_uri));
|
|
143
|
+
const resource = resourceOverride ? new URL(resourceOverride) : prm?.resource ? new URL(prm.resource) : (0, import_auth_utils.resourceUrlFromServerUrl)(new URL(agent.agent_uri));
|
|
126
144
|
const baseClientMetadata = {
|
|
127
145
|
...import_types.DEFAULT_CLIENT_METADATA,
|
|
128
146
|
...clientMetadataOverrides,
|
|
@@ -147,6 +165,9 @@ async function startWebOAuthFlow(opts) {
|
|
|
147
165
|
state,
|
|
148
166
|
resource
|
|
149
167
|
});
|
|
168
|
+
if (audience) {
|
|
169
|
+
authorizationUrl.searchParams.set("audience", audience);
|
|
170
|
+
}
|
|
150
171
|
const now = /* @__PURE__ */ new Date();
|
|
151
172
|
const expiresAt = new Date(now.getTime() + ttlMs);
|
|
152
173
|
const flow = {
|
|
@@ -156,6 +177,9 @@ async function startWebOAuthFlow(opts) {
|
|
|
156
177
|
codeVerifier,
|
|
157
178
|
redirectUri,
|
|
158
179
|
resource: resource.href,
|
|
180
|
+
resourceOverride,
|
|
181
|
+
resourceOverrideAction,
|
|
182
|
+
resourceOverrideSnapshot: agent.oauth_resource ?? null,
|
|
159
183
|
scope,
|
|
160
184
|
authorizationServerUrl: asUrl.toString(),
|
|
161
185
|
clientInformation,
|
|
@@ -186,6 +210,11 @@ async function completeWebOAuthFlow(opts) {
|
|
|
186
210
|
if (!flow || flow.expiresAt.getTime() < Date.now()) {
|
|
187
211
|
throw new InvalidOrExpiredFlowError(state);
|
|
188
212
|
}
|
|
213
|
+
let agentForPersistence;
|
|
214
|
+
if (agentStorage) {
|
|
215
|
+
agentForPersistence = await agentStorage.loadAgent(flow.agentId);
|
|
216
|
+
assertAgentUnchangedForFlow(agentForPersistence, flow);
|
|
217
|
+
}
|
|
189
218
|
const asMetadata = await (0, import_auth.discoverAuthorizationServerMetadata)(flow.authorizationServerUrl, {
|
|
190
219
|
fetchFn
|
|
191
220
|
});
|
|
@@ -205,13 +234,16 @@ async function completeWebOAuthFlow(opts) {
|
|
|
205
234
|
}
|
|
206
235
|
let persisted = false;
|
|
207
236
|
if (agentStorage) {
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
237
|
+
agentForPersistence = await agentStorage.loadAgent(flow.agentId);
|
|
238
|
+
assertAgentUnchangedForFlow(agentForPersistence, flow);
|
|
239
|
+
agentForPersistence.oauth_tokens = (0, import_types.fromMCPTokens)(tokens);
|
|
240
|
+
if (flow.resourceOverrideAction === "set" && flow.resourceOverride) {
|
|
241
|
+
agentForPersistence.oauth_resource = flow.resourceOverride;
|
|
242
|
+
} else if (flow.resourceOverrideAction === "clear") {
|
|
243
|
+
delete agentForPersistence.oauth_resource;
|
|
211
244
|
}
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
await agentStorage.saveAgent(agent);
|
|
245
|
+
delete agentForPersistence.oauth_code_verifier;
|
|
246
|
+
await agentStorage.saveAgent(agentForPersistence);
|
|
215
247
|
persisted = true;
|
|
216
248
|
}
|
|
217
249
|
return {
|
|
@@ -222,6 +254,17 @@ async function completeWebOAuthFlow(opts) {
|
|
|
222
254
|
persisted
|
|
223
255
|
};
|
|
224
256
|
}
|
|
257
|
+
function assertAgentUnchangedForFlow(agent, flow) {
|
|
258
|
+
if (!agent) {
|
|
259
|
+
throw new AgentVanishedDuringFlowError(flow.agentId);
|
|
260
|
+
}
|
|
261
|
+
if (agent.agent_uri !== flow.agentUrl) {
|
|
262
|
+
throw new AgentChangedDuringFlowError(flow.agentId);
|
|
263
|
+
}
|
|
264
|
+
if (Object.prototype.hasOwnProperty.call(flow, "resourceOverrideSnapshot") && (agent.oauth_resource ?? null) !== flow.resourceOverrideSnapshot) {
|
|
265
|
+
throw new AgentChangedDuringFlowError(flow.agentId);
|
|
266
|
+
}
|
|
267
|
+
}
|
|
225
268
|
function safeReturnTo(value, options = {}) {
|
|
226
269
|
if (typeof value !== "string" || value.length === 0) return void 0;
|
|
227
270
|
if (value.startsWith("/") && !value.startsWith("//") && !value.startsWith("/\\")) {
|
|
@@ -343,6 +386,7 @@ function redactTokens(input) {
|
|
|
343
386
|
}
|
|
344
387
|
// Annotate the CommonJS export names for ESM import in node:
|
|
345
388
|
0 && (module.exports = {
|
|
389
|
+
AgentChangedDuringFlowError,
|
|
346
390
|
AgentVanishedDuringFlowError,
|
|
347
391
|
BrowserBindingRequiredError,
|
|
348
392
|
ConfidentialClientNotAllowedError,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/lib/auth/oauth/web-flow.ts"],"sourcesContent":["/**\n * Web (server-side) OAuth flow helpers for `@adcp/sdk`.\n *\n * Companion to `CLIFlowHandler` for environments where `/oauth/start` and\n * `/oauth/callback` may be served by different processes. Discovery, PKCE,\n * URL construction, and token exchange are delegated to the MCP SDK's\n * `client/auth.js` primitives so this module is glue plus a pending-flow\n * store interface — not reimplemented protocol logic.\n *\n * Wire contract:\n * - PRM (RFC 9728) is consulted first; `prm.resource` is the source of\n * truth for the RFC 8707 `resource` indicator. We fall back to\n * `resourceUrlFromServerUrl(agent.agent_uri)` only when the resource\n * server does not implement PRM (404). Connection / parse / 5xx\n * errors throw `ProtectedResourceMetadataError` — never silently\n * downgrade to local guessing.\n * - `prm.resource` must share an origin with the agent URL; the MCP\n * SDK's `checkResourceAllowed` guards against a poisoned PRM\n * pointing the audience at a third party.\n * - AS URL = `prm.authorization_servers[0]` when PRM is present, else\n * the agent origin.\n * - Scope priority: caller-supplied `scopeHint` (e.g. from a 401\n * `WWW-Authenticate` challenge, per SEP-835) > `prm.scopes_supported`\n * > `clientMetadata.scope`.\n * - Refresh is NOT this module's concern. Once `oauth_tokens` are\n * persisted, `MCPOAuthProvider` handles refresh on the next agent\n * call and the MCP SDK forwards `resource` into the refresh request.\n * Callers who DIY refresh against `oauth_tokens` are responsible for\n * forwarding `resource` themselves.\n */\n\nimport { randomBytes } from 'crypto';\nimport {\n discoverAuthorizationServerMetadata,\n discoverOAuthProtectedResourceMetadata,\n exchangeAuthorization,\n registerClient,\n startAuthorization,\n} from '@modelcontextprotocol/sdk/client/auth.js';\nimport { checkResourceAllowed, resourceUrlFromServerUrl } from '@modelcontextprotocol/sdk/shared/auth-utils.js';\nimport type {\n AuthorizationServerMetadata,\n OAuthClientInformation,\n OAuthClientInformationFull,\n OAuthClientMetadata,\n OAuthProtectedResourceMetadata,\n OAuthTokens,\n} from '@modelcontextprotocol/sdk/shared/auth.js';\n\nimport type { AgentConfig, OAuthConfigStorage } from './types';\nimport { DEFAULT_CLIENT_METADATA, fromMCPClientInfo, fromMCPTokens, OAuthError, toMCPClientInfo } from './types';\n\n/**\n * Default TTL for a pending web flow row. RFC 6749 §10.12 recommends\n * short-lived state; 10 minutes covers slow-typing users without leaving\n * the PKCE verifier on disk longer than necessary.\n */\nexport const DEFAULT_WEB_FLOW_TTL_MS = 10 * 60 * 1000;\n\n/**\n * State persisted between `/oauth/start` and `/oauth/callback`.\n *\n * `codeVerifier` is a PKCE secret. Store implementations MUST encrypt it\n * at rest if persistence crosses a trust boundary (shared DB, cross-tenant\n * Redis, etc.).\n *\n * `carry` is preserved verbatim and round-tripped to the callback. It\n * MUST be JSON-serializable, MUST NOT contain secrets, and MUST be\n * treated as attacker-influenced data (the caller typically populates it\n * from the `/start` request).\n */\nexport interface PendingWebFlow {\n state: string;\n agentId: string;\n agentUrl: string;\n codeVerifier: string;\n redirectUri: string;\n resource?: string;\n scope?: string;\n authorizationServerUrl: string;\n /** Persist as JSON (e.g. Postgres `jsonb`); contents are MCP SDK-typed. */\n clientInformation: OAuthClientInformation;\n createdAt: Date;\n expiresAt: Date;\n /** JSON-serializable, no secrets, attacker-influenced. */\n carry?: Record<string, unknown>;\n}\n\n/**\n * Persistence interface for in-flight web OAuth flows.\n *\n * Canonical implementations:\n *\n * Postgres:\n * ```sql\n * INSERT INTO pending_oauth_flows (state, payload, expires_at)\n * VALUES ($1, $2, $3);\n * -- consume:\n * DELETE FROM pending_oauth_flows\n * WHERE state = $1 AND expires_at > now()\n * RETURNING payload;\n * ```\n *\n * Redis:\n * ```\n * SET pending:flow:<state> <payload> EX 600 NX -- put\n * GETDEL pending:flow:<state> -- consume\n * ```\n *\n * `consume` MUST be a single atomic operation that deletes and returns the\n * row (or returns null). A `SELECT` followed by a separate `DELETE` is a\n * replay vulnerability and DOES NOT satisfy this contract — a callback\n * replayed before the first one commits would mint two tokens.\n *\n * `consume` MUST treat expired rows as absent (return null) and SHOULD\n * delete them on read so a separate sweep is not strictly required.\n *\n * **Tradeoff: consume runs before token exchange.** `completeWebOAuthFlow`\n * consumes the pending row before attempting `exchangeAuthorization`. If\n * the AS returns a transient 5xx (or the network blips between us and the\n * AS), the row is gone and the user must restart from `/oauth/start`.\n * This is the right call for `invalid_grant` (replay protection — the\n * authorization code is one-shot at the AS regardless), but it means\n * transient AS failures cost the user a click. Revisit only if you see\n * real retry-loss in the field.\n */\nexport interface PendingWebFlowStore {\n /** Insert a new flow. MUST reject duplicate `state`. */\n put(flow: PendingWebFlow): Promise<void>;\n /**\n * Atomic delete-and-return. MUST NOT return the same row twice.\n * Returns null if the row is absent or expired.\n */\n consume(state: string): Promise<PendingWebFlow | null>;\n /** Optional housekeeping for expired rows that were never claimed. */\n cleanupExpired?(): Promise<number>;\n}\n\n/** @deprecated Renamed to `PendingWebFlowStore`. */\nexport type PendingFlowStore = PendingWebFlowStore;\n\nexport class InvalidOrExpiredFlowError extends OAuthError {\n constructor(state: string) {\n super(`OAuth flow not found or expired (state=${state})`, 'invalid_or_expired_flow');\n this.name = 'InvalidOrExpiredFlowError';\n }\n}\n\nexport class StateMismatchError extends OAuthError {\n constructor() {\n super('OAuth state does not match the value the caller bound to this session', 'state_mismatch');\n this.name = 'StateMismatchError';\n }\n}\n\nexport class TokenExchangeError extends OAuthError {\n constructor(\n message: string,\n public readonly status: number,\n public readonly body: string,\n /**\n * RFC 6749 §5.2 error code when the authorization server returned a\n * standard error envelope (`invalid_grant`, `invalid_client`, etc.).\n * Undefined when the AS returned a non-OAuth-shaped failure.\n */\n public readonly oauthErrorCode?: string\n ) {\n super(message, 'token_exchange_failed');\n this.name = 'TokenExchangeError';\n }\n}\n\nexport class ProtectedResourceMetadataError extends OAuthError {\n constructor(message: string) {\n super(message, 'protected_resource_metadata_error');\n this.name = 'ProtectedResourceMetadataError';\n }\n}\n\nexport class AgentVanishedDuringFlowError extends OAuthError {\n constructor(agentId: string) {\n super(\n `Agent ${agentId} could not be loaded from storage during token persistence; tokens were not saved`,\n 'agent_vanished_during_flow',\n agentId\n );\n this.name = 'AgentVanishedDuringFlowError';\n }\n}\n\nexport class ConfidentialClientNotAllowedError extends OAuthError {\n constructor(agentId: string | undefined) {\n super(\n 'Authorization server issued a confidential client (client_secret) during dynamic registration. ' +\n 'Pass `allowConfidentialClient: true` if you intend to persist a long-lived AS credential to your agent storage.',\n 'confidential_client_not_allowed',\n agentId\n );\n this.name = 'ConfidentialClientNotAllowedError';\n }\n}\n\nexport class BrowserBindingRequiredError extends OAuthError {\n constructor() {\n super(\n 'completeWebOAuthFlow called with requireBrowserBinding:true but expectedState was not supplied — ' +\n 'pass the state value from the session cookie set at /oauth/start',\n 'browser_binding_required'\n );\n this.name = 'BrowserBindingRequiredError';\n }\n}\n\nexport interface StartWebFlowOptions {\n /** Agent the flow is for. Must include `agent_uri`. */\n agent: AgentConfig;\n /** Absolute URL of the consumer's `/callback` route (must match what the AS sees). */\n redirectUri: string;\n /** Where to persist the pending flow until callback. */\n pendingFlowStore: PendingWebFlowStore;\n /** When provided, dynamic-registration results land in `agent.oauth_client`. */\n agentStorage?: OAuthConfigStorage;\n /**\n * Free-form caller payload, round-tripped to `completeWebOAuthFlow`.\n * Must be JSON-serializable. Do not store secrets here. Treated as\n * attacker-influenced — validate before reflecting (e.g. via\n * {@link safeReturnTo} for redirect targets).\n */\n carry?: Record<string, unknown>;\n /**\n * Scope hint (highest priority per SEP-835). Pass through the `scope`\n * value from a prior 401 `WWW-Authenticate` challenge if you have one.\n */\n scopeHint?: string;\n /** Override flow TTL. Default: {@link DEFAULT_WEB_FLOW_TTL_MS}. */\n ttlMs?: number;\n /** Override the random-state generator (defaults to 32 bytes base64url). */\n generateState?: () => string;\n /** Override `fetch` (timeouts, signing, mocks). */\n fetch?: typeof fetch;\n /**\n * Override base client metadata. `redirect_uris` is always replaced\n * with `[redirectUri]` regardless of what's passed here.\n */\n clientMetadata?: Partial<OAuthClientMetadata>;\n /**\n * Permit the AS to register a confidential client (i.e. one that\n * returns a `client_secret` from dynamic registration). Default false:\n * if the AS issues a secret we throw {@link ConfidentialClientNotAllowedError}\n * rather than silently persisting a long-lived credential to your\n * agent storage.\n */\n allowConfidentialClient?: boolean;\n}\n\nexport interface StartWebFlowResult {\n authorizationUrl: string;\n state: string;\n expiresAt: Date;\n}\n\nexport interface CompleteWebFlowOptions {\n state: string;\n code: string;\n pendingFlowStore: PendingWebFlowStore;\n /** When provided, the issued tokens are persisted to `agent.oauth_tokens`. */\n agentStorage?: OAuthConfigStorage;\n fetch?: typeof fetch;\n /**\n * The caller-bound expected state (e.g. from a session cookie set at\n * `/oauth/start`). When provided, must equal `state`; mismatch throws\n * {@link StateMismatchError}. Without this, `state` is replay-protected\n * but not browser-bound — see WEB-OAUTH.md.\n */\n expectedState?: string;\n /**\n * When `true`, throws {@link BrowserBindingRequiredError} if `expectedState`\n * is omitted instead of emitting a `console.warn`. Use this in frameworks\n * where session cookies are always available so that a missing bind is caught\n * at development time rather than silently permitted in production.\n *\n * Default: `false`.\n */\n requireBrowserBinding?: boolean;\n}\n\nexport interface CompleteWebFlowResult {\n agentId: string;\n agentUrl: string;\n tokens: OAuthTokens;\n carry?: Record<string, unknown>;\n /** True if `agentStorage` was provided AND `saveAgent` succeeded. */\n persisted: boolean;\n}\n\n/**\n * Begin a web OAuth flow. Returns the authorization URL the consumer\n * should redirect the browser to. Persists the PKCE verifier and other\n * flow state via `pendingFlowStore.put` so a different process can complete it.\n */\nexport async function startWebOAuthFlow(opts: StartWebFlowOptions): Promise<StartWebFlowResult> {\n const {\n agent,\n redirectUri,\n pendingFlowStore,\n agentStorage,\n carry,\n scopeHint,\n ttlMs = DEFAULT_WEB_FLOW_TTL_MS,\n generateState,\n fetch: fetchFn,\n clientMetadata: clientMetadataOverrides,\n allowConfidentialClient = false,\n } = opts;\n\n if (!agent.agent_uri) {\n throw new OAuthError('Agent missing agent_uri', 'invalid_agent', agent.id);\n }\n\n const prm = await tryDiscoverPRM(agent.agent_uri, fetchFn);\n if (prm?.resource) {\n assertPrmResourceMatchesAgentOrigin(agent.agent_uri, prm.resource);\n }\n\n const asUrl = resolveAuthorizationServerUrl(agent.agent_uri, prm);\n\n const asMetadata = await discoverAuthorizationServerMetadata(asUrl.toString(), { fetchFn });\n if (!asMetadata) {\n throw new OAuthError(`No OAuth metadata at ${asUrl.toString()}`, 'no_authorization_server_metadata', agent.id);\n }\n\n const resource = prm?.resource ? new URL(prm.resource) : resourceUrlFromServerUrl(new URL(agent.agent_uri));\n\n const baseClientMetadata: OAuthClientMetadata = {\n ...DEFAULT_CLIENT_METADATA,\n ...clientMetadataOverrides,\n redirect_uris: [redirectUri],\n };\n\n const scope = scopeHint ?? prm?.scopes_supported?.join(' ') ?? baseClientMetadata.scope;\n\n const clientInformation = await resolveClientInformation({\n agent,\n agentStorage,\n asUrl,\n asMetadata,\n clientMetadata: baseClientMetadata,\n fetchFn,\n allowConfidentialClient,\n });\n\n const state = (generateState ?? defaultGenerateState)();\n const { authorizationUrl, codeVerifier } = await startAuthorization(asUrl.toString(), {\n metadata: asMetadata,\n clientInformation,\n redirectUrl: redirectUri,\n scope,\n state,\n resource,\n });\n\n const now = new Date();\n const expiresAt = new Date(now.getTime() + ttlMs);\n const flow: PendingWebFlow = {\n state,\n agentId: agent.id,\n agentUrl: agent.agent_uri,\n codeVerifier,\n redirectUri,\n resource: resource.href,\n scope,\n authorizationServerUrl: asUrl.toString(),\n clientInformation,\n createdAt: now,\n expiresAt,\n carry,\n };\n await pendingFlowStore.put(flow);\n\n return {\n authorizationUrl: authorizationUrl.toString(),\n state,\n expiresAt,\n };\n}\n\n/**\n * Finish a web OAuth flow. Atomically consumes the pending row, exchanges\n * the authorization code for tokens, and (if storage is provided)\n * persists tokens to `agent.oauth_tokens`. Returns whatever the caller\n * stashed in `carry` so the consumer can route the user appropriately.\n *\n * The pending row is consumed BEFORE `exchangeAuthorization` runs. A\n * transient AS failure leaves the user with no row to retry against and\n * they must restart from `/oauth/start`. See {@link PendingWebFlowStore}\n * for the full tradeoff discussion.\n */\nexport async function completeWebOAuthFlow(opts: CompleteWebFlowOptions): Promise<CompleteWebFlowResult> {\n const { state, code, pendingFlowStore, agentStorage, fetch: fetchFn, expectedState, requireBrowserBinding } = opts;\n\n if (expectedState === undefined) {\n if (requireBrowserBinding) {\n throw new BrowserBindingRequiredError();\n }\n // Warn callers who omit expectedState: the flow is replay-protected via\n // atomic consume but is not browser-bound (any request carrying the correct\n // state + code would be accepted). Pass expectedState from a session cookie\n // set at /oauth/start to fully bind the callback to the initiating browser.\n // Set requireBrowserBinding:true to make this a hard error instead.\n console.warn(\n '[adcp/sdk] completeWebOAuthFlow: expectedState not supplied — the callback is replay-protected ' +\n 'but not browser-bound. Pass expectedState from a session cookie set at /oauth/start, ' +\n 'or set requireBrowserBinding:true to enforce it.'\n );\n } else if (expectedState !== state) {\n throw new StateMismatchError();\n }\n\n const flow = await pendingFlowStore.consume(state);\n if (!flow || flow.expiresAt.getTime() < Date.now()) {\n throw new InvalidOrExpiredFlowError(state);\n }\n\n const asMetadata = await discoverAuthorizationServerMetadata(flow.authorizationServerUrl, {\n fetchFn,\n });\n\n let tokens: OAuthTokens;\n try {\n tokens = await exchangeAuthorization(flow.authorizationServerUrl, {\n metadata: asMetadata ?? undefined,\n clientInformation: flow.clientInformation,\n authorizationCode: code,\n codeVerifier: flow.codeVerifier,\n redirectUri: flow.redirectUri,\n resource: flow.resource ? new URL(flow.resource) : undefined,\n fetchFn,\n });\n } catch (err) {\n throw wrapTokenExchangeError(err);\n }\n\n let persisted = false;\n if (agentStorage) {\n const agent = await agentStorage.loadAgent(flow.agentId);\n if (!agent) {\n throw new AgentVanishedDuringFlowError(flow.agentId);\n }\n agent.oauth_tokens = fromMCPTokens(tokens);\n delete agent.oauth_code_verifier;\n await agentStorage.saveAgent(agent);\n persisted = true;\n }\n\n return {\n agentId: flow.agentId,\n agentUrl: flow.agentUrl,\n tokens,\n carry: flow.carry,\n persisted,\n };\n}\n\n/**\n * Validate a redirect target supplied via `carry`.\n *\n * Treats `value` as attacker-influenced. Returns a string that is safe to\n * pass to `res.redirect`, or `undefined` if the value is invalid.\n *\n * Defaults to **path-only** redirects (must start with a single `/` and\n * not be protocol-relative `//evil.example`). Pass `allowedReturnHosts`\n * to permit absolute URLs against an allowlist.\n *\n * @example\n * ```ts\n * res.redirect(safeReturnTo(carry?.return_to) ?? '/');\n * res.redirect(safeReturnTo(carry?.return_to, { allowedReturnHosts: ['app.example.com'] }) ?? '/');\n * ```\n */\nexport function safeReturnTo(value: unknown, options: { allowedReturnHosts?: string[] } = {}): string | undefined {\n if (typeof value !== 'string' || value.length === 0) return undefined;\n\n // Path-only: must be `/...` but not `//...` (protocol-relative) or `/\\...`.\n if (value.startsWith('/') && !value.startsWith('//') && !value.startsWith('/\\\\')) {\n return value;\n }\n\n const allowed = options.allowedReturnHosts;\n if (!allowed || allowed.length === 0) return undefined;\n\n let parsed: URL;\n try {\n parsed = new URL(value);\n } catch {\n return undefined;\n }\n if (parsed.protocol !== 'https:' && parsed.protocol !== 'http:') return undefined;\n if (!allowed.includes(parsed.host)) return undefined;\n return parsed.toString();\n}\n\n/**\n * In-memory pending-flow store for tests and single-instance dev.\n *\n * Production deployments MUST implement `PendingWebFlowStore` against a\n * shared store (Postgres `DELETE … RETURNING`, Redis `GETDEL`) so\n * `/start` and `/callback` can hit different processes.\n */\nexport class InMemoryPendingFlowStore implements PendingWebFlowStore {\n private readonly flows = new Map<string, PendingWebFlow>();\n\n async put(flow: PendingWebFlow): Promise<void> {\n if (this.flows.has(flow.state)) {\n throw new Error(`Pending flow already exists for state ${flow.state}`);\n }\n this.flows.set(flow.state, flow);\n }\n\n async consume(state: string): Promise<PendingWebFlow | null> {\n const flow = this.flows.get(state);\n if (!flow) return null;\n this.flows.delete(state);\n if (flow.expiresAt.getTime() < Date.now()) return null;\n return flow;\n }\n\n async cleanupExpired(): Promise<number> {\n const now = Date.now();\n let removed = 0;\n for (const [state, flow] of this.flows) {\n if (flow.expiresAt.getTime() < now) {\n this.flows.delete(state);\n removed++;\n }\n }\n return removed;\n }\n}\n\n// ============================================================\n// Internals\n// ============================================================\n\n/**\n * The MCP SDK reports a 404 PRM lookup with this exact message; treat it\n * as \"PRM is genuinely absent\" and fall back. Anything else is a\n * connection, parse, or 5xx error and is allowed to bubble.\n *\n * Source (verified against `@modelcontextprotocol/sdk@1.29.0`):\n * `dist/esm/client/auth.js` → `discoverOAuthProtectedResourceMetadata`\n * throws `new Error(`Resource server does not implement OAuth 2.0 Protected Resource Metadata.`)`\n * when `response.status === 404` (or no response was returned).\n *\n * If a future MCP SDK reword this message, the test\n * \"falls back to server-derived resource on a 404 PRM\" at\n * `test/lib/oauth-web-flow.test.js` will fail — that test calls the real\n * SDK against a 404 fixture and is the canary for this regression.\n */\nconst PRM_ABSENT_MARKER = 'does not implement OAuth 2.0 Protected Resource Metadata';\n\nasync function tryDiscoverPRM(\n agentUrl: string,\n fetchFn: typeof fetch | undefined\n): Promise<OAuthProtectedResourceMetadata | undefined> {\n try {\n return await discoverOAuthProtectedResourceMetadata(agentUrl, undefined, fetchFn);\n } catch (err) {\n if (err instanceof Error && err.message.includes(PRM_ABSENT_MARKER)) {\n // PRM is optional under RFC 9728 — fall back to local resource\n // derivation. Connection/parse/5xx errors fall through.\n return undefined;\n }\n const message = err instanceof Error ? err.message : String(err);\n throw new ProtectedResourceMetadataError(`PRM discovery failed: ${message}`);\n }\n}\n\nfunction assertPrmResourceMatchesAgentOrigin(agentUrl: string, prmResource: string): void {\n const requested = resourceUrlFromServerUrl(new URL(agentUrl));\n if (!checkResourceAllowed({ requestedResource: requested, configuredResource: prmResource })) {\n throw new ProtectedResourceMetadataError(\n `PRM advertises resource ${prmResource} which does not share an origin/path with agent ${agentUrl}`\n );\n }\n}\n\nfunction resolveAuthorizationServerUrl(agentUrl: string, prm: OAuthProtectedResourceMetadata | undefined): URL {\n const first = prm?.authorization_servers?.[0];\n if (first) {\n return new URL(first);\n }\n return new URL(new URL(agentUrl).origin);\n}\n\nasync function resolveClientInformation(args: {\n agent: AgentConfig;\n agentStorage?: OAuthConfigStorage;\n asUrl: URL;\n asMetadata: AuthorizationServerMetadata;\n clientMetadata: OAuthClientMetadata;\n fetchFn?: typeof fetch;\n allowConfidentialClient: boolean;\n}): Promise<OAuthClientInformation> {\n const { agent, agentStorage, asUrl, asMetadata, clientMetadata, fetchFn, allowConfidentialClient } = args;\n\n if (agent.oauth_client) {\n return toMCPClientInfo(agent.oauth_client);\n }\n\n if (!asMetadata.registration_endpoint) {\n throw new OAuthError(\n 'Agent has no oauth_client and authorization server does not advertise dynamic client registration',\n 'no_client_credentials',\n agent.id\n );\n }\n\n const registered: OAuthClientInformationFull = await registerClient(asUrl.toString(), {\n metadata: asMetadata,\n clientMetadata,\n fetchFn,\n });\n\n if (registered.client_secret && !allowConfidentialClient) {\n throw new ConfidentialClientNotAllowedError(agent.id);\n }\n\n if (agentStorage) {\n // Load fresh and save fresh so two concurrent /start calls for the\n // same agentId do not trample each other's `oauth_client` via a\n // shared in-memory reference.\n const fresh = (await agentStorage.loadAgent(agent.id)) ?? agent;\n fresh.oauth_client = fromMCPClientInfo(registered);\n await agentStorage.saveAgent(fresh);\n }\n\n return registered;\n}\n\nfunction defaultGenerateState(): string {\n return randomBytes(32).toString('base64url');\n}\n\n/**\n * Map an MCP SDK token-exchange failure to {@link TokenExchangeError},\n * redacting bearer/refresh tokens that some authorization servers echo\n * back in error responses for debugging.\n */\nfunction wrapTokenExchangeError(err: unknown): TokenExchangeError {\n // The MCP SDK's `parseErrorResponse` decodes a well-formed OAuth error\n // envelope into an `OAuthError` subclass with `errorCode` (e.g.\n // `InvalidGrantError`). Malformed responses come through as\n // `ServerError` with the raw body in `message`, so the redaction pass\n // covers both cases.\n const oauthErrorCode = (err as { errorCode?: string })?.errorCode;\n const message = err instanceof Error ? err.message : String(err);\n const status = (err as { status?: number })?.status ?? 0;\n const rawBody = (err as { body?: string })?.body ?? message;\n const body = redactTokens(rawBody);\n const display = oauthErrorCode ? `${oauthErrorCode}: ${message}` : message;\n return new TokenExchangeError(`Token exchange failed: ${redactTokens(display)}`, status, body, oauthErrorCode);\n}\n\nconst SENSITIVE_TOKEN_KEYS = ['access_token', 'refresh_token', 'id_token', 'token'];\n\n/**\n * Best-effort redaction of bearer/refresh tokens from an AS error body\n * (which may be JSON, form-encoded, or freeform). Adopters MUST still\n * treat `TokenExchangeError.body` as sensitive — do not reflect it to\n * the browser or write it to access logs unredacted.\n */\nfunction redactTokens(input: string): string {\n let out = input;\n for (const key of SENSITIVE_TOKEN_KEYS) {\n // JSON form: \"key\":\"…\"\n out = out.replace(new RegExp(`(\"${key}\"\\\\s*:\\\\s*\")[^\"]*(\")`, 'gi'), '$1<redacted>$2');\n // form-encoded: key=…\n out = out.replace(new RegExp(`(\\\\b${key}=)[^&\\\\s]+`, 'gi'), '$1<redacted>');\n }\n return out;\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../../../src/lib/auth/oauth/web-flow.ts"],"sourcesContent":["/**\n * Web (server-side) OAuth flow helpers for `@adcp/sdk`.\n *\n * Companion to `CLIFlowHandler` for environments where `/oauth/start` and\n * `/oauth/callback` may be served by different processes. Discovery, PKCE,\n * URL construction, and token exchange are delegated to the MCP SDK's\n * `client/auth.js` primitives so this module is glue plus a pending-flow\n * store interface — not reimplemented protocol logic.\n *\n * Wire contract:\n * - An operator `resourceOverride` takes precedence for legacy or\n * non-conformant integrations. Otherwise PRM (RFC 9728) is consulted;\n * `prm.resource` is the source of truth for the RFC 8707 `resource`\n * indicator. We fall back to\n * `resourceUrlFromServerUrl(agent.agent_uri)` only when the resource\n * server does not implement PRM (404). Connection / parse / 5xx\n * errors throw `ProtectedResourceMetadataError` — never silently\n * downgrade to local guessing.\n * - Without a trusted override, `prm.resource` must share an origin with\n * the agent URL; the MCP SDK's `checkResourceAllowed` guards against a\n * poisoned PRM pointing the audience at a third party.\n * - AS URL = `prm.authorization_servers[0]` when PRM is present, else\n * the agent origin.\n * - Scope priority: caller-supplied `scopeHint` (e.g. from a 401\n * `WWW-Authenticate` challenge, per SEP-835) > `prm.scopes_supported`\n * > `clientMetadata.scope`.\n * - Refresh is NOT this module's concern. Once `oauth_tokens` are\n * persisted, `MCPOAuthProvider` handles refresh on the next agent\n * call and the MCP SDK forwards `resource` into the refresh request.\n * Callers who DIY refresh against `oauth_tokens` are responsible for\n * forwarding `resource` themselves.\n */\n\nimport { randomBytes } from 'crypto';\nimport {\n discoverAuthorizationServerMetadata,\n discoverOAuthProtectedResourceMetadata,\n exchangeAuthorization,\n registerClient,\n startAuthorization,\n} from '@modelcontextprotocol/sdk/client/auth.js';\nimport { checkResourceAllowed, resourceUrlFromServerUrl } from '@modelcontextprotocol/sdk/shared/auth-utils.js';\nimport type {\n AuthorizationServerMetadata,\n OAuthClientInformation,\n OAuthClientInformationFull,\n OAuthClientMetadata,\n OAuthProtectedResourceMetadata,\n OAuthTokens,\n} from '@modelcontextprotocol/sdk/shared/auth.js';\n\nimport type { AgentConfig, OAuthConfigStorage } from './types';\nimport { DEFAULT_CLIENT_METADATA, fromMCPClientInfo, fromMCPTokens, OAuthError, toMCPClientInfo } from './types';\nimport { validateOAuthResourceUrl } from './resource-url';\n\n/**\n * Default TTL for a pending web flow row. RFC 6749 §10.12 recommends\n * short-lived state; 10 minutes covers slow-typing users without leaving\n * the PKCE verifier on disk longer than necessary.\n */\nexport const DEFAULT_WEB_FLOW_TTL_MS = 10 * 60 * 1000;\n\n/**\n * State persisted between `/oauth/start` and `/oauth/callback`.\n *\n * `codeVerifier` is a PKCE secret. Store implementations MUST encrypt it\n * at rest if persistence crosses a trust boundary (shared DB, cross-tenant\n * Redis, etc.).\n *\n * `carry` is preserved verbatim and round-tripped to the callback. It\n * MUST be JSON-serializable, MUST NOT contain secrets, and MUST be\n * treated as attacker-influenced data (the caller typically populates it\n * from the `/start` request).\n */\nexport interface PendingWebFlow {\n state: string;\n agentId: string;\n agentUrl: string;\n codeVerifier: string;\n redirectUri: string;\n resource?: string;\n /** Explicit operator override, persisted separately so refresh can retain it. */\n resourceOverride?: string;\n /** Mutation requested by this flow. Absent on legacy rows and preserve-only flows. */\n resourceOverrideAction?: 'set' | 'clear';\n /** Value observed at flow start; used to reject concurrent operator edits. */\n resourceOverrideSnapshot?: string | null;\n scope?: string;\n authorizationServerUrl: string;\n /** Persist as JSON (e.g. Postgres `jsonb`); contents are MCP SDK-typed. */\n clientInformation: OAuthClientInformation;\n createdAt: Date;\n expiresAt: Date;\n /** JSON-serializable, no secrets, attacker-influenced. */\n carry?: Record<string, unknown>;\n}\n\n/**\n * Persistence interface for in-flight web OAuth flows.\n *\n * Canonical implementations:\n *\n * Postgres:\n * ```sql\n * INSERT INTO pending_oauth_flows (state, payload, expires_at)\n * VALUES ($1, $2, $3);\n * -- consume:\n * DELETE FROM pending_oauth_flows\n * WHERE state = $1 AND expires_at > now()\n * RETURNING payload;\n * ```\n *\n * Redis:\n * ```\n * SET pending:flow:<state> <payload> EX 600 NX -- put\n * GETDEL pending:flow:<state> -- consume\n * ```\n *\n * `consume` MUST be a single atomic operation that deletes and returns the\n * row (or returns null). A `SELECT` followed by a separate `DELETE` is a\n * replay vulnerability and DOES NOT satisfy this contract — a callback\n * replayed before the first one commits would mint two tokens.\n *\n * `consume` MUST treat expired rows as absent (return null) and SHOULD\n * delete them on read so a separate sweep is not strictly required.\n *\n * **Tradeoff: consume runs before token exchange.** `completeWebOAuthFlow`\n * consumes the pending row before attempting `exchangeAuthorization`. If\n * the AS returns a transient 5xx (or the network blips between us and the\n * AS), the row is gone and the user must restart from `/oauth/start`.\n * This is the right call for `invalid_grant` (replay protection — the\n * authorization code is one-shot at the AS regardless), but it means\n * transient AS failures cost the user a click. Revisit only if you see\n * real retry-loss in the field.\n */\nexport interface PendingWebFlowStore {\n /** Insert a new flow. MUST reject duplicate `state`. */\n put(flow: PendingWebFlow): Promise<void>;\n /**\n * Atomic delete-and-return. MUST NOT return the same row twice.\n * Returns null if the row is absent or expired.\n */\n consume(state: string): Promise<PendingWebFlow | null>;\n /** Optional housekeeping for expired rows that were never claimed. */\n cleanupExpired?(): Promise<number>;\n}\n\n/** @deprecated Renamed to `PendingWebFlowStore`. */\nexport type PendingFlowStore = PendingWebFlowStore;\n\nexport class InvalidOrExpiredFlowError extends OAuthError {\n constructor(state: string) {\n super(`OAuth flow not found or expired (state=${state})`, 'invalid_or_expired_flow');\n this.name = 'InvalidOrExpiredFlowError';\n }\n}\n\nexport class StateMismatchError extends OAuthError {\n constructor() {\n super('OAuth state does not match the value the caller bound to this session', 'state_mismatch');\n this.name = 'StateMismatchError';\n }\n}\n\nexport class TokenExchangeError extends OAuthError {\n constructor(\n message: string,\n public readonly status: number,\n public readonly body: string,\n /**\n * RFC 6749 §5.2 error code when the authorization server returned a\n * standard error envelope (`invalid_grant`, `invalid_client`, etc.).\n * Undefined when the AS returned a non-OAuth-shaped failure.\n */\n public readonly oauthErrorCode?: string\n ) {\n super(message, 'token_exchange_failed');\n this.name = 'TokenExchangeError';\n }\n}\n\nexport class ProtectedResourceMetadataError extends OAuthError {\n constructor(message: string) {\n super(message, 'protected_resource_metadata_error');\n this.name = 'ProtectedResourceMetadataError';\n }\n}\n\nexport class AgentVanishedDuringFlowError extends OAuthError {\n constructor(agentId: string) {\n super(\n `Agent ${agentId} could not be loaded from storage during token persistence; tokens were not saved`,\n 'agent_vanished_during_flow',\n agentId\n );\n this.name = 'AgentVanishedDuringFlowError';\n }\n}\n\nexport class AgentChangedDuringFlowError extends OAuthError {\n constructor(agentId: string) {\n super(\n `Agent ${agentId} changed while OAuth authorization was pending; tokens were not saved`,\n 'agent_changed_during_flow',\n agentId\n );\n this.name = 'AgentChangedDuringFlowError';\n }\n}\n\nexport class ConfidentialClientNotAllowedError extends OAuthError {\n constructor(agentId: string | undefined) {\n super(\n 'Authorization server issued a confidential client (client_secret) during dynamic registration. ' +\n 'Pass `allowConfidentialClient: true` if you intend to persist a long-lived AS credential to your agent storage.',\n 'confidential_client_not_allowed',\n agentId\n );\n this.name = 'ConfidentialClientNotAllowedError';\n }\n}\n\nexport class BrowserBindingRequiredError extends OAuthError {\n constructor() {\n super(\n 'completeWebOAuthFlow called with requireBrowserBinding:true but expectedState was not supplied — ' +\n 'pass the state value from the session cookie set at /oauth/start',\n 'browser_binding_required'\n );\n this.name = 'BrowserBindingRequiredError';\n }\n}\n\nexport interface StartWebFlowOptions {\n /** Agent the flow is for. Must include `agent_uri`. */\n agent: AgentConfig;\n /** Absolute URL of the consumer's `/callback` route (must match what the AS sees). */\n redirectUri: string;\n /** Where to persist the pending flow until callback. */\n pendingFlowStore: PendingWebFlowStore;\n /** When provided, dynamic-registration results land in `agent.oauth_client`. */\n agentStorage?: OAuthConfigStorage;\n /**\n * Free-form caller payload, round-tripped to `completeWebOAuthFlow`.\n * Must be JSON-serializable. Do not store secrets here. Treated as\n * attacker-influenced — validate before reflecting (e.g. via\n * {@link safeReturnTo} for redirect targets).\n */\n carry?: Record<string, unknown>;\n /**\n * Scope hint (highest priority per SEP-835). Pass through the `scope`\n * value from a prior 401 `WWW-Authenticate` challenge if you have one.\n */\n scopeHint?: string;\n /**\n * Operator-supplied RFC 8707 resource override. Takes precedence over\n * `prm.resource` and the agent-URL-derived fallback, and is sent during\n * both authorization and code exchange. Pass `null` to explicitly clear a\n * persisted override and return to metadata/agent-URL discovery.\n */\n resourceOverride?: string | null;\n /**\n * Non-standard Auth0-compatible audience parameter. Sent only to the\n * authorization endpoint. Prefer `resourceOverride` for RFC 8707 servers.\n */\n audience?: string;\n /** Permit an HTTP resource override for local development. Default false. */\n allowHttp?: boolean;\n /** Override flow TTL. Default: {@link DEFAULT_WEB_FLOW_TTL_MS}. */\n ttlMs?: number;\n /** Override the random-state generator (defaults to 32 bytes base64url). */\n generateState?: () => string;\n /** Override `fetch` (timeouts, signing, mocks). */\n fetch?: typeof fetch;\n /**\n * Override base client metadata. `redirect_uris` is always replaced\n * with `[redirectUri]` regardless of what's passed here.\n */\n clientMetadata?: Partial<OAuthClientMetadata>;\n /**\n * Permit the AS to register a confidential client (i.e. one that\n * returns a `client_secret` from dynamic registration). Default false:\n * if the AS issues a secret we throw {@link ConfidentialClientNotAllowedError}\n * rather than silently persisting a long-lived credential to your\n * agent storage.\n */\n allowConfidentialClient?: boolean;\n}\n\nexport interface StartWebFlowResult {\n authorizationUrl: string;\n state: string;\n expiresAt: Date;\n}\n\nexport interface CompleteWebFlowOptions {\n state: string;\n code: string;\n pendingFlowStore: PendingWebFlowStore;\n /** When provided, the issued tokens are persisted to `agent.oauth_tokens`. */\n agentStorage?: OAuthConfigStorage;\n fetch?: typeof fetch;\n /**\n * The caller-bound expected state (e.g. from a session cookie set at\n * `/oauth/start`). When provided, must equal `state`; mismatch throws\n * {@link StateMismatchError}. Without this, `state` is replay-protected\n * but not browser-bound — see WEB-OAUTH.md.\n */\n expectedState?: string;\n /**\n * When `true`, throws {@link BrowserBindingRequiredError} if `expectedState`\n * is omitted instead of emitting a `console.warn`. Use this in frameworks\n * where session cookies are always available so that a missing bind is caught\n * at development time rather than silently permitted in production.\n *\n * Default: `false`.\n */\n requireBrowserBinding?: boolean;\n}\n\nexport interface CompleteWebFlowResult {\n agentId: string;\n agentUrl: string;\n tokens: OAuthTokens;\n carry?: Record<string, unknown>;\n /** True if `agentStorage` was provided AND `saveAgent` succeeded. */\n persisted: boolean;\n}\n\n/**\n * Begin a web OAuth flow. Returns the authorization URL the consumer\n * should redirect the browser to. Persists the PKCE verifier and other\n * flow state via `pendingFlowStore.put` so a different process can complete it.\n */\nexport async function startWebOAuthFlow(opts: StartWebFlowOptions): Promise<StartWebFlowResult> {\n const {\n agent,\n redirectUri,\n pendingFlowStore,\n agentStorage,\n carry,\n scopeHint,\n resourceOverride: requestedResourceOverride,\n audience,\n allowHttp = false,\n ttlMs = DEFAULT_WEB_FLOW_TTL_MS,\n generateState,\n fetch: fetchFn,\n clientMetadata: clientMetadataOverrides,\n allowConfidentialClient = false,\n } = opts;\n\n if (!agent.agent_uri) {\n throw new OAuthError('Agent missing agent_uri', 'invalid_agent', agent.id);\n }\n\n const resourceOverrideAction =\n requestedResourceOverride === null ? 'clear' : requestedResourceOverride !== undefined ? 'set' : undefined;\n const rawResourceOverride =\n requestedResourceOverride === null ? undefined : (requestedResourceOverride ?? agent.oauth_resource);\n const resourceOverride = rawResourceOverride\n ? validateOAuthResourceUrl(rawResourceOverride, { allowHttp }).href\n : undefined;\n\n const prm = await tryDiscoverPRM(agent.agent_uri, fetchFn);\n if (!resourceOverride && prm?.resource) {\n assertPrmResourceMatchesAgentOrigin(agent.agent_uri, prm.resource);\n }\n\n const asUrl = resolveAuthorizationServerUrl(agent.agent_uri, prm);\n\n const asMetadata = await discoverAuthorizationServerMetadata(asUrl.toString(), { fetchFn });\n if (!asMetadata) {\n throw new OAuthError(`No OAuth metadata at ${asUrl.toString()}`, 'no_authorization_server_metadata', agent.id);\n }\n\n const resource = resourceOverride\n ? new URL(resourceOverride)\n : prm?.resource\n ? new URL(prm.resource)\n : resourceUrlFromServerUrl(new URL(agent.agent_uri));\n\n const baseClientMetadata: OAuthClientMetadata = {\n ...DEFAULT_CLIENT_METADATA,\n ...clientMetadataOverrides,\n redirect_uris: [redirectUri],\n };\n\n const scope = scopeHint ?? prm?.scopes_supported?.join(' ') ?? baseClientMetadata.scope;\n\n const clientInformation = await resolveClientInformation({\n agent,\n agentStorage,\n asUrl,\n asMetadata,\n clientMetadata: baseClientMetadata,\n fetchFn,\n allowConfidentialClient,\n });\n\n const state = (generateState ?? defaultGenerateState)();\n const { authorizationUrl, codeVerifier } = await startAuthorization(asUrl.toString(), {\n metadata: asMetadata,\n clientInformation,\n redirectUrl: redirectUri,\n scope,\n state,\n resource,\n });\n if (audience) {\n authorizationUrl.searchParams.set('audience', audience);\n }\n\n const now = new Date();\n const expiresAt = new Date(now.getTime() + ttlMs);\n const flow: PendingWebFlow = {\n state,\n agentId: agent.id,\n agentUrl: agent.agent_uri,\n codeVerifier,\n redirectUri,\n resource: resource.href,\n resourceOverride,\n resourceOverrideAction,\n resourceOverrideSnapshot: agent.oauth_resource ?? null,\n scope,\n authorizationServerUrl: asUrl.toString(),\n clientInformation,\n createdAt: now,\n expiresAt,\n carry,\n };\n await pendingFlowStore.put(flow);\n\n return {\n authorizationUrl: authorizationUrl.toString(),\n state,\n expiresAt,\n };\n}\n\n/**\n * Finish a web OAuth flow. Atomically consumes the pending row, exchanges\n * the authorization code for tokens, and (if storage is provided)\n * persists tokens to `agent.oauth_tokens`. Returns whatever the caller\n * stashed in `carry` so the consumer can route the user appropriately.\n *\n * The pending row is consumed BEFORE `exchangeAuthorization` runs. A\n * transient AS failure leaves the user with no row to retry against and\n * they must restart from `/oauth/start`. See {@link PendingWebFlowStore}\n * for the full tradeoff discussion.\n */\nexport async function completeWebOAuthFlow(opts: CompleteWebFlowOptions): Promise<CompleteWebFlowResult> {\n const { state, code, pendingFlowStore, agentStorage, fetch: fetchFn, expectedState, requireBrowserBinding } = opts;\n\n if (expectedState === undefined) {\n if (requireBrowserBinding) {\n throw new BrowserBindingRequiredError();\n }\n // Warn callers who omit expectedState: the flow is replay-protected via\n // atomic consume but is not browser-bound (any request carrying the correct\n // state + code would be accepted). Pass expectedState from a session cookie\n // set at /oauth/start to fully bind the callback to the initiating browser.\n // Set requireBrowserBinding:true to make this a hard error instead.\n console.warn(\n '[adcp/sdk] completeWebOAuthFlow: expectedState not supplied — the callback is replay-protected ' +\n 'but not browser-bound. Pass expectedState from a session cookie set at /oauth/start, ' +\n 'or set requireBrowserBinding:true to enforce it.'\n );\n } else if (expectedState !== state) {\n throw new StateMismatchError();\n }\n\n const flow = await pendingFlowStore.consume(state);\n if (!flow || flow.expiresAt.getTime() < Date.now()) {\n throw new InvalidOrExpiredFlowError(state);\n }\n\n let agentForPersistence: AgentConfig | undefined;\n if (agentStorage) {\n agentForPersistence = await agentStorage.loadAgent(flow.agentId);\n assertAgentUnchangedForFlow(agentForPersistence, flow);\n }\n\n const asMetadata = await discoverAuthorizationServerMetadata(flow.authorizationServerUrl, {\n fetchFn,\n });\n\n let tokens: OAuthTokens;\n try {\n tokens = await exchangeAuthorization(flow.authorizationServerUrl, {\n metadata: asMetadata ?? undefined,\n clientInformation: flow.clientInformation,\n authorizationCode: code,\n codeVerifier: flow.codeVerifier,\n redirectUri: flow.redirectUri,\n resource: flow.resource ? new URL(flow.resource) : undefined,\n fetchFn,\n });\n } catch (err) {\n throw wrapTokenExchangeError(err);\n }\n\n let persisted = false;\n if (agentStorage) {\n // Re-read after the network round trips so we do not save the stale object\n // loaded before token exchange or overwrite an edit made while the AS was\n // responding. Storage implementations that need a hard same-ID/same-URI\n // tenant guarantee should additionally make saveAgent revision-aware.\n agentForPersistence = await agentStorage.loadAgent(flow.agentId);\n assertAgentUnchangedForFlow(agentForPersistence, flow);\n agentForPersistence.oauth_tokens = fromMCPTokens(tokens);\n if (flow.resourceOverrideAction === 'set' && flow.resourceOverride) {\n agentForPersistence.oauth_resource = flow.resourceOverride;\n } else if (flow.resourceOverrideAction === 'clear') {\n delete agentForPersistence.oauth_resource;\n }\n delete agentForPersistence.oauth_code_verifier;\n await agentStorage.saveAgent(agentForPersistence);\n persisted = true;\n }\n\n return {\n agentId: flow.agentId,\n agentUrl: flow.agentUrl,\n tokens,\n carry: flow.carry,\n persisted,\n };\n}\n\nfunction assertAgentUnchangedForFlow(\n agent: AgentConfig | undefined,\n flow: PendingWebFlow\n): asserts agent is AgentConfig {\n if (!agent) {\n throw new AgentVanishedDuringFlowError(flow.agentId);\n }\n if (agent.agent_uri !== flow.agentUrl) {\n throw new AgentChangedDuringFlowError(flow.agentId);\n }\n if (\n Object.prototype.hasOwnProperty.call(flow, 'resourceOverrideSnapshot') &&\n (agent.oauth_resource ?? null) !== flow.resourceOverrideSnapshot\n ) {\n throw new AgentChangedDuringFlowError(flow.agentId);\n }\n}\n\n/**\n * Validate a redirect target supplied via `carry`.\n *\n * Treats `value` as attacker-influenced. Returns a string that is safe to\n * pass to `res.redirect`, or `undefined` if the value is invalid.\n *\n * Defaults to **path-only** redirects (must start with a single `/` and\n * not be protocol-relative `//evil.example`). Pass `allowedReturnHosts`\n * to permit absolute URLs against an allowlist.\n *\n * @example\n * ```ts\n * res.redirect(safeReturnTo(carry?.return_to) ?? '/');\n * res.redirect(safeReturnTo(carry?.return_to, { allowedReturnHosts: ['app.example.com'] }) ?? '/');\n * ```\n */\nexport function safeReturnTo(value: unknown, options: { allowedReturnHosts?: string[] } = {}): string | undefined {\n if (typeof value !== 'string' || value.length === 0) return undefined;\n\n // Path-only: must be `/...` but not `//...` (protocol-relative) or `/\\...`.\n if (value.startsWith('/') && !value.startsWith('//') && !value.startsWith('/\\\\')) {\n return value;\n }\n\n const allowed = options.allowedReturnHosts;\n if (!allowed || allowed.length === 0) return undefined;\n\n let parsed: URL;\n try {\n parsed = new URL(value);\n } catch {\n return undefined;\n }\n if (parsed.protocol !== 'https:' && parsed.protocol !== 'http:') return undefined;\n if (!allowed.includes(parsed.host)) return undefined;\n return parsed.toString();\n}\n\n/**\n * In-memory pending-flow store for tests and single-instance dev.\n *\n * Production deployments MUST implement `PendingWebFlowStore` against a\n * shared store (Postgres `DELETE … RETURNING`, Redis `GETDEL`) so\n * `/start` and `/callback` can hit different processes.\n */\nexport class InMemoryPendingFlowStore implements PendingWebFlowStore {\n private readonly flows = new Map<string, PendingWebFlow>();\n\n async put(flow: PendingWebFlow): Promise<void> {\n if (this.flows.has(flow.state)) {\n throw new Error(`Pending flow already exists for state ${flow.state}`);\n }\n this.flows.set(flow.state, flow);\n }\n\n async consume(state: string): Promise<PendingWebFlow | null> {\n const flow = this.flows.get(state);\n if (!flow) return null;\n this.flows.delete(state);\n if (flow.expiresAt.getTime() < Date.now()) return null;\n return flow;\n }\n\n async cleanupExpired(): Promise<number> {\n const now = Date.now();\n let removed = 0;\n for (const [state, flow] of this.flows) {\n if (flow.expiresAt.getTime() < now) {\n this.flows.delete(state);\n removed++;\n }\n }\n return removed;\n }\n}\n\n// ============================================================\n// Internals\n// ============================================================\n\n/**\n * The MCP SDK reports a 404 PRM lookup with this exact message; treat it\n * as \"PRM is genuinely absent\" and fall back. Anything else is a\n * connection, parse, or 5xx error and is allowed to bubble.\n *\n * Source (verified against `@modelcontextprotocol/sdk@1.29.0`):\n * `dist/esm/client/auth.js` → `discoverOAuthProtectedResourceMetadata`\n * throws `new Error(`Resource server does not implement OAuth 2.0 Protected Resource Metadata.`)`\n * when `response.status === 404` (or no response was returned).\n *\n * If a future MCP SDK reword this message, the test\n * \"falls back to server-derived resource on a 404 PRM\" at\n * `test/lib/oauth-web-flow.test.js` will fail — that test calls the real\n * SDK against a 404 fixture and is the canary for this regression.\n */\nconst PRM_ABSENT_MARKER = 'does not implement OAuth 2.0 Protected Resource Metadata';\n\nasync function tryDiscoverPRM(\n agentUrl: string,\n fetchFn: typeof fetch | undefined\n): Promise<OAuthProtectedResourceMetadata | undefined> {\n try {\n return await discoverOAuthProtectedResourceMetadata(agentUrl, undefined, fetchFn);\n } catch (err) {\n if (err instanceof Error && err.message.includes(PRM_ABSENT_MARKER)) {\n // PRM is optional under RFC 9728 — fall back to local resource\n // derivation. Connection/parse/5xx errors fall through.\n return undefined;\n }\n const message = err instanceof Error ? err.message : String(err);\n throw new ProtectedResourceMetadataError(`PRM discovery failed: ${message}`);\n }\n}\n\nfunction assertPrmResourceMatchesAgentOrigin(agentUrl: string, prmResource: string): void {\n const requested = resourceUrlFromServerUrl(new URL(agentUrl));\n if (!checkResourceAllowed({ requestedResource: requested, configuredResource: prmResource })) {\n throw new ProtectedResourceMetadataError(\n `PRM advertises resource ${prmResource} which does not share an origin/path with agent ${agentUrl}`\n );\n }\n}\n\nfunction resolveAuthorizationServerUrl(agentUrl: string, prm: OAuthProtectedResourceMetadata | undefined): URL {\n const first = prm?.authorization_servers?.[0];\n if (first) {\n return new URL(first);\n }\n return new URL(new URL(agentUrl).origin);\n}\n\nasync function resolveClientInformation(args: {\n agent: AgentConfig;\n agentStorage?: OAuthConfigStorage;\n asUrl: URL;\n asMetadata: AuthorizationServerMetadata;\n clientMetadata: OAuthClientMetadata;\n fetchFn?: typeof fetch;\n allowConfidentialClient: boolean;\n}): Promise<OAuthClientInformation> {\n const { agent, agentStorage, asUrl, asMetadata, clientMetadata, fetchFn, allowConfidentialClient } = args;\n\n if (agent.oauth_client) {\n return toMCPClientInfo(agent.oauth_client);\n }\n\n if (!asMetadata.registration_endpoint) {\n throw new OAuthError(\n 'Agent has no oauth_client and authorization server does not advertise dynamic client registration',\n 'no_client_credentials',\n agent.id\n );\n }\n\n const registered: OAuthClientInformationFull = await registerClient(asUrl.toString(), {\n metadata: asMetadata,\n clientMetadata,\n fetchFn,\n });\n\n if (registered.client_secret && !allowConfidentialClient) {\n throw new ConfidentialClientNotAllowedError(agent.id);\n }\n\n if (agentStorage) {\n // Load fresh and save fresh so two concurrent /start calls for the\n // same agentId do not trample each other's `oauth_client` via a\n // shared in-memory reference.\n const fresh = (await agentStorage.loadAgent(agent.id)) ?? agent;\n fresh.oauth_client = fromMCPClientInfo(registered);\n await agentStorage.saveAgent(fresh);\n }\n\n return registered;\n}\n\nfunction defaultGenerateState(): string {\n return randomBytes(32).toString('base64url');\n}\n\n/**\n * Map an MCP SDK token-exchange failure to {@link TokenExchangeError},\n * redacting bearer/refresh tokens that some authorization servers echo\n * back in error responses for debugging.\n */\nfunction wrapTokenExchangeError(err: unknown): TokenExchangeError {\n // The MCP SDK's `parseErrorResponse` decodes a well-formed OAuth error\n // envelope into an `OAuthError` subclass with `errorCode` (e.g.\n // `InvalidGrantError`). Malformed responses come through as\n // `ServerError` with the raw body in `message`, so the redaction pass\n // covers both cases.\n const oauthErrorCode = (err as { errorCode?: string })?.errorCode;\n const message = err instanceof Error ? err.message : String(err);\n const status = (err as { status?: number })?.status ?? 0;\n const rawBody = (err as { body?: string })?.body ?? message;\n const body = redactTokens(rawBody);\n const display = oauthErrorCode ? `${oauthErrorCode}: ${message}` : message;\n return new TokenExchangeError(`Token exchange failed: ${redactTokens(display)}`, status, body, oauthErrorCode);\n}\n\nconst SENSITIVE_TOKEN_KEYS = ['access_token', 'refresh_token', 'id_token', 'token'];\n\n/**\n * Best-effort redaction of bearer/refresh tokens from an AS error body\n * (which may be JSON, form-encoded, or freeform). Adopters MUST still\n * treat `TokenExchangeError.body` as sensitive — do not reflect it to\n * the browser or write it to access logs unredacted.\n */\nfunction redactTokens(input: string): string {\n let out = input;\n for (const key of SENSITIVE_TOKEN_KEYS) {\n // JSON form: \"key\":\"…\"\n out = out.replace(new RegExp(`(\"${key}\"\\\\s*:\\\\s*\")[^\"]*(\")`, 'gi'), '$1<redacted>$2');\n // form-encoded: key=…\n out = out.replace(new RegExp(`(\\\\b${key}=)[^&\\\\s]+`, 'gi'), '$1<redacted>');\n }\n return out;\n}\n"],"mappings":"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","names":[]}
|
|
@@ -8,6 +8,7 @@ import {
|
|
|
8
8
|
} from "@modelcontextprotocol/sdk/client/auth.js";
|
|
9
9
|
import { checkResourceAllowed, resourceUrlFromServerUrl } from "@modelcontextprotocol/sdk/shared/auth-utils.js";
|
|
10
10
|
import { DEFAULT_CLIENT_METADATA, fromMCPClientInfo, fromMCPTokens, OAuthError, toMCPClientInfo } from "./types.mjs";
|
|
11
|
+
import { validateOAuthResourceUrl } from "./resource-url.mjs";
|
|
11
12
|
const DEFAULT_WEB_FLOW_TTL_MS = 10 * 60 * 1e3;
|
|
12
13
|
class InvalidOrExpiredFlowError extends OAuthError {
|
|
13
14
|
constructor(state) {
|
|
@@ -49,6 +50,16 @@ class AgentVanishedDuringFlowError extends OAuthError {
|
|
|
49
50
|
this.name = "AgentVanishedDuringFlowError";
|
|
50
51
|
}
|
|
51
52
|
}
|
|
53
|
+
class AgentChangedDuringFlowError extends OAuthError {
|
|
54
|
+
constructor(agentId) {
|
|
55
|
+
super(
|
|
56
|
+
`Agent ${agentId} changed while OAuth authorization was pending; tokens were not saved`,
|
|
57
|
+
"agent_changed_during_flow",
|
|
58
|
+
agentId
|
|
59
|
+
);
|
|
60
|
+
this.name = "AgentChangedDuringFlowError";
|
|
61
|
+
}
|
|
62
|
+
}
|
|
52
63
|
class ConfidentialClientNotAllowedError extends OAuthError {
|
|
53
64
|
constructor(agentId) {
|
|
54
65
|
super(
|
|
@@ -76,6 +87,9 @@ async function startWebOAuthFlow(opts) {
|
|
|
76
87
|
agentStorage,
|
|
77
88
|
carry,
|
|
78
89
|
scopeHint,
|
|
90
|
+
resourceOverride: requestedResourceOverride,
|
|
91
|
+
audience,
|
|
92
|
+
allowHttp = false,
|
|
79
93
|
ttlMs = DEFAULT_WEB_FLOW_TTL_MS,
|
|
80
94
|
generateState,
|
|
81
95
|
fetch: fetchFn,
|
|
@@ -85,8 +99,11 @@ async function startWebOAuthFlow(opts) {
|
|
|
85
99
|
if (!agent.agent_uri) {
|
|
86
100
|
throw new OAuthError("Agent missing agent_uri", "invalid_agent", agent.id);
|
|
87
101
|
}
|
|
102
|
+
const resourceOverrideAction = requestedResourceOverride === null ? "clear" : requestedResourceOverride !== void 0 ? "set" : void 0;
|
|
103
|
+
const rawResourceOverride = requestedResourceOverride === null ? void 0 : requestedResourceOverride ?? agent.oauth_resource;
|
|
104
|
+
const resourceOverride = rawResourceOverride ? validateOAuthResourceUrl(rawResourceOverride, { allowHttp }).href : void 0;
|
|
88
105
|
const prm = await tryDiscoverPRM(agent.agent_uri, fetchFn);
|
|
89
|
-
if (prm?.resource) {
|
|
106
|
+
if (!resourceOverride && prm?.resource) {
|
|
90
107
|
assertPrmResourceMatchesAgentOrigin(agent.agent_uri, prm.resource);
|
|
91
108
|
}
|
|
92
109
|
const asUrl = resolveAuthorizationServerUrl(agent.agent_uri, prm);
|
|
@@ -94,7 +111,7 @@ async function startWebOAuthFlow(opts) {
|
|
|
94
111
|
if (!asMetadata) {
|
|
95
112
|
throw new OAuthError(`No OAuth metadata at ${asUrl.toString()}`, "no_authorization_server_metadata", agent.id);
|
|
96
113
|
}
|
|
97
|
-
const resource = prm?.resource ? new URL(prm.resource) : resourceUrlFromServerUrl(new URL(agent.agent_uri));
|
|
114
|
+
const resource = resourceOverride ? new URL(resourceOverride) : prm?.resource ? new URL(prm.resource) : resourceUrlFromServerUrl(new URL(agent.agent_uri));
|
|
98
115
|
const baseClientMetadata = {
|
|
99
116
|
...DEFAULT_CLIENT_METADATA,
|
|
100
117
|
...clientMetadataOverrides,
|
|
@@ -119,6 +136,9 @@ async function startWebOAuthFlow(opts) {
|
|
|
119
136
|
state,
|
|
120
137
|
resource
|
|
121
138
|
});
|
|
139
|
+
if (audience) {
|
|
140
|
+
authorizationUrl.searchParams.set("audience", audience);
|
|
141
|
+
}
|
|
122
142
|
const now = /* @__PURE__ */ new Date();
|
|
123
143
|
const expiresAt = new Date(now.getTime() + ttlMs);
|
|
124
144
|
const flow = {
|
|
@@ -128,6 +148,9 @@ async function startWebOAuthFlow(opts) {
|
|
|
128
148
|
codeVerifier,
|
|
129
149
|
redirectUri,
|
|
130
150
|
resource: resource.href,
|
|
151
|
+
resourceOverride,
|
|
152
|
+
resourceOverrideAction,
|
|
153
|
+
resourceOverrideSnapshot: agent.oauth_resource ?? null,
|
|
131
154
|
scope,
|
|
132
155
|
authorizationServerUrl: asUrl.toString(),
|
|
133
156
|
clientInformation,
|
|
@@ -158,6 +181,11 @@ async function completeWebOAuthFlow(opts) {
|
|
|
158
181
|
if (!flow || flow.expiresAt.getTime() < Date.now()) {
|
|
159
182
|
throw new InvalidOrExpiredFlowError(state);
|
|
160
183
|
}
|
|
184
|
+
let agentForPersistence;
|
|
185
|
+
if (agentStorage) {
|
|
186
|
+
agentForPersistence = await agentStorage.loadAgent(flow.agentId);
|
|
187
|
+
assertAgentUnchangedForFlow(agentForPersistence, flow);
|
|
188
|
+
}
|
|
161
189
|
const asMetadata = await discoverAuthorizationServerMetadata(flow.authorizationServerUrl, {
|
|
162
190
|
fetchFn
|
|
163
191
|
});
|
|
@@ -177,13 +205,16 @@ async function completeWebOAuthFlow(opts) {
|
|
|
177
205
|
}
|
|
178
206
|
let persisted = false;
|
|
179
207
|
if (agentStorage) {
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
208
|
+
agentForPersistence = await agentStorage.loadAgent(flow.agentId);
|
|
209
|
+
assertAgentUnchangedForFlow(agentForPersistence, flow);
|
|
210
|
+
agentForPersistence.oauth_tokens = fromMCPTokens(tokens);
|
|
211
|
+
if (flow.resourceOverrideAction === "set" && flow.resourceOverride) {
|
|
212
|
+
agentForPersistence.oauth_resource = flow.resourceOverride;
|
|
213
|
+
} else if (flow.resourceOverrideAction === "clear") {
|
|
214
|
+
delete agentForPersistence.oauth_resource;
|
|
183
215
|
}
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
await agentStorage.saveAgent(agent);
|
|
216
|
+
delete agentForPersistence.oauth_code_verifier;
|
|
217
|
+
await agentStorage.saveAgent(agentForPersistence);
|
|
187
218
|
persisted = true;
|
|
188
219
|
}
|
|
189
220
|
return {
|
|
@@ -194,6 +225,17 @@ async function completeWebOAuthFlow(opts) {
|
|
|
194
225
|
persisted
|
|
195
226
|
};
|
|
196
227
|
}
|
|
228
|
+
function assertAgentUnchangedForFlow(agent, flow) {
|
|
229
|
+
if (!agent) {
|
|
230
|
+
throw new AgentVanishedDuringFlowError(flow.agentId);
|
|
231
|
+
}
|
|
232
|
+
if (agent.agent_uri !== flow.agentUrl) {
|
|
233
|
+
throw new AgentChangedDuringFlowError(flow.agentId);
|
|
234
|
+
}
|
|
235
|
+
if (Object.prototype.hasOwnProperty.call(flow, "resourceOverrideSnapshot") && (agent.oauth_resource ?? null) !== flow.resourceOverrideSnapshot) {
|
|
236
|
+
throw new AgentChangedDuringFlowError(flow.agentId);
|
|
237
|
+
}
|
|
238
|
+
}
|
|
197
239
|
function safeReturnTo(value, options = {}) {
|
|
198
240
|
if (typeof value !== "string" || value.length === 0) return void 0;
|
|
199
241
|
if (value.startsWith("/") && !value.startsWith("//") && !value.startsWith("/\\")) {
|
|
@@ -314,6 +356,7 @@ function redactTokens(input) {
|
|
|
314
356
|
return out;
|
|
315
357
|
}
|
|
316
358
|
export {
|
|
359
|
+
AgentChangedDuringFlowError,
|
|
317
360
|
AgentVanishedDuringFlowError,
|
|
318
361
|
BrowserBindingRequiredError,
|
|
319
362
|
ConfidentialClientNotAllowedError,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/lib/auth/oauth/web-flow.ts"],"sourcesContent":["/**\n * Web (server-side) OAuth flow helpers for `@adcp/sdk`.\n *\n * Companion to `CLIFlowHandler` for environments where `/oauth/start` and\n * `/oauth/callback` may be served by different processes. Discovery, PKCE,\n * URL construction, and token exchange are delegated to the MCP SDK's\n * `client/auth.js` primitives so this module is glue plus a pending-flow\n * store interface — not reimplemented protocol logic.\n *\n * Wire contract:\n * - PRM (RFC 9728) is consulted first; `prm.resource` is the source of\n * truth for the RFC 8707 `resource` indicator. We fall back to\n * `resourceUrlFromServerUrl(agent.agent_uri)` only when the resource\n * server does not implement PRM (404). Connection / parse / 5xx\n * errors throw `ProtectedResourceMetadataError` — never silently\n * downgrade to local guessing.\n * - `prm.resource` must share an origin with the agent URL; the MCP\n * SDK's `checkResourceAllowed` guards against a poisoned PRM\n * pointing the audience at a third party.\n * - AS URL = `prm.authorization_servers[0]` when PRM is present, else\n * the agent origin.\n * - Scope priority: caller-supplied `scopeHint` (e.g. from a 401\n * `WWW-Authenticate` challenge, per SEP-835) > `prm.scopes_supported`\n * > `clientMetadata.scope`.\n * - Refresh is NOT this module's concern. Once `oauth_tokens` are\n * persisted, `MCPOAuthProvider` handles refresh on the next agent\n * call and the MCP SDK forwards `resource` into the refresh request.\n * Callers who DIY refresh against `oauth_tokens` are responsible for\n * forwarding `resource` themselves.\n */\n\nimport { randomBytes } from 'crypto';\nimport {\n discoverAuthorizationServerMetadata,\n discoverOAuthProtectedResourceMetadata,\n exchangeAuthorization,\n registerClient,\n startAuthorization,\n} from '@modelcontextprotocol/sdk/client/auth.js';\nimport { checkResourceAllowed, resourceUrlFromServerUrl } from '@modelcontextprotocol/sdk/shared/auth-utils.js';\nimport type {\n AuthorizationServerMetadata,\n OAuthClientInformation,\n OAuthClientInformationFull,\n OAuthClientMetadata,\n OAuthProtectedResourceMetadata,\n OAuthTokens,\n} from '@modelcontextprotocol/sdk/shared/auth.js';\n\nimport type { AgentConfig, OAuthConfigStorage } from './types';\nimport { DEFAULT_CLIENT_METADATA, fromMCPClientInfo, fromMCPTokens, OAuthError, toMCPClientInfo } from './types';\n\n/**\n * Default TTL for a pending web flow row. RFC 6749 §10.12 recommends\n * short-lived state; 10 minutes covers slow-typing users without leaving\n * the PKCE verifier on disk longer than necessary.\n */\nexport const DEFAULT_WEB_FLOW_TTL_MS = 10 * 60 * 1000;\n\n/**\n * State persisted between `/oauth/start` and `/oauth/callback`.\n *\n * `codeVerifier` is a PKCE secret. Store implementations MUST encrypt it\n * at rest if persistence crosses a trust boundary (shared DB, cross-tenant\n * Redis, etc.).\n *\n * `carry` is preserved verbatim and round-tripped to the callback. It\n * MUST be JSON-serializable, MUST NOT contain secrets, and MUST be\n * treated as attacker-influenced data (the caller typically populates it\n * from the `/start` request).\n */\nexport interface PendingWebFlow {\n state: string;\n agentId: string;\n agentUrl: string;\n codeVerifier: string;\n redirectUri: string;\n resource?: string;\n scope?: string;\n authorizationServerUrl: string;\n /** Persist as JSON (e.g. Postgres `jsonb`); contents are MCP SDK-typed. */\n clientInformation: OAuthClientInformation;\n createdAt: Date;\n expiresAt: Date;\n /** JSON-serializable, no secrets, attacker-influenced. */\n carry?: Record<string, unknown>;\n}\n\n/**\n * Persistence interface for in-flight web OAuth flows.\n *\n * Canonical implementations:\n *\n * Postgres:\n * ```sql\n * INSERT INTO pending_oauth_flows (state, payload, expires_at)\n * VALUES ($1, $2, $3);\n * -- consume:\n * DELETE FROM pending_oauth_flows\n * WHERE state = $1 AND expires_at > now()\n * RETURNING payload;\n * ```\n *\n * Redis:\n * ```\n * SET pending:flow:<state> <payload> EX 600 NX -- put\n * GETDEL pending:flow:<state> -- consume\n * ```\n *\n * `consume` MUST be a single atomic operation that deletes and returns the\n * row (or returns null). A `SELECT` followed by a separate `DELETE` is a\n * replay vulnerability and DOES NOT satisfy this contract — a callback\n * replayed before the first one commits would mint two tokens.\n *\n * `consume` MUST treat expired rows as absent (return null) and SHOULD\n * delete them on read so a separate sweep is not strictly required.\n *\n * **Tradeoff: consume runs before token exchange.** `completeWebOAuthFlow`\n * consumes the pending row before attempting `exchangeAuthorization`. If\n * the AS returns a transient 5xx (or the network blips between us and the\n * AS), the row is gone and the user must restart from `/oauth/start`.\n * This is the right call for `invalid_grant` (replay protection — the\n * authorization code is one-shot at the AS regardless), but it means\n * transient AS failures cost the user a click. Revisit only if you see\n * real retry-loss in the field.\n */\nexport interface PendingWebFlowStore {\n /** Insert a new flow. MUST reject duplicate `state`. */\n put(flow: PendingWebFlow): Promise<void>;\n /**\n * Atomic delete-and-return. MUST NOT return the same row twice.\n * Returns null if the row is absent or expired.\n */\n consume(state: string): Promise<PendingWebFlow | null>;\n /** Optional housekeeping for expired rows that were never claimed. */\n cleanupExpired?(): Promise<number>;\n}\n\n/** @deprecated Renamed to `PendingWebFlowStore`. */\nexport type PendingFlowStore = PendingWebFlowStore;\n\nexport class InvalidOrExpiredFlowError extends OAuthError {\n constructor(state: string) {\n super(`OAuth flow not found or expired (state=${state})`, 'invalid_or_expired_flow');\n this.name = 'InvalidOrExpiredFlowError';\n }\n}\n\nexport class StateMismatchError extends OAuthError {\n constructor() {\n super('OAuth state does not match the value the caller bound to this session', 'state_mismatch');\n this.name = 'StateMismatchError';\n }\n}\n\nexport class TokenExchangeError extends OAuthError {\n constructor(\n message: string,\n public readonly status: number,\n public readonly body: string,\n /**\n * RFC 6749 §5.2 error code when the authorization server returned a\n * standard error envelope (`invalid_grant`, `invalid_client`, etc.).\n * Undefined when the AS returned a non-OAuth-shaped failure.\n */\n public readonly oauthErrorCode?: string\n ) {\n super(message, 'token_exchange_failed');\n this.name = 'TokenExchangeError';\n }\n}\n\nexport class ProtectedResourceMetadataError extends OAuthError {\n constructor(message: string) {\n super(message, 'protected_resource_metadata_error');\n this.name = 'ProtectedResourceMetadataError';\n }\n}\n\nexport class AgentVanishedDuringFlowError extends OAuthError {\n constructor(agentId: string) {\n super(\n `Agent ${agentId} could not be loaded from storage during token persistence; tokens were not saved`,\n 'agent_vanished_during_flow',\n agentId\n );\n this.name = 'AgentVanishedDuringFlowError';\n }\n}\n\nexport class ConfidentialClientNotAllowedError extends OAuthError {\n constructor(agentId: string | undefined) {\n super(\n 'Authorization server issued a confidential client (client_secret) during dynamic registration. ' +\n 'Pass `allowConfidentialClient: true` if you intend to persist a long-lived AS credential to your agent storage.',\n 'confidential_client_not_allowed',\n agentId\n );\n this.name = 'ConfidentialClientNotAllowedError';\n }\n}\n\nexport class BrowserBindingRequiredError extends OAuthError {\n constructor() {\n super(\n 'completeWebOAuthFlow called with requireBrowserBinding:true but expectedState was not supplied — ' +\n 'pass the state value from the session cookie set at /oauth/start',\n 'browser_binding_required'\n );\n this.name = 'BrowserBindingRequiredError';\n }\n}\n\nexport interface StartWebFlowOptions {\n /** Agent the flow is for. Must include `agent_uri`. */\n agent: AgentConfig;\n /** Absolute URL of the consumer's `/callback` route (must match what the AS sees). */\n redirectUri: string;\n /** Where to persist the pending flow until callback. */\n pendingFlowStore: PendingWebFlowStore;\n /** When provided, dynamic-registration results land in `agent.oauth_client`. */\n agentStorage?: OAuthConfigStorage;\n /**\n * Free-form caller payload, round-tripped to `completeWebOAuthFlow`.\n * Must be JSON-serializable. Do not store secrets here. Treated as\n * attacker-influenced — validate before reflecting (e.g. via\n * {@link safeReturnTo} for redirect targets).\n */\n carry?: Record<string, unknown>;\n /**\n * Scope hint (highest priority per SEP-835). Pass through the `scope`\n * value from a prior 401 `WWW-Authenticate` challenge if you have one.\n */\n scopeHint?: string;\n /** Override flow TTL. Default: {@link DEFAULT_WEB_FLOW_TTL_MS}. */\n ttlMs?: number;\n /** Override the random-state generator (defaults to 32 bytes base64url). */\n generateState?: () => string;\n /** Override `fetch` (timeouts, signing, mocks). */\n fetch?: typeof fetch;\n /**\n * Override base client metadata. `redirect_uris` is always replaced\n * with `[redirectUri]` regardless of what's passed here.\n */\n clientMetadata?: Partial<OAuthClientMetadata>;\n /**\n * Permit the AS to register a confidential client (i.e. one that\n * returns a `client_secret` from dynamic registration). Default false:\n * if the AS issues a secret we throw {@link ConfidentialClientNotAllowedError}\n * rather than silently persisting a long-lived credential to your\n * agent storage.\n */\n allowConfidentialClient?: boolean;\n}\n\nexport interface StartWebFlowResult {\n authorizationUrl: string;\n state: string;\n expiresAt: Date;\n}\n\nexport interface CompleteWebFlowOptions {\n state: string;\n code: string;\n pendingFlowStore: PendingWebFlowStore;\n /** When provided, the issued tokens are persisted to `agent.oauth_tokens`. */\n agentStorage?: OAuthConfigStorage;\n fetch?: typeof fetch;\n /**\n * The caller-bound expected state (e.g. from a session cookie set at\n * `/oauth/start`). When provided, must equal `state`; mismatch throws\n * {@link StateMismatchError}. Without this, `state` is replay-protected\n * but not browser-bound — see WEB-OAUTH.md.\n */\n expectedState?: string;\n /**\n * When `true`, throws {@link BrowserBindingRequiredError} if `expectedState`\n * is omitted instead of emitting a `console.warn`. Use this in frameworks\n * where session cookies are always available so that a missing bind is caught\n * at development time rather than silently permitted in production.\n *\n * Default: `false`.\n */\n requireBrowserBinding?: boolean;\n}\n\nexport interface CompleteWebFlowResult {\n agentId: string;\n agentUrl: string;\n tokens: OAuthTokens;\n carry?: Record<string, unknown>;\n /** True if `agentStorage` was provided AND `saveAgent` succeeded. */\n persisted: boolean;\n}\n\n/**\n * Begin a web OAuth flow. Returns the authorization URL the consumer\n * should redirect the browser to. Persists the PKCE verifier and other\n * flow state via `pendingFlowStore.put` so a different process can complete it.\n */\nexport async function startWebOAuthFlow(opts: StartWebFlowOptions): Promise<StartWebFlowResult> {\n const {\n agent,\n redirectUri,\n pendingFlowStore,\n agentStorage,\n carry,\n scopeHint,\n ttlMs = DEFAULT_WEB_FLOW_TTL_MS,\n generateState,\n fetch: fetchFn,\n clientMetadata: clientMetadataOverrides,\n allowConfidentialClient = false,\n } = opts;\n\n if (!agent.agent_uri) {\n throw new OAuthError('Agent missing agent_uri', 'invalid_agent', agent.id);\n }\n\n const prm = await tryDiscoverPRM(agent.agent_uri, fetchFn);\n if (prm?.resource) {\n assertPrmResourceMatchesAgentOrigin(agent.agent_uri, prm.resource);\n }\n\n const asUrl = resolveAuthorizationServerUrl(agent.agent_uri, prm);\n\n const asMetadata = await discoverAuthorizationServerMetadata(asUrl.toString(), { fetchFn });\n if (!asMetadata) {\n throw new OAuthError(`No OAuth metadata at ${asUrl.toString()}`, 'no_authorization_server_metadata', agent.id);\n }\n\n const resource = prm?.resource ? new URL(prm.resource) : resourceUrlFromServerUrl(new URL(agent.agent_uri));\n\n const baseClientMetadata: OAuthClientMetadata = {\n ...DEFAULT_CLIENT_METADATA,\n ...clientMetadataOverrides,\n redirect_uris: [redirectUri],\n };\n\n const scope = scopeHint ?? prm?.scopes_supported?.join(' ') ?? baseClientMetadata.scope;\n\n const clientInformation = await resolveClientInformation({\n agent,\n agentStorage,\n asUrl,\n asMetadata,\n clientMetadata: baseClientMetadata,\n fetchFn,\n allowConfidentialClient,\n });\n\n const state = (generateState ?? defaultGenerateState)();\n const { authorizationUrl, codeVerifier } = await startAuthorization(asUrl.toString(), {\n metadata: asMetadata,\n clientInformation,\n redirectUrl: redirectUri,\n scope,\n state,\n resource,\n });\n\n const now = new Date();\n const expiresAt = new Date(now.getTime() + ttlMs);\n const flow: PendingWebFlow = {\n state,\n agentId: agent.id,\n agentUrl: agent.agent_uri,\n codeVerifier,\n redirectUri,\n resource: resource.href,\n scope,\n authorizationServerUrl: asUrl.toString(),\n clientInformation,\n createdAt: now,\n expiresAt,\n carry,\n };\n await pendingFlowStore.put(flow);\n\n return {\n authorizationUrl: authorizationUrl.toString(),\n state,\n expiresAt,\n };\n}\n\n/**\n * Finish a web OAuth flow. Atomically consumes the pending row, exchanges\n * the authorization code for tokens, and (if storage is provided)\n * persists tokens to `agent.oauth_tokens`. Returns whatever the caller\n * stashed in `carry` so the consumer can route the user appropriately.\n *\n * The pending row is consumed BEFORE `exchangeAuthorization` runs. A\n * transient AS failure leaves the user with no row to retry against and\n * they must restart from `/oauth/start`. See {@link PendingWebFlowStore}\n * for the full tradeoff discussion.\n */\nexport async function completeWebOAuthFlow(opts: CompleteWebFlowOptions): Promise<CompleteWebFlowResult> {\n const { state, code, pendingFlowStore, agentStorage, fetch: fetchFn, expectedState, requireBrowserBinding } = opts;\n\n if (expectedState === undefined) {\n if (requireBrowserBinding) {\n throw new BrowserBindingRequiredError();\n }\n // Warn callers who omit expectedState: the flow is replay-protected via\n // atomic consume but is not browser-bound (any request carrying the correct\n // state + code would be accepted). Pass expectedState from a session cookie\n // set at /oauth/start to fully bind the callback to the initiating browser.\n // Set requireBrowserBinding:true to make this a hard error instead.\n console.warn(\n '[adcp/sdk] completeWebOAuthFlow: expectedState not supplied — the callback is replay-protected ' +\n 'but not browser-bound. Pass expectedState from a session cookie set at /oauth/start, ' +\n 'or set requireBrowserBinding:true to enforce it.'\n );\n } else if (expectedState !== state) {\n throw new StateMismatchError();\n }\n\n const flow = await pendingFlowStore.consume(state);\n if (!flow || flow.expiresAt.getTime() < Date.now()) {\n throw new InvalidOrExpiredFlowError(state);\n }\n\n const asMetadata = await discoverAuthorizationServerMetadata(flow.authorizationServerUrl, {\n fetchFn,\n });\n\n let tokens: OAuthTokens;\n try {\n tokens = await exchangeAuthorization(flow.authorizationServerUrl, {\n metadata: asMetadata ?? undefined,\n clientInformation: flow.clientInformation,\n authorizationCode: code,\n codeVerifier: flow.codeVerifier,\n redirectUri: flow.redirectUri,\n resource: flow.resource ? new URL(flow.resource) : undefined,\n fetchFn,\n });\n } catch (err) {\n throw wrapTokenExchangeError(err);\n }\n\n let persisted = false;\n if (agentStorage) {\n const agent = await agentStorage.loadAgent(flow.agentId);\n if (!agent) {\n throw new AgentVanishedDuringFlowError(flow.agentId);\n }\n agent.oauth_tokens = fromMCPTokens(tokens);\n delete agent.oauth_code_verifier;\n await agentStorage.saveAgent(agent);\n persisted = true;\n }\n\n return {\n agentId: flow.agentId,\n agentUrl: flow.agentUrl,\n tokens,\n carry: flow.carry,\n persisted,\n };\n}\n\n/**\n * Validate a redirect target supplied via `carry`.\n *\n * Treats `value` as attacker-influenced. Returns a string that is safe to\n * pass to `res.redirect`, or `undefined` if the value is invalid.\n *\n * Defaults to **path-only** redirects (must start with a single `/` and\n * not be protocol-relative `//evil.example`). Pass `allowedReturnHosts`\n * to permit absolute URLs against an allowlist.\n *\n * @example\n * ```ts\n * res.redirect(safeReturnTo(carry?.return_to) ?? '/');\n * res.redirect(safeReturnTo(carry?.return_to, { allowedReturnHosts: ['app.example.com'] }) ?? '/');\n * ```\n */\nexport function safeReturnTo(value: unknown, options: { allowedReturnHosts?: string[] } = {}): string | undefined {\n if (typeof value !== 'string' || value.length === 0) return undefined;\n\n // Path-only: must be `/...` but not `//...` (protocol-relative) or `/\\...`.\n if (value.startsWith('/') && !value.startsWith('//') && !value.startsWith('/\\\\')) {\n return value;\n }\n\n const allowed = options.allowedReturnHosts;\n if (!allowed || allowed.length === 0) return undefined;\n\n let parsed: URL;\n try {\n parsed = new URL(value);\n } catch {\n return undefined;\n }\n if (parsed.protocol !== 'https:' && parsed.protocol !== 'http:') return undefined;\n if (!allowed.includes(parsed.host)) return undefined;\n return parsed.toString();\n}\n\n/**\n * In-memory pending-flow store for tests and single-instance dev.\n *\n * Production deployments MUST implement `PendingWebFlowStore` against a\n * shared store (Postgres `DELETE … RETURNING`, Redis `GETDEL`) so\n * `/start` and `/callback` can hit different processes.\n */\nexport class InMemoryPendingFlowStore implements PendingWebFlowStore {\n private readonly flows = new Map<string, PendingWebFlow>();\n\n async put(flow: PendingWebFlow): Promise<void> {\n if (this.flows.has(flow.state)) {\n throw new Error(`Pending flow already exists for state ${flow.state}`);\n }\n this.flows.set(flow.state, flow);\n }\n\n async consume(state: string): Promise<PendingWebFlow | null> {\n const flow = this.flows.get(state);\n if (!flow) return null;\n this.flows.delete(state);\n if (flow.expiresAt.getTime() < Date.now()) return null;\n return flow;\n }\n\n async cleanupExpired(): Promise<number> {\n const now = Date.now();\n let removed = 0;\n for (const [state, flow] of this.flows) {\n if (flow.expiresAt.getTime() < now) {\n this.flows.delete(state);\n removed++;\n }\n }\n return removed;\n }\n}\n\n// ============================================================\n// Internals\n// ============================================================\n\n/**\n * The MCP SDK reports a 404 PRM lookup with this exact message; treat it\n * as \"PRM is genuinely absent\" and fall back. Anything else is a\n * connection, parse, or 5xx error and is allowed to bubble.\n *\n * Source (verified against `@modelcontextprotocol/sdk@1.29.0`):\n * `dist/esm/client/auth.js` → `discoverOAuthProtectedResourceMetadata`\n * throws `new Error(`Resource server does not implement OAuth 2.0 Protected Resource Metadata.`)`\n * when `response.status === 404` (or no response was returned).\n *\n * If a future MCP SDK reword this message, the test\n * \"falls back to server-derived resource on a 404 PRM\" at\n * `test/lib/oauth-web-flow.test.js` will fail — that test calls the real\n * SDK against a 404 fixture and is the canary for this regression.\n */\nconst PRM_ABSENT_MARKER = 'does not implement OAuth 2.0 Protected Resource Metadata';\n\nasync function tryDiscoverPRM(\n agentUrl: string,\n fetchFn: typeof fetch | undefined\n): Promise<OAuthProtectedResourceMetadata | undefined> {\n try {\n return await discoverOAuthProtectedResourceMetadata(agentUrl, undefined, fetchFn);\n } catch (err) {\n if (err instanceof Error && err.message.includes(PRM_ABSENT_MARKER)) {\n // PRM is optional under RFC 9728 — fall back to local resource\n // derivation. Connection/parse/5xx errors fall through.\n return undefined;\n }\n const message = err instanceof Error ? err.message : String(err);\n throw new ProtectedResourceMetadataError(`PRM discovery failed: ${message}`);\n }\n}\n\nfunction assertPrmResourceMatchesAgentOrigin(agentUrl: string, prmResource: string): void {\n const requested = resourceUrlFromServerUrl(new URL(agentUrl));\n if (!checkResourceAllowed({ requestedResource: requested, configuredResource: prmResource })) {\n throw new ProtectedResourceMetadataError(\n `PRM advertises resource ${prmResource} which does not share an origin/path with agent ${agentUrl}`\n );\n }\n}\n\nfunction resolveAuthorizationServerUrl(agentUrl: string, prm: OAuthProtectedResourceMetadata | undefined): URL {\n const first = prm?.authorization_servers?.[0];\n if (first) {\n return new URL(first);\n }\n return new URL(new URL(agentUrl).origin);\n}\n\nasync function resolveClientInformation(args: {\n agent: AgentConfig;\n agentStorage?: OAuthConfigStorage;\n asUrl: URL;\n asMetadata: AuthorizationServerMetadata;\n clientMetadata: OAuthClientMetadata;\n fetchFn?: typeof fetch;\n allowConfidentialClient: boolean;\n}): Promise<OAuthClientInformation> {\n const { agent, agentStorage, asUrl, asMetadata, clientMetadata, fetchFn, allowConfidentialClient } = args;\n\n if (agent.oauth_client) {\n return toMCPClientInfo(agent.oauth_client);\n }\n\n if (!asMetadata.registration_endpoint) {\n throw new OAuthError(\n 'Agent has no oauth_client and authorization server does not advertise dynamic client registration',\n 'no_client_credentials',\n agent.id\n );\n }\n\n const registered: OAuthClientInformationFull = await registerClient(asUrl.toString(), {\n metadata: asMetadata,\n clientMetadata,\n fetchFn,\n });\n\n if (registered.client_secret && !allowConfidentialClient) {\n throw new ConfidentialClientNotAllowedError(agent.id);\n }\n\n if (agentStorage) {\n // Load fresh and save fresh so two concurrent /start calls for the\n // same agentId do not trample each other's `oauth_client` via a\n // shared in-memory reference.\n const fresh = (await agentStorage.loadAgent(agent.id)) ?? agent;\n fresh.oauth_client = fromMCPClientInfo(registered);\n await agentStorage.saveAgent(fresh);\n }\n\n return registered;\n}\n\nfunction defaultGenerateState(): string {\n return randomBytes(32).toString('base64url');\n}\n\n/**\n * Map an MCP SDK token-exchange failure to {@link TokenExchangeError},\n * redacting bearer/refresh tokens that some authorization servers echo\n * back in error responses for debugging.\n */\nfunction wrapTokenExchangeError(err: unknown): TokenExchangeError {\n // The MCP SDK's `parseErrorResponse` decodes a well-formed OAuth error\n // envelope into an `OAuthError` subclass with `errorCode` (e.g.\n // `InvalidGrantError`). Malformed responses come through as\n // `ServerError` with the raw body in `message`, so the redaction pass\n // covers both cases.\n const oauthErrorCode = (err as { errorCode?: string })?.errorCode;\n const message = err instanceof Error ? err.message : String(err);\n const status = (err as { status?: number })?.status ?? 0;\n const rawBody = (err as { body?: string })?.body ?? message;\n const body = redactTokens(rawBody);\n const display = oauthErrorCode ? `${oauthErrorCode}: ${message}` : message;\n return new TokenExchangeError(`Token exchange failed: ${redactTokens(display)}`, status, body, oauthErrorCode);\n}\n\nconst SENSITIVE_TOKEN_KEYS = ['access_token', 'refresh_token', 'id_token', 'token'];\n\n/**\n * Best-effort redaction of bearer/refresh tokens from an AS error body\n * (which may be JSON, form-encoded, or freeform). Adopters MUST still\n * treat `TokenExchangeError.body` as sensitive — do not reflect it to\n * the browser or write it to access logs unredacted.\n */\nfunction redactTokens(input: string): string {\n let out = input;\n for (const key of SENSITIVE_TOKEN_KEYS) {\n // JSON form: \"key\":\"…\"\n out = out.replace(new RegExp(`(\"${key}\"\\\\s*:\\\\s*\")[^\"]*(\")`, 'gi'), '$1<redacted>$2');\n // form-encoded: key=…\n out = out.replace(new RegExp(`(\\\\b${key}=)[^&\\\\s]+`, 'gi'), '$1<redacted>');\n }\n return out;\n}\n"],"mappings":"AA+BA,SAAS,mBAAmB;AAC5B;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,sBAAsB,gCAAgC;AAW/D,SAAS,yBAAyB,mBAAmB,eAAe,YAAY,uBAAuB;AAOhG,MAAM,0BAA0B,KAAK,KAAK;AAoF1C,MAAM,kCAAkC,WAAW;AAAA,EACxD,YAAY,OAAe;AACzB,UAAM,0CAA0C,KAAK,KAAK,yBAAyB;AACnF,SAAK,OAAO;AAAA,EACd;AACF;AAEO,MAAM,2BAA2B,WAAW;AAAA,EACjD,cAAc;AACZ,UAAM,yEAAyE,gBAAgB;AAC/F,SAAK,OAAO;AAAA,EACd;AACF;AAEO,MAAM,2BAA2B,WAAW;AAAA,EACjD,YACE,SACgB,QACA,MAMA,gBAChB;AACA,UAAM,SAAS,uBAAuB;AATtB;AACA;AAMA;AAGhB,SAAK,OAAO;AAAA,EACd;AAAA,EAXkB;AAAA,EACA;AAAA,EAMA;AAKpB;AAEO,MAAM,uCAAuC,WAAW;AAAA,EAC7D,YAAY,SAAiB;AAC3B,UAAM,SAAS,mCAAmC;AAClD,SAAK,OAAO;AAAA,EACd;AACF;AAEO,MAAM,qCAAqC,WAAW;AAAA,EAC3D,YAAY,SAAiB;AAC3B;AAAA,MACE,SAAS,OAAO;AAAA,MAChB;AAAA,MACA;AAAA,IACF;AACA,SAAK,OAAO;AAAA,EACd;AACF;AAEO,MAAM,0CAA0C,WAAW;AAAA,EAChE,YAAY,SAA6B;AACvC;AAAA,MACE;AAAA,MAEA;AAAA,MACA;AAAA,IACF;AACA,SAAK,OAAO;AAAA,EACd;AACF;AAEO,MAAM,oCAAoC,WAAW;AAAA,EAC1D,cAAc;AACZ;AAAA,MACE;AAAA,MAEA;AAAA,IACF;AACA,SAAK,OAAO;AAAA,EACd;AACF;AAyFA,eAAsB,kBAAkB,MAAwD;AAC9F,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,QAAQ;AAAA,IACR;AAAA,IACA,OAAO;AAAA,IACP,gBAAgB;AAAA,IAChB,0BAA0B;AAAA,EAC5B,IAAI;AAEJ,MAAI,CAAC,MAAM,WAAW;AACpB,UAAM,IAAI,WAAW,2BAA2B,iBAAiB,MAAM,EAAE;AAAA,EAC3E;AAEA,QAAM,MAAM,MAAM,eAAe,MAAM,WAAW,OAAO;AACzD,MAAI,KAAK,UAAU;AACjB,wCAAoC,MAAM,WAAW,IAAI,QAAQ;AAAA,EACnE;AAEA,QAAM,QAAQ,8BAA8B,MAAM,WAAW,GAAG;AAEhE,QAAM,aAAa,MAAM,oCAAoC,MAAM,SAAS,GAAG,EAAE,QAAQ,CAAC;AAC1F,MAAI,CAAC,YAAY;AACf,UAAM,IAAI,WAAW,wBAAwB,MAAM,SAAS,CAAC,IAAI,oCAAoC,MAAM,EAAE;AAAA,EAC/G;AAEA,QAAM,WAAW,KAAK,WAAW,IAAI,IAAI,IAAI,QAAQ,IAAI,yBAAyB,IAAI,IAAI,MAAM,SAAS,CAAC;AAE1G,QAAM,qBAA0C;AAAA,IAC9C,GAAG;AAAA,IACH,GAAG;AAAA,IACH,eAAe,CAAC,WAAW;AAAA,EAC7B;AAEA,QAAM,QAAQ,aAAa,KAAK,kBAAkB,KAAK,GAAG,KAAK,mBAAmB;AAElF,QAAM,oBAAoB,MAAM,yBAAyB;AAAA,IACvD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,gBAAgB;AAAA,IAChB;AAAA,IACA;AAAA,EACF,CAAC;AAED,QAAM,SAAS,iBAAiB,sBAAsB;AACtD,QAAM,EAAE,kBAAkB,aAAa,IAAI,MAAM,mBAAmB,MAAM,SAAS,GAAG;AAAA,IACpF,UAAU;AAAA,IACV;AAAA,IACA,aAAa;AAAA,IACb;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAED,QAAM,MAAM,oBAAI,KAAK;AACrB,QAAM,YAAY,IAAI,KAAK,IAAI,QAAQ,IAAI,KAAK;AAChD,QAAM,OAAuB;AAAA,IAC3B;AAAA,IACA,SAAS,MAAM;AAAA,IACf,UAAU,MAAM;AAAA,IAChB;AAAA,IACA;AAAA,IACA,UAAU,SAAS;AAAA,IACnB;AAAA,IACA,wBAAwB,MAAM,SAAS;AAAA,IACvC;AAAA,IACA,WAAW;AAAA,IACX;AAAA,IACA;AAAA,EACF;AACA,QAAM,iBAAiB,IAAI,IAAI;AAE/B,SAAO;AAAA,IACL,kBAAkB,iBAAiB,SAAS;AAAA,IAC5C;AAAA,IACA;AAAA,EACF;AACF;AAaA,eAAsB,qBAAqB,MAA8D;AACvG,QAAM,EAAE,OAAO,MAAM,kBAAkB,cAAc,OAAO,SAAS,eAAe,sBAAsB,IAAI;AAE9G,MAAI,kBAAkB,QAAW;AAC/B,QAAI,uBAAuB;AACzB,YAAM,IAAI,4BAA4B;AAAA,IACxC;AAMA,YAAQ;AAAA,MACN;AAAA,IAGF;AAAA,EACF,WAAW,kBAAkB,OAAO;AAClC,UAAM,IAAI,mBAAmB;AAAA,EAC/B;AAEA,QAAM,OAAO,MAAM,iBAAiB,QAAQ,KAAK;AACjD,MAAI,CAAC,QAAQ,KAAK,UAAU,QAAQ,IAAI,KAAK,IAAI,GAAG;AAClD,UAAM,IAAI,0BAA0B,KAAK;AAAA,EAC3C;AAEA,QAAM,aAAa,MAAM,oCAAoC,KAAK,wBAAwB;AAAA,IACxF;AAAA,EACF,CAAC;AAED,MAAI;AACJ,MAAI;AACF,aAAS,MAAM,sBAAsB,KAAK,wBAAwB;AAAA,MAChE,UAAU,cAAc;AAAA,MACxB,mBAAmB,KAAK;AAAA,MACxB,mBAAmB;AAAA,MACnB,cAAc,KAAK;AAAA,MACnB,aAAa,KAAK;AAAA,MAClB,UAAU,KAAK,WAAW,IAAI,IAAI,KAAK,QAAQ,IAAI;AAAA,MACnD;AAAA,IACF,CAAC;AAAA,EACH,SAAS,KAAK;AACZ,UAAM,uBAAuB,GAAG;AAAA,EAClC;AAEA,MAAI,YAAY;AAChB,MAAI,cAAc;AAChB,UAAM,QAAQ,MAAM,aAAa,UAAU,KAAK,OAAO;AACvD,QAAI,CAAC,OAAO;AACV,YAAM,IAAI,6BAA6B,KAAK,OAAO;AAAA,IACrD;AACA,UAAM,eAAe,cAAc,MAAM;AACzC,WAAO,MAAM;AACb,UAAM,aAAa,UAAU,KAAK;AAClC,gBAAY;AAAA,EACd;AAEA,SAAO;AAAA,IACL,SAAS,KAAK;AAAA,IACd,UAAU,KAAK;AAAA,IACf;AAAA,IACA,OAAO,KAAK;AAAA,IACZ;AAAA,EACF;AACF;AAkBO,SAAS,aAAa,OAAgB,UAA6C,CAAC,GAAuB;AAChH,MAAI,OAAO,UAAU,YAAY,MAAM,WAAW,EAAG,QAAO;AAG5D,MAAI,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,WAAW,IAAI,KAAK,CAAC,MAAM,WAAW,KAAK,GAAG;AAChF,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,QAAQ;AACxB,MAAI,CAAC,WAAW,QAAQ,WAAW,EAAG,QAAO;AAE7C,MAAI;AACJ,MAAI;AACF,aAAS,IAAI,IAAI,KAAK;AAAA,EACxB,QAAQ;AACN,WAAO;AAAA,EACT;AACA,MAAI,OAAO,aAAa,YAAY,OAAO,aAAa,QAAS,QAAO;AACxE,MAAI,CAAC,QAAQ,SAAS,OAAO,IAAI,EAAG,QAAO;AAC3C,SAAO,OAAO,SAAS;AACzB;AASO,MAAM,yBAAwD;AAAA,EAClD,QAAQ,oBAAI,IAA4B;AAAA,EAEzD,MAAM,IAAI,MAAqC;AAC7C,QAAI,KAAK,MAAM,IAAI,KAAK,KAAK,GAAG;AAC9B,YAAM,IAAI,MAAM,yCAAyC,KAAK,KAAK,EAAE;AAAA,IACvE;AACA,SAAK,MAAM,IAAI,KAAK,OAAO,IAAI;AAAA,EACjC;AAAA,EAEA,MAAM,QAAQ,OAA+C;AAC3D,UAAM,OAAO,KAAK,MAAM,IAAI,KAAK;AACjC,QAAI,CAAC,KAAM,QAAO;AAClB,SAAK,MAAM,OAAO,KAAK;AACvB,QAAI,KAAK,UAAU,QAAQ,IAAI,KAAK,IAAI,EAAG,QAAO;AAClD,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,iBAAkC;AACtC,UAAM,MAAM,KAAK,IAAI;AACrB,QAAI,UAAU;AACd,eAAW,CAAC,OAAO,IAAI,KAAK,KAAK,OAAO;AACtC,UAAI,KAAK,UAAU,QAAQ,IAAI,KAAK;AAClC,aAAK,MAAM,OAAO,KAAK;AACvB;AAAA,MACF;AAAA,IACF;AACA,WAAO;AAAA,EACT;AACF;AAqBA,MAAM,oBAAoB;AAE1B,eAAe,eACb,UACA,SACqD;AACrD,MAAI;AACF,WAAO,MAAM,uCAAuC,UAAU,QAAW,OAAO;AAAA,EAClF,SAAS,KAAK;AACZ,QAAI,eAAe,SAAS,IAAI,QAAQ,SAAS,iBAAiB,GAAG;AAGnE,aAAO;AAAA,IACT;AACA,UAAM,UAAU,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAC/D,UAAM,IAAI,+BAA+B,yBAAyB,OAAO,EAAE;AAAA,EAC7E;AACF;AAEA,SAAS,oCAAoC,UAAkB,aAA2B;AACxF,QAAM,YAAY,yBAAyB,IAAI,IAAI,QAAQ,CAAC;AAC5D,MAAI,CAAC,qBAAqB,EAAE,mBAAmB,WAAW,oBAAoB,YAAY,CAAC,GAAG;AAC5F,UAAM,IAAI;AAAA,MACR,2BAA2B,WAAW,mDAAmD,QAAQ;AAAA,IACnG;AAAA,EACF;AACF;AAEA,SAAS,8BAA8B,UAAkB,KAAsD;AAC7G,QAAM,QAAQ,KAAK,wBAAwB,CAAC;AAC5C,MAAI,OAAO;AACT,WAAO,IAAI,IAAI,KAAK;AAAA,EACtB;AACA,SAAO,IAAI,IAAI,IAAI,IAAI,QAAQ,EAAE,MAAM;AACzC;AAEA,eAAe,yBAAyB,MAQJ;AAClC,QAAM,EAAE,OAAO,cAAc,OAAO,YAAY,gBAAgB,SAAS,wBAAwB,IAAI;AAErG,MAAI,MAAM,cAAc;AACtB,WAAO,gBAAgB,MAAM,YAAY;AAAA,EAC3C;AAEA,MAAI,CAAC,WAAW,uBAAuB;AACrC,UAAM,IAAI;AAAA,MACR;AAAA,MACA;AAAA,MACA,MAAM;AAAA,IACR;AAAA,EACF;AAEA,QAAM,aAAyC,MAAM,eAAe,MAAM,SAAS,GAAG;AAAA,IACpF,UAAU;AAAA,IACV;AAAA,IACA;AAAA,EACF,CAAC;AAED,MAAI,WAAW,iBAAiB,CAAC,yBAAyB;AACxD,UAAM,IAAI,kCAAkC,MAAM,EAAE;AAAA,EACtD;AAEA,MAAI,cAAc;AAIhB,UAAM,QAAS,MAAM,aAAa,UAAU,MAAM,EAAE,KAAM;AAC1D,UAAM,eAAe,kBAAkB,UAAU;AACjD,UAAM,aAAa,UAAU,KAAK;AAAA,EACpC;AAEA,SAAO;AACT;AAEA,SAAS,uBAA+B;AACtC,SAAO,YAAY,EAAE,EAAE,SAAS,WAAW;AAC7C;AAOA,SAAS,uBAAuB,KAAkC;AAMhE,QAAM,iBAAkB,KAAgC;AACxD,QAAM,UAAU,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAC/D,QAAM,SAAU,KAA6B,UAAU;AACvD,QAAM,UAAW,KAA2B,QAAQ;AACpD,QAAM,OAAO,aAAa,OAAO;AACjC,QAAM,UAAU,iBAAiB,GAAG,cAAc,KAAK,OAAO,KAAK;AACnE,SAAO,IAAI,mBAAmB,0BAA0B,aAAa,OAAO,CAAC,IAAI,QAAQ,MAAM,cAAc;AAC/G;AAEA,MAAM,uBAAuB,CAAC,gBAAgB,iBAAiB,YAAY,OAAO;AAQlF,SAAS,aAAa,OAAuB;AAC3C,MAAI,MAAM;AACV,aAAW,OAAO,sBAAsB;AAEtC,UAAM,IAAI,QAAQ,IAAI,OAAO,KAAK,GAAG,wBAAwB,IAAI,GAAG,gBAAgB;AAEpF,UAAM,IAAI,QAAQ,IAAI,OAAO,OAAO,GAAG,cAAc,IAAI,GAAG,cAAc;AAAA,EAC5E;AACA,SAAO;AACT;","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../../../src/lib/auth/oauth/web-flow.ts"],"sourcesContent":["/**\n * Web (server-side) OAuth flow helpers for `@adcp/sdk`.\n *\n * Companion to `CLIFlowHandler` for environments where `/oauth/start` and\n * `/oauth/callback` may be served by different processes. Discovery, PKCE,\n * URL construction, and token exchange are delegated to the MCP SDK's\n * `client/auth.js` primitives so this module is glue plus a pending-flow\n * store interface — not reimplemented protocol logic.\n *\n * Wire contract:\n * - An operator `resourceOverride` takes precedence for legacy or\n * non-conformant integrations. Otherwise PRM (RFC 9728) is consulted;\n * `prm.resource` is the source of truth for the RFC 8707 `resource`\n * indicator. We fall back to\n * `resourceUrlFromServerUrl(agent.agent_uri)` only when the resource\n * server does not implement PRM (404). Connection / parse / 5xx\n * errors throw `ProtectedResourceMetadataError` — never silently\n * downgrade to local guessing.\n * - Without a trusted override, `prm.resource` must share an origin with\n * the agent URL; the MCP SDK's `checkResourceAllowed` guards against a\n * poisoned PRM pointing the audience at a third party.\n * - AS URL = `prm.authorization_servers[0]` when PRM is present, else\n * the agent origin.\n * - Scope priority: caller-supplied `scopeHint` (e.g. from a 401\n * `WWW-Authenticate` challenge, per SEP-835) > `prm.scopes_supported`\n * > `clientMetadata.scope`.\n * - Refresh is NOT this module's concern. Once `oauth_tokens` are\n * persisted, `MCPOAuthProvider` handles refresh on the next agent\n * call and the MCP SDK forwards `resource` into the refresh request.\n * Callers who DIY refresh against `oauth_tokens` are responsible for\n * forwarding `resource` themselves.\n */\n\nimport { randomBytes } from 'crypto';\nimport {\n discoverAuthorizationServerMetadata,\n discoverOAuthProtectedResourceMetadata,\n exchangeAuthorization,\n registerClient,\n startAuthorization,\n} from '@modelcontextprotocol/sdk/client/auth.js';\nimport { checkResourceAllowed, resourceUrlFromServerUrl } from '@modelcontextprotocol/sdk/shared/auth-utils.js';\nimport type {\n AuthorizationServerMetadata,\n OAuthClientInformation,\n OAuthClientInformationFull,\n OAuthClientMetadata,\n OAuthProtectedResourceMetadata,\n OAuthTokens,\n} from '@modelcontextprotocol/sdk/shared/auth.js';\n\nimport type { AgentConfig, OAuthConfigStorage } from './types';\nimport { DEFAULT_CLIENT_METADATA, fromMCPClientInfo, fromMCPTokens, OAuthError, toMCPClientInfo } from './types';\nimport { validateOAuthResourceUrl } from './resource-url';\n\n/**\n * Default TTL for a pending web flow row. RFC 6749 §10.12 recommends\n * short-lived state; 10 minutes covers slow-typing users without leaving\n * the PKCE verifier on disk longer than necessary.\n */\nexport const DEFAULT_WEB_FLOW_TTL_MS = 10 * 60 * 1000;\n\n/**\n * State persisted between `/oauth/start` and `/oauth/callback`.\n *\n * `codeVerifier` is a PKCE secret. Store implementations MUST encrypt it\n * at rest if persistence crosses a trust boundary (shared DB, cross-tenant\n * Redis, etc.).\n *\n * `carry` is preserved verbatim and round-tripped to the callback. It\n * MUST be JSON-serializable, MUST NOT contain secrets, and MUST be\n * treated as attacker-influenced data (the caller typically populates it\n * from the `/start` request).\n */\nexport interface PendingWebFlow {\n state: string;\n agentId: string;\n agentUrl: string;\n codeVerifier: string;\n redirectUri: string;\n resource?: string;\n /** Explicit operator override, persisted separately so refresh can retain it. */\n resourceOverride?: string;\n /** Mutation requested by this flow. Absent on legacy rows and preserve-only flows. */\n resourceOverrideAction?: 'set' | 'clear';\n /** Value observed at flow start; used to reject concurrent operator edits. */\n resourceOverrideSnapshot?: string | null;\n scope?: string;\n authorizationServerUrl: string;\n /** Persist as JSON (e.g. Postgres `jsonb`); contents are MCP SDK-typed. */\n clientInformation: OAuthClientInformation;\n createdAt: Date;\n expiresAt: Date;\n /** JSON-serializable, no secrets, attacker-influenced. */\n carry?: Record<string, unknown>;\n}\n\n/**\n * Persistence interface for in-flight web OAuth flows.\n *\n * Canonical implementations:\n *\n * Postgres:\n * ```sql\n * INSERT INTO pending_oauth_flows (state, payload, expires_at)\n * VALUES ($1, $2, $3);\n * -- consume:\n * DELETE FROM pending_oauth_flows\n * WHERE state = $1 AND expires_at > now()\n * RETURNING payload;\n * ```\n *\n * Redis:\n * ```\n * SET pending:flow:<state> <payload> EX 600 NX -- put\n * GETDEL pending:flow:<state> -- consume\n * ```\n *\n * `consume` MUST be a single atomic operation that deletes and returns the\n * row (or returns null). A `SELECT` followed by a separate `DELETE` is a\n * replay vulnerability and DOES NOT satisfy this contract — a callback\n * replayed before the first one commits would mint two tokens.\n *\n * `consume` MUST treat expired rows as absent (return null) and SHOULD\n * delete them on read so a separate sweep is not strictly required.\n *\n * **Tradeoff: consume runs before token exchange.** `completeWebOAuthFlow`\n * consumes the pending row before attempting `exchangeAuthorization`. If\n * the AS returns a transient 5xx (or the network blips between us and the\n * AS), the row is gone and the user must restart from `/oauth/start`.\n * This is the right call for `invalid_grant` (replay protection — the\n * authorization code is one-shot at the AS regardless), but it means\n * transient AS failures cost the user a click. Revisit only if you see\n * real retry-loss in the field.\n */\nexport interface PendingWebFlowStore {\n /** Insert a new flow. MUST reject duplicate `state`. */\n put(flow: PendingWebFlow): Promise<void>;\n /**\n * Atomic delete-and-return. MUST NOT return the same row twice.\n * Returns null if the row is absent or expired.\n */\n consume(state: string): Promise<PendingWebFlow | null>;\n /** Optional housekeeping for expired rows that were never claimed. */\n cleanupExpired?(): Promise<number>;\n}\n\n/** @deprecated Renamed to `PendingWebFlowStore`. */\nexport type PendingFlowStore = PendingWebFlowStore;\n\nexport class InvalidOrExpiredFlowError extends OAuthError {\n constructor(state: string) {\n super(`OAuth flow not found or expired (state=${state})`, 'invalid_or_expired_flow');\n this.name = 'InvalidOrExpiredFlowError';\n }\n}\n\nexport class StateMismatchError extends OAuthError {\n constructor() {\n super('OAuth state does not match the value the caller bound to this session', 'state_mismatch');\n this.name = 'StateMismatchError';\n }\n}\n\nexport class TokenExchangeError extends OAuthError {\n constructor(\n message: string,\n public readonly status: number,\n public readonly body: string,\n /**\n * RFC 6749 §5.2 error code when the authorization server returned a\n * standard error envelope (`invalid_grant`, `invalid_client`, etc.).\n * Undefined when the AS returned a non-OAuth-shaped failure.\n */\n public readonly oauthErrorCode?: string\n ) {\n super(message, 'token_exchange_failed');\n this.name = 'TokenExchangeError';\n }\n}\n\nexport class ProtectedResourceMetadataError extends OAuthError {\n constructor(message: string) {\n super(message, 'protected_resource_metadata_error');\n this.name = 'ProtectedResourceMetadataError';\n }\n}\n\nexport class AgentVanishedDuringFlowError extends OAuthError {\n constructor(agentId: string) {\n super(\n `Agent ${agentId} could not be loaded from storage during token persistence; tokens were not saved`,\n 'agent_vanished_during_flow',\n agentId\n );\n this.name = 'AgentVanishedDuringFlowError';\n }\n}\n\nexport class AgentChangedDuringFlowError extends OAuthError {\n constructor(agentId: string) {\n super(\n `Agent ${agentId} changed while OAuth authorization was pending; tokens were not saved`,\n 'agent_changed_during_flow',\n agentId\n );\n this.name = 'AgentChangedDuringFlowError';\n }\n}\n\nexport class ConfidentialClientNotAllowedError extends OAuthError {\n constructor(agentId: string | undefined) {\n super(\n 'Authorization server issued a confidential client (client_secret) during dynamic registration. ' +\n 'Pass `allowConfidentialClient: true` if you intend to persist a long-lived AS credential to your agent storage.',\n 'confidential_client_not_allowed',\n agentId\n );\n this.name = 'ConfidentialClientNotAllowedError';\n }\n}\n\nexport class BrowserBindingRequiredError extends OAuthError {\n constructor() {\n super(\n 'completeWebOAuthFlow called with requireBrowserBinding:true but expectedState was not supplied — ' +\n 'pass the state value from the session cookie set at /oauth/start',\n 'browser_binding_required'\n );\n this.name = 'BrowserBindingRequiredError';\n }\n}\n\nexport interface StartWebFlowOptions {\n /** Agent the flow is for. Must include `agent_uri`. */\n agent: AgentConfig;\n /** Absolute URL of the consumer's `/callback` route (must match what the AS sees). */\n redirectUri: string;\n /** Where to persist the pending flow until callback. */\n pendingFlowStore: PendingWebFlowStore;\n /** When provided, dynamic-registration results land in `agent.oauth_client`. */\n agentStorage?: OAuthConfigStorage;\n /**\n * Free-form caller payload, round-tripped to `completeWebOAuthFlow`.\n * Must be JSON-serializable. Do not store secrets here. Treated as\n * attacker-influenced — validate before reflecting (e.g. via\n * {@link safeReturnTo} for redirect targets).\n */\n carry?: Record<string, unknown>;\n /**\n * Scope hint (highest priority per SEP-835). Pass through the `scope`\n * value from a prior 401 `WWW-Authenticate` challenge if you have one.\n */\n scopeHint?: string;\n /**\n * Operator-supplied RFC 8707 resource override. Takes precedence over\n * `prm.resource` and the agent-URL-derived fallback, and is sent during\n * both authorization and code exchange. Pass `null` to explicitly clear a\n * persisted override and return to metadata/agent-URL discovery.\n */\n resourceOverride?: string | null;\n /**\n * Non-standard Auth0-compatible audience parameter. Sent only to the\n * authorization endpoint. Prefer `resourceOverride` for RFC 8707 servers.\n */\n audience?: string;\n /** Permit an HTTP resource override for local development. Default false. */\n allowHttp?: boolean;\n /** Override flow TTL. Default: {@link DEFAULT_WEB_FLOW_TTL_MS}. */\n ttlMs?: number;\n /** Override the random-state generator (defaults to 32 bytes base64url). */\n generateState?: () => string;\n /** Override `fetch` (timeouts, signing, mocks). */\n fetch?: typeof fetch;\n /**\n * Override base client metadata. `redirect_uris` is always replaced\n * with `[redirectUri]` regardless of what's passed here.\n */\n clientMetadata?: Partial<OAuthClientMetadata>;\n /**\n * Permit the AS to register a confidential client (i.e. one that\n * returns a `client_secret` from dynamic registration). Default false:\n * if the AS issues a secret we throw {@link ConfidentialClientNotAllowedError}\n * rather than silently persisting a long-lived credential to your\n * agent storage.\n */\n allowConfidentialClient?: boolean;\n}\n\nexport interface StartWebFlowResult {\n authorizationUrl: string;\n state: string;\n expiresAt: Date;\n}\n\nexport interface CompleteWebFlowOptions {\n state: string;\n code: string;\n pendingFlowStore: PendingWebFlowStore;\n /** When provided, the issued tokens are persisted to `agent.oauth_tokens`. */\n agentStorage?: OAuthConfigStorage;\n fetch?: typeof fetch;\n /**\n * The caller-bound expected state (e.g. from a session cookie set at\n * `/oauth/start`). When provided, must equal `state`; mismatch throws\n * {@link StateMismatchError}. Without this, `state` is replay-protected\n * but not browser-bound — see WEB-OAUTH.md.\n */\n expectedState?: string;\n /**\n * When `true`, throws {@link BrowserBindingRequiredError} if `expectedState`\n * is omitted instead of emitting a `console.warn`. Use this in frameworks\n * where session cookies are always available so that a missing bind is caught\n * at development time rather than silently permitted in production.\n *\n * Default: `false`.\n */\n requireBrowserBinding?: boolean;\n}\n\nexport interface CompleteWebFlowResult {\n agentId: string;\n agentUrl: string;\n tokens: OAuthTokens;\n carry?: Record<string, unknown>;\n /** True if `agentStorage` was provided AND `saveAgent` succeeded. */\n persisted: boolean;\n}\n\n/**\n * Begin a web OAuth flow. Returns the authorization URL the consumer\n * should redirect the browser to. Persists the PKCE verifier and other\n * flow state via `pendingFlowStore.put` so a different process can complete it.\n */\nexport async function startWebOAuthFlow(opts: StartWebFlowOptions): Promise<StartWebFlowResult> {\n const {\n agent,\n redirectUri,\n pendingFlowStore,\n agentStorage,\n carry,\n scopeHint,\n resourceOverride: requestedResourceOverride,\n audience,\n allowHttp = false,\n ttlMs = DEFAULT_WEB_FLOW_TTL_MS,\n generateState,\n fetch: fetchFn,\n clientMetadata: clientMetadataOverrides,\n allowConfidentialClient = false,\n } = opts;\n\n if (!agent.agent_uri) {\n throw new OAuthError('Agent missing agent_uri', 'invalid_agent', agent.id);\n }\n\n const resourceOverrideAction =\n requestedResourceOverride === null ? 'clear' : requestedResourceOverride !== undefined ? 'set' : undefined;\n const rawResourceOverride =\n requestedResourceOverride === null ? undefined : (requestedResourceOverride ?? agent.oauth_resource);\n const resourceOverride = rawResourceOverride\n ? validateOAuthResourceUrl(rawResourceOverride, { allowHttp }).href\n : undefined;\n\n const prm = await tryDiscoverPRM(agent.agent_uri, fetchFn);\n if (!resourceOverride && prm?.resource) {\n assertPrmResourceMatchesAgentOrigin(agent.agent_uri, prm.resource);\n }\n\n const asUrl = resolveAuthorizationServerUrl(agent.agent_uri, prm);\n\n const asMetadata = await discoverAuthorizationServerMetadata(asUrl.toString(), { fetchFn });\n if (!asMetadata) {\n throw new OAuthError(`No OAuth metadata at ${asUrl.toString()}`, 'no_authorization_server_metadata', agent.id);\n }\n\n const resource = resourceOverride\n ? new URL(resourceOverride)\n : prm?.resource\n ? new URL(prm.resource)\n : resourceUrlFromServerUrl(new URL(agent.agent_uri));\n\n const baseClientMetadata: OAuthClientMetadata = {\n ...DEFAULT_CLIENT_METADATA,\n ...clientMetadataOverrides,\n redirect_uris: [redirectUri],\n };\n\n const scope = scopeHint ?? prm?.scopes_supported?.join(' ') ?? baseClientMetadata.scope;\n\n const clientInformation = await resolveClientInformation({\n agent,\n agentStorage,\n asUrl,\n asMetadata,\n clientMetadata: baseClientMetadata,\n fetchFn,\n allowConfidentialClient,\n });\n\n const state = (generateState ?? defaultGenerateState)();\n const { authorizationUrl, codeVerifier } = await startAuthorization(asUrl.toString(), {\n metadata: asMetadata,\n clientInformation,\n redirectUrl: redirectUri,\n scope,\n state,\n resource,\n });\n if (audience) {\n authorizationUrl.searchParams.set('audience', audience);\n }\n\n const now = new Date();\n const expiresAt = new Date(now.getTime() + ttlMs);\n const flow: PendingWebFlow = {\n state,\n agentId: agent.id,\n agentUrl: agent.agent_uri,\n codeVerifier,\n redirectUri,\n resource: resource.href,\n resourceOverride,\n resourceOverrideAction,\n resourceOverrideSnapshot: agent.oauth_resource ?? null,\n scope,\n authorizationServerUrl: asUrl.toString(),\n clientInformation,\n createdAt: now,\n expiresAt,\n carry,\n };\n await pendingFlowStore.put(flow);\n\n return {\n authorizationUrl: authorizationUrl.toString(),\n state,\n expiresAt,\n };\n}\n\n/**\n * Finish a web OAuth flow. Atomically consumes the pending row, exchanges\n * the authorization code for tokens, and (if storage is provided)\n * persists tokens to `agent.oauth_tokens`. Returns whatever the caller\n * stashed in `carry` so the consumer can route the user appropriately.\n *\n * The pending row is consumed BEFORE `exchangeAuthorization` runs. A\n * transient AS failure leaves the user with no row to retry against and\n * they must restart from `/oauth/start`. See {@link PendingWebFlowStore}\n * for the full tradeoff discussion.\n */\nexport async function completeWebOAuthFlow(opts: CompleteWebFlowOptions): Promise<CompleteWebFlowResult> {\n const { state, code, pendingFlowStore, agentStorage, fetch: fetchFn, expectedState, requireBrowserBinding } = opts;\n\n if (expectedState === undefined) {\n if (requireBrowserBinding) {\n throw new BrowserBindingRequiredError();\n }\n // Warn callers who omit expectedState: the flow is replay-protected via\n // atomic consume but is not browser-bound (any request carrying the correct\n // state + code would be accepted). Pass expectedState from a session cookie\n // set at /oauth/start to fully bind the callback to the initiating browser.\n // Set requireBrowserBinding:true to make this a hard error instead.\n console.warn(\n '[adcp/sdk] completeWebOAuthFlow: expectedState not supplied — the callback is replay-protected ' +\n 'but not browser-bound. Pass expectedState from a session cookie set at /oauth/start, ' +\n 'or set requireBrowserBinding:true to enforce it.'\n );\n } else if (expectedState !== state) {\n throw new StateMismatchError();\n }\n\n const flow = await pendingFlowStore.consume(state);\n if (!flow || flow.expiresAt.getTime() < Date.now()) {\n throw new InvalidOrExpiredFlowError(state);\n }\n\n let agentForPersistence: AgentConfig | undefined;\n if (agentStorage) {\n agentForPersistence = await agentStorage.loadAgent(flow.agentId);\n assertAgentUnchangedForFlow(agentForPersistence, flow);\n }\n\n const asMetadata = await discoverAuthorizationServerMetadata(flow.authorizationServerUrl, {\n fetchFn,\n });\n\n let tokens: OAuthTokens;\n try {\n tokens = await exchangeAuthorization(flow.authorizationServerUrl, {\n metadata: asMetadata ?? undefined,\n clientInformation: flow.clientInformation,\n authorizationCode: code,\n codeVerifier: flow.codeVerifier,\n redirectUri: flow.redirectUri,\n resource: flow.resource ? new URL(flow.resource) : undefined,\n fetchFn,\n });\n } catch (err) {\n throw wrapTokenExchangeError(err);\n }\n\n let persisted = false;\n if (agentStorage) {\n // Re-read after the network round trips so we do not save the stale object\n // loaded before token exchange or overwrite an edit made while the AS was\n // responding. Storage implementations that need a hard same-ID/same-URI\n // tenant guarantee should additionally make saveAgent revision-aware.\n agentForPersistence = await agentStorage.loadAgent(flow.agentId);\n assertAgentUnchangedForFlow(agentForPersistence, flow);\n agentForPersistence.oauth_tokens = fromMCPTokens(tokens);\n if (flow.resourceOverrideAction === 'set' && flow.resourceOverride) {\n agentForPersistence.oauth_resource = flow.resourceOverride;\n } else if (flow.resourceOverrideAction === 'clear') {\n delete agentForPersistence.oauth_resource;\n }\n delete agentForPersistence.oauth_code_verifier;\n await agentStorage.saveAgent(agentForPersistence);\n persisted = true;\n }\n\n return {\n agentId: flow.agentId,\n agentUrl: flow.agentUrl,\n tokens,\n carry: flow.carry,\n persisted,\n };\n}\n\nfunction assertAgentUnchangedForFlow(\n agent: AgentConfig | undefined,\n flow: PendingWebFlow\n): asserts agent is AgentConfig {\n if (!agent) {\n throw new AgentVanishedDuringFlowError(flow.agentId);\n }\n if (agent.agent_uri !== flow.agentUrl) {\n throw new AgentChangedDuringFlowError(flow.agentId);\n }\n if (\n Object.prototype.hasOwnProperty.call(flow, 'resourceOverrideSnapshot') &&\n (agent.oauth_resource ?? null) !== flow.resourceOverrideSnapshot\n ) {\n throw new AgentChangedDuringFlowError(flow.agentId);\n }\n}\n\n/**\n * Validate a redirect target supplied via `carry`.\n *\n * Treats `value` as attacker-influenced. Returns a string that is safe to\n * pass to `res.redirect`, or `undefined` if the value is invalid.\n *\n * Defaults to **path-only** redirects (must start with a single `/` and\n * not be protocol-relative `//evil.example`). Pass `allowedReturnHosts`\n * to permit absolute URLs against an allowlist.\n *\n * @example\n * ```ts\n * res.redirect(safeReturnTo(carry?.return_to) ?? '/');\n * res.redirect(safeReturnTo(carry?.return_to, { allowedReturnHosts: ['app.example.com'] }) ?? '/');\n * ```\n */\nexport function safeReturnTo(value: unknown, options: { allowedReturnHosts?: string[] } = {}): string | undefined {\n if (typeof value !== 'string' || value.length === 0) return undefined;\n\n // Path-only: must be `/...` but not `//...` (protocol-relative) or `/\\...`.\n if (value.startsWith('/') && !value.startsWith('//') && !value.startsWith('/\\\\')) {\n return value;\n }\n\n const allowed = options.allowedReturnHosts;\n if (!allowed || allowed.length === 0) return undefined;\n\n let parsed: URL;\n try {\n parsed = new URL(value);\n } catch {\n return undefined;\n }\n if (parsed.protocol !== 'https:' && parsed.protocol !== 'http:') return undefined;\n if (!allowed.includes(parsed.host)) return undefined;\n return parsed.toString();\n}\n\n/**\n * In-memory pending-flow store for tests and single-instance dev.\n *\n * Production deployments MUST implement `PendingWebFlowStore` against a\n * shared store (Postgres `DELETE … RETURNING`, Redis `GETDEL`) so\n * `/start` and `/callback` can hit different processes.\n */\nexport class InMemoryPendingFlowStore implements PendingWebFlowStore {\n private readonly flows = new Map<string, PendingWebFlow>();\n\n async put(flow: PendingWebFlow): Promise<void> {\n if (this.flows.has(flow.state)) {\n throw new Error(`Pending flow already exists for state ${flow.state}`);\n }\n this.flows.set(flow.state, flow);\n }\n\n async consume(state: string): Promise<PendingWebFlow | null> {\n const flow = this.flows.get(state);\n if (!flow) return null;\n this.flows.delete(state);\n if (flow.expiresAt.getTime() < Date.now()) return null;\n return flow;\n }\n\n async cleanupExpired(): Promise<number> {\n const now = Date.now();\n let removed = 0;\n for (const [state, flow] of this.flows) {\n if (flow.expiresAt.getTime() < now) {\n this.flows.delete(state);\n removed++;\n }\n }\n return removed;\n }\n}\n\n// ============================================================\n// Internals\n// ============================================================\n\n/**\n * The MCP SDK reports a 404 PRM lookup with this exact message; treat it\n * as \"PRM is genuinely absent\" and fall back. Anything else is a\n * connection, parse, or 5xx error and is allowed to bubble.\n *\n * Source (verified against `@modelcontextprotocol/sdk@1.29.0`):\n * `dist/esm/client/auth.js` → `discoverOAuthProtectedResourceMetadata`\n * throws `new Error(`Resource server does not implement OAuth 2.0 Protected Resource Metadata.`)`\n * when `response.status === 404` (or no response was returned).\n *\n * If a future MCP SDK reword this message, the test\n * \"falls back to server-derived resource on a 404 PRM\" at\n * `test/lib/oauth-web-flow.test.js` will fail — that test calls the real\n * SDK against a 404 fixture and is the canary for this regression.\n */\nconst PRM_ABSENT_MARKER = 'does not implement OAuth 2.0 Protected Resource Metadata';\n\nasync function tryDiscoverPRM(\n agentUrl: string,\n fetchFn: typeof fetch | undefined\n): Promise<OAuthProtectedResourceMetadata | undefined> {\n try {\n return await discoverOAuthProtectedResourceMetadata(agentUrl, undefined, fetchFn);\n } catch (err) {\n if (err instanceof Error && err.message.includes(PRM_ABSENT_MARKER)) {\n // PRM is optional under RFC 9728 — fall back to local resource\n // derivation. Connection/parse/5xx errors fall through.\n return undefined;\n }\n const message = err instanceof Error ? err.message : String(err);\n throw new ProtectedResourceMetadataError(`PRM discovery failed: ${message}`);\n }\n}\n\nfunction assertPrmResourceMatchesAgentOrigin(agentUrl: string, prmResource: string): void {\n const requested = resourceUrlFromServerUrl(new URL(agentUrl));\n if (!checkResourceAllowed({ requestedResource: requested, configuredResource: prmResource })) {\n throw new ProtectedResourceMetadataError(\n `PRM advertises resource ${prmResource} which does not share an origin/path with agent ${agentUrl}`\n );\n }\n}\n\nfunction resolveAuthorizationServerUrl(agentUrl: string, prm: OAuthProtectedResourceMetadata | undefined): URL {\n const first = prm?.authorization_servers?.[0];\n if (first) {\n return new URL(first);\n }\n return new URL(new URL(agentUrl).origin);\n}\n\nasync function resolveClientInformation(args: {\n agent: AgentConfig;\n agentStorage?: OAuthConfigStorage;\n asUrl: URL;\n asMetadata: AuthorizationServerMetadata;\n clientMetadata: OAuthClientMetadata;\n fetchFn?: typeof fetch;\n allowConfidentialClient: boolean;\n}): Promise<OAuthClientInformation> {\n const { agent, agentStorage, asUrl, asMetadata, clientMetadata, fetchFn, allowConfidentialClient } = args;\n\n if (agent.oauth_client) {\n return toMCPClientInfo(agent.oauth_client);\n }\n\n if (!asMetadata.registration_endpoint) {\n throw new OAuthError(\n 'Agent has no oauth_client and authorization server does not advertise dynamic client registration',\n 'no_client_credentials',\n agent.id\n );\n }\n\n const registered: OAuthClientInformationFull = await registerClient(asUrl.toString(), {\n metadata: asMetadata,\n clientMetadata,\n fetchFn,\n });\n\n if (registered.client_secret && !allowConfidentialClient) {\n throw new ConfidentialClientNotAllowedError(agent.id);\n }\n\n if (agentStorage) {\n // Load fresh and save fresh so two concurrent /start calls for the\n // same agentId do not trample each other's `oauth_client` via a\n // shared in-memory reference.\n const fresh = (await agentStorage.loadAgent(agent.id)) ?? agent;\n fresh.oauth_client = fromMCPClientInfo(registered);\n await agentStorage.saveAgent(fresh);\n }\n\n return registered;\n}\n\nfunction defaultGenerateState(): string {\n return randomBytes(32).toString('base64url');\n}\n\n/**\n * Map an MCP SDK token-exchange failure to {@link TokenExchangeError},\n * redacting bearer/refresh tokens that some authorization servers echo\n * back in error responses for debugging.\n */\nfunction wrapTokenExchangeError(err: unknown): TokenExchangeError {\n // The MCP SDK's `parseErrorResponse` decodes a well-formed OAuth error\n // envelope into an `OAuthError` subclass with `errorCode` (e.g.\n // `InvalidGrantError`). Malformed responses come through as\n // `ServerError` with the raw body in `message`, so the redaction pass\n // covers both cases.\n const oauthErrorCode = (err as { errorCode?: string })?.errorCode;\n const message = err instanceof Error ? err.message : String(err);\n const status = (err as { status?: number })?.status ?? 0;\n const rawBody = (err as { body?: string })?.body ?? message;\n const body = redactTokens(rawBody);\n const display = oauthErrorCode ? `${oauthErrorCode}: ${message}` : message;\n return new TokenExchangeError(`Token exchange failed: ${redactTokens(display)}`, status, body, oauthErrorCode);\n}\n\nconst SENSITIVE_TOKEN_KEYS = ['access_token', 'refresh_token', 'id_token', 'token'];\n\n/**\n * Best-effort redaction of bearer/refresh tokens from an AS error body\n * (which may be JSON, form-encoded, or freeform). Adopters MUST still\n * treat `TokenExchangeError.body` as sensitive — do not reflect it to\n * the browser or write it to access logs unredacted.\n */\nfunction redactTokens(input: string): string {\n let out = input;\n for (const key of SENSITIVE_TOKEN_KEYS) {\n // JSON form: \"key\":\"…\"\n out = out.replace(new RegExp(`(\"${key}\"\\\\s*:\\\\s*\")[^\"]*(\")`, 'gi'), '$1<redacted>$2');\n // form-encoded: key=…\n out = out.replace(new RegExp(`(\\\\b${key}=)[^&\\\\s]+`, 'gi'), '$1<redacted>');\n }\n return out;\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { Client as MCPClient } from '@modelcontextprotocol/sdk/client/index.js';
|
|
2
2
|
import type { AgentConfig } from '../types/index.mjs';
|
|
3
|
-
import type { MCPWebhookPayload, GetBrandIdentityRequest, GetBrandIdentityResponse, ContextMatchRequest, ContextMatchResponse, IdentityMatchRequest,
|
|
3
|
+
import type { MCPWebhookPayload, GetBrandIdentityRequest, GetBrandIdentityResponse, ContextMatchRequest, ContextMatchResponse, IdentityMatchRequest, IdentityMatchResponseRouterPublisher } from '../types/core.generated.mjs';
|
|
4
4
|
import type { Task as A2ATask, TaskStatusUpdateEvent } from '@a2a-js/sdk';
|
|
5
5
|
import { type CanonicalReadTaskOptions, type CreativeDeliveryTaskOptions, type SingleAgentClientConfig, type SyncCreativesTaskOptions, type VerifyAndParseWebhookOptions, type WebhookParseResult } from './SingleAgentClient.mjs';
|
|
6
6
|
import type { InputHandler, TaskOptions, TaskResult, TaskInfo, Message } from './ConversationTypes.mjs';
|
|
@@ -68,7 +68,7 @@ export type TaskResponseTypeMap = {
|
|
|
68
68
|
report_plan_outcome: ReportPlanOutcomeResponse;
|
|
69
69
|
get_plan_audit_logs: GetPlanAuditLogsResponse;
|
|
70
70
|
context_match: ContextMatchResponse;
|
|
71
|
-
identity_match:
|
|
71
|
+
identity_match: IdentityMatchResponseRouterPublisher;
|
|
72
72
|
};
|
|
73
73
|
/**
|
|
74
74
|
* Valid ADCP task names
|