@adcp/sdk 13.0.0-rc.6 → 13.0.0-rc.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1441) hide show
  1. package/ADCP_VERSION +1 -1
  2. package/compliance/cache/{3.1.8 → 3.1.10}/domains/media-buy/index.yaml +1 -0
  3. package/compliance/cache/3.1.10/domains/media-buy/scenarios/dependency_impairment_audience.yaml +317 -0
  4. package/compliance/cache/{3.1.8 → 3.1.10}/index.json +3 -3
  5. package/compliance/cache/{3.1.8.previous/domains → 3.1.10/protocols}/media-buy/index.yaml +1 -0
  6. package/compliance/cache/3.1.10/protocols/media-buy/scenarios/dependency_impairment_audience.yaml +317 -0
  7. package/compliance/cache/{3.1.8.previous → 3.1.10}/universal/runner-output-contract.yaml +1 -1
  8. package/compliance/cache/{3.1.8/protocols → 3.1.10.previous/domains}/media-buy/index.yaml +1 -0
  9. package/compliance/cache/3.1.10.previous/domains/media-buy/scenarios/dependency_impairment_audience.yaml +317 -0
  10. package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/index.json +3 -3
  11. package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/protocols/media-buy/index.yaml +1 -0
  12. package/compliance/cache/3.1.10.previous/protocols/media-buy/scenarios/dependency_impairment_audience.yaml +317 -0
  13. package/compliance/cache/{3.1.8 → 3.1.10.previous}/universal/runner-output-contract.yaml +1 -1
  14. package/dist/lib/adapters/legacy/v2-5/sync_creatives.d.mts +4 -3
  15. package/dist/lib/adapters/legacy/v2-5/sync_creatives.d.ts +4 -3
  16. package/dist/lib/adapters/legacy/v2-5/sync_creatives.d.ts.map +1 -1
  17. package/dist/lib/adapters/legacy/v2-5/sync_creatives.js.map +1 -1
  18. package/dist/lib/adapters/legacy/v2-5/sync_creatives.mjs.map +1 -1
  19. package/dist/lib/auth/oauth/MCPOAuthProvider.d.mts +2 -0
  20. package/dist/lib/auth/oauth/MCPOAuthProvider.d.ts +2 -0
  21. package/dist/lib/auth/oauth/MCPOAuthProvider.d.ts.map +1 -1
  22. package/dist/lib/auth/oauth/MCPOAuthProvider.js +8 -7
  23. package/dist/lib/auth/oauth/MCPOAuthProvider.js.map +1 -1
  24. package/dist/lib/auth/oauth/MCPOAuthProvider.mjs +8 -7
  25. package/dist/lib/auth/oauth/MCPOAuthProvider.mjs.map +1 -1
  26. package/dist/lib/auth/oauth/file-storage.d.mts +2 -1
  27. package/dist/lib/auth/oauth/file-storage.d.ts +2 -1
  28. package/dist/lib/auth/oauth/file-storage.d.ts.map +1 -1
  29. package/dist/lib/auth/oauth/file-storage.js +5 -1
  30. package/dist/lib/auth/oauth/file-storage.js.map +1 -1
  31. package/dist/lib/auth/oauth/file-storage.mjs +5 -1
  32. package/dist/lib/auth/oauth/file-storage.mjs.map +1 -1
  33. package/dist/lib/auth/oauth/index.d.mts +5 -1
  34. package/dist/lib/auth/oauth/index.d.ts +5 -1
  35. package/dist/lib/auth/oauth/index.d.ts.map +1 -1
  36. package/dist/lib/auth/oauth/index.js +4 -0
  37. package/dist/lib/auth/oauth/index.js.map +1 -1
  38. package/dist/lib/auth/oauth/index.mjs +4 -0
  39. package/dist/lib/auth/oauth/index.mjs.map +1 -1
  40. package/dist/lib/auth/oauth/resource-url.d.mts +4 -0
  41. package/dist/lib/auth/oauth/resource-url.d.ts +5 -0
  42. package/dist/lib/auth/oauth/resource-url.d.ts.map +1 -0
  43. package/dist/lib/auth/oauth/resource-url.js +51 -0
  44. package/dist/lib/auth/oauth/resource-url.js.map +1 -0
  45. package/dist/lib/auth/oauth/resource-url.mjs +27 -0
  46. package/dist/lib/auth/oauth/resource-url.mjs.map +1 -0
  47. package/dist/lib/auth/oauth/types.d.mts +7 -0
  48. package/dist/lib/auth/oauth/types.d.ts +7 -0
  49. package/dist/lib/auth/oauth/types.d.ts.map +1 -1
  50. package/dist/lib/auth/oauth/types.js.map +1 -1
  51. package/dist/lib/auth/oauth/types.mjs.map +1 -1
  52. package/dist/lib/auth/oauth/web-flow.d.mts +30 -5
  53. package/dist/lib/auth/oauth/web-flow.d.ts +30 -5
  54. package/dist/lib/auth/oauth/web-flow.d.ts.map +1 -1
  55. package/dist/lib/auth/oauth/web-flow.js +52 -8
  56. package/dist/lib/auth/oauth/web-flow.js.map +1 -1
  57. package/dist/lib/auth/oauth/web-flow.mjs +51 -8
  58. package/dist/lib/auth/oauth/web-flow.mjs.map +1 -1
  59. package/dist/lib/core/AgentClient.d.mts +2 -2
  60. package/dist/lib/core/AgentClient.d.ts +2 -2
  61. package/dist/lib/core/AgentClient.d.ts.map +1 -1
  62. package/dist/lib/core/AgentClient.js.map +1 -1
  63. package/dist/lib/core/AgentClient.mjs.map +1 -1
  64. package/dist/lib/registry/types.generated.d.mts +72 -9
  65. package/dist/lib/registry/types.generated.d.ts +72 -9
  66. package/dist/lib/registry/types.generated.d.ts.map +1 -1
  67. package/dist/lib/registry/types.generated.js.map +1 -1
  68. package/dist/lib/schemas-data/3.1/a2ui/bound-value.json +1 -1
  69. package/dist/lib/schemas-data/3.1/a2ui/component.json +1 -1
  70. package/dist/lib/schemas-data/3.1/a2ui/si-catalog.json +25 -25
  71. package/dist/lib/schemas-data/3.1/a2ui/surface.json +2 -2
  72. package/dist/lib/schemas-data/3.1/a2ui/user-action.json +1 -1
  73. package/dist/lib/schemas-data/3.1/aao/agent-publishers.json +1 -1
  74. package/dist/lib/schemas-data/3.1/account/get-account-financials-request.json +6 -6
  75. package/dist/lib/schemas-data/3.1/account/get-account-financials-response.json +12 -12
  76. package/dist/lib/schemas-data/3.1/account/list-accounts-request.json +6 -6
  77. package/dist/lib/schemas-data/3.1/account/list-accounts-response.json +8 -8
  78. package/dist/lib/schemas-data/3.1/account/report-usage-request.json +6 -6
  79. package/dist/lib/schemas-data/3.1/account/report-usage-response.json +6 -6
  80. package/dist/lib/schemas-data/3.1/account/sync-accounts-request.json +12 -12
  81. package/dist/lib/schemas-data/3.1/account/sync-accounts-response.json +16 -16
  82. package/dist/lib/schemas-data/3.1/account/sync-governance-request.json +6 -6
  83. package/dist/lib/schemas-data/3.1/account/sync-governance-response.json +10 -10
  84. package/dist/lib/schemas-data/3.1/adagents.json +29 -29
  85. package/dist/lib/schemas-data/3.1/brand/acquire-rights-request.json +10 -10
  86. package/dist/lib/schemas-data/3.1/brand/acquire-rights-response.json +16 -16
  87. package/dist/lib/schemas-data/3.1/brand/creative-approval-request.json +5 -5
  88. package/dist/lib/schemas-data/3.1/brand/creative-approval-response.json +12 -12
  89. package/dist/lib/schemas-data/3.1/brand/get-brand-identity-request.json +4 -4
  90. package/dist/lib/schemas-data/3.1/brand/get-brand-identity-response.json +10 -10
  91. package/dist/lib/schemas-data/3.1/brand/get-rights-request.json +8 -8
  92. package/dist/lib/schemas-data/3.1/brand/get-rights-response.json +11 -11
  93. package/dist/lib/schemas-data/3.1/brand/revocation-notification.json +4 -4
  94. package/dist/lib/schemas-data/3.1/brand/rights-pricing-option.json +5 -5
  95. package/dist/lib/schemas-data/3.1/brand/rights-terms.json +3 -3
  96. package/dist/lib/schemas-data/3.1/brand/search-brands-request.json +6 -6
  97. package/dist/lib/schemas-data/3.1/brand/search-brands-response.json +11 -11
  98. package/dist/lib/schemas-data/3.1/brand/update-rights-request.json +6 -6
  99. package/dist/lib/schemas-data/3.1/brand/update-rights-response.json +11 -11
  100. package/dist/lib/schemas-data/3.1/brand/verification-status.json +1 -1
  101. package/dist/lib/schemas-data/3.1/brand/verify-brand-claim-request.json +2 -2
  102. package/dist/lib/schemas-data/3.1/brand/verify-brand-claim-response.json +13 -13
  103. package/dist/lib/schemas-data/3.1/brand/verify-brand-claims-request.json +2 -2
  104. package/dist/lib/schemas-data/3.1/brand/verify-brand-claims-response.json +13 -13
  105. package/dist/lib/schemas-data/3.1/brand.json +21 -21
  106. package/dist/lib/schemas-data/3.1/bundled/content-standards/calibrate-content-request.json +12 -12
  107. package/dist/lib/schemas-data/3.1/bundled/content-standards/calibrate-content-response.json +12 -12
  108. package/dist/lib/schemas-data/3.1/bundled/content-standards/create-content-standards-request.json +16 -16
  109. package/dist/lib/schemas-data/3.1/bundled/content-standards/create-content-standards-response.json +10 -10
  110. package/dist/lib/schemas-data/3.1/bundled/content-standards/get-content-standards-request.json +5 -5
  111. package/dist/lib/schemas-data/3.1/bundled/content-standards/get-content-standards-response.json +23 -23
  112. package/dist/lib/schemas-data/3.1/bundled/content-standards/get-media-buy-artifacts-request.json +16 -16
  113. package/dist/lib/schemas-data/3.1/bundled/content-standards/get-media-buy-artifacts-response.json +18 -18
  114. package/dist/lib/schemas-data/3.1/bundled/content-standards/list-content-standards-request.json +7 -7
  115. package/dist/lib/schemas-data/3.1/bundled/content-standards/list-content-standards-response.json +24 -24
  116. package/dist/lib/schemas-data/3.1/bundled/content-standards/update-content-standards-request.json +16 -16
  117. package/dist/lib/schemas-data/3.1/bundled/content-standards/update-content-standards-response.json +10 -10
  118. package/dist/lib/schemas-data/3.1/bundled/content-standards/validate-content-delivery-request.json +12 -12
  119. package/dist/lib/schemas-data/3.1/bundled/content-standards/validate-content-delivery-response.json +12 -12
  120. package/dist/lib/schemas-data/3.1/bundled/core/tasks-get-request.json +16 -16
  121. package/dist/lib/schemas-data/3.1/bundled/core/tasks-get-response.json +181 -181
  122. package/dist/lib/schemas-data/3.1/bundled/core/tasks-list-request.json +21 -21
  123. package/dist/lib/schemas-data/3.1/bundled/core/tasks-list-response.json +11 -11
  124. package/dist/lib/schemas-data/3.1/bundled/creative/get-creative-delivery-request.json +17 -17
  125. package/dist/lib/schemas-data/3.1/bundled/creative/get-creative-delivery-response.json +56 -56
  126. package/dist/lib/schemas-data/3.1/bundled/creative/get-creative-features-request.json +44 -44
  127. package/dist/lib/schemas-data/3.1/bundled/creative/get-creative-features-response.json +13 -13
  128. package/dist/lib/schemas-data/3.1/bundled/creative/list-creative-formats-request.json +16 -16
  129. package/dist/lib/schemas-data/3.1/bundled/creative/list-creative-formats-response.json +48 -48
  130. package/dist/lib/schemas-data/3.1/bundled/creative/list-creatives-request.json +17 -17
  131. package/dist/lib/schemas-data/3.1/bundled/creative/list-creatives-response.json +58 -58
  132. package/dist/lib/schemas-data/3.1/bundled/creative/list-transformers-request.json +18 -18
  133. package/dist/lib/schemas-data/3.1/bundled/creative/list-transformers-response.json +16 -16
  134. package/dist/lib/schemas-data/3.1/bundled/creative/preview-creative-request.json +44 -44
  135. package/dist/lib/schemas-data/3.1/bundled/creative/preview-creative-response.json +50 -50
  136. package/dist/lib/schemas-data/3.1/bundled/creative/sync-creatives-request.json +46 -46
  137. package/dist/lib/schemas-data/3.1/bundled/creative/sync-creatives-response.json +27 -27
  138. package/dist/lib/schemas-data/3.1/bundled/creative/validate-input-request.json +42 -42
  139. package/dist/lib/schemas-data/3.1/bundled/creative/validate-input-response.json +10 -10
  140. package/dist/lib/schemas-data/3.1/bundled/media-buy/build-creative-request.json +53 -53
  141. package/dist/lib/schemas-data/3.1/bundled/media-buy/build-creative-response.json +54 -54
  142. package/dist/lib/schemas-data/3.1/bundled/media-buy/create-media-buy-request.json +83 -83
  143. package/dist/lib/schemas-data/3.1/bundled/media-buy/create-media-buy-response.json +77 -77
  144. package/dist/lib/schemas-data/3.1/bundled/media-buy/get-media-buy-delivery-request.json +25 -25
  145. package/dist/lib/schemas-data/3.1/bundled/media-buy/get-media-buy-delivery-response.json +40 -40
  146. package/dist/lib/schemas-data/3.1/bundled/media-buy/get-media-buys-request.json +18 -18
  147. package/dist/lib/schemas-data/3.1/bundled/media-buy/get-media-buys-response.json +65 -65
  148. package/dist/lib/schemas-data/3.1/bundled/media-buy/get-products-request.json +49 -49
  149. package/dist/lib/schemas-data/3.1/bundled/media-buy/get-products-response.json +99 -99
  150. package/dist/lib/schemas-data/3.1/bundled/media-buy/list-creative-formats-request.json +12 -12
  151. package/dist/lib/schemas-data/3.1/bundled/media-buy/list-creative-formats-response.json +48 -48
  152. package/dist/lib/schemas-data/3.1/bundled/media-buy/log-event-request.json +12 -12
  153. package/dist/lib/schemas-data/3.1/bundled/media-buy/log-event-response.json +10 -10
  154. package/dist/lib/schemas-data/3.1/bundled/media-buy/package-request.json +79 -79
  155. package/dist/lib/schemas-data/3.1/bundled/media-buy/provide-performance-feedback-request.json +8 -8
  156. package/dist/lib/schemas-data/3.1/bundled/media-buy/provide-performance-feedback-response.json +10 -10
  157. package/dist/lib/schemas-data/3.1/bundled/media-buy/sync-audiences-request.json +18 -18
  158. package/dist/lib/schemas-data/3.1/bundled/media-buy/sync-audiences-response.json +12 -12
  159. package/dist/lib/schemas-data/3.1/bundled/media-buy/sync-catalogs-request.json +26 -26
  160. package/dist/lib/schemas-data/3.1/bundled/media-buy/sync-catalogs-response.json +12 -12
  161. package/dist/lib/schemas-data/3.1/bundled/media-buy/sync-event-sources-request.json +19 -19
  162. package/dist/lib/schemas-data/3.1/bundled/media-buy/sync-event-sources-response.json +16 -16
  163. package/dist/lib/schemas-data/3.1/bundled/media-buy/update-media-buy-request.json +79 -79
  164. package/dist/lib/schemas-data/3.1/bundled/media-buy/update-media-buy-response.json +71 -71
  165. package/dist/lib/schemas-data/3.1/bundled/property/create-property-list-request.json +18 -18
  166. package/dist/lib/schemas-data/3.1/bundled/property/create-property-list-response.json +26 -26
  167. package/dist/lib/schemas-data/3.1/bundled/property/delete-property-list-request.json +16 -16
  168. package/dist/lib/schemas-data/3.1/bundled/property/delete-property-list-response.json +10 -10
  169. package/dist/lib/schemas-data/3.1/bundled/property/get-property-list-request.json +16 -16
  170. package/dist/lib/schemas-data/3.1/bundled/property/get-property-list-response.json +27 -27
  171. package/dist/lib/schemas-data/3.1/bundled/property/list-property-lists-request.json +17 -17
  172. package/dist/lib/schemas-data/3.1/bundled/property/list-property-lists-response.json +27 -27
  173. package/dist/lib/schemas-data/3.1/bundled/property/update-property-list-request.json +18 -18
  174. package/dist/lib/schemas-data/3.1/bundled/property/update-property-list-response.json +26 -26
  175. package/dist/lib/schemas-data/3.1/bundled/property/validate-property-delivery-request.json +19 -19
  176. package/dist/lib/schemas-data/3.1/bundled/property/validate-property-delivery-response.json +15 -15
  177. package/dist/lib/schemas-data/3.1/bundled/protocol/get-adcp-capabilities-request.json +5 -5
  178. package/dist/lib/schemas-data/3.1/bundled/protocol/get-adcp-capabilities-response.json +35 -35
  179. package/dist/lib/schemas-data/3.1/bundled/protocol/get-task-status-request.json +16 -16
  180. package/dist/lib/schemas-data/3.1/bundled/protocol/get-task-status-response.json +181 -181
  181. package/dist/lib/schemas-data/3.1/bundled/protocol/list-tasks-request.json +21 -21
  182. package/dist/lib/schemas-data/3.1/bundled/protocol/list-tasks-response.json +11 -11
  183. package/dist/lib/schemas-data/3.1/bundled/signals/activate-signal-request.json +17 -17
  184. package/dist/lib/schemas-data/3.1/bundled/signals/activate-signal-response.json +12 -12
  185. package/dist/lib/schemas-data/3.1/bundled/signals/get-signals-request.json +24 -24
  186. package/dist/lib/schemas-data/3.1/bundled/signals/get-signals-response.json +53 -53
  187. package/dist/lib/schemas-data/3.1/bundled/sponsored-intelligence/si-get-offering-request.json +5 -5
  188. package/dist/lib/schemas-data/3.1/bundled/sponsored-intelligence/si-get-offering-response.json +23 -23
  189. package/dist/lib/schemas-data/3.1/bundled/sponsored-intelligence/si-initiate-session-request.json +18 -18
  190. package/dist/lib/schemas-data/3.1/bundled/sponsored-intelligence/si-initiate-session-response.json +25 -25
  191. package/dist/lib/schemas-data/3.1/bundled/sponsored-intelligence/si-send-message-request.json +16 -16
  192. package/dist/lib/schemas-data/3.1/bundled/sponsored-intelligence/si-send-message-response.json +26 -26
  193. package/dist/lib/schemas-data/3.1/bundled/sponsored-intelligence/si-terminate-session-request.json +5 -5
  194. package/dist/lib/schemas-data/3.1/bundled/sponsored-intelligence/si-terminate-session-response.json +11 -11
  195. package/dist/lib/schemas-data/3.1/collection/base-collection-source.json +3 -3
  196. package/dist/lib/schemas-data/3.1/collection/collection-list-changed-webhook.json +2 -2
  197. package/dist/lib/schemas-data/3.1/collection/collection-list-filters.json +7 -7
  198. package/dist/lib/schemas-data/3.1/collection/collection-list.json +5 -5
  199. package/dist/lib/schemas-data/3.1/collection/create-collection-list-request.json +8 -8
  200. package/dist/lib/schemas-data/3.1/collection/create-collection-list-response.json +6 -6
  201. package/dist/lib/schemas-data/3.1/collection/delete-collection-list-request.json +5 -5
  202. package/dist/lib/schemas-data/3.1/collection/delete-collection-list-response.json +5 -5
  203. package/dist/lib/schemas-data/3.1/collection/get-collection-list-request.json +5 -5
  204. package/dist/lib/schemas-data/3.1/collection/get-collection-list-response.json +12 -12
  205. package/dist/lib/schemas-data/3.1/collection/list-collection-lists-request.json +6 -6
  206. package/dist/lib/schemas-data/3.1/collection/list-collection-lists-response.json +7 -7
  207. package/dist/lib/schemas-data/3.1/collection/update-collection-list-request.json +8 -8
  208. package/dist/lib/schemas-data/3.1/collection/update-collection-list-response.json +6 -6
  209. package/dist/lib/schemas-data/3.1/content-standards/artifact-webhook-payload.json +3 -3
  210. package/dist/lib/schemas-data/3.1/content-standards/artifact.json +7 -7
  211. package/dist/lib/schemas-data/3.1/content-standards/calibrate-content-request.json +5 -5
  212. package/dist/lib/schemas-data/3.1/content-standards/calibrate-content-response.json +10 -10
  213. package/dist/lib/schemas-data/3.1/content-standards/content-standards.json +7 -7
  214. package/dist/lib/schemas-data/3.1/content-standards/create-content-standards-request.json +8 -8
  215. package/dist/lib/schemas-data/3.1/content-standards/create-content-standards-response.json +8 -8
  216. package/dist/lib/schemas-data/3.1/content-standards/get-content-standards-request.json +4 -4
  217. package/dist/lib/schemas-data/3.1/content-standards/get-content-standards-response.json +9 -9
  218. package/dist/lib/schemas-data/3.1/content-standards/get-media-buy-artifacts-request.json +5 -5
  219. package/dist/lib/schemas-data/3.1/content-standards/get-media-buy-artifacts-response.json +10 -10
  220. package/dist/lib/schemas-data/3.1/content-standards/list-content-standards-request.json +6 -6
  221. package/dist/lib/schemas-data/3.1/content-standards/list-content-standards-response.json +10 -10
  222. package/dist/lib/schemas-data/3.1/content-standards/update-content-standards-request.json +8 -8
  223. package/dist/lib/schemas-data/3.1/content-standards/update-content-standards-response.json +8 -8
  224. package/dist/lib/schemas-data/3.1/content-standards/validate-content-delivery-request.json +5 -5
  225. package/dist/lib/schemas-data/3.1/content-standards/validate-content-delivery-response.json +10 -10
  226. package/dist/lib/schemas-data/3.1/core/account-authorization.json +1 -1
  227. package/dist/lib/schemas-data/3.1/core/account-ref.json +2 -2
  228. package/dist/lib/schemas-data/3.1/core/account-with-authorization.json +3 -3
  229. package/dist/lib/schemas-data/3.1/core/account.json +10 -10
  230. package/dist/lib/schemas-data/3.1/core/activation-key.json +1 -1
  231. package/dist/lib/schemas-data/3.1/core/ad-inventory-config.json +1 -1
  232. package/dist/lib/schemas-data/3.1/core/agent-encryption-key.json +1 -1
  233. package/dist/lib/schemas-data/3.1/core/agent-signing-key.json +1 -1
  234. package/dist/lib/schemas-data/3.1/core/app-item.json +4 -4
  235. package/dist/lib/schemas-data/3.1/core/asset-group-vocabulary.json +1 -1
  236. package/dist/lib/schemas-data/3.1/core/assets/asset-union.json +21 -21
  237. package/dist/lib/schemas-data/3.1/core/assets/audio-asset.json +3 -3
  238. package/dist/lib/schemas-data/3.1/core/assets/brief-asset.json +2 -2
  239. package/dist/lib/schemas-data/3.1/core/assets/card-asset.json +6 -6
  240. package/dist/lib/schemas-data/3.1/core/assets/catalog-asset.json +2 -2
  241. package/dist/lib/schemas-data/3.1/core/assets/css-asset.json +2 -2
  242. package/dist/lib/schemas-data/3.1/core/assets/daast-asset.json +4 -4
  243. package/dist/lib/schemas-data/3.1/core/assets/daast-tracker-asset.json +3 -3
  244. package/dist/lib/schemas-data/3.1/core/assets/html-asset.json +2 -2
  245. package/dist/lib/schemas-data/3.1/core/assets/image-asset.json +2 -2
  246. package/dist/lib/schemas-data/3.1/core/assets/javascript-asset.json +3 -3
  247. package/dist/lib/schemas-data/3.1/core/assets/markdown-asset.json +2 -2
  248. package/dist/lib/schemas-data/3.1/core/assets/pixel-tracker-asset.json +2 -2
  249. package/dist/lib/schemas-data/3.1/core/assets/published-post-asset.json +2 -2
  250. package/dist/lib/schemas-data/3.1/core/assets/text-asset.json +2 -2
  251. package/dist/lib/schemas-data/3.1/core/assets/url-asset.json +3 -3
  252. package/dist/lib/schemas-data/3.1/core/assets/vast-asset.json +4 -4
  253. package/dist/lib/schemas-data/3.1/core/assets/vast-tracker-asset.json +3 -3
  254. package/dist/lib/schemas-data/3.1/core/assets/video-asset.json +7 -7
  255. package/dist/lib/schemas-data/3.1/core/assets/webhook-asset.json +7 -7
  256. package/dist/lib/schemas-data/3.1/core/assets/zip-asset.json +2 -2
  257. package/dist/lib/schemas-data/3.1/core/async-response-data.json +29 -29
  258. package/dist/lib/schemas-data/3.1/core/async-response-refs/creative/sync-creatives-async-response-input-required.json +3 -3
  259. package/dist/lib/schemas-data/3.1/core/async-response-refs/creative/sync-creatives-async-response-submitted.json +4 -4
  260. package/dist/lib/schemas-data/3.1/core/async-response-refs/creative/sync-creatives-async-response-working.json +3 -3
  261. package/dist/lib/schemas-data/3.1/core/async-response-refs/media-buy/build-creative-async-response-input-required.json +4 -4
  262. package/dist/lib/schemas-data/3.1/core/async-response-refs/media-buy/build-creative-async-response-submitted.json +4 -4
  263. package/dist/lib/schemas-data/3.1/core/async-response-refs/media-buy/build-creative-async-response-working.json +3 -3
  264. package/dist/lib/schemas-data/3.1/core/async-response-refs/media-buy/create-media-buy-async-response-input-required.json +4 -4
  265. package/dist/lib/schemas-data/3.1/core/async-response-refs/media-buy/create-media-buy-async-response-submitted.json +4 -4
  266. package/dist/lib/schemas-data/3.1/core/async-response-refs/media-buy/create-media-buy-async-response-working.json +3 -3
  267. package/dist/lib/schemas-data/3.1/core/async-response-refs/media-buy/get-products-async-response-input-required.json +4 -4
  268. package/dist/lib/schemas-data/3.1/core/async-response-refs/media-buy/get-products-async-response-submitted.json +4 -4
  269. package/dist/lib/schemas-data/3.1/core/async-response-refs/media-buy/get-products-async-response-working.json +3 -3
  270. package/dist/lib/schemas-data/3.1/core/async-response-refs/media-buy/sync-catalogs-async-response-input-required.json +3 -3
  271. package/dist/lib/schemas-data/3.1/core/async-response-refs/media-buy/sync-catalogs-async-response-submitted.json +4 -4
  272. package/dist/lib/schemas-data/3.1/core/async-response-refs/media-buy/sync-catalogs-async-response-working.json +3 -3
  273. package/dist/lib/schemas-data/3.1/core/async-response-refs/media-buy/update-media-buy-async-response-input-required.json +3 -3
  274. package/dist/lib/schemas-data/3.1/core/async-response-refs/media-buy/update-media-buy-async-response-submitted.json +4 -4
  275. package/dist/lib/schemas-data/3.1/core/async-response-refs/media-buy/update-media-buy-async-response-working.json +3 -3
  276. package/dist/lib/schemas-data/3.1/core/async-response-refs/signals/get-signals-async-response-submitted.json +4 -4
  277. package/dist/lib/schemas-data/3.1/core/async-response-refs/signals/get-signals-async-response-working.json +3 -3
  278. package/dist/lib/schemas-data/3.1/core/attribution-window.json +4 -4
  279. package/dist/lib/schemas-data/3.1/core/audience-member.json +3 -3
  280. package/dist/lib/schemas-data/3.1/core/audience-selector.json +7 -7
  281. package/dist/lib/schemas-data/3.1/core/authorized-agent-base.json +3 -3
  282. package/dist/lib/schemas-data/3.1/core/brand-id.json +1 -1
  283. package/dist/lib/schemas-data/3.1/core/brand-ref.json +3 -3
  284. package/dist/lib/schemas-data/3.1/core/business-entity.json +2 -2
  285. package/dist/lib/schemas-data/3.1/core/cancellation-policy.json +2 -2
  286. package/dist/lib/schemas-data/3.1/core/canonical-format-kind.json +1 -1
  287. package/dist/lib/schemas-data/3.1/core/canonical-projection-ref.json +3 -3
  288. package/dist/lib/schemas-data/3.1/core/canonical-projection-slot-override.json +1 -1
  289. package/dist/lib/schemas-data/3.1/core/catalog-field-mapping.json +2 -2
  290. package/dist/lib/schemas-data/3.1/core/catalog-item-delivery-metrics.json +3 -3
  291. package/dist/lib/schemas-data/3.1/core/catalog.json +7 -7
  292. package/dist/lib/schemas-data/3.1/core/catchment.json +5 -5
  293. package/dist/lib/schemas-data/3.1/core/collection-distribution.json +2 -2
  294. package/dist/lib/schemas-data/3.1/core/collection-list-ref.json +1 -1
  295. package/dist/lib/schemas-data/3.1/core/collection-selector.json +1 -1
  296. package/dist/lib/schemas-data/3.1/core/collection.json +13 -13
  297. package/dist/lib/schemas-data/3.1/core/committed-metric.json +9 -9
  298. package/dist/lib/schemas-data/3.1/core/content-rating.json +2 -2
  299. package/dist/lib/schemas-data/3.1/core/context.json +1 -1
  300. package/dist/lib/schemas-data/3.1/core/creative-asset.json +10 -10
  301. package/dist/lib/schemas-data/3.1/core/creative-assignment.json +2 -2
  302. package/dist/lib/schemas-data/3.1/core/creative-brief.json +4 -4
  303. package/dist/lib/schemas-data/3.1/core/creative-consumption.json +1 -1
  304. package/dist/lib/schemas-data/3.1/core/creative-delivery-metrics.json +2 -2
  305. package/dist/lib/schemas-data/3.1/core/creative-filters.json +5 -5
  306. package/dist/lib/schemas-data/3.1/core/creative-item.json +1 -1
  307. package/dist/lib/schemas-data/3.1/core/creative-manifest.json +11 -11
  308. package/dist/lib/schemas-data/3.1/core/creative-policy.json +3 -3
  309. package/dist/lib/schemas-data/3.1/core/creative-variable.json +1 -1
  310. package/dist/lib/schemas-data/3.1/core/creative-variant.json +5 -5
  311. package/dist/lib/schemas-data/3.1/core/data-provider-signal-selector.json +1 -1
  312. package/dist/lib/schemas-data/3.1/core/date-range.json +1 -1
  313. package/dist/lib/schemas-data/3.1/core/datetime-range.json +1 -1
  314. package/dist/lib/schemas-data/3.1/core/daypart-target.json +2 -2
  315. package/dist/lib/schemas-data/3.1/core/deadline-policy.json +1 -1
  316. package/dist/lib/schemas-data/3.1/core/delivery-forecast.json +7 -7
  317. package/dist/lib/schemas-data/3.1/core/delivery-metric-aggregate.json +9 -9
  318. package/dist/lib/schemas-data/3.1/core/delivery-metrics.json +8 -8
  319. package/dist/lib/schemas-data/3.1/core/deployment.json +3 -3
  320. package/dist/lib/schemas-data/3.1/core/destination-item.json +4 -4
  321. package/dist/lib/schemas-data/3.1/core/destination.json +1 -1
  322. package/dist/lib/schemas-data/3.1/core/diagnostic-issue.json +1 -1
  323. package/dist/lib/schemas-data/3.1/core/downstream-connection-requirement.json +1 -1
  324. package/dist/lib/schemas-data/3.1/core/duration.json +1 -1
  325. package/dist/lib/schemas-data/3.1/core/education-item.json +4 -4
  326. package/dist/lib/schemas-data/3.1/core/error.json +1 -1
  327. package/dist/lib/schemas-data/3.1/core/evaluator-spec.json +5 -5
  328. package/dist/lib/schemas-data/3.1/core/event-custom-data.json +2 -2
  329. package/dist/lib/schemas-data/3.1/core/event-source-health.json +3 -3
  330. package/dist/lib/schemas-data/3.1/core/event-surface.json +2 -2
  331. package/dist/lib/schemas-data/3.1/core/event.json +8 -8
  332. package/dist/lib/schemas-data/3.1/core/ext.json +1 -1
  333. package/dist/lib/schemas-data/3.1/core/feature-requirement.json +1 -1
  334. package/dist/lib/schemas-data/3.1/core/flight-item.json +4 -4
  335. package/dist/lib/schemas-data/3.1/core/forecast-dimension-audience.json +2 -2
  336. package/dist/lib/schemas-data/3.1/core/forecast-dimension-device-platform.json +2 -2
  337. package/dist/lib/schemas-data/3.1/core/forecast-dimension-device-type.json +2 -2
  338. package/dist/lib/schemas-data/3.1/core/forecast-dimension-geo.json +5 -5
  339. package/dist/lib/schemas-data/3.1/core/forecast-dimension-placement.json +2 -2
  340. package/dist/lib/schemas-data/3.1/core/forecast-dimension-signal.json +2 -2
  341. package/dist/lib/schemas-data/3.1/core/forecast-point-dimensions.json +7 -7
  342. package/dist/lib/schemas-data/3.1/core/forecast-point.json +27 -27
  343. package/dist/lib/schemas-data/3.1/core/forecast-range.json +1 -1
  344. package/dist/lib/schemas-data/3.1/core/forecast-vendor-metric-value.json +5 -5
  345. package/dist/lib/schemas-data/3.1/core/format-id.json +1 -1
  346. package/dist/lib/schemas-data/3.1/core/format-option-ref.json +1 -1
  347. package/dist/lib/schemas-data/3.1/core/format-shape-vocabulary.json +1 -1
  348. package/dist/lib/schemas-data/3.1/core/format.json +44 -44
  349. package/dist/lib/schemas-data/3.1/core/frequency-cap.json +4 -4
  350. package/dist/lib/schemas-data/3.1/core/generation-credential.json +3 -3
  351. package/dist/lib/schemas-data/3.1/core/geo-breakdown-support.json +3 -3
  352. package/dist/lib/schemas-data/3.1/core/geo-delivery-metrics.json +6 -6
  353. package/dist/lib/schemas-data/3.1/core/hotel-item.json +4 -4
  354. package/dist/lib/schemas-data/3.1/core/identifier.json +2 -2
  355. package/dist/lib/schemas-data/3.1/core/impairment.json +3 -3
  356. package/dist/lib/schemas-data/3.1/core/industry-identifier.json +2 -2
  357. package/dist/lib/schemas-data/3.1/core/insertion-order.json +1 -1
  358. package/dist/lib/schemas-data/3.1/core/installment-deadlines.json +2 -2
  359. package/dist/lib/schemas-data/3.1/core/installment.json +9 -9
  360. package/dist/lib/schemas-data/3.1/core/job-item.json +3 -3
  361. package/dist/lib/schemas-data/3.1/core/keyword-delivery-metrics.json +3 -3
  362. package/dist/lib/schemas-data/3.1/core/limited-series.json +1 -1
  363. package/dist/lib/schemas-data/3.1/core/material-deadline.json +1 -1
  364. package/dist/lib/schemas-data/3.1/core/mcp-webhook-payload.json +5 -5
  365. package/dist/lib/schemas-data/3.1/core/measurement-readiness.json +5 -5
  366. package/dist/lib/schemas-data/3.1/core/measurement-terms.json +3 -3
  367. package/dist/lib/schemas-data/3.1/core/measurement-window.json +1 -1
  368. package/dist/lib/schemas-data/3.1/core/media-buy-available-action.json +4 -4
  369. package/dist/lib/schemas-data/3.1/core/media-buy-features.json +1 -1
  370. package/dist/lib/schemas-data/3.1/core/media-buy.json +10 -10
  371. package/dist/lib/schemas-data/3.1/core/missing-metric.json +9 -9
  372. package/dist/lib/schemas-data/3.1/core/notification-config.json +4 -4
  373. package/dist/lib/schemas-data/3.1/core/offering-asset-group.json +16 -16
  374. package/dist/lib/schemas-data/3.1/core/offering.json +5 -5
  375. package/dist/lib/schemas-data/3.1/core/optimization-goal.json +7 -7
  376. package/dist/lib/schemas-data/3.1/core/outcome-measurement.json +2 -2
  377. package/dist/lib/schemas-data/3.1/core/overlay.json +1 -1
  378. package/dist/lib/schemas-data/3.1/core/package-signal-targeting-group.json +2 -2
  379. package/dist/lib/schemas-data/3.1/core/package-signal-targeting-groups.json +2 -2
  380. package/dist/lib/schemas-data/3.1/core/package-signal-targeting.json +3 -3
  381. package/dist/lib/schemas-data/3.1/core/package.json +17 -17
  382. package/dist/lib/schemas-data/3.1/core/pagination-request.json +1 -1
  383. package/dist/lib/schemas-data/3.1/core/pagination-response.json +1 -1
  384. package/dist/lib/schemas-data/3.1/core/performance-feedback.json +12 -12
  385. package/dist/lib/schemas-data/3.1/core/performance-standard.json +4 -4
  386. package/dist/lib/schemas-data/3.1/core/placement-definition.json +10 -10
  387. package/dist/lib/schemas-data/3.1/core/placement-ref.json +1 -1
  388. package/dist/lib/schemas-data/3.1/core/placement.json +7 -7
  389. package/dist/lib/schemas-data/3.1/core/planned-delivery.json +5 -5
  390. package/dist/lib/schemas-data/3.1/core/platform-extension-ref.json +1 -1
  391. package/dist/lib/schemas-data/3.1/core/postal-area-support.json +2 -2
  392. package/dist/lib/schemas-data/3.1/core/postal-area.json +4 -4
  393. package/dist/lib/schemas-data/3.1/core/postal-country-system.json +2 -2
  394. package/dist/lib/schemas-data/3.1/core/price.json +1 -1
  395. package/dist/lib/schemas-data/3.1/core/pricing-option.json +10 -10
  396. package/dist/lib/schemas-data/3.1/core/product-allocation.json +4 -4
  397. package/dist/lib/schemas-data/3.1/core/product-allowed-action.json +5 -5
  398. package/dist/lib/schemas-data/3.1/core/product-filters.json +27 -27
  399. package/dist/lib/schemas-data/3.1/core/product-format-declaration.json +16 -16
  400. package/dist/lib/schemas-data/3.1/core/product-signal-targeting-option.json +3 -3
  401. package/dist/lib/schemas-data/3.1/core/product.json +40 -40
  402. package/dist/lib/schemas-data/3.1/core/property-id.json +1 -1
  403. package/dist/lib/schemas-data/3.1/core/property-list-ref.json +1 -1
  404. package/dist/lib/schemas-data/3.1/core/property-tag.json +1 -1
  405. package/dist/lib/schemas-data/3.1/core/property.json +6 -6
  406. package/dist/lib/schemas-data/3.1/core/proposal.json +6 -6
  407. package/dist/lib/schemas-data/3.1/core/protocol-envelope.json +5 -5
  408. package/dist/lib/schemas-data/3.1/core/provenance.json +9 -9
  409. package/dist/lib/schemas-data/3.1/core/publisher-property-selector.json +3 -3
  410. package/dist/lib/schemas-data/3.1/core/push-notification-config.json +2 -2
  411. package/dist/lib/schemas-data/3.1/core/real-estate-item.json +4 -4
  412. package/dist/lib/schemas-data/3.1/core/reference-asset.json +1 -1
  413. package/dist/lib/schemas-data/3.1/core/registry-event.json +13 -13
  414. package/dist/lib/schemas-data/3.1/core/registry-feed-response.json +2 -2
  415. package/dist/lib/schemas-data/3.1/core/reporting-capabilities.json +8 -8
  416. package/dist/lib/schemas-data/3.1/core/reporting-webhook.json +3 -3
  417. package/dist/lib/schemas-data/3.1/core/requirements/asset-requirements.json +13 -13
  418. package/dist/lib/schemas-data/3.1/core/requirements/audio-asset-requirements.json +1 -1
  419. package/dist/lib/schemas-data/3.1/core/requirements/catalog-field-binding.json +4 -4
  420. package/dist/lib/schemas-data/3.1/core/requirements/catalog-requirements.json +5 -5
  421. package/dist/lib/schemas-data/3.1/core/requirements/css-asset-requirements.json +1 -1
  422. package/dist/lib/schemas-data/3.1/core/requirements/daast-asset-requirements.json +1 -1
  423. package/dist/lib/schemas-data/3.1/core/requirements/html-asset-requirements.json +1 -1
  424. package/dist/lib/schemas-data/3.1/core/requirements/image-asset-requirements.json +2 -2
  425. package/dist/lib/schemas-data/3.1/core/requirements/javascript-asset-requirements.json +1 -1
  426. package/dist/lib/schemas-data/3.1/core/requirements/markdown-asset-requirements.json +1 -1
  427. package/dist/lib/schemas-data/3.1/core/requirements/offering-asset-constraint.json +4 -4
  428. package/dist/lib/schemas-data/3.1/core/requirements/text-asset-requirements.json +1 -1
  429. package/dist/lib/schemas-data/3.1/core/requirements/url-asset-requirements.json +1 -1
  430. package/dist/lib/schemas-data/3.1/core/requirements/vast-asset-requirements.json +1 -1
  431. package/dist/lib/schemas-data/3.1/core/requirements/video-asset-requirements.json +6 -6
  432. package/dist/lib/schemas-data/3.1/core/requirements/webhook-asset-requirements.json +1 -1
  433. package/dist/lib/schemas-data/3.1/core/response-payload-jws-envelope.json +1 -1
  434. package/dist/lib/schemas-data/3.1/core/response.json +1 -1
  435. package/dist/lib/schemas-data/3.1/core/rights-constraint.json +4 -4
  436. package/dist/lib/schemas-data/3.1/core/seller-agent-ref.json +1 -1
  437. package/dist/lib/schemas-data/3.1/core/signal-coverage-forecast.json +5 -5
  438. package/dist/lib/schemas-data/3.1/core/signal-definition-enrichment.json +4 -4
  439. package/dist/lib/schemas-data/3.1/core/signal-definition.json +5 -5
  440. package/dist/lib/schemas-data/3.1/core/signal-filters.json +3 -3
  441. package/dist/lib/schemas-data/3.1/core/signal-id.json +1 -1
  442. package/dist/lib/schemas-data/3.1/core/signal-listing.json +4 -4
  443. package/dist/lib/schemas-data/3.1/core/signal-modeling-disclosure.json +1 -1
  444. package/dist/lib/schemas-data/3.1/core/signal-pricing-option.json +2 -2
  445. package/dist/lib/schemas-data/3.1/core/signal-pricing.json +6 -6
  446. package/dist/lib/schemas-data/3.1/core/signal-ref.json +1 -1
  447. package/dist/lib/schemas-data/3.1/core/signal-selection-group-rule.json +1 -1
  448. package/dist/lib/schemas-data/3.1/core/signal-targeting-expression.json +4 -4
  449. package/dist/lib/schemas-data/3.1/core/signal-targeting-rules.json +2 -2
  450. package/dist/lib/schemas-data/3.1/core/signal-targeting.json +7 -7
  451. package/dist/lib/schemas-data/3.1/core/sla-window.json +1 -1
  452. package/dist/lib/schemas-data/3.1/core/special.json +2 -2
  453. package/dist/lib/schemas-data/3.1/core/start-timing.json +1 -1
  454. package/dist/lib/schemas-data/3.1/core/store-item.json +3 -3
  455. package/dist/lib/schemas-data/3.1/core/talent.json +2 -2
  456. package/dist/lib/schemas-data/3.1/core/targeting.json +22 -22
  457. package/dist/lib/schemas-data/3.1/core/tasks-get-request.json +5 -5
  458. package/dist/lib/schemas-data/3.1/core/tasks-get-response.json +10 -10
  459. package/dist/lib/schemas-data/3.1/core/tasks-list-request.json +13 -13
  460. package/dist/lib/schemas-data/3.1/core/tasks-list-response.json +8 -8
  461. package/dist/lib/schemas-data/3.1/core/transformer-param.json +1 -1
  462. package/dist/lib/schemas-data/3.1/core/transformer.json +5 -5
  463. package/dist/lib/schemas-data/3.1/core/truncation-sentinel.json +1 -1
  464. package/dist/lib/schemas-data/3.1/core/user-match.json +3 -3
  465. package/dist/lib/schemas-data/3.1/core/vehicle-item.json +4 -4
  466. package/dist/lib/schemas-data/3.1/core/vendor-metric-id.json +1 -1
  467. package/dist/lib/schemas-data/3.1/core/vendor-metric-optimization-supported-metric.json +3 -3
  468. package/dist/lib/schemas-data/3.1/core/vendor-metric-optimization.json +2 -2
  469. package/dist/lib/schemas-data/3.1/core/vendor-metric-value.json +3 -3
  470. package/dist/lib/schemas-data/3.1/core/vendor-pricing-option.json +3 -3
  471. package/dist/lib/schemas-data/3.1/core/version-envelope.json +1 -1
  472. package/dist/lib/schemas-data/3.1/core/webhook-activity-record.json +3 -3
  473. package/dist/lib/schemas-data/3.1/core/webhook-challenge-response.json +1 -1
  474. package/dist/lib/schemas-data/3.1/core/webhook-challenge.json +2 -2
  475. package/dist/lib/schemas-data/3.1/core/wholesale-feed-event.json +17 -17
  476. package/dist/lib/schemas-data/3.1/core/wholesale-feed-webhook.json +3 -3
  477. package/dist/lib/schemas-data/3.1/core/x-entity-types.json +1 -1
  478. package/dist/lib/schemas-data/3.1/creative/asset-types/index.json +6 -6
  479. package/dist/lib/schemas-data/3.1/creative/audit-observation.json +2 -2
  480. package/dist/lib/schemas-data/3.1/creative/creative-feature-result.json +2 -2
  481. package/dist/lib/schemas-data/3.1/creative/creative-purged-webhook.json +3 -3
  482. package/dist/lib/schemas-data/3.1/creative/creative-status-changed-webhook.json +4 -4
  483. package/dist/lib/schemas-data/3.1/creative/get-creative-delivery-request.json +6 -6
  484. package/dist/lib/schemas-data/3.1/creative/get-creative-delivery-response.json +9 -9
  485. package/dist/lib/schemas-data/3.1/creative/get-creative-features-request.json +6 -6
  486. package/dist/lib/schemas-data/3.1/creative/get-creative-features-response.json +11 -11
  487. package/dist/lib/schemas-data/3.1/creative/list-creative-formats-request.json +13 -13
  488. package/dist/lib/schemas-data/3.1/creative/list-creative-formats-response.json +9 -9
  489. package/dist/lib/schemas-data/3.1/creative/list-creatives-request.json +9 -9
  490. package/dist/lib/schemas-data/3.1/creative/list-creatives-response.json +21 -21
  491. package/dist/lib/schemas-data/3.1/creative/list-transformers-request.json +8 -8
  492. package/dist/lib/schemas-data/3.1/creative/list-transformers-response.json +8 -8
  493. package/dist/lib/schemas-data/3.1/creative/preview-creative-request.json +12 -12
  494. package/dist/lib/schemas-data/3.1/creative/preview-creative-response.json +14 -14
  495. package/dist/lib/schemas-data/3.1/creative/preview-render.json +1 -1
  496. package/dist/lib/schemas-data/3.1/creative/sync-creatives-async-response-input-required.json +3 -3
  497. package/dist/lib/schemas-data/3.1/creative/sync-creatives-async-response-submitted.json +4 -4
  498. package/dist/lib/schemas-data/3.1/creative/sync-creatives-async-response-working.json +3 -3
  499. package/dist/lib/schemas-data/3.1/creative/sync-creatives-request.json +8 -8
  500. package/dist/lib/schemas-data/3.1/creative/sync-creatives-response.json +15 -15
  501. package/dist/lib/schemas-data/3.1/creative/validate-input-request.json +4 -4
  502. package/dist/lib/schemas-data/3.1/creative/validate-input-response.json +4 -4
  503. package/dist/lib/schemas-data/3.1/creative/validate-input-result.json +1 -1
  504. package/dist/lib/schemas-data/3.1/creative/video-brief.json +1 -1
  505. package/dist/lib/schemas-data/3.1/enums/account-scope.json +1 -1
  506. package/dist/lib/schemas-data/3.1/enums/account-status.json +1 -1
  507. package/dist/lib/schemas-data/3.1/enums/action-not-allowed-reason.json +1 -1
  508. package/dist/lib/schemas-data/3.1/enums/action-source.json +1 -1
  509. package/dist/lib/schemas-data/3.1/enums/adcp-protocol.json +1 -1
  510. package/dist/lib/schemas-data/3.1/enums/adjustment-kind.json +1 -1
  511. package/dist/lib/schemas-data/3.1/enums/advertiser-industry.json +1 -1
  512. package/dist/lib/schemas-data/3.1/enums/age-verification-method.json +1 -1
  513. package/dist/lib/schemas-data/3.1/enums/assessment-status.json +1 -1
  514. package/dist/lib/schemas-data/3.1/enums/asset-content-type.json +1 -1
  515. package/dist/lib/schemas-data/3.1/enums/attestation-claim.json +1 -1
  516. package/dist/lib/schemas-data/3.1/enums/attribution-methodology.json +1 -1
  517. package/dist/lib/schemas-data/3.1/enums/attribution-model.json +1 -1
  518. package/dist/lib/schemas-data/3.1/enums/audience-source.json +1 -1
  519. package/dist/lib/schemas-data/3.1/enums/audience-status.json +1 -1
  520. package/dist/lib/schemas-data/3.1/enums/audio-channel-layout.json +1 -1
  521. package/dist/lib/schemas-data/3.1/enums/audio-distribution-type.json +1 -1
  522. package/dist/lib/schemas-data/3.1/enums/auth-scheme.json +1 -1
  523. package/dist/lib/schemas-data/3.1/enums/available-metric.json +1 -1
  524. package/dist/lib/schemas-data/3.1/enums/billing-party.json +1 -1
  525. package/dist/lib/schemas-data/3.1/enums/binary-verdict.json +1 -1
  526. package/dist/lib/schemas-data/3.1/enums/brand-agent-type.json +1 -1
  527. package/dist/lib/schemas-data/3.1/enums/c2pa-watermark-action.json +1 -1
  528. package/dist/lib/schemas-data/3.1/enums/canceled-by.json +1 -1
  529. package/dist/lib/schemas-data/3.1/enums/catalog-action.json +1 -1
  530. package/dist/lib/schemas-data/3.1/enums/catalog-item-status.json +1 -1
  531. package/dist/lib/schemas-data/3.1/enums/catalog-type.json +1 -1
  532. package/dist/lib/schemas-data/3.1/enums/channels.json +1 -1
  533. package/dist/lib/schemas-data/3.1/enums/cloud-storage-protocol.json +1 -1
  534. package/dist/lib/schemas-data/3.1/enums/co-branding-requirement.json +1 -1
  535. package/dist/lib/schemas-data/3.1/enums/collection-cadence.json +1 -1
  536. package/dist/lib/schemas-data/3.1/enums/collection-kind.json +1 -1
  537. package/dist/lib/schemas-data/3.1/enums/collection-relationship.json +1 -1
  538. package/dist/lib/schemas-data/3.1/enums/collection-status.json +1 -1
  539. package/dist/lib/schemas-data/3.1/enums/completion-source.json +1 -1
  540. package/dist/lib/schemas-data/3.1/enums/consent-basis.json +1 -1
  541. package/dist/lib/schemas-data/3.1/enums/content-id-type.json +1 -1
  542. package/dist/lib/schemas-data/3.1/enums/content-rating-system.json +1 -1
  543. package/dist/lib/schemas-data/3.1/enums/creative-action.json +1 -1
  544. package/dist/lib/schemas-data/3.1/enums/creative-agent-capability.json +1 -1
  545. package/dist/lib/schemas-data/3.1/enums/creative-approval-status.json +1 -1
  546. package/dist/lib/schemas-data/3.1/enums/creative-event-reason-code.json +1 -1
  547. package/dist/lib/schemas-data/3.1/enums/creative-identifier-type.json +1 -1
  548. package/dist/lib/schemas-data/3.1/enums/creative-quality.json +1 -1
  549. package/dist/lib/schemas-data/3.1/enums/creative-selection-strategy.json +1 -1
  550. package/dist/lib/schemas-data/3.1/enums/creative-sort-field.json +1 -1
  551. package/dist/lib/schemas-data/3.1/enums/creative-status.json +1 -1
  552. package/dist/lib/schemas-data/3.1/enums/daast-tracking-event.json +1 -1
  553. package/dist/lib/schemas-data/3.1/enums/daast-version.json +1 -1
  554. package/dist/lib/schemas-data/3.1/enums/day-of-week.json +1 -1
  555. package/dist/lib/schemas-data/3.1/enums/delegation-authority.json +1 -1
  556. package/dist/lib/schemas-data/3.1/enums/delivery-type.json +1 -1
  557. package/dist/lib/schemas-data/3.1/enums/demographic-system.json +1 -1
  558. package/dist/lib/schemas-data/3.1/enums/derivative-type.json +1 -1
  559. package/dist/lib/schemas-data/3.1/enums/device-platform.json +1 -1
  560. package/dist/lib/schemas-data/3.1/enums/device-type.json +1 -1
  561. package/dist/lib/schemas-data/3.1/enums/digital-source-type.json +1 -1
  562. package/dist/lib/schemas-data/3.1/enums/dimension-unit.json +1 -1
  563. package/dist/lib/schemas-data/3.1/enums/disclosure-persistence.json +1 -1
  564. package/dist/lib/schemas-data/3.1/enums/disclosure-position.json +1 -1
  565. package/dist/lib/schemas-data/3.1/enums/distance-unit.json +1 -1
  566. package/dist/lib/schemas-data/3.1/enums/distribution-identifier-type.json +1 -1
  567. package/dist/lib/schemas-data/3.1/enums/embedded-provenance-method.json +1 -1
  568. package/dist/lib/schemas-data/3.1/enums/error-code.json +1 -1
  569. package/dist/lib/schemas-data/3.1/enums/error-scope.json +1 -1
  570. package/dist/lib/schemas-data/3.1/enums/escalation-severity.json +1 -1
  571. package/dist/lib/schemas-data/3.1/enums/event-type.json +1 -1
  572. package/dist/lib/schemas-data/3.1/enums/exclusivity.json +1 -1
  573. package/dist/lib/schemas-data/3.1/enums/feature-check-status.json +1 -1
  574. package/dist/lib/schemas-data/3.1/enums/feed-format.json +1 -1
  575. package/dist/lib/schemas-data/3.1/enums/feedback-source.json +1 -1
  576. package/dist/lib/schemas-data/3.1/enums/forecast-method.json +1 -1
  577. package/dist/lib/schemas-data/3.1/enums/forecast-range-unit.json +1 -1
  578. package/dist/lib/schemas-data/3.1/enums/forecastable-metric.json +1 -1
  579. package/dist/lib/schemas-data/3.1/enums/format-id-parameter.json +1 -1
  580. package/dist/lib/schemas-data/3.1/enums/frame-rate-type.json +1 -1
  581. package/dist/lib/schemas-data/3.1/enums/frequency-cap-scope.json +1 -1
  582. package/dist/lib/schemas-data/3.1/enums/genre-taxonomy.json +1 -1
  583. package/dist/lib/schemas-data/3.1/enums/geo-level.json +1 -1
  584. package/dist/lib/schemas-data/3.1/enums/gop-type.json +1 -1
  585. package/dist/lib/schemas-data/3.1/enums/governance-decision.json +1 -1
  586. package/dist/lib/schemas-data/3.1/enums/governance-domain.json +1 -1
  587. package/dist/lib/schemas-data/3.1/enums/governance-mode.json +1 -1
  588. package/dist/lib/schemas-data/3.1/enums/governance-phase.json +1 -1
  589. package/dist/lib/schemas-data/3.1/enums/history-entry-type.json +1 -1
  590. package/dist/lib/schemas-data/3.1/enums/http-method.json +1 -1
  591. package/dist/lib/schemas-data/3.1/enums/identifier-types.json +1 -1
  592. package/dist/lib/schemas-data/3.1/enums/impairment-offline-state.json +1 -1
  593. package/dist/lib/schemas-data/3.1/enums/impairment-reason-code.json +1 -1
  594. package/dist/lib/schemas-data/3.1/enums/installment-status.json +1 -1
  595. package/dist/lib/schemas-data/3.1/enums/javascript-module-type.json +1 -1
  596. package/dist/lib/schemas-data/3.1/enums/landing-page-requirement.json +1 -1
  597. package/dist/lib/schemas-data/3.1/enums/legacy-postal-system.json +1 -1
  598. package/dist/lib/schemas-data/3.1/enums/lift-dimension.json +1 -1
  599. package/dist/lib/schemas-data/3.1/enums/logo-slot.json +1 -1
  600. package/dist/lib/schemas-data/3.1/enums/makegood-remedy.json +1 -1
  601. package/dist/lib/schemas-data/3.1/enums/markdown-flavor.json +1 -1
  602. package/dist/lib/schemas-data/3.1/enums/match-id-type.json +1 -1
  603. package/dist/lib/schemas-data/3.1/enums/match-type.json +1 -1
  604. package/dist/lib/schemas-data/3.1/enums/media-buy-action-mode.json +1 -1
  605. package/dist/lib/schemas-data/3.1/enums/media-buy-health.json +1 -1
  606. package/dist/lib/schemas-data/3.1/enums/media-buy-status.json +1 -1
  607. package/dist/lib/schemas-data/3.1/enums/media-buy-valid-action.json +1 -1
  608. package/dist/lib/schemas-data/3.1/enums/metric-scope.json +1 -1
  609. package/dist/lib/schemas-data/3.1/enums/metric-type.json +1 -1
  610. package/dist/lib/schemas-data/3.1/enums/metro-system.json +1 -1
  611. package/dist/lib/schemas-data/3.1/enums/moov-atom-position.json +1 -1
  612. package/dist/lib/schemas-data/3.1/enums/notification-type.json +1 -1
  613. package/dist/lib/schemas-data/3.1/enums/offering-availability-status.json +1 -1
  614. package/dist/lib/schemas-data/3.1/enums/outcome-type.json +1 -1
  615. package/dist/lib/schemas-data/3.1/enums/pacing.json +1 -1
  616. package/dist/lib/schemas-data/3.1/enums/payment-terms.json +1 -1
  617. package/dist/lib/schemas-data/3.1/enums/performance-standard-metric.json +1 -1
  618. package/dist/lib/schemas-data/3.1/enums/policy-category.json +1 -1
  619. package/dist/lib/schemas-data/3.1/enums/policy-enforcement.json +1 -1
  620. package/dist/lib/schemas-data/3.1/enums/postal-system.json +1 -1
  621. package/dist/lib/schemas-data/3.1/enums/preview-output-format.json +1 -1
  622. package/dist/lib/schemas-data/3.1/enums/pricing-model.json +1 -1
  623. package/dist/lib/schemas-data/3.1/enums/production-quality.json +1 -1
  624. package/dist/lib/schemas-data/3.1/enums/property-type.json +1 -1
  625. package/dist/lib/schemas-data/3.1/enums/proposal-status.json +1 -1
  626. package/dist/lib/schemas-data/3.1/enums/publisher-identifier-types.json +1 -1
  627. package/dist/lib/schemas-data/3.1/enums/purchase-type.json +1 -1
  628. package/dist/lib/schemas-data/3.1/enums/reach-unit.json +1 -1
  629. package/dist/lib/schemas-data/3.1/enums/reporting-frequency.json +1 -1
  630. package/dist/lib/schemas-data/3.1/enums/response-type.json +1 -1
  631. package/dist/lib/schemas-data/3.1/enums/restricted-attribute.json +1 -1
  632. package/dist/lib/schemas-data/3.1/enums/right-type.json +1 -1
  633. package/dist/lib/schemas-data/3.1/enums/right-use.json +1 -1
  634. package/dist/lib/schemas-data/3.1/enums/rights-billing-period.json +1 -1
  635. package/dist/lib/schemas-data/3.1/enums/scan-type.json +1 -1
  636. package/dist/lib/schemas-data/3.1/enums/si-session-status.json +1 -1
  637. package/dist/lib/schemas-data/3.1/enums/signal-catalog-type.json +1 -1
  638. package/dist/lib/schemas-data/3.1/enums/signal-source.json +1 -1
  639. package/dist/lib/schemas-data/3.1/enums/signal-value-type.json +1 -1
  640. package/dist/lib/schemas-data/3.1/enums/snapshot-unavailable-reason.json +1 -1
  641. package/dist/lib/schemas-data/3.1/enums/social-placement-surface.json +1 -1
  642. package/dist/lib/schemas-data/3.1/enums/sort-direction.json +1 -1
  643. package/dist/lib/schemas-data/3.1/enums/sort-metric.json +1 -1
  644. package/dist/lib/schemas-data/3.1/enums/special-category.json +1 -1
  645. package/dist/lib/schemas-data/3.1/enums/specialism.json +1 -1
  646. package/dist/lib/schemas-data/3.1/enums/sponsored-placement-type.json +1 -1
  647. package/dist/lib/schemas-data/3.1/enums/talent-role.json +1 -1
  648. package/dist/lib/schemas-data/3.1/enums/task-status.json +1 -1
  649. package/dist/lib/schemas-data/3.1/enums/task-type.json +1 -1
  650. package/dist/lib/schemas-data/3.1/enums/transport-mode.json +1 -1
  651. package/dist/lib/schemas-data/3.1/enums/travel-time-unit.json +1 -1
  652. package/dist/lib/schemas-data/3.1/enums/uid-type.json +1 -1
  653. package/dist/lib/schemas-data/3.1/enums/universal-macro.json +1 -1
  654. package/dist/lib/schemas-data/3.1/enums/update-frequency.json +1 -1
  655. package/dist/lib/schemas-data/3.1/enums/url-asset-type.json +1 -1
  656. package/dist/lib/schemas-data/3.1/enums/validation-mode.json +1 -1
  657. package/dist/lib/schemas-data/3.1/enums/vast-tracking-event.json +1 -1
  658. package/dist/lib/schemas-data/3.1/enums/vast-version.json +1 -1
  659. package/dist/lib/schemas-data/3.1/enums/video-placement-type.json +1 -1
  660. package/dist/lib/schemas-data/3.1/enums/viewability-standard.json +1 -1
  661. package/dist/lib/schemas-data/3.1/enums/watermark-media-type.json +1 -1
  662. package/dist/lib/schemas-data/3.1/enums/wcag-level.json +1 -1
  663. package/dist/lib/schemas-data/3.1/enums/webhook-response-type.json +1 -1
  664. package/dist/lib/schemas-data/3.1/enums/webhook-security-method.json +1 -1
  665. package/dist/lib/schemas-data/3.1/error-details/account-setup-required.json +1 -1
  666. package/dist/lib/schemas-data/3.1/error-details/action-not-allowed.json +4 -4
  667. package/dist/lib/schemas-data/3.1/error-details/agent-permission-denied.json +1 -1
  668. package/dist/lib/schemas-data/3.1/error-details/audience-too-small.json +1 -1
  669. package/dist/lib/schemas-data/3.1/error-details/authorization-required.json +3 -3
  670. package/dist/lib/schemas-data/3.1/error-details/billing-not-permitted-for-agent.json +3 -3
  671. package/dist/lib/schemas-data/3.1/error-details/billing-not-supported.json +2 -2
  672. package/dist/lib/schemas-data/3.1/error-details/budget-too-low.json +1 -1
  673. package/dist/lib/schemas-data/3.1/error-details/conflict.json +1 -1
  674. package/dist/lib/schemas-data/3.1/error-details/creative-rejected.json +1 -1
  675. package/dist/lib/schemas-data/3.1/error-details/policy-violation.json +1 -1
  676. package/dist/lib/schemas-data/3.1/error-details/rate-limited.json +1 -1
  677. package/dist/lib/schemas-data/3.1/error-details/stale-response.json +1 -1
  678. package/dist/lib/schemas-data/3.1/error-details/vendor-error-codes.json +1 -1
  679. package/dist/lib/schemas-data/3.1/error-details/version-unsupported.json +2 -2
  680. package/dist/lib/schemas-data/3.1/extensions/extension-meta.json +1 -1
  681. package/dist/lib/schemas-data/3.1/extensions/index.json +2 -2
  682. package/dist/lib/schemas-data/3.1/formats/canonical/_base.json +5 -5
  683. package/dist/lib/schemas-data/3.1/formats/canonical/agent_placement.json +2 -2
  684. package/dist/lib/schemas-data/3.1/formats/canonical/audio_daast.json +2 -2
  685. package/dist/lib/schemas-data/3.1/formats/canonical/audio_hosted.json +2 -2
  686. package/dist/lib/schemas-data/3.1/formats/canonical/display_tag.json +2 -2
  687. package/dist/lib/schemas-data/3.1/formats/canonical/html5.json +2 -2
  688. package/dist/lib/schemas-data/3.1/formats/canonical/image.json +2 -2
  689. package/dist/lib/schemas-data/3.1/formats/canonical/image_carousel.json +2 -2
  690. package/dist/lib/schemas-data/3.1/formats/canonical/native_in_feed.json +2 -2
  691. package/dist/lib/schemas-data/3.1/formats/canonical/responsive_creative.json +2 -2
  692. package/dist/lib/schemas-data/3.1/formats/canonical/sponsored_placement.json +2 -2
  693. package/dist/lib/schemas-data/3.1/formats/canonical/video_hosted.json +2 -2
  694. package/dist/lib/schemas-data/3.1/formats/canonical/video_vast.json +2 -2
  695. package/dist/lib/schemas-data/3.1/governance/attribute-definition.json +1 -1
  696. package/dist/lib/schemas-data/3.1/governance/audience-constraints.json +3 -3
  697. package/dist/lib/schemas-data/3.1/governance/check-governance-request.json +8 -8
  698. package/dist/lib/schemas-data/3.1/governance/check-governance-response.json +7 -7
  699. package/dist/lib/schemas-data/3.1/governance/get-plan-audit-logs-request.json +5 -5
  700. package/dist/lib/schemas-data/3.1/governance/get-plan-audit-logs-response.json +11 -11
  701. package/dist/lib/schemas-data/3.1/governance/policy-category-definition.json +2 -2
  702. package/dist/lib/schemas-data/3.1/governance/policy-entry.json +6 -6
  703. package/dist/lib/schemas-data/3.1/governance/policy-ref.json +1 -1
  704. package/dist/lib/schemas-data/3.1/governance/report-plan-outcome-request.json +7 -7
  705. package/dist/lib/schemas-data/3.1/governance/report-plan-outcome-response.json +5 -5
  706. package/dist/lib/schemas-data/3.1/governance/sync-plans-request.json +14 -14
  707. package/dist/lib/schemas-data/3.1/governance/sync-plans-response.json +6 -6
  708. package/dist/lib/schemas-data/3.1/index.json +452 -440
  709. package/dist/lib/schemas-data/3.1/manifest.json +3 -3
  710. package/dist/lib/schemas-data/3.1/manifest.schema.json +1 -1
  711. package/dist/lib/schemas-data/3.1/media-buy/build-creative-async-response-input-required.json +4 -4
  712. package/dist/lib/schemas-data/3.1/media-buy/build-creative-async-response-submitted.json +4 -4
  713. package/dist/lib/schemas-data/3.1/media-buy/build-creative-async-response-working.json +3 -3
  714. package/dist/lib/schemas-data/3.1/media-buy/build-creative-request.json +16 -16
  715. package/dist/lib/schemas-data/3.1/media-buy/build-creative-response.json +35 -35
  716. package/dist/lib/schemas-data/3.1/media-buy/create-media-buy-async-response-input-required.json +4 -4
  717. package/dist/lib/schemas-data/3.1/media-buy/create-media-buy-async-response-submitted.json +4 -4
  718. package/dist/lib/schemas-data/3.1/media-buy/create-media-buy-async-response-working.json +3 -3
  719. package/dist/lib/schemas-data/3.1/media-buy/create-media-buy-request.json +13 -13
  720. package/dist/lib/schemas-data/3.1/media-buy/create-media-buy-response.json +19 -19
  721. package/dist/lib/schemas-data/3.1/media-buy/get-media-buy-delivery-request.json +23 -23
  722. package/dist/lib/schemas-data/3.1/media-buy/get-media-buy-delivery-response.json +27 -27
  723. package/dist/lib/schemas-data/3.1/media-buy/get-media-buys-request.json +8 -8
  724. package/dist/lib/schemas-data/3.1/media-buy/get-media-buys-response.json +30 -30
  725. package/dist/lib/schemas-data/3.1/media-buy/get-products-async-response-input-required.json +4 -4
  726. package/dist/lib/schemas-data/3.1/media-buy/get-products-async-response-submitted.json +4 -4
  727. package/dist/lib/schemas-data/3.1/media-buy/get-products-async-response-working.json +3 -3
  728. package/dist/lib/schemas-data/3.1/media-buy/get-products-request.json +13 -13
  729. package/dist/lib/schemas-data/3.1/media-buy/get-products-response.json +10 -10
  730. package/dist/lib/schemas-data/3.1/media-buy/list-creative-formats-request.json +13 -13
  731. package/dist/lib/schemas-data/3.1/media-buy/list-creative-formats-response.json +9 -9
  732. package/dist/lib/schemas-data/3.1/media-buy/log-event-request.json +5 -5
  733. package/dist/lib/schemas-data/3.1/media-buy/log-event-response.json +8 -8
  734. package/dist/lib/schemas-data/3.1/media-buy/media-buy-delivery-webhook-result.json +9 -9
  735. package/dist/lib/schemas-data/3.1/media-buy/package-request.json +23 -23
  736. package/dist/lib/schemas-data/3.1/media-buy/package-update.json +13 -13
  737. package/dist/lib/schemas-data/3.1/media-buy/provide-performance-feedback-request.json +7 -7
  738. package/dist/lib/schemas-data/3.1/media-buy/provide-performance-feedback-response.json +8 -8
  739. package/dist/lib/schemas-data/3.1/media-buy/sync-audiences-request.json +8 -8
  740. package/dist/lib/schemas-data/3.1/media-buy/sync-audiences-response.json +14 -14
  741. package/dist/lib/schemas-data/3.1/media-buy/sync-catalogs-async-response-input-required.json +3 -3
  742. package/dist/lib/schemas-data/3.1/media-buy/sync-catalogs-async-response-submitted.json +4 -4
  743. package/dist/lib/schemas-data/3.1/media-buy/sync-catalogs-async-response-working.json +3 -3
  744. package/dist/lib/schemas-data/3.1/media-buy/sync-catalogs-request.json +8 -8
  745. package/dist/lib/schemas-data/3.1/media-buy/sync-catalogs-response.json +14 -14
  746. package/dist/lib/schemas-data/3.1/media-buy/sync-event-sources-request.json +8 -8
  747. package/dist/lib/schemas-data/3.1/media-buy/sync-event-sources-response.json +14 -14
  748. package/dist/lib/schemas-data/3.1/media-buy/update-media-buy-async-response-input-required.json +3 -3
  749. package/dist/lib/schemas-data/3.1/media-buy/update-media-buy-async-response-submitted.json +4 -4
  750. package/dist/lib/schemas-data/3.1/media-buy/update-media-buy-async-response-working.json +3 -3
  751. package/dist/lib/schemas-data/3.1/media-buy/update-media-buy-request.json +11 -11
  752. package/dist/lib/schemas-data/3.1/media-buy/update-media-buy-response.json +17 -17
  753. package/dist/lib/schemas-data/3.1/pricing-options/cpa-option.json +4 -4
  754. package/dist/lib/schemas-data/3.1/pricing-options/cpc-option.json +4 -4
  755. package/dist/lib/schemas-data/3.1/pricing-options/cpcv-option.json +4 -4
  756. package/dist/lib/schemas-data/3.1/pricing-options/cpm-option.json +4 -4
  757. package/dist/lib/schemas-data/3.1/pricing-options/cpp-option.json +5 -5
  758. package/dist/lib/schemas-data/3.1/pricing-options/cpv-option.json +4 -4
  759. package/dist/lib/schemas-data/3.1/pricing-options/flat-rate-option.json +4 -4
  760. package/dist/lib/schemas-data/3.1/pricing-options/price-breakdown.json +2 -2
  761. package/dist/lib/schemas-data/3.1/pricing-options/price-guidance.json +1 -1
  762. package/dist/lib/schemas-data/3.1/pricing-options/time-option.json +4 -4
  763. package/dist/lib/schemas-data/3.1/pricing-options/vcpm-option.json +4 -4
  764. package/dist/lib/schemas-data/3.1/property/authorization-result.json +1 -1
  765. package/dist/lib/schemas-data/3.1/property/base-property-source.json +4 -4
  766. package/dist/lib/schemas-data/3.1/property/create-property-list-request.json +8 -8
  767. package/dist/lib/schemas-data/3.1/property/create-property-list-response.json +6 -6
  768. package/dist/lib/schemas-data/3.1/property/delete-property-list-request.json +5 -5
  769. package/dist/lib/schemas-data/3.1/property/delete-property-list-response.json +5 -5
  770. package/dist/lib/schemas-data/3.1/property/delivery-record.json +3 -3
  771. package/dist/lib/schemas-data/3.1/property/get-property-list-request.json +5 -5
  772. package/dist/lib/schemas-data/3.1/property/get-property-list-response.json +9 -9
  773. package/dist/lib/schemas-data/3.1/property/list-property-lists-request.json +6 -6
  774. package/dist/lib/schemas-data/3.1/property/list-property-lists-response.json +7 -7
  775. package/dist/lib/schemas-data/3.1/property/property-error.json +2 -2
  776. package/dist/lib/schemas-data/3.1/property/property-feature-definition.json +2 -2
  777. package/dist/lib/schemas-data/3.1/property/property-feature-result.json +4 -4
  778. package/dist/lib/schemas-data/3.1/property/property-feature-value.json +2 -2
  779. package/dist/lib/schemas-data/3.1/property/property-feature.json +1 -1
  780. package/dist/lib/schemas-data/3.1/property/property-list-changed-webhook.json +2 -2
  781. package/dist/lib/schemas-data/3.1/property/property-list-filters.json +5 -5
  782. package/dist/lib/schemas-data/3.1/property/property-list.json +6 -6
  783. package/dist/lib/schemas-data/3.1/property/update-property-list-request.json +8 -8
  784. package/dist/lib/schemas-data/3.1/property/update-property-list-response.json +6 -6
  785. package/dist/lib/schemas-data/3.1/property/validate-property-delivery-request.json +6 -6
  786. package/dist/lib/schemas-data/3.1/property/validate-property-delivery-response.json +6 -6
  787. package/dist/lib/schemas-data/3.1/property/validation-result.json +5 -5
  788. package/dist/lib/schemas-data/3.1/protocol/get-adcp-capabilities-request.json +4 -4
  789. package/dist/lib/schemas-data/3.1/protocol/get-adcp-capabilities-response.json +33 -33
  790. package/dist/lib/schemas-data/3.1/protocol/get-task-status-request.json +5 -5
  791. package/dist/lib/schemas-data/3.1/protocol/get-task-status-response.json +10 -10
  792. package/dist/lib/schemas-data/3.1/protocol/list-tasks-request.json +13 -13
  793. package/dist/lib/schemas-data/3.1/protocol/list-tasks-response.json +8 -8
  794. package/dist/lib/schemas-data/3.1/registries/v1-canonical-mapping.json +355 -5
  795. package/dist/lib/schemas-data/3.1/signals/activate-signal-request.json +6 -6
  796. package/dist/lib/schemas-data/3.1/signals/activate-signal-response.json +9 -9
  797. package/dist/lib/schemas-data/3.1/signals/get-signals-async-response-submitted.json +4 -4
  798. package/dist/lib/schemas-data/3.1/signals/get-signals-async-response-working.json +3 -3
  799. package/dist/lib/schemas-data/3.1/signals/get-signals-request.json +11 -11
  800. package/dist/lib/schemas-data/3.1/signals/get-signals-response.json +17 -17
  801. package/dist/lib/schemas-data/3.1/sponsored-intelligence/si-capabilities.json +1 -1
  802. package/dist/lib/schemas-data/3.1/sponsored-intelligence/si-context-use.json +1 -1
  803. package/dist/lib/schemas-data/3.1/sponsored-intelligence/si-get-offering-request.json +4 -4
  804. package/dist/lib/schemas-data/3.1/sponsored-intelligence/si-get-offering-response.json +9 -9
  805. package/dist/lib/schemas-data/3.1/sponsored-intelligence/si-identity.json +1 -1
  806. package/dist/lib/schemas-data/3.1/sponsored-intelligence/si-initiate-session-request.json +7 -7
  807. package/dist/lib/schemas-data/3.1/sponsored-intelligence/si-initiate-session-response.json +10 -10
  808. package/dist/lib/schemas-data/3.1/sponsored-intelligence/si-send-message-request.json +5 -5
  809. package/dist/lib/schemas-data/3.1/sponsored-intelligence/si-send-message-response.json +10 -10
  810. package/dist/lib/schemas-data/3.1/sponsored-intelligence/si-sponsored-context-receipt.json +4 -4
  811. package/dist/lib/schemas-data/3.1/sponsored-intelligence/si-sponsored-context.json +4 -4
  812. package/dist/lib/schemas-data/3.1/sponsored-intelligence/si-terminate-session-request.json +4 -4
  813. package/dist/lib/schemas-data/3.1/sponsored-intelligence/si-terminate-session-response.json +7 -7
  814. package/dist/lib/schemas-data/3.1/sponsored-intelligence/si-ui-element.json +1 -1
  815. package/dist/lib/schemas-data/3.1/trusted-match/available-package.json +4 -4
  816. package/dist/lib/schemas-data/3.1/trusted-match/context-match-request.json +5 -5
  817. package/dist/lib/schemas-data/3.1/trusted-match/context-match-response.json +4 -4
  818. package/dist/lib/schemas-data/3.1/trusted-match/error.json +1 -1
  819. package/dist/lib/schemas-data/3.1/trusted-match/identity-match-request.json +4 -4
  820. package/dist/lib/schemas-data/3.1/trusted-match/identity-match-response.json +45 -45
  821. package/dist/lib/schemas-data/3.1/trusted-match/offer-price.json +1 -1
  822. package/dist/lib/schemas-data/3.1/trusted-match/offer.json +5 -5
  823. package/dist/lib/schemas-data/3.1/trusted-match/provider-identity-match-response.json +90 -0
  824. package/dist/lib/schemas-data/3.1/trusted-match/provider-registration.json +8 -7
  825. package/dist/lib/schemas-data/3.1/trusted-match/publisher-tmpx-config.json +41 -0
  826. package/dist/lib/schemas-data/3.1/trusted-match/tmpx-chunk.json +28 -0
  827. package/dist/lib/schemas-data/v2.5/_provenance.json +1 -1
  828. package/dist/lib/server/decisioning/runtime/entity-hydration.generated.js.map +1 -1
  829. package/dist/lib/server/decisioning/runtime/entity-hydration.generated.mjs.map +1 -1
  830. package/dist/lib/server/wire-spec-fields.generated.d.mts +29 -29
  831. package/dist/lib/server/wire-spec-fields.generated.d.ts +29 -29
  832. package/dist/lib/server/wire-spec-fields.generated.d.ts.map +1 -1
  833. package/dist/lib/server/wire-spec-fields.generated.js +29 -29
  834. package/dist/lib/server/wire-spec-fields.generated.js.map +1 -1
  835. package/dist/lib/server/wire-spec-fields.generated.mjs +29 -29
  836. package/dist/lib/server/wire-spec-fields.generated.mjs.map +1 -1
  837. package/dist/lib/types/adcp.d.mts +10 -0
  838. package/dist/lib/types/adcp.d.ts +10 -0
  839. package/dist/lib/types/adcp.d.ts.map +1 -1
  840. package/dist/lib/types/adcp.js.map +1 -1
  841. package/dist/lib/types/adcp.mjs.map +1 -1
  842. package/dist/lib/types/core.generated.d.mts +125 -19
  843. package/dist/lib/types/core.generated.d.ts +125 -19
  844. package/dist/lib/types/core.generated.d.ts.map +1 -1
  845. package/dist/lib/types/core.generated.js.map +1 -1
  846. package/dist/lib/types/manifest.generated.d.mts +3 -3
  847. package/dist/lib/types/manifest.generated.d.ts +3 -3
  848. package/dist/lib/types/manifest.generated.js.map +1 -1
  849. package/dist/lib/types/manifest.generated.mjs.map +1 -1
  850. package/dist/lib/types/per-tool-index.json +1 -1
  851. package/dist/lib/types/schemas.generated.d.mts +124 -20
  852. package/dist/lib/types/schemas.generated.d.ts +124 -20
  853. package/dist/lib/types/schemas.generated.d.ts.map +1 -1
  854. package/dist/lib/types/schemas.generated.js +83 -24
  855. package/dist/lib/types/schemas.generated.js.map +1 -1
  856. package/dist/lib/types/schemas.generated.mjs +79 -24
  857. package/dist/lib/types/schemas.generated.mjs.map +1 -1
  858. package/dist/lib/utils/response-schemas.js +1 -1
  859. package/dist/lib/utils/response-schemas.js.map +1 -1
  860. package/dist/lib/utils/response-schemas.mjs +1 -1
  861. package/dist/lib/utils/response-schemas.mjs.map +1 -1
  862. package/dist/lib/utils/sync-creatives-adapter.d.mts +6 -0
  863. package/dist/lib/utils/sync-creatives-adapter.d.ts +6 -0
  864. package/dist/lib/utils/sync-creatives-adapter.d.ts.map +1 -1
  865. package/dist/lib/utils/sync-creatives-adapter.js +22 -1
  866. package/dist/lib/utils/sync-creatives-adapter.js.map +1 -1
  867. package/dist/lib/utils/sync-creatives-adapter.mjs +22 -1
  868. package/dist/lib/utils/sync-creatives-adapter.mjs.map +1 -1
  869. package/dist/lib/version.d.mts +7 -7
  870. package/dist/lib/version.d.ts +7 -7
  871. package/dist/lib/version.d.ts.map +1 -1
  872. package/dist/lib/version.js +8 -6
  873. package/dist/lib/version.js.map +1 -1
  874. package/dist/lib/version.mjs +8 -6
  875. package/dist/lib/version.mjs.map +1 -1
  876. package/docs/llms.txt +12 -2
  877. package/package.json +2 -2
  878. /package/compliance/cache/{3.1.8 → 3.1.10}/domains/brand/index.yaml +0 -0
  879. /package/compliance/cache/{3.1.8 → 3.1.10}/domains/brand/scenarios/distributed_brand_resolution.yaml +0 -0
  880. /package/compliance/cache/{3.1.8 → 3.1.10}/domains/brand/scenarios/single_side_trust_extension.yaml +0 -0
  881. /package/compliance/cache/{3.1.8 → 3.1.10}/domains/creative/index.yaml +0 -0
  882. /package/compliance/cache/{3.1.8 → 3.1.10}/domains/creative/scenarios/billing_out_of_band.yaml +0 -0
  883. /package/compliance/cache/{3.1.8 → 3.1.10}/domains/creative/scenarios/canonical_supported_formats.yaml +0 -0
  884. /package/compliance/cache/{3.1.8 → 3.1.10}/domains/creative/scenarios/creative_lifecycle_webhooks.yaml +0 -0
  885. /package/compliance/cache/{3.1.8 → 3.1.10}/domains/creative/scenarios/evaluator_auth.yaml +0 -0
  886. /package/compliance/cache/{3.1.8 → 3.1.10}/domains/creative/scenarios/native_in_feed.yaml +0 -0
  887. /package/compliance/cache/{3.1.8 → 3.1.10}/domains/governance/index.yaml +0 -0
  888. /package/compliance/cache/{3.1.8 → 3.1.10}/domains/media-buy/scenarios/audience_buy_flow.yaml +0 -0
  889. /package/compliance/cache/{3.1.8 → 3.1.10}/domains/media-buy/scenarios/available_actions.yaml +0 -0
  890. /package/compliance/cache/{3.1.8 → 3.1.10}/domains/media-buy/scenarios/billing_finality_delivery.yaml +0 -0
  891. /package/compliance/cache/{3.1.8 → 3.1.10}/domains/media-buy/scenarios/canonical_formats.yaml +0 -0
  892. /package/compliance/cache/{3.1.8 → 3.1.10}/domains/media-buy/scenarios/clicks_buy_flow.yaml +0 -0
  893. /package/compliance/cache/{3.1.8 → 3.1.10}/domains/media-buy/scenarios/completed_views_buy_flow.yaml +0 -0
  894. /package/compliance/cache/{3.1.8 → 3.1.10}/domains/media-buy/scenarios/create_media_buy_async.yaml +0 -0
  895. /package/compliance/cache/{3.1.8 → 3.1.10}/domains/media-buy/scenarios/creative_fate_after_cancellation.yaml +0 -0
  896. /package/compliance/cache/{3.1.8 → 3.1.10}/domains/media-buy/scenarios/creative_reception.yaml +0 -0
  897. /package/compliance/cache/{3.1.8 → 3.1.10}/domains/media-buy/scenarios/delivery_reporting.yaml +0 -0
  898. /package/compliance/cache/{3.1.8 → 3.1.10}/domains/media-buy/scenarios/dependency_impairment.yaml +0 -0
  899. /package/compliance/cache/{3.1.8 → 3.1.10}/domains/media-buy/scenarios/dependency_impairment_cardinality.yaml +0 -0
  900. /package/compliance/cache/{3.1.8 → 3.1.10}/domains/media-buy/scenarios/event_dedup_flow.yaml +0 -0
  901. /package/compliance/cache/{3.1.8 → 3.1.10}/domains/media-buy/scenarios/frequency_cap_enforcement.yaml +0 -0
  902. /package/compliance/cache/{3.1.8 → 3.1.10}/domains/media-buy/scenarios/get_products_async.yaml +0 -0
  903. /package/compliance/cache/{3.1.8 → 3.1.10}/domains/media-buy/scenarios/governance_approved.yaml +0 -0
  904. /package/compliance/cache/{3.1.8 → 3.1.10}/domains/media-buy/scenarios/governance_conditions.yaml +0 -0
  905. /package/compliance/cache/{3.1.8 → 3.1.10}/domains/media-buy/scenarios/governance_denied.yaml +0 -0
  906. /package/compliance/cache/{3.1.8 → 3.1.10}/domains/media-buy/scenarios/governance_denied_recovery.yaml +0 -0
  907. /package/compliance/cache/{3.1.8 → 3.1.10}/domains/media-buy/scenarios/inline_creatives_without_sync.yaml +0 -0
  908. /package/compliance/cache/{3.1.8 → 3.1.10}/domains/media-buy/scenarios/invalid_transitions.yaml +0 -0
  909. /package/compliance/cache/{3.1.8 → 3.1.10}/domains/media-buy/scenarios/inventory_list_no_match.yaml +0 -0
  910. /package/compliance/cache/{3.1.8 → 3.1.10}/domains/media-buy/scenarios/inventory_list_targeting.yaml +0 -0
  911. /package/compliance/cache/{3.1.8 → 3.1.10}/domains/media-buy/scenarios/measurement_accountability.yaml +0 -0
  912. /package/compliance/cache/{3.1.8 → 3.1.10}/domains/media-buy/scenarios/measurement_terms_rejected.yaml +0 -0
  913. /package/compliance/cache/{3.1.8 → 3.1.10}/domains/media-buy/scenarios/package_correlation_legacy_fallback.yaml +0 -0
  914. /package/compliance/cache/{3.1.8 → 3.1.10}/domains/media-buy/scenarios/pending_creatives_to_start.yaml +0 -0
  915. /package/compliance/cache/{3.1.8 → 3.1.10}/domains/media-buy/scenarios/per_creative_conversion_attribution.yaml +0 -0
  916. /package/compliance/cache/{3.1.8 → 3.1.10}/domains/media-buy/scenarios/performance_buy_flow.yaml +0 -0
  917. /package/compliance/cache/{3.1.8 → 3.1.10}/domains/media-buy/scenarios/performance_buy_flow_roas.yaml +0 -0
  918. /package/compliance/cache/{3.1.8 → 3.1.10}/domains/media-buy/scenarios/pricing_currency_filter.yaml +0 -0
  919. /package/compliance/cache/{3.1.8 → 3.1.10}/domains/media-buy/scenarios/product_signal_targeting.yaml +0 -0
  920. /package/compliance/cache/{3.1.8 → 3.1.10}/domains/media-buy/scenarios/proposal_finalize.yaml +0 -0
  921. /package/compliance/cache/{3.1.8 → 3.1.10}/domains/media-buy/scenarios/proposal_finalize_asap_timing.yaml +0 -0
  922. /package/compliance/cache/{3.1.8 → 3.1.10}/domains/media-buy/scenarios/proposal_not_found_errors.yaml +0 -0
  923. /package/compliance/cache/{3.1.8 → 3.1.10}/domains/media-buy/scenarios/provenance_audit_observation.yaml +0 -0
  924. /package/compliance/cache/{3.1.8 → 3.1.10}/domains/media-buy/scenarios/provenance_enforcement.yaml +0 -0
  925. /package/compliance/cache/{3.1.8 → 3.1.10}/domains/media-buy/scenarios/provenance_truth_of_claim.yaml +0 -0
  926. /package/compliance/cache/{3.1.8 → 3.1.10}/domains/media-buy/scenarios/reach_buy_flow.yaml +0 -0
  927. /package/compliance/cache/{3.1.8 → 3.1.10}/domains/media-buy/scenarios/refine_finalize_exclusivity.yaml +0 -0
  928. /package/compliance/cache/{3.1.8 → 3.1.10}/domains/media-buy/scenarios/refine_products.yaml +0 -0
  929. /package/compliance/cache/{3.1.8 → 3.1.10}/domains/media-buy/scenarios/vendor_metric_accountability.yaml +0 -0
  930. /package/compliance/cache/{3.1.8 → 3.1.10}/domains/media-buy/scenarios/vendor_metric_catalog_precondition.yaml +0 -0
  931. /package/compliance/cache/{3.1.8 → 3.1.10}/domains/media-buy/scenarios/vendor_metric_optimization_flow.yaml +0 -0
  932. /package/compliance/cache/{3.1.8 → 3.1.10}/domains/media-buy/state-machine.yaml +0 -0
  933. /package/compliance/cache/{3.1.8 → 3.1.10}/domains/signals/index.yaml +0 -0
  934. /package/compliance/cache/{3.1.8 → 3.1.10}/domains/signals/scenarios/get_signals_async.yaml +0 -0
  935. /package/compliance/cache/{3.1.8 → 3.1.10}/domains/sponsored-intelligence/index.yaml +0 -0
  936. /package/compliance/cache/{3.1.8 → 3.1.10}/domains/sponsored-intelligence/sponsored-context-accountability.yaml +0 -0
  937. /package/compliance/cache/{3.1.8 → 3.1.10}/protocols/brand/index.yaml +0 -0
  938. /package/compliance/cache/{3.1.8 → 3.1.10}/protocols/brand/scenarios/distributed_brand_resolution.yaml +0 -0
  939. /package/compliance/cache/{3.1.8 → 3.1.10}/protocols/brand/scenarios/single_side_trust_extension.yaml +0 -0
  940. /package/compliance/cache/{3.1.8 → 3.1.10}/protocols/creative/index.yaml +0 -0
  941. /package/compliance/cache/{3.1.8 → 3.1.10}/protocols/creative/scenarios/billing_out_of_band.yaml +0 -0
  942. /package/compliance/cache/{3.1.8 → 3.1.10}/protocols/creative/scenarios/canonical_supported_formats.yaml +0 -0
  943. /package/compliance/cache/{3.1.8 → 3.1.10}/protocols/creative/scenarios/creative_lifecycle_webhooks.yaml +0 -0
  944. /package/compliance/cache/{3.1.8 → 3.1.10}/protocols/creative/scenarios/evaluator_auth.yaml +0 -0
  945. /package/compliance/cache/{3.1.8 → 3.1.10}/protocols/creative/scenarios/native_in_feed.yaml +0 -0
  946. /package/compliance/cache/{3.1.8 → 3.1.10}/protocols/governance/index.yaml +0 -0
  947. /package/compliance/cache/{3.1.8 → 3.1.10}/protocols/media-buy/scenarios/audience_buy_flow.yaml +0 -0
  948. /package/compliance/cache/{3.1.8 → 3.1.10}/protocols/media-buy/scenarios/available_actions.yaml +0 -0
  949. /package/compliance/cache/{3.1.8 → 3.1.10}/protocols/media-buy/scenarios/billing_finality_delivery.yaml +0 -0
  950. /package/compliance/cache/{3.1.8 → 3.1.10}/protocols/media-buy/scenarios/canonical_formats.yaml +0 -0
  951. /package/compliance/cache/{3.1.8 → 3.1.10}/protocols/media-buy/scenarios/clicks_buy_flow.yaml +0 -0
  952. /package/compliance/cache/{3.1.8 → 3.1.10}/protocols/media-buy/scenarios/completed_views_buy_flow.yaml +0 -0
  953. /package/compliance/cache/{3.1.8 → 3.1.10}/protocols/media-buy/scenarios/create_media_buy_async.yaml +0 -0
  954. /package/compliance/cache/{3.1.8 → 3.1.10}/protocols/media-buy/scenarios/creative_fate_after_cancellation.yaml +0 -0
  955. /package/compliance/cache/{3.1.8 → 3.1.10}/protocols/media-buy/scenarios/creative_reception.yaml +0 -0
  956. /package/compliance/cache/{3.1.8 → 3.1.10}/protocols/media-buy/scenarios/delivery_reporting.yaml +0 -0
  957. /package/compliance/cache/{3.1.8 → 3.1.10}/protocols/media-buy/scenarios/dependency_impairment.yaml +0 -0
  958. /package/compliance/cache/{3.1.8 → 3.1.10}/protocols/media-buy/scenarios/dependency_impairment_cardinality.yaml +0 -0
  959. /package/compliance/cache/{3.1.8 → 3.1.10}/protocols/media-buy/scenarios/event_dedup_flow.yaml +0 -0
  960. /package/compliance/cache/{3.1.8 → 3.1.10}/protocols/media-buy/scenarios/frequency_cap_enforcement.yaml +0 -0
  961. /package/compliance/cache/{3.1.8 → 3.1.10}/protocols/media-buy/scenarios/get_products_async.yaml +0 -0
  962. /package/compliance/cache/{3.1.8 → 3.1.10}/protocols/media-buy/scenarios/governance_approved.yaml +0 -0
  963. /package/compliance/cache/{3.1.8 → 3.1.10}/protocols/media-buy/scenarios/governance_conditions.yaml +0 -0
  964. /package/compliance/cache/{3.1.8 → 3.1.10}/protocols/media-buy/scenarios/governance_denied.yaml +0 -0
  965. /package/compliance/cache/{3.1.8 → 3.1.10}/protocols/media-buy/scenarios/governance_denied_recovery.yaml +0 -0
  966. /package/compliance/cache/{3.1.8 → 3.1.10}/protocols/media-buy/scenarios/inline_creatives_without_sync.yaml +0 -0
  967. /package/compliance/cache/{3.1.8 → 3.1.10}/protocols/media-buy/scenarios/invalid_transitions.yaml +0 -0
  968. /package/compliance/cache/{3.1.8 → 3.1.10}/protocols/media-buy/scenarios/inventory_list_no_match.yaml +0 -0
  969. /package/compliance/cache/{3.1.8 → 3.1.10}/protocols/media-buy/scenarios/inventory_list_targeting.yaml +0 -0
  970. /package/compliance/cache/{3.1.8 → 3.1.10}/protocols/media-buy/scenarios/measurement_accountability.yaml +0 -0
  971. /package/compliance/cache/{3.1.8 → 3.1.10}/protocols/media-buy/scenarios/measurement_terms_rejected.yaml +0 -0
  972. /package/compliance/cache/{3.1.8 → 3.1.10}/protocols/media-buy/scenarios/package_correlation_legacy_fallback.yaml +0 -0
  973. /package/compliance/cache/{3.1.8 → 3.1.10}/protocols/media-buy/scenarios/pending_creatives_to_start.yaml +0 -0
  974. /package/compliance/cache/{3.1.8 → 3.1.10}/protocols/media-buy/scenarios/per_creative_conversion_attribution.yaml +0 -0
  975. /package/compliance/cache/{3.1.8 → 3.1.10}/protocols/media-buy/scenarios/performance_buy_flow.yaml +0 -0
  976. /package/compliance/cache/{3.1.8 → 3.1.10}/protocols/media-buy/scenarios/performance_buy_flow_roas.yaml +0 -0
  977. /package/compliance/cache/{3.1.8 → 3.1.10}/protocols/media-buy/scenarios/pricing_currency_filter.yaml +0 -0
  978. /package/compliance/cache/{3.1.8 → 3.1.10}/protocols/media-buy/scenarios/product_signal_targeting.yaml +0 -0
  979. /package/compliance/cache/{3.1.8 → 3.1.10}/protocols/media-buy/scenarios/proposal_finalize.yaml +0 -0
  980. /package/compliance/cache/{3.1.8 → 3.1.10}/protocols/media-buy/scenarios/proposal_finalize_asap_timing.yaml +0 -0
  981. /package/compliance/cache/{3.1.8 → 3.1.10}/protocols/media-buy/scenarios/proposal_not_found_errors.yaml +0 -0
  982. /package/compliance/cache/{3.1.8 → 3.1.10}/protocols/media-buy/scenarios/provenance_audit_observation.yaml +0 -0
  983. /package/compliance/cache/{3.1.8 → 3.1.10}/protocols/media-buy/scenarios/provenance_enforcement.yaml +0 -0
  984. /package/compliance/cache/{3.1.8 → 3.1.10}/protocols/media-buy/scenarios/provenance_truth_of_claim.yaml +0 -0
  985. /package/compliance/cache/{3.1.8 → 3.1.10}/protocols/media-buy/scenarios/reach_buy_flow.yaml +0 -0
  986. /package/compliance/cache/{3.1.8 → 3.1.10}/protocols/media-buy/scenarios/refine_finalize_exclusivity.yaml +0 -0
  987. /package/compliance/cache/{3.1.8 → 3.1.10}/protocols/media-buy/scenarios/refine_products.yaml +0 -0
  988. /package/compliance/cache/{3.1.8 → 3.1.10}/protocols/media-buy/scenarios/vendor_metric_accountability.yaml +0 -0
  989. /package/compliance/cache/{3.1.8 → 3.1.10}/protocols/media-buy/scenarios/vendor_metric_catalog_precondition.yaml +0 -0
  990. /package/compliance/cache/{3.1.8 → 3.1.10}/protocols/media-buy/scenarios/vendor_metric_optimization_flow.yaml +0 -0
  991. /package/compliance/cache/{3.1.8 → 3.1.10}/protocols/media-buy/state-machine.yaml +0 -0
  992. /package/compliance/cache/{3.1.8 → 3.1.10}/protocols/signals/index.yaml +0 -0
  993. /package/compliance/cache/{3.1.8 → 3.1.10}/protocols/signals/scenarios/get_signals_async.yaml +0 -0
  994. /package/compliance/cache/{3.1.8 → 3.1.10}/protocols/sponsored-intelligence/index.yaml +0 -0
  995. /package/compliance/cache/{3.1.8 → 3.1.10}/protocols/sponsored-intelligence/sponsored-context-accountability.yaml +0 -0
  996. /package/compliance/cache/{3.1.8 → 3.1.10}/specialisms/audience-sync/index.yaml +0 -0
  997. /package/compliance/cache/{3.1.8 → 3.1.10}/specialisms/brand-rights/index.yaml +0 -0
  998. /package/compliance/cache/{3.1.8 → 3.1.10}/specialisms/brand-rights/scenarios/governance_denied.yaml +0 -0
  999. /package/compliance/cache/{3.1.8 → 3.1.10}/specialisms/collection-lists/index.yaml +0 -0
  1000. /package/compliance/cache/{3.1.8 → 3.1.10}/specialisms/content-standards/index.yaml +0 -0
  1001. /package/compliance/cache/{3.1.8 → 3.1.10}/specialisms/creative-ad-server/index.yaml +0 -0
  1002. /package/compliance/cache/{3.1.8 → 3.1.10}/specialisms/creative-generative/generative-seller.yaml +0 -0
  1003. /package/compliance/cache/{3.1.8 → 3.1.10}/specialisms/creative-generative/index.yaml +0 -0
  1004. /package/compliance/cache/{3.1.8 → 3.1.10}/specialisms/creative-template/index.yaml +0 -0
  1005. /package/compliance/cache/{3.1.8 → 3.1.10}/specialisms/creative-transformers/index.yaml +0 -0
  1006. /package/compliance/cache/{3.1.8 → 3.1.10}/specialisms/governance-aware-seller/index.yaml +0 -0
  1007. /package/compliance/cache/{3.1.8 → 3.1.10}/specialisms/governance-aware-seller/scenarios/governance_multi_agent_rejected.yaml +0 -0
  1008. /package/compliance/cache/{3.1.8 → 3.1.10}/specialisms/governance-delivery-monitor/index.yaml +0 -0
  1009. /package/compliance/cache/{3.1.8 → 3.1.10}/specialisms/governance-spend-authority/denied.yaml +0 -0
  1010. /package/compliance/cache/{3.1.8 → 3.1.10}/specialisms/governance-spend-authority/index.yaml +0 -0
  1011. /package/compliance/cache/{3.1.8 → 3.1.10}/specialisms/property-lists/index.yaml +0 -0
  1012. /package/compliance/cache/{3.1.8 → 3.1.10}/specialisms/sales-broadcast-tv/index.yaml +0 -0
  1013. /package/compliance/cache/{3.1.8 → 3.1.10}/specialisms/sales-catalog-driven/index.yaml +0 -0
  1014. /package/compliance/cache/{3.1.8 → 3.1.10}/specialisms/sales-guaranteed/index.yaml +0 -0
  1015. /package/compliance/cache/{3.1.8 → 3.1.10}/specialisms/sales-non-guaranteed/index.yaml +0 -0
  1016. /package/compliance/cache/{3.1.8 → 3.1.10}/specialisms/sales-proposal-mode/index.yaml +0 -0
  1017. /package/compliance/cache/{3.1.8 → 3.1.10}/specialisms/sales-social/index.yaml +0 -0
  1018. /package/compliance/cache/{3.1.8 → 3.1.10}/specialisms/signal-marketplace/index.yaml +0 -0
  1019. /package/compliance/cache/{3.1.8 → 3.1.10}/specialisms/signal-marketplace/scenarios/governance_denied.yaml +0 -0
  1020. /package/compliance/cache/{3.1.8 → 3.1.10}/specialisms/signal-owned/index.yaml +0 -0
  1021. /package/compliance/cache/{3.1.8 → 3.1.10}/specialisms/sponsored-intelligence/index.yaml +0 -0
  1022. /package/compliance/cache/{3.1.8 → 3.1.10}/test-kits/acme-outdoor-live.yaml +0 -0
  1023. /package/compliance/cache/{3.1.8 → 3.1.10}/test-kits/acme-outdoor.yaml +0 -0
  1024. /package/compliance/cache/{3.1.8 → 3.1.10}/test-kits/billing-gate-runner.yaml +0 -0
  1025. /package/compliance/cache/{3.1.8 → 3.1.10}/test-kits/bistro-oranje.yaml +0 -0
  1026. /package/compliance/cache/{3.1.8 → 3.1.10}/test-kits/distributed-brand-runner.yaml +0 -0
  1027. /package/compliance/cache/{3.1.8 → 3.1.10}/test-kits/nova-motors.yaml +0 -0
  1028. /package/compliance/cache/{3.1.8 → 3.1.10}/test-kits/osei-natural.yaml +0 -0
  1029. /package/compliance/cache/{3.1.8 → 3.1.10}/test-kits/parallel-dispatch-runner.yaml +0 -0
  1030. /package/compliance/cache/{3.1.8 → 3.1.10}/test-kits/rate-limit-trip-runner.yaml +0 -0
  1031. /package/compliance/cache/{3.1.8 → 3.1.10}/test-kits/signed-requests-runner.yaml +0 -0
  1032. /package/compliance/cache/{3.1.8 → 3.1.10}/test-kits/single-side-trust-runner.yaml +0 -0
  1033. /package/compliance/cache/{3.1.8 → 3.1.10}/test-kits/substitution-observer-runner.yaml +0 -0
  1034. /package/compliance/cache/{3.1.8 → 3.1.10}/test-kits/summit-foods.yaml +0 -0
  1035. /package/compliance/cache/{3.1.8 → 3.1.10}/test-kits/webhook-receiver-runner.yaml +0 -0
  1036. /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/catalog-macro-substitution.json +0 -0
  1037. /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/plan-hash/001-minimal-plan.json +0 -0
  1038. /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/plan-hash/002-full-plan.json +0 -0
  1039. /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/plan-hash/003-bookkeeping-stripped.json +0 -0
  1040. /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/plan-hash/004a-human-review-omitted.json +0 -0
  1041. /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/plan-hash/004b-human-review-explicit-null.json +0 -0
  1042. /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/plan-hash/005a-policy-categories-order-1.json +0 -0
  1043. /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/plan-hash/005b-policy-categories-order-2.json +0 -0
  1044. /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/plan-hash/006a-ext-trace-v1.json +0 -0
  1045. /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/plan-hash/006b-ext-trace-v2.json +0 -0
  1046. /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/plan-hash/007-unicode-objectives.json +0 -0
  1047. /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/plan-hash/008-numeric-canonicalization.json +0 -0
  1048. /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/request-signing/README.md +0 -0
  1049. /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/request-signing/canonicalization.json +0 -0
  1050. /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/request-signing/keys.json +0 -0
  1051. /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/request-signing/negative/001-no-signature-header.json +0 -0
  1052. /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/request-signing/negative/002-wrong-tag.json +0 -0
  1053. /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/request-signing/negative/003-expired-signature.json +0 -0
  1054. /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/request-signing/negative/004-window-too-long.json +0 -0
  1055. /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/request-signing/negative/005-alg-not-allowed.json +0 -0
  1056. /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/request-signing/negative/006-missing-covered-component.json +0 -0
  1057. /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/request-signing/negative/007-missing-content-digest.json +0 -0
  1058. /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/request-signing/negative/008-unknown-keyid.json +0 -0
  1059. /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/request-signing/negative/009-key-ops-missing-verify.json +0 -0
  1060. /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/request-signing/negative/010-content-digest-mismatch.json +0 -0
  1061. /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/request-signing/negative/011-malformed-header.json +0 -0
  1062. /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/request-signing/negative/012-missing-expires-param.json +0 -0
  1063. /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/request-signing/negative/013-expires-le-created.json +0 -0
  1064. /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/request-signing/negative/014-missing-nonce-param.json +0 -0
  1065. /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/request-signing/negative/015-signature-invalid.json +0 -0
  1066. /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/request-signing/negative/016-replayed-nonce.json +0 -0
  1067. /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/request-signing/negative/017-key-revoked.json +0 -0
  1068. /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/request-signing/negative/018-digest-covered-when-forbidden.json +0 -0
  1069. /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/request-signing/negative/019-signature-without-signature-input.json +0 -0
  1070. /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/request-signing/negative/020-rate-abuse.json +0 -0
  1071. /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/request-signing/negative/021-duplicate-signature-input-label.json +0 -0
  1072. /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/request-signing/negative/022-multi-valued-content-type.json +0 -0
  1073. /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/request-signing/negative/023-multi-valued-content-digest.json +0 -0
  1074. /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/request-signing/negative/024-unquoted-string-param.json +0 -0
  1075. /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/request-signing/negative/025-jwk-alg-crv-mismatch.json +0 -0
  1076. /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/request-signing/negative/026-non-ascii-host.json +0 -0
  1077. /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/request-signing/negative/027-webhook-registration-authentication-unsigned.json +0 -0
  1078. /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/request-signing/negative/028-unsigned-protocol-method-required.json +0 -0
  1079. /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/request-signing/positive/001-basic-post.json +0 -0
  1080. /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/request-signing/positive/002-post-with-content-digest.json +0 -0
  1081. /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/request-signing/positive/003-es256-post.json +0 -0
  1082. /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/request-signing/positive/004-multiple-signature-labels.json +0 -0
  1083. /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/request-signing/positive/005-default-port-stripped.json +0 -0
  1084. /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/request-signing/positive/006-dot-segment-path.json +0 -0
  1085. /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/request-signing/positive/007-query-byte-preserved.json +0 -0
  1086. /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/request-signing/positive/008-percent-encoded-path.json +0 -0
  1087. /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/request-signing/positive/009-percent-encoded-unreserved-decoded.json +0 -0
  1088. /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/request-signing/positive/010-percent-encoded-slash-preserved.json +0 -0
  1089. /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/request-signing/positive/011-ipv6-authority.json +0 -0
  1090. /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/request-signing/positive/012-ipv6-authority-default-port-stripped.json +0 -0
  1091. /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/webhook-receiver-envelope.json +0 -0
  1092. /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/webhook-signing/README.md +0 -0
  1093. /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/webhook-signing/keys.json +0 -0
  1094. /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/webhook-signing/negative/001-wrong-tag.json +0 -0
  1095. /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/webhook-signing/negative/002-expired-signature.json +0 -0
  1096. /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/webhook-signing/negative/003-window-too-long.json +0 -0
  1097. /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/webhook-signing/negative/004-alg-not-allowed.json +0 -0
  1098. /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/webhook-signing/negative/005-missing-authority-component.json +0 -0
  1099. /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/webhook-signing/negative/006-missing-content-digest.json +0 -0
  1100. /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/webhook-signing/negative/007-unknown-keyid.json +0 -0
  1101. /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/webhook-signing/negative/008-wrong-adcp-use.json +0 -0
  1102. /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/webhook-signing/negative/009-content-digest-mismatch.json +0 -0
  1103. /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/webhook-signing/negative/010-malformed-signature-input.json +0 -0
  1104. /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/webhook-signing/negative/011-signature-without-input.json +0 -0
  1105. /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/webhook-signing/negative/012-missing-expires-param.json +0 -0
  1106. /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/webhook-signing/negative/013-expires-le-created.json +0 -0
  1107. /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/webhook-signing/negative/014-missing-nonce-param.json +0 -0
  1108. /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/webhook-signing/negative/015-signature-invalid.json +0 -0
  1109. /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/webhook-signing/negative/016-replayed-nonce.json +0 -0
  1110. /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/webhook-signing/negative/017-key-revoked.json +0 -0
  1111. /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/webhook-signing/negative/018-rate-abuse.json +0 -0
  1112. /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/webhook-signing/negative/019-revocation-stale.json +0 -0
  1113. /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/webhook-signing/negative/020-key-ops-missing-verify.json +0 -0
  1114. /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/webhook-signing/negative/021-base64-alphabet-mixing.json +0 -0
  1115. /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/webhook-signing/positive/001-basic-post.json +0 -0
  1116. /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/webhook-signing/positive/002-es256-post.json +0 -0
  1117. /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/webhook-signing/positive/003-multiple-signature-labels.json +0 -0
  1118. /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/webhook-signing/positive/004-default-port-stripped.json +0 -0
  1119. /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/webhook-signing/positive/005-percent-encoded-path.json +0 -0
  1120. /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/webhook-signing/positive/006-query-byte-preserved.json +0 -0
  1121. /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/webhook-signing/positive/007-body-without-idempotency-key.json +0 -0
  1122. /package/compliance/cache/{3.1.8 → 3.1.10}/test-vectors/webhook-signing/positive/008-request-signing-key-reuse.json +0 -0
  1123. /package/compliance/cache/{3.1.8 → 3.1.10}/universal/billing-gate-dispatch.yaml +0 -0
  1124. /package/compliance/cache/{3.1.8 → 3.1.10}/universal/canonical-format-validate-input.yaml +0 -0
  1125. /package/compliance/cache/{3.1.8 → 3.1.10}/universal/capability-discovery.yaml +0 -0
  1126. /package/compliance/cache/{3.1.8 → 3.1.10}/universal/collection-lists-pagination-integrity.yaml +0 -0
  1127. /package/compliance/cache/{3.1.8 → 3.1.10}/universal/comply-controller-mode-gate.yaml +0 -0
  1128. /package/compliance/cache/{3.1.8 → 3.1.10}/universal/content-standards-pagination-integrity.yaml +0 -0
  1129. /package/compliance/cache/{3.1.8 → 3.1.10}/universal/deterministic-testing.yaml +0 -0
  1130. /package/compliance/cache/{3.1.8 → 3.1.10}/universal/error-compliance-signals.yaml +0 -0
  1131. /package/compliance/cache/{3.1.8 → 3.1.10}/universal/error-compliance.yaml +0 -0
  1132. /package/compliance/cache/{3.1.8 → 3.1.10}/universal/fictional-entities.yaml +0 -0
  1133. /package/compliance/cache/{3.1.8 → 3.1.10}/universal/get-media-buys-pagination-integrity.yaml +0 -0
  1134. /package/compliance/cache/{3.1.8 → 3.1.10}/universal/get-products-pagination-integrity.yaml +0 -0
  1135. /package/compliance/cache/{3.1.8 → 3.1.10}/universal/get-signals-pagination-integrity.yaml +0 -0
  1136. /package/compliance/cache/{3.1.8 → 3.1.10}/universal/idempotency.yaml +0 -0
  1137. /package/compliance/cache/{3.1.8 → 3.1.10}/universal/notification-config-event-scope.yaml +0 -0
  1138. /package/compliance/cache/{3.1.8 → 3.1.10}/universal/notification-config-lifecycle.yaml +0 -0
  1139. /package/compliance/cache/{3.1.8 → 3.1.10}/universal/notification-config-rejections.yaml +0 -0
  1140. /package/compliance/cache/{3.1.8 → 3.1.10}/universal/pagination-integrity-creative-formats.yaml +0 -0
  1141. /package/compliance/cache/{3.1.8 → 3.1.10}/universal/pagination-integrity-list-accounts.yaml +0 -0
  1142. /package/compliance/cache/{3.1.8 → 3.1.10}/universal/pagination-integrity.yaml +0 -0
  1143. /package/compliance/cache/{3.1.8 → 3.1.10}/universal/property-lists-pagination-integrity.yaml +0 -0
  1144. /package/compliance/cache/{3.1.8 → 3.1.10}/universal/read-tool-idempotency.yaml +0 -0
  1145. /package/compliance/cache/{3.1.8 → 3.1.10}/universal/schema-validation-signals.yaml +0 -0
  1146. /package/compliance/cache/{3.1.8 → 3.1.10}/universal/schema-validation.yaml +0 -0
  1147. /package/compliance/cache/{3.1.8 → 3.1.10}/universal/security.yaml +0 -0
  1148. /package/compliance/cache/{3.1.8 → 3.1.10}/universal/signed-requests.yaml +0 -0
  1149. /package/compliance/cache/{3.1.8 → 3.1.10}/universal/stale-response-advisory.yaml +0 -0
  1150. /package/compliance/cache/{3.1.8 → 3.1.10}/universal/storyboard-schema.yaml +0 -0
  1151. /package/compliance/cache/{3.1.8 → 3.1.10}/universal/v3-envelope-integrity.yaml +0 -0
  1152. /package/compliance/cache/{3.1.8 → 3.1.10}/universal/version-negotiation.yaml +0 -0
  1153. /package/compliance/cache/{3.1.8 → 3.1.10}/universal/webhook-emission.yaml +0 -0
  1154. /package/compliance/cache/{3.1.8 → 3.1.10}/universal/webhook-receiver-envelope.yaml +0 -0
  1155. /package/compliance/cache/{3.1.8 → 3.1.10}/universal/wholesale-feed-bulk-webhooks.yaml +0 -0
  1156. /package/compliance/cache/{3.1.8 → 3.1.10}/universal/wholesale-feed-product-webhooks.yaml +0 -0
  1157. /package/compliance/cache/{3.1.8 → 3.1.10}/universal/wholesale-feed-products.yaml +0 -0
  1158. /package/compliance/cache/{3.1.8 → 3.1.10}/universal/wholesale-feed-signal-webhooks.yaml +0 -0
  1159. /package/compliance/cache/{3.1.8 → 3.1.10}/universal/wholesale-feed-signals.yaml +0 -0
  1160. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/domains/brand/index.yaml +0 -0
  1161. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/domains/brand/scenarios/distributed_brand_resolution.yaml +0 -0
  1162. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/domains/brand/scenarios/single_side_trust_extension.yaml +0 -0
  1163. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/domains/creative/index.yaml +0 -0
  1164. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/domains/creative/scenarios/billing_out_of_band.yaml +0 -0
  1165. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/domains/creative/scenarios/canonical_supported_formats.yaml +0 -0
  1166. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/domains/creative/scenarios/creative_lifecycle_webhooks.yaml +0 -0
  1167. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/domains/creative/scenarios/evaluator_auth.yaml +0 -0
  1168. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/domains/creative/scenarios/native_in_feed.yaml +0 -0
  1169. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/domains/governance/index.yaml +0 -0
  1170. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/domains/media-buy/scenarios/audience_buy_flow.yaml +0 -0
  1171. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/domains/media-buy/scenarios/available_actions.yaml +0 -0
  1172. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/domains/media-buy/scenarios/billing_finality_delivery.yaml +0 -0
  1173. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/domains/media-buy/scenarios/canonical_formats.yaml +0 -0
  1174. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/domains/media-buy/scenarios/clicks_buy_flow.yaml +0 -0
  1175. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/domains/media-buy/scenarios/completed_views_buy_flow.yaml +0 -0
  1176. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/domains/media-buy/scenarios/create_media_buy_async.yaml +0 -0
  1177. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/domains/media-buy/scenarios/creative_fate_after_cancellation.yaml +0 -0
  1178. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/domains/media-buy/scenarios/creative_reception.yaml +0 -0
  1179. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/domains/media-buy/scenarios/delivery_reporting.yaml +0 -0
  1180. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/domains/media-buy/scenarios/dependency_impairment.yaml +0 -0
  1181. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/domains/media-buy/scenarios/dependency_impairment_cardinality.yaml +0 -0
  1182. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/domains/media-buy/scenarios/event_dedup_flow.yaml +0 -0
  1183. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/domains/media-buy/scenarios/frequency_cap_enforcement.yaml +0 -0
  1184. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/domains/media-buy/scenarios/get_products_async.yaml +0 -0
  1185. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/domains/media-buy/scenarios/governance_approved.yaml +0 -0
  1186. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/domains/media-buy/scenarios/governance_conditions.yaml +0 -0
  1187. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/domains/media-buy/scenarios/governance_denied.yaml +0 -0
  1188. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/domains/media-buy/scenarios/governance_denied_recovery.yaml +0 -0
  1189. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/domains/media-buy/scenarios/inline_creatives_without_sync.yaml +0 -0
  1190. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/domains/media-buy/scenarios/invalid_transitions.yaml +0 -0
  1191. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/domains/media-buy/scenarios/inventory_list_no_match.yaml +0 -0
  1192. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/domains/media-buy/scenarios/inventory_list_targeting.yaml +0 -0
  1193. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/domains/media-buy/scenarios/measurement_accountability.yaml +0 -0
  1194. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/domains/media-buy/scenarios/measurement_terms_rejected.yaml +0 -0
  1195. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/domains/media-buy/scenarios/package_correlation_legacy_fallback.yaml +0 -0
  1196. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/domains/media-buy/scenarios/pending_creatives_to_start.yaml +0 -0
  1197. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/domains/media-buy/scenarios/per_creative_conversion_attribution.yaml +0 -0
  1198. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/domains/media-buy/scenarios/performance_buy_flow.yaml +0 -0
  1199. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/domains/media-buy/scenarios/performance_buy_flow_roas.yaml +0 -0
  1200. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/domains/media-buy/scenarios/pricing_currency_filter.yaml +0 -0
  1201. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/domains/media-buy/scenarios/product_signal_targeting.yaml +0 -0
  1202. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/domains/media-buy/scenarios/proposal_finalize.yaml +0 -0
  1203. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/domains/media-buy/scenarios/proposal_finalize_asap_timing.yaml +0 -0
  1204. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/domains/media-buy/scenarios/proposal_not_found_errors.yaml +0 -0
  1205. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/domains/media-buy/scenarios/provenance_audit_observation.yaml +0 -0
  1206. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/domains/media-buy/scenarios/provenance_enforcement.yaml +0 -0
  1207. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/domains/media-buy/scenarios/provenance_truth_of_claim.yaml +0 -0
  1208. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/domains/media-buy/scenarios/reach_buy_flow.yaml +0 -0
  1209. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/domains/media-buy/scenarios/refine_finalize_exclusivity.yaml +0 -0
  1210. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/domains/media-buy/scenarios/refine_products.yaml +0 -0
  1211. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/domains/media-buy/scenarios/vendor_metric_accountability.yaml +0 -0
  1212. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/domains/media-buy/scenarios/vendor_metric_catalog_precondition.yaml +0 -0
  1213. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/domains/media-buy/scenarios/vendor_metric_optimization_flow.yaml +0 -0
  1214. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/domains/media-buy/state-machine.yaml +0 -0
  1215. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/domains/signals/index.yaml +0 -0
  1216. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/domains/signals/scenarios/get_signals_async.yaml +0 -0
  1217. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/domains/sponsored-intelligence/index.yaml +0 -0
  1218. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/domains/sponsored-intelligence/sponsored-context-accountability.yaml +0 -0
  1219. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/protocols/brand/index.yaml +0 -0
  1220. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/protocols/brand/scenarios/distributed_brand_resolution.yaml +0 -0
  1221. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/protocols/brand/scenarios/single_side_trust_extension.yaml +0 -0
  1222. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/protocols/creative/index.yaml +0 -0
  1223. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/protocols/creative/scenarios/billing_out_of_band.yaml +0 -0
  1224. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/protocols/creative/scenarios/canonical_supported_formats.yaml +0 -0
  1225. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/protocols/creative/scenarios/creative_lifecycle_webhooks.yaml +0 -0
  1226. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/protocols/creative/scenarios/evaluator_auth.yaml +0 -0
  1227. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/protocols/creative/scenarios/native_in_feed.yaml +0 -0
  1228. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/protocols/governance/index.yaml +0 -0
  1229. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/protocols/media-buy/scenarios/audience_buy_flow.yaml +0 -0
  1230. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/protocols/media-buy/scenarios/available_actions.yaml +0 -0
  1231. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/protocols/media-buy/scenarios/billing_finality_delivery.yaml +0 -0
  1232. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/protocols/media-buy/scenarios/canonical_formats.yaml +0 -0
  1233. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/protocols/media-buy/scenarios/clicks_buy_flow.yaml +0 -0
  1234. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/protocols/media-buy/scenarios/completed_views_buy_flow.yaml +0 -0
  1235. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/protocols/media-buy/scenarios/create_media_buy_async.yaml +0 -0
  1236. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/protocols/media-buy/scenarios/creative_fate_after_cancellation.yaml +0 -0
  1237. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/protocols/media-buy/scenarios/creative_reception.yaml +0 -0
  1238. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/protocols/media-buy/scenarios/delivery_reporting.yaml +0 -0
  1239. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/protocols/media-buy/scenarios/dependency_impairment.yaml +0 -0
  1240. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/protocols/media-buy/scenarios/dependency_impairment_cardinality.yaml +0 -0
  1241. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/protocols/media-buy/scenarios/event_dedup_flow.yaml +0 -0
  1242. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/protocols/media-buy/scenarios/frequency_cap_enforcement.yaml +0 -0
  1243. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/protocols/media-buy/scenarios/get_products_async.yaml +0 -0
  1244. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/protocols/media-buy/scenarios/governance_approved.yaml +0 -0
  1245. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/protocols/media-buy/scenarios/governance_conditions.yaml +0 -0
  1246. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/protocols/media-buy/scenarios/governance_denied.yaml +0 -0
  1247. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/protocols/media-buy/scenarios/governance_denied_recovery.yaml +0 -0
  1248. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/protocols/media-buy/scenarios/inline_creatives_without_sync.yaml +0 -0
  1249. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/protocols/media-buy/scenarios/invalid_transitions.yaml +0 -0
  1250. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/protocols/media-buy/scenarios/inventory_list_no_match.yaml +0 -0
  1251. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/protocols/media-buy/scenarios/inventory_list_targeting.yaml +0 -0
  1252. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/protocols/media-buy/scenarios/measurement_accountability.yaml +0 -0
  1253. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/protocols/media-buy/scenarios/measurement_terms_rejected.yaml +0 -0
  1254. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/protocols/media-buy/scenarios/package_correlation_legacy_fallback.yaml +0 -0
  1255. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/protocols/media-buy/scenarios/pending_creatives_to_start.yaml +0 -0
  1256. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/protocols/media-buy/scenarios/per_creative_conversion_attribution.yaml +0 -0
  1257. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/protocols/media-buy/scenarios/performance_buy_flow.yaml +0 -0
  1258. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/protocols/media-buy/scenarios/performance_buy_flow_roas.yaml +0 -0
  1259. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/protocols/media-buy/scenarios/pricing_currency_filter.yaml +0 -0
  1260. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/protocols/media-buy/scenarios/product_signal_targeting.yaml +0 -0
  1261. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/protocols/media-buy/scenarios/proposal_finalize.yaml +0 -0
  1262. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/protocols/media-buy/scenarios/proposal_finalize_asap_timing.yaml +0 -0
  1263. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/protocols/media-buy/scenarios/proposal_not_found_errors.yaml +0 -0
  1264. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/protocols/media-buy/scenarios/provenance_audit_observation.yaml +0 -0
  1265. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/protocols/media-buy/scenarios/provenance_enforcement.yaml +0 -0
  1266. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/protocols/media-buy/scenarios/provenance_truth_of_claim.yaml +0 -0
  1267. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/protocols/media-buy/scenarios/reach_buy_flow.yaml +0 -0
  1268. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/protocols/media-buy/scenarios/refine_finalize_exclusivity.yaml +0 -0
  1269. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/protocols/media-buy/scenarios/refine_products.yaml +0 -0
  1270. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/protocols/media-buy/scenarios/vendor_metric_accountability.yaml +0 -0
  1271. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/protocols/media-buy/scenarios/vendor_metric_catalog_precondition.yaml +0 -0
  1272. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/protocols/media-buy/scenarios/vendor_metric_optimization_flow.yaml +0 -0
  1273. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/protocols/media-buy/state-machine.yaml +0 -0
  1274. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/protocols/signals/index.yaml +0 -0
  1275. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/protocols/signals/scenarios/get_signals_async.yaml +0 -0
  1276. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/protocols/sponsored-intelligence/index.yaml +0 -0
  1277. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/protocols/sponsored-intelligence/sponsored-context-accountability.yaml +0 -0
  1278. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/specialisms/audience-sync/index.yaml +0 -0
  1279. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/specialisms/brand-rights/index.yaml +0 -0
  1280. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/specialisms/brand-rights/scenarios/governance_denied.yaml +0 -0
  1281. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/specialisms/collection-lists/index.yaml +0 -0
  1282. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/specialisms/content-standards/index.yaml +0 -0
  1283. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/specialisms/creative-ad-server/index.yaml +0 -0
  1284. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/specialisms/creative-generative/generative-seller.yaml +0 -0
  1285. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/specialisms/creative-generative/index.yaml +0 -0
  1286. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/specialisms/creative-template/index.yaml +0 -0
  1287. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/specialisms/creative-transformers/index.yaml +0 -0
  1288. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/specialisms/governance-aware-seller/index.yaml +0 -0
  1289. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/specialisms/governance-aware-seller/scenarios/governance_multi_agent_rejected.yaml +0 -0
  1290. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/specialisms/governance-delivery-monitor/index.yaml +0 -0
  1291. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/specialisms/governance-spend-authority/denied.yaml +0 -0
  1292. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/specialisms/governance-spend-authority/index.yaml +0 -0
  1293. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/specialisms/property-lists/index.yaml +0 -0
  1294. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/specialisms/sales-broadcast-tv/index.yaml +0 -0
  1295. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/specialisms/sales-catalog-driven/index.yaml +0 -0
  1296. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/specialisms/sales-guaranteed/index.yaml +0 -0
  1297. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/specialisms/sales-non-guaranteed/index.yaml +0 -0
  1298. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/specialisms/sales-proposal-mode/index.yaml +0 -0
  1299. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/specialisms/sales-social/index.yaml +0 -0
  1300. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/specialisms/signal-marketplace/index.yaml +0 -0
  1301. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/specialisms/signal-marketplace/scenarios/governance_denied.yaml +0 -0
  1302. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/specialisms/signal-owned/index.yaml +0 -0
  1303. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/specialisms/sponsored-intelligence/index.yaml +0 -0
  1304. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-kits/acme-outdoor-live.yaml +0 -0
  1305. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-kits/acme-outdoor.yaml +0 -0
  1306. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-kits/billing-gate-runner.yaml +0 -0
  1307. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-kits/bistro-oranje.yaml +0 -0
  1308. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-kits/distributed-brand-runner.yaml +0 -0
  1309. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-kits/nova-motors.yaml +0 -0
  1310. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-kits/osei-natural.yaml +0 -0
  1311. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-kits/parallel-dispatch-runner.yaml +0 -0
  1312. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-kits/rate-limit-trip-runner.yaml +0 -0
  1313. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-kits/signed-requests-runner.yaml +0 -0
  1314. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-kits/single-side-trust-runner.yaml +0 -0
  1315. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-kits/substitution-observer-runner.yaml +0 -0
  1316. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-kits/summit-foods.yaml +0 -0
  1317. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-kits/webhook-receiver-runner.yaml +0 -0
  1318. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/catalog-macro-substitution.json +0 -0
  1319. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/plan-hash/001-minimal-plan.json +0 -0
  1320. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/plan-hash/002-full-plan.json +0 -0
  1321. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/plan-hash/003-bookkeeping-stripped.json +0 -0
  1322. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/plan-hash/004a-human-review-omitted.json +0 -0
  1323. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/plan-hash/004b-human-review-explicit-null.json +0 -0
  1324. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/plan-hash/005a-policy-categories-order-1.json +0 -0
  1325. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/plan-hash/005b-policy-categories-order-2.json +0 -0
  1326. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/plan-hash/006a-ext-trace-v1.json +0 -0
  1327. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/plan-hash/006b-ext-trace-v2.json +0 -0
  1328. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/plan-hash/007-unicode-objectives.json +0 -0
  1329. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/plan-hash/008-numeric-canonicalization.json +0 -0
  1330. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/request-signing/README.md +0 -0
  1331. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/request-signing/canonicalization.json +0 -0
  1332. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/request-signing/keys.json +0 -0
  1333. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/request-signing/negative/001-no-signature-header.json +0 -0
  1334. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/request-signing/negative/002-wrong-tag.json +0 -0
  1335. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/request-signing/negative/003-expired-signature.json +0 -0
  1336. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/request-signing/negative/004-window-too-long.json +0 -0
  1337. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/request-signing/negative/005-alg-not-allowed.json +0 -0
  1338. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/request-signing/negative/006-missing-covered-component.json +0 -0
  1339. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/request-signing/negative/007-missing-content-digest.json +0 -0
  1340. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/request-signing/negative/008-unknown-keyid.json +0 -0
  1341. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/request-signing/negative/009-key-ops-missing-verify.json +0 -0
  1342. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/request-signing/negative/010-content-digest-mismatch.json +0 -0
  1343. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/request-signing/negative/011-malformed-header.json +0 -0
  1344. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/request-signing/negative/012-missing-expires-param.json +0 -0
  1345. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/request-signing/negative/013-expires-le-created.json +0 -0
  1346. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/request-signing/negative/014-missing-nonce-param.json +0 -0
  1347. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/request-signing/negative/015-signature-invalid.json +0 -0
  1348. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/request-signing/negative/016-replayed-nonce.json +0 -0
  1349. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/request-signing/negative/017-key-revoked.json +0 -0
  1350. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/request-signing/negative/018-digest-covered-when-forbidden.json +0 -0
  1351. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/request-signing/negative/019-signature-without-signature-input.json +0 -0
  1352. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/request-signing/negative/020-rate-abuse.json +0 -0
  1353. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/request-signing/negative/021-duplicate-signature-input-label.json +0 -0
  1354. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/request-signing/negative/022-multi-valued-content-type.json +0 -0
  1355. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/request-signing/negative/023-multi-valued-content-digest.json +0 -0
  1356. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/request-signing/negative/024-unquoted-string-param.json +0 -0
  1357. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/request-signing/negative/025-jwk-alg-crv-mismatch.json +0 -0
  1358. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/request-signing/negative/026-non-ascii-host.json +0 -0
  1359. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/request-signing/negative/027-webhook-registration-authentication-unsigned.json +0 -0
  1360. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/request-signing/negative/028-unsigned-protocol-method-required.json +0 -0
  1361. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/request-signing/positive/001-basic-post.json +0 -0
  1362. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/request-signing/positive/002-post-with-content-digest.json +0 -0
  1363. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/request-signing/positive/003-es256-post.json +0 -0
  1364. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/request-signing/positive/004-multiple-signature-labels.json +0 -0
  1365. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/request-signing/positive/005-default-port-stripped.json +0 -0
  1366. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/request-signing/positive/006-dot-segment-path.json +0 -0
  1367. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/request-signing/positive/007-query-byte-preserved.json +0 -0
  1368. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/request-signing/positive/008-percent-encoded-path.json +0 -0
  1369. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/request-signing/positive/009-percent-encoded-unreserved-decoded.json +0 -0
  1370. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/request-signing/positive/010-percent-encoded-slash-preserved.json +0 -0
  1371. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/request-signing/positive/011-ipv6-authority.json +0 -0
  1372. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/request-signing/positive/012-ipv6-authority-default-port-stripped.json +0 -0
  1373. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/webhook-receiver-envelope.json +0 -0
  1374. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/webhook-signing/README.md +0 -0
  1375. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/webhook-signing/keys.json +0 -0
  1376. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/webhook-signing/negative/001-wrong-tag.json +0 -0
  1377. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/webhook-signing/negative/002-expired-signature.json +0 -0
  1378. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/webhook-signing/negative/003-window-too-long.json +0 -0
  1379. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/webhook-signing/negative/004-alg-not-allowed.json +0 -0
  1380. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/webhook-signing/negative/005-missing-authority-component.json +0 -0
  1381. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/webhook-signing/negative/006-missing-content-digest.json +0 -0
  1382. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/webhook-signing/negative/007-unknown-keyid.json +0 -0
  1383. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/webhook-signing/negative/008-wrong-adcp-use.json +0 -0
  1384. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/webhook-signing/negative/009-content-digest-mismatch.json +0 -0
  1385. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/webhook-signing/negative/010-malformed-signature-input.json +0 -0
  1386. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/webhook-signing/negative/011-signature-without-input.json +0 -0
  1387. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/webhook-signing/negative/012-missing-expires-param.json +0 -0
  1388. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/webhook-signing/negative/013-expires-le-created.json +0 -0
  1389. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/webhook-signing/negative/014-missing-nonce-param.json +0 -0
  1390. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/webhook-signing/negative/015-signature-invalid.json +0 -0
  1391. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/webhook-signing/negative/016-replayed-nonce.json +0 -0
  1392. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/webhook-signing/negative/017-key-revoked.json +0 -0
  1393. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/webhook-signing/negative/018-rate-abuse.json +0 -0
  1394. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/webhook-signing/negative/019-revocation-stale.json +0 -0
  1395. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/webhook-signing/negative/020-key-ops-missing-verify.json +0 -0
  1396. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/webhook-signing/negative/021-base64-alphabet-mixing.json +0 -0
  1397. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/webhook-signing/positive/001-basic-post.json +0 -0
  1398. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/webhook-signing/positive/002-es256-post.json +0 -0
  1399. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/webhook-signing/positive/003-multiple-signature-labels.json +0 -0
  1400. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/webhook-signing/positive/004-default-port-stripped.json +0 -0
  1401. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/webhook-signing/positive/005-percent-encoded-path.json +0 -0
  1402. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/webhook-signing/positive/006-query-byte-preserved.json +0 -0
  1403. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/webhook-signing/positive/007-body-without-idempotency-key.json +0 -0
  1404. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/test-vectors/webhook-signing/positive/008-request-signing-key-reuse.json +0 -0
  1405. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/universal/billing-gate-dispatch.yaml +0 -0
  1406. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/universal/canonical-format-validate-input.yaml +0 -0
  1407. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/universal/capability-discovery.yaml +0 -0
  1408. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/universal/collection-lists-pagination-integrity.yaml +0 -0
  1409. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/universal/comply-controller-mode-gate.yaml +0 -0
  1410. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/universal/content-standards-pagination-integrity.yaml +0 -0
  1411. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/universal/deterministic-testing.yaml +0 -0
  1412. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/universal/error-compliance-signals.yaml +0 -0
  1413. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/universal/error-compliance.yaml +0 -0
  1414. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/universal/fictional-entities.yaml +0 -0
  1415. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/universal/get-media-buys-pagination-integrity.yaml +0 -0
  1416. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/universal/get-products-pagination-integrity.yaml +0 -0
  1417. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/universal/get-signals-pagination-integrity.yaml +0 -0
  1418. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/universal/idempotency.yaml +0 -0
  1419. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/universal/notification-config-event-scope.yaml +0 -0
  1420. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/universal/notification-config-lifecycle.yaml +0 -0
  1421. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/universal/notification-config-rejections.yaml +0 -0
  1422. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/universal/pagination-integrity-creative-formats.yaml +0 -0
  1423. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/universal/pagination-integrity-list-accounts.yaml +0 -0
  1424. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/universal/pagination-integrity.yaml +0 -0
  1425. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/universal/property-lists-pagination-integrity.yaml +0 -0
  1426. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/universal/read-tool-idempotency.yaml +0 -0
  1427. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/universal/schema-validation-signals.yaml +0 -0
  1428. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/universal/schema-validation.yaml +0 -0
  1429. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/universal/security.yaml +0 -0
  1430. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/universal/signed-requests.yaml +0 -0
  1431. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/universal/stale-response-advisory.yaml +0 -0
  1432. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/universal/storyboard-schema.yaml +0 -0
  1433. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/universal/v3-envelope-integrity.yaml +0 -0
  1434. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/universal/version-negotiation.yaml +0 -0
  1435. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/universal/webhook-emission.yaml +0 -0
  1436. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/universal/webhook-receiver-envelope.yaml +0 -0
  1437. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/universal/wholesale-feed-bulk-webhooks.yaml +0 -0
  1438. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/universal/wholesale-feed-product-webhooks.yaml +0 -0
  1439. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/universal/wholesale-feed-products.yaml +0 -0
  1440. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/universal/wholesale-feed-signal-webhooks.yaml +0 -0
  1441. /package/compliance/cache/{3.1.8.previous → 3.1.10.previous}/universal/wholesale-feed-signals.yaml +0 -0
