@adcp/sdk 13.0.0-rc.6 → 13.0.0-rc.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/ADCP_VERSION +1 -1
- package/bin/adcp.js +29 -0
- package/compliance/cache/{3.1.8 → 3.1.11}/domains/media-buy/index.yaml +1 -0
- package/compliance/cache/{3.1.8.previous/protocols → 3.1.11/domains}/media-buy/scenarios/creative_fate_after_cancellation.yaml +46 -24
- package/compliance/cache/3.1.11/domains/media-buy/scenarios/dependency_impairment_audience.yaml +317 -0
- package/compliance/cache/{3.1.8 → 3.1.11}/index.json +3 -3
- package/compliance/cache/{3.1.8.previous/domains → 3.1.11/protocols}/media-buy/index.yaml +1 -0
- package/compliance/cache/{3.1.8 → 3.1.11}/protocols/media-buy/scenarios/creative_fate_after_cancellation.yaml +46 -24
- package/compliance/cache/3.1.11/protocols/media-buy/scenarios/dependency_impairment_audience.yaml +317 -0
- package/compliance/cache/{3.1.8.previous → 3.1.11}/universal/runner-output-contract.yaml +1 -1
- package/compliance/cache/{3.1.8 → 3.1.11}/universal/storyboard-schema.yaml +19 -6
- package/compliance/cache/{3.1.8/protocols → 3.1.11.previous/domains}/media-buy/index.yaml +1 -0
- package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/domains/media-buy/scenarios/creative_fate_after_cancellation.yaml +46 -24
- package/compliance/cache/3.1.11.previous/domains/media-buy/scenarios/dependency_impairment_audience.yaml +317 -0
- package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/index.json +3 -3
- package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/protocols/media-buy/index.yaml +1 -0
- package/compliance/cache/{3.1.8/domains → 3.1.11.previous/protocols}/media-buy/scenarios/creative_fate_after_cancellation.yaml +46 -24
- package/compliance/cache/3.1.11.previous/protocols/media-buy/scenarios/dependency_impairment_audience.yaml +317 -0
- package/compliance/cache/{3.1.8 → 3.1.11.previous}/universal/runner-output-contract.yaml +1 -1
- package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/universal/storyboard-schema.yaml +19 -6
- 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/ClientCredentialsFlow.d.mts +2 -0
- package/dist/lib/auth/oauth/ClientCredentialsFlow.d.ts +2 -0
- package/dist/lib/auth/oauth/ClientCredentialsFlow.d.ts.map +1 -1
- package/dist/lib/auth/oauth/ClientCredentialsFlow.js +69 -24
- package/dist/lib/auth/oauth/ClientCredentialsFlow.js.map +1 -1
- package/dist/lib/auth/oauth/ClientCredentialsFlow.mjs +69 -24
- package/dist/lib/auth/oauth/ClientCredentialsFlow.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/authorization-required.d.mts +3 -0
- package/dist/lib/auth/oauth/authorization-required.d.ts +3 -0
- package/dist/lib/auth/oauth/authorization-required.d.ts.map +1 -1
- package/dist/lib/auth/oauth/authorization-required.js +37 -7
- package/dist/lib/auth/oauth/authorization-required.js.map +1 -1
- package/dist/lib/auth/oauth/authorization-required.mjs +37 -7
- package/dist/lib/auth/oauth/authorization-required.mjs.map +1 -1
- package/dist/lib/auth/oauth/discovery.d.mts +2 -0
- package/dist/lib/auth/oauth/discovery.d.ts +2 -0
- package/dist/lib/auth/oauth/discovery.d.ts.map +1 -1
- package/dist/lib/auth/oauth/discovery.js +7 -5
- package/dist/lib/auth/oauth/discovery.js.map +1 -1
- package/dist/lib/auth/oauth/discovery.mjs +7 -5
- package/dist/lib/auth/oauth/discovery.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/core/ConversationTypes.d.mts +6 -2
- package/dist/lib/core/ConversationTypes.d.ts +6 -2
- package/dist/lib/core/ConversationTypes.d.ts.map +1 -1
- package/dist/lib/core/ConversationTypes.js.map +1 -1
- package/dist/lib/core/GovernanceMiddleware.d.mts +3 -3
- package/dist/lib/core/GovernanceMiddleware.d.ts +3 -3
- package/dist/lib/core/GovernanceMiddleware.d.ts.map +1 -1
- package/dist/lib/core/GovernanceMiddleware.js +8 -4
- package/dist/lib/core/GovernanceMiddleware.js.map +1 -1
- package/dist/lib/core/GovernanceMiddleware.mjs +8 -4
- package/dist/lib/core/GovernanceMiddleware.mjs.map +1 -1
- package/dist/lib/core/SingleAgentClient.d.mts +12 -1
- package/dist/lib/core/SingleAgentClient.d.ts +12 -1
- package/dist/lib/core/SingleAgentClient.d.ts.map +1 -1
- package/dist/lib/core/SingleAgentClient.js +89 -12
- package/dist/lib/core/SingleAgentClient.js.map +1 -1
- package/dist/lib/core/SingleAgentClient.mjs +89 -12
- package/dist/lib/core/SingleAgentClient.mjs.map +1 -1
- package/dist/lib/core/TaskExecutor.d.mts +2 -4
- package/dist/lib/core/TaskExecutor.d.ts +2 -4
- package/dist/lib/core/TaskExecutor.d.ts.map +1 -1
- package/dist/lib/core/TaskExecutor.js +90 -14
- package/dist/lib/core/TaskExecutor.js.map +1 -1
- package/dist/lib/core/TaskExecutor.mjs +95 -14
- package/dist/lib/core/TaskExecutor.mjs.map +1 -1
- package/dist/lib/core/task-deadline.d.mts +20 -0
- package/dist/lib/core/task-deadline.d.ts +21 -0
- package/dist/lib/core/task-deadline.d.ts.map +1 -0
- package/dist/lib/core/task-deadline.js +74 -0
- package/dist/lib/core/task-deadline.js.map +1 -0
- package/dist/lib/core/task-deadline.mjs +47 -0
- package/dist/lib/core/task-deadline.mjs.map +1 -0
- package/dist/lib/errors/index.d.mts +11 -0
- package/dist/lib/errors/index.d.ts +11 -0
- package/dist/lib/errors/index.d.ts.map +1 -1
- package/dist/lib/errors/index.js +6 -0
- package/dist/lib/errors/index.js.map +1 -1
- package/dist/lib/errors/index.mjs +6 -0
- package/dist/lib/errors/index.mjs.map +1 -1
- package/dist/lib/net/ssrf-fetch.d.ts.map +1 -1
- package/dist/lib/net/ssrf-fetch.js +11 -0
- package/dist/lib/net/ssrf-fetch.js.map +1 -1
- package/dist/lib/net/ssrf-fetch.mjs +11 -0
- package/dist/lib/net/ssrf-fetch.mjs.map +1 -1
- package/dist/lib/protocols/abort.d.mts +3 -1
- package/dist/lib/protocols/abort.d.ts +3 -1
- package/dist/lib/protocols/abort.d.ts.map +1 -1
- package/dist/lib/protocols/abort.js +19 -17
- package/dist/lib/protocols/abort.js.map +1 -1
- package/dist/lib/protocols/abort.mjs +19 -17
- package/dist/lib/protocols/abort.mjs.map +1 -1
- package/dist/lib/protocols/index.d.ts.map +1 -1
- package/dist/lib/protocols/index.js +13 -10
- package/dist/lib/protocols/index.js.map +1 -1
- package/dist/lib/protocols/index.mjs +13 -10
- package/dist/lib/protocols/index.mjs.map +1 -1
- package/dist/lib/protocols/mcp.d.ts.map +1 -1
- package/dist/lib/protocols/mcp.js +8 -7
- package/dist/lib/protocols/mcp.js.map +1 -1
- package/dist/lib/protocols/mcp.mjs +8 -7
- package/dist/lib/protocols/mcp.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/testing/index.d.mts +1 -1
- package/dist/lib/testing/index.d.ts +1 -1
- package/dist/lib/testing/index.d.ts.map +1 -1
- package/dist/lib/testing/index.js +12 -0
- package/dist/lib/testing/index.js.map +1 -1
- package/dist/lib/testing/index.mjs +12 -0
- package/dist/lib/testing/index.mjs.map +1 -1
- package/dist/lib/testing/storyboard/canonical-format-satisfaction.d.mts +6 -0
- package/dist/lib/testing/storyboard/canonical-format-satisfaction.d.ts +6 -0
- package/dist/lib/testing/storyboard/canonical-format-satisfaction.d.ts.map +1 -1
- package/dist/lib/testing/storyboard/canonical-format-satisfaction.js +11 -0
- package/dist/lib/testing/storyboard/canonical-format-satisfaction.js.map +1 -1
- package/dist/lib/testing/storyboard/canonical-format-satisfaction.mjs +10 -0
- package/dist/lib/testing/storyboard/canonical-format-satisfaction.mjs.map +1 -1
- package/dist/lib/testing/storyboard/creative-assets.d.mts +5 -0
- package/dist/lib/testing/storyboard/creative-assets.d.ts +6 -0
- package/dist/lib/testing/storyboard/creative-assets.d.ts.map +1 -0
- package/dist/lib/testing/storyboard/creative-assets.js +180 -0
- package/dist/lib/testing/storyboard/creative-assets.js.map +1 -0
- package/dist/lib/testing/storyboard/creative-assets.mjs +154 -0
- package/dist/lib/testing/storyboard/creative-assets.mjs.map +1 -0
- package/dist/lib/testing/storyboard/fixture-resolution.d.mts +37 -0
- package/dist/lib/testing/storyboard/fixture-resolution.d.ts +38 -0
- package/dist/lib/testing/storyboard/fixture-resolution.d.ts.map +1 -0
- package/dist/lib/testing/storyboard/fixture-resolution.js +424 -0
- package/dist/lib/testing/storyboard/fixture-resolution.js.map +1 -0
- package/dist/lib/testing/storyboard/fixture-resolution.mjs +395 -0
- package/dist/lib/testing/storyboard/fixture-resolution.mjs.map +1 -0
- package/dist/lib/testing/storyboard/index.d.mts +2 -1
- package/dist/lib/testing/storyboard/index.d.ts +2 -1
- package/dist/lib/testing/storyboard/index.d.ts.map +1 -1
- package/dist/lib/testing/storyboard/index.js +13 -0
- package/dist/lib/testing/storyboard/index.js.map +1 -1
- package/dist/lib/testing/storyboard/index.mjs +14 -0
- package/dist/lib/testing/storyboard/index.mjs.map +1 -1
- package/dist/lib/testing/storyboard/junit.js +14 -1
- package/dist/lib/testing/storyboard/junit.js.map +1 -1
- package/dist/lib/testing/storyboard/junit.mjs +14 -1
- package/dist/lib/testing/storyboard/junit.mjs.map +1 -1
- package/dist/lib/testing/storyboard/loader.d.ts.map +1 -1
- package/dist/lib/testing/storyboard/loader.js +2 -0
- package/dist/lib/testing/storyboard/loader.js.map +1 -1
- package/dist/lib/testing/storyboard/loader.mjs +2 -0
- package/dist/lib/testing/storyboard/loader.mjs.map +1 -1
- package/dist/lib/testing/storyboard/runner.d.ts.map +1 -1
- package/dist/lib/testing/storyboard/runner.js +170 -12
- package/dist/lib/testing/storyboard/runner.js.map +1 -1
- package/dist/lib/testing/storyboard/runner.mjs +175 -13
- package/dist/lib/testing/storyboard/runner.mjs.map +1 -1
- package/dist/lib/testing/storyboard/seeding.d.mts +10 -3
- package/dist/lib/testing/storyboard/seeding.d.ts +10 -3
- package/dist/lib/testing/storyboard/seeding.d.ts.map +1 -1
- package/dist/lib/testing/storyboard/seeding.js +550 -2
- package/dist/lib/testing/storyboard/seeding.js.map +1 -1
- package/dist/lib/testing/storyboard/seeding.mjs +555 -2
- package/dist/lib/testing/storyboard/seeding.mjs.map +1 -1
- package/dist/lib/testing/storyboard/types.d.mts +106 -0
- package/dist/lib/testing/storyboard/types.d.ts +106 -0
- package/dist/lib/testing/storyboard/types.d.ts.map +1 -1
- package/dist/lib/testing/storyboard/types.js +1 -0
- package/dist/lib/testing/storyboard/types.js.map +1 -1
- package/dist/lib/testing/storyboard/types.mjs +1 -0
- package/dist/lib/testing/storyboard/types.mjs.map +1 -1
- package/dist/lib/testing/stubs/governance-agent-stub.d.ts.map +1 -1
- package/dist/lib/testing/stubs/governance-agent-stub.js +4 -1
- package/dist/lib/testing/stubs/governance-agent-stub.js.map +1 -1
- package/dist/lib/testing/stubs/governance-agent-stub.mjs +4 -1
- package/dist/lib/testing/stubs/governance-agent-stub.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 +127 -19
- package/dist/lib/types/core.generated.d.ts +127 -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/inline-enums.generated.d.mts +2 -0
- package/dist/lib/types/inline-enums.generated.d.ts +2 -0
- package/dist/lib/types/inline-enums.generated.d.ts.map +1 -1
- package/dist/lib/types/inline-enums.generated.js +3 -0
- package/dist/lib/types/inline-enums.generated.js.map +1 -1
- package/dist/lib/types/inline-enums.generated.mjs +2 -0
- package/dist/lib/types/inline-enums.generated.mjs.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/validation/schema-loader.d.mts +16 -0
- package/dist/lib/validation/schema-loader.d.ts +16 -0
- package/dist/lib/validation/schema-loader.d.ts.map +1 -1
- package/dist/lib/validation/schema-loader.js +116 -0
- package/dist/lib/validation/schema-loader.js.map +1 -1
- package/dist/lib/validation/schema-loader.mjs +115 -0
- package/dist/lib/validation/schema-loader.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 +9 -6
- package/dist/lib/version.js.map +1 -1
- package/dist/lib/version.mjs +9 -6
- package/dist/lib/version.mjs.map +1 -1
- package/docs/llms.txt +13 -3
- package/package.json +2 -2
- /package/compliance/cache/{3.1.8 → 3.1.11}/domains/brand/index.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/domains/brand/scenarios/distributed_brand_resolution.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/domains/brand/scenarios/single_side_trust_extension.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/domains/creative/index.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/domains/creative/scenarios/billing_out_of_band.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/domains/creative/scenarios/canonical_supported_formats.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/domains/creative/scenarios/creative_lifecycle_webhooks.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/domains/creative/scenarios/evaluator_auth.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/domains/creative/scenarios/native_in_feed.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/domains/governance/index.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/domains/media-buy/scenarios/audience_buy_flow.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/domains/media-buy/scenarios/available_actions.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/domains/media-buy/scenarios/billing_finality_delivery.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/domains/media-buy/scenarios/canonical_formats.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/domains/media-buy/scenarios/clicks_buy_flow.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/domains/media-buy/scenarios/completed_views_buy_flow.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/domains/media-buy/scenarios/create_media_buy_async.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/domains/media-buy/scenarios/creative_reception.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/domains/media-buy/scenarios/delivery_reporting.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/domains/media-buy/scenarios/dependency_impairment.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/domains/media-buy/scenarios/dependency_impairment_cardinality.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/domains/media-buy/scenarios/event_dedup_flow.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/domains/media-buy/scenarios/frequency_cap_enforcement.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/domains/media-buy/scenarios/get_products_async.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/domains/media-buy/scenarios/governance_approved.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/domains/media-buy/scenarios/governance_conditions.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/domains/media-buy/scenarios/governance_denied.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/domains/media-buy/scenarios/governance_denied_recovery.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/domains/media-buy/scenarios/inline_creatives_without_sync.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/domains/media-buy/scenarios/invalid_transitions.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/domains/media-buy/scenarios/inventory_list_no_match.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/domains/media-buy/scenarios/inventory_list_targeting.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/domains/media-buy/scenarios/measurement_accountability.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/domains/media-buy/scenarios/measurement_terms_rejected.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/domains/media-buy/scenarios/package_correlation_legacy_fallback.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/domains/media-buy/scenarios/pending_creatives_to_start.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/domains/media-buy/scenarios/per_creative_conversion_attribution.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/domains/media-buy/scenarios/performance_buy_flow.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/domains/media-buy/scenarios/performance_buy_flow_roas.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/domains/media-buy/scenarios/pricing_currency_filter.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/domains/media-buy/scenarios/product_signal_targeting.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/domains/media-buy/scenarios/proposal_finalize.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/domains/media-buy/scenarios/proposal_finalize_asap_timing.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/domains/media-buy/scenarios/proposal_not_found_errors.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/domains/media-buy/scenarios/provenance_audit_observation.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/domains/media-buy/scenarios/provenance_enforcement.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/domains/media-buy/scenarios/provenance_truth_of_claim.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/domains/media-buy/scenarios/reach_buy_flow.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/domains/media-buy/scenarios/refine_finalize_exclusivity.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/domains/media-buy/scenarios/refine_products.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/domains/media-buy/scenarios/vendor_metric_accountability.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/domains/media-buy/scenarios/vendor_metric_catalog_precondition.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/domains/media-buy/scenarios/vendor_metric_optimization_flow.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/domains/media-buy/state-machine.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/domains/signals/index.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/domains/signals/scenarios/get_signals_async.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/domains/sponsored-intelligence/index.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/domains/sponsored-intelligence/sponsored-context-accountability.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/protocols/brand/index.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/protocols/brand/scenarios/distributed_brand_resolution.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/protocols/brand/scenarios/single_side_trust_extension.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/protocols/creative/index.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/protocols/creative/scenarios/billing_out_of_band.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/protocols/creative/scenarios/canonical_supported_formats.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/protocols/creative/scenarios/creative_lifecycle_webhooks.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/protocols/creative/scenarios/evaluator_auth.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/protocols/creative/scenarios/native_in_feed.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/protocols/governance/index.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/protocols/media-buy/scenarios/audience_buy_flow.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/protocols/media-buy/scenarios/available_actions.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/protocols/media-buy/scenarios/billing_finality_delivery.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/protocols/media-buy/scenarios/canonical_formats.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/protocols/media-buy/scenarios/clicks_buy_flow.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/protocols/media-buy/scenarios/completed_views_buy_flow.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/protocols/media-buy/scenarios/create_media_buy_async.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/protocols/media-buy/scenarios/creative_reception.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/protocols/media-buy/scenarios/delivery_reporting.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/protocols/media-buy/scenarios/dependency_impairment.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/protocols/media-buy/scenarios/dependency_impairment_cardinality.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/protocols/media-buy/scenarios/event_dedup_flow.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/protocols/media-buy/scenarios/frequency_cap_enforcement.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/protocols/media-buy/scenarios/get_products_async.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/protocols/media-buy/scenarios/governance_approved.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/protocols/media-buy/scenarios/governance_conditions.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/protocols/media-buy/scenarios/governance_denied.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/protocols/media-buy/scenarios/governance_denied_recovery.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/protocols/media-buy/scenarios/inline_creatives_without_sync.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/protocols/media-buy/scenarios/invalid_transitions.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/protocols/media-buy/scenarios/inventory_list_no_match.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/protocols/media-buy/scenarios/inventory_list_targeting.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/protocols/media-buy/scenarios/measurement_accountability.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/protocols/media-buy/scenarios/measurement_terms_rejected.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/protocols/media-buy/scenarios/package_correlation_legacy_fallback.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/protocols/media-buy/scenarios/pending_creatives_to_start.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/protocols/media-buy/scenarios/per_creative_conversion_attribution.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/protocols/media-buy/scenarios/performance_buy_flow.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/protocols/media-buy/scenarios/performance_buy_flow_roas.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/protocols/media-buy/scenarios/pricing_currency_filter.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/protocols/media-buy/scenarios/product_signal_targeting.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/protocols/media-buy/scenarios/proposal_finalize.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/protocols/media-buy/scenarios/proposal_finalize_asap_timing.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/protocols/media-buy/scenarios/proposal_not_found_errors.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/protocols/media-buy/scenarios/provenance_audit_observation.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/protocols/media-buy/scenarios/provenance_enforcement.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/protocols/media-buy/scenarios/provenance_truth_of_claim.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/protocols/media-buy/scenarios/reach_buy_flow.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/protocols/media-buy/scenarios/refine_finalize_exclusivity.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/protocols/media-buy/scenarios/refine_products.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/protocols/media-buy/scenarios/vendor_metric_accountability.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/protocols/media-buy/scenarios/vendor_metric_catalog_precondition.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/protocols/media-buy/scenarios/vendor_metric_optimization_flow.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/protocols/media-buy/state-machine.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/protocols/signals/index.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/protocols/signals/scenarios/get_signals_async.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/protocols/sponsored-intelligence/index.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/protocols/sponsored-intelligence/sponsored-context-accountability.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/specialisms/audience-sync/index.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/specialisms/brand-rights/index.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/specialisms/brand-rights/scenarios/governance_denied.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/specialisms/collection-lists/index.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/specialisms/content-standards/index.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/specialisms/creative-ad-server/index.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/specialisms/creative-generative/generative-seller.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/specialisms/creative-generative/index.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/specialisms/creative-template/index.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/specialisms/creative-transformers/index.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/specialisms/governance-aware-seller/index.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/specialisms/governance-aware-seller/scenarios/governance_multi_agent_rejected.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/specialisms/governance-delivery-monitor/index.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/specialisms/governance-spend-authority/denied.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/specialisms/governance-spend-authority/index.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/specialisms/property-lists/index.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/specialisms/sales-broadcast-tv/index.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/specialisms/sales-catalog-driven/index.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/specialisms/sales-guaranteed/index.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/specialisms/sales-non-guaranteed/index.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/specialisms/sales-proposal-mode/index.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/specialisms/sales-social/index.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/specialisms/signal-marketplace/index.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/specialisms/signal-marketplace/scenarios/governance_denied.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/specialisms/signal-owned/index.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/specialisms/sponsored-intelligence/index.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/test-kits/acme-outdoor-live.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/test-kits/acme-outdoor.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/test-kits/billing-gate-runner.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/test-kits/bistro-oranje.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/test-kits/distributed-brand-runner.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/test-kits/nova-motors.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/test-kits/osei-natural.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/test-kits/parallel-dispatch-runner.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/test-kits/rate-limit-trip-runner.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/test-kits/signed-requests-runner.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/test-kits/single-side-trust-runner.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/test-kits/substitution-observer-runner.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/test-kits/summit-foods.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/test-kits/webhook-receiver-runner.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/test-vectors/catalog-macro-substitution.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/test-vectors/plan-hash/001-minimal-plan.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/test-vectors/plan-hash/002-full-plan.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/test-vectors/plan-hash/003-bookkeeping-stripped.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/test-vectors/plan-hash/004a-human-review-omitted.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/test-vectors/plan-hash/004b-human-review-explicit-null.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/test-vectors/plan-hash/005a-policy-categories-order-1.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/test-vectors/plan-hash/005b-policy-categories-order-2.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/test-vectors/plan-hash/006a-ext-trace-v1.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/test-vectors/plan-hash/006b-ext-trace-v2.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/test-vectors/plan-hash/007-unicode-objectives.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/test-vectors/plan-hash/008-numeric-canonicalization.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/test-vectors/request-signing/README.md +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/test-vectors/request-signing/canonicalization.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/test-vectors/request-signing/keys.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/test-vectors/request-signing/negative/001-no-signature-header.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/test-vectors/request-signing/negative/002-wrong-tag.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/test-vectors/request-signing/negative/003-expired-signature.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/test-vectors/request-signing/negative/004-window-too-long.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/test-vectors/request-signing/negative/005-alg-not-allowed.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/test-vectors/request-signing/negative/006-missing-covered-component.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/test-vectors/request-signing/negative/007-missing-content-digest.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/test-vectors/request-signing/negative/008-unknown-keyid.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/test-vectors/request-signing/negative/009-key-ops-missing-verify.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/test-vectors/request-signing/negative/010-content-digest-mismatch.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/test-vectors/request-signing/negative/011-malformed-header.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/test-vectors/request-signing/negative/012-missing-expires-param.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/test-vectors/request-signing/negative/013-expires-le-created.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/test-vectors/request-signing/negative/014-missing-nonce-param.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/test-vectors/request-signing/negative/015-signature-invalid.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/test-vectors/request-signing/negative/016-replayed-nonce.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/test-vectors/request-signing/negative/017-key-revoked.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/test-vectors/request-signing/negative/018-digest-covered-when-forbidden.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/test-vectors/request-signing/negative/019-signature-without-signature-input.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/test-vectors/request-signing/negative/020-rate-abuse.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/test-vectors/request-signing/negative/021-duplicate-signature-input-label.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/test-vectors/request-signing/negative/022-multi-valued-content-type.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/test-vectors/request-signing/negative/023-multi-valued-content-digest.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/test-vectors/request-signing/negative/024-unquoted-string-param.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/test-vectors/request-signing/negative/025-jwk-alg-crv-mismatch.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/test-vectors/request-signing/negative/026-non-ascii-host.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/test-vectors/request-signing/negative/027-webhook-registration-authentication-unsigned.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/test-vectors/request-signing/negative/028-unsigned-protocol-method-required.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/test-vectors/request-signing/positive/001-basic-post.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/test-vectors/request-signing/positive/002-post-with-content-digest.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/test-vectors/request-signing/positive/003-es256-post.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/test-vectors/request-signing/positive/004-multiple-signature-labels.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/test-vectors/request-signing/positive/005-default-port-stripped.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/test-vectors/request-signing/positive/006-dot-segment-path.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/test-vectors/request-signing/positive/007-query-byte-preserved.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/test-vectors/request-signing/positive/008-percent-encoded-path.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/test-vectors/request-signing/positive/009-percent-encoded-unreserved-decoded.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/test-vectors/request-signing/positive/010-percent-encoded-slash-preserved.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/test-vectors/request-signing/positive/011-ipv6-authority.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/test-vectors/request-signing/positive/012-ipv6-authority-default-port-stripped.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/test-vectors/webhook-receiver-envelope.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/test-vectors/webhook-signing/README.md +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/test-vectors/webhook-signing/keys.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/test-vectors/webhook-signing/negative/001-wrong-tag.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/test-vectors/webhook-signing/negative/002-expired-signature.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/test-vectors/webhook-signing/negative/003-window-too-long.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/test-vectors/webhook-signing/negative/004-alg-not-allowed.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/test-vectors/webhook-signing/negative/005-missing-authority-component.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/test-vectors/webhook-signing/negative/006-missing-content-digest.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/test-vectors/webhook-signing/negative/007-unknown-keyid.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/test-vectors/webhook-signing/negative/008-wrong-adcp-use.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/test-vectors/webhook-signing/negative/009-content-digest-mismatch.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/test-vectors/webhook-signing/negative/010-malformed-signature-input.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/test-vectors/webhook-signing/negative/011-signature-without-input.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/test-vectors/webhook-signing/negative/012-missing-expires-param.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/test-vectors/webhook-signing/negative/013-expires-le-created.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/test-vectors/webhook-signing/negative/014-missing-nonce-param.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/test-vectors/webhook-signing/negative/015-signature-invalid.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/test-vectors/webhook-signing/negative/016-replayed-nonce.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/test-vectors/webhook-signing/negative/017-key-revoked.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/test-vectors/webhook-signing/negative/018-rate-abuse.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/test-vectors/webhook-signing/negative/019-revocation-stale.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/test-vectors/webhook-signing/negative/020-key-ops-missing-verify.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/test-vectors/webhook-signing/negative/021-base64-alphabet-mixing.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/test-vectors/webhook-signing/positive/001-basic-post.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/test-vectors/webhook-signing/positive/002-es256-post.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/test-vectors/webhook-signing/positive/003-multiple-signature-labels.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/test-vectors/webhook-signing/positive/004-default-port-stripped.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/test-vectors/webhook-signing/positive/005-percent-encoded-path.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/test-vectors/webhook-signing/positive/006-query-byte-preserved.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/test-vectors/webhook-signing/positive/007-body-without-idempotency-key.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/test-vectors/webhook-signing/positive/008-request-signing-key-reuse.json +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/universal/billing-gate-dispatch.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/universal/canonical-format-validate-input.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/universal/capability-discovery.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/universal/collection-lists-pagination-integrity.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/universal/comply-controller-mode-gate.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/universal/content-standards-pagination-integrity.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/universal/deterministic-testing.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/universal/error-compliance-signals.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/universal/error-compliance.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/universal/fictional-entities.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/universal/get-media-buys-pagination-integrity.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/universal/get-products-pagination-integrity.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/universal/get-signals-pagination-integrity.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/universal/idempotency.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/universal/notification-config-event-scope.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/universal/notification-config-lifecycle.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/universal/notification-config-rejections.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/universal/pagination-integrity-creative-formats.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/universal/pagination-integrity-list-accounts.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/universal/pagination-integrity.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/universal/property-lists-pagination-integrity.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/universal/read-tool-idempotency.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/universal/schema-validation-signals.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/universal/schema-validation.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/universal/security.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/universal/signed-requests.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/universal/stale-response-advisory.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/universal/v3-envelope-integrity.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/universal/version-negotiation.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/universal/webhook-emission.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/universal/webhook-receiver-envelope.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/universal/wholesale-feed-bulk-webhooks.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/universal/wholesale-feed-product-webhooks.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/universal/wholesale-feed-products.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/universal/wholesale-feed-signal-webhooks.yaml +0 -0
- /package/compliance/cache/{3.1.8 → 3.1.11}/universal/wholesale-feed-signals.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/domains/brand/index.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/domains/brand/scenarios/distributed_brand_resolution.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/domains/brand/scenarios/single_side_trust_extension.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/domains/creative/index.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/domains/creative/scenarios/billing_out_of_band.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/domains/creative/scenarios/canonical_supported_formats.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/domains/creative/scenarios/creative_lifecycle_webhooks.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/domains/creative/scenarios/evaluator_auth.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/domains/creative/scenarios/native_in_feed.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/domains/governance/index.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/domains/media-buy/scenarios/audience_buy_flow.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/domains/media-buy/scenarios/available_actions.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/domains/media-buy/scenarios/billing_finality_delivery.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/domains/media-buy/scenarios/canonical_formats.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/domains/media-buy/scenarios/clicks_buy_flow.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/domains/media-buy/scenarios/completed_views_buy_flow.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/domains/media-buy/scenarios/create_media_buy_async.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/domains/media-buy/scenarios/creative_reception.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/domains/media-buy/scenarios/delivery_reporting.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/domains/media-buy/scenarios/dependency_impairment.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/domains/media-buy/scenarios/dependency_impairment_cardinality.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/domains/media-buy/scenarios/event_dedup_flow.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/domains/media-buy/scenarios/frequency_cap_enforcement.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/domains/media-buy/scenarios/get_products_async.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/domains/media-buy/scenarios/governance_approved.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/domains/media-buy/scenarios/governance_conditions.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/domains/media-buy/scenarios/governance_denied.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/domains/media-buy/scenarios/governance_denied_recovery.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/domains/media-buy/scenarios/inline_creatives_without_sync.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/domains/media-buy/scenarios/invalid_transitions.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/domains/media-buy/scenarios/inventory_list_no_match.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/domains/media-buy/scenarios/inventory_list_targeting.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/domains/media-buy/scenarios/measurement_accountability.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/domains/media-buy/scenarios/measurement_terms_rejected.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/domains/media-buy/scenarios/package_correlation_legacy_fallback.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/domains/media-buy/scenarios/pending_creatives_to_start.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/domains/media-buy/scenarios/per_creative_conversion_attribution.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/domains/media-buy/scenarios/performance_buy_flow.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/domains/media-buy/scenarios/performance_buy_flow_roas.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/domains/media-buy/scenarios/pricing_currency_filter.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/domains/media-buy/scenarios/product_signal_targeting.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/domains/media-buy/scenarios/proposal_finalize.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/domains/media-buy/scenarios/proposal_finalize_asap_timing.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/domains/media-buy/scenarios/proposal_not_found_errors.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/domains/media-buy/scenarios/provenance_audit_observation.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/domains/media-buy/scenarios/provenance_enforcement.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/domains/media-buy/scenarios/provenance_truth_of_claim.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/domains/media-buy/scenarios/reach_buy_flow.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/domains/media-buy/scenarios/refine_finalize_exclusivity.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/domains/media-buy/scenarios/refine_products.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/domains/media-buy/scenarios/vendor_metric_accountability.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/domains/media-buy/scenarios/vendor_metric_catalog_precondition.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/domains/media-buy/scenarios/vendor_metric_optimization_flow.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/domains/media-buy/state-machine.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/domains/signals/index.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/domains/signals/scenarios/get_signals_async.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/domains/sponsored-intelligence/index.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/domains/sponsored-intelligence/sponsored-context-accountability.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/protocols/brand/index.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/protocols/brand/scenarios/distributed_brand_resolution.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/protocols/brand/scenarios/single_side_trust_extension.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/protocols/creative/index.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/protocols/creative/scenarios/billing_out_of_band.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/protocols/creative/scenarios/canonical_supported_formats.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/protocols/creative/scenarios/creative_lifecycle_webhooks.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/protocols/creative/scenarios/evaluator_auth.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/protocols/creative/scenarios/native_in_feed.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/protocols/governance/index.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/protocols/media-buy/scenarios/audience_buy_flow.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/protocols/media-buy/scenarios/available_actions.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/protocols/media-buy/scenarios/billing_finality_delivery.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/protocols/media-buy/scenarios/canonical_formats.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/protocols/media-buy/scenarios/clicks_buy_flow.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/protocols/media-buy/scenarios/completed_views_buy_flow.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/protocols/media-buy/scenarios/create_media_buy_async.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/protocols/media-buy/scenarios/creative_reception.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/protocols/media-buy/scenarios/delivery_reporting.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/protocols/media-buy/scenarios/dependency_impairment.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/protocols/media-buy/scenarios/dependency_impairment_cardinality.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/protocols/media-buy/scenarios/event_dedup_flow.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/protocols/media-buy/scenarios/frequency_cap_enforcement.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/protocols/media-buy/scenarios/get_products_async.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/protocols/media-buy/scenarios/governance_approved.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/protocols/media-buy/scenarios/governance_conditions.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/protocols/media-buy/scenarios/governance_denied.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/protocols/media-buy/scenarios/governance_denied_recovery.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/protocols/media-buy/scenarios/inline_creatives_without_sync.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/protocols/media-buy/scenarios/invalid_transitions.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/protocols/media-buy/scenarios/inventory_list_no_match.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/protocols/media-buy/scenarios/inventory_list_targeting.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/protocols/media-buy/scenarios/measurement_accountability.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/protocols/media-buy/scenarios/measurement_terms_rejected.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/protocols/media-buy/scenarios/package_correlation_legacy_fallback.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/protocols/media-buy/scenarios/pending_creatives_to_start.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/protocols/media-buy/scenarios/per_creative_conversion_attribution.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/protocols/media-buy/scenarios/performance_buy_flow.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/protocols/media-buy/scenarios/performance_buy_flow_roas.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/protocols/media-buy/scenarios/pricing_currency_filter.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/protocols/media-buy/scenarios/product_signal_targeting.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/protocols/media-buy/scenarios/proposal_finalize.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/protocols/media-buy/scenarios/proposal_finalize_asap_timing.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/protocols/media-buy/scenarios/proposal_not_found_errors.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/protocols/media-buy/scenarios/provenance_audit_observation.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/protocols/media-buy/scenarios/provenance_enforcement.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/protocols/media-buy/scenarios/provenance_truth_of_claim.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/protocols/media-buy/scenarios/reach_buy_flow.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/protocols/media-buy/scenarios/refine_finalize_exclusivity.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/protocols/media-buy/scenarios/refine_products.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/protocols/media-buy/scenarios/vendor_metric_accountability.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/protocols/media-buy/scenarios/vendor_metric_catalog_precondition.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/protocols/media-buy/scenarios/vendor_metric_optimization_flow.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/protocols/media-buy/state-machine.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/protocols/signals/index.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/protocols/signals/scenarios/get_signals_async.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/protocols/sponsored-intelligence/index.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/protocols/sponsored-intelligence/sponsored-context-accountability.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/specialisms/audience-sync/index.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/specialisms/brand-rights/index.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/specialisms/brand-rights/scenarios/governance_denied.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/specialisms/collection-lists/index.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/specialisms/content-standards/index.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/specialisms/creative-ad-server/index.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/specialisms/creative-generative/generative-seller.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/specialisms/creative-generative/index.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/specialisms/creative-template/index.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/specialisms/creative-transformers/index.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/specialisms/governance-aware-seller/index.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/specialisms/governance-aware-seller/scenarios/governance_multi_agent_rejected.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/specialisms/governance-delivery-monitor/index.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/specialisms/governance-spend-authority/denied.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/specialisms/governance-spend-authority/index.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/specialisms/property-lists/index.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/specialisms/sales-broadcast-tv/index.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/specialisms/sales-catalog-driven/index.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/specialisms/sales-guaranteed/index.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/specialisms/sales-non-guaranteed/index.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/specialisms/sales-proposal-mode/index.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/specialisms/sales-social/index.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/specialisms/signal-marketplace/index.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/specialisms/signal-marketplace/scenarios/governance_denied.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/specialisms/signal-owned/index.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/specialisms/sponsored-intelligence/index.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/test-kits/acme-outdoor-live.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/test-kits/acme-outdoor.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/test-kits/billing-gate-runner.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/test-kits/bistro-oranje.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/test-kits/distributed-brand-runner.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/test-kits/nova-motors.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/test-kits/osei-natural.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/test-kits/parallel-dispatch-runner.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/test-kits/rate-limit-trip-runner.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/test-kits/signed-requests-runner.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/test-kits/single-side-trust-runner.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/test-kits/substitution-observer-runner.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/test-kits/summit-foods.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/test-kits/webhook-receiver-runner.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/test-vectors/catalog-macro-substitution.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/test-vectors/plan-hash/001-minimal-plan.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/test-vectors/plan-hash/002-full-plan.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/test-vectors/plan-hash/003-bookkeeping-stripped.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/test-vectors/plan-hash/004a-human-review-omitted.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/test-vectors/plan-hash/004b-human-review-explicit-null.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/test-vectors/plan-hash/005a-policy-categories-order-1.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/test-vectors/plan-hash/005b-policy-categories-order-2.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/test-vectors/plan-hash/006a-ext-trace-v1.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/test-vectors/plan-hash/006b-ext-trace-v2.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/test-vectors/plan-hash/007-unicode-objectives.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/test-vectors/plan-hash/008-numeric-canonicalization.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/test-vectors/request-signing/README.md +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/test-vectors/request-signing/canonicalization.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/test-vectors/request-signing/keys.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/test-vectors/request-signing/negative/001-no-signature-header.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/test-vectors/request-signing/negative/002-wrong-tag.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/test-vectors/request-signing/negative/003-expired-signature.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/test-vectors/request-signing/negative/004-window-too-long.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/test-vectors/request-signing/negative/005-alg-not-allowed.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/test-vectors/request-signing/negative/006-missing-covered-component.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/test-vectors/request-signing/negative/007-missing-content-digest.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/test-vectors/request-signing/negative/008-unknown-keyid.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/test-vectors/request-signing/negative/009-key-ops-missing-verify.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/test-vectors/request-signing/negative/010-content-digest-mismatch.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/test-vectors/request-signing/negative/011-malformed-header.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/test-vectors/request-signing/negative/012-missing-expires-param.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/test-vectors/request-signing/negative/013-expires-le-created.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/test-vectors/request-signing/negative/014-missing-nonce-param.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/test-vectors/request-signing/negative/015-signature-invalid.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/test-vectors/request-signing/negative/016-replayed-nonce.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/test-vectors/request-signing/negative/017-key-revoked.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/test-vectors/request-signing/negative/018-digest-covered-when-forbidden.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/test-vectors/request-signing/negative/019-signature-without-signature-input.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/test-vectors/request-signing/negative/020-rate-abuse.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/test-vectors/request-signing/negative/021-duplicate-signature-input-label.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/test-vectors/request-signing/negative/022-multi-valued-content-type.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/test-vectors/request-signing/negative/023-multi-valued-content-digest.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/test-vectors/request-signing/negative/024-unquoted-string-param.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/test-vectors/request-signing/negative/025-jwk-alg-crv-mismatch.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/test-vectors/request-signing/negative/026-non-ascii-host.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/test-vectors/request-signing/negative/027-webhook-registration-authentication-unsigned.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/test-vectors/request-signing/negative/028-unsigned-protocol-method-required.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/test-vectors/request-signing/positive/001-basic-post.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/test-vectors/request-signing/positive/002-post-with-content-digest.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/test-vectors/request-signing/positive/003-es256-post.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/test-vectors/request-signing/positive/004-multiple-signature-labels.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/test-vectors/request-signing/positive/005-default-port-stripped.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/test-vectors/request-signing/positive/006-dot-segment-path.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/test-vectors/request-signing/positive/007-query-byte-preserved.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/test-vectors/request-signing/positive/008-percent-encoded-path.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/test-vectors/request-signing/positive/009-percent-encoded-unreserved-decoded.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/test-vectors/request-signing/positive/010-percent-encoded-slash-preserved.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/test-vectors/request-signing/positive/011-ipv6-authority.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/test-vectors/request-signing/positive/012-ipv6-authority-default-port-stripped.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/test-vectors/webhook-receiver-envelope.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/test-vectors/webhook-signing/README.md +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/test-vectors/webhook-signing/keys.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/test-vectors/webhook-signing/negative/001-wrong-tag.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/test-vectors/webhook-signing/negative/002-expired-signature.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/test-vectors/webhook-signing/negative/003-window-too-long.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/test-vectors/webhook-signing/negative/004-alg-not-allowed.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/test-vectors/webhook-signing/negative/005-missing-authority-component.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/test-vectors/webhook-signing/negative/006-missing-content-digest.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/test-vectors/webhook-signing/negative/007-unknown-keyid.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/test-vectors/webhook-signing/negative/008-wrong-adcp-use.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/test-vectors/webhook-signing/negative/009-content-digest-mismatch.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/test-vectors/webhook-signing/negative/010-malformed-signature-input.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/test-vectors/webhook-signing/negative/011-signature-without-input.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/test-vectors/webhook-signing/negative/012-missing-expires-param.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/test-vectors/webhook-signing/negative/013-expires-le-created.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/test-vectors/webhook-signing/negative/014-missing-nonce-param.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/test-vectors/webhook-signing/negative/015-signature-invalid.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/test-vectors/webhook-signing/negative/016-replayed-nonce.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/test-vectors/webhook-signing/negative/017-key-revoked.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/test-vectors/webhook-signing/negative/018-rate-abuse.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/test-vectors/webhook-signing/negative/019-revocation-stale.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/test-vectors/webhook-signing/negative/020-key-ops-missing-verify.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/test-vectors/webhook-signing/negative/021-base64-alphabet-mixing.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/test-vectors/webhook-signing/positive/001-basic-post.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/test-vectors/webhook-signing/positive/002-es256-post.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/test-vectors/webhook-signing/positive/003-multiple-signature-labels.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/test-vectors/webhook-signing/positive/004-default-port-stripped.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/test-vectors/webhook-signing/positive/005-percent-encoded-path.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/test-vectors/webhook-signing/positive/006-query-byte-preserved.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/test-vectors/webhook-signing/positive/007-body-without-idempotency-key.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/test-vectors/webhook-signing/positive/008-request-signing-key-reuse.json +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/universal/billing-gate-dispatch.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/universal/canonical-format-validate-input.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/universal/capability-discovery.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/universal/collection-lists-pagination-integrity.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/universal/comply-controller-mode-gate.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/universal/content-standards-pagination-integrity.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/universal/deterministic-testing.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/universal/error-compliance-signals.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/universal/error-compliance.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/universal/fictional-entities.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/universal/get-media-buys-pagination-integrity.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/universal/get-products-pagination-integrity.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/universal/get-signals-pagination-integrity.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/universal/idempotency.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/universal/notification-config-event-scope.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/universal/notification-config-lifecycle.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/universal/notification-config-rejections.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/universal/pagination-integrity-creative-formats.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/universal/pagination-integrity-list-accounts.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/universal/pagination-integrity.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/universal/property-lists-pagination-integrity.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/universal/read-tool-idempotency.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/universal/schema-validation-signals.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/universal/schema-validation.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/universal/security.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/universal/signed-requests.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/universal/stale-response-advisory.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/universal/v3-envelope-integrity.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/universal/version-negotiation.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/universal/webhook-emission.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/universal/webhook-receiver-envelope.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/universal/wholesale-feed-bulk-webhooks.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/universal/wholesale-feed-product-webhooks.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/universal/wholesale-feed-products.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/universal/wholesale-feed-signal-webhooks.yaml +0 -0
- /package/compliance/cache/{3.1.8.previous → 3.1.11.previous}/universal/wholesale-feed-signals.yaml +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/lib/auth/oauth/MCPOAuthProvider.ts"],"sourcesContent":["/**\n * MCP OAuth Provider\n *\n * Implements the MCP SDK's OAuthClientProvider interface\n * using AgentConfig for token storage.\n */\n\nimport type { OAuthClientProvider } from '@modelcontextprotocol/sdk/client/auth.js';\nimport type {\n OAuthClientMetadata,\n OAuthClientInformation,\n OAuthClientInformationFull,\n OAuthTokens,\n OAuthFlowHandler,\n OAuthProviderConfig,\n OAuthConfigStorage,\n AgentConfig,\n} from './types';\nimport { DEFAULT_CLIENT_METADATA, toMCPTokens, fromMCPTokens, toMCPClientInfo, fromMCPClientInfo } from './types';\nimport { randomBytes } from 'crypto';\n\n/**\n * MCP OAuth Client Provider\n *\n * This provider stores OAuth tokens directly in the AgentConfig,\n * using the same structure as static auth tokens.\n *\n * @example\n * ```typescript\n * const agent: AgentConfig = {\n * id: 'my-agent',\n * name: 'My Agent',\n * agent_uri: 'https://agent.example.com/mcp',\n * protocol: 'mcp',\n * // OAuth tokens stored here after auth flow\n * oauth_tokens: { access_token: '...', refresh_token: '...' }\n * };\n *\n * const provider = new MCPOAuthProvider({\n * agent,\n * flowHandler: new CLIFlowHandler(),\n * storage: myConfigStorage // Optional: persists tokens\n * });\n *\n * const transport = new StreamableHTTPClientTransport(url, {\n * authProvider: provider\n * });\n * ```\n */\nexport class MCPOAuthProvider implements OAuthClientProvider {\n private agent: AgentConfig;\n private readonly storage?: OAuthConfigStorage;\n private readonly flowHandler: OAuthFlowHandler;\n private readonly _clientMetadata: OAuthClientMetadata;\n private readonly allowHttp: boolean;\n\n constructor(config: OAuthProviderConfig) {\n this.agent = config.agent;\n this.storage = config.storage;\n this.flowHandler = config.flowHandler;\n this._clientMetadata = config.clientMetadata;\n this.allowHttp = config.allowHttp === true;\n }\n\n /**\n * Create a provider for CLI usage\n */\n static forCLI(\n agent: AgentConfig,\n flowHandler: OAuthFlowHandler,\n storage?: OAuthConfigStorage,\n clientMetadataOverrides?: Partial<OAuthClientMetadata>,\n options?: { allowHttp?: boolean }\n ): MCPOAuthProvider {\n // Build complete client metadata with required fields\n const clientMetadata: OAuthClientMetadata = {\n ...DEFAULT_CLIENT_METADATA,\n redirect_uris: [flowHandler.getRedirectUrl().toString()],\n ...clientMetadataOverrides,\n };\n\n return new MCPOAuthProvider({\n agent,\n flowHandler,\n storage,\n clientMetadata,\n allowHttp: options?.allowHttp,\n });\n }\n\n // ========================================\n // OAuthClientProvider interface\n // ========================================\n\n get redirectUrl(): string | URL {\n return this.flowHandler.getRedirectUrl();\n }\n\n get clientMetadata(): OAuthClientMetadata {\n return this._clientMetadata;\n }\n\n /**\n * Validate the protected resource URL from server metadata (RFC 9728).\n *\n * Servers behind reverse proxies or DNS aliases may advertise a canonical\n * resource URL (RFC 8707) that differs from the URL the client connected to.\n * We allow cross-origin resource URLs because agent configs are pre-configured\n * by the user, not discovered from untrusted sources. The authorization server\n * remains the final gatekeeper for token audience validation.\n *\n * Non-HTTPS resource URLs are rejected by default. Construct the provider\n * with `allowHttp: true` to lift that restriction for local development —\n * mirrors the CLI's `--allow-http` flag.\n */\n async validateResourceURL(serverUrl: string | URL, resource?: string): Promise<URL | undefined> {\n if (!resource) {\n return undefined;\n }\n\n const resourceURL = new URL(resource);\n\n if (resourceURL.protocol !== 'https:' && !this.allowHttp) {\n throw new Error(`Server at ${serverUrl} advertised non-HTTPS resource URL: ${resource}`);\n }\n\n return resourceURL;\n }\n\n /**\n * Generate OAuth state parameter\n */\n async state(): Promise<string> {\n return randomBytes(32).toString('base64url');\n }\n\n /**\n * Load client information from agent config\n */\n async clientInformation(): Promise<OAuthClientInformation | undefined> {\n if (this.agent.oauth_client) {\n return toMCPClientInfo(this.agent.oauth_client);\n }\n return undefined;\n }\n\n /**\n * Save client information after dynamic registration\n */\n async saveClientInformation(clientInfo: OAuthClientInformationFull): Promise<void> {\n this.agent.oauth_client = fromMCPClientInfo(clientInfo);\n await this.persistAgent();\n }\n\n /**\n * Load existing tokens from agent config\n */\n async tokens(): Promise<OAuthTokens | undefined> {\n if (this.agent.oauth_tokens) {\n return toMCPTokens(this.agent.oauth_tokens);\n }\n return undefined;\n }\n\n /**\n * Save tokens after authorization\n * Also cleans up the temporary code verifier\n */\n async saveTokens(tokens: OAuthTokens): Promise<void> {\n this.agent.oauth_tokens = fromMCPTokens(tokens);\n // Clean up temporary code verifier after successful token exchange\n delete this.agent.oauth_code_verifier;\n await this.persistAgent();\n }\n\n /**\n * Redirect user to authorization URL\n */\n async redirectToAuthorization(authorizationUrl: URL): Promise<void> {\n await this.flowHandler.redirectToAuthorization(authorizationUrl);\n }\n\n /**\n * Save PKCE code verifier\n */\n async saveCodeVerifier(codeVerifier: string): Promise<void> {\n this.agent.oauth_code_verifier = codeVerifier;\n await this.persistAgent();\n }\n\n /**\n * Load PKCE code verifier\n * The MCP SDK calls saveCodeVerifier() before authorization and\n * retrieves it here during token exchange.\n */\n async codeVerifier(): Promise<string> {\n if (!this.agent.oauth_code_verifier) {\n throw new Error(\n 'No PKCE code verifier found. The OAuth flow may have been interrupted or ' +\n 'the agent config was modified. Please try authenticating again.'\n );\n }\n return this.agent.oauth_code_verifier;\n }\n\n /**\n * Invalidate credentials when server indicates they're invalid\n */\n async invalidateCredentials(scope: 'all' | 'client' | 'tokens' | 'verifier'): Promise<void> {\n switch (scope) {\n case 'all':\n delete this.agent.oauth_tokens;\n delete this.agent.oauth_client;\n delete this.agent.oauth_code_verifier;\n break;\n case 'tokens':\n delete this.agent.oauth_tokens;\n break;\n case 'client':\n delete this.agent.oauth_client;\n break;\n case 'verifier':\n delete this.agent.oauth_code_verifier;\n break;\n }\n await this.persistAgent();\n }\n\n // ========================================\n // Additional methods\n // ========================================\n\n /**\n * Persist agent config to storage if configured\n */\n private async persistAgent(): Promise<void> {\n if (this.storage) {\n await this.storage.saveAgent(this.agent);\n }\n }\n\n /**\n * Wait for the OAuth callback\n * Call this after UnauthorizedError is thrown\n */\n async waitForCallback(): Promise<string> {\n return this.flowHandler.waitForCallback();\n }\n\n /**\n * Clean up resources\n */\n async cleanup(): Promise<void> {\n await this.flowHandler.cleanup();\n }\n\n /**\n * Check if we have valid, non-expired OAuth tokens\n * @returns true if access_token exists and hasn't expired (with 5 minute buffer)\n */\n hasValidTokens(): boolean {\n const tokens = this.agent.oauth_tokens;\n if (!tokens?.access_token) return false;\n\n // Check expiration if available\n if (tokens.expires_at) {\n const expiresAt = new Date(tokens.expires_at);\n // Consider expired if within 5 minutes of expiration\n if (expiresAt.getTime() - Date.now() < 5 * 60 * 1000) {\n return false;\n }\n }\n\n return true;\n }\n\n /**\n * Check if we have a refresh token available for token refresh\n * @returns true if refresh_token is present\n */\n hasRefreshToken(): boolean {\n return !!this.agent.oauth_tokens?.refresh_token;\n }\n\n /**\n * Clear all OAuth data for this agent\n */\n async clearAuth(): Promise<void> {\n await this.invalidateCredentials('all');\n }\n\n /**\n * Get the agent config this provider manages\n * @returns The AgentConfig with OAuth tokens populated after successful auth\n */\n getAgent(): AgentConfig {\n return this.agent;\n }\n\n /**\n * Get the agent identifier\n * @returns The agent's unique ID\n */\n getAgentId(): string {\n return this.agent.id;\n }\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../../../src/lib/auth/oauth/MCPOAuthProvider.ts"],"sourcesContent":["/**\n * MCP OAuth Provider\n *\n * Implements the MCP SDK's OAuthClientProvider interface\n * using AgentConfig for token storage.\n */\n\nimport type { OAuthClientProvider } from '@modelcontextprotocol/sdk/client/auth.js';\nimport type {\n OAuthClientMetadata,\n OAuthClientInformation,\n OAuthClientInformationFull,\n OAuthTokens,\n OAuthFlowHandler,\n OAuthProviderConfig,\n OAuthConfigStorage,\n AgentConfig,\n} from './types';\nimport { DEFAULT_CLIENT_METADATA, toMCPTokens, fromMCPTokens, toMCPClientInfo, fromMCPClientInfo } from './types';\nimport { randomBytes } from 'crypto';\nimport { validateOAuthResourceUrl } from './resource-url';\n\n/**\n * MCP OAuth Client Provider\n *\n * This provider stores OAuth tokens directly in the AgentConfig,\n * using the same structure as static auth tokens.\n *\n * @example\n * ```typescript\n * const agent: AgentConfig = {\n * id: 'my-agent',\n * name: 'My Agent',\n * agent_uri: 'https://agent.example.com/mcp',\n * protocol: 'mcp',\n * // OAuth tokens stored here after auth flow\n * oauth_tokens: { access_token: '...', refresh_token: '...' }\n * };\n *\n * const provider = new MCPOAuthProvider({\n * agent,\n * flowHandler: new CLIFlowHandler(),\n * storage: myConfigStorage // Optional: persists tokens\n * });\n *\n * const transport = new StreamableHTTPClientTransport(url, {\n * authProvider: provider\n * });\n * ```\n */\nexport class MCPOAuthProvider implements OAuthClientProvider {\n private agent: AgentConfig;\n private readonly storage?: OAuthConfigStorage;\n private readonly flowHandler: OAuthFlowHandler;\n private readonly _clientMetadata: OAuthClientMetadata;\n private readonly allowHttp: boolean;\n private readonly configuredResourceOverride?: string | null;\n\n constructor(config: OAuthProviderConfig) {\n this.agent = config.agent;\n this.storage = config.storage;\n this.flowHandler = config.flowHandler;\n this._clientMetadata = config.clientMetadata;\n this.allowHttp = config.allowHttp === true;\n this.configuredResourceOverride = config.resourceOverride;\n }\n\n /**\n * Create a provider for CLI usage\n */\n static forCLI(\n agent: AgentConfig,\n flowHandler: OAuthFlowHandler,\n storage?: OAuthConfigStorage,\n clientMetadataOverrides?: Partial<OAuthClientMetadata>,\n options?: { allowHttp?: boolean; resourceOverride?: string | null }\n ): MCPOAuthProvider {\n // Build complete client metadata with required fields\n const clientMetadata: OAuthClientMetadata = {\n ...DEFAULT_CLIENT_METADATA,\n redirect_uris: [flowHandler.getRedirectUrl().toString()],\n ...clientMetadataOverrides,\n };\n\n return new MCPOAuthProvider({\n agent,\n flowHandler,\n storage,\n clientMetadata,\n allowHttp: options?.allowHttp,\n resourceOverride: options?.resourceOverride,\n });\n }\n\n // ========================================\n // OAuthClientProvider interface\n // ========================================\n\n get redirectUrl(): string | URL {\n return this.flowHandler.getRedirectUrl();\n }\n\n get clientMetadata(): OAuthClientMetadata {\n return this._clientMetadata;\n }\n\n /**\n * Validate the protected resource URL from server metadata (RFC 9728).\n *\n * Servers behind reverse proxies or DNS aliases may advertise a canonical\n * resource URL (RFC 8707) that differs from the URL the client connected to.\n * We allow cross-origin resource URLs because agent configs are pre-configured\n * by the user, not discovered from untrusted sources. The authorization server\n * remains the final gatekeeper for token audience validation.\n *\n * Non-HTTPS resource URLs are rejected by default. Construct the provider\n * with `allowHttp: true` to lift that restriction for local development —\n * mirrors the CLI's `--allow-http` flag.\n */\n async validateResourceURL(serverUrl: string | URL, resource?: string): Promise<URL | undefined> {\n const selectedResource =\n this.configuredResourceOverride === null\n ? resource\n : (this.configuredResourceOverride ?? this.agent.oauth_resource ?? resource);\n if (!selectedResource) {\n return undefined;\n }\n\n return validateOAuthResourceUrl(selectedResource, { allowHttp: this.allowHttp });\n }\n\n /**\n * Generate OAuth state parameter\n */\n async state(): Promise<string> {\n return randomBytes(32).toString('base64url');\n }\n\n /**\n * Load client information from agent config\n */\n async clientInformation(): Promise<OAuthClientInformation | undefined> {\n if (this.agent.oauth_client) {\n return toMCPClientInfo(this.agent.oauth_client);\n }\n return undefined;\n }\n\n /**\n * Save client information after dynamic registration\n */\n async saveClientInformation(clientInfo: OAuthClientInformationFull): Promise<void> {\n this.agent.oauth_client = fromMCPClientInfo(clientInfo);\n await this.persistAgent();\n }\n\n /**\n * Load existing tokens from agent config\n */\n async tokens(): Promise<OAuthTokens | undefined> {\n if (this.agent.oauth_tokens) {\n return toMCPTokens(this.agent.oauth_tokens);\n }\n return undefined;\n }\n\n /**\n * Save tokens after authorization\n * Also cleans up the temporary code verifier\n */\n async saveTokens(tokens: OAuthTokens): Promise<void> {\n this.agent.oauth_tokens = fromMCPTokens(tokens);\n // Clean up temporary code verifier after successful token exchange\n delete this.agent.oauth_code_verifier;\n await this.persistAgent();\n }\n\n /**\n * Redirect user to authorization URL\n */\n async redirectToAuthorization(authorizationUrl: URL): Promise<void> {\n await this.flowHandler.redirectToAuthorization(authorizationUrl);\n }\n\n /**\n * Save PKCE code verifier\n */\n async saveCodeVerifier(codeVerifier: string): Promise<void> {\n this.agent.oauth_code_verifier = codeVerifier;\n await this.persistAgent();\n }\n\n /**\n * Load PKCE code verifier\n * The MCP SDK calls saveCodeVerifier() before authorization and\n * retrieves it here during token exchange.\n */\n async codeVerifier(): Promise<string> {\n if (!this.agent.oauth_code_verifier) {\n throw new Error(\n 'No PKCE code verifier found. The OAuth flow may have been interrupted or ' +\n 'the agent config was modified. Please try authenticating again.'\n );\n }\n return this.agent.oauth_code_verifier;\n }\n\n /**\n * Invalidate credentials when server indicates they're invalid\n */\n async invalidateCredentials(scope: 'all' | 'client' | 'tokens' | 'verifier'): Promise<void> {\n switch (scope) {\n case 'all':\n delete this.agent.oauth_tokens;\n delete this.agent.oauth_client;\n delete this.agent.oauth_code_verifier;\n break;\n case 'tokens':\n delete this.agent.oauth_tokens;\n break;\n case 'client':\n delete this.agent.oauth_client;\n break;\n case 'verifier':\n delete this.agent.oauth_code_verifier;\n break;\n }\n await this.persistAgent();\n }\n\n // ========================================\n // Additional methods\n // ========================================\n\n /**\n * Persist agent config to storage if configured\n */\n private async persistAgent(): Promise<void> {\n if (this.storage) {\n await this.storage.saveAgent(this.agent);\n }\n }\n\n /**\n * Wait for the OAuth callback\n * Call this after UnauthorizedError is thrown\n */\n async waitForCallback(): Promise<string> {\n return this.flowHandler.waitForCallback();\n }\n\n /**\n * Clean up resources\n */\n async cleanup(): Promise<void> {\n await this.flowHandler.cleanup();\n }\n\n /**\n * Check if we have valid, non-expired OAuth tokens\n * @returns true if access_token exists and hasn't expired (with 5 minute buffer)\n */\n hasValidTokens(): boolean {\n const tokens = this.agent.oauth_tokens;\n if (!tokens?.access_token) return false;\n\n // Check expiration if available\n if (tokens.expires_at) {\n const expiresAt = new Date(tokens.expires_at);\n // Consider expired if within 5 minutes of expiration\n if (expiresAt.getTime() - Date.now() < 5 * 60 * 1000) {\n return false;\n }\n }\n\n return true;\n }\n\n /**\n * Check if we have a refresh token available for token refresh\n * @returns true if refresh_token is present\n */\n hasRefreshToken(): boolean {\n return !!this.agent.oauth_tokens?.refresh_token;\n }\n\n /**\n * Clear all OAuth data for this agent\n */\n async clearAuth(): Promise<void> {\n await this.invalidateCredentials('all');\n }\n\n /**\n * Get the agent config this provider manages\n * @returns The AgentConfig with OAuth tokens populated after successful auth\n */\n getAgent(): AgentConfig {\n return this.agent;\n }\n\n /**\n * Get the agent identifier\n * @returns The agent's unique ID\n */\n getAgentId(): string {\n return this.agent.id;\n }\n}\n"],"mappings":"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","names":[]}
|
|
@@ -85,6 +85,8 @@ export interface DiscoverAuthorizationOptions {
|
|
|
85
85
|
timeoutMs?: number;
|
|
86
86
|
/** Scoped fetch implementation for the agent, PRM, and AS metadata probes. */
|
|
87
87
|
fetchFn?: typeof fetch;
|
|
88
|
+
/** Caller cancellation, including the absolute task deadline. */
|
|
89
|
+
signal?: AbortSignal;
|
|
88
90
|
/**
|
|
89
91
|
* If provided, use this `WWW-Authenticate` header verbatim instead of
|
|
90
92
|
* re-probing the agent. Use this when you already have a 401 response in
|
|
@@ -128,4 +130,5 @@ export declare function probeAuthChallenge(agentUrl: string, options?: {
|
|
|
128
130
|
allowPrivateIp?: boolean;
|
|
129
131
|
timeoutMs?: number;
|
|
130
132
|
fetchFn?: typeof fetch;
|
|
133
|
+
signal?: AbortSignal;
|
|
131
134
|
}): Promise<WWWAuthenticateChallenge | null>;
|
|
@@ -85,6 +85,8 @@ export interface DiscoverAuthorizationOptions {
|
|
|
85
85
|
timeoutMs?: number;
|
|
86
86
|
/** Scoped fetch implementation for the agent, PRM, and AS metadata probes. */
|
|
87
87
|
fetchFn?: typeof fetch;
|
|
88
|
+
/** Caller cancellation, including the absolute task deadline. */
|
|
89
|
+
signal?: AbortSignal;
|
|
88
90
|
/**
|
|
89
91
|
* If provided, use this `WWW-Authenticate` header verbatim instead of
|
|
90
92
|
* re-probing the agent. Use this when you already have a 401 response in
|
|
@@ -128,5 +130,6 @@ export declare function probeAuthChallenge(agentUrl: string, options?: {
|
|
|
128
130
|
allowPrivateIp?: boolean;
|
|
129
131
|
timeoutMs?: number;
|
|
130
132
|
fetchFn?: typeof fetch;
|
|
133
|
+
signal?: AbortSignal;
|
|
131
134
|
}): Promise<WWWAuthenticateChallenge | null>;
|
|
132
135
|
//# sourceMappingURL=authorization-required.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"authorization-required.d.ts","sourceRoot":"","sources":["../../../../src/lib/auth/oauth/authorization-required.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,2BAA2B,EAA0B,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"authorization-required.d.ts","sourceRoot":"","sources":["../../../../src/lib/auth/oauth/authorization-required.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,2BAA2B,EAA0B,MAAM,cAAc,CAAC;AAEnF,OAAO,EAAwB,KAAK,wBAAwB,EAAE,MAAM,eAAe,CAAC;AA8DpF;;;;GAIG;AACH,MAAM,WAAW,yBAAyB;IACxC,+BAA+B;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,oFAAoF;IACpF,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,sGAAsG;IACtG,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,6EAA6E;IAC7E,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B;;;;;;OAMG;IACH,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAC;IAChC,kFAAkF;IAClF,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,+DAA+D;IAC/D,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,uFAAuF;IACvF,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,iEAAiE;IACjE,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B;;;;;OAKG;IACH,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC/B,sFAAsF;IACtF,cAAc,CAAC,EAAE,UAAU,GAAG,sBAAsB,CAAC;IACrD,6EAA6E;IAC7E,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,0DAA0D;IAC1D,SAAS,EAAE,wBAAwB,CAAC;CACrC;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,qBAAa,uBAAwB,SAAQ,2BAA2B;IACtE,6EAA6E;IAC7E,QAAQ,CAAC,OAAO,EAAG,qBAAqB,CAAU;IAClD,QAAQ,CAAC,YAAY,EAAE,yBAAyB,CAAC;gBAErC,YAAY,EAAE,yBAAyB,EAAE,OAAO,CAAC,EAAE,MAAM;CAStE;AA+BD;;GAEG;AACH,MAAM,WAAW,4BAA4B;IAC3C,iEAAiE;IACjE,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,uFAAuF;IACvF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,8EAA8E;IAC9E,OAAO,CAAC,EAAE,OAAO,KAAK,CAAC;IACvB,iEAAiE;IACjE,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB;;;;OAIG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAsB,iCAAiC,CACrD,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,4BAAiC,GACzC,OAAO,CAAC,yBAAyB,GAAG,IAAI,CAAC,CAoI3C;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,kBAAkB,CACtC,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE;IAAE,cAAc,CAAC,EAAE,OAAO,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,KAAK,CAAC;IAAC,MAAM,CAAC,EAAE,WAAW,CAAA;CAAO,GAC3G,OAAO,CAAC,wBAAwB,GAAG,IAAI,CAAC,CAU1C"}
|
|
@@ -25,6 +25,7 @@ __export(authorization_required_exports, {
|
|
|
25
25
|
module.exports = __toCommonJS(authorization_required_exports);
|
|
26
26
|
var import_net = require('../../net/index.js');
|
|
27
27
|
var import_errors = require('../../errors/index.js');
|
|
28
|
+
var import_abort = require('../../protocols/abort.js');
|
|
28
29
|
var import_diagnostics = require('./diagnostics.js');
|
|
29
30
|
const MAX_DISPLAY_STRING = 256;
|
|
30
31
|
const MAX_SCOPES = 64;
|
|
@@ -87,7 +88,13 @@ async function discoverAuthorizationRequirements(agentUrl, options = {}) {
|
|
|
87
88
|
const allowPrivateIpForHop = (url) => allowPrivateIpOnAgent && agentOrigin !== void 0 && originOf(url) === agentOrigin;
|
|
88
89
|
let challengeHeader = options.wwwAuthenticate;
|
|
89
90
|
if (!challengeHeader) {
|
|
90
|
-
const probe = await probeAgent401(
|
|
91
|
+
const probe = await probeAgent401(
|
|
92
|
+
agentUrl,
|
|
93
|
+
allowPrivateIpOnAgent,
|
|
94
|
+
options.timeoutMs,
|
|
95
|
+
options.fetchFn,
|
|
96
|
+
options.signal
|
|
97
|
+
);
|
|
91
98
|
if (probe.status !== 401) {
|
|
92
99
|
return null;
|
|
93
100
|
}
|
|
@@ -108,7 +115,8 @@ async function discoverAuthorizationRequirements(agentUrl, options = {}) {
|
|
|
108
115
|
challenge.resource_metadata,
|
|
109
116
|
allowPrivateIpForHop(challenge.resource_metadata),
|
|
110
117
|
options.timeoutMs,
|
|
111
|
-
options.fetchFn
|
|
118
|
+
options.fetchFn,
|
|
119
|
+
options.signal
|
|
112
120
|
);
|
|
113
121
|
if (prm && typeof prm === "object") {
|
|
114
122
|
const resource = prm.resource;
|
|
@@ -128,7 +136,13 @@ async function discoverAuthorizationRequirements(agentUrl, options = {}) {
|
|
|
128
136
|
let md;
|
|
129
137
|
let source;
|
|
130
138
|
if (asUrl) {
|
|
131
|
-
const res = await fetchJson(
|
|
139
|
+
const res = await fetchJson(
|
|
140
|
+
asUrl,
|
|
141
|
+
allowPrivateIpForHop(asUrl),
|
|
142
|
+
options.timeoutMs,
|
|
143
|
+
options.fetchFn,
|
|
144
|
+
options.signal
|
|
145
|
+
);
|
|
132
146
|
if (res && typeof res === "object") {
|
|
133
147
|
md = res;
|
|
134
148
|
source = "rfc-8414";
|
|
@@ -137,7 +151,13 @@ async function discoverAuthorizationRequirements(agentUrl, options = {}) {
|
|
|
137
151
|
if (!md) {
|
|
138
152
|
const oidcUrl = buildOidcDiscoveryUrl(requirements.authorizationServer);
|
|
139
153
|
if (oidcUrl) {
|
|
140
|
-
const res = await fetchJson(
|
|
154
|
+
const res = await fetchJson(
|
|
155
|
+
oidcUrl,
|
|
156
|
+
allowPrivateIpForHop(oidcUrl),
|
|
157
|
+
options.timeoutMs,
|
|
158
|
+
options.fetchFn,
|
|
159
|
+
options.signal
|
|
160
|
+
);
|
|
141
161
|
if (res && typeof res === "object") {
|
|
142
162
|
md = res;
|
|
143
163
|
source = "openid-configuration";
|
|
@@ -168,11 +188,17 @@ async function discoverAuthorizationRequirements(agentUrl, options = {}) {
|
|
|
168
188
|
return requirements;
|
|
169
189
|
}
|
|
170
190
|
async function probeAuthChallenge(agentUrl, options = {}) {
|
|
171
|
-
const probe = await probeAgent401(
|
|
191
|
+
const probe = await probeAgent401(
|
|
192
|
+
agentUrl,
|
|
193
|
+
options.allowPrivateIp ?? false,
|
|
194
|
+
options.timeoutMs,
|
|
195
|
+
options.fetchFn,
|
|
196
|
+
options.signal
|
|
197
|
+
);
|
|
172
198
|
if (probe.status !== 401) return null;
|
|
173
199
|
return (0, import_diagnostics.parseWWWAuthenticate)(probe.wwwAuthenticate ?? null);
|
|
174
200
|
}
|
|
175
|
-
async function probeAgent401(agentUrl, allowPrivateIp, timeoutMs, fetchFn) {
|
|
201
|
+
async function probeAgent401(agentUrl, allowPrivateIp, timeoutMs, fetchFn, signal) {
|
|
176
202
|
const body = JSON.stringify({ jsonrpc: "2.0", id: 1, method: "tools/list" });
|
|
177
203
|
try {
|
|
178
204
|
const res = await (0, import_net.ssrfSafeFetch)(agentUrl, {
|
|
@@ -183,11 +209,13 @@ async function probeAgent401(agentUrl, allowPrivateIp, timeoutMs, fetchFn) {
|
|
|
183
209
|
},
|
|
184
210
|
body,
|
|
185
211
|
allowPrivateIp,
|
|
212
|
+
signal,
|
|
186
213
|
...timeoutMs !== void 0 ? { timeoutMs } : {},
|
|
187
214
|
...fetchFn ? { trustedFetchFn: fetchFn } : {}
|
|
188
215
|
});
|
|
189
216
|
return { status: res.status, wwwAuthenticate: res.headers["www-authenticate"] };
|
|
190
217
|
} catch {
|
|
218
|
+
(0, import_abort.throwIfAborted)(signal);
|
|
191
219
|
return { status: 0 };
|
|
192
220
|
}
|
|
193
221
|
}
|
|
@@ -218,18 +246,20 @@ function buildOidcDiscoveryUrl(issuer) {
|
|
|
218
246
|
const base = u.pathname.endsWith("/") ? `${u.origin}${u.pathname.slice(0, -1)}` : `${u.origin}${u.pathname}`;
|
|
219
247
|
return `${base}/.well-known/openid-configuration`;
|
|
220
248
|
}
|
|
221
|
-
async function fetchJson(url, allowPrivateIp, timeoutMs, fetchFn) {
|
|
249
|
+
async function fetchJson(url, allowPrivateIp, timeoutMs, fetchFn, signal) {
|
|
222
250
|
try {
|
|
223
251
|
const res = await (0, import_net.ssrfSafeFetch)(url, {
|
|
224
252
|
method: "GET",
|
|
225
253
|
headers: { accept: "application/json" },
|
|
226
254
|
allowPrivateIp,
|
|
255
|
+
signal,
|
|
227
256
|
...timeoutMs !== void 0 ? { timeoutMs } : {},
|
|
228
257
|
...fetchFn ? { trustedFetchFn: fetchFn } : {}
|
|
229
258
|
});
|
|
230
259
|
if (res.status !== 200) return void 0;
|
|
231
260
|
return (0, import_net.decodeBodyAsJsonOrText)(res.body, res.headers["content-type"]);
|
|
232
261
|
} catch {
|
|
262
|
+
(0, import_abort.throwIfAborted)(signal);
|
|
233
263
|
return void 0;
|
|
234
264
|
}
|
|
235
265
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/lib/auth/oauth/authorization-required.ts"],"sourcesContent":["/**\n * Zero-config OAuth discovery + actionable authorization errors.\n *\n * When a library consumer calls an OAuth-gated MCP agent without saved\n * credentials, they get a `NeedsAuthorizationError` containing everything\n * needed to either run an interactive flow or present a clear prompt — no\n * re-probing required.\n *\n * Design note: this module only *discovers* — it never opens a browser or\n * writes state. Interactive flow handling stays in the caller (CLI or a\n * bespoke `OAuthFlowHandler`) so library behavior is predictable.\n */\nimport { ssrfSafeFetch, decodeBodyAsJsonOrText } from '../../net';\nimport { AuthenticationRequiredError, type OAuthMetadataInfo } from '../../errors';\nimport { parseWWWAuthenticate, type WWWAuthenticateChallenge } from './diagnostics';\n\n/**\n * Maximum length of an individual server-supplied string we copy into the\n * `AuthorizationRequirements` payload. Anything longer is truncated with a\n * `…` suffix so hostile agents can't smuggle megabyte error-descriptions\n * into operator-facing prompts and logs.\n */\nconst MAX_DISPLAY_STRING = 256;\n\n/**\n * Maximum number of scope strings we copy into `scopesSupported`. RFC 8414\n * allows an unbounded array; hostile servers have sent thousands.\n */\nconst MAX_SCOPES = 64;\n\n/**\n * Maximum number of auth-params we preserve under `challenge.params`. Bounds\n * memory pressure from hostile servers that pack the `WWW-Authenticate`\n * header with unknown auth-params.\n */\nconst MAX_CHALLENGE_PARAMS = 32;\n\n/**\n * Strip ASCII control characters (excluding TAB) from a server-supplied\n * string that may be shown to a human. Defeats terminal-hijack tricks like\n * `\\x1b]0;pwned\\x07` (rewrites terminal title), `\\r` (overwrites prompt),\n * and `\\x1b[2J` (clears screen). Also truncates over-long values.\n */\nfunction sanitizeDisplay(value: string): string {\n const stripped = value.replace(/[\\x00-\\x08\\x0b-\\x1f\\x7f]/g, '');\n if (stripped.length <= MAX_DISPLAY_STRING) return stripped;\n return `${stripped.slice(0, MAX_DISPLAY_STRING - 1)}…`;\n}\n\n/**\n * Sanitize the parsed `WWW-Authenticate` challenge before embedding it in a\n * `NeedsAuthorizationError`. Consumers that render `requirements.challenge`\n * to a terminal should never see control characters. Caps `params` count to\n * bound hostile servers.\n *\n * The `scheme` is already lowercased + token-constrained by the parser.\n * Param keys are also token-constrained so they're safe; only values need\n * sanitizing.\n */\nfunction sanitizeChallenge(c: WWWAuthenticateChallenge): WWWAuthenticateChallenge {\n const params: Record<string, string> = {};\n for (const [k, v] of Object.entries(c.params)) {\n if (Object.keys(params).length >= MAX_CHALLENGE_PARAMS) break;\n params[k] = sanitizeDisplay(v);\n }\n return {\n scheme: c.scheme,\n ...(c.realm !== undefined ? { realm: sanitizeDisplay(c.realm) } : {}),\n ...(c.error !== undefined ? { error: sanitizeDisplay(c.error) } : {}),\n ...(c.error_description !== undefined ? { error_description: sanitizeDisplay(c.error_description) } : {}),\n ...(c.scope !== undefined ? { scope: sanitizeDisplay(c.scope) } : {}),\n ...(c.resource_metadata !== undefined ? { resource_metadata: sanitizeDisplay(c.resource_metadata) } : {}),\n params,\n };\n}\n\n/**\n * Structured description of what an agent's authorization server requires\n * before it will accept a `tools/call`. Produced by\n * {@link discoverAuthorizationRequirements}.\n */\nexport interface AuthorizationRequirements {\n /** The agent URL we probed. */\n agentUrl: string;\n /** Resource URL the agent advertises in its `WWW-Authenticate` / PRM (RFC 9728). */\n resource?: string;\n /** URL of the protected-resource-metadata document (from `WWW-Authenticate: resource_metadata=…`). */\n resourceMetadataUrl?: string;\n /** First `authorization_servers[0]` from the protected-resource metadata. */\n authorizationServer?: string;\n /**\n * All `authorization_servers` advertised by the PRM, in declaration order.\n * The walker only probes `[0]` (PRM preference order — see RFC 9728 §3.3);\n * the full list is exposed so callers can surface multi-issuer deployments\n * in diagnostics. A length > 1 is uncommon and worth flagging to the\n * operator — typically a federation partner or a staged migration.\n */\n authorizationServers?: string[];\n /** `authorization_endpoint` from the authorization-server metadata (RFC 8414). */\n authorizationEndpoint?: string;\n /** `token_endpoint` from the authorization-server metadata. */\n tokenEndpoint?: string;\n /** `registration_endpoint` if the AS supports RFC 7591 dynamic client registration. */\n registrationEndpoint?: string;\n /** Scopes advertised by the AS (RFC 8414 `scopes_supported`). */\n scopesSupported?: string[];\n /**\n * `grant_types_supported` advertised by the AS (RFC 8414). `undefined` when\n * the AS didn't publish the field — per RFC 8414 that defaults to\n * `[\"authorization_code\", \"implicit\"]`. Clients should treat absence as\n * \"unknown, try your grant and see,\" not as proof the grant is unsupported.\n */\n grantTypesSupported?: string[];\n /** True when the AS metadata came from the OIDC fallback URL rather than RFC 8414. */\n metadataSource?: 'rfc-8414' | 'openid-configuration';\n /** Scope hinted in the `WWW-Authenticate` challenge's `scope` auth-param. */\n challengeScope?: string;\n /** Raw parsed challenge the agent returned on the 401. */\n challenge: WWWAuthenticateChallenge;\n}\n\n/**\n * Error raised when an agent returns a 401 and we do not have credentials\n * to satisfy it. Carries everything needed to run an interactive OAuth flow\n * or show the operator an actionable prompt.\n *\n * Extends {@link AuthenticationRequiredError} so existing callers that catch\n * `AuthenticationRequiredError` automatically receive the richer variant —\n * they can downcast with `instanceof NeedsAuthorizationError` when they\n * want walked discovery metadata.\n *\n * Note on `code` vs `subCode`:\n * The parent class declares `readonly code = 'AUTHENTICATION_REQUIRED'` as\n * a class field that re-initializes on every construction, so a child-side\n * override attempt is silently overwritten under `useDefineForClassFields`.\n * The narrow discriminator is exposed as `subCode` — prefer\n * `instanceof NeedsAuthorizationError` for type-narrowing and use `subCode`\n * only for structured-log keying.\n *\n * Note on `hasOAuth`:\n * The inherited getter returns `true` only when both `authorization_endpoint`\n * and `token_endpoint` were walked successfully. A partially-walked\n * requirements record (PRM reachable but AS metadata missing) still yields\n * `hasOAuth === false` even though `requirements.authorizationServer` is set.\n * Treat it as \"we have enough to start a flow,\" not \"server wants OAuth.\"\n */\nexport class NeedsAuthorizationError extends AuthenticationRequiredError {\n /** Narrow discriminator for consumers that already know about this class. */\n readonly subCode = 'needs_authorization' as const;\n readonly requirements: AuthorizationRequirements;\n\n constructor(requirements: AuthorizationRequirements, message?: string) {\n super(requirements.agentUrl, synthesizeOAuthMetadata(requirements), message ?? defaultMessage(requirements));\n this.name = 'NeedsAuthorizationError';\n this.requirements = requirements;\n // Extend the parent's `details` payload so structured-logging consumers\n // that read `err.details` (via `extractErrorInfo` or equivalent) see the\n // full walked chain, not just the synthesized one-hop oauthMetadata.\n this.details = { ...(this.details as object | undefined), requirements };\n }\n}\n\n/**\n * Build an {@link OAuthMetadataInfo} for the base-class constructor so that\n * legacy callers still see a non-empty `oauthMetadata` + working\n * `hasOAuth`/`authorizationUrl` getters on the error. When discovery didn't\n * yield enough info, return undefined and let the base class degrade\n * gracefully.\n */\nfunction synthesizeOAuthMetadata(req: AuthorizationRequirements): OAuthMetadataInfo | undefined {\n if (!req.authorizationEndpoint || !req.tokenEndpoint) return undefined;\n return {\n authorization_endpoint: req.authorizationEndpoint,\n token_endpoint: req.tokenEndpoint,\n ...(req.registrationEndpoint ? { registration_endpoint: req.registrationEndpoint } : {}),\n ...(req.authorizationServer ? { issuer: req.authorizationServer } : {}),\n };\n}\n\nfunction defaultMessage(req: AuthorizationRequirements): string {\n const parts = [`Agent ${sanitizeDisplay(req.agentUrl)} requires OAuth authorization.`];\n if (req.authorizationServer) {\n parts.push(`Authorization server: ${req.authorizationServer}.`);\n }\n if (req.challenge.error_description) {\n parts.push(`Server said: ${sanitizeDisplay(req.challenge.error_description)}.`);\n }\n parts.push('Provide an OAuthFlowHandler or run an interactive flow to complete authorization.');\n return parts.join(' ');\n}\n\n/**\n * Options for {@link discoverAuthorizationRequirements}.\n */\nexport interface DiscoverAuthorizationOptions {\n /** Allow http:// and private-IP probe targets. Default false. */\n allowPrivateIp?: boolean;\n /** Override per-probe HTTP timeout (ms). Default inherits from ssrfSafeFetch (10s). */\n timeoutMs?: number;\n /** Scoped fetch implementation for the agent, PRM, and AS metadata probes. */\n fetchFn?: typeof fetch;\n /**\n * If provided, use this `WWW-Authenticate` header verbatim instead of\n * re-probing the agent. Use this when you already have a 401 response in\n * hand and want to avoid a second round-trip.\n */\n wwwAuthenticate?: string;\n}\n\n/**\n * Walk the OAuth discovery chain starting from an agent URL. Returns\n * `AuthorizationRequirements` when the agent demands OAuth, or `null` when a\n * `tools/list` call succeeds without credentials.\n *\n * Strategy:\n * 1. POST `tools/list` to the agent with no `Authorization` header.\n * 2. If 401 + `WWW-Authenticate: Bearer`: parse the challenge.\n * 3. If the challenge carries `resource_metadata=…`: GET it and read\n * `resource` + `authorization_servers`.\n * 4. For the first `authorization_servers[0]`: GET `/.well-known/oauth-authorization-server`\n * and read `authorization_endpoint`, `token_endpoint`, `registration_endpoint`,\n * `scopes_supported`.\n * 5. Return a structured record.\n *\n * Anything missing from the chain surfaces as `undefined` on the result —\n * callers can still present a partial picture without re-probing.\n */\nexport async function discoverAuthorizationRequirements(\n agentUrl: string,\n options: DiscoverAuthorizationOptions = {}\n): Promise<AuthorizationRequirements | null> {\n // `allowPrivateIp` authorizes the agent probe. Chain hops (PRM, AS\n // metadata) inherit that trust ONLY when they share the agent's origin —\n // a compromised agent that advertises a private-IP authorization server\n // on a different origin would otherwise pivot a discovery walk into the\n // host's internal network.\n const allowPrivateIpOnAgent = options.allowPrivateIp ?? false;\n const agentOrigin = originOf(agentUrl);\n const allowPrivateIpForHop = (url: string): boolean =>\n allowPrivateIpOnAgent && agentOrigin !== undefined && originOf(url) === agentOrigin;\n\n let challengeHeader = options.wwwAuthenticate;\n if (!challengeHeader) {\n const probe = await probeAgent401(agentUrl, allowPrivateIpOnAgent, options.timeoutMs, options.fetchFn);\n if (probe.status !== 401) {\n // 200, 403, 5xx, or network error — not an OAuth 401 we can act on.\n return null;\n }\n challengeHeader = probe.wwwAuthenticate;\n }\n\n const challenge = parseWWWAuthenticate(challengeHeader ?? null);\n if (!challenge || challenge.scheme !== 'bearer') {\n // A 401 without a Bearer challenge isn't our kind of problem — let it propagate.\n return null;\n }\n\n const requirements: AuthorizationRequirements = {\n agentUrl,\n resourceMetadataUrl: challenge.resource_metadata ? sanitizeDisplay(challenge.resource_metadata) : undefined,\n challengeScope: challenge.scope ? sanitizeDisplay(challenge.scope) : undefined,\n challenge: sanitizeChallenge(challenge),\n };\n\n // Walk protected-resource metadata (RFC 9728 §3). Private-IP targets are\n // only allowed when the hop's origin matches the agent's.\n if (challenge.resource_metadata && isSafeHttpUrl(challenge.resource_metadata)) {\n const prm = await fetchJson(\n challenge.resource_metadata,\n allowPrivateIpForHop(challenge.resource_metadata),\n options.timeoutMs,\n options.fetchFn\n );\n if (prm && typeof prm === 'object') {\n const resource = (prm as { resource?: unknown }).resource;\n const servers = (prm as { authorization_servers?: unknown }).authorization_servers;\n if (typeof resource === 'string') requirements.resource = sanitizeDisplay(resource);\n if (Array.isArray(servers)) {\n const validServers = servers\n .filter((s: unknown): s is string => typeof s === 'string' && isSafeHttpUrl(s))\n .map(sanitizeDisplay);\n if (validServers.length > 0) {\n requirements.authorizationServers = validServers;\n requirements.authorizationServer = validServers[0];\n }\n }\n }\n }\n\n // Walk authorization-server metadata using the first issuer. RFC 8414 §3\n // first, then OIDC Discovery 1.0 fallback for AS deployments (Keycloak in\n // OIDC mode, Ping, ADFS) that only publish at\n // `{issuer}/.well-known/openid-configuration`.\n if (requirements.authorizationServer) {\n const asUrl = buildAuthorizationServerMetadataUrl(requirements.authorizationServer);\n let md: Record<string, unknown> | undefined;\n let source: 'rfc-8414' | 'openid-configuration' | undefined;\n if (asUrl) {\n const res = await fetchJson(asUrl, allowPrivateIpForHop(asUrl), options.timeoutMs, options.fetchFn);\n if (res && typeof res === 'object') {\n md = res as Record<string, unknown>;\n source = 'rfc-8414';\n }\n }\n if (!md) {\n const oidcUrl = buildOidcDiscoveryUrl(requirements.authorizationServer);\n if (oidcUrl) {\n const res = await fetchJson(oidcUrl, allowPrivateIpForHop(oidcUrl), options.timeoutMs, options.fetchFn);\n if (res && typeof res === 'object') {\n md = res as Record<string, unknown>;\n source = 'openid-configuration';\n }\n }\n }\n if (md) {\n requirements.metadataSource = source;\n if (typeof md.authorization_endpoint === 'string') {\n requirements.authorizationEndpoint = sanitizeDisplay(md.authorization_endpoint);\n }\n if (typeof md.token_endpoint === 'string') {\n requirements.tokenEndpoint = sanitizeDisplay(md.token_endpoint);\n }\n if (typeof md.registration_endpoint === 'string') {\n requirements.registrationEndpoint = sanitizeDisplay(md.registration_endpoint);\n }\n if (Array.isArray(md.scopes_supported)) {\n const scopes = md.scopes_supported\n .filter((s: unknown): s is string => typeof s === 'string')\n .slice(0, MAX_SCOPES)\n .map(sanitizeDisplay);\n if (scopes.length > 0) requirements.scopesSupported = scopes;\n }\n if (Array.isArray(md.grant_types_supported)) {\n const grants = md.grant_types_supported\n .filter((g: unknown): g is string => typeof g === 'string')\n .slice(0, 32)\n .map(sanitizeDisplay);\n if (grants.length > 0) requirements.grantTypesSupported = grants;\n }\n }\n }\n\n return requirements;\n}\n\n/**\n * Probe the agent for the parsed `WWW-Authenticate` challenge on a 401.\n *\n * Where `discoverAuthorizationRequirements` walks the full RFC 9728 → 8414\n * chain for Bearer/OAuth challenges, this helper is the catch-all: it works\n * for ANY scheme (Basic, Digest, Bearer-without-PRM, …) and returns the\n * structured challenge so callers can surface scheme-specific remediation\n * (e.g. \"use `--auth-scheme basic`\" when the gateway speaks RFC 7617).\n *\n * Returns `null` when the agent isn't responding with a 401, or when the\n * response carries no parseable `WWW-Authenticate`. Reuses `probeAgent401`\n * so the SSRF gate and timeout policy stay consistent with the OAuth path.\n */\nexport async function probeAuthChallenge(\n agentUrl: string,\n options: { allowPrivateIp?: boolean; timeoutMs?: number; fetchFn?: typeof fetch } = {}\n): Promise<WWWAuthenticateChallenge | null> {\n const probe = await probeAgent401(agentUrl, options.allowPrivateIp ?? false, options.timeoutMs, options.fetchFn);\n if (probe.status !== 401) return null;\n return parseWWWAuthenticate(probe.wwwAuthenticate ?? null);\n}\n\n/**\n * Fire a single unauthenticated `tools/list` at the agent and return the\n * status + `WWW-Authenticate` header. Used when the caller hasn't provided\n * a cached 401 response.\n */\nasync function probeAgent401(\n agentUrl: string,\n allowPrivateIp: boolean,\n timeoutMs?: number,\n fetchFn?: typeof fetch\n): Promise<{ status: number; wwwAuthenticate?: string }> {\n const body = JSON.stringify({ jsonrpc: '2.0', id: 1, method: 'tools/list' });\n try {\n const res = await ssrfSafeFetch(agentUrl, {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n accept: 'application/json',\n },\n body,\n allowPrivateIp,\n ...(timeoutMs !== undefined ? { timeoutMs } : {}),\n ...(fetchFn ? { trustedFetchFn: fetchFn } : {}),\n });\n return { status: res.status, wwwAuthenticate: res.headers['www-authenticate'] };\n } catch {\n return { status: 0 };\n }\n}\n\n/**\n * Check a URL is an absolute `http:`/`https:` URL before we hand it to\n * `ssrfSafeFetch`. Defeats `javascript:`, `file:`, `data:`, etc. the agent\n * might echo back in PRM or AS metadata. `ssrfSafeFetch` refuses non-HTTP\n * schemes too, but failing fast here gives a cleaner discovery flow and\n * avoids surfacing scheme errors as mysterious discovery misses.\n */\nfunction originOf(value: string): string | undefined {\n try {\n return new URL(value).origin;\n } catch {\n return undefined;\n }\n}\n\nfunction isSafeHttpUrl(value: string): boolean {\n try {\n const u = new URL(value);\n return u.protocol === 'https:' || u.protocol === 'http:';\n } catch {\n return false;\n }\n}\n\n/**\n * Build the authorization-server metadata URL for an issuer per RFC 8414 §3.\n *\n * For issuer `https://as.example.com/tenant1`, metadata lives at\n * `https://as.example.com/.well-known/oauth-authorization-server/tenant1`\n * (well-known prefix inserted BEFORE the issuer path, not after). This\n * matches how the MCP SDK and most authorization servers advertise metadata.\n */\nfunction buildAuthorizationServerMetadataUrl(issuer: string): string | undefined {\n if (!isSafeHttpUrl(issuer)) return undefined;\n const u = new URL(issuer);\n const pathname = u.pathname.endsWith('/') ? u.pathname.slice(0, -1) : u.pathname;\n return `${u.origin}/.well-known/oauth-authorization-server${pathname}`;\n}\n\n/**\n * OpenID Connect Discovery 1.0 fallback URL. Some authorization servers\n * (Keycloak in OIDC mode, Ping, ADFS) only publish metadata at\n * `{issuer}/.well-known/openid-configuration` — path *suffixed*, not\n * prefixed. The OIDC discovery doc carries `token_endpoint`,\n * `authorization_endpoint`, and `grant_types_supported` with the same\n * semantics as RFC 8414, so it's a safe read-through when the RFC 8414\n * probe misses.\n */\nfunction buildOidcDiscoveryUrl(issuer: string): string | undefined {\n if (!isSafeHttpUrl(issuer)) return undefined;\n const u = new URL(issuer);\n const base = u.pathname.endsWith('/') ? `${u.origin}${u.pathname.slice(0, -1)}` : `${u.origin}${u.pathname}`;\n return `${base}/.well-known/openid-configuration`;\n}\n\nasync function fetchJson(\n url: string,\n allowPrivateIp: boolean,\n timeoutMs?: number,\n fetchFn?: typeof fetch\n): Promise<unknown> {\n try {\n const res = await ssrfSafeFetch(url, {\n method: 'GET',\n headers: { accept: 'application/json' },\n allowPrivateIp,\n ...(timeoutMs !== undefined ? { timeoutMs } : {}),\n ...(fetchFn ? { trustedFetchFn: fetchFn } : {}),\n });\n if (res.status !== 200) return undefined;\n return decodeBodyAsJsonOrText(res.body, res.headers['content-type']);\n } catch {\n return undefined;\n }\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../../../src/lib/auth/oauth/authorization-required.ts"],"sourcesContent":["/**\n * Zero-config OAuth discovery + actionable authorization errors.\n *\n * When a library consumer calls an OAuth-gated MCP agent without saved\n * credentials, they get a `NeedsAuthorizationError` containing everything\n * needed to either run an interactive flow or present a clear prompt — no\n * re-probing required.\n *\n * Design note: this module only *discovers* — it never opens a browser or\n * writes state. Interactive flow handling stays in the caller (CLI or a\n * bespoke `OAuthFlowHandler`) so library behavior is predictable.\n */\nimport { ssrfSafeFetch, decodeBodyAsJsonOrText } from '../../net';\nimport { AuthenticationRequiredError, type OAuthMetadataInfo } from '../../errors';\nimport { throwIfAborted } from '../../protocols/abort';\nimport { parseWWWAuthenticate, type WWWAuthenticateChallenge } from './diagnostics';\n\n/**\n * Maximum length of an individual server-supplied string we copy into the\n * `AuthorizationRequirements` payload. Anything longer is truncated with a\n * `…` suffix so hostile agents can't smuggle megabyte error-descriptions\n * into operator-facing prompts and logs.\n */\nconst MAX_DISPLAY_STRING = 256;\n\n/**\n * Maximum number of scope strings we copy into `scopesSupported`. RFC 8414\n * allows an unbounded array; hostile servers have sent thousands.\n */\nconst MAX_SCOPES = 64;\n\n/**\n * Maximum number of auth-params we preserve under `challenge.params`. Bounds\n * memory pressure from hostile servers that pack the `WWW-Authenticate`\n * header with unknown auth-params.\n */\nconst MAX_CHALLENGE_PARAMS = 32;\n\n/**\n * Strip ASCII control characters (excluding TAB) from a server-supplied\n * string that may be shown to a human. Defeats terminal-hijack tricks like\n * `\\x1b]0;pwned\\x07` (rewrites terminal title), `\\r` (overwrites prompt),\n * and `\\x1b[2J` (clears screen). Also truncates over-long values.\n */\nfunction sanitizeDisplay(value: string): string {\n const stripped = value.replace(/[\\x00-\\x08\\x0b-\\x1f\\x7f]/g, '');\n if (stripped.length <= MAX_DISPLAY_STRING) return stripped;\n return `${stripped.slice(0, MAX_DISPLAY_STRING - 1)}…`;\n}\n\n/**\n * Sanitize the parsed `WWW-Authenticate` challenge before embedding it in a\n * `NeedsAuthorizationError`. Consumers that render `requirements.challenge`\n * to a terminal should never see control characters. Caps `params` count to\n * bound hostile servers.\n *\n * The `scheme` is already lowercased + token-constrained by the parser.\n * Param keys are also token-constrained so they're safe; only values need\n * sanitizing.\n */\nfunction sanitizeChallenge(c: WWWAuthenticateChallenge): WWWAuthenticateChallenge {\n const params: Record<string, string> = {};\n for (const [k, v] of Object.entries(c.params)) {\n if (Object.keys(params).length >= MAX_CHALLENGE_PARAMS) break;\n params[k] = sanitizeDisplay(v);\n }\n return {\n scheme: c.scheme,\n ...(c.realm !== undefined ? { realm: sanitizeDisplay(c.realm) } : {}),\n ...(c.error !== undefined ? { error: sanitizeDisplay(c.error) } : {}),\n ...(c.error_description !== undefined ? { error_description: sanitizeDisplay(c.error_description) } : {}),\n ...(c.scope !== undefined ? { scope: sanitizeDisplay(c.scope) } : {}),\n ...(c.resource_metadata !== undefined ? { resource_metadata: sanitizeDisplay(c.resource_metadata) } : {}),\n params,\n };\n}\n\n/**\n * Structured description of what an agent's authorization server requires\n * before it will accept a `tools/call`. Produced by\n * {@link discoverAuthorizationRequirements}.\n */\nexport interface AuthorizationRequirements {\n /** The agent URL we probed. */\n agentUrl: string;\n /** Resource URL the agent advertises in its `WWW-Authenticate` / PRM (RFC 9728). */\n resource?: string;\n /** URL of the protected-resource-metadata document (from `WWW-Authenticate: resource_metadata=…`). */\n resourceMetadataUrl?: string;\n /** First `authorization_servers[0]` from the protected-resource metadata. */\n authorizationServer?: string;\n /**\n * All `authorization_servers` advertised by the PRM, in declaration order.\n * The walker only probes `[0]` (PRM preference order — see RFC 9728 §3.3);\n * the full list is exposed so callers can surface multi-issuer deployments\n * in diagnostics. A length > 1 is uncommon and worth flagging to the\n * operator — typically a federation partner or a staged migration.\n */\n authorizationServers?: string[];\n /** `authorization_endpoint` from the authorization-server metadata (RFC 8414). */\n authorizationEndpoint?: string;\n /** `token_endpoint` from the authorization-server metadata. */\n tokenEndpoint?: string;\n /** `registration_endpoint` if the AS supports RFC 7591 dynamic client registration. */\n registrationEndpoint?: string;\n /** Scopes advertised by the AS (RFC 8414 `scopes_supported`). */\n scopesSupported?: string[];\n /**\n * `grant_types_supported` advertised by the AS (RFC 8414). `undefined` when\n * the AS didn't publish the field — per RFC 8414 that defaults to\n * `[\"authorization_code\", \"implicit\"]`. Clients should treat absence as\n * \"unknown, try your grant and see,\" not as proof the grant is unsupported.\n */\n grantTypesSupported?: string[];\n /** True when the AS metadata came from the OIDC fallback URL rather than RFC 8414. */\n metadataSource?: 'rfc-8414' | 'openid-configuration';\n /** Scope hinted in the `WWW-Authenticate` challenge's `scope` auth-param. */\n challengeScope?: string;\n /** Raw parsed challenge the agent returned on the 401. */\n challenge: WWWAuthenticateChallenge;\n}\n\n/**\n * Error raised when an agent returns a 401 and we do not have credentials\n * to satisfy it. Carries everything needed to run an interactive OAuth flow\n * or show the operator an actionable prompt.\n *\n * Extends {@link AuthenticationRequiredError} so existing callers that catch\n * `AuthenticationRequiredError` automatically receive the richer variant —\n * they can downcast with `instanceof NeedsAuthorizationError` when they\n * want walked discovery metadata.\n *\n * Note on `code` vs `subCode`:\n * The parent class declares `readonly code = 'AUTHENTICATION_REQUIRED'` as\n * a class field that re-initializes on every construction, so a child-side\n * override attempt is silently overwritten under `useDefineForClassFields`.\n * The narrow discriminator is exposed as `subCode` — prefer\n * `instanceof NeedsAuthorizationError` for type-narrowing and use `subCode`\n * only for structured-log keying.\n *\n * Note on `hasOAuth`:\n * The inherited getter returns `true` only when both `authorization_endpoint`\n * and `token_endpoint` were walked successfully. A partially-walked\n * requirements record (PRM reachable but AS metadata missing) still yields\n * `hasOAuth === false` even though `requirements.authorizationServer` is set.\n * Treat it as \"we have enough to start a flow,\" not \"server wants OAuth.\"\n */\nexport class NeedsAuthorizationError extends AuthenticationRequiredError {\n /** Narrow discriminator for consumers that already know about this class. */\n readonly subCode = 'needs_authorization' as const;\n readonly requirements: AuthorizationRequirements;\n\n constructor(requirements: AuthorizationRequirements, message?: string) {\n super(requirements.agentUrl, synthesizeOAuthMetadata(requirements), message ?? defaultMessage(requirements));\n this.name = 'NeedsAuthorizationError';\n this.requirements = requirements;\n // Extend the parent's `details` payload so structured-logging consumers\n // that read `err.details` (via `extractErrorInfo` or equivalent) see the\n // full walked chain, not just the synthesized one-hop oauthMetadata.\n this.details = { ...(this.details as object | undefined), requirements };\n }\n}\n\n/**\n * Build an {@link OAuthMetadataInfo} for the base-class constructor so that\n * legacy callers still see a non-empty `oauthMetadata` + working\n * `hasOAuth`/`authorizationUrl` getters on the error. When discovery didn't\n * yield enough info, return undefined and let the base class degrade\n * gracefully.\n */\nfunction synthesizeOAuthMetadata(req: AuthorizationRequirements): OAuthMetadataInfo | undefined {\n if (!req.authorizationEndpoint || !req.tokenEndpoint) return undefined;\n return {\n authorization_endpoint: req.authorizationEndpoint,\n token_endpoint: req.tokenEndpoint,\n ...(req.registrationEndpoint ? { registration_endpoint: req.registrationEndpoint } : {}),\n ...(req.authorizationServer ? { issuer: req.authorizationServer } : {}),\n };\n}\n\nfunction defaultMessage(req: AuthorizationRequirements): string {\n const parts = [`Agent ${sanitizeDisplay(req.agentUrl)} requires OAuth authorization.`];\n if (req.authorizationServer) {\n parts.push(`Authorization server: ${req.authorizationServer}.`);\n }\n if (req.challenge.error_description) {\n parts.push(`Server said: ${sanitizeDisplay(req.challenge.error_description)}.`);\n }\n parts.push('Provide an OAuthFlowHandler or run an interactive flow to complete authorization.');\n return parts.join(' ');\n}\n\n/**\n * Options for {@link discoverAuthorizationRequirements}.\n */\nexport interface DiscoverAuthorizationOptions {\n /** Allow http:// and private-IP probe targets. Default false. */\n allowPrivateIp?: boolean;\n /** Override per-probe HTTP timeout (ms). Default inherits from ssrfSafeFetch (10s). */\n timeoutMs?: number;\n /** Scoped fetch implementation for the agent, PRM, and AS metadata probes. */\n fetchFn?: typeof fetch;\n /** Caller cancellation, including the absolute task deadline. */\n signal?: AbortSignal;\n /**\n * If provided, use this `WWW-Authenticate` header verbatim instead of\n * re-probing the agent. Use this when you already have a 401 response in\n * hand and want to avoid a second round-trip.\n */\n wwwAuthenticate?: string;\n}\n\n/**\n * Walk the OAuth discovery chain starting from an agent URL. Returns\n * `AuthorizationRequirements` when the agent demands OAuth, or `null` when a\n * `tools/list` call succeeds without credentials.\n *\n * Strategy:\n * 1. POST `tools/list` to the agent with no `Authorization` header.\n * 2. If 401 + `WWW-Authenticate: Bearer`: parse the challenge.\n * 3. If the challenge carries `resource_metadata=…`: GET it and read\n * `resource` + `authorization_servers`.\n * 4. For the first `authorization_servers[0]`: GET `/.well-known/oauth-authorization-server`\n * and read `authorization_endpoint`, `token_endpoint`, `registration_endpoint`,\n * `scopes_supported`.\n * 5. Return a structured record.\n *\n * Anything missing from the chain surfaces as `undefined` on the result —\n * callers can still present a partial picture without re-probing.\n */\nexport async function discoverAuthorizationRequirements(\n agentUrl: string,\n options: DiscoverAuthorizationOptions = {}\n): Promise<AuthorizationRequirements | null> {\n // `allowPrivateIp` authorizes the agent probe. Chain hops (PRM, AS\n // metadata) inherit that trust ONLY when they share the agent's origin —\n // a compromised agent that advertises a private-IP authorization server\n // on a different origin would otherwise pivot a discovery walk into the\n // host's internal network.\n const allowPrivateIpOnAgent = options.allowPrivateIp ?? false;\n const agentOrigin = originOf(agentUrl);\n const allowPrivateIpForHop = (url: string): boolean =>\n allowPrivateIpOnAgent && agentOrigin !== undefined && originOf(url) === agentOrigin;\n\n let challengeHeader = options.wwwAuthenticate;\n if (!challengeHeader) {\n const probe = await probeAgent401(\n agentUrl,\n allowPrivateIpOnAgent,\n options.timeoutMs,\n options.fetchFn,\n options.signal\n );\n if (probe.status !== 401) {\n // 200, 403, 5xx, or network error — not an OAuth 401 we can act on.\n return null;\n }\n challengeHeader = probe.wwwAuthenticate;\n }\n\n const challenge = parseWWWAuthenticate(challengeHeader ?? null);\n if (!challenge || challenge.scheme !== 'bearer') {\n // A 401 without a Bearer challenge isn't our kind of problem — let it propagate.\n return null;\n }\n\n const requirements: AuthorizationRequirements = {\n agentUrl,\n resourceMetadataUrl: challenge.resource_metadata ? sanitizeDisplay(challenge.resource_metadata) : undefined,\n challengeScope: challenge.scope ? sanitizeDisplay(challenge.scope) : undefined,\n challenge: sanitizeChallenge(challenge),\n };\n\n // Walk protected-resource metadata (RFC 9728 §3). Private-IP targets are\n // only allowed when the hop's origin matches the agent's.\n if (challenge.resource_metadata && isSafeHttpUrl(challenge.resource_metadata)) {\n const prm = await fetchJson(\n challenge.resource_metadata,\n allowPrivateIpForHop(challenge.resource_metadata),\n options.timeoutMs,\n options.fetchFn,\n options.signal\n );\n if (prm && typeof prm === 'object') {\n const resource = (prm as { resource?: unknown }).resource;\n const servers = (prm as { authorization_servers?: unknown }).authorization_servers;\n if (typeof resource === 'string') requirements.resource = sanitizeDisplay(resource);\n if (Array.isArray(servers)) {\n const validServers = servers\n .filter((s: unknown): s is string => typeof s === 'string' && isSafeHttpUrl(s))\n .map(sanitizeDisplay);\n if (validServers.length > 0) {\n requirements.authorizationServers = validServers;\n requirements.authorizationServer = validServers[0];\n }\n }\n }\n }\n\n // Walk authorization-server metadata using the first issuer. RFC 8414 §3\n // first, then OIDC Discovery 1.0 fallback for AS deployments (Keycloak in\n // OIDC mode, Ping, ADFS) that only publish at\n // `{issuer}/.well-known/openid-configuration`.\n if (requirements.authorizationServer) {\n const asUrl = buildAuthorizationServerMetadataUrl(requirements.authorizationServer);\n let md: Record<string, unknown> | undefined;\n let source: 'rfc-8414' | 'openid-configuration' | undefined;\n if (asUrl) {\n const res = await fetchJson(\n asUrl,\n allowPrivateIpForHop(asUrl),\n options.timeoutMs,\n options.fetchFn,\n options.signal\n );\n if (res && typeof res === 'object') {\n md = res as Record<string, unknown>;\n source = 'rfc-8414';\n }\n }\n if (!md) {\n const oidcUrl = buildOidcDiscoveryUrl(requirements.authorizationServer);\n if (oidcUrl) {\n const res = await fetchJson(\n oidcUrl,\n allowPrivateIpForHop(oidcUrl),\n options.timeoutMs,\n options.fetchFn,\n options.signal\n );\n if (res && typeof res === 'object') {\n md = res as Record<string, unknown>;\n source = 'openid-configuration';\n }\n }\n }\n if (md) {\n requirements.metadataSource = source;\n if (typeof md.authorization_endpoint === 'string') {\n requirements.authorizationEndpoint = sanitizeDisplay(md.authorization_endpoint);\n }\n if (typeof md.token_endpoint === 'string') {\n requirements.tokenEndpoint = sanitizeDisplay(md.token_endpoint);\n }\n if (typeof md.registration_endpoint === 'string') {\n requirements.registrationEndpoint = sanitizeDisplay(md.registration_endpoint);\n }\n if (Array.isArray(md.scopes_supported)) {\n const scopes = md.scopes_supported\n .filter((s: unknown): s is string => typeof s === 'string')\n .slice(0, MAX_SCOPES)\n .map(sanitizeDisplay);\n if (scopes.length > 0) requirements.scopesSupported = scopes;\n }\n if (Array.isArray(md.grant_types_supported)) {\n const grants = md.grant_types_supported\n .filter((g: unknown): g is string => typeof g === 'string')\n .slice(0, 32)\n .map(sanitizeDisplay);\n if (grants.length > 0) requirements.grantTypesSupported = grants;\n }\n }\n }\n\n return requirements;\n}\n\n/**\n * Probe the agent for the parsed `WWW-Authenticate` challenge on a 401.\n *\n * Where `discoverAuthorizationRequirements` walks the full RFC 9728 → 8414\n * chain for Bearer/OAuth challenges, this helper is the catch-all: it works\n * for ANY scheme (Basic, Digest, Bearer-without-PRM, …) and returns the\n * structured challenge so callers can surface scheme-specific remediation\n * (e.g. \"use `--auth-scheme basic`\" when the gateway speaks RFC 7617).\n *\n * Returns `null` when the agent isn't responding with a 401, or when the\n * response carries no parseable `WWW-Authenticate`. Reuses `probeAgent401`\n * so the SSRF gate and timeout policy stay consistent with the OAuth path.\n */\nexport async function probeAuthChallenge(\n agentUrl: string,\n options: { allowPrivateIp?: boolean; timeoutMs?: number; fetchFn?: typeof fetch; signal?: AbortSignal } = {}\n): Promise<WWWAuthenticateChallenge | null> {\n const probe = await probeAgent401(\n agentUrl,\n options.allowPrivateIp ?? false,\n options.timeoutMs,\n options.fetchFn,\n options.signal\n );\n if (probe.status !== 401) return null;\n return parseWWWAuthenticate(probe.wwwAuthenticate ?? null);\n}\n\n/**\n * Fire a single unauthenticated `tools/list` at the agent and return the\n * status + `WWW-Authenticate` header. Used when the caller hasn't provided\n * a cached 401 response.\n */\nasync function probeAgent401(\n agentUrl: string,\n allowPrivateIp: boolean,\n timeoutMs?: number,\n fetchFn?: typeof fetch,\n signal?: AbortSignal\n): Promise<{ status: number; wwwAuthenticate?: string }> {\n const body = JSON.stringify({ jsonrpc: '2.0', id: 1, method: 'tools/list' });\n try {\n const res = await ssrfSafeFetch(agentUrl, {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n accept: 'application/json',\n },\n body,\n allowPrivateIp,\n signal,\n ...(timeoutMs !== undefined ? { timeoutMs } : {}),\n ...(fetchFn ? { trustedFetchFn: fetchFn } : {}),\n });\n return { status: res.status, wwwAuthenticate: res.headers['www-authenticate'] };\n } catch {\n throwIfAborted(signal);\n return { status: 0 };\n }\n}\n\n/**\n * Check a URL is an absolute `http:`/`https:` URL before we hand it to\n * `ssrfSafeFetch`. Defeats `javascript:`, `file:`, `data:`, etc. the agent\n * might echo back in PRM or AS metadata. `ssrfSafeFetch` refuses non-HTTP\n * schemes too, but failing fast here gives a cleaner discovery flow and\n * avoids surfacing scheme errors as mysterious discovery misses.\n */\nfunction originOf(value: string): string | undefined {\n try {\n return new URL(value).origin;\n } catch {\n return undefined;\n }\n}\n\nfunction isSafeHttpUrl(value: string): boolean {\n try {\n const u = new URL(value);\n return u.protocol === 'https:' || u.protocol === 'http:';\n } catch {\n return false;\n }\n}\n\n/**\n * Build the authorization-server metadata URL for an issuer per RFC 8414 §3.\n *\n * For issuer `https://as.example.com/tenant1`, metadata lives at\n * `https://as.example.com/.well-known/oauth-authorization-server/tenant1`\n * (well-known prefix inserted BEFORE the issuer path, not after). This\n * matches how the MCP SDK and most authorization servers advertise metadata.\n */\nfunction buildAuthorizationServerMetadataUrl(issuer: string): string | undefined {\n if (!isSafeHttpUrl(issuer)) return undefined;\n const u = new URL(issuer);\n const pathname = u.pathname.endsWith('/') ? u.pathname.slice(0, -1) : u.pathname;\n return `${u.origin}/.well-known/oauth-authorization-server${pathname}`;\n}\n\n/**\n * OpenID Connect Discovery 1.0 fallback URL. Some authorization servers\n * (Keycloak in OIDC mode, Ping, ADFS) only publish metadata at\n * `{issuer}/.well-known/openid-configuration` — path *suffixed*, not\n * prefixed. The OIDC discovery doc carries `token_endpoint`,\n * `authorization_endpoint`, and `grant_types_supported` with the same\n * semantics as RFC 8414, so it's a safe read-through when the RFC 8414\n * probe misses.\n */\nfunction buildOidcDiscoveryUrl(issuer: string): string | undefined {\n if (!isSafeHttpUrl(issuer)) return undefined;\n const u = new URL(issuer);\n const base = u.pathname.endsWith('/') ? `${u.origin}${u.pathname.slice(0, -1)}` : `${u.origin}${u.pathname}`;\n return `${base}/.well-known/openid-configuration`;\n}\n\nasync function fetchJson(\n url: string,\n allowPrivateIp: boolean,\n timeoutMs?: number,\n fetchFn?: typeof fetch,\n signal?: AbortSignal\n): Promise<unknown> {\n try {\n const res = await ssrfSafeFetch(url, {\n method: 'GET',\n headers: { accept: 'application/json' },\n allowPrivateIp,\n signal,\n ...(timeoutMs !== undefined ? { timeoutMs } : {}),\n ...(fetchFn ? { trustedFetchFn: fetchFn } : {}),\n });\n if (res.status !== 200) return undefined;\n return decodeBodyAsJsonOrText(res.body, res.headers['content-type']);\n } catch {\n throwIfAborted(signal);\n return undefined;\n }\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { ssrfSafeFetch, decodeBodyAsJsonOrText } from "../../net/index.mjs";
|
|
2
2
|
import { AuthenticationRequiredError } from "../../errors/index.mjs";
|
|
3
|
+
import { throwIfAborted } from "../../protocols/abort.mjs";
|
|
3
4
|
import { parseWWWAuthenticate } from "./diagnostics.mjs";
|
|
4
5
|
const MAX_DISPLAY_STRING = 256;
|
|
5
6
|
const MAX_SCOPES = 64;
|
|
@@ -62,7 +63,13 @@ async function discoverAuthorizationRequirements(agentUrl, options = {}) {
|
|
|
62
63
|
const allowPrivateIpForHop = (url) => allowPrivateIpOnAgent && agentOrigin !== void 0 && originOf(url) === agentOrigin;
|
|
63
64
|
let challengeHeader = options.wwwAuthenticate;
|
|
64
65
|
if (!challengeHeader) {
|
|
65
|
-
const probe = await probeAgent401(
|
|
66
|
+
const probe = await probeAgent401(
|
|
67
|
+
agentUrl,
|
|
68
|
+
allowPrivateIpOnAgent,
|
|
69
|
+
options.timeoutMs,
|
|
70
|
+
options.fetchFn,
|
|
71
|
+
options.signal
|
|
72
|
+
);
|
|
66
73
|
if (probe.status !== 401) {
|
|
67
74
|
return null;
|
|
68
75
|
}
|
|
@@ -83,7 +90,8 @@ async function discoverAuthorizationRequirements(agentUrl, options = {}) {
|
|
|
83
90
|
challenge.resource_metadata,
|
|
84
91
|
allowPrivateIpForHop(challenge.resource_metadata),
|
|
85
92
|
options.timeoutMs,
|
|
86
|
-
options.fetchFn
|
|
93
|
+
options.fetchFn,
|
|
94
|
+
options.signal
|
|
87
95
|
);
|
|
88
96
|
if (prm && typeof prm === "object") {
|
|
89
97
|
const resource = prm.resource;
|
|
@@ -103,7 +111,13 @@ async function discoverAuthorizationRequirements(agentUrl, options = {}) {
|
|
|
103
111
|
let md;
|
|
104
112
|
let source;
|
|
105
113
|
if (asUrl) {
|
|
106
|
-
const res = await fetchJson(
|
|
114
|
+
const res = await fetchJson(
|
|
115
|
+
asUrl,
|
|
116
|
+
allowPrivateIpForHop(asUrl),
|
|
117
|
+
options.timeoutMs,
|
|
118
|
+
options.fetchFn,
|
|
119
|
+
options.signal
|
|
120
|
+
);
|
|
107
121
|
if (res && typeof res === "object") {
|
|
108
122
|
md = res;
|
|
109
123
|
source = "rfc-8414";
|
|
@@ -112,7 +126,13 @@ async function discoverAuthorizationRequirements(agentUrl, options = {}) {
|
|
|
112
126
|
if (!md) {
|
|
113
127
|
const oidcUrl = buildOidcDiscoveryUrl(requirements.authorizationServer);
|
|
114
128
|
if (oidcUrl) {
|
|
115
|
-
const res = await fetchJson(
|
|
129
|
+
const res = await fetchJson(
|
|
130
|
+
oidcUrl,
|
|
131
|
+
allowPrivateIpForHop(oidcUrl),
|
|
132
|
+
options.timeoutMs,
|
|
133
|
+
options.fetchFn,
|
|
134
|
+
options.signal
|
|
135
|
+
);
|
|
116
136
|
if (res && typeof res === "object") {
|
|
117
137
|
md = res;
|
|
118
138
|
source = "openid-configuration";
|
|
@@ -143,11 +163,17 @@ async function discoverAuthorizationRequirements(agentUrl, options = {}) {
|
|
|
143
163
|
return requirements;
|
|
144
164
|
}
|
|
145
165
|
async function probeAuthChallenge(agentUrl, options = {}) {
|
|
146
|
-
const probe = await probeAgent401(
|
|
166
|
+
const probe = await probeAgent401(
|
|
167
|
+
agentUrl,
|
|
168
|
+
options.allowPrivateIp ?? false,
|
|
169
|
+
options.timeoutMs,
|
|
170
|
+
options.fetchFn,
|
|
171
|
+
options.signal
|
|
172
|
+
);
|
|
147
173
|
if (probe.status !== 401) return null;
|
|
148
174
|
return parseWWWAuthenticate(probe.wwwAuthenticate ?? null);
|
|
149
175
|
}
|
|
150
|
-
async function probeAgent401(agentUrl, allowPrivateIp, timeoutMs, fetchFn) {
|
|
176
|
+
async function probeAgent401(agentUrl, allowPrivateIp, timeoutMs, fetchFn, signal) {
|
|
151
177
|
const body = JSON.stringify({ jsonrpc: "2.0", id: 1, method: "tools/list" });
|
|
152
178
|
try {
|
|
153
179
|
const res = await ssrfSafeFetch(agentUrl, {
|
|
@@ -158,11 +184,13 @@ async function probeAgent401(agentUrl, allowPrivateIp, timeoutMs, fetchFn) {
|
|
|
158
184
|
},
|
|
159
185
|
body,
|
|
160
186
|
allowPrivateIp,
|
|
187
|
+
signal,
|
|
161
188
|
...timeoutMs !== void 0 ? { timeoutMs } : {},
|
|
162
189
|
...fetchFn ? { trustedFetchFn: fetchFn } : {}
|
|
163
190
|
});
|
|
164
191
|
return { status: res.status, wwwAuthenticate: res.headers["www-authenticate"] };
|
|
165
192
|
} catch {
|
|
193
|
+
throwIfAborted(signal);
|
|
166
194
|
return { status: 0 };
|
|
167
195
|
}
|
|
168
196
|
}
|
|
@@ -193,18 +221,20 @@ function buildOidcDiscoveryUrl(issuer) {
|
|
|
193
221
|
const base = u.pathname.endsWith("/") ? `${u.origin}${u.pathname.slice(0, -1)}` : `${u.origin}${u.pathname}`;
|
|
194
222
|
return `${base}/.well-known/openid-configuration`;
|
|
195
223
|
}
|
|
196
|
-
async function fetchJson(url, allowPrivateIp, timeoutMs, fetchFn) {
|
|
224
|
+
async function fetchJson(url, allowPrivateIp, timeoutMs, fetchFn, signal) {
|
|
197
225
|
try {
|
|
198
226
|
const res = await ssrfSafeFetch(url, {
|
|
199
227
|
method: "GET",
|
|
200
228
|
headers: { accept: "application/json" },
|
|
201
229
|
allowPrivateIp,
|
|
230
|
+
signal,
|
|
202
231
|
...timeoutMs !== void 0 ? { timeoutMs } : {},
|
|
203
232
|
...fetchFn ? { trustedFetchFn: fetchFn } : {}
|
|
204
233
|
});
|
|
205
234
|
if (res.status !== 200) return void 0;
|
|
206
235
|
return decodeBodyAsJsonOrText(res.body, res.headers["content-type"]);
|
|
207
236
|
} catch {
|
|
237
|
+
throwIfAborted(signal);
|
|
208
238
|
return void 0;
|
|
209
239
|
}
|
|
210
240
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/lib/auth/oauth/authorization-required.ts"],"sourcesContent":["/**\n * Zero-config OAuth discovery + actionable authorization errors.\n *\n * When a library consumer calls an OAuth-gated MCP agent without saved\n * credentials, they get a `NeedsAuthorizationError` containing everything\n * needed to either run an interactive flow or present a clear prompt — no\n * re-probing required.\n *\n * Design note: this module only *discovers* — it never opens a browser or\n * writes state. Interactive flow handling stays in the caller (CLI or a\n * bespoke `OAuthFlowHandler`) so library behavior is predictable.\n */\nimport { ssrfSafeFetch, decodeBodyAsJsonOrText } from '../../net';\nimport { AuthenticationRequiredError, type OAuthMetadataInfo } from '../../errors';\nimport { parseWWWAuthenticate, type WWWAuthenticateChallenge } from './diagnostics';\n\n/**\n * Maximum length of an individual server-supplied string we copy into the\n * `AuthorizationRequirements` payload. Anything longer is truncated with a\n * `…` suffix so hostile agents can't smuggle megabyte error-descriptions\n * into operator-facing prompts and logs.\n */\nconst MAX_DISPLAY_STRING = 256;\n\n/**\n * Maximum number of scope strings we copy into `scopesSupported`. RFC 8414\n * allows an unbounded array; hostile servers have sent thousands.\n */\nconst MAX_SCOPES = 64;\n\n/**\n * Maximum number of auth-params we preserve under `challenge.params`. Bounds\n * memory pressure from hostile servers that pack the `WWW-Authenticate`\n * header with unknown auth-params.\n */\nconst MAX_CHALLENGE_PARAMS = 32;\n\n/**\n * Strip ASCII control characters (excluding TAB) from a server-supplied\n * string that may be shown to a human. Defeats terminal-hijack tricks like\n * `\\x1b]0;pwned\\x07` (rewrites terminal title), `\\r` (overwrites prompt),\n * and `\\x1b[2J` (clears screen). Also truncates over-long values.\n */\nfunction sanitizeDisplay(value: string): string {\n const stripped = value.replace(/[\\x00-\\x08\\x0b-\\x1f\\x7f]/g, '');\n if (stripped.length <= MAX_DISPLAY_STRING) return stripped;\n return `${stripped.slice(0, MAX_DISPLAY_STRING - 1)}…`;\n}\n\n/**\n * Sanitize the parsed `WWW-Authenticate` challenge before embedding it in a\n * `NeedsAuthorizationError`. Consumers that render `requirements.challenge`\n * to a terminal should never see control characters. Caps `params` count to\n * bound hostile servers.\n *\n * The `scheme` is already lowercased + token-constrained by the parser.\n * Param keys are also token-constrained so they're safe; only values need\n * sanitizing.\n */\nfunction sanitizeChallenge(c: WWWAuthenticateChallenge): WWWAuthenticateChallenge {\n const params: Record<string, string> = {};\n for (const [k, v] of Object.entries(c.params)) {\n if (Object.keys(params).length >= MAX_CHALLENGE_PARAMS) break;\n params[k] = sanitizeDisplay(v);\n }\n return {\n scheme: c.scheme,\n ...(c.realm !== undefined ? { realm: sanitizeDisplay(c.realm) } : {}),\n ...(c.error !== undefined ? { error: sanitizeDisplay(c.error) } : {}),\n ...(c.error_description !== undefined ? { error_description: sanitizeDisplay(c.error_description) } : {}),\n ...(c.scope !== undefined ? { scope: sanitizeDisplay(c.scope) } : {}),\n ...(c.resource_metadata !== undefined ? { resource_metadata: sanitizeDisplay(c.resource_metadata) } : {}),\n params,\n };\n}\n\n/**\n * Structured description of what an agent's authorization server requires\n * before it will accept a `tools/call`. Produced by\n * {@link discoverAuthorizationRequirements}.\n */\nexport interface AuthorizationRequirements {\n /** The agent URL we probed. */\n agentUrl: string;\n /** Resource URL the agent advertises in its `WWW-Authenticate` / PRM (RFC 9728). */\n resource?: string;\n /** URL of the protected-resource-metadata document (from `WWW-Authenticate: resource_metadata=…`). */\n resourceMetadataUrl?: string;\n /** First `authorization_servers[0]` from the protected-resource metadata. */\n authorizationServer?: string;\n /**\n * All `authorization_servers` advertised by the PRM, in declaration order.\n * The walker only probes `[0]` (PRM preference order — see RFC 9728 §3.3);\n * the full list is exposed so callers can surface multi-issuer deployments\n * in diagnostics. A length > 1 is uncommon and worth flagging to the\n * operator — typically a federation partner or a staged migration.\n */\n authorizationServers?: string[];\n /** `authorization_endpoint` from the authorization-server metadata (RFC 8414). */\n authorizationEndpoint?: string;\n /** `token_endpoint` from the authorization-server metadata. */\n tokenEndpoint?: string;\n /** `registration_endpoint` if the AS supports RFC 7591 dynamic client registration. */\n registrationEndpoint?: string;\n /** Scopes advertised by the AS (RFC 8414 `scopes_supported`). */\n scopesSupported?: string[];\n /**\n * `grant_types_supported` advertised by the AS (RFC 8414). `undefined` when\n * the AS didn't publish the field — per RFC 8414 that defaults to\n * `[\"authorization_code\", \"implicit\"]`. Clients should treat absence as\n * \"unknown, try your grant and see,\" not as proof the grant is unsupported.\n */\n grantTypesSupported?: string[];\n /** True when the AS metadata came from the OIDC fallback URL rather than RFC 8414. */\n metadataSource?: 'rfc-8414' | 'openid-configuration';\n /** Scope hinted in the `WWW-Authenticate` challenge's `scope` auth-param. */\n challengeScope?: string;\n /** Raw parsed challenge the agent returned on the 401. */\n challenge: WWWAuthenticateChallenge;\n}\n\n/**\n * Error raised when an agent returns a 401 and we do not have credentials\n * to satisfy it. Carries everything needed to run an interactive OAuth flow\n * or show the operator an actionable prompt.\n *\n * Extends {@link AuthenticationRequiredError} so existing callers that catch\n * `AuthenticationRequiredError` automatically receive the richer variant —\n * they can downcast with `instanceof NeedsAuthorizationError` when they\n * want walked discovery metadata.\n *\n * Note on `code` vs `subCode`:\n * The parent class declares `readonly code = 'AUTHENTICATION_REQUIRED'` as\n * a class field that re-initializes on every construction, so a child-side\n * override attempt is silently overwritten under `useDefineForClassFields`.\n * The narrow discriminator is exposed as `subCode` — prefer\n * `instanceof NeedsAuthorizationError` for type-narrowing and use `subCode`\n * only for structured-log keying.\n *\n * Note on `hasOAuth`:\n * The inherited getter returns `true` only when both `authorization_endpoint`\n * and `token_endpoint` were walked successfully. A partially-walked\n * requirements record (PRM reachable but AS metadata missing) still yields\n * `hasOAuth === false` even though `requirements.authorizationServer` is set.\n * Treat it as \"we have enough to start a flow,\" not \"server wants OAuth.\"\n */\nexport class NeedsAuthorizationError extends AuthenticationRequiredError {\n /** Narrow discriminator for consumers that already know about this class. */\n readonly subCode = 'needs_authorization' as const;\n readonly requirements: AuthorizationRequirements;\n\n constructor(requirements: AuthorizationRequirements, message?: string) {\n super(requirements.agentUrl, synthesizeOAuthMetadata(requirements), message ?? defaultMessage(requirements));\n this.name = 'NeedsAuthorizationError';\n this.requirements = requirements;\n // Extend the parent's `details` payload so structured-logging consumers\n // that read `err.details` (via `extractErrorInfo` or equivalent) see the\n // full walked chain, not just the synthesized one-hop oauthMetadata.\n this.details = { ...(this.details as object | undefined), requirements };\n }\n}\n\n/**\n * Build an {@link OAuthMetadataInfo} for the base-class constructor so that\n * legacy callers still see a non-empty `oauthMetadata` + working\n * `hasOAuth`/`authorizationUrl` getters on the error. When discovery didn't\n * yield enough info, return undefined and let the base class degrade\n * gracefully.\n */\nfunction synthesizeOAuthMetadata(req: AuthorizationRequirements): OAuthMetadataInfo | undefined {\n if (!req.authorizationEndpoint || !req.tokenEndpoint) return undefined;\n return {\n authorization_endpoint: req.authorizationEndpoint,\n token_endpoint: req.tokenEndpoint,\n ...(req.registrationEndpoint ? { registration_endpoint: req.registrationEndpoint } : {}),\n ...(req.authorizationServer ? { issuer: req.authorizationServer } : {}),\n };\n}\n\nfunction defaultMessage(req: AuthorizationRequirements): string {\n const parts = [`Agent ${sanitizeDisplay(req.agentUrl)} requires OAuth authorization.`];\n if (req.authorizationServer) {\n parts.push(`Authorization server: ${req.authorizationServer}.`);\n }\n if (req.challenge.error_description) {\n parts.push(`Server said: ${sanitizeDisplay(req.challenge.error_description)}.`);\n }\n parts.push('Provide an OAuthFlowHandler or run an interactive flow to complete authorization.');\n return parts.join(' ');\n}\n\n/**\n * Options for {@link discoverAuthorizationRequirements}.\n */\nexport interface DiscoverAuthorizationOptions {\n /** Allow http:// and private-IP probe targets. Default false. */\n allowPrivateIp?: boolean;\n /** Override per-probe HTTP timeout (ms). Default inherits from ssrfSafeFetch (10s). */\n timeoutMs?: number;\n /** Scoped fetch implementation for the agent, PRM, and AS metadata probes. */\n fetchFn?: typeof fetch;\n /**\n * If provided, use this `WWW-Authenticate` header verbatim instead of\n * re-probing the agent. Use this when you already have a 401 response in\n * hand and want to avoid a second round-trip.\n */\n wwwAuthenticate?: string;\n}\n\n/**\n * Walk the OAuth discovery chain starting from an agent URL. Returns\n * `AuthorizationRequirements` when the agent demands OAuth, or `null` when a\n * `tools/list` call succeeds without credentials.\n *\n * Strategy:\n * 1. POST `tools/list` to the agent with no `Authorization` header.\n * 2. If 401 + `WWW-Authenticate: Bearer`: parse the challenge.\n * 3. If the challenge carries `resource_metadata=…`: GET it and read\n * `resource` + `authorization_servers`.\n * 4. For the first `authorization_servers[0]`: GET `/.well-known/oauth-authorization-server`\n * and read `authorization_endpoint`, `token_endpoint`, `registration_endpoint`,\n * `scopes_supported`.\n * 5. Return a structured record.\n *\n * Anything missing from the chain surfaces as `undefined` on the result —\n * callers can still present a partial picture without re-probing.\n */\nexport async function discoverAuthorizationRequirements(\n agentUrl: string,\n options: DiscoverAuthorizationOptions = {}\n): Promise<AuthorizationRequirements | null> {\n // `allowPrivateIp` authorizes the agent probe. Chain hops (PRM, AS\n // metadata) inherit that trust ONLY when they share the agent's origin —\n // a compromised agent that advertises a private-IP authorization server\n // on a different origin would otherwise pivot a discovery walk into the\n // host's internal network.\n const allowPrivateIpOnAgent = options.allowPrivateIp ?? false;\n const agentOrigin = originOf(agentUrl);\n const allowPrivateIpForHop = (url: string): boolean =>\n allowPrivateIpOnAgent && agentOrigin !== undefined && originOf(url) === agentOrigin;\n\n let challengeHeader = options.wwwAuthenticate;\n if (!challengeHeader) {\n const probe = await probeAgent401(agentUrl, allowPrivateIpOnAgent, options.timeoutMs, options.fetchFn);\n if (probe.status !== 401) {\n // 200, 403, 5xx, or network error — not an OAuth 401 we can act on.\n return null;\n }\n challengeHeader = probe.wwwAuthenticate;\n }\n\n const challenge = parseWWWAuthenticate(challengeHeader ?? null);\n if (!challenge || challenge.scheme !== 'bearer') {\n // A 401 without a Bearer challenge isn't our kind of problem — let it propagate.\n return null;\n }\n\n const requirements: AuthorizationRequirements = {\n agentUrl,\n resourceMetadataUrl: challenge.resource_metadata ? sanitizeDisplay(challenge.resource_metadata) : undefined,\n challengeScope: challenge.scope ? sanitizeDisplay(challenge.scope) : undefined,\n challenge: sanitizeChallenge(challenge),\n };\n\n // Walk protected-resource metadata (RFC 9728 §3). Private-IP targets are\n // only allowed when the hop's origin matches the agent's.\n if (challenge.resource_metadata && isSafeHttpUrl(challenge.resource_metadata)) {\n const prm = await fetchJson(\n challenge.resource_metadata,\n allowPrivateIpForHop(challenge.resource_metadata),\n options.timeoutMs,\n options.fetchFn\n );\n if (prm && typeof prm === 'object') {\n const resource = (prm as { resource?: unknown }).resource;\n const servers = (prm as { authorization_servers?: unknown }).authorization_servers;\n if (typeof resource === 'string') requirements.resource = sanitizeDisplay(resource);\n if (Array.isArray(servers)) {\n const validServers = servers\n .filter((s: unknown): s is string => typeof s === 'string' && isSafeHttpUrl(s))\n .map(sanitizeDisplay);\n if (validServers.length > 0) {\n requirements.authorizationServers = validServers;\n requirements.authorizationServer = validServers[0];\n }\n }\n }\n }\n\n // Walk authorization-server metadata using the first issuer. RFC 8414 §3\n // first, then OIDC Discovery 1.0 fallback for AS deployments (Keycloak in\n // OIDC mode, Ping, ADFS) that only publish at\n // `{issuer}/.well-known/openid-configuration`.\n if (requirements.authorizationServer) {\n const asUrl = buildAuthorizationServerMetadataUrl(requirements.authorizationServer);\n let md: Record<string, unknown> | undefined;\n let source: 'rfc-8414' | 'openid-configuration' | undefined;\n if (asUrl) {\n const res = await fetchJson(asUrl, allowPrivateIpForHop(asUrl), options.timeoutMs, options.fetchFn);\n if (res && typeof res === 'object') {\n md = res as Record<string, unknown>;\n source = 'rfc-8414';\n }\n }\n if (!md) {\n const oidcUrl = buildOidcDiscoveryUrl(requirements.authorizationServer);\n if (oidcUrl) {\n const res = await fetchJson(oidcUrl, allowPrivateIpForHop(oidcUrl), options.timeoutMs, options.fetchFn);\n if (res && typeof res === 'object') {\n md = res as Record<string, unknown>;\n source = 'openid-configuration';\n }\n }\n }\n if (md) {\n requirements.metadataSource = source;\n if (typeof md.authorization_endpoint === 'string') {\n requirements.authorizationEndpoint = sanitizeDisplay(md.authorization_endpoint);\n }\n if (typeof md.token_endpoint === 'string') {\n requirements.tokenEndpoint = sanitizeDisplay(md.token_endpoint);\n }\n if (typeof md.registration_endpoint === 'string') {\n requirements.registrationEndpoint = sanitizeDisplay(md.registration_endpoint);\n }\n if (Array.isArray(md.scopes_supported)) {\n const scopes = md.scopes_supported\n .filter((s: unknown): s is string => typeof s === 'string')\n .slice(0, MAX_SCOPES)\n .map(sanitizeDisplay);\n if (scopes.length > 0) requirements.scopesSupported = scopes;\n }\n if (Array.isArray(md.grant_types_supported)) {\n const grants = md.grant_types_supported\n .filter((g: unknown): g is string => typeof g === 'string')\n .slice(0, 32)\n .map(sanitizeDisplay);\n if (grants.length > 0) requirements.grantTypesSupported = grants;\n }\n }\n }\n\n return requirements;\n}\n\n/**\n * Probe the agent for the parsed `WWW-Authenticate` challenge on a 401.\n *\n * Where `discoverAuthorizationRequirements` walks the full RFC 9728 → 8414\n * chain for Bearer/OAuth challenges, this helper is the catch-all: it works\n * for ANY scheme (Basic, Digest, Bearer-without-PRM, …) and returns the\n * structured challenge so callers can surface scheme-specific remediation\n * (e.g. \"use `--auth-scheme basic`\" when the gateway speaks RFC 7617).\n *\n * Returns `null` when the agent isn't responding with a 401, or when the\n * response carries no parseable `WWW-Authenticate`. Reuses `probeAgent401`\n * so the SSRF gate and timeout policy stay consistent with the OAuth path.\n */\nexport async function probeAuthChallenge(\n agentUrl: string,\n options: { allowPrivateIp?: boolean; timeoutMs?: number; fetchFn?: typeof fetch } = {}\n): Promise<WWWAuthenticateChallenge | null> {\n const probe = await probeAgent401(agentUrl, options.allowPrivateIp ?? false, options.timeoutMs, options.fetchFn);\n if (probe.status !== 401) return null;\n return parseWWWAuthenticate(probe.wwwAuthenticate ?? null);\n}\n\n/**\n * Fire a single unauthenticated `tools/list` at the agent and return the\n * status + `WWW-Authenticate` header. Used when the caller hasn't provided\n * a cached 401 response.\n */\nasync function probeAgent401(\n agentUrl: string,\n allowPrivateIp: boolean,\n timeoutMs?: number,\n fetchFn?: typeof fetch\n): Promise<{ status: number; wwwAuthenticate?: string }> {\n const body = JSON.stringify({ jsonrpc: '2.0', id: 1, method: 'tools/list' });\n try {\n const res = await ssrfSafeFetch(agentUrl, {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n accept: 'application/json',\n },\n body,\n allowPrivateIp,\n ...(timeoutMs !== undefined ? { timeoutMs } : {}),\n ...(fetchFn ? { trustedFetchFn: fetchFn } : {}),\n });\n return { status: res.status, wwwAuthenticate: res.headers['www-authenticate'] };\n } catch {\n return { status: 0 };\n }\n}\n\n/**\n * Check a URL is an absolute `http:`/`https:` URL before we hand it to\n * `ssrfSafeFetch`. Defeats `javascript:`, `file:`, `data:`, etc. the agent\n * might echo back in PRM or AS metadata. `ssrfSafeFetch` refuses non-HTTP\n * schemes too, but failing fast here gives a cleaner discovery flow and\n * avoids surfacing scheme errors as mysterious discovery misses.\n */\nfunction originOf(value: string): string | undefined {\n try {\n return new URL(value).origin;\n } catch {\n return undefined;\n }\n}\n\nfunction isSafeHttpUrl(value: string): boolean {\n try {\n const u = new URL(value);\n return u.protocol === 'https:' || u.protocol === 'http:';\n } catch {\n return false;\n }\n}\n\n/**\n * Build the authorization-server metadata URL for an issuer per RFC 8414 §3.\n *\n * For issuer `https://as.example.com/tenant1`, metadata lives at\n * `https://as.example.com/.well-known/oauth-authorization-server/tenant1`\n * (well-known prefix inserted BEFORE the issuer path, not after). This\n * matches how the MCP SDK and most authorization servers advertise metadata.\n */\nfunction buildAuthorizationServerMetadataUrl(issuer: string): string | undefined {\n if (!isSafeHttpUrl(issuer)) return undefined;\n const u = new URL(issuer);\n const pathname = u.pathname.endsWith('/') ? u.pathname.slice(0, -1) : u.pathname;\n return `${u.origin}/.well-known/oauth-authorization-server${pathname}`;\n}\n\n/**\n * OpenID Connect Discovery 1.0 fallback URL. Some authorization servers\n * (Keycloak in OIDC mode, Ping, ADFS) only publish metadata at\n * `{issuer}/.well-known/openid-configuration` — path *suffixed*, not\n * prefixed. The OIDC discovery doc carries `token_endpoint`,\n * `authorization_endpoint`, and `grant_types_supported` with the same\n * semantics as RFC 8414, so it's a safe read-through when the RFC 8414\n * probe misses.\n */\nfunction buildOidcDiscoveryUrl(issuer: string): string | undefined {\n if (!isSafeHttpUrl(issuer)) return undefined;\n const u = new URL(issuer);\n const base = u.pathname.endsWith('/') ? `${u.origin}${u.pathname.slice(0, -1)}` : `${u.origin}${u.pathname}`;\n return `${base}/.well-known/openid-configuration`;\n}\n\nasync function fetchJson(\n url: string,\n allowPrivateIp: boolean,\n timeoutMs?: number,\n fetchFn?: typeof fetch\n): Promise<unknown> {\n try {\n const res = await ssrfSafeFetch(url, {\n method: 'GET',\n headers: { accept: 'application/json' },\n allowPrivateIp,\n ...(timeoutMs !== undefined ? { timeoutMs } : {}),\n ...(fetchFn ? { trustedFetchFn: fetchFn } : {}),\n });\n if (res.status !== 200) return undefined;\n return decodeBodyAsJsonOrText(res.body, res.headers['content-type']);\n } catch {\n return undefined;\n }\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../../../src/lib/auth/oauth/authorization-required.ts"],"sourcesContent":["/**\n * Zero-config OAuth discovery + actionable authorization errors.\n *\n * When a library consumer calls an OAuth-gated MCP agent without saved\n * credentials, they get a `NeedsAuthorizationError` containing everything\n * needed to either run an interactive flow or present a clear prompt — no\n * re-probing required.\n *\n * Design note: this module only *discovers* — it never opens a browser or\n * writes state. Interactive flow handling stays in the caller (CLI or a\n * bespoke `OAuthFlowHandler`) so library behavior is predictable.\n */\nimport { ssrfSafeFetch, decodeBodyAsJsonOrText } from '../../net';\nimport { AuthenticationRequiredError, type OAuthMetadataInfo } from '../../errors';\nimport { throwIfAborted } from '../../protocols/abort';\nimport { parseWWWAuthenticate, type WWWAuthenticateChallenge } from './diagnostics';\n\n/**\n * Maximum length of an individual server-supplied string we copy into the\n * `AuthorizationRequirements` payload. Anything longer is truncated with a\n * `…` suffix so hostile agents can't smuggle megabyte error-descriptions\n * into operator-facing prompts and logs.\n */\nconst MAX_DISPLAY_STRING = 256;\n\n/**\n * Maximum number of scope strings we copy into `scopesSupported`. RFC 8414\n * allows an unbounded array; hostile servers have sent thousands.\n */\nconst MAX_SCOPES = 64;\n\n/**\n * Maximum number of auth-params we preserve under `challenge.params`. Bounds\n * memory pressure from hostile servers that pack the `WWW-Authenticate`\n * header with unknown auth-params.\n */\nconst MAX_CHALLENGE_PARAMS = 32;\n\n/**\n * Strip ASCII control characters (excluding TAB) from a server-supplied\n * string that may be shown to a human. Defeats terminal-hijack tricks like\n * `\\x1b]0;pwned\\x07` (rewrites terminal title), `\\r` (overwrites prompt),\n * and `\\x1b[2J` (clears screen). Also truncates over-long values.\n */\nfunction sanitizeDisplay(value: string): string {\n const stripped = value.replace(/[\\x00-\\x08\\x0b-\\x1f\\x7f]/g, '');\n if (stripped.length <= MAX_DISPLAY_STRING) return stripped;\n return `${stripped.slice(0, MAX_DISPLAY_STRING - 1)}…`;\n}\n\n/**\n * Sanitize the parsed `WWW-Authenticate` challenge before embedding it in a\n * `NeedsAuthorizationError`. Consumers that render `requirements.challenge`\n * to a terminal should never see control characters. Caps `params` count to\n * bound hostile servers.\n *\n * The `scheme` is already lowercased + token-constrained by the parser.\n * Param keys are also token-constrained so they're safe; only values need\n * sanitizing.\n */\nfunction sanitizeChallenge(c: WWWAuthenticateChallenge): WWWAuthenticateChallenge {\n const params: Record<string, string> = {};\n for (const [k, v] of Object.entries(c.params)) {\n if (Object.keys(params).length >= MAX_CHALLENGE_PARAMS) break;\n params[k] = sanitizeDisplay(v);\n }\n return {\n scheme: c.scheme,\n ...(c.realm !== undefined ? { realm: sanitizeDisplay(c.realm) } : {}),\n ...(c.error !== undefined ? { error: sanitizeDisplay(c.error) } : {}),\n ...(c.error_description !== undefined ? { error_description: sanitizeDisplay(c.error_description) } : {}),\n ...(c.scope !== undefined ? { scope: sanitizeDisplay(c.scope) } : {}),\n ...(c.resource_metadata !== undefined ? { resource_metadata: sanitizeDisplay(c.resource_metadata) } : {}),\n params,\n };\n}\n\n/**\n * Structured description of what an agent's authorization server requires\n * before it will accept a `tools/call`. Produced by\n * {@link discoverAuthorizationRequirements}.\n */\nexport interface AuthorizationRequirements {\n /** The agent URL we probed. */\n agentUrl: string;\n /** Resource URL the agent advertises in its `WWW-Authenticate` / PRM (RFC 9728). */\n resource?: string;\n /** URL of the protected-resource-metadata document (from `WWW-Authenticate: resource_metadata=…`). */\n resourceMetadataUrl?: string;\n /** First `authorization_servers[0]` from the protected-resource metadata. */\n authorizationServer?: string;\n /**\n * All `authorization_servers` advertised by the PRM, in declaration order.\n * The walker only probes `[0]` (PRM preference order — see RFC 9728 §3.3);\n * the full list is exposed so callers can surface multi-issuer deployments\n * in diagnostics. A length > 1 is uncommon and worth flagging to the\n * operator — typically a federation partner or a staged migration.\n */\n authorizationServers?: string[];\n /** `authorization_endpoint` from the authorization-server metadata (RFC 8414). */\n authorizationEndpoint?: string;\n /** `token_endpoint` from the authorization-server metadata. */\n tokenEndpoint?: string;\n /** `registration_endpoint` if the AS supports RFC 7591 dynamic client registration. */\n registrationEndpoint?: string;\n /** Scopes advertised by the AS (RFC 8414 `scopes_supported`). */\n scopesSupported?: string[];\n /**\n * `grant_types_supported` advertised by the AS (RFC 8414). `undefined` when\n * the AS didn't publish the field — per RFC 8414 that defaults to\n * `[\"authorization_code\", \"implicit\"]`. Clients should treat absence as\n * \"unknown, try your grant and see,\" not as proof the grant is unsupported.\n */\n grantTypesSupported?: string[];\n /** True when the AS metadata came from the OIDC fallback URL rather than RFC 8414. */\n metadataSource?: 'rfc-8414' | 'openid-configuration';\n /** Scope hinted in the `WWW-Authenticate` challenge's `scope` auth-param. */\n challengeScope?: string;\n /** Raw parsed challenge the agent returned on the 401. */\n challenge: WWWAuthenticateChallenge;\n}\n\n/**\n * Error raised when an agent returns a 401 and we do not have credentials\n * to satisfy it. Carries everything needed to run an interactive OAuth flow\n * or show the operator an actionable prompt.\n *\n * Extends {@link AuthenticationRequiredError} so existing callers that catch\n * `AuthenticationRequiredError` automatically receive the richer variant —\n * they can downcast with `instanceof NeedsAuthorizationError` when they\n * want walked discovery metadata.\n *\n * Note on `code` vs `subCode`:\n * The parent class declares `readonly code = 'AUTHENTICATION_REQUIRED'` as\n * a class field that re-initializes on every construction, so a child-side\n * override attempt is silently overwritten under `useDefineForClassFields`.\n * The narrow discriminator is exposed as `subCode` — prefer\n * `instanceof NeedsAuthorizationError` for type-narrowing and use `subCode`\n * only for structured-log keying.\n *\n * Note on `hasOAuth`:\n * The inherited getter returns `true` only when both `authorization_endpoint`\n * and `token_endpoint` were walked successfully. A partially-walked\n * requirements record (PRM reachable but AS metadata missing) still yields\n * `hasOAuth === false` even though `requirements.authorizationServer` is set.\n * Treat it as \"we have enough to start a flow,\" not \"server wants OAuth.\"\n */\nexport class NeedsAuthorizationError extends AuthenticationRequiredError {\n /** Narrow discriminator for consumers that already know about this class. */\n readonly subCode = 'needs_authorization' as const;\n readonly requirements: AuthorizationRequirements;\n\n constructor(requirements: AuthorizationRequirements, message?: string) {\n super(requirements.agentUrl, synthesizeOAuthMetadata(requirements), message ?? defaultMessage(requirements));\n this.name = 'NeedsAuthorizationError';\n this.requirements = requirements;\n // Extend the parent's `details` payload so structured-logging consumers\n // that read `err.details` (via `extractErrorInfo` or equivalent) see the\n // full walked chain, not just the synthesized one-hop oauthMetadata.\n this.details = { ...(this.details as object | undefined), requirements };\n }\n}\n\n/**\n * Build an {@link OAuthMetadataInfo} for the base-class constructor so that\n * legacy callers still see a non-empty `oauthMetadata` + working\n * `hasOAuth`/`authorizationUrl` getters on the error. When discovery didn't\n * yield enough info, return undefined and let the base class degrade\n * gracefully.\n */\nfunction synthesizeOAuthMetadata(req: AuthorizationRequirements): OAuthMetadataInfo | undefined {\n if (!req.authorizationEndpoint || !req.tokenEndpoint) return undefined;\n return {\n authorization_endpoint: req.authorizationEndpoint,\n token_endpoint: req.tokenEndpoint,\n ...(req.registrationEndpoint ? { registration_endpoint: req.registrationEndpoint } : {}),\n ...(req.authorizationServer ? { issuer: req.authorizationServer } : {}),\n };\n}\n\nfunction defaultMessage(req: AuthorizationRequirements): string {\n const parts = [`Agent ${sanitizeDisplay(req.agentUrl)} requires OAuth authorization.`];\n if (req.authorizationServer) {\n parts.push(`Authorization server: ${req.authorizationServer}.`);\n }\n if (req.challenge.error_description) {\n parts.push(`Server said: ${sanitizeDisplay(req.challenge.error_description)}.`);\n }\n parts.push('Provide an OAuthFlowHandler or run an interactive flow to complete authorization.');\n return parts.join(' ');\n}\n\n/**\n * Options for {@link discoverAuthorizationRequirements}.\n */\nexport interface DiscoverAuthorizationOptions {\n /** Allow http:// and private-IP probe targets. Default false. */\n allowPrivateIp?: boolean;\n /** Override per-probe HTTP timeout (ms). Default inherits from ssrfSafeFetch (10s). */\n timeoutMs?: number;\n /** Scoped fetch implementation for the agent, PRM, and AS metadata probes. */\n fetchFn?: typeof fetch;\n /** Caller cancellation, including the absolute task deadline. */\n signal?: AbortSignal;\n /**\n * If provided, use this `WWW-Authenticate` header verbatim instead of\n * re-probing the agent. Use this when you already have a 401 response in\n * hand and want to avoid a second round-trip.\n */\n wwwAuthenticate?: string;\n}\n\n/**\n * Walk the OAuth discovery chain starting from an agent URL. Returns\n * `AuthorizationRequirements` when the agent demands OAuth, or `null` when a\n * `tools/list` call succeeds without credentials.\n *\n * Strategy:\n * 1. POST `tools/list` to the agent with no `Authorization` header.\n * 2. If 401 + `WWW-Authenticate: Bearer`: parse the challenge.\n * 3. If the challenge carries `resource_metadata=…`: GET it and read\n * `resource` + `authorization_servers`.\n * 4. For the first `authorization_servers[0]`: GET `/.well-known/oauth-authorization-server`\n * and read `authorization_endpoint`, `token_endpoint`, `registration_endpoint`,\n * `scopes_supported`.\n * 5. Return a structured record.\n *\n * Anything missing from the chain surfaces as `undefined` on the result —\n * callers can still present a partial picture without re-probing.\n */\nexport async function discoverAuthorizationRequirements(\n agentUrl: string,\n options: DiscoverAuthorizationOptions = {}\n): Promise<AuthorizationRequirements | null> {\n // `allowPrivateIp` authorizes the agent probe. Chain hops (PRM, AS\n // metadata) inherit that trust ONLY when they share the agent's origin —\n // a compromised agent that advertises a private-IP authorization server\n // on a different origin would otherwise pivot a discovery walk into the\n // host's internal network.\n const allowPrivateIpOnAgent = options.allowPrivateIp ?? false;\n const agentOrigin = originOf(agentUrl);\n const allowPrivateIpForHop = (url: string): boolean =>\n allowPrivateIpOnAgent && agentOrigin !== undefined && originOf(url) === agentOrigin;\n\n let challengeHeader = options.wwwAuthenticate;\n if (!challengeHeader) {\n const probe = await probeAgent401(\n agentUrl,\n allowPrivateIpOnAgent,\n options.timeoutMs,\n options.fetchFn,\n options.signal\n );\n if (probe.status !== 401) {\n // 200, 403, 5xx, or network error — not an OAuth 401 we can act on.\n return null;\n }\n challengeHeader = probe.wwwAuthenticate;\n }\n\n const challenge = parseWWWAuthenticate(challengeHeader ?? null);\n if (!challenge || challenge.scheme !== 'bearer') {\n // A 401 without a Bearer challenge isn't our kind of problem — let it propagate.\n return null;\n }\n\n const requirements: AuthorizationRequirements = {\n agentUrl,\n resourceMetadataUrl: challenge.resource_metadata ? sanitizeDisplay(challenge.resource_metadata) : undefined,\n challengeScope: challenge.scope ? sanitizeDisplay(challenge.scope) : undefined,\n challenge: sanitizeChallenge(challenge),\n };\n\n // Walk protected-resource metadata (RFC 9728 §3). Private-IP targets are\n // only allowed when the hop's origin matches the agent's.\n if (challenge.resource_metadata && isSafeHttpUrl(challenge.resource_metadata)) {\n const prm = await fetchJson(\n challenge.resource_metadata,\n allowPrivateIpForHop(challenge.resource_metadata),\n options.timeoutMs,\n options.fetchFn,\n options.signal\n );\n if (prm && typeof prm === 'object') {\n const resource = (prm as { resource?: unknown }).resource;\n const servers = (prm as { authorization_servers?: unknown }).authorization_servers;\n if (typeof resource === 'string') requirements.resource = sanitizeDisplay(resource);\n if (Array.isArray(servers)) {\n const validServers = servers\n .filter((s: unknown): s is string => typeof s === 'string' && isSafeHttpUrl(s))\n .map(sanitizeDisplay);\n if (validServers.length > 0) {\n requirements.authorizationServers = validServers;\n requirements.authorizationServer = validServers[0];\n }\n }\n }\n }\n\n // Walk authorization-server metadata using the first issuer. RFC 8414 §3\n // first, then OIDC Discovery 1.0 fallback for AS deployments (Keycloak in\n // OIDC mode, Ping, ADFS) that only publish at\n // `{issuer}/.well-known/openid-configuration`.\n if (requirements.authorizationServer) {\n const asUrl = buildAuthorizationServerMetadataUrl(requirements.authorizationServer);\n let md: Record<string, unknown> | undefined;\n let source: 'rfc-8414' | 'openid-configuration' | undefined;\n if (asUrl) {\n const res = await fetchJson(\n asUrl,\n allowPrivateIpForHop(asUrl),\n options.timeoutMs,\n options.fetchFn,\n options.signal\n );\n if (res && typeof res === 'object') {\n md = res as Record<string, unknown>;\n source = 'rfc-8414';\n }\n }\n if (!md) {\n const oidcUrl = buildOidcDiscoveryUrl(requirements.authorizationServer);\n if (oidcUrl) {\n const res = await fetchJson(\n oidcUrl,\n allowPrivateIpForHop(oidcUrl),\n options.timeoutMs,\n options.fetchFn,\n options.signal\n );\n if (res && typeof res === 'object') {\n md = res as Record<string, unknown>;\n source = 'openid-configuration';\n }\n }\n }\n if (md) {\n requirements.metadataSource = source;\n if (typeof md.authorization_endpoint === 'string') {\n requirements.authorizationEndpoint = sanitizeDisplay(md.authorization_endpoint);\n }\n if (typeof md.token_endpoint === 'string') {\n requirements.tokenEndpoint = sanitizeDisplay(md.token_endpoint);\n }\n if (typeof md.registration_endpoint === 'string') {\n requirements.registrationEndpoint = sanitizeDisplay(md.registration_endpoint);\n }\n if (Array.isArray(md.scopes_supported)) {\n const scopes = md.scopes_supported\n .filter((s: unknown): s is string => typeof s === 'string')\n .slice(0, MAX_SCOPES)\n .map(sanitizeDisplay);\n if (scopes.length > 0) requirements.scopesSupported = scopes;\n }\n if (Array.isArray(md.grant_types_supported)) {\n const grants = md.grant_types_supported\n .filter((g: unknown): g is string => typeof g === 'string')\n .slice(0, 32)\n .map(sanitizeDisplay);\n if (grants.length > 0) requirements.grantTypesSupported = grants;\n }\n }\n }\n\n return requirements;\n}\n\n/**\n * Probe the agent for the parsed `WWW-Authenticate` challenge on a 401.\n *\n * Where `discoverAuthorizationRequirements` walks the full RFC 9728 → 8414\n * chain for Bearer/OAuth challenges, this helper is the catch-all: it works\n * for ANY scheme (Basic, Digest, Bearer-without-PRM, …) and returns the\n * structured challenge so callers can surface scheme-specific remediation\n * (e.g. \"use `--auth-scheme basic`\" when the gateway speaks RFC 7617).\n *\n * Returns `null` when the agent isn't responding with a 401, or when the\n * response carries no parseable `WWW-Authenticate`. Reuses `probeAgent401`\n * so the SSRF gate and timeout policy stay consistent with the OAuth path.\n */\nexport async function probeAuthChallenge(\n agentUrl: string,\n options: { allowPrivateIp?: boolean; timeoutMs?: number; fetchFn?: typeof fetch; signal?: AbortSignal } = {}\n): Promise<WWWAuthenticateChallenge | null> {\n const probe = await probeAgent401(\n agentUrl,\n options.allowPrivateIp ?? false,\n options.timeoutMs,\n options.fetchFn,\n options.signal\n );\n if (probe.status !== 401) return null;\n return parseWWWAuthenticate(probe.wwwAuthenticate ?? null);\n}\n\n/**\n * Fire a single unauthenticated `tools/list` at the agent and return the\n * status + `WWW-Authenticate` header. Used when the caller hasn't provided\n * a cached 401 response.\n */\nasync function probeAgent401(\n agentUrl: string,\n allowPrivateIp: boolean,\n timeoutMs?: number,\n fetchFn?: typeof fetch,\n signal?: AbortSignal\n): Promise<{ status: number; wwwAuthenticate?: string }> {\n const body = JSON.stringify({ jsonrpc: '2.0', id: 1, method: 'tools/list' });\n try {\n const res = await ssrfSafeFetch(agentUrl, {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n accept: 'application/json',\n },\n body,\n allowPrivateIp,\n signal,\n ...(timeoutMs !== undefined ? { timeoutMs } : {}),\n ...(fetchFn ? { trustedFetchFn: fetchFn } : {}),\n });\n return { status: res.status, wwwAuthenticate: res.headers['www-authenticate'] };\n } catch {\n throwIfAborted(signal);\n return { status: 0 };\n }\n}\n\n/**\n * Check a URL is an absolute `http:`/`https:` URL before we hand it to\n * `ssrfSafeFetch`. Defeats `javascript:`, `file:`, `data:`, etc. the agent\n * might echo back in PRM or AS metadata. `ssrfSafeFetch` refuses non-HTTP\n * schemes too, but failing fast here gives a cleaner discovery flow and\n * avoids surfacing scheme errors as mysterious discovery misses.\n */\nfunction originOf(value: string): string | undefined {\n try {\n return new URL(value).origin;\n } catch {\n return undefined;\n }\n}\n\nfunction isSafeHttpUrl(value: string): boolean {\n try {\n const u = new URL(value);\n return u.protocol === 'https:' || u.protocol === 'http:';\n } catch {\n return false;\n }\n}\n\n/**\n * Build the authorization-server metadata URL for an issuer per RFC 8414 §3.\n *\n * For issuer `https://as.example.com/tenant1`, metadata lives at\n * `https://as.example.com/.well-known/oauth-authorization-server/tenant1`\n * (well-known prefix inserted BEFORE the issuer path, not after). This\n * matches how the MCP SDK and most authorization servers advertise metadata.\n */\nfunction buildAuthorizationServerMetadataUrl(issuer: string): string | undefined {\n if (!isSafeHttpUrl(issuer)) return undefined;\n const u = new URL(issuer);\n const pathname = u.pathname.endsWith('/') ? u.pathname.slice(0, -1) : u.pathname;\n return `${u.origin}/.well-known/oauth-authorization-server${pathname}`;\n}\n\n/**\n * OpenID Connect Discovery 1.0 fallback URL. Some authorization servers\n * (Keycloak in OIDC mode, Ping, ADFS) only publish metadata at\n * `{issuer}/.well-known/openid-configuration` — path *suffixed*, not\n * prefixed. The OIDC discovery doc carries `token_endpoint`,\n * `authorization_endpoint`, and `grant_types_supported` with the same\n * semantics as RFC 8414, so it's a safe read-through when the RFC 8414\n * probe misses.\n */\nfunction buildOidcDiscoveryUrl(issuer: string): string | undefined {\n if (!isSafeHttpUrl(issuer)) return undefined;\n const u = new URL(issuer);\n const base = u.pathname.endsWith('/') ? `${u.origin}${u.pathname.slice(0, -1)}` : `${u.origin}${u.pathname}`;\n return `${base}/.well-known/openid-configuration`;\n}\n\nasync function fetchJson(\n url: string,\n allowPrivateIp: boolean,\n timeoutMs?: number,\n fetchFn?: typeof fetch,\n signal?: AbortSignal\n): Promise<unknown> {\n try {\n const res = await ssrfSafeFetch(url, {\n method: 'GET',\n headers: { accept: 'application/json' },\n allowPrivateIp,\n signal,\n ...(timeoutMs !== undefined ? { timeoutMs } : {}),\n ...(fetchFn ? { trustedFetchFn: fetchFn } : {}),\n });\n if (res.status !== 200) return undefined;\n return decodeBodyAsJsonOrText(res.body, res.headers['content-type']);\n } catch {\n throwIfAborted(signal);\n return undefined;\n }\n}\n"],"mappings":"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","names":[]}
|
|
@@ -36,6 +36,8 @@ export interface DiscoveryOptions {
|
|
|
36
36
|
timeout?: number;
|
|
37
37
|
/** Custom fetch function (for testing or custom HTTP handling) */
|
|
38
38
|
fetch?: typeof fetch;
|
|
39
|
+
/** Caller cancellation, including the absolute task deadline. */
|
|
40
|
+
signal?: AbortSignal;
|
|
39
41
|
}
|
|
40
42
|
/**
|
|
41
43
|
* Discover OAuth metadata from an MCP server
|
|
@@ -36,6 +36,8 @@ export interface DiscoveryOptions {
|
|
|
36
36
|
timeout?: number;
|
|
37
37
|
/** Custom fetch function (for testing or custom HTTP handling) */
|
|
38
38
|
fetch?: typeof fetch;
|
|
39
|
+
/** Caller cancellation, including the absolute task deadline. */
|
|
40
|
+
signal?: AbortSignal;
|
|
39
41
|
}
|
|
40
42
|
/**
|
|
41
43
|
* Discover OAuth metadata from an MCP server
|