@@ -18,6 +18,7 @@ var __copyProps = (to, from, except, desc) => {
18
18
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
19
  var web_flow_exports = {};
20
20
  __export(web_flow_exports, {
21
+ AgentChangedDuringFlowError: () => AgentChangedDuringFlowError,
21
22
  AgentVanishedDuringFlowError: () => AgentVanishedDuringFlowError,
22
23
  BrowserBindingRequiredError: () => BrowserBindingRequiredError,
23
24
  ConfidentialClientNotAllowedError: () => ConfidentialClientNotAllowedError,
@@ -36,6 +37,7 @@ var import_crypto = require("crypto");
36
37
  var import_auth = require("@modelcontextprotocol/sdk/client/auth.js");
37
38
  var import_auth_utils = require("@modelcontextprotocol/sdk/shared/auth-utils.js");
38
39
  var import_types = require('./types.js');
40
+ var import_resource_url = require('./resource-url.js');
39
41
  const DEFAULT_WEB_FLOW_TTL_MS = 10 * 60 * 1e3;
40
42
  class InvalidOrExpiredFlowError extends import_types.OAuthError {
41
43
  constructor(state) {
@@ -77,6 +79,16 @@ class AgentVanishedDuringFlowError extends import_types.OAuthError {
77
79
  this.name = "AgentVanishedDuringFlowError";
78
80
  }
79
81
  }
82
+ class AgentChangedDuringFlowError extends import_types.OAuthError {
83
+ constructor(agentId) {
84
+ super(
85
+ `Agent ${agentId} changed while OAuth authorization was pending; tokens were not saved`,
86
+ "agent_changed_during_flow",
87
+ agentId
88
+ );
89
+ this.name = "AgentChangedDuringFlowError";
90
+ }
91
+ }
80
92
  class ConfidentialClientNotAllowedError extends import_types.OAuthError {
81
93
  constructor(agentId) {
82
94
  super(
@@ -104,6 +116,9 @@ async function startWebOAuthFlow(opts) {
104
116
  agentStorage,
105
117
  carry,
106
118
  scopeHint,
119
+ resourceOverride: requestedResourceOverride,
120
+ audience,
121
+ allowHttp = false,
107
122
  ttlMs = DEFAULT_WEB_FLOW_TTL_MS,
108
123
  generateState,
109
124
  fetch: fetchFn,
@@ -113,8 +128,11 @@ async function startWebOAuthFlow(opts) {
113
128
  if (!agent.agent_uri) {
114
129
  throw new import_types.OAuthError("Agent missing agent_uri", "invalid_agent", agent.id);
115
130
  }
131
+ const resourceOverrideAction = requestedResourceOverride === null ? "clear" : requestedResourceOverride !== void 0 ? "set" : void 0;
132
+ const rawResourceOverride = requestedResourceOverride === null ? void 0 : requestedResourceOverride ?? agent.oauth_resource;
133
+ const resourceOverride = rawResourceOverride ? (0, import_resource_url.validateOAuthResourceUrl)(rawResourceOverride, { allowHttp }).href : void 0;
116
134
  const prm = await tryDiscoverPRM(agent.agent_uri, fetchFn);
117
- if (prm?.resource) {
135
+ if (!resourceOverride && prm?.resource) {
118
136
  assertPrmResourceMatchesAgentOrigin(agent.agent_uri, prm.resource);
119
137
  }
120
138
  const asUrl = resolveAuthorizationServerUrl(agent.agent_uri, prm);
@@ -122,7 +140,7 @@ async function startWebOAuthFlow(opts) {
122
140
  if (!asMetadata) {
123
141
  throw new import_types.OAuthError(`No OAuth metadata at ${asUrl.toString()}`, "no_authorization_server_metadata", agent.id);
124
142
  }
125
- const resource = prm?.resource ? new URL(prm.resource) : (0, import_auth_utils.resourceUrlFromServerUrl)(new URL(agent.agent_uri));
143
+ const resource = resourceOverride ? new URL(resourceOverride) : prm?.resource ? new URL(prm.resource) : (0, import_auth_utils.resourceUrlFromServerUrl)(new URL(agent.agent_uri));
126
144
  const baseClientMetadata = {
127
145
  ...import_types.DEFAULT_CLIENT_METADATA,
128
146
  ...clientMetadataOverrides,
@@ -147,6 +165,9 @@ async function startWebOAuthFlow(opts) {
147
165
  state,
148
166
  resource
149
167
  });
168
+ if (audience) {
169
+ authorizationUrl.searchParams.set("audience", audience);
170
+ }
150
171
  const now = /* @__PURE__ */ new Date();
151
172
  const expiresAt = new Date(now.getTime() + ttlMs);
152
173
  const flow = {
@@ -156,6 +177,9 @@ async function startWebOAuthFlow(opts) {
156
177
  codeVerifier,
157
178
  redirectUri,
158
179
  resource: resource.href,
180
+ resourceOverride,
181
+ resourceOverrideAction,
182
+ resourceOverrideSnapshot: agent.oauth_resource ?? null,
159
183
  scope,
160
184
  authorizationServerUrl: asUrl.toString(),
161
185
  clientInformation,
@@ -186,6 +210,11 @@ async function completeWebOAuthFlow(opts) {
186
210
  if (!flow || flow.expiresAt.getTime() < Date.now()) {
187
211
  throw new InvalidOrExpiredFlowError(state);
188
212
  }
213
+ let agentForPersistence;
214
+ if (agentStorage) {
215
+ agentForPersistence = await agentStorage.loadAgent(flow.agentId);
216
+ assertAgentUnchangedForFlow(agentForPersistence, flow);
217
+ }
189
218
  const asMetadata = await (0, import_auth.discoverAuthorizationServerMetadata)(flow.authorizationServerUrl, {
190
219
  fetchFn
191
220
  });
@@ -205,13 +234,16 @@ async function completeWebOAuthFlow(opts) {
205
234
  }
206
235
  let persisted = false;
207
236
  if (agentStorage) {
208
- const agent = await agentStorage.loadAgent(flow.agentId);
209
- if (!agent) {
210
- throw new AgentVanishedDuringFlowError(flow.agentId);
237
+ agentForPersistence = await agentStorage.loadAgent(flow.agentId);
238
+ assertAgentUnchangedForFlow(agentForPersistence, flow);
239
+ agentForPersistence.oauth_tokens = (0, import_types.fromMCPTokens)(tokens);
240
+ if (flow.resourceOverrideAction === "set" && flow.resourceOverride) {
241
+ agentForPersistence.oauth_resource = flow.resourceOverride;
242
+ } else if (flow.resourceOverrideAction === "clear") {
243
+ delete agentForPersistence.oauth_resource;
211
244
  }
212
- agent.oauth_tokens = (0, import_types.fromMCPTokens)(tokens);
213
- delete agent.oauth_code_verifier;
214
- await agentStorage.saveAgent(agent);
245
+ delete agentForPersistence.oauth_code_verifier;
246
+ await agentStorage.saveAgent(agentForPersistence);
215
247
  persisted = true;
216
248
  }
217
249
  return {
@@ -222,6 +254,17 @@ async function completeWebOAuthFlow(opts) {
222
254
  persisted
223
255
  };
224
256
  }
257
+ function assertAgentUnchangedForFlow(agent, flow) {
258
+ if (!agent) {
259
+ throw new AgentVanishedDuringFlowError(flow.agentId);
260
+ }
261
+ if (agent.agent_uri !== flow.agentUrl) {
262
+ throw new AgentChangedDuringFlowError(flow.agentId);
263
+ }
264
+ if (Object.prototype.hasOwnProperty.call(flow, "resourceOverrideSnapshot") && (agent.oauth_resource ?? null) !== flow.resourceOverrideSnapshot) {
265
+ throw new AgentChangedDuringFlowError(flow.agentId);
266
+ }
267
+ }
225
268
  function safeReturnTo(value, options = {}) {
226
269
  if (typeof value !== "string" || value.length === 0) return void 0;
227
270
  if (value.startsWith("/") && !value.startsWith("//") && !value.startsWith("/\\")) {
@@ -343,6 +386,7 @@ function redactTokens(input) {
343
386
  }
344
387
  // Annotate the CommonJS export names for ESM import in node:
345
388
  0 && (module.exports = {
389
+ AgentChangedDuringFlowError,
346
390
  AgentVanishedDuringFlowError,
347
391
  BrowserBindingRequiredError,
348
392
  ConfidentialClientNotAllowedError,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/lib/auth/oauth/web-flow.ts"],"sourcesContent":["/**\n * Web (server-side) OAuth flow helpers for `@adcp/sdk`.\n *\n * Companion to `CLIFlowHandler` for environments where `/oauth/start` and\n * `/oauth/callback` may be served by different processes. Discovery, PKCE,\n * URL construction, and token exchange are delegated to the MCP SDK's\n * `client/auth.js` primitives so this module is glue plus a pending-flow\n * store interface — not reimplemented protocol logic.\n *\n * Wire contract:\n * - PRM (RFC 9728) is consulted first; `prm.resource` is the source of\n * truth for the RFC 8707 `resource` indicator. We fall back to\n * `resourceUrlFromServerUrl(agent.agent_uri)` only when the resource\n * server does not implement PRM (404). Connection / parse / 5xx\n * errors throw `ProtectedResourceMetadataError` — never silently\n * downgrade to local guessing.\n * - `prm.resource` must share an origin with the agent URL; the MCP\n * SDK's `checkResourceAllowed` guards against a poisoned PRM\n * pointing the audience at a third party.\n * - AS URL = `prm.authorization_servers[0]` when PRM is present, else\n * the agent origin.\n * - Scope priority: caller-supplied `scopeHint` (e.g. from a 401\n * `WWW-Authenticate` challenge, per SEP-835) > `prm.scopes_supported`\n * > `clientMetadata.scope`.\n * - Refresh is NOT this module's concern. Once `oauth_tokens` are\n * persisted, `MCPOAuthProvider` handles refresh on the next agent\n * call and the MCP SDK forwards `resource` into the refresh request.\n * Callers who DIY refresh against `oauth_tokens` are responsible for\n * forwarding `resource` themselves.\n */\n\nimport { randomBytes } from 'crypto';\nimport {\n discoverAuthorizationServerMetadata,\n discoverOAuthProtectedResourceMetadata,\n exchangeAuthorization,\n registerClient,\n startAuthorization,\n} from '@modelcontextprotocol/sdk/client/auth.js';\nimport { checkResourceAllowed, resourceUrlFromServerUrl } from '@modelcontextprotocol/sdk/shared/auth-utils.js';\nimport type {\n AuthorizationServerMetadata,\n OAuthClientInformation,\n OAuthClientInformationFull,\n OAuthClientMetadata,\n OAuthProtectedResourceMetadata,\n OAuthTokens,\n} from '@modelcontextprotocol/sdk/shared/auth.js';\n\nimport type { AgentConfig, OAuthConfigStorage } from './types';\nimport { DEFAULT_CLIENT_METADATA, fromMCPClientInfo, fromMCPTokens, OAuthError, toMCPClientInfo } from './types';\n\n/**\n * Default TTL for a pending web flow row. RFC 6749 §10.12 recommends\n * short-lived state; 10 minutes covers slow-typing users without leaving\n * the PKCE verifier on disk longer than necessary.\n */\nexport const DEFAULT_WEB_FLOW_TTL_MS = 10 * 60 * 1000;\n\n/**\n * State persisted between `/oauth/start` and `/oauth/callback`.\n *\n * `codeVerifier` is a PKCE secret. Store implementations MUST encrypt it\n * at rest if persistence crosses a trust boundary (shared DB, cross-tenant\n * Redis, etc.).\n *\n * `carry` is preserved verbatim and round-tripped to the callback. It\n * MUST be JSON-serializable, MUST NOT contain secrets, and MUST be\n * treated as attacker-influenced data (the caller typically populates it\n * from the `/start` request).\n */\nexport interface PendingWebFlow {\n state: string;\n agentId: string;\n agentUrl: string;\n codeVerifier: string;\n redirectUri: string;\n resource?: string;\n scope?: string;\n authorizationServerUrl: string;\n /** Persist as JSON (e.g. Postgres `jsonb`); contents are MCP SDK-typed. */\n clientInformation: OAuthClientInformation;\n createdAt: Date;\n expiresAt: Date;\n /** JSON-serializable, no secrets, attacker-influenced. */\n carry?: Record<string, unknown>;\n}\n\n/**\n * Persistence interface for in-flight web OAuth flows.\n *\n * Canonical implementations:\n *\n * Postgres:\n * ```sql\n * INSERT INTO pending_oauth_flows (state, payload, expires_at)\n * VALUES ($1, $2, $3);\n * -- consume:\n * DELETE FROM pending_oauth_flows\n * WHERE state = $1 AND expires_at > now()\n * RETURNING payload;\n * ```\n *\n * Redis:\n * ```\n * SET pending:flow:<state> <payload> EX 600 NX -- put\n * GETDEL pending:flow:<state> -- consume\n * ```\n *\n * `consume` MUST be a single atomic operation that deletes and returns the\n * row (or returns null). A `SELECT` followed by a separate `DELETE` is a\n * replay vulnerability and DOES NOT satisfy this contract — a callback\n * replayed before the first one commits would mint two tokens.\n *\n * `consume` MUST treat expired rows as absent (return null) and SHOULD\n * delete them on read so a separate sweep is not strictly required.\n *\n * **Tradeoff: consume runs before token exchange.** `completeWebOAuthFlow`\n * consumes the pending row before attempting `exchangeAuthorization`. If\n * the AS returns a transient 5xx (or the network blips between us and the\n * AS), the row is gone and the user must restart from `/oauth/start`.\n * This is the right call for `invalid_grant` (replay protection — the\n * authorization code is one-shot at the AS regardless), but it means\n * transient AS failures cost the user a click. Revisit only if you see\n * real retry-loss in the field.\n */\nexport interface PendingWebFlowStore {\n /** Insert a new flow. MUST reject duplicate `state`. */\n put(flow: PendingWebFlow): Promise<void>;\n /**\n * Atomic delete-and-return. MUST NOT return the same row twice.\n * Returns null if the row is absent or expired.\n */\n consume(state: string): Promise<PendingWebFlow | null>;\n /** Optional housekeeping for expired rows that were never claimed. */\n cleanupExpired?(): Promise<number>;\n}\n\n/** @deprecated Renamed to `PendingWebFlowStore`. */\nexport type PendingFlowStore = PendingWebFlowStore;\n\nexport class InvalidOrExpiredFlowError extends OAuthError {\n constructor(state: string) {\n super(`OAuth flow not found or expired (state=${state})`, 'invalid_or_expired_flow');\n this.name = 'InvalidOrExpiredFlowError';\n }\n}\n\nexport class StateMismatchError extends OAuthError {\n constructor() {\n super('OAuth state does not match the value the caller bound to this session', 'state_mismatch');\n this.name = 'StateMismatchError';\n }\n}\n\nexport class TokenExchangeError extends OAuthError {\n constructor(\n message: string,\n public readonly status: number,\n public readonly body: string,\n /**\n * RFC 6749 §5.2 error code when the authorization server returned a\n * standard error envelope (`invalid_grant`, `invalid_client`, etc.).\n * Undefined when the AS returned a non-OAuth-shaped failure.\n */\n public readonly oauthErrorCode?: string\n ) {\n super(message, 'token_exchange_failed');\n this.name = 'TokenExchangeError';\n }\n}\n\nexport class ProtectedResourceMetadataError extends OAuthError {\n constructor(message: string) {\n super(message, 'protected_resource_metadata_error');\n this.name = 'ProtectedResourceMetadataError';\n }\n}\n\nexport class AgentVanishedDuringFlowError extends OAuthError {\n constructor(agentId: string) {\n super(\n `Agent ${agentId} could not be loaded from storage during token persistence; tokens were not saved`,\n 'agent_vanished_during_flow',\n agentId\n );\n this.name = 'AgentVanishedDuringFlowError';\n }\n}\n\nexport class ConfidentialClientNotAllowedError extends OAuthError {\n constructor(agentId: string | undefined) {\n super(\n 'Authorization server issued a confidential client (client_secret) during dynamic registration. ' +\n 'Pass `allowConfidentialClient: true` if you intend to persist a long-lived AS credential to your agent storage.',\n 'confidential_client_not_allowed',\n agentId\n );\n this.name = 'ConfidentialClientNotAllowedError';\n }\n}\n\nexport class BrowserBindingRequiredError extends OAuthError {\n constructor() {\n super(\n 'completeWebOAuthFlow called with requireBrowserBinding:true but expectedState was not supplied — ' +\n 'pass the state value from the session cookie set at /oauth/start',\n 'browser_binding_required'\n );\n this.name = 'BrowserBindingRequiredError';\n }\n}\n\nexport interface StartWebFlowOptions {\n /** Agent the flow is for. Must include `agent_uri`. */\n agent: AgentConfig;\n /** Absolute URL of the consumer's `/callback` route (must match what the AS sees). */\n redirectUri: string;\n /** Where to persist the pending flow until callback. */\n pendingFlowStore: PendingWebFlowStore;\n /** When provided, dynamic-registration results land in `agent.oauth_client`. */\n agentStorage?: OAuthConfigStorage;\n /**\n * Free-form caller payload, round-tripped to `completeWebOAuthFlow`.\n * Must be JSON-serializable. Do not store secrets here. Treated as\n * attacker-influenced — validate before reflecting (e.g. via\n * {@link safeReturnTo} for redirect targets).\n */\n carry?: Record<string, unknown>;\n /**\n * Scope hint (highest priority per SEP-835). Pass through the `scope`\n * value from a prior 401 `WWW-Authenticate` challenge if you have one.\n */\n scopeHint?: string;\n /** Override flow TTL. Default: {@link DEFAULT_WEB_FLOW_TTL_MS}. */\n ttlMs?: number;\n /** Override the random-state generator (defaults to 32 bytes base64url). */\n generateState?: () => string;\n /** Override `fetch` (timeouts, signing, mocks). */\n fetch?: typeof fetch;\n /**\n * Override base client metadata. `redirect_uris` is always replaced\n * with `[redirectUri]` regardless of what's passed here.\n */\n clientMetadata?: Partial<OAuthClientMetadata>;\n /**\n * Permit the AS to register a confidential client (i.e. one that\n * returns a `client_secret` from dynamic registration). Default false:\n * if the AS issues a secret we throw {@link ConfidentialClientNotAllowedError}\n * rather than silently persisting a long-lived credential to your\n * agent storage.\n */\n allowConfidentialClient?: boolean;\n}\n\nexport interface StartWebFlowResult {\n authorizationUrl: string;\n state: string;\n expiresAt: Date;\n}\n\nexport interface CompleteWebFlowOptions {\n state: string;\n code: string;\n pendingFlowStore: PendingWebFlowStore;\n /** When provided, the issued tokens are persisted to `agent.oauth_tokens`. */\n agentStorage?: OAuthConfigStorage;\n fetch?: typeof fetch;\n /**\n * The caller-bound expected state (e.g. from a session cookie set at\n * `/oauth/start`). When provided, must equal `state`; mismatch throws\n * {@link StateMismatchError}. Without this, `state` is replay-protected\n * but not browser-bound — see WEB-OAUTH.md.\n */\n expectedState?: string;\n /**\n * When `true`, throws {@link BrowserBindingRequiredError} if `expectedState`\n * is omitted instead of emitting a `console.warn`. Use this in frameworks\n * where session cookies are always available so that a missing bind is caught\n * at development time rather than silently permitted in production.\n *\n * Default: `false`.\n */\n requireBrowserBinding?: boolean;\n}\n\nexport interface CompleteWebFlowResult {\n agentId: string;\n agentUrl: string;\n tokens: OAuthTokens;\n carry?: Record<string, unknown>;\n /** True if `agentStorage` was provided AND `saveAgent` succeeded. */\n persisted: boolean;\n}\n\n/**\n * Begin a web OAuth flow. Returns the authorization URL the consumer\n * should redirect the browser to. Persists the PKCE verifier and other\n * flow state via `pendingFlowStore.put` so a different process can complete it.\n */\nexport async function startWebOAuthFlow(opts: StartWebFlowOptions): Promise<StartWebFlowResult> {\n const {\n agent,\n redirectUri,\n pendingFlowStore,\n agentStorage,\n carry,\n scopeHint,\n ttlMs = DEFAULT_WEB_FLOW_TTL_MS,\n generateState,\n fetch: fetchFn,\n clientMetadata: clientMetadataOverrides,\n allowConfidentialClient = false,\n } = opts;\n\n if (!agent.agent_uri) {\n throw new OAuthError('Agent missing agent_uri', 'invalid_agent', agent.id);\n }\n\n const prm = await tryDiscoverPRM(agent.agent_uri, fetchFn);\n if (prm?.resource) {\n assertPrmResourceMatchesAgentOrigin(agent.agent_uri, prm.resource);\n }\n\n const asUrl = resolveAuthorizationServerUrl(agent.agent_uri, prm);\n\n const asMetadata = await discoverAuthorizationServerMetadata(asUrl.toString(), { fetchFn });\n if (!asMetadata) {\n throw new OAuthError(`No OAuth metadata at ${asUrl.toString()}`, 'no_authorization_server_metadata', agent.id);\n }\n\n const resource = prm?.resource ? new URL(prm.resource) : resourceUrlFromServerUrl(new URL(agent.agent_uri));\n\n const baseClientMetadata: OAuthClientMetadata = {\n ...DEFAULT_CLIENT_METADATA,\n ...clientMetadataOverrides,\n redirect_uris: [redirectUri],\n };\n\n const scope = scopeHint ?? prm?.scopes_supported?.join(' ') ?? baseClientMetadata.scope;\n\n const clientInformation = await resolveClientInformation({\n agent,\n agentStorage,\n asUrl,\n asMetadata,\n clientMetadata: baseClientMetadata,\n fetchFn,\n allowConfidentialClient,\n });\n\n const state = (generateState ?? defaultGenerateState)();\n const { authorizationUrl, codeVerifier } = await startAuthorization(asUrl.toString(), {\n metadata: asMetadata,\n clientInformation,\n redirectUrl: redirectUri,\n scope,\n state,\n resource,\n });\n\n const now = new Date();\n const expiresAt = new Date(now.getTime() + ttlMs);\n const flow: PendingWebFlow = {\n state,\n agentId: agent.id,\n agentUrl: agent.agent_uri,\n codeVerifier,\n redirectUri,\n resource: resource.href,\n scope,\n authorizationServerUrl: asUrl.toString(),\n clientInformation,\n createdAt: now,\n expiresAt,\n carry,\n };\n await pendingFlowStore.put(flow);\n\n return {\n authorizationUrl: authorizationUrl.toString(),\n state,\n expiresAt,\n };\n}\n\n/**\n * Finish a web OAuth flow. Atomically consumes the pending row, exchanges\n * the authorization code for tokens, and (if storage is provided)\n * persists tokens to `agent.oauth_tokens`. Returns whatever the caller\n * stashed in `carry` so the consumer can route the user appropriately.\n *\n * The pending row is consumed BEFORE `exchangeAuthorization` runs. A\n * transient AS failure leaves the user with no row to retry against and\n * they must restart from `/oauth/start`. See {@link PendingWebFlowStore}\n * for the full tradeoff discussion.\n */\nexport async function completeWebOAuthFlow(opts: CompleteWebFlowOptions): Promise<CompleteWebFlowResult> {\n const { state, code, pendingFlowStore, agentStorage, fetch: fetchFn, expectedState, requireBrowserBinding } = opts;\n\n if (expectedState === undefined) {\n if (requireBrowserBinding) {\n throw new BrowserBindingRequiredError();\n }\n // Warn callers who omit expectedState: the flow is replay-protected via\n // atomic consume but is not browser-bound (any request carrying the correct\n // state + code would be accepted). Pass expectedState from a session cookie\n // set at /oauth/start to fully bind the callback to the initiating browser.\n // Set requireBrowserBinding:true to make this a hard error instead.\n console.warn(\n '[adcp/sdk] completeWebOAuthFlow: expectedState not supplied — the callback is replay-protected ' +\n 'but not browser-bound. Pass expectedState from a session cookie set at /oauth/start, ' +\n 'or set requireBrowserBinding:true to enforce it.'\n );\n } else if (expectedState !== state) {\n throw new StateMismatchError();\n }\n\n const flow = await pendingFlowStore.consume(state);\n if (!flow || flow.expiresAt.getTime() < Date.now()) {\n throw new InvalidOrExpiredFlowError(state);\n }\n\n const asMetadata = await discoverAuthorizationServerMetadata(flow.authorizationServerUrl, {\n fetchFn,\n });\n\n let tokens: OAuthTokens;\n try {\n tokens = await exchangeAuthorization(flow.authorizationServerUrl, {\n metadata: asMetadata ?? undefined,\n clientInformation: flow.clientInformation,\n authorizationCode: code,\n codeVerifier: flow.codeVerifier,\n redirectUri: flow.redirectUri,\n resource: flow.resource ? new URL(flow.resource) : undefined,\n fetchFn,\n });\n } catch (err) {\n throw wrapTokenExchangeError(err);\n }\n\n let persisted = false;\n if (agentStorage) {\n const agent = await agentStorage.loadAgent(flow.agentId);\n if (!agent) {\n throw new AgentVanishedDuringFlowError(flow.agentId);\n }\n agent.oauth_tokens = fromMCPTokens(tokens);\n delete agent.oauth_code_verifier;\n await agentStorage.saveAgent(agent);\n persisted = true;\n }\n\n return {\n agentId: flow.agentId,\n agentUrl: flow.agentUrl,\n tokens,\n carry: flow.carry,\n persisted,\n };\n}\n\n/**\n * Validate a redirect target supplied via `carry`.\n *\n * Treats `value` as attacker-influenced. Returns a string that is safe to\n * pass to `res.redirect`, or `undefined` if the value is invalid.\n *\n * Defaults to **path-only** redirects (must start with a single `/` and\n * not be protocol-relative `//evil.example`). Pass `allowedReturnHosts`\n * to permit absolute URLs against an allowlist.\n *\n * @example\n * ```ts\n * res.redirect(safeReturnTo(carry?.return_to) ?? '/');\n * res.redirect(safeReturnTo(carry?.return_to, { allowedReturnHosts: ['app.example.com'] }) ?? '/');\n * ```\n */\nexport function safeReturnTo(value: unknown, options: { allowedReturnHosts?: string[] } = {}): string | undefined {\n if (typeof value !== 'string' || value.length === 0) return undefined;\n\n // Path-only: must be `/...` but not `//...` (protocol-relative) or `/\\...`.\n if (value.startsWith('/') && !value.startsWith('//') && !value.startsWith('/\\\\')) {\n return value;\n }\n\n const allowed = options.allowedReturnHosts;\n if (!allowed || allowed.length === 0) return undefined;\n\n let parsed: URL;\n try {\n parsed = new URL(value);\n } catch {\n return undefined;\n }\n if (parsed.protocol !== 'https:' && parsed.protocol !== 'http:') return undefined;\n if (!allowed.includes(parsed.host)) return undefined;\n return parsed.toString();\n}\n\n/**\n * In-memory pending-flow store for tests and single-instance dev.\n *\n * Production deployments MUST implement `PendingWebFlowStore` against a\n * shared store (Postgres `DELETE … RETURNING`, Redis `GETDEL`) so\n * `/start` and `/callback` can hit different processes.\n */\nexport class InMemoryPendingFlowStore implements PendingWebFlowStore {\n private readonly flows = new Map<string, PendingWebFlow>();\n\n async put(flow: PendingWebFlow): Promise<void> {\n if (this.flows.has(flow.state)) {\n throw new Error(`Pending flow already exists for state ${flow.state}`);\n }\n this.flows.set(flow.state, flow);\n }\n\n async consume(state: string): Promise<PendingWebFlow | null> {\n const flow = this.flows.get(state);\n if (!flow) return null;\n this.flows.delete(state);\n if (flow.expiresAt.getTime() < Date.now()) return null;\n return flow;\n }\n\n async cleanupExpired(): Promise<number> {\n const now = Date.now();\n let removed = 0;\n for (const [state, flow] of this.flows) {\n if (flow.expiresAt.getTime() < now) {\n this.flows.delete(state);\n removed++;\n }\n }\n return removed;\n }\n}\n\n// ============================================================\n// Internals\n// ============================================================\n\n/**\n * The MCP SDK reports a 404 PRM lookup with this exact message; treat it\n * as \"PRM is genuinely absent\" and fall back. Anything else is a\n * connection, parse, or 5xx error and is allowed to bubble.\n *\n * Source (verified against `@modelcontextprotocol/sdk@1.29.0`):\n * `dist/esm/client/auth.js` → `discoverOAuthProtectedResourceMetadata`\n * throws `new Error(`Resource server does not implement OAuth 2.0 Protected Resource Metadata.`)`\n * when `response.status === 404` (or no response was returned).\n *\n * If a future MCP SDK reword this message, the test\n * \"falls back to server-derived resource on a 404 PRM\" at\n * `test/lib/oauth-web-flow.test.js` will fail — that test calls the real\n * SDK against a 404 fixture and is the canary for this regression.\n */\nconst PRM_ABSENT_MARKER = 'does not implement OAuth 2.0 Protected Resource Metadata';\n\nasync function tryDiscoverPRM(\n agentUrl: string,\n fetchFn: typeof fetch | undefined\n): Promise<OAuthProtectedResourceMetadata | undefined> {\n try {\n return await discoverOAuthProtectedResourceMetadata(agentUrl, undefined, fetchFn);\n } catch (err) {\n if (err instanceof Error && err.message.includes(PRM_ABSENT_MARKER)) {\n // PRM is optional under RFC 9728 — fall back to local resource\n // derivation. Connection/parse/5xx errors fall through.\n return undefined;\n }\n const message = err instanceof Error ? err.message : String(err);\n throw new ProtectedResourceMetadataError(`PRM discovery failed: ${message}`);\n }\n}\n\nfunction assertPrmResourceMatchesAgentOrigin(agentUrl: string, prmResource: string): void {\n const requested = resourceUrlFromServerUrl(new URL(agentUrl));\n if (!checkResourceAllowed({ requestedResource: requested, configuredResource: prmResource })) {\n throw new ProtectedResourceMetadataError(\n `PRM advertises resource ${prmResource} which does not share an origin/path with agent ${agentUrl}`\n );\n }\n}\n\nfunction resolveAuthorizationServerUrl(agentUrl: string, prm: OAuthProtectedResourceMetadata | undefined): URL {\n const first = prm?.authorization_servers?.[0];\n if (first) {\n return new URL(first);\n }\n return new URL(new URL(agentUrl).origin);\n}\n\nasync function resolveClientInformation(args: {\n agent: AgentConfig;\n agentStorage?: OAuthConfigStorage;\n asUrl: URL;\n asMetadata: AuthorizationServerMetadata;\n clientMetadata: OAuthClientMetadata;\n fetchFn?: typeof fetch;\n allowConfidentialClient: boolean;\n}): Promise<OAuthClientInformation> {\n const { agent, agentStorage, asUrl, asMetadata, clientMetadata, fetchFn, allowConfidentialClient } = args;\n\n if (agent.oauth_client) {\n return toMCPClientInfo(agent.oauth_client);\n }\n\n if (!asMetadata.registration_endpoint) {\n throw new OAuthError(\n 'Agent has no oauth_client and authorization server does not advertise dynamic client registration',\n 'no_client_credentials',\n agent.id\n );\n }\n\n const registered: OAuthClientInformationFull = await registerClient(asUrl.toString(), {\n metadata: asMetadata,\n clientMetadata,\n fetchFn,\n });\n\n if (registered.client_secret && !allowConfidentialClient) {\n throw new ConfidentialClientNotAllowedError(agent.id);\n }\n\n if (agentStorage) {\n // Load fresh and save fresh so two concurrent /start calls for the\n // same agentId do not trample each other's `oauth_client` via a\n // shared in-memory reference.\n const fresh = (await agentStorage.loadAgent(agent.id)) ?? agent;\n fresh.oauth_client = fromMCPClientInfo(registered);\n await agentStorage.saveAgent(fresh);\n }\n\n return registered;\n}\n\nfunction defaultGenerateState(): string {\n return randomBytes(32).toString('base64url');\n}\n\n/**\n * Map an MCP SDK token-exchange failure to {@link TokenExchangeError},\n * redacting bearer/refresh tokens that some authorization servers echo\n * back in error responses for debugging.\n */\nfunction wrapTokenExchangeError(err: unknown): TokenExchangeError {\n // The MCP SDK's `parseErrorResponse` decodes a well-formed OAuth error\n // envelope into an `OAuthError` subclass with `errorCode` (e.g.\n // `InvalidGrantError`). Malformed responses come through as\n // `ServerError` with the raw body in `message`, so the redaction pass\n // covers both cases.\n const oauthErrorCode = (err as { errorCode?: string })?.errorCode;\n const message = err instanceof Error ? err.message : String(err);\n const status = (err as { status?: number })?.status ?? 0;\n const rawBody = (err as { body?: string })?.body ?? message;\n const body = redactTokens(rawBody);\n const display = oauthErrorCode ? `${oauthErrorCode}: ${message}` : message;\n return new TokenExchangeError(`Token exchange failed: ${redactTokens(display)}`, status, body, oauthErrorCode);\n}\n\nconst SENSITIVE_TOKEN_KEYS = ['access_token', 'refresh_token', 'id_token', 'token'];\n\n/**\n * Best-effort redaction of bearer/refresh tokens from an AS error body\n * (which may be JSON, form-encoded, or freeform). Adopters MUST still\n * treat `TokenExchangeError.body` as sensitive — do not reflect it to\n * the browser or write it to access logs unredacted.\n */\nfunction redactTokens(input: string): string {\n let out = input;\n for (const key of SENSITIVE_TOKEN_KEYS) {\n // JSON form: \"key\":\"…\"\n out = out.replace(new RegExp(`(\"${key}\"\\\\s*:\\\\s*\")[^\"]*(\")`, 'gi'), '$1<redacted>$2');\n // form-encoded: key=…\n out = out.replace(new RegExp(`(\\\\b${key}=)[^&\\\\s]+`, 'gi'), '$1<redacted>');\n }\n return out;\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../../src/lib/auth/oauth/web-flow.ts"],"sourcesContent":["/**\n * Web (server-side) OAuth flow helpers for `@adcp/sdk`.\n *\n * Companion to `CLIFlowHandler` for environments where `/oauth/start` and\n * `/oauth/callback` may be served by different processes. Discovery, PKCE,\n * URL construction, and token exchange are delegated to the MCP SDK's\n * `client/auth.js` primitives so this module is glue plus a pending-flow\n * store interface — not reimplemented protocol logic.\n *\n * Wire contract:\n * - An operator `resourceOverride` takes precedence for legacy or\n * non-conformant integrations. Otherwise PRM (RFC 9728) is consulted;\n * `prm.resource` is the source of truth for the RFC 8707 `resource`\n * indicator. We fall back to\n * `resourceUrlFromServerUrl(agent.agent_uri)` only when the resource\n * server does not implement PRM (404). Connection / parse / 5xx\n * errors throw `ProtectedResourceMetadataError` — never silently\n * downgrade to local guessing.\n * - Without a trusted override, `prm.resource` must share an origin with\n * the agent URL; the MCP SDK's `checkResourceAllowed` guards against a\n * poisoned PRM pointing the audience at a third party.\n * - AS URL = `prm.authorization_servers[0]` when PRM is present, else\n * the agent origin.\n * - Scope priority: caller-supplied `scopeHint` (e.g. from a 401\n * `WWW-Authenticate` challenge, per SEP-835) > `prm.scopes_supported`\n * > `clientMetadata.scope`.\n * - Refresh is NOT this module's concern. Once `oauth_tokens` are\n * persisted, `MCPOAuthProvider` handles refresh on the next agent\n * call and the MCP SDK forwards `resource` into the refresh request.\n * Callers who DIY refresh against `oauth_tokens` are responsible for\n * forwarding `resource` themselves.\n */\n\nimport { randomBytes } from 'crypto';\nimport {\n discoverAuthorizationServerMetadata,\n discoverOAuthProtectedResourceMetadata,\n exchangeAuthorization,\n registerClient,\n startAuthorization,\n} from '@modelcontextprotocol/sdk/client/auth.js';\nimport { checkResourceAllowed, resourceUrlFromServerUrl } from '@modelcontextprotocol/sdk/shared/auth-utils.js';\nimport type {\n AuthorizationServerMetadata,\n OAuthClientInformation,\n OAuthClientInformationFull,\n OAuthClientMetadata,\n OAuthProtectedResourceMetadata,\n OAuthTokens,\n} from '@modelcontextprotocol/sdk/shared/auth.js';\n\nimport type { AgentConfig, OAuthConfigStorage } from './types';\nimport { DEFAULT_CLIENT_METADATA, fromMCPClientInfo, fromMCPTokens, OAuthError, toMCPClientInfo } from './types';\nimport { validateOAuthResourceUrl } from './resource-url';\n\n/**\n * Default TTL for a pending web flow row. RFC 6749 §10.12 recommends\n * short-lived state; 10 minutes covers slow-typing users without leaving\n * the PKCE verifier on disk longer than necessary.\n */\nexport const DEFAULT_WEB_FLOW_TTL_MS = 10 * 60 * 1000;\n\n/**\n * State persisted between `/oauth/start` and `/oauth/callback`.\n *\n * `codeVerifier` is a PKCE secret. Store implementations MUST encrypt it\n * at rest if persistence crosses a trust boundary (shared DB, cross-tenant\n * Redis, etc.).\n *\n * `carry` is preserved verbatim and round-tripped to the callback. It\n * MUST be JSON-serializable, MUST NOT contain secrets, and MUST be\n * treated as attacker-influenced data (the caller typically populates it\n * from the `/start` request).\n */\nexport interface PendingWebFlow {\n state: string;\n agentId: string;\n agentUrl: string;\n codeVerifier: string;\n redirectUri: string;\n resource?: string;\n /** Explicit operator override, persisted separately so refresh can retain it. */\n resourceOverride?: string;\n /** Mutation requested by this flow. Absent on legacy rows and preserve-only flows. */\n resourceOverrideAction?: 'set' | 'clear';\n /** Value observed at flow start; used to reject concurrent operator edits. */\n resourceOverrideSnapshot?: string | null;\n scope?: string;\n authorizationServerUrl: string;\n /** Persist as JSON (e.g. Postgres `jsonb`); contents are MCP SDK-typed. */\n clientInformation: OAuthClientInformation;\n createdAt: Date;\n expiresAt: Date;\n /** JSON-serializable, no secrets, attacker-influenced. */\n carry?: Record<string, unknown>;\n}\n\n/**\n * Persistence interface for in-flight web OAuth flows.\n *\n * Canonical implementations:\n *\n * Postgres:\n * ```sql\n * INSERT INTO pending_oauth_flows (state, payload, expires_at)\n * VALUES ($1, $2, $3);\n * -- consume:\n * DELETE FROM pending_oauth_flows\n * WHERE state = $1 AND expires_at > now()\n * RETURNING payload;\n * ```\n *\n * Redis:\n * ```\n * SET pending:flow:<state> <payload> EX 600 NX -- put\n * GETDEL pending:flow:<state> -- consume\n * ```\n *\n * `consume` MUST be a single atomic operation that deletes and returns the\n * row (or returns null). A `SELECT` followed by a separate `DELETE` is a\n * replay vulnerability and DOES NOT satisfy this contract — a callback\n * replayed before the first one commits would mint two tokens.\n *\n * `consume` MUST treat expired rows as absent (return null) and SHOULD\n * delete them on read so a separate sweep is not strictly required.\n *\n * **Tradeoff: consume runs before token exchange.** `completeWebOAuthFlow`\n * consumes the pending row before attempting `exchangeAuthorization`. If\n * the AS returns a transient 5xx (or the network blips between us and the\n * AS), the row is gone and the user must restart from `/oauth/start`.\n * This is the right call for `invalid_grant` (replay protection — the\n * authorization code is one-shot at the AS regardless), but it means\n * transient AS failures cost the user a click. Revisit only if you see\n * real retry-loss in the field.\n */\nexport interface PendingWebFlowStore {\n /** Insert a new flow. MUST reject duplicate `state`. */\n put(flow: PendingWebFlow): Promise<void>;\n /**\n * Atomic delete-and-return. MUST NOT return the same row twice.\n * Returns null if the row is absent or expired.\n */\n consume(state: string): Promise<PendingWebFlow | null>;\n /** Optional housekeeping for expired rows that were never claimed. */\n cleanupExpired?(): Promise<number>;\n}\n\n/** @deprecated Renamed to `PendingWebFlowStore`. */\nexport type PendingFlowStore = PendingWebFlowStore;\n\nexport class InvalidOrExpiredFlowError extends OAuthError {\n constructor(state: string) {\n super(`OAuth flow not found or expired (state=${state})`, 'invalid_or_expired_flow');\n this.name = 'InvalidOrExpiredFlowError';\n }\n}\n\nexport class StateMismatchError extends OAuthError {\n constructor() {\n super('OAuth state does not match the value the caller bound to this session', 'state_mismatch');\n this.name = 'StateMismatchError';\n }\n}\n\nexport class TokenExchangeError extends OAuthError {\n constructor(\n message: string,\n public readonly status: number,\n public readonly body: string,\n /**\n * RFC 6749 §5.2 error code when the authorization server returned a\n * standard error envelope (`invalid_grant`, `invalid_client`, etc.).\n * Undefined when the AS returned a non-OAuth-shaped failure.\n */\n public readonly oauthErrorCode?: string\n ) {\n super(message, 'token_exchange_failed');\n this.name = 'TokenExchangeError';\n }\n}\n\nexport class ProtectedResourceMetadataError extends OAuthError {\n constructor(message: string) {\n super(message, 'protected_resource_metadata_error');\n this.name = 'ProtectedResourceMetadataError';\n }\n}\n\nexport class AgentVanishedDuringFlowError extends OAuthError {\n constructor(agentId: string) {\n super(\n `Agent ${agentId} could not be loaded from storage during token persistence; tokens were not saved`,\n 'agent_vanished_during_flow',\n agentId\n );\n this.name = 'AgentVanishedDuringFlowError';\n }\n}\n\nexport class AgentChangedDuringFlowError extends OAuthError {\n constructor(agentId: string) {\n super(\n `Agent ${agentId} changed while OAuth authorization was pending; tokens were not saved`,\n 'agent_changed_during_flow',\n agentId\n );\n this.name = 'AgentChangedDuringFlowError';\n }\n}\n\nexport class ConfidentialClientNotAllowedError extends OAuthError {\n constructor(agentId: string | undefined) {\n super(\n 'Authorization server issued a confidential client (client_secret) during dynamic registration. ' +\n 'Pass `allowConfidentialClient: true` if you intend to persist a long-lived AS credential to your agent storage.',\n 'confidential_client_not_allowed',\n agentId\n );\n this.name = 'ConfidentialClientNotAllowedError';\n }\n}\n\nexport class BrowserBindingRequiredError extends OAuthError {\n constructor() {\n super(\n 'completeWebOAuthFlow called with requireBrowserBinding:true but expectedState was not supplied — ' +\n 'pass the state value from the session cookie set at /oauth/start',\n 'browser_binding_required'\n );\n this.name = 'BrowserBindingRequiredError';\n }\n}\n\nexport interface StartWebFlowOptions {\n /** Agent the flow is for. Must include `agent_uri`. */\n agent: AgentConfig;\n /** Absolute URL of the consumer's `/callback` route (must match what the AS sees). */\n redirectUri: string;\n /** Where to persist the pending flow until callback. */\n pendingFlowStore: PendingWebFlowStore;\n /** When provided, dynamic-registration results land in `agent.oauth_client`. */\n agentStorage?: OAuthConfigStorage;\n /**\n * Free-form caller payload, round-tripped to `completeWebOAuthFlow`.\n * Must be JSON-serializable. Do not store secrets here. Treated as\n * attacker-influenced — validate before reflecting (e.g. via\n * {@link safeReturnTo} for redirect targets).\n */\n carry?: Record<string, unknown>;\n /**\n * Scope hint (highest priority per SEP-835). Pass through the `scope`\n * value from a prior 401 `WWW-Authenticate` challenge if you have one.\n */\n scopeHint?: string;\n /**\n * Operator-supplied RFC 8707 resource override. Takes precedence over\n * `prm.resource` and the agent-URL-derived fallback, and is sent during\n * both authorization and code exchange. Pass `null` to explicitly clear a\n * persisted override and return to metadata/agent-URL discovery.\n */\n resourceOverride?: string | null;\n /**\n * Non-standard Auth0-compatible audience parameter. Sent only to the\n * authorization endpoint. Prefer `resourceOverride` for RFC 8707 servers.\n */\n audience?: string;\n /** Permit an HTTP resource override for local development. Default false. */\n allowHttp?: boolean;\n /** Override flow TTL. Default: {@link DEFAULT_WEB_FLOW_TTL_MS}. */\n ttlMs?: number;\n /** Override the random-state generator (defaults to 32 bytes base64url). */\n generateState?: () => string;\n /** Override `fetch` (timeouts, signing, mocks). */\n fetch?: typeof fetch;\n /**\n * Override base client metadata. `redirect_uris` is always replaced\n * with `[redirectUri]` regardless of what's passed here.\n */\n clientMetadata?: Partial<OAuthClientMetadata>;\n /**\n * Permit the AS to register a confidential client (i.e. one that\n * returns a `client_secret` from dynamic registration). Default false:\n * if the AS issues a secret we throw {@link ConfidentialClientNotAllowedError}\n * rather than silently persisting a long-lived credential to your\n * agent storage.\n */\n allowConfidentialClient?: boolean;\n}\n\nexport interface StartWebFlowResult {\n authorizationUrl: string;\n state: string;\n expiresAt: Date;\n}\n\nexport interface CompleteWebFlowOptions {\n state: string;\n code: string;\n pendingFlowStore: PendingWebFlowStore;\n /** When provided, the issued tokens are persisted to `agent.oauth_tokens`. */\n agentStorage?: OAuthConfigStorage;\n fetch?: typeof fetch;\n /**\n * The caller-bound expected state (e.g. from a session cookie set at\n * `/oauth/start`). When provided, must equal `state`; mismatch throws\n * {@link StateMismatchError}. Without this, `state` is replay-protected\n * but not browser-bound — see WEB-OAUTH.md.\n */\n expectedState?: string;\n /**\n * When `true`, throws {@link BrowserBindingRequiredError} if `expectedState`\n * is omitted instead of emitting a `console.warn`. Use this in frameworks\n * where session cookies are always available so that a missing bind is caught\n * at development time rather than silently permitted in production.\n *\n * Default: `false`.\n */\n requireBrowserBinding?: boolean;\n}\n\nexport interface CompleteWebFlowResult {\n agentId: string;\n agentUrl: string;\n tokens: OAuthTokens;\n carry?: Record<string, unknown>;\n /** True if `agentStorage` was provided AND `saveAgent` succeeded. */\n persisted: boolean;\n}\n\n/**\n * Begin a web OAuth flow. Returns the authorization URL the consumer\n * should redirect the browser to. Persists the PKCE verifier and other\n * flow state via `pendingFlowStore.put` so a different process can complete it.\n */\nexport async function startWebOAuthFlow(opts: StartWebFlowOptions): Promise<StartWebFlowResult> {\n const {\n agent,\n redirectUri,\n pendingFlowStore,\n agentStorage,\n carry,\n scopeHint,\n resourceOverride: requestedResourceOverride,\n audience,\n allowHttp = false,\n ttlMs = DEFAULT_WEB_FLOW_TTL_MS,\n generateState,\n fetch: fetchFn,\n clientMetadata: clientMetadataOverrides,\n allowConfidentialClient = false,\n } = opts;\n\n if (!agent.agent_uri) {\n throw new OAuthError('Agent missing agent_uri', 'invalid_agent', agent.id);\n }\n\n const resourceOverrideAction =\n requestedResourceOverride === null ? 'clear' : requestedResourceOverride !== undefined ? 'set' : undefined;\n const rawResourceOverride =\n requestedResourceOverride === null ? undefined : (requestedResourceOverride ?? agent.oauth_resource);\n const resourceOverride = rawResourceOverride\n ? validateOAuthResourceUrl(rawResourceOverride, { allowHttp }).href\n : undefined;\n\n const prm = await tryDiscoverPRM(agent.agent_uri, fetchFn);\n if (!resourceOverride && prm?.resource) {\n assertPrmResourceMatchesAgentOrigin(agent.agent_uri, prm.resource);\n }\n\n const asUrl = resolveAuthorizationServerUrl(agent.agent_uri, prm);\n\n const asMetadata = await discoverAuthorizationServerMetadata(asUrl.toString(), { fetchFn });\n if (!asMetadata) {\n throw new OAuthError(`No OAuth metadata at ${asUrl.toString()}`, 'no_authorization_server_metadata', agent.id);\n }\n\n const resource = resourceOverride\n ? new URL(resourceOverride)\n : prm?.resource\n ? new URL(prm.resource)\n : resourceUrlFromServerUrl(new URL(agent.agent_uri));\n\n const baseClientMetadata: OAuthClientMetadata = {\n ...DEFAULT_CLIENT_METADATA,\n ...clientMetadataOverrides,\n redirect_uris: [redirectUri],\n };\n\n const scope = scopeHint ?? prm?.scopes_supported?.join(' ') ?? baseClientMetadata.scope;\n\n const clientInformation = await resolveClientInformation({\n agent,\n agentStorage,\n asUrl,\n asMetadata,\n clientMetadata: baseClientMetadata,\n fetchFn,\n allowConfidentialClient,\n });\n\n const state = (generateState ?? defaultGenerateState)();\n const { authorizationUrl, codeVerifier } = await startAuthorization(asUrl.toString(), {\n metadata: asMetadata,\n clientInformation,\n redirectUrl: redirectUri,\n scope,\n state,\n resource,\n });\n if (audience) {\n authorizationUrl.searchParams.set('audience', audience);\n }\n\n const now = new Date();\n const expiresAt = new Date(now.getTime() + ttlMs);\n const flow: PendingWebFlow = {\n state,\n agentId: agent.id,\n agentUrl: agent.agent_uri,\n codeVerifier,\n redirectUri,\n resource: resource.href,\n resourceOverride,\n resourceOverrideAction,\n resourceOverrideSnapshot: agent.oauth_resource ?? null,\n scope,\n authorizationServerUrl: asUrl.toString(),\n clientInformation,\n createdAt: now,\n expiresAt,\n carry,\n };\n await pendingFlowStore.put(flow);\n\n return {\n authorizationUrl: authorizationUrl.toString(),\n state,\n expiresAt,\n };\n}\n\n/**\n * Finish a web OAuth flow. Atomically consumes the pending row, exchanges\n * the authorization code for tokens, and (if storage is provided)\n * persists tokens to `agent.oauth_tokens`. Returns whatever the caller\n * stashed in `carry` so the consumer can route the user appropriately.\n *\n * The pending row is consumed BEFORE `exchangeAuthorization` runs. A\n * transient AS failure leaves the user with no row to retry against and\n * they must restart from `/oauth/start`. See {@link PendingWebFlowStore}\n * for the full tradeoff discussion.\n */\nexport async function completeWebOAuthFlow(opts: CompleteWebFlowOptions): Promise<CompleteWebFlowResult> {\n const { state, code, pendingFlowStore, agentStorage, fetch: fetchFn, expectedState, requireBrowserBinding } = opts;\n\n if (expectedState === undefined) {\n if (requireBrowserBinding) {\n throw new BrowserBindingRequiredError();\n }\n // Warn callers who omit expectedState: the flow is replay-protected via\n // atomic consume but is not browser-bound (any request carrying the correct\n // state + code would be accepted). Pass expectedState from a session cookie\n // set at /oauth/start to fully bind the callback to the initiating browser.\n // Set requireBrowserBinding:true to make this a hard error instead.\n console.warn(\n '[adcp/sdk] completeWebOAuthFlow: expectedState not supplied — the callback is replay-protected ' +\n 'but not browser-bound. Pass expectedState from a session cookie set at /oauth/start, ' +\n 'or set requireBrowserBinding:true to enforce it.'\n );\n } else if (expectedState !== state) {\n throw new StateMismatchError();\n }\n\n const flow = await pendingFlowStore.consume(state);\n if (!flow || flow.expiresAt.getTime() < Date.now()) {\n throw new InvalidOrExpiredFlowError(state);\n }\n\n let agentForPersistence: AgentConfig | undefined;\n if (agentStorage) {\n agentForPersistence = await agentStorage.loadAgent(flow.agentId);\n assertAgentUnchangedForFlow(agentForPersistence, flow);\n }\n\n const asMetadata = await discoverAuthorizationServerMetadata(flow.authorizationServerUrl, {\n fetchFn,\n });\n\n let tokens: OAuthTokens;\n try {\n tokens = await exchangeAuthorization(flow.authorizationServerUrl, {\n metadata: asMetadata ?? undefined,\n clientInformation: flow.clientInformation,\n authorizationCode: code,\n codeVerifier: flow.codeVerifier,\n redirectUri: flow.redirectUri,\n resource: flow.resource ? new URL(flow.resource) : undefined,\n fetchFn,\n });\n } catch (err) {\n throw wrapTokenExchangeError(err);\n }\n\n let persisted = false;\n if (agentStorage) {\n // Re-read after the network round trips so we do not save the stale object\n // loaded before token exchange or overwrite an edit made while the AS was\n // responding. Storage implementations that need a hard same-ID/same-URI\n // tenant guarantee should additionally make saveAgent revision-aware.\n agentForPersistence = await agentStorage.loadAgent(flow.agentId);\n assertAgentUnchangedForFlow(agentForPersistence, flow);\n agentForPersistence.oauth_tokens = fromMCPTokens(tokens);\n if (flow.resourceOverrideAction === 'set' && flow.resourceOverride) {\n agentForPersistence.oauth_resource = flow.resourceOverride;\n } else if (flow.resourceOverrideAction === 'clear') {\n delete agentForPersistence.oauth_resource;\n }\n delete agentForPersistence.oauth_code_verifier;\n await agentStorage.saveAgent(agentForPersistence);\n persisted = true;\n }\n\n return {\n agentId: flow.agentId,\n agentUrl: flow.agentUrl,\n tokens,\n carry: flow.carry,\n persisted,\n };\n}\n\nfunction assertAgentUnchangedForFlow(\n agent: AgentConfig | undefined,\n flow: PendingWebFlow\n): asserts agent is AgentConfig {\n if (!agent) {\n throw new AgentVanishedDuringFlowError(flow.agentId);\n }\n if (agent.agent_uri !== flow.agentUrl) {\n throw new AgentChangedDuringFlowError(flow.agentId);\n }\n if (\n Object.prototype.hasOwnProperty.call(flow, 'resourceOverrideSnapshot') &&\n (agent.oauth_resource ?? null) !== flow.resourceOverrideSnapshot\n ) {\n throw new AgentChangedDuringFlowError(flow.agentId);\n }\n}\n\n/**\n * Validate a redirect target supplied via `carry`.\n *\n * Treats `value` as attacker-influenced. Returns a string that is safe to\n * pass to `res.redirect`, or `undefined` if the value is invalid.\n *\n * Defaults to **path-only** redirects (must start with a single `/` and\n * not be protocol-relative `//evil.example`). Pass `allowedReturnHosts`\n * to permit absolute URLs against an allowlist.\n *\n * @example\n * ```ts\n * res.redirect(safeReturnTo(carry?.return_to) ?? '/');\n * res.redirect(safeReturnTo(carry?.return_to, { allowedReturnHosts: ['app.example.com'] }) ?? '/');\n * ```\n */\nexport function safeReturnTo(value: unknown, options: { allowedReturnHosts?: string[] } = {}): string | undefined {\n if (typeof value !== 'string' || value.length === 0) return undefined;\n\n // Path-only: must be `/...` but not `//...` (protocol-relative) or `/\\...`.\n if (value.startsWith('/') && !value.startsWith('//') && !value.startsWith('/\\\\')) {\n return value;\n }\n\n const allowed = options.allowedReturnHosts;\n if (!allowed || allowed.length === 0) return undefined;\n\n let parsed: URL;\n try {\n parsed = new URL(value);\n } catch {\n return undefined;\n }\n if (parsed.protocol !== 'https:' && parsed.protocol !== 'http:') return undefined;\n if (!allowed.includes(parsed.host)) return undefined;\n return parsed.toString();\n}\n\n/**\n * In-memory pending-flow store for tests and single-instance dev.\n *\n * Production deployments MUST implement `PendingWebFlowStore` against a\n * shared store (Postgres `DELETE … RETURNING`, Redis `GETDEL`) so\n * `/start` and `/callback` can hit different processes.\n */\nexport class InMemoryPendingFlowStore implements PendingWebFlowStore {\n private readonly flows = new Map<string, PendingWebFlow>();\n\n async put(flow: PendingWebFlow): Promise<void> {\n if (this.flows.has(flow.state)) {\n throw new Error(`Pending flow already exists for state ${flow.state}`);\n }\n this.flows.set(flow.state, flow);\n }\n\n async consume(state: string): Promise<PendingWebFlow | null> {\n const flow = this.flows.get(state);\n if (!flow) return null;\n this.flows.delete(state);\n if (flow.expiresAt.getTime() < Date.now()) return null;\n return flow;\n }\n\n async cleanupExpired(): Promise<number> {\n const now = Date.now();\n let removed = 0;\n for (const [state, flow] of this.flows) {\n if (flow.expiresAt.getTime() < now) {\n this.flows.delete(state);\n removed++;\n }\n }\n return removed;\n }\n}\n\n// ============================================================\n// Internals\n// ============================================================\n\n/**\n * The MCP SDK reports a 404 PRM lookup with this exact message; treat it\n * as \"PRM is genuinely absent\" and fall back. Anything else is a\n * connection, parse, or 5xx error and is allowed to bubble.\n *\n * Source (verified against `@modelcontextprotocol/sdk@1.29.0`):\n * `dist/esm/client/auth.js` → `discoverOAuthProtectedResourceMetadata`\n * throws `new Error(`Resource server does not implement OAuth 2.0 Protected Resource Metadata.`)`\n * when `response.status === 404` (or no response was returned).\n *\n * If a future MCP SDK reword this message, the test\n * \"falls back to server-derived resource on a 404 PRM\" at\n * `test/lib/oauth-web-flow.test.js` will fail — that test calls the real\n * SDK against a 404 fixture and is the canary for this regression.\n */\nconst PRM_ABSENT_MARKER = 'does not implement OAuth 2.0 Protected Resource Metadata';\n\nasync function tryDiscoverPRM(\n agentUrl: string,\n fetchFn: typeof fetch | undefined\n): Promise<OAuthProtectedResourceMetadata | undefined> {\n try {\n return await discoverOAuthProtectedResourceMetadata(agentUrl, undefined, fetchFn);\n } catch (err) {\n if (err instanceof Error && err.message.includes(PRM_ABSENT_MARKER)) {\n // PRM is optional under RFC 9728 — fall back to local resource\n // derivation. Connection/parse/5xx errors fall through.\n return undefined;\n }\n const message = err instanceof Error ? err.message : String(err);\n throw new ProtectedResourceMetadataError(`PRM discovery failed: ${message}`);\n }\n}\n\nfunction assertPrmResourceMatchesAgentOrigin(agentUrl: string, prmResource: string): void {\n const requested = resourceUrlFromServerUrl(new URL(agentUrl));\n if (!checkResourceAllowed({ requestedResource: requested, configuredResource: prmResource })) {\n throw new ProtectedResourceMetadataError(\n `PRM advertises resource ${prmResource} which does not share an origin/path with agent ${agentUrl}`\n );\n }\n}\n\nfunction resolveAuthorizationServerUrl(agentUrl: string, prm: OAuthProtectedResourceMetadata | undefined): URL {\n const first = prm?.authorization_servers?.[0];\n if (first) {\n return new URL(first);\n }\n return new URL(new URL(agentUrl).origin);\n}\n\nasync function resolveClientInformation(args: {\n agent: AgentConfig;\n agentStorage?: OAuthConfigStorage;\n asUrl: URL;\n asMetadata: AuthorizationServerMetadata;\n clientMetadata: OAuthClientMetadata;\n fetchFn?: typeof fetch;\n allowConfidentialClient: boolean;\n}): Promise<OAuthClientInformation> {\n const { agent, agentStorage, asUrl, asMetadata, clientMetadata, fetchFn, allowConfidentialClient } = args;\n\n if (agent.oauth_client) {\n return toMCPClientInfo(agent.oauth_client);\n }\n\n if (!asMetadata.registration_endpoint) {\n throw new OAuthError(\n 'Agent has no oauth_client and authorization server does not advertise dynamic client registration',\n 'no_client_credentials',\n agent.id\n );\n }\n\n const registered: OAuthClientInformationFull = await registerClient(asUrl.toString(), {\n metadata: asMetadata,\n clientMetadata,\n fetchFn,\n });\n\n if (registered.client_secret && !allowConfidentialClient) {\n throw new ConfidentialClientNotAllowedError(agent.id);\n }\n\n if (agentStorage) {\n // Load fresh and save fresh so two concurrent /start calls for the\n // same agentId do not trample each other's `oauth_client` via a\n // shared in-memory reference.\n const fresh = (await agentStorage.loadAgent(agent.id)) ?? agent;\n fresh.oauth_client = fromMCPClientInfo(registered);\n await agentStorage.saveAgent(fresh);\n }\n\n return registered;\n}\n\nfunction defaultGenerateState(): string {\n return randomBytes(32).toString('base64url');\n}\n\n/**\n * Map an MCP SDK token-exchange failure to {@link TokenExchangeError},\n * redacting bearer/refresh tokens that some authorization servers echo\n * back in error responses for debugging.\n */\nfunction wrapTokenExchangeError(err: unknown): TokenExchangeError {\n // The MCP SDK's `parseErrorResponse` decodes a well-formed OAuth error\n // envelope into an `OAuthError` subclass with `errorCode` (e.g.\n // `InvalidGrantError`). Malformed responses come through as\n // `ServerError` with the raw body in `message`, so the redaction pass\n // covers both cases.\n const oauthErrorCode = (err as { errorCode?: string })?.errorCode;\n const message = err instanceof Error ? err.message : String(err);\n const status = (err as { status?: number })?.status ?? 0;\n const rawBody = (err as { body?: string })?.body ?? message;\n const body = redactTokens(rawBody);\n const display = oauthErrorCode ? `${oauthErrorCode}: ${message}` : message;\n return new TokenExchangeError(`Token exchange failed: ${redactTokens(display)}`, status, body, oauthErrorCode);\n}\n\nconst SENSITIVE_TOKEN_KEYS = ['access_token', 'refresh_token', 'id_token', 'token'];\n\n/**\n * Best-effort redaction of bearer/refresh tokens from an AS error body\n * (which may be JSON, form-encoded, or freeform). Adopters MUST still\n * treat `TokenExchangeError.body` as sensitive — do not reflect it to\n * the browser or write it to access logs unredacted.\n */\nfunction redactTokens(input: string): string {\n let out = input;\n for (const key of SENSITIVE_TOKEN_KEYS) {\n // JSON form: \"key\":\"…\"\n out = out.replace(new RegExp(`(\"${key}\"\\\\s*:\\\\s*\")[^\"]*(\")`, 'gi'), '$1<redacted>$2');\n // form-encoded: key=…\n out = out.replace(new RegExp(`(\\\\b${key}=)[^&\\\\s]+`, 'gi'), '$1<redacted>');\n }\n return out;\n}\n"],"mappings":"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","names":[]}
@@ -8,6 +8,7 @@ import {
8
8
  } from "@modelcontextprotocol/sdk/client/auth.js";
9
9
  import { checkResourceAllowed, resourceUrlFromServerUrl } from "@modelcontextprotocol/sdk/shared/auth-utils.js";
10
10
  import { DEFAULT_CLIENT_METADATA, fromMCPClientInfo, fromMCPTokens, OAuthError, toMCPClientInfo } from "./types.mjs";
11
+ import { validateOAuthResourceUrl } from "./resource-url.mjs";
11
12
  const DEFAULT_WEB_FLOW_TTL_MS = 10 * 60 * 1e3;
12
13
  class InvalidOrExpiredFlowError extends OAuthError {
13
14
  constructor(state) {
@@ -49,6 +50,16 @@ class AgentVanishedDuringFlowError extends OAuthError {
49
50
  this.name = "AgentVanishedDuringFlowError";
50
51
  }
51
52
  }
53
+ class AgentChangedDuringFlowError extends OAuthError {
54
+ constructor(agentId) {
55
+ super(
56
+ `Agent ${agentId} changed while OAuth authorization was pending; tokens were not saved`,
57
+ "agent_changed_during_flow",
58
+ agentId
59
+ );
60
+ this.name = "AgentChangedDuringFlowError";
61
+ }
62
+ }
52
63
  class ConfidentialClientNotAllowedError extends OAuthError {
53
64
  constructor(agentId) {
54
65
  super(
@@ -76,6 +87,9 @@ async function startWebOAuthFlow(opts) {
76
87
  agentStorage,
77
88
  carry,
78
89
  scopeHint,
90
+ resourceOverride: requestedResourceOverride,
91
+ audience,
92
+ allowHttp = false,
79
93
  ttlMs = DEFAULT_WEB_FLOW_TTL_MS,
80
94
  generateState,
81
95
  fetch: fetchFn,
@@ -85,8 +99,11 @@ async function startWebOAuthFlow(opts) {
85
99
  if (!agent.agent_uri) {
86
100
  throw new OAuthError("Agent missing agent_uri", "invalid_agent", agent.id);
87
101
  }
102
+ const resourceOverrideAction = requestedResourceOverride === null ? "clear" : requestedResourceOverride !== void 0 ? "set" : void 0;
103
+ const rawResourceOverride = requestedResourceOverride === null ? void 0 : requestedResourceOverride ?? agent.oauth_resource;
104
+ const resourceOverride = rawResourceOverride ? validateOAuthResourceUrl(rawResourceOverride, { allowHttp }).href : void 0;
88
105
  const prm = await tryDiscoverPRM(agent.agent_uri, fetchFn);
89
- if (prm?.resource) {
106
+ if (!resourceOverride && prm?.resource) {
90
107
  assertPrmResourceMatchesAgentOrigin(agent.agent_uri, prm.resource);
91
108
  }
92
109
  const asUrl = resolveAuthorizationServerUrl(agent.agent_uri, prm);
@@ -94,7 +111,7 @@ async function startWebOAuthFlow(opts) {
94
111
  if (!asMetadata) {
95
112
  throw new OAuthError(`No OAuth metadata at ${asUrl.toString()}`, "no_authorization_server_metadata", agent.id);
96
113
  }
97
- const resource = prm?.resource ? new URL(prm.resource) : resourceUrlFromServerUrl(new URL(agent.agent_uri));
114
+ const resource = resourceOverride ? new URL(resourceOverride) : prm?.resource ? new URL(prm.resource) : resourceUrlFromServerUrl(new URL(agent.agent_uri));
98
115
  const baseClientMetadata = {
99
116
  ...DEFAULT_CLIENT_METADATA,
100
117
  ...clientMetadataOverrides,
@@ -119,6 +136,9 @@ async function startWebOAuthFlow(opts) {
119
136
  state,
120
137
  resource
121
138
  });
139
+ if (audience) {
140
+ authorizationUrl.searchParams.set("audience", audience);
141
+ }
122
142
  const now = /* @__PURE__ */ new Date();
123
143
  const expiresAt = new Date(now.getTime() + ttlMs);
124
144
  const flow = {
@@ -128,6 +148,9 @@ async function startWebOAuthFlow(opts) {
128
148
  codeVerifier,
129
149
  redirectUri,
130
150
  resource: resource.href,
151
+ resourceOverride,
152
+ resourceOverrideAction,
153
+ resourceOverrideSnapshot: agent.oauth_resource ?? null,
131
154
  scope,
132
155
  authorizationServerUrl: asUrl.toString(),
133
156
  clientInformation,
@@ -158,6 +181,11 @@ async function completeWebOAuthFlow(opts) {
158
181
  if (!flow || flow.expiresAt.getTime() < Date.now()) {
159
182
  throw new InvalidOrExpiredFlowError(state);
160
183
  }
184
+ let agentForPersistence;
185
+ if (agentStorage) {
186
+ agentForPersistence = await agentStorage.loadAgent(flow.agentId);
187
+ assertAgentUnchangedForFlow(agentForPersistence, flow);
188
+ }
161
189
  const asMetadata = await discoverAuthorizationServerMetadata(flow.authorizationServerUrl, {
162
190
  fetchFn
163
191
  });
@@ -177,13 +205,16 @@ async function completeWebOAuthFlow(opts) {
177
205
  }
178
206
  let persisted = false;
179
207
  if (agentStorage) {
180
- const agent = await agentStorage.loadAgent(flow.agentId);
181
- if (!agent) {
182
- throw new AgentVanishedDuringFlowError(flow.agentId);
208
+ agentForPersistence = await agentStorage.loadAgent(flow.agentId);
209
+ assertAgentUnchangedForFlow(agentForPersistence, flow);
210
+ agentForPersistence.oauth_tokens = fromMCPTokens(tokens);
211
+ if (flow.resourceOverrideAction === "set" && flow.resourceOverride) {
212
+ agentForPersistence.oauth_resource = flow.resourceOverride;
213
+ } else if (flow.resourceOverrideAction === "clear") {
214
+ delete agentForPersistence.oauth_resource;
183
215
  }
184
- agent.oauth_tokens = fromMCPTokens(tokens);
185
- delete agent.oauth_code_verifier;
186
- await agentStorage.saveAgent(agent);
216
+ delete agentForPersistence.oauth_code_verifier;
217
+ await agentStorage.saveAgent(agentForPersistence);
187
218
  persisted = true;
188
219
  }
189
220
  return {
@@ -194,6 +225,17 @@ async function completeWebOAuthFlow(opts) {
194
225
  persisted
195
226
  };
196
227
  }
228
+ function assertAgentUnchangedForFlow(agent, flow) {
229
+ if (!agent) {
230
+ throw new AgentVanishedDuringFlowError(flow.agentId);
231
+ }
232
+ if (agent.agent_uri !== flow.agentUrl) {
233
+ throw new AgentChangedDuringFlowError(flow.agentId);
234
+ }
235
+ if (Object.prototype.hasOwnProperty.call(flow, "resourceOverrideSnapshot") && (agent.oauth_resource ?? null) !== flow.resourceOverrideSnapshot) {
236
+ throw new AgentChangedDuringFlowError(flow.agentId);
237
+ }
238
+ }
197
239
  function safeReturnTo(value, options = {}) {
198
240
  if (typeof value !== "string" || value.length === 0) return void 0;
199
241
  if (value.startsWith("/") && !value.startsWith("//") && !value.startsWith("/\\")) {
@@ -314,6 +356,7 @@ function redactTokens(input) {
314
356
  return out;
315
357
  }
316
358
  export {
359
+ AgentChangedDuringFlowError,
317
360
  AgentVanishedDuringFlowError,
318
361
  BrowserBindingRequiredError,
319
362
  ConfidentialClientNotAllowedError,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/lib/auth/oauth/web-flow.ts"],"sourcesContent":["/**\n * Web (server-side) OAuth flow helpers for `@adcp/sdk`.\n *\n * Companion to `CLIFlowHandler` for environments where `/oauth/start` and\n * `/oauth/callback` may be served by different processes. Discovery, PKCE,\n * URL construction, and token exchange are delegated to the MCP SDK's\n * `client/auth.js` primitives so this module is glue plus a pending-flow\n * store interface — not reimplemented protocol logic.\n *\n * Wire contract:\n * - PRM (RFC 9728) is consulted first; `prm.resource` is the source of\n * truth for the RFC 8707 `resource` indicator. We fall back to\n * `resourceUrlFromServerUrl(agent.agent_uri)` only when the resource\n * server does not implement PRM (404). Connection / parse / 5xx\n * errors throw `ProtectedResourceMetadataError` — never silently\n * downgrade to local guessing.\n * - `prm.resource` must share an origin with the agent URL; the MCP\n * SDK's `checkResourceAllowed` guards against a poisoned PRM\n * pointing the audience at a third party.\n * - AS URL = `prm.authorization_servers[0]` when PRM is present, else\n * the agent origin.\n * - Scope priority: caller-supplied `scopeHint` (e.g. from a 401\n * `WWW-Authenticate` challenge, per SEP-835) > `prm.scopes_supported`\n * > `clientMetadata.scope`.\n * - Refresh is NOT this module's concern. Once `oauth_tokens` are\n * persisted, `MCPOAuthProvider` handles refresh on the next agent\n * call and the MCP SDK forwards `resource` into the refresh request.\n * Callers who DIY refresh against `oauth_tokens` are responsible for\n * forwarding `resource` themselves.\n */\n\nimport { randomBytes } from 'crypto';\nimport {\n discoverAuthorizationServerMetadata,\n discoverOAuthProtectedResourceMetadata,\n exchangeAuthorization,\n registerClient,\n startAuthorization,\n} from '@modelcontextprotocol/sdk/client/auth.js';\nimport { checkResourceAllowed, resourceUrlFromServerUrl } from '@modelcontextprotocol/sdk/shared/auth-utils.js';\nimport type {\n AuthorizationServerMetadata,\n OAuthClientInformation,\n OAuthClientInformationFull,\n OAuthClientMetadata,\n OAuthProtectedResourceMetadata,\n OAuthTokens,\n} from '@modelcontextprotocol/sdk/shared/auth.js';\n\nimport type { AgentConfig, OAuthConfigStorage } from './types';\nimport { DEFAULT_CLIENT_METADATA, fromMCPClientInfo, fromMCPTokens, OAuthError, toMCPClientInfo } from './types';\n\n/**\n * Default TTL for a pending web flow row. RFC 6749 §10.12 recommends\n * short-lived state; 10 minutes covers slow-typing users without leaving\n * the PKCE verifier on disk longer than necessary.\n */\nexport const DEFAULT_WEB_FLOW_TTL_MS = 10 * 60 * 1000;\n\n/**\n * State persisted between `/oauth/start` and `/oauth/callback`.\n *\n * `codeVerifier` is a PKCE secret. Store implementations MUST encrypt it\n * at rest if persistence crosses a trust boundary (shared DB, cross-tenant\n * Redis, etc.).\n *\n * `carry` is preserved verbatim and round-tripped to the callback. It\n * MUST be JSON-serializable, MUST NOT contain secrets, and MUST be\n * treated as attacker-influenced data (the caller typically populates it\n * from the `/start` request).\n */\nexport interface PendingWebFlow {\n state: string;\n agentId: string;\n agentUrl: string;\n codeVerifier: string;\n redirectUri: string;\n resource?: string;\n scope?: string;\n authorizationServerUrl: string;\n /** Persist as JSON (e.g. Postgres `jsonb`); contents are MCP SDK-typed. */\n clientInformation: OAuthClientInformation;\n createdAt: Date;\n expiresAt: Date;\n /** JSON-serializable, no secrets, attacker-influenced. */\n carry?: Record<string, unknown>;\n}\n\n/**\n * Persistence interface for in-flight web OAuth flows.\n *\n * Canonical implementations:\n *\n * Postgres:\n * ```sql\n * INSERT INTO pending_oauth_flows (state, payload, expires_at)\n * VALUES ($1, $2, $3);\n * -- consume:\n * DELETE FROM pending_oauth_flows\n * WHERE state = $1 AND expires_at > now()\n * RETURNING payload;\n * ```\n *\n * Redis:\n * ```\n * SET pending:flow:<state> <payload> EX 600 NX -- put\n * GETDEL pending:flow:<state> -- consume\n * ```\n *\n * `consume` MUST be a single atomic operation that deletes and returns the\n * row (or returns null). A `SELECT` followed by a separate `DELETE` is a\n * replay vulnerability and DOES NOT satisfy this contract — a callback\n * replayed before the first one commits would mint two tokens.\n *\n * `consume` MUST treat expired rows as absent (return null) and SHOULD\n * delete them on read so a separate sweep is not strictly required.\n *\n * **Tradeoff: consume runs before token exchange.** `completeWebOAuthFlow`\n * consumes the pending row before attempting `exchangeAuthorization`. If\n * the AS returns a transient 5xx (or the network blips between us and the\n * AS), the row is gone and the user must restart from `/oauth/start`.\n * This is the right call for `invalid_grant` (replay protection — the\n * authorization code is one-shot at the AS regardless), but it means\n * transient AS failures cost the user a click. Revisit only if you see\n * real retry-loss in the field.\n */\nexport interface PendingWebFlowStore {\n /** Insert a new flow. MUST reject duplicate `state`. */\n put(flow: PendingWebFlow): Promise<void>;\n /**\n * Atomic delete-and-return. MUST NOT return the same row twice.\n * Returns null if the row is absent or expired.\n */\n consume(state: string): Promise<PendingWebFlow | null>;\n /** Optional housekeeping for expired rows that were never claimed. */\n cleanupExpired?(): Promise<number>;\n}\n\n/** @deprecated Renamed to `PendingWebFlowStore`. */\nexport type PendingFlowStore = PendingWebFlowStore;\n\nexport class InvalidOrExpiredFlowError extends OAuthError {\n constructor(state: string) {\n super(`OAuth flow not found or expired (state=${state})`, 'invalid_or_expired_flow');\n this.name = 'InvalidOrExpiredFlowError';\n }\n}\n\nexport class StateMismatchError extends OAuthError {\n constructor() {\n super('OAuth state does not match the value the caller bound to this session', 'state_mismatch');\n this.name = 'StateMismatchError';\n }\n}\n\nexport class TokenExchangeError extends OAuthError {\n constructor(\n message: string,\n public readonly status: number,\n public readonly body: string,\n /**\n * RFC 6749 §5.2 error code when the authorization server returned a\n * standard error envelope (`invalid_grant`, `invalid_client`, etc.).\n * Undefined when the AS returned a non-OAuth-shaped failure.\n */\n public readonly oauthErrorCode?: string\n ) {\n super(message, 'token_exchange_failed');\n this.name = 'TokenExchangeError';\n }\n}\n\nexport class ProtectedResourceMetadataError extends OAuthError {\n constructor(message: string) {\n super(message, 'protected_resource_metadata_error');\n this.name = 'ProtectedResourceMetadataError';\n }\n}\n\nexport class AgentVanishedDuringFlowError extends OAuthError {\n constructor(agentId: string) {\n super(\n `Agent ${agentId} could not be loaded from storage during token persistence; tokens were not saved`,\n 'agent_vanished_during_flow',\n agentId\n );\n this.name = 'AgentVanishedDuringFlowError';\n }\n}\n\nexport class ConfidentialClientNotAllowedError extends OAuthError {\n constructor(agentId: string | undefined) {\n super(\n 'Authorization server issued a confidential client (client_secret) during dynamic registration. ' +\n 'Pass `allowConfidentialClient: true` if you intend to persist a long-lived AS credential to your agent storage.',\n 'confidential_client_not_allowed',\n agentId\n );\n this.name = 'ConfidentialClientNotAllowedError';\n }\n}\n\nexport class BrowserBindingRequiredError extends OAuthError {\n constructor() {\n super(\n 'completeWebOAuthFlow called with requireBrowserBinding:true but expectedState was not supplied — ' +\n 'pass the state value from the session cookie set at /oauth/start',\n 'browser_binding_required'\n );\n this.name = 'BrowserBindingRequiredError';\n }\n}\n\nexport interface StartWebFlowOptions {\n /** Agent the flow is for. Must include `agent_uri`. */\n agent: AgentConfig;\n /** Absolute URL of the consumer's `/callback` route (must match what the AS sees). */\n redirectUri: string;\n /** Where to persist the pending flow until callback. */\n pendingFlowStore: PendingWebFlowStore;\n /** When provided, dynamic-registration results land in `agent.oauth_client`. */\n agentStorage?: OAuthConfigStorage;\n /**\n * Free-form caller payload, round-tripped to `completeWebOAuthFlow`.\n * Must be JSON-serializable. Do not store secrets here. Treated as\n * attacker-influenced — validate before reflecting (e.g. via\n * {@link safeReturnTo} for redirect targets).\n */\n carry?: Record<string, unknown>;\n /**\n * Scope hint (highest priority per SEP-835). Pass through the `scope`\n * value from a prior 401 `WWW-Authenticate` challenge if you have one.\n */\n scopeHint?: string;\n /** Override flow TTL. Default: {@link DEFAULT_WEB_FLOW_TTL_MS}. */\n ttlMs?: number;\n /** Override the random-state generator (defaults to 32 bytes base64url). */\n generateState?: () => string;\n /** Override `fetch` (timeouts, signing, mocks). */\n fetch?: typeof fetch;\n /**\n * Override base client metadata. `redirect_uris` is always replaced\n * with `[redirectUri]` regardless of what's passed here.\n */\n clientMetadata?: Partial<OAuthClientMetadata>;\n /**\n * Permit the AS to register a confidential client (i.e. one that\n * returns a `client_secret` from dynamic registration). Default false:\n * if the AS issues a secret we throw {@link ConfidentialClientNotAllowedError}\n * rather than silently persisting a long-lived credential to your\n * agent storage.\n */\n allowConfidentialClient?: boolean;\n}\n\nexport interface StartWebFlowResult {\n authorizationUrl: string;\n state: string;\n expiresAt: Date;\n}\n\nexport interface CompleteWebFlowOptions {\n state: string;\n code: string;\n pendingFlowStore: PendingWebFlowStore;\n /** When provided, the issued tokens are persisted to `agent.oauth_tokens`. */\n agentStorage?: OAuthConfigStorage;\n fetch?: typeof fetch;\n /**\n * The caller-bound expected state (e.g. from a session cookie set at\n * `/oauth/start`). When provided, must equal `state`; mismatch throws\n * {@link StateMismatchError}. Without this, `state` is replay-protected\n * but not browser-bound — see WEB-OAUTH.md.\n */\n expectedState?: string;\n /**\n * When `true`, throws {@link BrowserBindingRequiredError} if `expectedState`\n * is omitted instead of emitting a `console.warn`. Use this in frameworks\n * where session cookies are always available so that a missing bind is caught\n * at development time rather than silently permitted in production.\n *\n * Default: `false`.\n */\n requireBrowserBinding?: boolean;\n}\n\nexport interface CompleteWebFlowResult {\n agentId: string;\n agentUrl: string;\n tokens: OAuthTokens;\n carry?: Record<string, unknown>;\n /** True if `agentStorage` was provided AND `saveAgent` succeeded. */\n persisted: boolean;\n}\n\n/**\n * Begin a web OAuth flow. Returns the authorization URL the consumer\n * should redirect the browser to. Persists the PKCE verifier and other\n * flow state via `pendingFlowStore.put` so a different process can complete it.\n */\nexport async function startWebOAuthFlow(opts: StartWebFlowOptions): Promise<StartWebFlowResult> {\n const {\n agent,\n redirectUri,\n pendingFlowStore,\n agentStorage,\n carry,\n scopeHint,\n ttlMs = DEFAULT_WEB_FLOW_TTL_MS,\n generateState,\n fetch: fetchFn,\n clientMetadata: clientMetadataOverrides,\n allowConfidentialClient = false,\n } = opts;\n\n if (!agent.agent_uri) {\n throw new OAuthError('Agent missing agent_uri', 'invalid_agent', agent.id);\n }\n\n const prm = await tryDiscoverPRM(agent.agent_uri, fetchFn);\n if (prm?.resource) {\n assertPrmResourceMatchesAgentOrigin(agent.agent_uri, prm.resource);\n }\n\n const asUrl = resolveAuthorizationServerUrl(agent.agent_uri, prm);\n\n const asMetadata = await discoverAuthorizationServerMetadata(asUrl.toString(), { fetchFn });\n if (!asMetadata) {\n throw new OAuthError(`No OAuth metadata at ${asUrl.toString()}`, 'no_authorization_server_metadata', agent.id);\n }\n\n const resource = prm?.resource ? new URL(prm.resource) : resourceUrlFromServerUrl(new URL(agent.agent_uri));\n\n const baseClientMetadata: OAuthClientMetadata = {\n ...DEFAULT_CLIENT_METADATA,\n ...clientMetadataOverrides,\n redirect_uris: [redirectUri],\n };\n\n const scope = scopeHint ?? prm?.scopes_supported?.join(' ') ?? baseClientMetadata.scope;\n\n const clientInformation = await resolveClientInformation({\n agent,\n agentStorage,\n asUrl,\n asMetadata,\n clientMetadata: baseClientMetadata,\n fetchFn,\n allowConfidentialClient,\n });\n\n const state = (generateState ?? defaultGenerateState)();\n const { authorizationUrl, codeVerifier } = await startAuthorization(asUrl.toString(), {\n metadata: asMetadata,\n clientInformation,\n redirectUrl: redirectUri,\n scope,\n state,\n resource,\n });\n\n const now = new Date();\n const expiresAt = new Date(now.getTime() + ttlMs);\n const flow: PendingWebFlow = {\n state,\n agentId: agent.id,\n agentUrl: agent.agent_uri,\n codeVerifier,\n redirectUri,\n resource: resource.href,\n scope,\n authorizationServerUrl: asUrl.toString(),\n clientInformation,\n createdAt: now,\n expiresAt,\n carry,\n };\n await pendingFlowStore.put(flow);\n\n return {\n authorizationUrl: authorizationUrl.toString(),\n state,\n expiresAt,\n };\n}\n\n/**\n * Finish a web OAuth flow. Atomically consumes the pending row, exchanges\n * the authorization code for tokens, and (if storage is provided)\n * persists tokens to `agent.oauth_tokens`. Returns whatever the caller\n * stashed in `carry` so the consumer can route the user appropriately.\n *\n * The pending row is consumed BEFORE `exchangeAuthorization` runs. A\n * transient AS failure leaves the user with no row to retry against and\n * they must restart from `/oauth/start`. See {@link PendingWebFlowStore}\n * for the full tradeoff discussion.\n */\nexport async function completeWebOAuthFlow(opts: CompleteWebFlowOptions): Promise<CompleteWebFlowResult> {\n const { state, code, pendingFlowStore, agentStorage, fetch: fetchFn, expectedState, requireBrowserBinding } = opts;\n\n if (expectedState === undefined) {\n if (requireBrowserBinding) {\n throw new BrowserBindingRequiredError();\n }\n // Warn callers who omit expectedState: the flow is replay-protected via\n // atomic consume but is not browser-bound (any request carrying the correct\n // state + code would be accepted). Pass expectedState from a session cookie\n // set at /oauth/start to fully bind the callback to the initiating browser.\n // Set requireBrowserBinding:true to make this a hard error instead.\n console.warn(\n '[adcp/sdk] completeWebOAuthFlow: expectedState not supplied — the callback is replay-protected ' +\n 'but not browser-bound. Pass expectedState from a session cookie set at /oauth/start, ' +\n 'or set requireBrowserBinding:true to enforce it.'\n );\n } else if (expectedState !== state) {\n throw new StateMismatchError();\n }\n\n const flow = await pendingFlowStore.consume(state);\n if (!flow || flow.expiresAt.getTime() < Date.now()) {\n throw new InvalidOrExpiredFlowError(state);\n }\n\n const asMetadata = await discoverAuthorizationServerMetadata(flow.authorizationServerUrl, {\n fetchFn,\n });\n\n let tokens: OAuthTokens;\n try {\n tokens = await exchangeAuthorization(flow.authorizationServerUrl, {\n metadata: asMetadata ?? undefined,\n clientInformation: flow.clientInformation,\n authorizationCode: code,\n codeVerifier: flow.codeVerifier,\n redirectUri: flow.redirectUri,\n resource: flow.resource ? new URL(flow.resource) : undefined,\n fetchFn,\n });\n } catch (err) {\n throw wrapTokenExchangeError(err);\n }\n\n let persisted = false;\n if (agentStorage) {\n const agent = await agentStorage.loadAgent(flow.agentId);\n if (!agent) {\n throw new AgentVanishedDuringFlowError(flow.agentId);\n }\n agent.oauth_tokens = fromMCPTokens(tokens);\n delete agent.oauth_code_verifier;\n await agentStorage.saveAgent(agent);\n persisted = true;\n }\n\n return {\n agentId: flow.agentId,\n agentUrl: flow.agentUrl,\n tokens,\n carry: flow.carry,\n persisted,\n };\n}\n\n/**\n * Validate a redirect target supplied via `carry`.\n *\n * Treats `value` as attacker-influenced. Returns a string that is safe to\n * pass to `res.redirect`, or `undefined` if the value is invalid.\n *\n * Defaults to **path-only** redirects (must start with a single `/` and\n * not be protocol-relative `//evil.example`). Pass `allowedReturnHosts`\n * to permit absolute URLs against an allowlist.\n *\n * @example\n * ```ts\n * res.redirect(safeReturnTo(carry?.return_to) ?? '/');\n * res.redirect(safeReturnTo(carry?.return_to, { allowedReturnHosts: ['app.example.com'] }) ?? '/');\n * ```\n */\nexport function safeReturnTo(value: unknown, options: { allowedReturnHosts?: string[] } = {}): string | undefined {\n if (typeof value !== 'string' || value.length === 0) return undefined;\n\n // Path-only: must be `/...` but not `//...` (protocol-relative) or `/\\...`.\n if (value.startsWith('/') && !value.startsWith('//') && !value.startsWith('/\\\\')) {\n return value;\n }\n\n const allowed = options.allowedReturnHosts;\n if (!allowed || allowed.length === 0) return undefined;\n\n let parsed: URL;\n try {\n parsed = new URL(value);\n } catch {\n return undefined;\n }\n if (parsed.protocol !== 'https:' && parsed.protocol !== 'http:') return undefined;\n if (!allowed.includes(parsed.host)) return undefined;\n return parsed.toString();\n}\n\n/**\n * In-memory pending-flow store for tests and single-instance dev.\n *\n * Production deployments MUST implement `PendingWebFlowStore` against a\n * shared store (Postgres `DELETE … RETURNING`, Redis `GETDEL`) so\n * `/start` and `/callback` can hit different processes.\n */\nexport class InMemoryPendingFlowStore implements PendingWebFlowStore {\n private readonly flows = new Map<string, PendingWebFlow>();\n\n async put(flow: PendingWebFlow): Promise<void> {\n if (this.flows.has(flow.state)) {\n throw new Error(`Pending flow already exists for state ${flow.state}`);\n }\n this.flows.set(flow.state, flow);\n }\n\n async consume(state: string): Promise<PendingWebFlow | null> {\n const flow = this.flows.get(state);\n if (!flow) return null;\n this.flows.delete(state);\n if (flow.expiresAt.getTime() < Date.now()) return null;\n return flow;\n }\n\n async cleanupExpired(): Promise<number> {\n const now = Date.now();\n let removed = 0;\n for (const [state, flow] of this.flows) {\n if (flow.expiresAt.getTime() < now) {\n this.flows.delete(state);\n removed++;\n }\n }\n return removed;\n }\n}\n\n// ============================================================\n// Internals\n// ============================================================\n\n/**\n * The MCP SDK reports a 404 PRM lookup with this exact message; treat it\n * as \"PRM is genuinely absent\" and fall back. Anything else is a\n * connection, parse, or 5xx error and is allowed to bubble.\n *\n * Source (verified against `@modelcontextprotocol/sdk@1.29.0`):\n * `dist/esm/client/auth.js` → `discoverOAuthProtectedResourceMetadata`\n * throws `new Error(`Resource server does not implement OAuth 2.0 Protected Resource Metadata.`)`\n * when `response.status === 404` (or no response was returned).\n *\n * If a future MCP SDK reword this message, the test\n * \"falls back to server-derived resource on a 404 PRM\" at\n * `test/lib/oauth-web-flow.test.js` will fail — that test calls the real\n * SDK against a 404 fixture and is the canary for this regression.\n */\nconst PRM_ABSENT_MARKER = 'does not implement OAuth 2.0 Protected Resource Metadata';\n\nasync function tryDiscoverPRM(\n agentUrl: string,\n fetchFn: typeof fetch | undefined\n): Promise<OAuthProtectedResourceMetadata | undefined> {\n try {\n return await discoverOAuthProtectedResourceMetadata(agentUrl, undefined, fetchFn);\n } catch (err) {\n if (err instanceof Error && err.message.includes(PRM_ABSENT_MARKER)) {\n // PRM is optional under RFC 9728 — fall back to local resource\n // derivation. Connection/parse/5xx errors fall through.\n return undefined;\n }\n const message = err instanceof Error ? err.message : String(err);\n throw new ProtectedResourceMetadataError(`PRM discovery failed: ${message}`);\n }\n}\n\nfunction assertPrmResourceMatchesAgentOrigin(agentUrl: string, prmResource: string): void {\n const requested = resourceUrlFromServerUrl(new URL(agentUrl));\n if (!checkResourceAllowed({ requestedResource: requested, configuredResource: prmResource })) {\n throw new ProtectedResourceMetadataError(\n `PRM advertises resource ${prmResource} which does not share an origin/path with agent ${agentUrl}`\n );\n }\n}\n\nfunction resolveAuthorizationServerUrl(agentUrl: string, prm: OAuthProtectedResourceMetadata | undefined): URL {\n const first = prm?.authorization_servers?.[0];\n if (first) {\n return new URL(first);\n }\n return new URL(new URL(agentUrl).origin);\n}\n\nasync function resolveClientInformation(args: {\n agent: AgentConfig;\n agentStorage?: OAuthConfigStorage;\n asUrl: URL;\n asMetadata: AuthorizationServerMetadata;\n clientMetadata: OAuthClientMetadata;\n fetchFn?: typeof fetch;\n allowConfidentialClient: boolean;\n}): Promise<OAuthClientInformation> {\n const { agent, agentStorage, asUrl, asMetadata, clientMetadata, fetchFn, allowConfidentialClient } = args;\n\n if (agent.oauth_client) {\n return toMCPClientInfo(agent.oauth_client);\n }\n\n if (!asMetadata.registration_endpoint) {\n throw new OAuthError(\n 'Agent has no oauth_client and authorization server does not advertise dynamic client registration',\n 'no_client_credentials',\n agent.id\n );\n }\n\n const registered: OAuthClientInformationFull = await registerClient(asUrl.toString(), {\n metadata: asMetadata,\n clientMetadata,\n fetchFn,\n });\n\n if (registered.client_secret && !allowConfidentialClient) {\n throw new ConfidentialClientNotAllowedError(agent.id);\n }\n\n if (agentStorage) {\n // Load fresh and save fresh so two concurrent /start calls for the\n // same agentId do not trample each other's `oauth_client` via a\n // shared in-memory reference.\n const fresh = (await agentStorage.loadAgent(agent.id)) ?? agent;\n fresh.oauth_client = fromMCPClientInfo(registered);\n await agentStorage.saveAgent(fresh);\n }\n\n return registered;\n}\n\nfunction defaultGenerateState(): string {\n return randomBytes(32).toString('base64url');\n}\n\n/**\n * Map an MCP SDK token-exchange failure to {@link TokenExchangeError},\n * redacting bearer/refresh tokens that some authorization servers echo\n * back in error responses for debugging.\n */\nfunction wrapTokenExchangeError(err: unknown): TokenExchangeError {\n // The MCP SDK's `parseErrorResponse` decodes a well-formed OAuth error\n // envelope into an `OAuthError` subclass with `errorCode` (e.g.\n // `InvalidGrantError`). Malformed responses come through as\n // `ServerError` with the raw body in `message`, so the redaction pass\n // covers both cases.\n const oauthErrorCode = (err as { errorCode?: string })?.errorCode;\n const message = err instanceof Error ? err.message : String(err);\n const status = (err as { status?: number })?.status ?? 0;\n const rawBody = (err as { body?: string })?.body ?? message;\n const body = redactTokens(rawBody);\n const display = oauthErrorCode ? `${oauthErrorCode}: ${message}` : message;\n return new TokenExchangeError(`Token exchange failed: ${redactTokens(display)}`, status, body, oauthErrorCode);\n}\n\nconst SENSITIVE_TOKEN_KEYS = ['access_token', 'refresh_token', 'id_token', 'token'];\n\n/**\n * Best-effort redaction of bearer/refresh tokens from an AS error body\n * (which may be JSON, form-encoded, or freeform). Adopters MUST still\n * treat `TokenExchangeError.body` as sensitive — do not reflect it to\n * the browser or write it to access logs unredacted.\n */\nfunction redactTokens(input: string): string {\n let out = input;\n for (const key of SENSITIVE_TOKEN_KEYS) {\n // JSON form: \"key\":\"…\"\n out = out.replace(new RegExp(`(\"${key}\"\\\\s*:\\\\s*\")[^\"]*(\")`, 'gi'), '$1<redacted>$2');\n // form-encoded: key=…\n out = out.replace(new RegExp(`(\\\\b${key}=)[^&\\\\s]+`, 'gi'), '$1<redacted>');\n }\n return out;\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../../src/lib/auth/oauth/web-flow.ts"],"sourcesContent":["/**\n * Web (server-side) OAuth flow helpers for `@adcp/sdk`.\n *\n * Companion to `CLIFlowHandler` for environments where `/oauth/start` and\n * `/oauth/callback` may be served by different processes. Discovery, PKCE,\n * URL construction, and token exchange are delegated to the MCP SDK's\n * `client/auth.js` primitives so this module is glue plus a pending-flow\n * store interface — not reimplemented protocol logic.\n *\n * Wire contract:\n * - An operator `resourceOverride` takes precedence for legacy or\n * non-conformant integrations. Otherwise PRM (RFC 9728) is consulted;\n * `prm.resource` is the source of truth for the RFC 8707 `resource`\n * indicator. We fall back to\n * `resourceUrlFromServerUrl(agent.agent_uri)` only when the resource\n * server does not implement PRM (404). Connection / parse / 5xx\n * errors throw `ProtectedResourceMetadataError` — never silently\n * downgrade to local guessing.\n * - Without a trusted override, `prm.resource` must share an origin with\n * the agent URL; the MCP SDK's `checkResourceAllowed` guards against a\n * poisoned PRM pointing the audience at a third party.\n * - AS URL = `prm.authorization_servers[0]` when PRM is present, else\n * the agent origin.\n * - Scope priority: caller-supplied `scopeHint` (e.g. from a 401\n * `WWW-Authenticate` challenge, per SEP-835) > `prm.scopes_supported`\n * > `clientMetadata.scope`.\n * - Refresh is NOT this module's concern. Once `oauth_tokens` are\n * persisted, `MCPOAuthProvider` handles refresh on the next agent\n * call and the MCP SDK forwards `resource` into the refresh request.\n * Callers who DIY refresh against `oauth_tokens` are responsible for\n * forwarding `resource` themselves.\n */\n\nimport { randomBytes } from 'crypto';\nimport {\n discoverAuthorizationServerMetadata,\n discoverOAuthProtectedResourceMetadata,\n exchangeAuthorization,\n registerClient,\n startAuthorization,\n} from '@modelcontextprotocol/sdk/client/auth.js';\nimport { checkResourceAllowed, resourceUrlFromServerUrl } from '@modelcontextprotocol/sdk/shared/auth-utils.js';\nimport type {\n AuthorizationServerMetadata,\n OAuthClientInformation,\n OAuthClientInformationFull,\n OAuthClientMetadata,\n OAuthProtectedResourceMetadata,\n OAuthTokens,\n} from '@modelcontextprotocol/sdk/shared/auth.js';\n\nimport type { AgentConfig, OAuthConfigStorage } from './types';\nimport { DEFAULT_CLIENT_METADATA, fromMCPClientInfo, fromMCPTokens, OAuthError, toMCPClientInfo } from './types';\nimport { validateOAuthResourceUrl } from './resource-url';\n\n/**\n * Default TTL for a pending web flow row. RFC 6749 §10.12 recommends\n * short-lived state; 10 minutes covers slow-typing users without leaving\n * the PKCE verifier on disk longer than necessary.\n */\nexport const DEFAULT_WEB_FLOW_TTL_MS = 10 * 60 * 1000;\n\n/**\n * State persisted between `/oauth/start` and `/oauth/callback`.\n *\n * `codeVerifier` is a PKCE secret. Store implementations MUST encrypt it\n * at rest if persistence crosses a trust boundary (shared DB, cross-tenant\n * Redis, etc.).\n *\n * `carry` is preserved verbatim and round-tripped to the callback. It\n * MUST be JSON-serializable, MUST NOT contain secrets, and MUST be\n * treated as attacker-influenced data (the caller typically populates it\n * from the `/start` request).\n */\nexport interface PendingWebFlow {\n state: string;\n agentId: string;\n agentUrl: string;\n codeVerifier: string;\n redirectUri: string;\n resource?: string;\n /** Explicit operator override, persisted separately so refresh can retain it. */\n resourceOverride?: string;\n /** Mutation requested by this flow. Absent on legacy rows and preserve-only flows. */\n resourceOverrideAction?: 'set' | 'clear';\n /** Value observed at flow start; used to reject concurrent operator edits. */\n resourceOverrideSnapshot?: string | null;\n scope?: string;\n authorizationServerUrl: string;\n /** Persist as JSON (e.g. Postgres `jsonb`); contents are MCP SDK-typed. */\n clientInformation: OAuthClientInformation;\n createdAt: Date;\n expiresAt: Date;\n /** JSON-serializable, no secrets, attacker-influenced. */\n carry?: Record<string, unknown>;\n}\n\n/**\n * Persistence interface for in-flight web OAuth flows.\n *\n * Canonical implementations:\n *\n * Postgres:\n * ```sql\n * INSERT INTO pending_oauth_flows (state, payload, expires_at)\n * VALUES ($1, $2, $3);\n * -- consume:\n * DELETE FROM pending_oauth_flows\n * WHERE state = $1 AND expires_at > now()\n * RETURNING payload;\n * ```\n *\n * Redis:\n * ```\n * SET pending:flow:<state> <payload> EX 600 NX -- put\n * GETDEL pending:flow:<state> -- consume\n * ```\n *\n * `consume` MUST be a single atomic operation that deletes and returns the\n * row (or returns null). A `SELECT` followed by a separate `DELETE` is a\n * replay vulnerability and DOES NOT satisfy this contract — a callback\n * replayed before the first one commits would mint two tokens.\n *\n * `consume` MUST treat expired rows as absent (return null) and SHOULD\n * delete them on read so a separate sweep is not strictly required.\n *\n * **Tradeoff: consume runs before token exchange.** `completeWebOAuthFlow`\n * consumes the pending row before attempting `exchangeAuthorization`. If\n * the AS returns a transient 5xx (or the network blips between us and the\n * AS), the row is gone and the user must restart from `/oauth/start`.\n * This is the right call for `invalid_grant` (replay protection — the\n * authorization code is one-shot at the AS regardless), but it means\n * transient AS failures cost the user a click. Revisit only if you see\n * real retry-loss in the field.\n */\nexport interface PendingWebFlowStore {\n /** Insert a new flow. MUST reject duplicate `state`. */\n put(flow: PendingWebFlow): Promise<void>;\n /**\n * Atomic delete-and-return. MUST NOT return the same row twice.\n * Returns null if the row is absent or expired.\n */\n consume(state: string): Promise<PendingWebFlow | null>;\n /** Optional housekeeping for expired rows that were never claimed. */\n cleanupExpired?(): Promise<number>;\n}\n\n/** @deprecated Renamed to `PendingWebFlowStore`. */\nexport type PendingFlowStore = PendingWebFlowStore;\n\nexport class InvalidOrExpiredFlowError extends OAuthError {\n constructor(state: string) {\n super(`OAuth flow not found or expired (state=${state})`, 'invalid_or_expired_flow');\n this.name = 'InvalidOrExpiredFlowError';\n }\n}\n\nexport class StateMismatchError extends OAuthError {\n constructor() {\n super('OAuth state does not match the value the caller bound to this session', 'state_mismatch');\n this.name = 'StateMismatchError';\n }\n}\n\nexport class TokenExchangeError extends OAuthError {\n constructor(\n message: string,\n public readonly status: number,\n public readonly body: string,\n /**\n * RFC 6749 §5.2 error code when the authorization server returned a\n * standard error envelope (`invalid_grant`, `invalid_client`, etc.).\n * Undefined when the AS returned a non-OAuth-shaped failure.\n */\n public readonly oauthErrorCode?: string\n ) {\n super(message, 'token_exchange_failed');\n this.name = 'TokenExchangeError';\n }\n}\n\nexport class ProtectedResourceMetadataError extends OAuthError {\n constructor(message: string) {\n super(message, 'protected_resource_metadata_error');\n this.name = 'ProtectedResourceMetadataError';\n }\n}\n\nexport class AgentVanishedDuringFlowError extends OAuthError {\n constructor(agentId: string) {\n super(\n `Agent ${agentId} could not be loaded from storage during token persistence; tokens were not saved`,\n 'agent_vanished_during_flow',\n agentId\n );\n this.name = 'AgentVanishedDuringFlowError';\n }\n}\n\nexport class AgentChangedDuringFlowError extends OAuthError {\n constructor(agentId: string) {\n super(\n `Agent ${agentId} changed while OAuth authorization was pending; tokens were not saved`,\n 'agent_changed_during_flow',\n agentId\n );\n this.name = 'AgentChangedDuringFlowError';\n }\n}\n\nexport class ConfidentialClientNotAllowedError extends OAuthError {\n constructor(agentId: string | undefined) {\n super(\n 'Authorization server issued a confidential client (client_secret) during dynamic registration. ' +\n 'Pass `allowConfidentialClient: true` if you intend to persist a long-lived AS credential to your agent storage.',\n 'confidential_client_not_allowed',\n agentId\n );\n this.name = 'ConfidentialClientNotAllowedError';\n }\n}\n\nexport class BrowserBindingRequiredError extends OAuthError {\n constructor() {\n super(\n 'completeWebOAuthFlow called with requireBrowserBinding:true but expectedState was not supplied — ' +\n 'pass the state value from the session cookie set at /oauth/start',\n 'browser_binding_required'\n );\n this.name = 'BrowserBindingRequiredError';\n }\n}\n\nexport interface StartWebFlowOptions {\n /** Agent the flow is for. Must include `agent_uri`. */\n agent: AgentConfig;\n /** Absolute URL of the consumer's `/callback` route (must match what the AS sees). */\n redirectUri: string;\n /** Where to persist the pending flow until callback. */\n pendingFlowStore: PendingWebFlowStore;\n /** When provided, dynamic-registration results land in `agent.oauth_client`. */\n agentStorage?: OAuthConfigStorage;\n /**\n * Free-form caller payload, round-tripped to `completeWebOAuthFlow`.\n * Must be JSON-serializable. Do not store secrets here. Treated as\n * attacker-influenced — validate before reflecting (e.g. via\n * {@link safeReturnTo} for redirect targets).\n */\n carry?: Record<string, unknown>;\n /**\n * Scope hint (highest priority per SEP-835). Pass through the `scope`\n * value from a prior 401 `WWW-Authenticate` challenge if you have one.\n */\n scopeHint?: string;\n /**\n * Operator-supplied RFC 8707 resource override. Takes precedence over\n * `prm.resource` and the agent-URL-derived fallback, and is sent during\n * both authorization and code exchange. Pass `null` to explicitly clear a\n * persisted override and return to metadata/agent-URL discovery.\n */\n resourceOverride?: string | null;\n /**\n * Non-standard Auth0-compatible audience parameter. Sent only to the\n * authorization endpoint. Prefer `resourceOverride` for RFC 8707 servers.\n */\n audience?: string;\n /** Permit an HTTP resource override for local development. Default false. */\n allowHttp?: boolean;\n /** Override flow TTL. Default: {@link DEFAULT_WEB_FLOW_TTL_MS}. */\n ttlMs?: number;\n /** Override the random-state generator (defaults to 32 bytes base64url). */\n generateState?: () => string;\n /** Override `fetch` (timeouts, signing, mocks). */\n fetch?: typeof fetch;\n /**\n * Override base client metadata. `redirect_uris` is always replaced\n * with `[redirectUri]` regardless of what's passed here.\n */\n clientMetadata?: Partial<OAuthClientMetadata>;\n /**\n * Permit the AS to register a confidential client (i.e. one that\n * returns a `client_secret` from dynamic registration). Default false:\n * if the AS issues a secret we throw {@link ConfidentialClientNotAllowedError}\n * rather than silently persisting a long-lived credential to your\n * agent storage.\n */\n allowConfidentialClient?: boolean;\n}\n\nexport interface StartWebFlowResult {\n authorizationUrl: string;\n state: string;\n expiresAt: Date;\n}\n\nexport interface CompleteWebFlowOptions {\n state: string;\n code: string;\n pendingFlowStore: PendingWebFlowStore;\n /** When provided, the issued tokens are persisted to `agent.oauth_tokens`. */\n agentStorage?: OAuthConfigStorage;\n fetch?: typeof fetch;\n /**\n * The caller-bound expected state (e.g. from a session cookie set at\n * `/oauth/start`). When provided, must equal `state`; mismatch throws\n * {@link StateMismatchError}. Without this, `state` is replay-protected\n * but not browser-bound — see WEB-OAUTH.md.\n */\n expectedState?: string;\n /**\n * When `true`, throws {@link BrowserBindingRequiredError} if `expectedState`\n * is omitted instead of emitting a `console.warn`. Use this in frameworks\n * where session cookies are always available so that a missing bind is caught\n * at development time rather than silently permitted in production.\n *\n * Default: `false`.\n */\n requireBrowserBinding?: boolean;\n}\n\nexport interface CompleteWebFlowResult {\n agentId: string;\n agentUrl: string;\n tokens: OAuthTokens;\n carry?: Record<string, unknown>;\n /** True if `agentStorage` was provided AND `saveAgent` succeeded. */\n persisted: boolean;\n}\n\n/**\n * Begin a web OAuth flow. Returns the authorization URL the consumer\n * should redirect the browser to. Persists the PKCE verifier and other\n * flow state via `pendingFlowStore.put` so a different process can complete it.\n */\nexport async function startWebOAuthFlow(opts: StartWebFlowOptions): Promise<StartWebFlowResult> {\n const {\n agent,\n redirectUri,\n pendingFlowStore,\n agentStorage,\n carry,\n scopeHint,\n resourceOverride: requestedResourceOverride,\n audience,\n allowHttp = false,\n ttlMs = DEFAULT_WEB_FLOW_TTL_MS,\n generateState,\n fetch: fetchFn,\n clientMetadata: clientMetadataOverrides,\n allowConfidentialClient = false,\n } = opts;\n\n if (!agent.agent_uri) {\n throw new OAuthError('Agent missing agent_uri', 'invalid_agent', agent.id);\n }\n\n const resourceOverrideAction =\n requestedResourceOverride === null ? 'clear' : requestedResourceOverride !== undefined ? 'set' : undefined;\n const rawResourceOverride =\n requestedResourceOverride === null ? undefined : (requestedResourceOverride ?? agent.oauth_resource);\n const resourceOverride = rawResourceOverride\n ? validateOAuthResourceUrl(rawResourceOverride, { allowHttp }).href\n : undefined;\n\n const prm = await tryDiscoverPRM(agent.agent_uri, fetchFn);\n if (!resourceOverride && prm?.resource) {\n assertPrmResourceMatchesAgentOrigin(agent.agent_uri, prm.resource);\n }\n\n const asUrl = resolveAuthorizationServerUrl(agent.agent_uri, prm);\n\n const asMetadata = await discoverAuthorizationServerMetadata(asUrl.toString(), { fetchFn });\n if (!asMetadata) {\n throw new OAuthError(`No OAuth metadata at ${asUrl.toString()}`, 'no_authorization_server_metadata', agent.id);\n }\n\n const resource = resourceOverride\n ? new URL(resourceOverride)\n : prm?.resource\n ? new URL(prm.resource)\n : resourceUrlFromServerUrl(new URL(agent.agent_uri));\n\n const baseClientMetadata: OAuthClientMetadata = {\n ...DEFAULT_CLIENT_METADATA,\n ...clientMetadataOverrides,\n redirect_uris: [redirectUri],\n };\n\n const scope = scopeHint ?? prm?.scopes_supported?.join(' ') ?? baseClientMetadata.scope;\n\n const clientInformation = await resolveClientInformation({\n agent,\n agentStorage,\n asUrl,\n asMetadata,\n clientMetadata: baseClientMetadata,\n fetchFn,\n allowConfidentialClient,\n });\n\n const state = (generateState ?? defaultGenerateState)();\n const { authorizationUrl, codeVerifier } = await startAuthorization(asUrl.toString(), {\n metadata: asMetadata,\n clientInformation,\n redirectUrl: redirectUri,\n scope,\n state,\n resource,\n });\n if (audience) {\n authorizationUrl.searchParams.set('audience', audience);\n }\n\n const now = new Date();\n const expiresAt = new Date(now.getTime() + ttlMs);\n const flow: PendingWebFlow = {\n state,\n agentId: agent.id,\n agentUrl: agent.agent_uri,\n codeVerifier,\n redirectUri,\n resource: resource.href,\n resourceOverride,\n resourceOverrideAction,\n resourceOverrideSnapshot: agent.oauth_resource ?? null,\n scope,\n authorizationServerUrl: asUrl.toString(),\n clientInformation,\n createdAt: now,\n expiresAt,\n carry,\n };\n await pendingFlowStore.put(flow);\n\n return {\n authorizationUrl: authorizationUrl.toString(),\n state,\n expiresAt,\n };\n}\n\n/**\n * Finish a web OAuth flow. Atomically consumes the pending row, exchanges\n * the authorization code for tokens, and (if storage is provided)\n * persists tokens to `agent.oauth_tokens`. Returns whatever the caller\n * stashed in `carry` so the consumer can route the user appropriately.\n *\n * The pending row is consumed BEFORE `exchangeAuthorization` runs. A\n * transient AS failure leaves the user with no row to retry against and\n * they must restart from `/oauth/start`. See {@link PendingWebFlowStore}\n * for the full tradeoff discussion.\n */\nexport async function completeWebOAuthFlow(opts: CompleteWebFlowOptions): Promise<CompleteWebFlowResult> {\n const { state, code, pendingFlowStore, agentStorage, fetch: fetchFn, expectedState, requireBrowserBinding } = opts;\n\n if (expectedState === undefined) {\n if (requireBrowserBinding) {\n throw new BrowserBindingRequiredError();\n }\n // Warn callers who omit expectedState: the flow is replay-protected via\n // atomic consume but is not browser-bound (any request carrying the correct\n // state + code would be accepted). Pass expectedState from a session cookie\n // set at /oauth/start to fully bind the callback to the initiating browser.\n // Set requireBrowserBinding:true to make this a hard error instead.\n console.warn(\n '[adcp/sdk] completeWebOAuthFlow: expectedState not supplied — the callback is replay-protected ' +\n 'but not browser-bound. Pass expectedState from a session cookie set at /oauth/start, ' +\n 'or set requireBrowserBinding:true to enforce it.'\n );\n } else if (expectedState !== state) {\n throw new StateMismatchError();\n }\n\n const flow = await pendingFlowStore.consume(state);\n if (!flow || flow.expiresAt.getTime() < Date.now()) {\n throw new InvalidOrExpiredFlowError(state);\n }\n\n let agentForPersistence: AgentConfig | undefined;\n if (agentStorage) {\n agentForPersistence = await agentStorage.loadAgent(flow.agentId);\n assertAgentUnchangedForFlow(agentForPersistence, flow);\n }\n\n const asMetadata = await discoverAuthorizationServerMetadata(flow.authorizationServerUrl, {\n fetchFn,\n });\n\n let tokens: OAuthTokens;\n try {\n tokens = await exchangeAuthorization(flow.authorizationServerUrl, {\n metadata: asMetadata ?? undefined,\n clientInformation: flow.clientInformation,\n authorizationCode: code,\n codeVerifier: flow.codeVerifier,\n redirectUri: flow.redirectUri,\n resource: flow.resource ? new URL(flow.resource) : undefined,\n fetchFn,\n });\n } catch (err) {\n throw wrapTokenExchangeError(err);\n }\n\n let persisted = false;\n if (agentStorage) {\n // Re-read after the network round trips so we do not save the stale object\n // loaded before token exchange or overwrite an edit made while the AS was\n // responding. Storage implementations that need a hard same-ID/same-URI\n // tenant guarantee should additionally make saveAgent revision-aware.\n agentForPersistence = await agentStorage.loadAgent(flow.agentId);\n assertAgentUnchangedForFlow(agentForPersistence, flow);\n agentForPersistence.oauth_tokens = fromMCPTokens(tokens);\n if (flow.resourceOverrideAction === 'set' && flow.resourceOverride) {\n agentForPersistence.oauth_resource = flow.resourceOverride;\n } else if (flow.resourceOverrideAction === 'clear') {\n delete agentForPersistence.oauth_resource;\n }\n delete agentForPersistence.oauth_code_verifier;\n await agentStorage.saveAgent(agentForPersistence);\n persisted = true;\n }\n\n return {\n agentId: flow.agentId,\n agentUrl: flow.agentUrl,\n tokens,\n carry: flow.carry,\n persisted,\n };\n}\n\nfunction assertAgentUnchangedForFlow(\n agent: AgentConfig | undefined,\n flow: PendingWebFlow\n): asserts agent is AgentConfig {\n if (!agent) {\n throw new AgentVanishedDuringFlowError(flow.agentId);\n }\n if (agent.agent_uri !== flow.agentUrl) {\n throw new AgentChangedDuringFlowError(flow.agentId);\n }\n if (\n Object.prototype.hasOwnProperty.call(flow, 'resourceOverrideSnapshot') &&\n (agent.oauth_resource ?? null) !== flow.resourceOverrideSnapshot\n ) {\n throw new AgentChangedDuringFlowError(flow.agentId);\n }\n}\n\n/**\n * Validate a redirect target supplied via `carry`.\n *\n * Treats `value` as attacker-influenced. Returns a string that is safe to\n * pass to `res.redirect`, or `undefined` if the value is invalid.\n *\n * Defaults to **path-only** redirects (must start with a single `/` and\n * not be protocol-relative `//evil.example`). Pass `allowedReturnHosts`\n * to permit absolute URLs against an allowlist.\n *\n * @example\n * ```ts\n * res.redirect(safeReturnTo(carry?.return_to) ?? '/');\n * res.redirect(safeReturnTo(carry?.return_to, { allowedReturnHosts: ['app.example.com'] }) ?? '/');\n * ```\n */\nexport function safeReturnTo(value: unknown, options: { allowedReturnHosts?: string[] } = {}): string | undefined {\n if (typeof value !== 'string' || value.length === 0) return undefined;\n\n // Path-only: must be `/...` but not `//...` (protocol-relative) or `/\\...`.\n if (value.startsWith('/') && !value.startsWith('//') && !value.startsWith('/\\\\')) {\n return value;\n }\n\n const allowed = options.allowedReturnHosts;\n if (!allowed || allowed.length === 0) return undefined;\n\n let parsed: URL;\n try {\n parsed = new URL(value);\n } catch {\n return undefined;\n }\n if (parsed.protocol !== 'https:' && parsed.protocol !== 'http:') return undefined;\n if (!allowed.includes(parsed.host)) return undefined;\n return parsed.toString();\n}\n\n/**\n * In-memory pending-flow store for tests and single-instance dev.\n *\n * Production deployments MUST implement `PendingWebFlowStore` against a\n * shared store (Postgres `DELETE … RETURNING`, Redis `GETDEL`) so\n * `/start` and `/callback` can hit different processes.\n */\nexport class InMemoryPendingFlowStore implements PendingWebFlowStore {\n private readonly flows = new Map<string, PendingWebFlow>();\n\n async put(flow: PendingWebFlow): Promise<void> {\n if (this.flows.has(flow.state)) {\n throw new Error(`Pending flow already exists for state ${flow.state}`);\n }\n this.flows.set(flow.state, flow);\n }\n\n async consume(state: string): Promise<PendingWebFlow | null> {\n const flow = this.flows.get(state);\n if (!flow) return null;\n this.flows.delete(state);\n if (flow.expiresAt.getTime() < Date.now()) return null;\n return flow;\n }\n\n async cleanupExpired(): Promise<number> {\n const now = Date.now();\n let removed = 0;\n for (const [state, flow] of this.flows) {\n if (flow.expiresAt.getTime() < now) {\n this.flows.delete(state);\n removed++;\n }\n }\n return removed;\n }\n}\n\n// ============================================================\n// Internals\n// ============================================================\n\n/**\n * The MCP SDK reports a 404 PRM lookup with this exact message; treat it\n * as \"PRM is genuinely absent\" and fall back. Anything else is a\n * connection, parse, or 5xx error and is allowed to bubble.\n *\n * Source (verified against `@modelcontextprotocol/sdk@1.29.0`):\n * `dist/esm/client/auth.js` → `discoverOAuthProtectedResourceMetadata`\n * throws `new Error(`Resource server does not implement OAuth 2.0 Protected Resource Metadata.`)`\n * when `response.status === 404` (or no response was returned).\n *\n * If a future MCP SDK reword this message, the test\n * \"falls back to server-derived resource on a 404 PRM\" at\n * `test/lib/oauth-web-flow.test.js` will fail — that test calls the real\n * SDK against a 404 fixture and is the canary for this regression.\n */\nconst PRM_ABSENT_MARKER = 'does not implement OAuth 2.0 Protected Resource Metadata';\n\nasync function tryDiscoverPRM(\n agentUrl: string,\n fetchFn: typeof fetch | undefined\n): Promise<OAuthProtectedResourceMetadata | undefined> {\n try {\n return await discoverOAuthProtectedResourceMetadata(agentUrl, undefined, fetchFn);\n } catch (err) {\n if (err instanceof Error && err.message.includes(PRM_ABSENT_MARKER)) {\n // PRM is optional under RFC 9728 — fall back to local resource\n // derivation. Connection/parse/5xx errors fall through.\n return undefined;\n }\n const message = err instanceof Error ? err.message : String(err);\n throw new ProtectedResourceMetadataError(`PRM discovery failed: ${message}`);\n }\n}\n\nfunction assertPrmResourceMatchesAgentOrigin(agentUrl: string, prmResource: string): void {\n const requested = resourceUrlFromServerUrl(new URL(agentUrl));\n if (!checkResourceAllowed({ requestedResource: requested, configuredResource: prmResource })) {\n throw new ProtectedResourceMetadataError(\n `PRM advertises resource ${prmResource} which does not share an origin/path with agent ${agentUrl}`\n );\n }\n}\n\nfunction resolveAuthorizationServerUrl(agentUrl: string, prm: OAuthProtectedResourceMetadata | undefined): URL {\n const first = prm?.authorization_servers?.[0];\n if (first) {\n return new URL(first);\n }\n return new URL(new URL(agentUrl).origin);\n}\n\nasync function resolveClientInformation(args: {\n agent: AgentConfig;\n agentStorage?: OAuthConfigStorage;\n asUrl: URL;\n asMetadata: AuthorizationServerMetadata;\n clientMetadata: OAuthClientMetadata;\n fetchFn?: typeof fetch;\n allowConfidentialClient: boolean;\n}): Promise<OAuthClientInformation> {\n const { agent, agentStorage, asUrl, asMetadata, clientMetadata, fetchFn, allowConfidentialClient } = args;\n\n if (agent.oauth_client) {\n return toMCPClientInfo(agent.oauth_client);\n }\n\n if (!asMetadata.registration_endpoint) {\n throw new OAuthError(\n 'Agent has no oauth_client and authorization server does not advertise dynamic client registration',\n 'no_client_credentials',\n agent.id\n );\n }\n\n const registered: OAuthClientInformationFull = await registerClient(asUrl.toString(), {\n metadata: asMetadata,\n clientMetadata,\n fetchFn,\n });\n\n if (registered.client_secret && !allowConfidentialClient) {\n throw new ConfidentialClientNotAllowedError(agent.id);\n }\n\n if (agentStorage) {\n // Load fresh and save fresh so two concurrent /start calls for the\n // same agentId do not trample each other's `oauth_client` via a\n // shared in-memory reference.\n const fresh = (await agentStorage.loadAgent(agent.id)) ?? agent;\n fresh.oauth_client = fromMCPClientInfo(registered);\n await agentStorage.saveAgent(fresh);\n }\n\n return registered;\n}\n\nfunction defaultGenerateState(): string {\n return randomBytes(32).toString('base64url');\n}\n\n/**\n * Map an MCP SDK token-exchange failure to {@link TokenExchangeError},\n * redacting bearer/refresh tokens that some authorization servers echo\n * back in error responses for debugging.\n */\nfunction wrapTokenExchangeError(err: unknown): TokenExchangeError {\n // The MCP SDK's `parseErrorResponse` decodes a well-formed OAuth error\n // envelope into an `OAuthError` subclass with `errorCode` (e.g.\n // `InvalidGrantError`). Malformed responses come through as\n // `ServerError` with the raw body in `message`, so the redaction pass\n // covers both cases.\n const oauthErrorCode = (err as { errorCode?: string })?.errorCode;\n const message = err instanceof Error ? err.message : String(err);\n const status = (err as { status?: number })?.status ?? 0;\n const rawBody = (err as { body?: string })?.body ?? message;\n const body = redactTokens(rawBody);\n const display = oauthErrorCode ? `${oauthErrorCode}: ${message}` : message;\n return new TokenExchangeError(`Token exchange failed: ${redactTokens(display)}`, status, body, oauthErrorCode);\n}\n\nconst SENSITIVE_TOKEN_KEYS = ['access_token', 'refresh_token', 'id_token', 'token'];\n\n/**\n * Best-effort redaction of bearer/refresh tokens from an AS error body\n * (which may be JSON, form-encoded, or freeform). Adopters MUST still\n * treat `TokenExchangeError.body` as sensitive — do not reflect it to\n * the browser or write it to access logs unredacted.\n */\nfunction redactTokens(input: string): string {\n let out = input;\n for (const key of SENSITIVE_TOKEN_KEYS) {\n // JSON form: \"key\":\"…\"\n out = out.replace(new RegExp(`(\"${key}\"\\\\s*:\\\\s*\")[^\"]*(\")`, 'gi'), '$1<redacted>$2');\n // form-encoded: key=…\n out = out.replace(new RegExp(`(\\\\b${key}=)[^&\\\\s]+`, 'gi'), '$1<redacted>');\n }\n return out;\n}\n"],"mappings":"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","names":[]}
@@ -1,6 +1,6 @@
1
1
  import type { Client as MCPClient } from '@modelcontextprotocol/sdk/client/index.js';
2
2
  import type { AgentConfig } from '../types/index.mjs';
3
- import type { MCPWebhookPayload, GetBrandIdentityRequest, GetBrandIdentityResponse, ContextMatchRequest, ContextMatchResponse, IdentityMatchRequest, IdentityMatchResponse } from '../types/core.generated.mjs';
3
+ import type { MCPWebhookPayload, GetBrandIdentityRequest, GetBrandIdentityResponse, ContextMatchRequest, ContextMatchResponse, IdentityMatchRequest, IdentityMatchResponseRouterPublisher } from '../types/core.generated.mjs';
4
4
  import type { Task as A2ATask, TaskStatusUpdateEvent } from '@a2a-js/sdk';
5
5
  import { type CanonicalReadTaskOptions, type CreativeDeliveryTaskOptions, type SingleAgentClientConfig, type SyncCreativesTaskOptions, type VerifyAndParseWebhookOptions, type WebhookParseResult } from './SingleAgentClient.mjs';
6
6
  import type { InputHandler, TaskOptions, TaskResult, TaskInfo, Message } from './ConversationTypes.mjs';
@@ -68,7 +68,7 @@ export type TaskResponseTypeMap = {
68
68
  report_plan_outcome: ReportPlanOutcomeResponse;
69
69
  get_plan_audit_logs: GetPlanAuditLogsResponse;
70
70
  context_match: ContextMatchResponse;
71
- identity_match: IdentityMatchResponse;
71
+ identity_match: IdentityMatchResponseRouterPublisher;
72
72
  };
73
73
  /**
74
74
  * Valid ADCP task names