@adcp/sdk 12.0.6 → 12.1.1

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 (1452) hide show
  1. package/ADCP_VERSION +1 -1
  2. package/compliance/cache/{3.1.2.previous → 3.1.5}/domains/creative/scenarios/canonical_supported_formats.yaml +4 -8
  3. package/compliance/cache/{3.1.2.previous/protocols → 3.1.5/domains}/creative/scenarios/evaluator_auth.yaml +22 -4
  4. package/compliance/cache/{3.1.2/protocols → 3.1.5/domains}/media-buy/scenarios/available_actions.yaml +8 -2
  5. package/compliance/cache/{3.1.2/protocols → 3.1.5/domains}/media-buy/scenarios/inventory_list_no_match.yaml +1 -1
  6. package/compliance/cache/{3.1.2 → 3.1.5}/domains/media-buy/scenarios/inventory_list_targeting.yaml +1 -1
  7. package/compliance/cache/{3.1.2 → 3.1.5}/index.json +3 -3
  8. package/compliance/cache/{3.1.2/domains → 3.1.5/protocols}/creative/scenarios/canonical_supported_formats.yaml +4 -8
  9. package/compliance/cache/{3.1.2/domains → 3.1.5/protocols}/creative/scenarios/evaluator_auth.yaml +22 -4
  10. package/compliance/cache/{3.1.2.previous → 3.1.5}/protocols/media-buy/scenarios/available_actions.yaml +8 -2
  11. package/compliance/cache/{3.1.2.previous/domains → 3.1.5/protocols}/media-buy/scenarios/inventory_list_no_match.yaml +1 -1
  12. package/compliance/cache/{3.1.2 → 3.1.5}/protocols/media-buy/scenarios/inventory_list_targeting.yaml +1 -1
  13. package/compliance/cache/{3.1.2.previous → 3.1.5}/test-kits/parallel-dispatch-runner.yaml +1 -1
  14. package/compliance/cache/{3.1.2.previous → 3.1.5}/test-kits/rate-limit-trip-runner.yaml +6 -5
  15. package/compliance/cache/{3.1.2.previous → 3.1.5}/universal/idempotency.yaml +5 -5
  16. package/compliance/cache/{3.1.2.previous → 3.1.5}/universal/runner-output-contract.yaml +58 -0
  17. package/compliance/cache/{3.1.2 → 3.1.5}/universal/storyboard-schema.yaml +9 -2
  18. package/compliance/cache/{3.1.2/protocols → 3.1.5.previous/domains}/creative/scenarios/canonical_supported_formats.yaml +4 -8
  19. package/compliance/cache/{3.1.2/protocols → 3.1.5.previous/domains}/creative/scenarios/evaluator_auth.yaml +22 -4
  20. package/compliance/cache/{3.1.2 → 3.1.5.previous}/domains/media-buy/scenarios/available_actions.yaml +8 -2
  21. package/compliance/cache/{3.1.2.previous/protocols → 3.1.5.previous/domains}/media-buy/scenarios/inventory_list_no_match.yaml +1 -1
  22. package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/domains/media-buy/scenarios/inventory_list_targeting.yaml +1 -1
  23. package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/index.json +3 -3
  24. package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/protocols/creative/scenarios/canonical_supported_formats.yaml +4 -8
  25. package/compliance/cache/{3.1.2.previous/domains → 3.1.5.previous/protocols}/creative/scenarios/evaluator_auth.yaml +22 -4
  26. package/compliance/cache/{3.1.2.previous/domains → 3.1.5.previous/protocols}/media-buy/scenarios/available_actions.yaml +8 -2
  27. package/compliance/cache/{3.1.2/domains → 3.1.5.previous/protocols}/media-buy/scenarios/inventory_list_no_match.yaml +1 -1
  28. package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/protocols/media-buy/scenarios/inventory_list_targeting.yaml +1 -1
  29. package/compliance/cache/{3.1.2 → 3.1.5.previous}/test-kits/parallel-dispatch-runner.yaml +1 -1
  30. package/compliance/cache/{3.1.2 → 3.1.5.previous}/test-kits/rate-limit-trip-runner.yaml +6 -5
  31. package/compliance/cache/{3.1.2 → 3.1.5.previous}/universal/idempotency.yaml +5 -5
  32. package/compliance/cache/{3.1.2 → 3.1.5.previous}/universal/runner-output-contract.yaml +58 -0
  33. package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/universal/storyboard-schema.yaml +9 -2
  34. package/dist/lib/auth/oauth/authorization-required.d.mts +3 -0
  35. package/dist/lib/auth/oauth/authorization-required.d.ts +3 -0
  36. package/dist/lib/auth/oauth/authorization-required.d.ts.map +1 -1
  37. package/dist/lib/auth/oauth/authorization-required.js +12 -9
  38. package/dist/lib/auth/oauth/authorization-required.js.map +1 -1
  39. package/dist/lib/auth/oauth/authorization-required.mjs +12 -9
  40. package/dist/lib/auth/oauth/authorization-required.mjs.map +1 -1
  41. package/dist/lib/core/AgentClient.d.ts.map +1 -1
  42. package/dist/lib/core/SingleAgentClient.d.mts +2 -2
  43. package/dist/lib/core/SingleAgentClient.d.ts +2 -2
  44. package/dist/lib/core/SingleAgentClient.d.ts.map +1 -1
  45. package/dist/lib/core/SingleAgentClient.js +145 -55
  46. package/dist/lib/core/SingleAgentClient.js.map +1 -1
  47. package/dist/lib/core/SingleAgentClient.mjs +145 -55
  48. package/dist/lib/core/SingleAgentClient.mjs.map +1 -1
  49. package/dist/lib/core/TaskExecutor.js +1 -1
  50. package/dist/lib/core/TaskExecutor.js.map +1 -1
  51. package/dist/lib/core/TaskExecutor.mjs +1 -1
  52. package/dist/lib/core/TaskExecutor.mjs.map +1 -1
  53. package/dist/lib/net/ssrf-fetch.d.mts +13 -1
  54. package/dist/lib/net/ssrf-fetch.d.ts +13 -1
  55. package/dist/lib/net/ssrf-fetch.d.ts.map +1 -1
  56. package/dist/lib/net/ssrf-fetch.js +14 -7
  57. package/dist/lib/net/ssrf-fetch.js.map +1 -1
  58. package/dist/lib/net/ssrf-fetch.mjs +14 -7
  59. package/dist/lib/net/ssrf-fetch.mjs.map +1 -1
  60. package/dist/lib/protocols/a2a.d.mts +2 -2
  61. package/dist/lib/protocols/a2a.d.ts +2 -2
  62. package/dist/lib/protocols/a2a.d.ts.map +1 -1
  63. package/dist/lib/protocols/a2a.js +14 -9
  64. package/dist/lib/protocols/a2a.js.map +1 -1
  65. package/dist/lib/protocols/a2a.mjs +14 -9
  66. package/dist/lib/protocols/a2a.mjs.map +1 -1
  67. package/dist/lib/protocols/index.d.mts +20 -3
  68. package/dist/lib/protocols/index.d.ts +20 -3
  69. package/dist/lib/protocols/index.d.ts.map +1 -1
  70. package/dist/lib/protocols/index.js +40 -18
  71. package/dist/lib/protocols/index.js.map +1 -1
  72. package/dist/lib/protocols/index.mjs +40 -18
  73. package/dist/lib/protocols/index.mjs.map +1 -1
  74. package/dist/lib/protocols/mcp-tasks.d.mts +3 -0
  75. package/dist/lib/protocols/mcp-tasks.d.ts +3 -0
  76. package/dist/lib/protocols/mcp-tasks.d.ts.map +1 -1
  77. package/dist/lib/protocols/mcp-tasks.js +21 -11
  78. package/dist/lib/protocols/mcp-tasks.js.map +1 -1
  79. package/dist/lib/protocols/mcp-tasks.mjs +21 -11
  80. package/dist/lib/protocols/mcp-tasks.mjs.map +1 -1
  81. package/dist/lib/schemas-data/3.1/a2ui/bound-value.json +1 -1
  82. package/dist/lib/schemas-data/3.1/a2ui/component.json +1 -1
  83. package/dist/lib/schemas-data/3.1/a2ui/si-catalog.json +25 -25
  84. package/dist/lib/schemas-data/3.1/a2ui/surface.json +2 -2
  85. package/dist/lib/schemas-data/3.1/a2ui/user-action.json +1 -1
  86. package/dist/lib/schemas-data/3.1/aao/agent-publishers.json +1 -1
  87. package/dist/lib/schemas-data/3.1/account/get-account-financials-request.json +6 -6
  88. package/dist/lib/schemas-data/3.1/account/get-account-financials-response.json +12 -12
  89. package/dist/lib/schemas-data/3.1/account/list-accounts-request.json +6 -6
  90. package/dist/lib/schemas-data/3.1/account/list-accounts-response.json +8 -8
  91. package/dist/lib/schemas-data/3.1/account/report-usage-request.json +6 -6
  92. package/dist/lib/schemas-data/3.1/account/report-usage-response.json +6 -6
  93. package/dist/lib/schemas-data/3.1/account/sync-accounts-request.json +12 -12
  94. package/dist/lib/schemas-data/3.1/account/sync-accounts-response.json +16 -16
  95. package/dist/lib/schemas-data/3.1/account/sync-governance-request.json +6 -6
  96. package/dist/lib/schemas-data/3.1/account/sync-governance-response.json +10 -10
  97. package/dist/lib/schemas-data/3.1/adagents.json +29 -29
  98. package/dist/lib/schemas-data/3.1/brand/acquire-rights-request.json +10 -10
  99. package/dist/lib/schemas-data/3.1/brand/acquire-rights-response.json +16 -16
  100. package/dist/lib/schemas-data/3.1/brand/creative-approval-request.json +5 -5
  101. package/dist/lib/schemas-data/3.1/brand/creative-approval-response.json +12 -12
  102. package/dist/lib/schemas-data/3.1/brand/get-brand-identity-request.json +4 -4
  103. package/dist/lib/schemas-data/3.1/brand/get-brand-identity-response.json +10 -10
  104. package/dist/lib/schemas-data/3.1/brand/get-rights-request.json +8 -8
  105. package/dist/lib/schemas-data/3.1/brand/get-rights-response.json +11 -11
  106. package/dist/lib/schemas-data/3.1/brand/revocation-notification.json +4 -4
  107. package/dist/lib/schemas-data/3.1/brand/rights-pricing-option.json +5 -5
  108. package/dist/lib/schemas-data/3.1/brand/rights-terms.json +3 -3
  109. package/dist/lib/schemas-data/3.1/brand/search-brands-request.json +6 -6
  110. package/dist/lib/schemas-data/3.1/brand/search-brands-response.json +11 -11
  111. package/dist/lib/schemas-data/3.1/brand/update-rights-request.json +6 -6
  112. package/dist/lib/schemas-data/3.1/brand/update-rights-response.json +11 -11
  113. package/dist/lib/schemas-data/3.1/brand/verification-status.json +1 -1
  114. package/dist/lib/schemas-data/3.1/brand/verify-brand-claim-request.json +2 -2
  115. package/dist/lib/schemas-data/3.1/brand/verify-brand-claim-response.json +13 -13
  116. package/dist/lib/schemas-data/3.1/brand/verify-brand-claims-request.json +2 -2
  117. package/dist/lib/schemas-data/3.1/brand/verify-brand-claims-response.json +13 -13
  118. package/dist/lib/schemas-data/3.1/brand.json +21 -21
  119. package/dist/lib/schemas-data/3.1/bundled/content-standards/calibrate-content-request.json +12 -12
  120. package/dist/lib/schemas-data/3.1/bundled/content-standards/calibrate-content-response.json +12 -12
  121. package/dist/lib/schemas-data/3.1/bundled/content-standards/create-content-standards-request.json +16 -16
  122. package/dist/lib/schemas-data/3.1/bundled/content-standards/create-content-standards-response.json +10 -10
  123. package/dist/lib/schemas-data/3.1/bundled/content-standards/get-content-standards-request.json +5 -5
  124. package/dist/lib/schemas-data/3.1/bundled/content-standards/get-content-standards-response.json +23 -23
  125. package/dist/lib/schemas-data/3.1/bundled/content-standards/get-media-buy-artifacts-request.json +16 -16
  126. package/dist/lib/schemas-data/3.1/bundled/content-standards/get-media-buy-artifacts-response.json +18 -18
  127. package/dist/lib/schemas-data/3.1/bundled/content-standards/list-content-standards-request.json +7 -7
  128. package/dist/lib/schemas-data/3.1/bundled/content-standards/list-content-standards-response.json +24 -24
  129. package/dist/lib/schemas-data/3.1/bundled/content-standards/update-content-standards-request.json +16 -16
  130. package/dist/lib/schemas-data/3.1/bundled/content-standards/update-content-standards-response.json +10 -10
  131. package/dist/lib/schemas-data/3.1/bundled/content-standards/validate-content-delivery-request.json +12 -12
  132. package/dist/lib/schemas-data/3.1/bundled/content-standards/validate-content-delivery-response.json +12 -12
  133. package/dist/lib/schemas-data/3.1/bundled/core/tasks-get-request.json +16 -16
  134. package/dist/lib/schemas-data/3.1/bundled/core/tasks-get-response.json +257 -181
  135. package/dist/lib/schemas-data/3.1/bundled/core/tasks-list-request.json +21 -21
  136. package/dist/lib/schemas-data/3.1/bundled/core/tasks-list-response.json +11 -11
  137. package/dist/lib/schemas-data/3.1/bundled/creative/get-creative-delivery-request.json +17 -17
  138. package/dist/lib/schemas-data/3.1/bundled/creative/get-creative-delivery-response.json +56 -56
  139. package/dist/lib/schemas-data/3.1/bundled/creative/get-creative-features-request.json +44 -44
  140. package/dist/lib/schemas-data/3.1/bundled/creative/get-creative-features-response.json +13 -13
  141. package/dist/lib/schemas-data/3.1/bundled/creative/list-creative-formats-request.json +16 -16
  142. package/dist/lib/schemas-data/3.1/bundled/creative/list-creative-formats-response.json +48 -48
  143. package/dist/lib/schemas-data/3.1/bundled/creative/list-creatives-request.json +17 -17
  144. package/dist/lib/schemas-data/3.1/bundled/creative/list-creatives-response.json +56 -56
  145. package/dist/lib/schemas-data/3.1/bundled/creative/list-transformers-request.json +18 -18
  146. package/dist/lib/schemas-data/3.1/bundled/creative/list-transformers-response.json +16 -16
  147. package/dist/lib/schemas-data/3.1/bundled/creative/preview-creative-request.json +44 -44
  148. package/dist/lib/schemas-data/3.1/bundled/creative/preview-creative-response.json +50 -50
  149. package/dist/lib/schemas-data/3.1/bundled/creative/sync-creatives-request.json +47 -47
  150. package/dist/lib/schemas-data/3.1/bundled/creative/sync-creatives-response.json +27 -27
  151. package/dist/lib/schemas-data/3.1/bundled/creative/validate-input-request.json +44 -44
  152. package/dist/lib/schemas-data/3.1/bundled/creative/validate-input-response.json +12 -12
  153. package/dist/lib/schemas-data/3.1/bundled/media-buy/build-creative-request.json +53 -53
  154. package/dist/lib/schemas-data/3.1/bundled/media-buy/build-creative-response.json +54 -54
  155. package/dist/lib/schemas-data/3.1/bundled/media-buy/create-media-buy-request.json +83 -83
  156. package/dist/lib/schemas-data/3.1/bundled/media-buy/create-media-buy-response.json +77 -77
  157. package/dist/lib/schemas-data/3.1/bundled/media-buy/get-media-buy-delivery-request.json +25 -25
  158. package/dist/lib/schemas-data/3.1/bundled/media-buy/get-media-buy-delivery-response.json +40 -40
  159. package/dist/lib/schemas-data/3.1/bundled/media-buy/get-media-buys-request.json +18 -18
  160. package/dist/lib/schemas-data/3.1/bundled/media-buy/get-media-buys-response.json +65 -65
  161. package/dist/lib/schemas-data/3.1/bundled/media-buy/get-products-request.json +49 -49
  162. package/dist/lib/schemas-data/3.1/bundled/media-buy/get-products-response.json +137 -99
  163. package/dist/lib/schemas-data/3.1/bundled/media-buy/list-creative-formats-request.json +12 -12
  164. package/dist/lib/schemas-data/3.1/bundled/media-buy/list-creative-formats-response.json +48 -48
  165. package/dist/lib/schemas-data/3.1/bundled/media-buy/log-event-request.json +12 -12
  166. package/dist/lib/schemas-data/3.1/bundled/media-buy/log-event-response.json +10 -10
  167. package/dist/lib/schemas-data/3.1/bundled/media-buy/package-request.json +79 -79
  168. package/dist/lib/schemas-data/3.1/bundled/media-buy/provide-performance-feedback-request.json +8 -8
  169. package/dist/lib/schemas-data/3.1/bundled/media-buy/provide-performance-feedback-response.json +10 -10
  170. package/dist/lib/schemas-data/3.1/bundled/media-buy/sync-audiences-request.json +18 -18
  171. package/dist/lib/schemas-data/3.1/bundled/media-buy/sync-audiences-response.json +12 -12
  172. package/dist/lib/schemas-data/3.1/bundled/media-buy/sync-catalogs-request.json +26 -26
  173. package/dist/lib/schemas-data/3.1/bundled/media-buy/sync-catalogs-response.json +12 -12
  174. package/dist/lib/schemas-data/3.1/bundled/media-buy/sync-event-sources-request.json +19 -19
  175. package/dist/lib/schemas-data/3.1/bundled/media-buy/sync-event-sources-response.json +16 -16
  176. package/dist/lib/schemas-data/3.1/bundled/media-buy/update-media-buy-request.json +79 -79
  177. package/dist/lib/schemas-data/3.1/bundled/media-buy/update-media-buy-response.json +71 -71
  178. package/dist/lib/schemas-data/3.1/bundled/property/create-property-list-request.json +18 -18
  179. package/dist/lib/schemas-data/3.1/bundled/property/create-property-list-response.json +26 -26
  180. package/dist/lib/schemas-data/3.1/bundled/property/delete-property-list-request.json +16 -16
  181. package/dist/lib/schemas-data/3.1/bundled/property/delete-property-list-response.json +10 -10
  182. package/dist/lib/schemas-data/3.1/bundled/property/get-property-list-request.json +16 -16
  183. package/dist/lib/schemas-data/3.1/bundled/property/get-property-list-response.json +27 -27
  184. package/dist/lib/schemas-data/3.1/bundled/property/list-property-lists-request.json +17 -17
  185. package/dist/lib/schemas-data/3.1/bundled/property/list-property-lists-response.json +27 -27
  186. package/dist/lib/schemas-data/3.1/bundled/property/update-property-list-request.json +18 -18
  187. package/dist/lib/schemas-data/3.1/bundled/property/update-property-list-response.json +26 -26
  188. package/dist/lib/schemas-data/3.1/bundled/property/validate-property-delivery-request.json +19 -19
  189. package/dist/lib/schemas-data/3.1/bundled/property/validate-property-delivery-response.json +15 -15
  190. package/dist/lib/schemas-data/3.1/bundled/protocol/get-adcp-capabilities-request.json +5 -5
  191. package/dist/lib/schemas-data/3.1/bundled/protocol/get-adcp-capabilities-response.json +36 -36
  192. package/dist/lib/schemas-data/3.1/bundled/protocol/get-task-status-request.json +16 -16
  193. package/dist/lib/schemas-data/3.1/bundled/protocol/get-task-status-response.json +257 -181
  194. package/dist/lib/schemas-data/3.1/bundled/protocol/list-tasks-request.json +21 -21
  195. package/dist/lib/schemas-data/3.1/bundled/protocol/list-tasks-response.json +11 -11
  196. package/dist/lib/schemas-data/3.1/bundled/signals/activate-signal-request.json +17 -17
  197. package/dist/lib/schemas-data/3.1/bundled/signals/activate-signal-response.json +12 -12
  198. package/dist/lib/schemas-data/3.1/bundled/signals/get-signals-request.json +24 -24
  199. package/dist/lib/schemas-data/3.1/bundled/signals/get-signals-response.json +53 -53
  200. package/dist/lib/schemas-data/3.1/bundled/sponsored-intelligence/si-get-offering-request.json +5 -5
  201. package/dist/lib/schemas-data/3.1/bundled/sponsored-intelligence/si-get-offering-response.json +23 -23
  202. package/dist/lib/schemas-data/3.1/bundled/sponsored-intelligence/si-initiate-session-request.json +18 -18
  203. package/dist/lib/schemas-data/3.1/bundled/sponsored-intelligence/si-initiate-session-response.json +25 -25
  204. package/dist/lib/schemas-data/3.1/bundled/sponsored-intelligence/si-send-message-request.json +16 -16
  205. package/dist/lib/schemas-data/3.1/bundled/sponsored-intelligence/si-send-message-response.json +26 -26
  206. package/dist/lib/schemas-data/3.1/bundled/sponsored-intelligence/si-terminate-session-request.json +5 -5
  207. package/dist/lib/schemas-data/3.1/bundled/sponsored-intelligence/si-terminate-session-response.json +11 -11
  208. package/dist/lib/schemas-data/3.1/collection/base-collection-source.json +3 -3
  209. package/dist/lib/schemas-data/3.1/collection/collection-list-changed-webhook.json +2 -2
  210. package/dist/lib/schemas-data/3.1/collection/collection-list-filters.json +7 -7
  211. package/dist/lib/schemas-data/3.1/collection/collection-list.json +5 -5
  212. package/dist/lib/schemas-data/3.1/collection/create-collection-list-request.json +8 -8
  213. package/dist/lib/schemas-data/3.1/collection/create-collection-list-response.json +6 -6
  214. package/dist/lib/schemas-data/3.1/collection/delete-collection-list-request.json +5 -5
  215. package/dist/lib/schemas-data/3.1/collection/delete-collection-list-response.json +5 -5
  216. package/dist/lib/schemas-data/3.1/collection/get-collection-list-request.json +5 -5
  217. package/dist/lib/schemas-data/3.1/collection/get-collection-list-response.json +12 -12
  218. package/dist/lib/schemas-data/3.1/collection/list-collection-lists-request.json +6 -6
  219. package/dist/lib/schemas-data/3.1/collection/list-collection-lists-response.json +7 -7
  220. package/dist/lib/schemas-data/3.1/collection/update-collection-list-request.json +8 -8
  221. package/dist/lib/schemas-data/3.1/collection/update-collection-list-response.json +6 -6
  222. package/dist/lib/schemas-data/3.1/content-standards/artifact-webhook-payload.json +3 -3
  223. package/dist/lib/schemas-data/3.1/content-standards/artifact.json +7 -7
  224. package/dist/lib/schemas-data/3.1/content-standards/calibrate-content-request.json +5 -5
  225. package/dist/lib/schemas-data/3.1/content-standards/calibrate-content-response.json +10 -10
  226. package/dist/lib/schemas-data/3.1/content-standards/content-standards.json +7 -7
  227. package/dist/lib/schemas-data/3.1/content-standards/create-content-standards-request.json +8 -8
  228. package/dist/lib/schemas-data/3.1/content-standards/create-content-standards-response.json +8 -8
  229. package/dist/lib/schemas-data/3.1/content-standards/get-content-standards-request.json +4 -4
  230. package/dist/lib/schemas-data/3.1/content-standards/get-content-standards-response.json +9 -9
  231. package/dist/lib/schemas-data/3.1/content-standards/get-media-buy-artifacts-request.json +5 -5
  232. package/dist/lib/schemas-data/3.1/content-standards/get-media-buy-artifacts-response.json +10 -10
  233. package/dist/lib/schemas-data/3.1/content-standards/list-content-standards-request.json +6 -6
  234. package/dist/lib/schemas-data/3.1/content-standards/list-content-standards-response.json +10 -10
  235. package/dist/lib/schemas-data/3.1/content-standards/update-content-standards-request.json +8 -8
  236. package/dist/lib/schemas-data/3.1/content-standards/update-content-standards-response.json +8 -8
  237. package/dist/lib/schemas-data/3.1/content-standards/validate-content-delivery-request.json +5 -5
  238. package/dist/lib/schemas-data/3.1/content-standards/validate-content-delivery-response.json +10 -10
  239. package/dist/lib/schemas-data/3.1/core/account-authorization.json +1 -1
  240. package/dist/lib/schemas-data/3.1/core/account-ref.json +2 -2
  241. package/dist/lib/schemas-data/3.1/core/account-with-authorization.json +3 -3
  242. package/dist/lib/schemas-data/3.1/core/account.json +10 -10
  243. package/dist/lib/schemas-data/3.1/core/activation-key.json +1 -1
  244. package/dist/lib/schemas-data/3.1/core/ad-inventory-config.json +1 -1
  245. package/dist/lib/schemas-data/3.1/core/agent-encryption-key.json +1 -1
  246. package/dist/lib/schemas-data/3.1/core/agent-signing-key.json +1 -1
  247. package/dist/lib/schemas-data/3.1/core/app-item.json +4 -4
  248. package/dist/lib/schemas-data/3.1/core/asset-group-vocabulary.json +1 -1
  249. package/dist/lib/schemas-data/3.1/core/assets/asset-union.json +21 -21
  250. package/dist/lib/schemas-data/3.1/core/assets/audio-asset.json +3 -3
  251. package/dist/lib/schemas-data/3.1/core/assets/brief-asset.json +2 -2
  252. package/dist/lib/schemas-data/3.1/core/assets/card-asset.json +6 -6
  253. package/dist/lib/schemas-data/3.1/core/assets/catalog-asset.json +2 -2
  254. package/dist/lib/schemas-data/3.1/core/assets/css-asset.json +2 -2
  255. package/dist/lib/schemas-data/3.1/core/assets/daast-asset.json +4 -4
  256. package/dist/lib/schemas-data/3.1/core/assets/daast-tracker-asset.json +3 -3
  257. package/dist/lib/schemas-data/3.1/core/assets/html-asset.json +2 -2
  258. package/dist/lib/schemas-data/3.1/core/assets/image-asset.json +2 -2
  259. package/dist/lib/schemas-data/3.1/core/assets/javascript-asset.json +3 -3
  260. package/dist/lib/schemas-data/3.1/core/assets/markdown-asset.json +2 -2
  261. package/dist/lib/schemas-data/3.1/core/assets/pixel-tracker-asset.json +2 -2
  262. package/dist/lib/schemas-data/3.1/core/assets/published-post-asset.json +2 -2
  263. package/dist/lib/schemas-data/3.1/core/assets/text-asset.json +2 -2
  264. package/dist/lib/schemas-data/3.1/core/assets/url-asset.json +3 -3
  265. package/dist/lib/schemas-data/3.1/core/assets/vast-asset.json +4 -4
  266. package/dist/lib/schemas-data/3.1/core/assets/vast-tracker-asset.json +3 -3
  267. package/dist/lib/schemas-data/3.1/core/assets/video-asset.json +7 -7
  268. package/dist/lib/schemas-data/3.1/core/assets/webhook-asset.json +7 -7
  269. package/dist/lib/schemas-data/3.1/core/assets/zip-asset.json +2 -2
  270. package/dist/lib/schemas-data/3.1/core/async-response-data.json +29 -29
  271. package/dist/lib/schemas-data/3.1/core/async-response-refs/creative/sync-creatives-async-response-input-required.json +3 -3
  272. package/dist/lib/schemas-data/3.1/core/async-response-refs/creative/sync-creatives-async-response-submitted.json +4 -4
  273. package/dist/lib/schemas-data/3.1/core/async-response-refs/creative/sync-creatives-async-response-working.json +3 -3
  274. package/dist/lib/schemas-data/3.1/core/async-response-refs/media-buy/build-creative-async-response-input-required.json +4 -4
  275. package/dist/lib/schemas-data/3.1/core/async-response-refs/media-buy/build-creative-async-response-submitted.json +4 -4
  276. package/dist/lib/schemas-data/3.1/core/async-response-refs/media-buy/build-creative-async-response-working.json +3 -3
  277. package/dist/lib/schemas-data/3.1/core/async-response-refs/media-buy/create-media-buy-async-response-input-required.json +4 -4
  278. package/dist/lib/schemas-data/3.1/core/async-response-refs/media-buy/create-media-buy-async-response-submitted.json +4 -4
  279. package/dist/lib/schemas-data/3.1/core/async-response-refs/media-buy/create-media-buy-async-response-working.json +3 -3
  280. package/dist/lib/schemas-data/3.1/core/async-response-refs/media-buy/get-products-async-response-input-required.json +4 -4
  281. package/dist/lib/schemas-data/3.1/core/async-response-refs/media-buy/get-products-async-response-submitted.json +4 -4
  282. package/dist/lib/schemas-data/3.1/core/async-response-refs/media-buy/get-products-async-response-working.json +3 -3
  283. package/dist/lib/schemas-data/3.1/core/async-response-refs/media-buy/sync-catalogs-async-response-input-required.json +3 -3
  284. package/dist/lib/schemas-data/3.1/core/async-response-refs/media-buy/sync-catalogs-async-response-submitted.json +4 -4
  285. package/dist/lib/schemas-data/3.1/core/async-response-refs/media-buy/sync-catalogs-async-response-working.json +3 -3
  286. package/dist/lib/schemas-data/3.1/core/async-response-refs/media-buy/update-media-buy-async-response-input-required.json +3 -3
  287. package/dist/lib/schemas-data/3.1/core/async-response-refs/media-buy/update-media-buy-async-response-submitted.json +4 -4
  288. package/dist/lib/schemas-data/3.1/core/async-response-refs/media-buy/update-media-buy-async-response-working.json +3 -3
  289. package/dist/lib/schemas-data/3.1/core/async-response-refs/signals/get-signals-async-response-submitted.json +4 -4
  290. package/dist/lib/schemas-data/3.1/core/async-response-refs/signals/get-signals-async-response-working.json +3 -3
  291. package/dist/lib/schemas-data/3.1/core/attribution-window.json +4 -4
  292. package/dist/lib/schemas-data/3.1/core/audience-member.json +3 -3
  293. package/dist/lib/schemas-data/3.1/core/audience-selector.json +7 -7
  294. package/dist/lib/schemas-data/3.1/core/authorized-agent-base.json +3 -3
  295. package/dist/lib/schemas-data/3.1/core/brand-id.json +1 -1
  296. package/dist/lib/schemas-data/3.1/core/brand-ref.json +3 -3
  297. package/dist/lib/schemas-data/3.1/core/business-entity.json +2 -2
  298. package/dist/lib/schemas-data/3.1/core/cancellation-policy.json +40 -2
  299. package/dist/lib/schemas-data/3.1/core/canonical-format-kind.json +1 -1
  300. package/dist/lib/schemas-data/3.1/core/canonical-projection-ref.json +3 -3
  301. package/dist/lib/schemas-data/3.1/core/canonical-projection-slot-override.json +1 -1
  302. package/dist/lib/schemas-data/3.1/core/catalog-field-mapping.json +2 -2
  303. package/dist/lib/schemas-data/3.1/core/catalog-item-delivery-metrics.json +3 -3
  304. package/dist/lib/schemas-data/3.1/core/catalog.json +7 -7
  305. package/dist/lib/schemas-data/3.1/core/catchment.json +5 -5
  306. package/dist/lib/schemas-data/3.1/core/collection-distribution.json +2 -2
  307. package/dist/lib/schemas-data/3.1/core/collection-list-ref.json +1 -1
  308. package/dist/lib/schemas-data/3.1/core/collection-selector.json +1 -1
  309. package/dist/lib/schemas-data/3.1/core/collection.json +13 -13
  310. package/dist/lib/schemas-data/3.1/core/committed-metric.json +9 -9
  311. package/dist/lib/schemas-data/3.1/core/content-rating.json +2 -2
  312. package/dist/lib/schemas-data/3.1/core/context.json +1 -1
  313. package/dist/lib/schemas-data/3.1/core/creative-asset.json +10 -10
  314. package/dist/lib/schemas-data/3.1/core/creative-assignment.json +2 -2
  315. package/dist/lib/schemas-data/3.1/core/creative-brief.json +4 -4
  316. package/dist/lib/schemas-data/3.1/core/creative-consumption.json +1 -1
  317. package/dist/lib/schemas-data/3.1/core/creative-delivery-metrics.json +2 -2
  318. package/dist/lib/schemas-data/3.1/core/creative-filters.json +5 -5
  319. package/dist/lib/schemas-data/3.1/core/creative-item.json +1 -1
  320. package/dist/lib/schemas-data/3.1/core/creative-manifest.json +11 -11
  321. package/dist/lib/schemas-data/3.1/core/creative-policy.json +3 -3
  322. package/dist/lib/schemas-data/3.1/core/creative-variable.json +1 -1
  323. package/dist/lib/schemas-data/3.1/core/creative-variant.json +5 -5
  324. package/dist/lib/schemas-data/3.1/core/data-provider-signal-selector.json +1 -1
  325. package/dist/lib/schemas-data/3.1/core/date-range.json +1 -1
  326. package/dist/lib/schemas-data/3.1/core/datetime-range.json +1 -1
  327. package/dist/lib/schemas-data/3.1/core/daypart-target.json +2 -2
  328. package/dist/lib/schemas-data/3.1/core/deadline-policy.json +1 -1
  329. package/dist/lib/schemas-data/3.1/core/delivery-forecast.json +7 -7
  330. package/dist/lib/schemas-data/3.1/core/delivery-metric-aggregate.json +9 -9
  331. package/dist/lib/schemas-data/3.1/core/delivery-metrics.json +8 -8
  332. package/dist/lib/schemas-data/3.1/core/deployment.json +3 -3
  333. package/dist/lib/schemas-data/3.1/core/destination-item.json +4 -4
  334. package/dist/lib/schemas-data/3.1/core/destination.json +1 -1
  335. package/dist/lib/schemas-data/3.1/core/diagnostic-issue.json +1 -1
  336. package/dist/lib/schemas-data/3.1/core/downstream-connection-requirement.json +1 -1
  337. package/dist/lib/schemas-data/3.1/core/duration.json +1 -1
  338. package/dist/lib/schemas-data/3.1/core/education-item.json +4 -4
  339. package/dist/lib/schemas-data/3.1/core/error.json +1 -1
  340. package/dist/lib/schemas-data/3.1/core/evaluator-spec.json +5 -5
  341. package/dist/lib/schemas-data/3.1/core/event-custom-data.json +2 -2
  342. package/dist/lib/schemas-data/3.1/core/event-source-health.json +3 -3
  343. package/dist/lib/schemas-data/3.1/core/event-surface.json +2 -2
  344. package/dist/lib/schemas-data/3.1/core/event.json +8 -8
  345. package/dist/lib/schemas-data/3.1/core/ext.json +1 -1
  346. package/dist/lib/schemas-data/3.1/core/feature-requirement.json +1 -1
  347. package/dist/lib/schemas-data/3.1/core/flight-item.json +4 -4
  348. package/dist/lib/schemas-data/3.1/core/forecast-dimension-audience.json +2 -2
  349. package/dist/lib/schemas-data/3.1/core/forecast-dimension-device-platform.json +2 -2
  350. package/dist/lib/schemas-data/3.1/core/forecast-dimension-device-type.json +2 -2
  351. package/dist/lib/schemas-data/3.1/core/forecast-dimension-geo.json +5 -5
  352. package/dist/lib/schemas-data/3.1/core/forecast-dimension-placement.json +2 -2
  353. package/dist/lib/schemas-data/3.1/core/forecast-dimension-signal.json +2 -2
  354. package/dist/lib/schemas-data/3.1/core/forecast-point-dimensions.json +7 -7
  355. package/dist/lib/schemas-data/3.1/core/forecast-point.json +27 -27
  356. package/dist/lib/schemas-data/3.1/core/forecast-range.json +1 -1
  357. package/dist/lib/schemas-data/3.1/core/forecast-vendor-metric-value.json +5 -5
  358. package/dist/lib/schemas-data/3.1/core/format-id.json +1 -1
  359. package/dist/lib/schemas-data/3.1/core/format-option-ref.json +1 -1
  360. package/dist/lib/schemas-data/3.1/core/format-shape-vocabulary.json +1 -1
  361. package/dist/lib/schemas-data/3.1/core/format.json +44 -44
  362. package/dist/lib/schemas-data/3.1/core/frequency-cap.json +4 -4
  363. package/dist/lib/schemas-data/3.1/core/generation-credential.json +3 -3
  364. package/dist/lib/schemas-data/3.1/core/geo-breakdown-support.json +3 -3
  365. package/dist/lib/schemas-data/3.1/core/geo-delivery-metrics.json +6 -6
  366. package/dist/lib/schemas-data/3.1/core/hotel-item.json +4 -4
  367. package/dist/lib/schemas-data/3.1/core/identifier.json +2 -2
  368. package/dist/lib/schemas-data/3.1/core/impairment.json +3 -3
  369. package/dist/lib/schemas-data/3.1/core/industry-identifier.json +2 -2
  370. package/dist/lib/schemas-data/3.1/core/insertion-order.json +1 -1
  371. package/dist/lib/schemas-data/3.1/core/installment-deadlines.json +2 -2
  372. package/dist/lib/schemas-data/3.1/core/installment.json +9 -9
  373. package/dist/lib/schemas-data/3.1/core/job-item.json +3 -3
  374. package/dist/lib/schemas-data/3.1/core/keyword-delivery-metrics.json +3 -3
  375. package/dist/lib/schemas-data/3.1/core/limited-series.json +1 -1
  376. package/dist/lib/schemas-data/3.1/core/material-deadline.json +1 -1
  377. package/dist/lib/schemas-data/3.1/core/mcp-webhook-payload.json +5 -5
  378. package/dist/lib/schemas-data/3.1/core/measurement-readiness.json +5 -5
  379. package/dist/lib/schemas-data/3.1/core/measurement-terms.json +3 -3
  380. package/dist/lib/schemas-data/3.1/core/measurement-window.json +1 -1
  381. package/dist/lib/schemas-data/3.1/core/media-buy-available-action.json +4 -4
  382. package/dist/lib/schemas-data/3.1/core/media-buy-features.json +1 -1
  383. package/dist/lib/schemas-data/3.1/core/media-buy.json +10 -10
  384. package/dist/lib/schemas-data/3.1/core/missing-metric.json +9 -9
  385. package/dist/lib/schemas-data/3.1/core/notification-config.json +4 -4
  386. package/dist/lib/schemas-data/3.1/core/offering-asset-group.json +16 -16
  387. package/dist/lib/schemas-data/3.1/core/offering.json +5 -5
  388. package/dist/lib/schemas-data/3.1/core/optimization-goal.json +7 -7
  389. package/dist/lib/schemas-data/3.1/core/outcome-measurement.json +2 -2
  390. package/dist/lib/schemas-data/3.1/core/overlay.json +1 -1
  391. package/dist/lib/schemas-data/3.1/core/package-signal-targeting-group.json +2 -2
  392. package/dist/lib/schemas-data/3.1/core/package-signal-targeting-groups.json +2 -2
  393. package/dist/lib/schemas-data/3.1/core/package-signal-targeting.json +3 -3
  394. package/dist/lib/schemas-data/3.1/core/package.json +17 -17
  395. package/dist/lib/schemas-data/3.1/core/pagination-request.json +1 -1
  396. package/dist/lib/schemas-data/3.1/core/pagination-response.json +1 -1
  397. package/dist/lib/schemas-data/3.1/core/performance-feedback.json +12 -12
  398. package/dist/lib/schemas-data/3.1/core/performance-standard.json +4 -4
  399. package/dist/lib/schemas-data/3.1/core/placement-definition.json +10 -10
  400. package/dist/lib/schemas-data/3.1/core/placement-ref.json +1 -1
  401. package/dist/lib/schemas-data/3.1/core/placement.json +7 -7
  402. package/dist/lib/schemas-data/3.1/core/planned-delivery.json +5 -5
  403. package/dist/lib/schemas-data/3.1/core/platform-extension-ref.json +1 -1
  404. package/dist/lib/schemas-data/3.1/core/postal-area-support.json +2 -2
  405. package/dist/lib/schemas-data/3.1/core/postal-area.json +4 -4
  406. package/dist/lib/schemas-data/3.1/core/postal-country-system.json +2 -2
  407. package/dist/lib/schemas-data/3.1/core/price.json +1 -1
  408. package/dist/lib/schemas-data/3.1/core/pricing-option.json +10 -10
  409. package/dist/lib/schemas-data/3.1/core/product-allocation.json +4 -4
  410. package/dist/lib/schemas-data/3.1/core/product-allowed-action.json +5 -5
  411. package/dist/lib/schemas-data/3.1/core/product-filters.json +27 -27
  412. package/dist/lib/schemas-data/3.1/core/product-format-declaration.json +16 -16
  413. package/dist/lib/schemas-data/3.1/core/product-signal-targeting-option.json +3 -3
  414. package/dist/lib/schemas-data/3.1/core/product.json +40 -40
  415. package/dist/lib/schemas-data/3.1/core/property-id.json +1 -1
  416. package/dist/lib/schemas-data/3.1/core/property-list-ref.json +1 -1
  417. package/dist/lib/schemas-data/3.1/core/property-tag.json +1 -1
  418. package/dist/lib/schemas-data/3.1/core/property.json +6 -6
  419. package/dist/lib/schemas-data/3.1/core/proposal.json +6 -6
  420. package/dist/lib/schemas-data/3.1/core/protocol-envelope.json +5 -5
  421. package/dist/lib/schemas-data/3.1/core/provenance.json +9 -9
  422. package/dist/lib/schemas-data/3.1/core/publisher-property-selector.json +3 -3
  423. package/dist/lib/schemas-data/3.1/core/push-notification-config.json +2 -2
  424. package/dist/lib/schemas-data/3.1/core/real-estate-item.json +4 -4
  425. package/dist/lib/schemas-data/3.1/core/reference-asset.json +1 -1
  426. package/dist/lib/schemas-data/3.1/core/registry-event.json +13 -13
  427. package/dist/lib/schemas-data/3.1/core/registry-feed-response.json +2 -2
  428. package/dist/lib/schemas-data/3.1/core/reporting-capabilities.json +8 -8
  429. package/dist/lib/schemas-data/3.1/core/reporting-webhook.json +3 -3
  430. package/dist/lib/schemas-data/3.1/core/requirements/asset-requirements.json +13 -13
  431. package/dist/lib/schemas-data/3.1/core/requirements/audio-asset-requirements.json +1 -1
  432. package/dist/lib/schemas-data/3.1/core/requirements/catalog-field-binding.json +4 -4
  433. package/dist/lib/schemas-data/3.1/core/requirements/catalog-requirements.json +5 -5
  434. package/dist/lib/schemas-data/3.1/core/requirements/css-asset-requirements.json +1 -1
  435. package/dist/lib/schemas-data/3.1/core/requirements/daast-asset-requirements.json +1 -1
  436. package/dist/lib/schemas-data/3.1/core/requirements/html-asset-requirements.json +1 -1
  437. package/dist/lib/schemas-data/3.1/core/requirements/image-asset-requirements.json +2 -2
  438. package/dist/lib/schemas-data/3.1/core/requirements/javascript-asset-requirements.json +1 -1
  439. package/dist/lib/schemas-data/3.1/core/requirements/markdown-asset-requirements.json +1 -1
  440. package/dist/lib/schemas-data/3.1/core/requirements/offering-asset-constraint.json +4 -4
  441. package/dist/lib/schemas-data/3.1/core/requirements/text-asset-requirements.json +1 -1
  442. package/dist/lib/schemas-data/3.1/core/requirements/url-asset-requirements.json +1 -1
  443. package/dist/lib/schemas-data/3.1/core/requirements/vast-asset-requirements.json +1 -1
  444. package/dist/lib/schemas-data/3.1/core/requirements/video-asset-requirements.json +6 -6
  445. package/dist/lib/schemas-data/3.1/core/requirements/webhook-asset-requirements.json +1 -1
  446. package/dist/lib/schemas-data/3.1/core/response-payload-jws-envelope.json +1 -1
  447. package/dist/lib/schemas-data/3.1/core/response.json +1 -1
  448. package/dist/lib/schemas-data/3.1/core/rights-constraint.json +4 -4
  449. package/dist/lib/schemas-data/3.1/core/seller-agent-ref.json +1 -1
  450. package/dist/lib/schemas-data/3.1/core/signal-coverage-forecast.json +5 -5
  451. package/dist/lib/schemas-data/3.1/core/signal-definition-enrichment.json +4 -4
  452. package/dist/lib/schemas-data/3.1/core/signal-definition.json +5 -5
  453. package/dist/lib/schemas-data/3.1/core/signal-filters.json +3 -3
  454. package/dist/lib/schemas-data/3.1/core/signal-id.json +1 -1
  455. package/dist/lib/schemas-data/3.1/core/signal-listing.json +4 -4
  456. package/dist/lib/schemas-data/3.1/core/signal-modeling-disclosure.json +1 -1
  457. package/dist/lib/schemas-data/3.1/core/signal-pricing-option.json +2 -2
  458. package/dist/lib/schemas-data/3.1/core/signal-pricing.json +6 -6
  459. package/dist/lib/schemas-data/3.1/core/signal-ref.json +1 -1
  460. package/dist/lib/schemas-data/3.1/core/signal-selection-group-rule.json +1 -1
  461. package/dist/lib/schemas-data/3.1/core/signal-targeting-expression.json +4 -4
  462. package/dist/lib/schemas-data/3.1/core/signal-targeting-rules.json +2 -2
  463. package/dist/lib/schemas-data/3.1/core/signal-targeting.json +7 -7
  464. package/dist/lib/schemas-data/3.1/core/sla-window.json +1 -1
  465. package/dist/lib/schemas-data/3.1/core/special.json +2 -2
  466. package/dist/lib/schemas-data/3.1/core/start-timing.json +1 -1
  467. package/dist/lib/schemas-data/3.1/core/store-item.json +3 -3
  468. package/dist/lib/schemas-data/3.1/core/talent.json +2 -2
  469. package/dist/lib/schemas-data/3.1/core/targeting.json +22 -22
  470. package/dist/lib/schemas-data/3.1/core/tasks-get-request.json +5 -5
  471. package/dist/lib/schemas-data/3.1/core/tasks-get-response.json +10 -10
  472. package/dist/lib/schemas-data/3.1/core/tasks-list-request.json +13 -13
  473. package/dist/lib/schemas-data/3.1/core/tasks-list-response.json +8 -8
  474. package/dist/lib/schemas-data/3.1/core/transformer-param.json +1 -1
  475. package/dist/lib/schemas-data/3.1/core/transformer.json +5 -5
  476. package/dist/lib/schemas-data/3.1/core/truncation-sentinel.json +1 -1
  477. package/dist/lib/schemas-data/3.1/core/user-match.json +3 -3
  478. package/dist/lib/schemas-data/3.1/core/vehicle-item.json +4 -4
  479. package/dist/lib/schemas-data/3.1/core/vendor-metric-id.json +1 -1
  480. package/dist/lib/schemas-data/3.1/core/vendor-metric-optimization-supported-metric.json +3 -3
  481. package/dist/lib/schemas-data/3.1/core/vendor-metric-optimization.json +2 -2
  482. package/dist/lib/schemas-data/3.1/core/vendor-metric-value.json +3 -3
  483. package/dist/lib/schemas-data/3.1/core/vendor-pricing-option.json +3 -3
  484. package/dist/lib/schemas-data/3.1/core/version-envelope.json +1 -1
  485. package/dist/lib/schemas-data/3.1/core/webhook-activity-record.json +3 -3
  486. package/dist/lib/schemas-data/3.1/core/webhook-challenge-response.json +1 -1
  487. package/dist/lib/schemas-data/3.1/core/webhook-challenge.json +2 -2
  488. package/dist/lib/schemas-data/3.1/core/wholesale-feed-event.json +17 -17
  489. package/dist/lib/schemas-data/3.1/core/wholesale-feed-webhook.json +3 -3
  490. package/dist/lib/schemas-data/3.1/core/x-entity-types.json +1 -1
  491. package/dist/lib/schemas-data/3.1/creative/asset-types/index.json +6 -6
  492. package/dist/lib/schemas-data/3.1/creative/audit-observation.json +2 -2
  493. package/dist/lib/schemas-data/3.1/creative/creative-feature-result.json +2 -2
  494. package/dist/lib/schemas-data/3.1/creative/creative-purged-webhook.json +3 -3
  495. package/dist/lib/schemas-data/3.1/creative/creative-status-changed-webhook.json +4 -4
  496. package/dist/lib/schemas-data/3.1/creative/get-creative-delivery-request.json +6 -6
  497. package/dist/lib/schemas-data/3.1/creative/get-creative-delivery-response.json +9 -9
  498. package/dist/lib/schemas-data/3.1/creative/get-creative-features-request.json +6 -6
  499. package/dist/lib/schemas-data/3.1/creative/get-creative-features-response.json +11 -11
  500. package/dist/lib/schemas-data/3.1/creative/list-creative-formats-request.json +13 -13
  501. package/dist/lib/schemas-data/3.1/creative/list-creative-formats-response.json +9 -9
  502. package/dist/lib/schemas-data/3.1/creative/list-creatives-request.json +9 -9
  503. package/dist/lib/schemas-data/3.1/creative/list-creatives-response.json +19 -19
  504. package/dist/lib/schemas-data/3.1/creative/list-transformers-request.json +8 -8
  505. package/dist/lib/schemas-data/3.1/creative/list-transformers-response.json +8 -8
  506. package/dist/lib/schemas-data/3.1/creative/preview-creative-request.json +12 -12
  507. package/dist/lib/schemas-data/3.1/creative/preview-creative-response.json +14 -14
  508. package/dist/lib/schemas-data/3.1/creative/preview-render.json +1 -1
  509. package/dist/lib/schemas-data/3.1/creative/sync-creatives-async-response-input-required.json +3 -3
  510. package/dist/lib/schemas-data/3.1/creative/sync-creatives-async-response-submitted.json +4 -4
  511. package/dist/lib/schemas-data/3.1/creative/sync-creatives-async-response-working.json +3 -3
  512. package/dist/lib/schemas-data/3.1/creative/sync-creatives-request.json +9 -9
  513. package/dist/lib/schemas-data/3.1/creative/sync-creatives-response.json +15 -15
  514. package/dist/lib/schemas-data/3.1/creative/validate-input-request.json +6 -6
  515. package/dist/lib/schemas-data/3.1/creative/validate-input-response.json +5 -5
  516. package/dist/lib/schemas-data/3.1/creative/validate-input-result.json +2 -2
  517. package/dist/lib/schemas-data/3.1/creative/video-brief.json +1 -1
  518. package/dist/lib/schemas-data/3.1/enums/account-scope.json +1 -1
  519. package/dist/lib/schemas-data/3.1/enums/account-status.json +1 -1
  520. package/dist/lib/schemas-data/3.1/enums/action-not-allowed-reason.json +1 -1
  521. package/dist/lib/schemas-data/3.1/enums/action-source.json +1 -1
  522. package/dist/lib/schemas-data/3.1/enums/adcp-protocol.json +1 -1
  523. package/dist/lib/schemas-data/3.1/enums/adjustment-kind.json +1 -1
  524. package/dist/lib/schemas-data/3.1/enums/advertiser-industry.json +1 -1
  525. package/dist/lib/schemas-data/3.1/enums/age-verification-method.json +1 -1
  526. package/dist/lib/schemas-data/3.1/enums/assessment-status.json +1 -1
  527. package/dist/lib/schemas-data/3.1/enums/asset-content-type.json +1 -1
  528. package/dist/lib/schemas-data/3.1/enums/attestation-claim.json +1 -1
  529. package/dist/lib/schemas-data/3.1/enums/attribution-methodology.json +1 -1
  530. package/dist/lib/schemas-data/3.1/enums/attribution-model.json +1 -1
  531. package/dist/lib/schemas-data/3.1/enums/audience-source.json +1 -1
  532. package/dist/lib/schemas-data/3.1/enums/audience-status.json +1 -1
  533. package/dist/lib/schemas-data/3.1/enums/audio-channel-layout.json +1 -1
  534. package/dist/lib/schemas-data/3.1/enums/audio-distribution-type.json +1 -1
  535. package/dist/lib/schemas-data/3.1/enums/auth-scheme.json +1 -1
  536. package/dist/lib/schemas-data/3.1/enums/available-metric.json +1 -1
  537. package/dist/lib/schemas-data/3.1/enums/billing-party.json +1 -1
  538. package/dist/lib/schemas-data/3.1/enums/binary-verdict.json +1 -1
  539. package/dist/lib/schemas-data/3.1/enums/brand-agent-type.json +1 -1
  540. package/dist/lib/schemas-data/3.1/enums/c2pa-watermark-action.json +1 -1
  541. package/dist/lib/schemas-data/3.1/enums/canceled-by.json +1 -1
  542. package/dist/lib/schemas-data/3.1/enums/catalog-action.json +1 -1
  543. package/dist/lib/schemas-data/3.1/enums/catalog-item-status.json +1 -1
  544. package/dist/lib/schemas-data/3.1/enums/catalog-type.json +1 -1
  545. package/dist/lib/schemas-data/3.1/enums/channels.json +1 -1
  546. package/dist/lib/schemas-data/3.1/enums/cloud-storage-protocol.json +1 -1
  547. package/dist/lib/schemas-data/3.1/enums/co-branding-requirement.json +1 -1
  548. package/dist/lib/schemas-data/3.1/enums/collection-cadence.json +1 -1
  549. package/dist/lib/schemas-data/3.1/enums/collection-kind.json +1 -1
  550. package/dist/lib/schemas-data/3.1/enums/collection-relationship.json +1 -1
  551. package/dist/lib/schemas-data/3.1/enums/collection-status.json +1 -1
  552. package/dist/lib/schemas-data/3.1/enums/completion-source.json +1 -1
  553. package/dist/lib/schemas-data/3.1/enums/consent-basis.json +1 -1
  554. package/dist/lib/schemas-data/3.1/enums/content-id-type.json +1 -1
  555. package/dist/lib/schemas-data/3.1/enums/content-rating-system.json +1 -1
  556. package/dist/lib/schemas-data/3.1/enums/creative-action.json +1 -1
  557. package/dist/lib/schemas-data/3.1/enums/creative-agent-capability.json +1 -1
  558. package/dist/lib/schemas-data/3.1/enums/creative-approval-status.json +1 -1
  559. package/dist/lib/schemas-data/3.1/enums/creative-event-reason-code.json +1 -1
  560. package/dist/lib/schemas-data/3.1/enums/creative-identifier-type.json +1 -1
  561. package/dist/lib/schemas-data/3.1/enums/creative-quality.json +1 -1
  562. package/dist/lib/schemas-data/3.1/enums/creative-selection-strategy.json +1 -1
  563. package/dist/lib/schemas-data/3.1/enums/creative-sort-field.json +1 -1
  564. package/dist/lib/schemas-data/3.1/enums/creative-status.json +1 -1
  565. package/dist/lib/schemas-data/3.1/enums/daast-tracking-event.json +1 -1
  566. package/dist/lib/schemas-data/3.1/enums/daast-version.json +1 -1
  567. package/dist/lib/schemas-data/3.1/enums/day-of-week.json +1 -1
  568. package/dist/lib/schemas-data/3.1/enums/delegation-authority.json +1 -1
  569. package/dist/lib/schemas-data/3.1/enums/delivery-type.json +1 -1
  570. package/dist/lib/schemas-data/3.1/enums/demographic-system.json +1 -1
  571. package/dist/lib/schemas-data/3.1/enums/derivative-type.json +1 -1
  572. package/dist/lib/schemas-data/3.1/enums/device-platform.json +1 -1
  573. package/dist/lib/schemas-data/3.1/enums/device-type.json +1 -1
  574. package/dist/lib/schemas-data/3.1/enums/digital-source-type.json +1 -1
  575. package/dist/lib/schemas-data/3.1/enums/dimension-unit.json +1 -1
  576. package/dist/lib/schemas-data/3.1/enums/disclosure-persistence.json +1 -1
  577. package/dist/lib/schemas-data/3.1/enums/disclosure-position.json +1 -1
  578. package/dist/lib/schemas-data/3.1/enums/distance-unit.json +1 -1
  579. package/dist/lib/schemas-data/3.1/enums/distribution-identifier-type.json +1 -1
  580. package/dist/lib/schemas-data/3.1/enums/embedded-provenance-method.json +1 -1
  581. package/dist/lib/schemas-data/3.1/enums/error-code.json +5 -5
  582. package/dist/lib/schemas-data/3.1/enums/error-scope.json +1 -1
  583. package/dist/lib/schemas-data/3.1/enums/escalation-severity.json +1 -1
  584. package/dist/lib/schemas-data/3.1/enums/event-type.json +1 -1
  585. package/dist/lib/schemas-data/3.1/enums/exclusivity.json +1 -1
  586. package/dist/lib/schemas-data/3.1/enums/feature-check-status.json +1 -1
  587. package/dist/lib/schemas-data/3.1/enums/feed-format.json +1 -1
  588. package/dist/lib/schemas-data/3.1/enums/feedback-source.json +1 -1
  589. package/dist/lib/schemas-data/3.1/enums/forecast-method.json +1 -1
  590. package/dist/lib/schemas-data/3.1/enums/forecast-range-unit.json +1 -1
  591. package/dist/lib/schemas-data/3.1/enums/forecastable-metric.json +1 -1
  592. package/dist/lib/schemas-data/3.1/enums/format-id-parameter.json +1 -1
  593. package/dist/lib/schemas-data/3.1/enums/frame-rate-type.json +1 -1
  594. package/dist/lib/schemas-data/3.1/enums/frequency-cap-scope.json +1 -1
  595. package/dist/lib/schemas-data/3.1/enums/genre-taxonomy.json +1 -1
  596. package/dist/lib/schemas-data/3.1/enums/geo-level.json +1 -1
  597. package/dist/lib/schemas-data/3.1/enums/gop-type.json +1 -1
  598. package/dist/lib/schemas-data/3.1/enums/governance-decision.json +1 -1
  599. package/dist/lib/schemas-data/3.1/enums/governance-domain.json +1 -1
  600. package/dist/lib/schemas-data/3.1/enums/governance-mode.json +1 -1
  601. package/dist/lib/schemas-data/3.1/enums/governance-phase.json +1 -1
  602. package/dist/lib/schemas-data/3.1/enums/history-entry-type.json +1 -1
  603. package/dist/lib/schemas-data/3.1/enums/http-method.json +1 -1
  604. package/dist/lib/schemas-data/3.1/enums/identifier-types.json +1 -1
  605. package/dist/lib/schemas-data/3.1/enums/impairment-offline-state.json +1 -1
  606. package/dist/lib/schemas-data/3.1/enums/impairment-reason-code.json +1 -1
  607. package/dist/lib/schemas-data/3.1/enums/installment-status.json +1 -1
  608. package/dist/lib/schemas-data/3.1/enums/javascript-module-type.json +1 -1
  609. package/dist/lib/schemas-data/3.1/enums/landing-page-requirement.json +1 -1
  610. package/dist/lib/schemas-data/3.1/enums/legacy-postal-system.json +1 -1
  611. package/dist/lib/schemas-data/3.1/enums/lift-dimension.json +1 -1
  612. package/dist/lib/schemas-data/3.1/enums/logo-slot.json +1 -1
  613. package/dist/lib/schemas-data/3.1/enums/makegood-remedy.json +1 -1
  614. package/dist/lib/schemas-data/3.1/enums/markdown-flavor.json +1 -1
  615. package/dist/lib/schemas-data/3.1/enums/match-id-type.json +1 -1
  616. package/dist/lib/schemas-data/3.1/enums/match-type.json +1 -1
  617. package/dist/lib/schemas-data/3.1/enums/media-buy-action-mode.json +1 -1
  618. package/dist/lib/schemas-data/3.1/enums/media-buy-health.json +1 -1
  619. package/dist/lib/schemas-data/3.1/enums/media-buy-status.json +1 -1
  620. package/dist/lib/schemas-data/3.1/enums/media-buy-valid-action.json +1 -1
  621. package/dist/lib/schemas-data/3.1/enums/metric-scope.json +1 -1
  622. package/dist/lib/schemas-data/3.1/enums/metric-type.json +1 -1
  623. package/dist/lib/schemas-data/3.1/enums/metro-system.json +1 -1
  624. package/dist/lib/schemas-data/3.1/enums/moov-atom-position.json +1 -1
  625. package/dist/lib/schemas-data/3.1/enums/notification-type.json +1 -1
  626. package/dist/lib/schemas-data/3.1/enums/offering-availability-status.json +1 -1
  627. package/dist/lib/schemas-data/3.1/enums/outcome-type.json +1 -1
  628. package/dist/lib/schemas-data/3.1/enums/pacing.json +1 -1
  629. package/dist/lib/schemas-data/3.1/enums/payment-terms.json +1 -1
  630. package/dist/lib/schemas-data/3.1/enums/performance-standard-metric.json +1 -1
  631. package/dist/lib/schemas-data/3.1/enums/policy-category.json +1 -1
  632. package/dist/lib/schemas-data/3.1/enums/policy-enforcement.json +1 -1
  633. package/dist/lib/schemas-data/3.1/enums/postal-system.json +1 -1
  634. package/dist/lib/schemas-data/3.1/enums/preview-output-format.json +1 -1
  635. package/dist/lib/schemas-data/3.1/enums/pricing-model.json +1 -1
  636. package/dist/lib/schemas-data/3.1/enums/production-quality.json +1 -1
  637. package/dist/lib/schemas-data/3.1/enums/property-type.json +1 -1
  638. package/dist/lib/schemas-data/3.1/enums/proposal-status.json +1 -1
  639. package/dist/lib/schemas-data/3.1/enums/publisher-identifier-types.json +1 -1
  640. package/dist/lib/schemas-data/3.1/enums/purchase-type.json +1 -1
  641. package/dist/lib/schemas-data/3.1/enums/reach-unit.json +1 -1
  642. package/dist/lib/schemas-data/3.1/enums/reporting-frequency.json +1 -1
  643. package/dist/lib/schemas-data/3.1/enums/response-type.json +1 -1
  644. package/dist/lib/schemas-data/3.1/enums/restricted-attribute.json +1 -1
  645. package/dist/lib/schemas-data/3.1/enums/right-type.json +1 -1
  646. package/dist/lib/schemas-data/3.1/enums/right-use.json +1 -1
  647. package/dist/lib/schemas-data/3.1/enums/rights-billing-period.json +1 -1
  648. package/dist/lib/schemas-data/3.1/enums/scan-type.json +1 -1
  649. package/dist/lib/schemas-data/3.1/enums/si-session-status.json +1 -1
  650. package/dist/lib/schemas-data/3.1/enums/signal-catalog-type.json +1 -1
  651. package/dist/lib/schemas-data/3.1/enums/signal-source.json +1 -1
  652. package/dist/lib/schemas-data/3.1/enums/signal-value-type.json +1 -1
  653. package/dist/lib/schemas-data/3.1/enums/snapshot-unavailable-reason.json +1 -1
  654. package/dist/lib/schemas-data/3.1/enums/social-placement-surface.json +1 -1
  655. package/dist/lib/schemas-data/3.1/enums/sort-direction.json +1 -1
  656. package/dist/lib/schemas-data/3.1/enums/sort-metric.json +1 -1
  657. package/dist/lib/schemas-data/3.1/enums/special-category.json +1 -1
  658. package/dist/lib/schemas-data/3.1/enums/specialism.json +1 -1
  659. package/dist/lib/schemas-data/3.1/enums/sponsored-placement-type.json +1 -1
  660. package/dist/lib/schemas-data/3.1/enums/talent-role.json +1 -1
  661. package/dist/lib/schemas-data/3.1/enums/task-status.json +1 -1
  662. package/dist/lib/schemas-data/3.1/enums/task-type.json +1 -1
  663. package/dist/lib/schemas-data/3.1/enums/transport-mode.json +1 -1
  664. package/dist/lib/schemas-data/3.1/enums/travel-time-unit.json +1 -1
  665. package/dist/lib/schemas-data/3.1/enums/uid-type.json +1 -1
  666. package/dist/lib/schemas-data/3.1/enums/universal-macro.json +1 -1
  667. package/dist/lib/schemas-data/3.1/enums/update-frequency.json +1 -1
  668. package/dist/lib/schemas-data/3.1/enums/url-asset-type.json +1 -1
  669. package/dist/lib/schemas-data/3.1/enums/validation-mode.json +1 -1
  670. package/dist/lib/schemas-data/3.1/enums/vast-tracking-event.json +1 -1
  671. package/dist/lib/schemas-data/3.1/enums/vast-version.json +1 -1
  672. package/dist/lib/schemas-data/3.1/enums/video-placement-type.json +1 -1
  673. package/dist/lib/schemas-data/3.1/enums/viewability-standard.json +1 -1
  674. package/dist/lib/schemas-data/3.1/enums/watermark-media-type.json +1 -1
  675. package/dist/lib/schemas-data/3.1/enums/wcag-level.json +1 -1
  676. package/dist/lib/schemas-data/3.1/enums/webhook-response-type.json +1 -1
  677. package/dist/lib/schemas-data/3.1/enums/webhook-security-method.json +1 -1
  678. package/dist/lib/schemas-data/3.1/error-details/account-setup-required.json +1 -1
  679. package/dist/lib/schemas-data/3.1/error-details/action-not-allowed.json +4 -4
  680. package/dist/lib/schemas-data/3.1/error-details/agent-permission-denied.json +1 -1
  681. package/dist/lib/schemas-data/3.1/error-details/audience-too-small.json +1 -1
  682. package/dist/lib/schemas-data/3.1/error-details/authorization-required.json +3 -3
  683. package/dist/lib/schemas-data/3.1/error-details/billing-not-permitted-for-agent.json +3 -3
  684. package/dist/lib/schemas-data/3.1/error-details/billing-not-supported.json +2 -2
  685. package/dist/lib/schemas-data/3.1/error-details/budget-too-low.json +1 -1
  686. package/dist/lib/schemas-data/3.1/error-details/conflict.json +1 -1
  687. package/dist/lib/schemas-data/3.1/error-details/creative-rejected.json +1 -1
  688. package/dist/lib/schemas-data/3.1/error-details/policy-violation.json +1 -1
  689. package/dist/lib/schemas-data/3.1/error-details/rate-limited.json +1 -1
  690. package/dist/lib/schemas-data/3.1/error-details/stale-response.json +1 -1
  691. package/dist/lib/schemas-data/3.1/error-details/vendor-error-codes.json +1 -1
  692. package/dist/lib/schemas-data/3.1/error-details/version-unsupported.json +2 -2
  693. package/dist/lib/schemas-data/3.1/extensions/extension-meta.json +1 -1
  694. package/dist/lib/schemas-data/3.1/extensions/index.json +2 -2
  695. package/dist/lib/schemas-data/3.1/formats/canonical/_base.json +5 -5
  696. package/dist/lib/schemas-data/3.1/formats/canonical/agent_placement.json +2 -2
  697. package/dist/lib/schemas-data/3.1/formats/canonical/audio_daast.json +2 -2
  698. package/dist/lib/schemas-data/3.1/formats/canonical/audio_hosted.json +2 -2
  699. package/dist/lib/schemas-data/3.1/formats/canonical/display_tag.json +2 -2
  700. package/dist/lib/schemas-data/3.1/formats/canonical/html5.json +2 -2
  701. package/dist/lib/schemas-data/3.1/formats/canonical/image.json +2 -2
  702. package/dist/lib/schemas-data/3.1/formats/canonical/image_carousel.json +2 -2
  703. package/dist/lib/schemas-data/3.1/formats/canonical/native_in_feed.json +2 -2
  704. package/dist/lib/schemas-data/3.1/formats/canonical/responsive_creative.json +2 -2
  705. package/dist/lib/schemas-data/3.1/formats/canonical/sponsored_placement.json +2 -2
  706. package/dist/lib/schemas-data/3.1/formats/canonical/video_hosted.json +2 -2
  707. package/dist/lib/schemas-data/3.1/formats/canonical/video_vast.json +2 -2
  708. package/dist/lib/schemas-data/3.1/governance/attribute-definition.json +1 -1
  709. package/dist/lib/schemas-data/3.1/governance/audience-constraints.json +3 -3
  710. package/dist/lib/schemas-data/3.1/governance/check-governance-request.json +8 -8
  711. package/dist/lib/schemas-data/3.1/governance/check-governance-response.json +7 -7
  712. package/dist/lib/schemas-data/3.1/governance/get-plan-audit-logs-request.json +5 -5
  713. package/dist/lib/schemas-data/3.1/governance/get-plan-audit-logs-response.json +11 -11
  714. package/dist/lib/schemas-data/3.1/governance/policy-category-definition.json +2 -2
  715. package/dist/lib/schemas-data/3.1/governance/policy-entry.json +6 -6
  716. package/dist/lib/schemas-data/3.1/governance/policy-ref.json +1 -1
  717. package/dist/lib/schemas-data/3.1/governance/report-plan-outcome-request.json +7 -7
  718. package/dist/lib/schemas-data/3.1/governance/report-plan-outcome-response.json +5 -5
  719. package/dist/lib/schemas-data/3.1/governance/sync-plans-request.json +14 -14
  720. package/dist/lib/schemas-data/3.1/governance/sync-plans-response.json +6 -6
  721. package/dist/lib/schemas-data/3.1/index.json +440 -440
  722. package/dist/lib/schemas-data/3.1/manifest.json +7 -7
  723. package/dist/lib/schemas-data/3.1/manifest.schema.json +1 -1
  724. package/dist/lib/schemas-data/3.1/media-buy/build-creative-async-response-input-required.json +4 -4
  725. package/dist/lib/schemas-data/3.1/media-buy/build-creative-async-response-submitted.json +4 -4
  726. package/dist/lib/schemas-data/3.1/media-buy/build-creative-async-response-working.json +3 -3
  727. package/dist/lib/schemas-data/3.1/media-buy/build-creative-request.json +16 -16
  728. package/dist/lib/schemas-data/3.1/media-buy/build-creative-response.json +35 -35
  729. package/dist/lib/schemas-data/3.1/media-buy/create-media-buy-async-response-input-required.json +4 -4
  730. package/dist/lib/schemas-data/3.1/media-buy/create-media-buy-async-response-submitted.json +4 -4
  731. package/dist/lib/schemas-data/3.1/media-buy/create-media-buy-async-response-working.json +3 -3
  732. package/dist/lib/schemas-data/3.1/media-buy/create-media-buy-request.json +13 -13
  733. package/dist/lib/schemas-data/3.1/media-buy/create-media-buy-response.json +19 -19
  734. package/dist/lib/schemas-data/3.1/media-buy/get-media-buy-delivery-request.json +23 -23
  735. package/dist/lib/schemas-data/3.1/media-buy/get-media-buy-delivery-response.json +27 -27
  736. package/dist/lib/schemas-data/3.1/media-buy/get-media-buys-request.json +8 -8
  737. package/dist/lib/schemas-data/3.1/media-buy/get-media-buys-response.json +30 -30
  738. package/dist/lib/schemas-data/3.1/media-buy/get-products-async-response-input-required.json +4 -4
  739. package/dist/lib/schemas-data/3.1/media-buy/get-products-async-response-submitted.json +4 -4
  740. package/dist/lib/schemas-data/3.1/media-buy/get-products-async-response-working.json +3 -3
  741. package/dist/lib/schemas-data/3.1/media-buy/get-products-request.json +13 -13
  742. package/dist/lib/schemas-data/3.1/media-buy/get-products-response.json +10 -10
  743. package/dist/lib/schemas-data/3.1/media-buy/list-creative-formats-request.json +13 -13
  744. package/dist/lib/schemas-data/3.1/media-buy/list-creative-formats-response.json +9 -9
  745. package/dist/lib/schemas-data/3.1/media-buy/log-event-request.json +5 -5
  746. package/dist/lib/schemas-data/3.1/media-buy/log-event-response.json +8 -8
  747. package/dist/lib/schemas-data/3.1/media-buy/media-buy-delivery-webhook-result.json +9 -9
  748. package/dist/lib/schemas-data/3.1/media-buy/package-request.json +23 -23
  749. package/dist/lib/schemas-data/3.1/media-buy/package-update.json +13 -13
  750. package/dist/lib/schemas-data/3.1/media-buy/provide-performance-feedback-request.json +7 -7
  751. package/dist/lib/schemas-data/3.1/media-buy/provide-performance-feedback-response.json +8 -8
  752. package/dist/lib/schemas-data/3.1/media-buy/sync-audiences-request.json +8 -8
  753. package/dist/lib/schemas-data/3.1/media-buy/sync-audiences-response.json +14 -14
  754. package/dist/lib/schemas-data/3.1/media-buy/sync-catalogs-async-response-input-required.json +3 -3
  755. package/dist/lib/schemas-data/3.1/media-buy/sync-catalogs-async-response-submitted.json +4 -4
  756. package/dist/lib/schemas-data/3.1/media-buy/sync-catalogs-async-response-working.json +3 -3
  757. package/dist/lib/schemas-data/3.1/media-buy/sync-catalogs-request.json +8 -8
  758. package/dist/lib/schemas-data/3.1/media-buy/sync-catalogs-response.json +14 -14
  759. package/dist/lib/schemas-data/3.1/media-buy/sync-event-sources-request.json +8 -8
  760. package/dist/lib/schemas-data/3.1/media-buy/sync-event-sources-response.json +14 -14
  761. package/dist/lib/schemas-data/3.1/media-buy/update-media-buy-async-response-input-required.json +3 -3
  762. package/dist/lib/schemas-data/3.1/media-buy/update-media-buy-async-response-submitted.json +4 -4
  763. package/dist/lib/schemas-data/3.1/media-buy/update-media-buy-async-response-working.json +3 -3
  764. package/dist/lib/schemas-data/3.1/media-buy/update-media-buy-request.json +11 -11
  765. package/dist/lib/schemas-data/3.1/media-buy/update-media-buy-response.json +17 -17
  766. package/dist/lib/schemas-data/3.1/pricing-options/cpa-option.json +4 -4
  767. package/dist/lib/schemas-data/3.1/pricing-options/cpc-option.json +4 -4
  768. package/dist/lib/schemas-data/3.1/pricing-options/cpcv-option.json +4 -4
  769. package/dist/lib/schemas-data/3.1/pricing-options/cpm-option.json +4 -4
  770. package/dist/lib/schemas-data/3.1/pricing-options/cpp-option.json +5 -5
  771. package/dist/lib/schemas-data/3.1/pricing-options/cpv-option.json +4 -4
  772. package/dist/lib/schemas-data/3.1/pricing-options/flat-rate-option.json +4 -4
  773. package/dist/lib/schemas-data/3.1/pricing-options/price-breakdown.json +2 -2
  774. package/dist/lib/schemas-data/3.1/pricing-options/price-guidance.json +1 -1
  775. package/dist/lib/schemas-data/3.1/pricing-options/time-option.json +4 -4
  776. package/dist/lib/schemas-data/3.1/pricing-options/vcpm-option.json +4 -4
  777. package/dist/lib/schemas-data/3.1/property/authorization-result.json +1 -1
  778. package/dist/lib/schemas-data/3.1/property/base-property-source.json +4 -4
  779. package/dist/lib/schemas-data/3.1/property/create-property-list-request.json +8 -8
  780. package/dist/lib/schemas-data/3.1/property/create-property-list-response.json +6 -6
  781. package/dist/lib/schemas-data/3.1/property/delete-property-list-request.json +5 -5
  782. package/dist/lib/schemas-data/3.1/property/delete-property-list-response.json +5 -5
  783. package/dist/lib/schemas-data/3.1/property/delivery-record.json +3 -3
  784. package/dist/lib/schemas-data/3.1/property/get-property-list-request.json +5 -5
  785. package/dist/lib/schemas-data/3.1/property/get-property-list-response.json +9 -9
  786. package/dist/lib/schemas-data/3.1/property/list-property-lists-request.json +6 -6
  787. package/dist/lib/schemas-data/3.1/property/list-property-lists-response.json +7 -7
  788. package/dist/lib/schemas-data/3.1/property/property-error.json +2 -2
  789. package/dist/lib/schemas-data/3.1/property/property-feature-definition.json +2 -2
  790. package/dist/lib/schemas-data/3.1/property/property-feature-result.json +4 -4
  791. package/dist/lib/schemas-data/3.1/property/property-feature-value.json +2 -2
  792. package/dist/lib/schemas-data/3.1/property/property-feature.json +1 -1
  793. package/dist/lib/schemas-data/3.1/property/property-list-changed-webhook.json +2 -2
  794. package/dist/lib/schemas-data/3.1/property/property-list-filters.json +5 -5
  795. package/dist/lib/schemas-data/3.1/property/property-list.json +6 -6
  796. package/dist/lib/schemas-data/3.1/property/update-property-list-request.json +8 -8
  797. package/dist/lib/schemas-data/3.1/property/update-property-list-response.json +6 -6
  798. package/dist/lib/schemas-data/3.1/property/validate-property-delivery-request.json +6 -6
  799. package/dist/lib/schemas-data/3.1/property/validate-property-delivery-response.json +6 -6
  800. package/dist/lib/schemas-data/3.1/property/validation-result.json +5 -5
  801. package/dist/lib/schemas-data/3.1/protocol/get-adcp-capabilities-request.json +4 -4
  802. package/dist/lib/schemas-data/3.1/protocol/get-adcp-capabilities-response.json +34 -34
  803. package/dist/lib/schemas-data/3.1/protocol/get-task-status-request.json +5 -5
  804. package/dist/lib/schemas-data/3.1/protocol/get-task-status-response.json +10 -10
  805. package/dist/lib/schemas-data/3.1/protocol/list-tasks-request.json +13 -13
  806. package/dist/lib/schemas-data/3.1/protocol/list-tasks-response.json +8 -8
  807. package/dist/lib/schemas-data/3.1/registries/v1-canonical-mapping.json +2 -2
  808. package/dist/lib/schemas-data/3.1/signals/activate-signal-request.json +6 -6
  809. package/dist/lib/schemas-data/3.1/signals/activate-signal-response.json +9 -9
  810. package/dist/lib/schemas-data/3.1/signals/get-signals-async-response-submitted.json +4 -4
  811. package/dist/lib/schemas-data/3.1/signals/get-signals-async-response-working.json +3 -3
  812. package/dist/lib/schemas-data/3.1/signals/get-signals-request.json +11 -11
  813. package/dist/lib/schemas-data/3.1/signals/get-signals-response.json +17 -17
  814. package/dist/lib/schemas-data/3.1/sponsored-intelligence/si-capabilities.json +1 -1
  815. package/dist/lib/schemas-data/3.1/sponsored-intelligence/si-context-use.json +1 -1
  816. package/dist/lib/schemas-data/3.1/sponsored-intelligence/si-get-offering-request.json +4 -4
  817. package/dist/lib/schemas-data/3.1/sponsored-intelligence/si-get-offering-response.json +9 -9
  818. package/dist/lib/schemas-data/3.1/sponsored-intelligence/si-identity.json +1 -1
  819. package/dist/lib/schemas-data/3.1/sponsored-intelligence/si-initiate-session-request.json +7 -7
  820. package/dist/lib/schemas-data/3.1/sponsored-intelligence/si-initiate-session-response.json +10 -10
  821. package/dist/lib/schemas-data/3.1/sponsored-intelligence/si-send-message-request.json +5 -5
  822. package/dist/lib/schemas-data/3.1/sponsored-intelligence/si-send-message-response.json +10 -10
  823. package/dist/lib/schemas-data/3.1/sponsored-intelligence/si-sponsored-context-receipt.json +4 -4
  824. package/dist/lib/schemas-data/3.1/sponsored-intelligence/si-sponsored-context.json +4 -4
  825. package/dist/lib/schemas-data/3.1/sponsored-intelligence/si-terminate-session-request.json +4 -4
  826. package/dist/lib/schemas-data/3.1/sponsored-intelligence/si-terminate-session-response.json +7 -7
  827. package/dist/lib/schemas-data/3.1/sponsored-intelligence/si-ui-element.json +1 -1
  828. package/dist/lib/schemas-data/3.1/trusted-match/available-package.json +4 -4
  829. package/dist/lib/schemas-data/3.1/trusted-match/context-match-request.json +5 -5
  830. package/dist/lib/schemas-data/3.1/trusted-match/context-match-response.json +4 -4
  831. package/dist/lib/schemas-data/3.1/trusted-match/error.json +1 -1
  832. package/dist/lib/schemas-data/3.1/trusted-match/identity-match-request.json +4 -4
  833. package/dist/lib/schemas-data/3.1/trusted-match/identity-match-response.json +3 -3
  834. package/dist/lib/schemas-data/3.1/trusted-match/offer-price.json +1 -1
  835. package/dist/lib/schemas-data/3.1/trusted-match/offer.json +5 -5
  836. package/dist/lib/schemas-data/3.1/trusted-match/provider-registration.json +2 -2
  837. package/dist/lib/schemas-data/v2.5/_provenance.json +1 -1
  838. package/dist/lib/server/decisioning/runtime/entity-hydration.generated.js.map +1 -1
  839. package/dist/lib/server/decisioning/runtime/entity-hydration.generated.mjs.map +1 -1
  840. package/dist/lib/server/wire-spec-fields.generated.d.mts +29 -29
  841. package/dist/lib/server/wire-spec-fields.generated.d.ts +29 -29
  842. package/dist/lib/server/wire-spec-fields.generated.js +29 -29
  843. package/dist/lib/server/wire-spec-fields.generated.js.map +1 -1
  844. package/dist/lib/server/wire-spec-fields.generated.mjs +29 -29
  845. package/dist/lib/server/wire-spec-fields.generated.mjs.map +1 -1
  846. package/dist/lib/testing/client.d.ts.map +1 -1
  847. package/dist/lib/testing/client.js +12 -4
  848. package/dist/lib/testing/client.js.map +1 -1
  849. package/dist/lib/testing/client.mjs +12 -4
  850. package/dist/lib/testing/client.mjs.map +1 -1
  851. package/dist/lib/testing/compliance/comply.d.mts +1 -1
  852. package/dist/lib/testing/compliance/comply.d.ts +1 -1
  853. package/dist/lib/testing/compliance/comply.d.ts.map +1 -1
  854. package/dist/lib/testing/compliance/comply.js +16 -6
  855. package/dist/lib/testing/compliance/comply.js.map +1 -1
  856. package/dist/lib/testing/compliance/comply.mjs +16 -6
  857. package/dist/lib/testing/compliance/comply.mjs.map +1 -1
  858. package/dist/lib/testing/storyboard/probes.d.mts +6 -0
  859. package/dist/lib/testing/storyboard/probes.d.ts +6 -0
  860. package/dist/lib/testing/storyboard/probes.d.ts.map +1 -1
  861. package/dist/lib/testing/storyboard/probes.js +16 -5
  862. package/dist/lib/testing/storyboard/probes.js.map +1 -1
  863. package/dist/lib/testing/storyboard/probes.mjs +16 -5
  864. package/dist/lib/testing/storyboard/probes.mjs.map +1 -1
  865. package/dist/lib/testing/storyboard/runner.d.ts.map +1 -1
  866. package/dist/lib/testing/storyboard/runner.js +6 -2
  867. package/dist/lib/testing/storyboard/runner.js.map +1 -1
  868. package/dist/lib/testing/storyboard/runner.mjs +6 -2
  869. package/dist/lib/testing/storyboard/runner.mjs.map +1 -1
  870. package/dist/lib/testing/types.d.mts +7 -1
  871. package/dist/lib/testing/types.d.ts +7 -1
  872. package/dist/lib/testing/types.d.ts.map +1 -1
  873. package/dist/lib/testing/types.js.map +1 -1
  874. package/dist/lib/types/comply-test-controller.d.ts +49 -1
  875. package/dist/lib/types/core.generated.d.mts +54 -6
  876. package/dist/lib/types/core.generated.d.ts +54 -6
  877. package/dist/lib/types/core.generated.d.ts.map +1 -1
  878. package/dist/lib/types/core.generated.js.map +1 -1
  879. package/dist/lib/types/error-codes.d.mts +4 -4
  880. package/dist/lib/types/error-codes.d.ts +4 -4
  881. package/dist/lib/types/get-adcp-capabilities.d.ts +1 -1
  882. package/dist/lib/types/get-products.d.ts +49 -1
  883. package/dist/lib/types/get-task-status.d.ts +49 -1
  884. package/dist/lib/types/manifest.generated.d.mts +7 -7
  885. package/dist/lib/types/manifest.generated.d.ts +7 -7
  886. package/dist/lib/types/manifest.generated.js +4 -4
  887. package/dist/lib/types/manifest.generated.js.map +1 -1
  888. package/dist/lib/types/manifest.generated.mjs +4 -4
  889. package/dist/lib/types/manifest.generated.mjs.map +1 -1
  890. package/dist/lib/types/per-tool-index.json +1 -1
  891. package/dist/lib/types/schemas.generated.d.mts +135 -27
  892. package/dist/lib/types/schemas.generated.d.ts +135 -27
  893. package/dist/lib/types/schemas.generated.d.ts.map +1 -1
  894. package/dist/lib/types/schemas.generated.js +15 -3
  895. package/dist/lib/types/schemas.generated.js.map +1 -1
  896. package/dist/lib/types/schemas.generated.mjs +15 -3
  897. package/dist/lib/types/schemas.generated.mjs.map +1 -1
  898. package/dist/lib/types/sync-creatives.d.ts +1 -1
  899. package/dist/lib/types/tools.generated.d.mts +54 -6
  900. package/dist/lib/types/tools.generated.d.ts +54 -6
  901. package/dist/lib/types/tools.generated.d.ts.map +1 -1
  902. package/dist/lib/types/tools.generated.js.map +1 -1
  903. package/dist/lib/types/validate-input.d.ts +3 -3
  904. package/dist/lib/version.d.mts +7 -7
  905. package/dist/lib/version.d.ts +7 -7
  906. package/dist/lib/version.d.ts.map +1 -1
  907. package/dist/lib/version.js +9 -6
  908. package/dist/lib/version.js.map +1 -1
  909. package/dist/lib/version.mjs +9 -6
  910. package/dist/lib/version.mjs.map +1 -1
  911. package/docs/llms.txt +4 -4
  912. package/package.json +2 -2
  913. /package/compliance/cache/{3.1.2 → 3.1.5}/domains/brand/index.yaml +0 -0
  914. /package/compliance/cache/{3.1.2 → 3.1.5}/domains/brand/scenarios/distributed_brand_resolution.yaml +0 -0
  915. /package/compliance/cache/{3.1.2 → 3.1.5}/domains/brand/scenarios/single_side_trust_extension.yaml +0 -0
  916. /package/compliance/cache/{3.1.2 → 3.1.5}/domains/creative/index.yaml +0 -0
  917. /package/compliance/cache/{3.1.2 → 3.1.5}/domains/creative/scenarios/billing_out_of_band.yaml +0 -0
  918. /package/compliance/cache/{3.1.2 → 3.1.5}/domains/creative/scenarios/creative_lifecycle_webhooks.yaml +0 -0
  919. /package/compliance/cache/{3.1.2 → 3.1.5}/domains/creative/scenarios/native_in_feed.yaml +0 -0
  920. /package/compliance/cache/{3.1.2 → 3.1.5}/domains/governance/index.yaml +0 -0
  921. /package/compliance/cache/{3.1.2 → 3.1.5}/domains/media-buy/index.yaml +0 -0
  922. /package/compliance/cache/{3.1.2 → 3.1.5}/domains/media-buy/scenarios/audience_buy_flow.yaml +0 -0
  923. /package/compliance/cache/{3.1.2 → 3.1.5}/domains/media-buy/scenarios/billing_finality_delivery.yaml +0 -0
  924. /package/compliance/cache/{3.1.2 → 3.1.5}/domains/media-buy/scenarios/canonical_formats.yaml +0 -0
  925. /package/compliance/cache/{3.1.2 → 3.1.5}/domains/media-buy/scenarios/clicks_buy_flow.yaml +0 -0
  926. /package/compliance/cache/{3.1.2 → 3.1.5}/domains/media-buy/scenarios/completed_views_buy_flow.yaml +0 -0
  927. /package/compliance/cache/{3.1.2 → 3.1.5}/domains/media-buy/scenarios/create_media_buy_async.yaml +0 -0
  928. /package/compliance/cache/{3.1.2 → 3.1.5}/domains/media-buy/scenarios/creative_fate_after_cancellation.yaml +0 -0
  929. /package/compliance/cache/{3.1.2 → 3.1.5}/domains/media-buy/scenarios/creative_reception.yaml +0 -0
  930. /package/compliance/cache/{3.1.2 → 3.1.5}/domains/media-buy/scenarios/delivery_reporting.yaml +0 -0
  931. /package/compliance/cache/{3.1.2 → 3.1.5}/domains/media-buy/scenarios/dependency_impairment.yaml +0 -0
  932. /package/compliance/cache/{3.1.2 → 3.1.5}/domains/media-buy/scenarios/dependency_impairment_cardinality.yaml +0 -0
  933. /package/compliance/cache/{3.1.2 → 3.1.5}/domains/media-buy/scenarios/event_dedup_flow.yaml +0 -0
  934. /package/compliance/cache/{3.1.2 → 3.1.5}/domains/media-buy/scenarios/frequency_cap_enforcement.yaml +0 -0
  935. /package/compliance/cache/{3.1.2 → 3.1.5}/domains/media-buy/scenarios/get_products_async.yaml +0 -0
  936. /package/compliance/cache/{3.1.2 → 3.1.5}/domains/media-buy/scenarios/governance_approved.yaml +0 -0
  937. /package/compliance/cache/{3.1.2 → 3.1.5}/domains/media-buy/scenarios/governance_conditions.yaml +0 -0
  938. /package/compliance/cache/{3.1.2 → 3.1.5}/domains/media-buy/scenarios/governance_denied.yaml +0 -0
  939. /package/compliance/cache/{3.1.2 → 3.1.5}/domains/media-buy/scenarios/governance_denied_recovery.yaml +0 -0
  940. /package/compliance/cache/{3.1.2 → 3.1.5}/domains/media-buy/scenarios/inline_creatives_without_sync.yaml +0 -0
  941. /package/compliance/cache/{3.1.2 → 3.1.5}/domains/media-buy/scenarios/invalid_transitions.yaml +0 -0
  942. /package/compliance/cache/{3.1.2 → 3.1.5}/domains/media-buy/scenarios/measurement_accountability.yaml +0 -0
  943. /package/compliance/cache/{3.1.2 → 3.1.5}/domains/media-buy/scenarios/measurement_terms_rejected.yaml +0 -0
  944. /package/compliance/cache/{3.1.2 → 3.1.5}/domains/media-buy/scenarios/package_correlation_legacy_fallback.yaml +0 -0
  945. /package/compliance/cache/{3.1.2 → 3.1.5}/domains/media-buy/scenarios/pending_creatives_to_start.yaml +0 -0
  946. /package/compliance/cache/{3.1.2 → 3.1.5}/domains/media-buy/scenarios/per_creative_conversion_attribution.yaml +0 -0
  947. /package/compliance/cache/{3.1.2 → 3.1.5}/domains/media-buy/scenarios/performance_buy_flow.yaml +0 -0
  948. /package/compliance/cache/{3.1.2 → 3.1.5}/domains/media-buy/scenarios/performance_buy_flow_roas.yaml +0 -0
  949. /package/compliance/cache/{3.1.2 → 3.1.5}/domains/media-buy/scenarios/pricing_currency_filter.yaml +0 -0
  950. /package/compliance/cache/{3.1.2 → 3.1.5}/domains/media-buy/scenarios/product_signal_targeting.yaml +0 -0
  951. /package/compliance/cache/{3.1.2 → 3.1.5}/domains/media-buy/scenarios/proposal_finalize.yaml +0 -0
  952. /package/compliance/cache/{3.1.2 → 3.1.5}/domains/media-buy/scenarios/proposal_finalize_asap_timing.yaml +0 -0
  953. /package/compliance/cache/{3.1.2 → 3.1.5}/domains/media-buy/scenarios/proposal_not_found_errors.yaml +0 -0
  954. /package/compliance/cache/{3.1.2 → 3.1.5}/domains/media-buy/scenarios/provenance_audit_observation.yaml +0 -0
  955. /package/compliance/cache/{3.1.2 → 3.1.5}/domains/media-buy/scenarios/provenance_enforcement.yaml +0 -0
  956. /package/compliance/cache/{3.1.2 → 3.1.5}/domains/media-buy/scenarios/provenance_truth_of_claim.yaml +0 -0
  957. /package/compliance/cache/{3.1.2 → 3.1.5}/domains/media-buy/scenarios/reach_buy_flow.yaml +0 -0
  958. /package/compliance/cache/{3.1.2 → 3.1.5}/domains/media-buy/scenarios/refine_finalize_exclusivity.yaml +0 -0
  959. /package/compliance/cache/{3.1.2 → 3.1.5}/domains/media-buy/scenarios/refine_products.yaml +0 -0
  960. /package/compliance/cache/{3.1.2 → 3.1.5}/domains/media-buy/scenarios/vendor_metric_accountability.yaml +0 -0
  961. /package/compliance/cache/{3.1.2 → 3.1.5}/domains/media-buy/scenarios/vendor_metric_catalog_precondition.yaml +0 -0
  962. /package/compliance/cache/{3.1.2 → 3.1.5}/domains/media-buy/scenarios/vendor_metric_optimization_flow.yaml +0 -0
  963. /package/compliance/cache/{3.1.2 → 3.1.5}/domains/media-buy/state-machine.yaml +0 -0
  964. /package/compliance/cache/{3.1.2 → 3.1.5}/domains/signals/index.yaml +0 -0
  965. /package/compliance/cache/{3.1.2 → 3.1.5}/domains/signals/scenarios/get_signals_async.yaml +0 -0
  966. /package/compliance/cache/{3.1.2 → 3.1.5}/domains/sponsored-intelligence/index.yaml +0 -0
  967. /package/compliance/cache/{3.1.2 → 3.1.5}/domains/sponsored-intelligence/sponsored-context-accountability.yaml +0 -0
  968. /package/compliance/cache/{3.1.2 → 3.1.5}/protocols/brand/index.yaml +0 -0
  969. /package/compliance/cache/{3.1.2 → 3.1.5}/protocols/brand/scenarios/distributed_brand_resolution.yaml +0 -0
  970. /package/compliance/cache/{3.1.2 → 3.1.5}/protocols/brand/scenarios/single_side_trust_extension.yaml +0 -0
  971. /package/compliance/cache/{3.1.2 → 3.1.5}/protocols/creative/index.yaml +0 -0
  972. /package/compliance/cache/{3.1.2 → 3.1.5}/protocols/creative/scenarios/billing_out_of_band.yaml +0 -0
  973. /package/compliance/cache/{3.1.2 → 3.1.5}/protocols/creative/scenarios/creative_lifecycle_webhooks.yaml +0 -0
  974. /package/compliance/cache/{3.1.2 → 3.1.5}/protocols/creative/scenarios/native_in_feed.yaml +0 -0
  975. /package/compliance/cache/{3.1.2 → 3.1.5}/protocols/governance/index.yaml +0 -0
  976. /package/compliance/cache/{3.1.2 → 3.1.5}/protocols/media-buy/index.yaml +0 -0
  977. /package/compliance/cache/{3.1.2 → 3.1.5}/protocols/media-buy/scenarios/audience_buy_flow.yaml +0 -0
  978. /package/compliance/cache/{3.1.2 → 3.1.5}/protocols/media-buy/scenarios/billing_finality_delivery.yaml +0 -0
  979. /package/compliance/cache/{3.1.2 → 3.1.5}/protocols/media-buy/scenarios/canonical_formats.yaml +0 -0
  980. /package/compliance/cache/{3.1.2 → 3.1.5}/protocols/media-buy/scenarios/clicks_buy_flow.yaml +0 -0
  981. /package/compliance/cache/{3.1.2 → 3.1.5}/protocols/media-buy/scenarios/completed_views_buy_flow.yaml +0 -0
  982. /package/compliance/cache/{3.1.2 → 3.1.5}/protocols/media-buy/scenarios/create_media_buy_async.yaml +0 -0
  983. /package/compliance/cache/{3.1.2 → 3.1.5}/protocols/media-buy/scenarios/creative_fate_after_cancellation.yaml +0 -0
  984. /package/compliance/cache/{3.1.2 → 3.1.5}/protocols/media-buy/scenarios/creative_reception.yaml +0 -0
  985. /package/compliance/cache/{3.1.2 → 3.1.5}/protocols/media-buy/scenarios/delivery_reporting.yaml +0 -0
  986. /package/compliance/cache/{3.1.2 → 3.1.5}/protocols/media-buy/scenarios/dependency_impairment.yaml +0 -0
  987. /package/compliance/cache/{3.1.2 → 3.1.5}/protocols/media-buy/scenarios/dependency_impairment_cardinality.yaml +0 -0
  988. /package/compliance/cache/{3.1.2 → 3.1.5}/protocols/media-buy/scenarios/event_dedup_flow.yaml +0 -0
  989. /package/compliance/cache/{3.1.2 → 3.1.5}/protocols/media-buy/scenarios/frequency_cap_enforcement.yaml +0 -0
  990. /package/compliance/cache/{3.1.2 → 3.1.5}/protocols/media-buy/scenarios/get_products_async.yaml +0 -0
  991. /package/compliance/cache/{3.1.2 → 3.1.5}/protocols/media-buy/scenarios/governance_approved.yaml +0 -0
  992. /package/compliance/cache/{3.1.2 → 3.1.5}/protocols/media-buy/scenarios/governance_conditions.yaml +0 -0
  993. /package/compliance/cache/{3.1.2 → 3.1.5}/protocols/media-buy/scenarios/governance_denied.yaml +0 -0
  994. /package/compliance/cache/{3.1.2 → 3.1.5}/protocols/media-buy/scenarios/governance_denied_recovery.yaml +0 -0
  995. /package/compliance/cache/{3.1.2 → 3.1.5}/protocols/media-buy/scenarios/inline_creatives_without_sync.yaml +0 -0
  996. /package/compliance/cache/{3.1.2 → 3.1.5}/protocols/media-buy/scenarios/invalid_transitions.yaml +0 -0
  997. /package/compliance/cache/{3.1.2 → 3.1.5}/protocols/media-buy/scenarios/measurement_accountability.yaml +0 -0
  998. /package/compliance/cache/{3.1.2 → 3.1.5}/protocols/media-buy/scenarios/measurement_terms_rejected.yaml +0 -0
  999. /package/compliance/cache/{3.1.2 → 3.1.5}/protocols/media-buy/scenarios/package_correlation_legacy_fallback.yaml +0 -0
  1000. /package/compliance/cache/{3.1.2 → 3.1.5}/protocols/media-buy/scenarios/pending_creatives_to_start.yaml +0 -0
  1001. /package/compliance/cache/{3.1.2 → 3.1.5}/protocols/media-buy/scenarios/per_creative_conversion_attribution.yaml +0 -0
  1002. /package/compliance/cache/{3.1.2 → 3.1.5}/protocols/media-buy/scenarios/performance_buy_flow.yaml +0 -0
  1003. /package/compliance/cache/{3.1.2 → 3.1.5}/protocols/media-buy/scenarios/performance_buy_flow_roas.yaml +0 -0
  1004. /package/compliance/cache/{3.1.2 → 3.1.5}/protocols/media-buy/scenarios/pricing_currency_filter.yaml +0 -0
  1005. /package/compliance/cache/{3.1.2 → 3.1.5}/protocols/media-buy/scenarios/product_signal_targeting.yaml +0 -0
  1006. /package/compliance/cache/{3.1.2 → 3.1.5}/protocols/media-buy/scenarios/proposal_finalize.yaml +0 -0
  1007. /package/compliance/cache/{3.1.2 → 3.1.5}/protocols/media-buy/scenarios/proposal_finalize_asap_timing.yaml +0 -0
  1008. /package/compliance/cache/{3.1.2 → 3.1.5}/protocols/media-buy/scenarios/proposal_not_found_errors.yaml +0 -0
  1009. /package/compliance/cache/{3.1.2 → 3.1.5}/protocols/media-buy/scenarios/provenance_audit_observation.yaml +0 -0
  1010. /package/compliance/cache/{3.1.2 → 3.1.5}/protocols/media-buy/scenarios/provenance_enforcement.yaml +0 -0
  1011. /package/compliance/cache/{3.1.2 → 3.1.5}/protocols/media-buy/scenarios/provenance_truth_of_claim.yaml +0 -0
  1012. /package/compliance/cache/{3.1.2 → 3.1.5}/protocols/media-buy/scenarios/reach_buy_flow.yaml +0 -0
  1013. /package/compliance/cache/{3.1.2 → 3.1.5}/protocols/media-buy/scenarios/refine_finalize_exclusivity.yaml +0 -0
  1014. /package/compliance/cache/{3.1.2 → 3.1.5}/protocols/media-buy/scenarios/refine_products.yaml +0 -0
  1015. /package/compliance/cache/{3.1.2 → 3.1.5}/protocols/media-buy/scenarios/vendor_metric_accountability.yaml +0 -0
  1016. /package/compliance/cache/{3.1.2 → 3.1.5}/protocols/media-buy/scenarios/vendor_metric_catalog_precondition.yaml +0 -0
  1017. /package/compliance/cache/{3.1.2 → 3.1.5}/protocols/media-buy/scenarios/vendor_metric_optimization_flow.yaml +0 -0
  1018. /package/compliance/cache/{3.1.2 → 3.1.5}/protocols/media-buy/state-machine.yaml +0 -0
  1019. /package/compliance/cache/{3.1.2 → 3.1.5}/protocols/signals/index.yaml +0 -0
  1020. /package/compliance/cache/{3.1.2 → 3.1.5}/protocols/signals/scenarios/get_signals_async.yaml +0 -0
  1021. /package/compliance/cache/{3.1.2 → 3.1.5}/protocols/sponsored-intelligence/index.yaml +0 -0
  1022. /package/compliance/cache/{3.1.2 → 3.1.5}/protocols/sponsored-intelligence/sponsored-context-accountability.yaml +0 -0
  1023. /package/compliance/cache/{3.1.2 → 3.1.5}/specialisms/audience-sync/index.yaml +0 -0
  1024. /package/compliance/cache/{3.1.2 → 3.1.5}/specialisms/brand-rights/index.yaml +0 -0
  1025. /package/compliance/cache/{3.1.2 → 3.1.5}/specialisms/brand-rights/scenarios/governance_denied.yaml +0 -0
  1026. /package/compliance/cache/{3.1.2 → 3.1.5}/specialisms/collection-lists/index.yaml +0 -0
  1027. /package/compliance/cache/{3.1.2 → 3.1.5}/specialisms/content-standards/index.yaml +0 -0
  1028. /package/compliance/cache/{3.1.2 → 3.1.5}/specialisms/creative-ad-server/index.yaml +0 -0
  1029. /package/compliance/cache/{3.1.2 → 3.1.5}/specialisms/creative-generative/generative-seller.yaml +0 -0
  1030. /package/compliance/cache/{3.1.2 → 3.1.5}/specialisms/creative-generative/index.yaml +0 -0
  1031. /package/compliance/cache/{3.1.2 → 3.1.5}/specialisms/creative-template/index.yaml +0 -0
  1032. /package/compliance/cache/{3.1.2 → 3.1.5}/specialisms/creative-transformers/index.yaml +0 -0
  1033. /package/compliance/cache/{3.1.2 → 3.1.5}/specialisms/governance-aware-seller/index.yaml +0 -0
  1034. /package/compliance/cache/{3.1.2 → 3.1.5}/specialisms/governance-aware-seller/scenarios/governance_multi_agent_rejected.yaml +0 -0
  1035. /package/compliance/cache/{3.1.2 → 3.1.5}/specialisms/governance-delivery-monitor/index.yaml +0 -0
  1036. /package/compliance/cache/{3.1.2 → 3.1.5}/specialisms/governance-spend-authority/denied.yaml +0 -0
  1037. /package/compliance/cache/{3.1.2 → 3.1.5}/specialisms/governance-spend-authority/index.yaml +0 -0
  1038. /package/compliance/cache/{3.1.2 → 3.1.5}/specialisms/property-lists/index.yaml +0 -0
  1039. /package/compliance/cache/{3.1.2 → 3.1.5}/specialisms/sales-broadcast-tv/index.yaml +0 -0
  1040. /package/compliance/cache/{3.1.2 → 3.1.5}/specialisms/sales-catalog-driven/index.yaml +0 -0
  1041. /package/compliance/cache/{3.1.2 → 3.1.5}/specialisms/sales-guaranteed/index.yaml +0 -0
  1042. /package/compliance/cache/{3.1.2 → 3.1.5}/specialisms/sales-non-guaranteed/index.yaml +0 -0
  1043. /package/compliance/cache/{3.1.2 → 3.1.5}/specialisms/sales-proposal-mode/index.yaml +0 -0
  1044. /package/compliance/cache/{3.1.2 → 3.1.5}/specialisms/sales-social/index.yaml +0 -0
  1045. /package/compliance/cache/{3.1.2 → 3.1.5}/specialisms/signal-marketplace/index.yaml +0 -0
  1046. /package/compliance/cache/{3.1.2 → 3.1.5}/specialisms/signal-marketplace/scenarios/governance_denied.yaml +0 -0
  1047. /package/compliance/cache/{3.1.2 → 3.1.5}/specialisms/signal-owned/index.yaml +0 -0
  1048. /package/compliance/cache/{3.1.2 → 3.1.5}/specialisms/sponsored-intelligence/index.yaml +0 -0
  1049. /package/compliance/cache/{3.1.2 → 3.1.5}/test-kits/acme-outdoor-live.yaml +0 -0
  1050. /package/compliance/cache/{3.1.2 → 3.1.5}/test-kits/acme-outdoor.yaml +0 -0
  1051. /package/compliance/cache/{3.1.2 → 3.1.5}/test-kits/billing-gate-runner.yaml +0 -0
  1052. /package/compliance/cache/{3.1.2 → 3.1.5}/test-kits/bistro-oranje.yaml +0 -0
  1053. /package/compliance/cache/{3.1.2 → 3.1.5}/test-kits/distributed-brand-runner.yaml +0 -0
  1054. /package/compliance/cache/{3.1.2 → 3.1.5}/test-kits/nova-motors.yaml +0 -0
  1055. /package/compliance/cache/{3.1.2 → 3.1.5}/test-kits/osei-natural.yaml +0 -0
  1056. /package/compliance/cache/{3.1.2 → 3.1.5}/test-kits/signed-requests-runner.yaml +0 -0
  1057. /package/compliance/cache/{3.1.2 → 3.1.5}/test-kits/single-side-trust-runner.yaml +0 -0
  1058. /package/compliance/cache/{3.1.2 → 3.1.5}/test-kits/substitution-observer-runner.yaml +0 -0
  1059. /package/compliance/cache/{3.1.2 → 3.1.5}/test-kits/summit-foods.yaml +0 -0
  1060. /package/compliance/cache/{3.1.2 → 3.1.5}/test-kits/webhook-receiver-runner.yaml +0 -0
  1061. /package/compliance/cache/{3.1.2 → 3.1.5}/test-vectors/catalog-macro-substitution.json +0 -0
  1062. /package/compliance/cache/{3.1.2 → 3.1.5}/test-vectors/plan-hash/001-minimal-plan.json +0 -0
  1063. /package/compliance/cache/{3.1.2 → 3.1.5}/test-vectors/plan-hash/002-full-plan.json +0 -0
  1064. /package/compliance/cache/{3.1.2 → 3.1.5}/test-vectors/plan-hash/003-bookkeeping-stripped.json +0 -0
  1065. /package/compliance/cache/{3.1.2 → 3.1.5}/test-vectors/plan-hash/004a-human-review-omitted.json +0 -0
  1066. /package/compliance/cache/{3.1.2 → 3.1.5}/test-vectors/plan-hash/004b-human-review-explicit-null.json +0 -0
  1067. /package/compliance/cache/{3.1.2 → 3.1.5}/test-vectors/plan-hash/005a-policy-categories-order-1.json +0 -0
  1068. /package/compliance/cache/{3.1.2 → 3.1.5}/test-vectors/plan-hash/005b-policy-categories-order-2.json +0 -0
  1069. /package/compliance/cache/{3.1.2 → 3.1.5}/test-vectors/plan-hash/006a-ext-trace-v1.json +0 -0
  1070. /package/compliance/cache/{3.1.2 → 3.1.5}/test-vectors/plan-hash/006b-ext-trace-v2.json +0 -0
  1071. /package/compliance/cache/{3.1.2 → 3.1.5}/test-vectors/plan-hash/007-unicode-objectives.json +0 -0
  1072. /package/compliance/cache/{3.1.2 → 3.1.5}/test-vectors/plan-hash/008-numeric-canonicalization.json +0 -0
  1073. /package/compliance/cache/{3.1.2 → 3.1.5}/test-vectors/request-signing/README.md +0 -0
  1074. /package/compliance/cache/{3.1.2 → 3.1.5}/test-vectors/request-signing/canonicalization.json +0 -0
  1075. /package/compliance/cache/{3.1.2 → 3.1.5}/test-vectors/request-signing/keys.json +0 -0
  1076. /package/compliance/cache/{3.1.2 → 3.1.5}/test-vectors/request-signing/negative/001-no-signature-header.json +0 -0
  1077. /package/compliance/cache/{3.1.2 → 3.1.5}/test-vectors/request-signing/negative/002-wrong-tag.json +0 -0
  1078. /package/compliance/cache/{3.1.2 → 3.1.5}/test-vectors/request-signing/negative/003-expired-signature.json +0 -0
  1079. /package/compliance/cache/{3.1.2 → 3.1.5}/test-vectors/request-signing/negative/004-window-too-long.json +0 -0
  1080. /package/compliance/cache/{3.1.2 → 3.1.5}/test-vectors/request-signing/negative/005-alg-not-allowed.json +0 -0
  1081. /package/compliance/cache/{3.1.2 → 3.1.5}/test-vectors/request-signing/negative/006-missing-covered-component.json +0 -0
  1082. /package/compliance/cache/{3.1.2 → 3.1.5}/test-vectors/request-signing/negative/007-missing-content-digest.json +0 -0
  1083. /package/compliance/cache/{3.1.2 → 3.1.5}/test-vectors/request-signing/negative/008-unknown-keyid.json +0 -0
  1084. /package/compliance/cache/{3.1.2 → 3.1.5}/test-vectors/request-signing/negative/009-key-ops-missing-verify.json +0 -0
  1085. /package/compliance/cache/{3.1.2 → 3.1.5}/test-vectors/request-signing/negative/010-content-digest-mismatch.json +0 -0
  1086. /package/compliance/cache/{3.1.2 → 3.1.5}/test-vectors/request-signing/negative/011-malformed-header.json +0 -0
  1087. /package/compliance/cache/{3.1.2 → 3.1.5}/test-vectors/request-signing/negative/012-missing-expires-param.json +0 -0
  1088. /package/compliance/cache/{3.1.2 → 3.1.5}/test-vectors/request-signing/negative/013-expires-le-created.json +0 -0
  1089. /package/compliance/cache/{3.1.2 → 3.1.5}/test-vectors/request-signing/negative/014-missing-nonce-param.json +0 -0
  1090. /package/compliance/cache/{3.1.2 → 3.1.5}/test-vectors/request-signing/negative/015-signature-invalid.json +0 -0
  1091. /package/compliance/cache/{3.1.2 → 3.1.5}/test-vectors/request-signing/negative/016-replayed-nonce.json +0 -0
  1092. /package/compliance/cache/{3.1.2 → 3.1.5}/test-vectors/request-signing/negative/017-key-revoked.json +0 -0
  1093. /package/compliance/cache/{3.1.2 → 3.1.5}/test-vectors/request-signing/negative/018-digest-covered-when-forbidden.json +0 -0
  1094. /package/compliance/cache/{3.1.2 → 3.1.5}/test-vectors/request-signing/negative/019-signature-without-signature-input.json +0 -0
  1095. /package/compliance/cache/{3.1.2 → 3.1.5}/test-vectors/request-signing/negative/020-rate-abuse.json +0 -0
  1096. /package/compliance/cache/{3.1.2 → 3.1.5}/test-vectors/request-signing/negative/021-duplicate-signature-input-label.json +0 -0
  1097. /package/compliance/cache/{3.1.2 → 3.1.5}/test-vectors/request-signing/negative/022-multi-valued-content-type.json +0 -0
  1098. /package/compliance/cache/{3.1.2 → 3.1.5}/test-vectors/request-signing/negative/023-multi-valued-content-digest.json +0 -0
  1099. /package/compliance/cache/{3.1.2 → 3.1.5}/test-vectors/request-signing/negative/024-unquoted-string-param.json +0 -0
  1100. /package/compliance/cache/{3.1.2 → 3.1.5}/test-vectors/request-signing/negative/025-jwk-alg-crv-mismatch.json +0 -0
  1101. /package/compliance/cache/{3.1.2 → 3.1.5}/test-vectors/request-signing/negative/026-non-ascii-host.json +0 -0
  1102. /package/compliance/cache/{3.1.2 → 3.1.5}/test-vectors/request-signing/negative/027-webhook-registration-authentication-unsigned.json +0 -0
  1103. /package/compliance/cache/{3.1.2 → 3.1.5}/test-vectors/request-signing/negative/028-unsigned-protocol-method-required.json +0 -0
  1104. /package/compliance/cache/{3.1.2 → 3.1.5}/test-vectors/request-signing/positive/001-basic-post.json +0 -0
  1105. /package/compliance/cache/{3.1.2 → 3.1.5}/test-vectors/request-signing/positive/002-post-with-content-digest.json +0 -0
  1106. /package/compliance/cache/{3.1.2 → 3.1.5}/test-vectors/request-signing/positive/003-es256-post.json +0 -0
  1107. /package/compliance/cache/{3.1.2 → 3.1.5}/test-vectors/request-signing/positive/004-multiple-signature-labels.json +0 -0
  1108. /package/compliance/cache/{3.1.2 → 3.1.5}/test-vectors/request-signing/positive/005-default-port-stripped.json +0 -0
  1109. /package/compliance/cache/{3.1.2 → 3.1.5}/test-vectors/request-signing/positive/006-dot-segment-path.json +0 -0
  1110. /package/compliance/cache/{3.1.2 → 3.1.5}/test-vectors/request-signing/positive/007-query-byte-preserved.json +0 -0
  1111. /package/compliance/cache/{3.1.2 → 3.1.5}/test-vectors/request-signing/positive/008-percent-encoded-path.json +0 -0
  1112. /package/compliance/cache/{3.1.2 → 3.1.5}/test-vectors/request-signing/positive/009-percent-encoded-unreserved-decoded.json +0 -0
  1113. /package/compliance/cache/{3.1.2 → 3.1.5}/test-vectors/request-signing/positive/010-percent-encoded-slash-preserved.json +0 -0
  1114. /package/compliance/cache/{3.1.2 → 3.1.5}/test-vectors/request-signing/positive/011-ipv6-authority.json +0 -0
  1115. /package/compliance/cache/{3.1.2 → 3.1.5}/test-vectors/request-signing/positive/012-ipv6-authority-default-port-stripped.json +0 -0
  1116. /package/compliance/cache/{3.1.2 → 3.1.5}/test-vectors/webhook-receiver-envelope.json +0 -0
  1117. /package/compliance/cache/{3.1.2 → 3.1.5}/test-vectors/webhook-signing/README.md +0 -0
  1118. /package/compliance/cache/{3.1.2 → 3.1.5}/test-vectors/webhook-signing/keys.json +0 -0
  1119. /package/compliance/cache/{3.1.2 → 3.1.5}/test-vectors/webhook-signing/negative/001-wrong-tag.json +0 -0
  1120. /package/compliance/cache/{3.1.2 → 3.1.5}/test-vectors/webhook-signing/negative/002-expired-signature.json +0 -0
  1121. /package/compliance/cache/{3.1.2 → 3.1.5}/test-vectors/webhook-signing/negative/003-window-too-long.json +0 -0
  1122. /package/compliance/cache/{3.1.2 → 3.1.5}/test-vectors/webhook-signing/negative/004-alg-not-allowed.json +0 -0
  1123. /package/compliance/cache/{3.1.2 → 3.1.5}/test-vectors/webhook-signing/negative/005-missing-authority-component.json +0 -0
  1124. /package/compliance/cache/{3.1.2 → 3.1.5}/test-vectors/webhook-signing/negative/006-missing-content-digest.json +0 -0
  1125. /package/compliance/cache/{3.1.2 → 3.1.5}/test-vectors/webhook-signing/negative/007-unknown-keyid.json +0 -0
  1126. /package/compliance/cache/{3.1.2 → 3.1.5}/test-vectors/webhook-signing/negative/008-wrong-adcp-use.json +0 -0
  1127. /package/compliance/cache/{3.1.2 → 3.1.5}/test-vectors/webhook-signing/negative/009-content-digest-mismatch.json +0 -0
  1128. /package/compliance/cache/{3.1.2 → 3.1.5}/test-vectors/webhook-signing/negative/010-malformed-signature-input.json +0 -0
  1129. /package/compliance/cache/{3.1.2 → 3.1.5}/test-vectors/webhook-signing/negative/011-signature-without-input.json +0 -0
  1130. /package/compliance/cache/{3.1.2 → 3.1.5}/test-vectors/webhook-signing/negative/012-missing-expires-param.json +0 -0
  1131. /package/compliance/cache/{3.1.2 → 3.1.5}/test-vectors/webhook-signing/negative/013-expires-le-created.json +0 -0
  1132. /package/compliance/cache/{3.1.2 → 3.1.5}/test-vectors/webhook-signing/negative/014-missing-nonce-param.json +0 -0
  1133. /package/compliance/cache/{3.1.2 → 3.1.5}/test-vectors/webhook-signing/negative/015-signature-invalid.json +0 -0
  1134. /package/compliance/cache/{3.1.2 → 3.1.5}/test-vectors/webhook-signing/negative/016-replayed-nonce.json +0 -0
  1135. /package/compliance/cache/{3.1.2 → 3.1.5}/test-vectors/webhook-signing/negative/017-key-revoked.json +0 -0
  1136. /package/compliance/cache/{3.1.2 → 3.1.5}/test-vectors/webhook-signing/negative/018-rate-abuse.json +0 -0
  1137. /package/compliance/cache/{3.1.2 → 3.1.5}/test-vectors/webhook-signing/negative/019-revocation-stale.json +0 -0
  1138. /package/compliance/cache/{3.1.2 → 3.1.5}/test-vectors/webhook-signing/negative/020-key-ops-missing-verify.json +0 -0
  1139. /package/compliance/cache/{3.1.2 → 3.1.5}/test-vectors/webhook-signing/negative/021-base64-alphabet-mixing.json +0 -0
  1140. /package/compliance/cache/{3.1.2 → 3.1.5}/test-vectors/webhook-signing/positive/001-basic-post.json +0 -0
  1141. /package/compliance/cache/{3.1.2 → 3.1.5}/test-vectors/webhook-signing/positive/002-es256-post.json +0 -0
  1142. /package/compliance/cache/{3.1.2 → 3.1.5}/test-vectors/webhook-signing/positive/003-multiple-signature-labels.json +0 -0
  1143. /package/compliance/cache/{3.1.2 → 3.1.5}/test-vectors/webhook-signing/positive/004-default-port-stripped.json +0 -0
  1144. /package/compliance/cache/{3.1.2 → 3.1.5}/test-vectors/webhook-signing/positive/005-percent-encoded-path.json +0 -0
  1145. /package/compliance/cache/{3.1.2 → 3.1.5}/test-vectors/webhook-signing/positive/006-query-byte-preserved.json +0 -0
  1146. /package/compliance/cache/{3.1.2 → 3.1.5}/test-vectors/webhook-signing/positive/007-body-without-idempotency-key.json +0 -0
  1147. /package/compliance/cache/{3.1.2 → 3.1.5}/test-vectors/webhook-signing/positive/008-request-signing-key-reuse.json +0 -0
  1148. /package/compliance/cache/{3.1.2 → 3.1.5}/universal/billing-gate-dispatch.yaml +0 -0
  1149. /package/compliance/cache/{3.1.2 → 3.1.5}/universal/canonical-format-validate-input.yaml +0 -0
  1150. /package/compliance/cache/{3.1.2 → 3.1.5}/universal/capability-discovery.yaml +0 -0
  1151. /package/compliance/cache/{3.1.2 → 3.1.5}/universal/collection-lists-pagination-integrity.yaml +0 -0
  1152. /package/compliance/cache/{3.1.2 → 3.1.5}/universal/comply-controller-mode-gate.yaml +0 -0
  1153. /package/compliance/cache/{3.1.2 → 3.1.5}/universal/content-standards-pagination-integrity.yaml +0 -0
  1154. /package/compliance/cache/{3.1.2 → 3.1.5}/universal/deterministic-testing.yaml +0 -0
  1155. /package/compliance/cache/{3.1.2 → 3.1.5}/universal/error-compliance-signals.yaml +0 -0
  1156. /package/compliance/cache/{3.1.2 → 3.1.5}/universal/error-compliance.yaml +0 -0
  1157. /package/compliance/cache/{3.1.2 → 3.1.5}/universal/fictional-entities.yaml +0 -0
  1158. /package/compliance/cache/{3.1.2 → 3.1.5}/universal/get-media-buys-pagination-integrity.yaml +0 -0
  1159. /package/compliance/cache/{3.1.2 → 3.1.5}/universal/get-products-pagination-integrity.yaml +0 -0
  1160. /package/compliance/cache/{3.1.2 → 3.1.5}/universal/get-signals-pagination-integrity.yaml +0 -0
  1161. /package/compliance/cache/{3.1.2 → 3.1.5}/universal/notification-config-event-scope.yaml +0 -0
  1162. /package/compliance/cache/{3.1.2 → 3.1.5}/universal/notification-config-lifecycle.yaml +0 -0
  1163. /package/compliance/cache/{3.1.2 → 3.1.5}/universal/notification-config-rejections.yaml +0 -0
  1164. /package/compliance/cache/{3.1.2 → 3.1.5}/universal/pagination-integrity-creative-formats.yaml +0 -0
  1165. /package/compliance/cache/{3.1.2 → 3.1.5}/universal/pagination-integrity-list-accounts.yaml +0 -0
  1166. /package/compliance/cache/{3.1.2 → 3.1.5}/universal/pagination-integrity.yaml +0 -0
  1167. /package/compliance/cache/{3.1.2 → 3.1.5}/universal/property-lists-pagination-integrity.yaml +0 -0
  1168. /package/compliance/cache/{3.1.2 → 3.1.5}/universal/read-tool-idempotency.yaml +0 -0
  1169. /package/compliance/cache/{3.1.2 → 3.1.5}/universal/schema-validation-signals.yaml +0 -0
  1170. /package/compliance/cache/{3.1.2 → 3.1.5}/universal/schema-validation.yaml +0 -0
  1171. /package/compliance/cache/{3.1.2 → 3.1.5}/universal/security.yaml +0 -0
  1172. /package/compliance/cache/{3.1.2 → 3.1.5}/universal/signed-requests.yaml +0 -0
  1173. /package/compliance/cache/{3.1.2 → 3.1.5}/universal/stale-response-advisory.yaml +0 -0
  1174. /package/compliance/cache/{3.1.2 → 3.1.5}/universal/v3-envelope-integrity.yaml +0 -0
  1175. /package/compliance/cache/{3.1.2 → 3.1.5}/universal/version-negotiation.yaml +0 -0
  1176. /package/compliance/cache/{3.1.2 → 3.1.5}/universal/webhook-emission.yaml +0 -0
  1177. /package/compliance/cache/{3.1.2 → 3.1.5}/universal/webhook-receiver-envelope.yaml +0 -0
  1178. /package/compliance/cache/{3.1.2 → 3.1.5}/universal/wholesale-feed-bulk-webhooks.yaml +0 -0
  1179. /package/compliance/cache/{3.1.2 → 3.1.5}/universal/wholesale-feed-product-webhooks.yaml +0 -0
  1180. /package/compliance/cache/{3.1.2 → 3.1.5}/universal/wholesale-feed-products.yaml +0 -0
  1181. /package/compliance/cache/{3.1.2 → 3.1.5}/universal/wholesale-feed-signal-webhooks.yaml +0 -0
  1182. /package/compliance/cache/{3.1.2 → 3.1.5}/universal/wholesale-feed-signals.yaml +0 -0
  1183. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/domains/brand/index.yaml +0 -0
  1184. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/domains/brand/scenarios/distributed_brand_resolution.yaml +0 -0
  1185. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/domains/brand/scenarios/single_side_trust_extension.yaml +0 -0
  1186. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/domains/creative/index.yaml +0 -0
  1187. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/domains/creative/scenarios/billing_out_of_band.yaml +0 -0
  1188. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/domains/creative/scenarios/creative_lifecycle_webhooks.yaml +0 -0
  1189. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/domains/creative/scenarios/native_in_feed.yaml +0 -0
  1190. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/domains/governance/index.yaml +0 -0
  1191. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/domains/media-buy/index.yaml +0 -0
  1192. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/domains/media-buy/scenarios/audience_buy_flow.yaml +0 -0
  1193. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/domains/media-buy/scenarios/billing_finality_delivery.yaml +0 -0
  1194. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/domains/media-buy/scenarios/canonical_formats.yaml +0 -0
  1195. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/domains/media-buy/scenarios/clicks_buy_flow.yaml +0 -0
  1196. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/domains/media-buy/scenarios/completed_views_buy_flow.yaml +0 -0
  1197. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/domains/media-buy/scenarios/create_media_buy_async.yaml +0 -0
  1198. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/domains/media-buy/scenarios/creative_fate_after_cancellation.yaml +0 -0
  1199. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/domains/media-buy/scenarios/creative_reception.yaml +0 -0
  1200. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/domains/media-buy/scenarios/delivery_reporting.yaml +0 -0
  1201. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/domains/media-buy/scenarios/dependency_impairment.yaml +0 -0
  1202. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/domains/media-buy/scenarios/dependency_impairment_cardinality.yaml +0 -0
  1203. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/domains/media-buy/scenarios/event_dedup_flow.yaml +0 -0
  1204. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/domains/media-buy/scenarios/frequency_cap_enforcement.yaml +0 -0
  1205. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/domains/media-buy/scenarios/get_products_async.yaml +0 -0
  1206. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/domains/media-buy/scenarios/governance_approved.yaml +0 -0
  1207. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/domains/media-buy/scenarios/governance_conditions.yaml +0 -0
  1208. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/domains/media-buy/scenarios/governance_denied.yaml +0 -0
  1209. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/domains/media-buy/scenarios/governance_denied_recovery.yaml +0 -0
  1210. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/domains/media-buy/scenarios/inline_creatives_without_sync.yaml +0 -0
  1211. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/domains/media-buy/scenarios/invalid_transitions.yaml +0 -0
  1212. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/domains/media-buy/scenarios/measurement_accountability.yaml +0 -0
  1213. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/domains/media-buy/scenarios/measurement_terms_rejected.yaml +0 -0
  1214. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/domains/media-buy/scenarios/package_correlation_legacy_fallback.yaml +0 -0
  1215. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/domains/media-buy/scenarios/pending_creatives_to_start.yaml +0 -0
  1216. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/domains/media-buy/scenarios/per_creative_conversion_attribution.yaml +0 -0
  1217. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/domains/media-buy/scenarios/performance_buy_flow.yaml +0 -0
  1218. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/domains/media-buy/scenarios/performance_buy_flow_roas.yaml +0 -0
  1219. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/domains/media-buy/scenarios/pricing_currency_filter.yaml +0 -0
  1220. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/domains/media-buy/scenarios/product_signal_targeting.yaml +0 -0
  1221. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/domains/media-buy/scenarios/proposal_finalize.yaml +0 -0
  1222. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/domains/media-buy/scenarios/proposal_finalize_asap_timing.yaml +0 -0
  1223. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/domains/media-buy/scenarios/proposal_not_found_errors.yaml +0 -0
  1224. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/domains/media-buy/scenarios/provenance_audit_observation.yaml +0 -0
  1225. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/domains/media-buy/scenarios/provenance_enforcement.yaml +0 -0
  1226. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/domains/media-buy/scenarios/provenance_truth_of_claim.yaml +0 -0
  1227. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/domains/media-buy/scenarios/reach_buy_flow.yaml +0 -0
  1228. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/domains/media-buy/scenarios/refine_finalize_exclusivity.yaml +0 -0
  1229. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/domains/media-buy/scenarios/refine_products.yaml +0 -0
  1230. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/domains/media-buy/scenarios/vendor_metric_accountability.yaml +0 -0
  1231. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/domains/media-buy/scenarios/vendor_metric_catalog_precondition.yaml +0 -0
  1232. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/domains/media-buy/scenarios/vendor_metric_optimization_flow.yaml +0 -0
  1233. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/domains/media-buy/state-machine.yaml +0 -0
  1234. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/domains/signals/index.yaml +0 -0
  1235. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/domains/signals/scenarios/get_signals_async.yaml +0 -0
  1236. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/domains/sponsored-intelligence/index.yaml +0 -0
  1237. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/domains/sponsored-intelligence/sponsored-context-accountability.yaml +0 -0
  1238. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/protocols/brand/index.yaml +0 -0
  1239. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/protocols/brand/scenarios/distributed_brand_resolution.yaml +0 -0
  1240. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/protocols/brand/scenarios/single_side_trust_extension.yaml +0 -0
  1241. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/protocols/creative/index.yaml +0 -0
  1242. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/protocols/creative/scenarios/billing_out_of_band.yaml +0 -0
  1243. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/protocols/creative/scenarios/creative_lifecycle_webhooks.yaml +0 -0
  1244. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/protocols/creative/scenarios/native_in_feed.yaml +0 -0
  1245. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/protocols/governance/index.yaml +0 -0
  1246. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/protocols/media-buy/index.yaml +0 -0
  1247. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/protocols/media-buy/scenarios/audience_buy_flow.yaml +0 -0
  1248. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/protocols/media-buy/scenarios/billing_finality_delivery.yaml +0 -0
  1249. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/protocols/media-buy/scenarios/canonical_formats.yaml +0 -0
  1250. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/protocols/media-buy/scenarios/clicks_buy_flow.yaml +0 -0
  1251. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/protocols/media-buy/scenarios/completed_views_buy_flow.yaml +0 -0
  1252. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/protocols/media-buy/scenarios/create_media_buy_async.yaml +0 -0
  1253. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/protocols/media-buy/scenarios/creative_fate_after_cancellation.yaml +0 -0
  1254. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/protocols/media-buy/scenarios/creative_reception.yaml +0 -0
  1255. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/protocols/media-buy/scenarios/delivery_reporting.yaml +0 -0
  1256. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/protocols/media-buy/scenarios/dependency_impairment.yaml +0 -0
  1257. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/protocols/media-buy/scenarios/dependency_impairment_cardinality.yaml +0 -0
  1258. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/protocols/media-buy/scenarios/event_dedup_flow.yaml +0 -0
  1259. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/protocols/media-buy/scenarios/frequency_cap_enforcement.yaml +0 -0
  1260. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/protocols/media-buy/scenarios/get_products_async.yaml +0 -0
  1261. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/protocols/media-buy/scenarios/governance_approved.yaml +0 -0
  1262. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/protocols/media-buy/scenarios/governance_conditions.yaml +0 -0
  1263. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/protocols/media-buy/scenarios/governance_denied.yaml +0 -0
  1264. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/protocols/media-buy/scenarios/governance_denied_recovery.yaml +0 -0
  1265. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/protocols/media-buy/scenarios/inline_creatives_without_sync.yaml +0 -0
  1266. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/protocols/media-buy/scenarios/invalid_transitions.yaml +0 -0
  1267. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/protocols/media-buy/scenarios/measurement_accountability.yaml +0 -0
  1268. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/protocols/media-buy/scenarios/measurement_terms_rejected.yaml +0 -0
  1269. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/protocols/media-buy/scenarios/package_correlation_legacy_fallback.yaml +0 -0
  1270. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/protocols/media-buy/scenarios/pending_creatives_to_start.yaml +0 -0
  1271. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/protocols/media-buy/scenarios/per_creative_conversion_attribution.yaml +0 -0
  1272. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/protocols/media-buy/scenarios/performance_buy_flow.yaml +0 -0
  1273. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/protocols/media-buy/scenarios/performance_buy_flow_roas.yaml +0 -0
  1274. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/protocols/media-buy/scenarios/pricing_currency_filter.yaml +0 -0
  1275. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/protocols/media-buy/scenarios/product_signal_targeting.yaml +0 -0
  1276. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/protocols/media-buy/scenarios/proposal_finalize.yaml +0 -0
  1277. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/protocols/media-buy/scenarios/proposal_finalize_asap_timing.yaml +0 -0
  1278. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/protocols/media-buy/scenarios/proposal_not_found_errors.yaml +0 -0
  1279. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/protocols/media-buy/scenarios/provenance_audit_observation.yaml +0 -0
  1280. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/protocols/media-buy/scenarios/provenance_enforcement.yaml +0 -0
  1281. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/protocols/media-buy/scenarios/provenance_truth_of_claim.yaml +0 -0
  1282. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/protocols/media-buy/scenarios/reach_buy_flow.yaml +0 -0
  1283. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/protocols/media-buy/scenarios/refine_finalize_exclusivity.yaml +0 -0
  1284. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/protocols/media-buy/scenarios/refine_products.yaml +0 -0
  1285. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/protocols/media-buy/scenarios/vendor_metric_accountability.yaml +0 -0
  1286. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/protocols/media-buy/scenarios/vendor_metric_catalog_precondition.yaml +0 -0
  1287. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/protocols/media-buy/scenarios/vendor_metric_optimization_flow.yaml +0 -0
  1288. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/protocols/media-buy/state-machine.yaml +0 -0
  1289. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/protocols/signals/index.yaml +0 -0
  1290. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/protocols/signals/scenarios/get_signals_async.yaml +0 -0
  1291. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/protocols/sponsored-intelligence/index.yaml +0 -0
  1292. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/protocols/sponsored-intelligence/sponsored-context-accountability.yaml +0 -0
  1293. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/specialisms/audience-sync/index.yaml +0 -0
  1294. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/specialisms/brand-rights/index.yaml +0 -0
  1295. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/specialisms/brand-rights/scenarios/governance_denied.yaml +0 -0
  1296. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/specialisms/collection-lists/index.yaml +0 -0
  1297. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/specialisms/content-standards/index.yaml +0 -0
  1298. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/specialisms/creative-ad-server/index.yaml +0 -0
  1299. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/specialisms/creative-generative/generative-seller.yaml +0 -0
  1300. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/specialisms/creative-generative/index.yaml +0 -0
  1301. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/specialisms/creative-template/index.yaml +0 -0
  1302. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/specialisms/creative-transformers/index.yaml +0 -0
  1303. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/specialisms/governance-aware-seller/index.yaml +0 -0
  1304. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/specialisms/governance-aware-seller/scenarios/governance_multi_agent_rejected.yaml +0 -0
  1305. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/specialisms/governance-delivery-monitor/index.yaml +0 -0
  1306. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/specialisms/governance-spend-authority/denied.yaml +0 -0
  1307. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/specialisms/governance-spend-authority/index.yaml +0 -0
  1308. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/specialisms/property-lists/index.yaml +0 -0
  1309. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/specialisms/sales-broadcast-tv/index.yaml +0 -0
  1310. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/specialisms/sales-catalog-driven/index.yaml +0 -0
  1311. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/specialisms/sales-guaranteed/index.yaml +0 -0
  1312. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/specialisms/sales-non-guaranteed/index.yaml +0 -0
  1313. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/specialisms/sales-proposal-mode/index.yaml +0 -0
  1314. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/specialisms/sales-social/index.yaml +0 -0
  1315. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/specialisms/signal-marketplace/index.yaml +0 -0
  1316. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/specialisms/signal-marketplace/scenarios/governance_denied.yaml +0 -0
  1317. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/specialisms/signal-owned/index.yaml +0 -0
  1318. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/specialisms/sponsored-intelligence/index.yaml +0 -0
  1319. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/test-kits/acme-outdoor-live.yaml +0 -0
  1320. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/test-kits/acme-outdoor.yaml +0 -0
  1321. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/test-kits/billing-gate-runner.yaml +0 -0
  1322. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/test-kits/bistro-oranje.yaml +0 -0
  1323. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/test-kits/distributed-brand-runner.yaml +0 -0
  1324. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/test-kits/nova-motors.yaml +0 -0
  1325. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/test-kits/osei-natural.yaml +0 -0
  1326. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/test-kits/signed-requests-runner.yaml +0 -0
  1327. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/test-kits/single-side-trust-runner.yaml +0 -0
  1328. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/test-kits/substitution-observer-runner.yaml +0 -0
  1329. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/test-kits/summit-foods.yaml +0 -0
  1330. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/test-kits/webhook-receiver-runner.yaml +0 -0
  1331. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/test-vectors/catalog-macro-substitution.json +0 -0
  1332. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/test-vectors/plan-hash/001-minimal-plan.json +0 -0
  1333. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/test-vectors/plan-hash/002-full-plan.json +0 -0
  1334. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/test-vectors/plan-hash/003-bookkeeping-stripped.json +0 -0
  1335. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/test-vectors/plan-hash/004a-human-review-omitted.json +0 -0
  1336. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/test-vectors/plan-hash/004b-human-review-explicit-null.json +0 -0
  1337. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/test-vectors/plan-hash/005a-policy-categories-order-1.json +0 -0
  1338. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/test-vectors/plan-hash/005b-policy-categories-order-2.json +0 -0
  1339. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/test-vectors/plan-hash/006a-ext-trace-v1.json +0 -0
  1340. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/test-vectors/plan-hash/006b-ext-trace-v2.json +0 -0
  1341. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/test-vectors/plan-hash/007-unicode-objectives.json +0 -0
  1342. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/test-vectors/plan-hash/008-numeric-canonicalization.json +0 -0
  1343. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/test-vectors/request-signing/README.md +0 -0
  1344. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/test-vectors/request-signing/canonicalization.json +0 -0
  1345. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/test-vectors/request-signing/keys.json +0 -0
  1346. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/test-vectors/request-signing/negative/001-no-signature-header.json +0 -0
  1347. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/test-vectors/request-signing/negative/002-wrong-tag.json +0 -0
  1348. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/test-vectors/request-signing/negative/003-expired-signature.json +0 -0
  1349. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/test-vectors/request-signing/negative/004-window-too-long.json +0 -0
  1350. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/test-vectors/request-signing/negative/005-alg-not-allowed.json +0 -0
  1351. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/test-vectors/request-signing/negative/006-missing-covered-component.json +0 -0
  1352. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/test-vectors/request-signing/negative/007-missing-content-digest.json +0 -0
  1353. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/test-vectors/request-signing/negative/008-unknown-keyid.json +0 -0
  1354. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/test-vectors/request-signing/negative/009-key-ops-missing-verify.json +0 -0
  1355. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/test-vectors/request-signing/negative/010-content-digest-mismatch.json +0 -0
  1356. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/test-vectors/request-signing/negative/011-malformed-header.json +0 -0
  1357. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/test-vectors/request-signing/negative/012-missing-expires-param.json +0 -0
  1358. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/test-vectors/request-signing/negative/013-expires-le-created.json +0 -0
  1359. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/test-vectors/request-signing/negative/014-missing-nonce-param.json +0 -0
  1360. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/test-vectors/request-signing/negative/015-signature-invalid.json +0 -0
  1361. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/test-vectors/request-signing/negative/016-replayed-nonce.json +0 -0
  1362. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/test-vectors/request-signing/negative/017-key-revoked.json +0 -0
  1363. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/test-vectors/request-signing/negative/018-digest-covered-when-forbidden.json +0 -0
  1364. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/test-vectors/request-signing/negative/019-signature-without-signature-input.json +0 -0
  1365. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/test-vectors/request-signing/negative/020-rate-abuse.json +0 -0
  1366. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/test-vectors/request-signing/negative/021-duplicate-signature-input-label.json +0 -0
  1367. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/test-vectors/request-signing/negative/022-multi-valued-content-type.json +0 -0
  1368. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/test-vectors/request-signing/negative/023-multi-valued-content-digest.json +0 -0
  1369. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/test-vectors/request-signing/negative/024-unquoted-string-param.json +0 -0
  1370. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/test-vectors/request-signing/negative/025-jwk-alg-crv-mismatch.json +0 -0
  1371. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/test-vectors/request-signing/negative/026-non-ascii-host.json +0 -0
  1372. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/test-vectors/request-signing/negative/027-webhook-registration-authentication-unsigned.json +0 -0
  1373. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/test-vectors/request-signing/negative/028-unsigned-protocol-method-required.json +0 -0
  1374. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/test-vectors/request-signing/positive/001-basic-post.json +0 -0
  1375. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/test-vectors/request-signing/positive/002-post-with-content-digest.json +0 -0
  1376. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/test-vectors/request-signing/positive/003-es256-post.json +0 -0
  1377. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/test-vectors/request-signing/positive/004-multiple-signature-labels.json +0 -0
  1378. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/test-vectors/request-signing/positive/005-default-port-stripped.json +0 -0
  1379. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/test-vectors/request-signing/positive/006-dot-segment-path.json +0 -0
  1380. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/test-vectors/request-signing/positive/007-query-byte-preserved.json +0 -0
  1381. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/test-vectors/request-signing/positive/008-percent-encoded-path.json +0 -0
  1382. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/test-vectors/request-signing/positive/009-percent-encoded-unreserved-decoded.json +0 -0
  1383. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/test-vectors/request-signing/positive/010-percent-encoded-slash-preserved.json +0 -0
  1384. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/test-vectors/request-signing/positive/011-ipv6-authority.json +0 -0
  1385. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/test-vectors/request-signing/positive/012-ipv6-authority-default-port-stripped.json +0 -0
  1386. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/test-vectors/webhook-receiver-envelope.json +0 -0
  1387. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/test-vectors/webhook-signing/README.md +0 -0
  1388. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/test-vectors/webhook-signing/keys.json +0 -0
  1389. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/test-vectors/webhook-signing/negative/001-wrong-tag.json +0 -0
  1390. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/test-vectors/webhook-signing/negative/002-expired-signature.json +0 -0
  1391. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/test-vectors/webhook-signing/negative/003-window-too-long.json +0 -0
  1392. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/test-vectors/webhook-signing/negative/004-alg-not-allowed.json +0 -0
  1393. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/test-vectors/webhook-signing/negative/005-missing-authority-component.json +0 -0
  1394. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/test-vectors/webhook-signing/negative/006-missing-content-digest.json +0 -0
  1395. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/test-vectors/webhook-signing/negative/007-unknown-keyid.json +0 -0
  1396. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/test-vectors/webhook-signing/negative/008-wrong-adcp-use.json +0 -0
  1397. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/test-vectors/webhook-signing/negative/009-content-digest-mismatch.json +0 -0
  1398. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/test-vectors/webhook-signing/negative/010-malformed-signature-input.json +0 -0
  1399. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/test-vectors/webhook-signing/negative/011-signature-without-input.json +0 -0
  1400. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/test-vectors/webhook-signing/negative/012-missing-expires-param.json +0 -0
  1401. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/test-vectors/webhook-signing/negative/013-expires-le-created.json +0 -0
  1402. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/test-vectors/webhook-signing/negative/014-missing-nonce-param.json +0 -0
  1403. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/test-vectors/webhook-signing/negative/015-signature-invalid.json +0 -0
  1404. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/test-vectors/webhook-signing/negative/016-replayed-nonce.json +0 -0
  1405. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/test-vectors/webhook-signing/negative/017-key-revoked.json +0 -0
  1406. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/test-vectors/webhook-signing/negative/018-rate-abuse.json +0 -0
  1407. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/test-vectors/webhook-signing/negative/019-revocation-stale.json +0 -0
  1408. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/test-vectors/webhook-signing/negative/020-key-ops-missing-verify.json +0 -0
  1409. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/test-vectors/webhook-signing/negative/021-base64-alphabet-mixing.json +0 -0
  1410. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/test-vectors/webhook-signing/positive/001-basic-post.json +0 -0
  1411. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/test-vectors/webhook-signing/positive/002-es256-post.json +0 -0
  1412. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/test-vectors/webhook-signing/positive/003-multiple-signature-labels.json +0 -0
  1413. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/test-vectors/webhook-signing/positive/004-default-port-stripped.json +0 -0
  1414. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/test-vectors/webhook-signing/positive/005-percent-encoded-path.json +0 -0
  1415. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/test-vectors/webhook-signing/positive/006-query-byte-preserved.json +0 -0
  1416. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/test-vectors/webhook-signing/positive/007-body-without-idempotency-key.json +0 -0
  1417. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/test-vectors/webhook-signing/positive/008-request-signing-key-reuse.json +0 -0
  1418. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/universal/billing-gate-dispatch.yaml +0 -0
  1419. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/universal/canonical-format-validate-input.yaml +0 -0
  1420. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/universal/capability-discovery.yaml +0 -0
  1421. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/universal/collection-lists-pagination-integrity.yaml +0 -0
  1422. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/universal/comply-controller-mode-gate.yaml +0 -0
  1423. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/universal/content-standards-pagination-integrity.yaml +0 -0
  1424. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/universal/deterministic-testing.yaml +0 -0
  1425. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/universal/error-compliance-signals.yaml +0 -0
  1426. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/universal/error-compliance.yaml +0 -0
  1427. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/universal/fictional-entities.yaml +0 -0
  1428. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/universal/get-media-buys-pagination-integrity.yaml +0 -0
  1429. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/universal/get-products-pagination-integrity.yaml +0 -0
  1430. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/universal/get-signals-pagination-integrity.yaml +0 -0
  1431. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/universal/notification-config-event-scope.yaml +0 -0
  1432. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/universal/notification-config-lifecycle.yaml +0 -0
  1433. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/universal/notification-config-rejections.yaml +0 -0
  1434. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/universal/pagination-integrity-creative-formats.yaml +0 -0
  1435. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/universal/pagination-integrity-list-accounts.yaml +0 -0
  1436. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/universal/pagination-integrity.yaml +0 -0
  1437. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/universal/property-lists-pagination-integrity.yaml +0 -0
  1438. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/universal/read-tool-idempotency.yaml +0 -0
  1439. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/universal/schema-validation-signals.yaml +0 -0
  1440. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/universal/schema-validation.yaml +0 -0
  1441. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/universal/security.yaml +0 -0
  1442. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/universal/signed-requests.yaml +0 -0
  1443. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/universal/stale-response-advisory.yaml +0 -0
  1444. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/universal/v3-envelope-integrity.yaml +0 -0
  1445. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/universal/version-negotiation.yaml +0 -0
  1446. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/universal/webhook-emission.yaml +0 -0
  1447. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/universal/webhook-receiver-envelope.yaml +0 -0
  1448. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/universal/wholesale-feed-bulk-webhooks.yaml +0 -0
  1449. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/universal/wholesale-feed-product-webhooks.yaml +0 -0
  1450. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/universal/wholesale-feed-products.yaml +0 -0
  1451. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/universal/wholesale-feed-signal-webhooks.yaml +0 -0
  1452. /package/compliance/cache/{3.1.2.previous → 3.1.5.previous}/universal/wholesale-feed-signals.yaml +0 -0
@@ -60,6 +60,16 @@ export interface SsrfFetchOptions {
60
60
  maxBodyBytes?: number;
61
61
  /** Caller-provided abort signal, composed with the internal timeout. */
62
62
  signal?: AbortSignal;
63
+ /**
64
+ * Trusted scoped fetch implementation. URL validation and address
65
+ * classification still run before invocation, but DNS pinning is delegated
66
+ * to this implementation because custom fetchers do not accept undici
67
+ * dispatchers. The caller MUST enforce DNS-rebinding protection itself.
68
+ *
69
+ * This deliberately explicit name prevents callers from mistaking a custom
70
+ * transport for the internally DNS-pinned path.
71
+ */
72
+ trustedFetchFn?: typeof fetch;
63
73
  }
64
74
  export interface SsrfFetchResult {
65
75
  url: string;
@@ -68,9 +78,11 @@ export interface SsrfFetchResult {
68
78
  headers: Record<string, string>;
69
79
  /** Raw response body bytes (empty Uint8Array if no body). */
70
80
  body: Uint8Array;
71
- /** The IP address we pinned the outbound connection to. */
81
+ /** The validated IP address. The connection used it only when `connectionPinned` is true. */
72
82
  pinnedAddress: string;
73
83
  pinnedFamily: 4 | 6;
84
+ /** Whether the internal undici dispatcher pinned the connection to `pinnedAddress`. */
85
+ connectionPinned: boolean;
74
86
  }
75
87
  /**
76
88
  * GET/POST/etc. a URL with SSRF guarding + DNS pinning. Throws
@@ -1 +1 @@
1
- {"version":3,"file":"ssrf-fetch.d.ts","sourceRoot":"","sources":["../../../src/lib/net/ssrf-fetch.ts"],"names":[],"mappings":"AAyCA,MAAM,MAAM,eAAe,GACvB,aAAa,GACb,oBAAoB,GACpB,0BAA0B,GAC1B,mBAAmB,GACnB,WAAW,GACX,wBAAwB,GACxB,iBAAiB,GACjB,oBAAoB,CAAC;AAEzB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,eAAO,MAAM,oBAAoB,EAAE,WAAW,CAAC,eAAe,CAI5D,CAAC;AAEH;;;;;GAKG;AACH,qBAAa,gBAAiB,SAAQ,KAAK;IACzC,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAC;IAC/B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;gBAEd,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE;CAQ/G;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,4DAA4D;IAC5D,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,IAAI,CAAC,EAAE,MAAM,GAAG,UAAU,CAAC;IAC3B,mEAAmE;IACnE,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,8EAA8E;IAC9E,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,uDAAuD;IACvD,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,wEAAwE;IACxE,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,oCAAoC;IACpC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,6DAA6D;IAC7D,IAAI,EAAE,UAAU,CAAC;IACjB,2DAA2D;IAC3D,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,CAAC,GAAG,CAAC,CAAC;CACrB;AAED;;;;GAIG;AACH,wBAAsB,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE,gBAAqB,GAAG,OAAO,CAAC,eAAe,CAAC,CAwKzG;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAWjG"}
1
+ {"version":3,"file":"ssrf-fetch.d.ts","sourceRoot":"","sources":["../../../src/lib/net/ssrf-fetch.ts"],"names":[],"mappings":"AAyCA,MAAM,MAAM,eAAe,GACvB,aAAa,GACb,oBAAoB,GACpB,0BAA0B,GAC1B,mBAAmB,GACnB,WAAW,GACX,wBAAwB,GACxB,iBAAiB,GACjB,oBAAoB,CAAC;AAEzB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,eAAO,MAAM,oBAAoB,EAAE,WAAW,CAAC,eAAe,CAI5D,CAAC;AAEH;;;;;GAKG;AACH,qBAAa,gBAAiB,SAAQ,KAAK;IACzC,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAC;IAC/B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;gBAEd,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE;CAQ/G;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,4DAA4D;IAC5D,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,IAAI,CAAC,EAAE,MAAM,GAAG,UAAU,CAAC;IAC3B,mEAAmE;IACnE,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,8EAA8E;IAC9E,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,uDAAuD;IACvD,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,wEAAwE;IACxE,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB;;;;;;;;OAQG;IACH,cAAc,CAAC,EAAE,OAAO,KAAK,CAAC;CAC/B;AAED,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,oCAAoC;IACpC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,6DAA6D;IAC7D,IAAI,EAAE,UAAU,CAAC;IACjB,6FAA6F;IAC7F,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,CAAC,GAAG,CAAC,CAAC;IACpB,uFAAuF;IACvF,gBAAgB,EAAE,OAAO,CAAC;CAC3B;AAED;;;;GAIG;AACH,wBAAsB,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE,gBAAqB,GAAG,OAAO,CAAC,eAAe,CAAC,CAgLzG;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAWjG"}
@@ -131,15 +131,20 @@ async function ssrfSafeFetch(url, options = {}) {
131
131
  options.signal?.addEventListener("abort", onExternalAbort, { once: true });
132
132
  const timer = setTimeout(() => ac.abort(new Error("ssrf-fetch: timeout")), timeoutMs);
133
133
  try {
134
- const init = {
134
+ const res = options.trustedFetchFn ? await options.trustedFetchFn(url, {
135
135
  method: options.method ?? "GET",
136
136
  redirect: "manual",
137
137
  signal: ac.signal,
138
138
  headers: options.headers,
139
- dispatcher
140
- };
141
- if (options.body !== void 0) init.body = options.body;
142
- const res = await (0, import_undici.fetch)(url, init);
139
+ ...options.body !== void 0 && { body: options.body }
140
+ }) : await (0, import_undici.fetch)(url, {
141
+ method: options.method ?? "GET",
142
+ redirect: "manual",
143
+ signal: ac.signal,
144
+ headers: options.headers,
145
+ dispatcher,
146
+ ...options.body !== void 0 && { body: options.body }
147
+ });
143
148
  const headers = {};
144
149
  res.headers.forEach((v, k) => {
145
150
  headers[k.toLowerCase()] = v;
@@ -152,7 +157,8 @@ async function ssrfSafeFetch(url, options = {}) {
152
157
  headers,
153
158
  body: new Uint8Array(),
154
159
  pinnedAddress: pinned.address,
155
- pinnedFamily
160
+ pinnedFamily,
161
+ connectionPinned: !options.trustedFetchFn
156
162
  };
157
163
  }
158
164
  const chunks = [];
@@ -183,7 +189,8 @@ async function ssrfSafeFetch(url, options = {}) {
183
189
  headers,
184
190
  body: buf,
185
191
  pinnedAddress: pinned.address,
186
- pinnedFamily
192
+ pinnedFamily,
193
+ connectionPinned: !options.trustedFetchFn
187
194
  };
188
195
  } finally {
189
196
  clearTimeout(timer);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/lib/net/ssrf-fetch.ts"],"sourcesContent":["/**\n * SSRF-safe HTTP fetch primitive.\n *\n * Used by compliance probes, storyboard runners, and (future) JWKS /\n * revocation-list resolvers — anywhere the library dispatches a request to a\n * URL that came from counterparty-controlled data and therefore might point at\n * the host's private network or a cloud metadata endpoint.\n *\n * Guarantees:\n * - Scheme: only `https:` by default; `http:` allowed under the dev-opt-in\n * `allowPrivateIp` flag. `file:`, `ftp:`, `data:`, etc. are always refused.\n * - DNS: resolves every A/AAAA record once, validates the full set, then\n * pins the outbound connection to the first validated address via an\n * undici `Agent` whose `connect.lookup` returns the pinned tuple.\n * Defeats DNS rebinding (attacker returns a public address to the guard\n * lookup and a private address to the connect-time lookup) and any other\n * TOCTOU gap between validation and connect.\n * - IMDS (`169.254.169.254`, `fe80::`) stays refused even under\n * `allowPrivateIp` — cloud metadata exfiltration is never a legitimate\n * dev-loop use case.\n * - Redirects are not followed (`redirect: 'manual'`). The 3xx response is\n * returned with `Location` populated so callers can inspect it, but they\n * MUST NOT re-dispatch to the `Location` URL themselves — that bypasses\n * every guard above. To follow a redirect safely, re-invoke\n * `ssrfSafeFetch` with the new URL so it runs through validation again.\n * - Response body is buffered up to `maxBodyBytes` (default 64 KiB) and\n * returned as raw bytes; the dispatcher is torn down after reading so\n * connection-reuse can't carry an attacker-controlled keepalive.\n *\n * Returns a fully-buffered result. Callers that need streaming or large bodies\n * should extend this primitive rather than bypass it.\n */\nimport { type LookupAddress, type LookupOptions } from 'dns';\nimport { lookup as dnsLookupAsync } from 'dns/promises';\nimport { Agent, fetch as undiciFetch } from 'undici';\nimport { isAlwaysBlocked, isPrivateIp } from './address-guards';\n\nconst DEFAULT_TIMEOUT_MS = 10_000;\nconst DEFAULT_MAX_BODY_BYTES = 64 * 1024;\nconst ALLOWED_SCHEMES = new Set(['https:', 'http:']);\n\nexport type SsrfRefusedCode =\n | 'invalid_url'\n | 'scheme_not_allowed'\n | 'non_https_without_opt_in'\n | 'dns_lookup_failed'\n | 'dns_empty'\n | 'always_blocked_address'\n | 'private_address'\n | 'body_exceeds_limit';\n\n/**\n * SSRF refusal codes that indicate runtime/network conditions rather than\n * policy refusal. Callers that want to fall back to a \"host unreachable\" or\n * \"treat as unknown\" path on these codes — rather than surfacing the\n * SsrfRefusedError to their own caller — can intersect against this set:\n *\n * ```ts\n * if (err instanceof SsrfRefusedError && SSRF_TRANSIENT_CODES.has(err.code)) {\n * // network condition, not a policy attack — treat as unreachable\n * } else if (err instanceof SsrfRefusedError) {\n * // policy refusal — must propagate; silently downgrading to \"unreachable\"\n * // reintroduces the catch-swallow class flagged in adcp-client#1618 review\n * throw err;\n * }\n * ```\n *\n * - `dns_lookup_failed`, `dns_empty`: name does not resolve. CLI fixtures\n * use `*.example.invalid` to provoke these — preserving the runtime-error\n * path matches pre-`ssrfSafeFetch` native-fetch behavior.\n * - `body_exceeds_limit`: response started OK (validated address, scheme,\n * etc.) but exceeded the caller's defensive cap. The host is real and\n * knows the URL; classifying as \"policy attack\" would be a misread.\n *\n * NOT in this set: `always_blocked_address`, `private_address`,\n * `scheme_not_allowed`, `non_https_without_opt_in`, `invalid_url`. Those\n * are policy refusals — silently downgrading them to \"unreachable\" or\n * \"suspect\" reintroduces the SSRF gap the gate was added to close.\n *\n * Added in adcp-client#1633.\n */\nexport const SSRF_TRANSIENT_CODES: ReadonlySet<SsrfRefusedCode> = new Set([\n 'dns_lookup_failed',\n 'dns_empty',\n 'body_exceeds_limit',\n]);\n\n/**\n * Thrown when the SSRF guard refuses a request before (or during) the fetch.\n * Network failures after the guard passes are not wrapped in this type —\n * callers that want to distinguish \"we refused this\" from \"the remote broke\"\n * can `instanceof SsrfRefusedError` the catch.\n */\nexport class SsrfRefusedError extends Error {\n readonly code: SsrfRefusedCode;\n readonly url: string;\n readonly hostname?: string;\n readonly address?: string;\n\n constructor(code: SsrfRefusedCode, message: string, meta: { url: string; hostname?: string; address?: string }) {\n super(message);\n this.name = 'SsrfRefusedError';\n this.code = code;\n this.url = meta.url;\n this.hostname = meta.hostname;\n this.address = meta.address;\n }\n}\n\nexport interface SsrfFetchOptions {\n method?: string;\n /** Lowercased keys preferred; values preserved verbatim. */\n headers?: Record<string, string>;\n body?: string | Uint8Array;\n /** Allow `http://` and private/loopback targets. Default false. */\n allowPrivateIp?: boolean;\n /** Overall timeout including DNS + connect + body read. Default 10_000 ms. */\n timeoutMs?: number;\n /** Hard cap on response body bytes. Default 64 KiB. */\n maxBodyBytes?: number;\n /** Caller-provided abort signal, composed with the internal timeout. */\n signal?: AbortSignal;\n}\n\nexport interface SsrfFetchResult {\n url: string;\n status: number;\n /** Response headers, lowercased. */\n headers: Record<string, string>;\n /** Raw response body bytes (empty Uint8Array if no body). */\n body: Uint8Array;\n /** The IP address we pinned the outbound connection to. */\n pinnedAddress: string;\n pinnedFamily: 4 | 6;\n}\n\n/**\n * GET/POST/etc. a URL with SSRF guarding + DNS pinning. Throws\n * {@link SsrfRefusedError} when the guard refuses; other errors (network\n * timeouts, remote resets) propagate as the native fetch error.\n */\nexport async function ssrfSafeFetch(url: string, options: SsrfFetchOptions = {}): Promise<SsrfFetchResult> {\n const allowPrivateIp = options.allowPrivateIp === true;\n const timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n const maxBodyBytes = options.maxBodyBytes ?? DEFAULT_MAX_BODY_BYTES;\n\n let parsed: URL;\n try {\n parsed = new URL(url);\n } catch {\n throw new SsrfRefusedError('invalid_url', `Invalid URL: ${url}`, { url });\n }\n\n // `URL.hostname` wraps IPv6 literals in brackets (`https://[::1]/` →\n // `[::1]`). `dns.lookup` and the address classifier both want the bare\n // form; strip brackets here so IPv6 localhost URLs work under\n // `allowPrivateIp` and so bracketed literals can't slip past classification\n // on a future Node release that tolerates them.\n const hostname = parsed.hostname.replace(/^\\[|\\]$/g, '');\n\n if (!ALLOWED_SCHEMES.has(parsed.protocol)) {\n throw new SsrfRefusedError(\n 'scheme_not_allowed',\n `Refusing to fetch URL with unsupported scheme: ${parsed.protocol}`,\n { url, hostname }\n );\n }\n if (parsed.protocol !== 'https:' && !allowPrivateIp) {\n throw new SsrfRefusedError('non_https_without_opt_in', `Refusing to fetch non-HTTPS URL: ${url}`, {\n url,\n hostname,\n });\n }\n\n let addresses: { address: string; family: number }[];\n try {\n addresses = await dnsLookupAsync(hostname, { all: true });\n } catch (err) {\n throw new SsrfRefusedError(\n 'dns_lookup_failed',\n `DNS lookup failed for ${hostname}: ${err instanceof Error ? err.message : String(err)}`,\n { url, hostname }\n );\n }\n if (addresses.length === 0) {\n throw new SsrfRefusedError('dns_empty', `DNS returned no addresses for ${hostname}`, {\n url,\n hostname,\n });\n }\n // Error messages intentionally do NOT include the resolved IP — a\n // counterparty-supplied hostname that resolves into the caller's internal\n // address space would otherwise leak network topology into compliance\n // reports and log aggregators. The address is still available on the\n // thrown error's `.address` field for programmatic debugging.\n for (const a of addresses) {\n if (isAlwaysBlocked(a.address)) {\n throw new SsrfRefusedError(\n 'always_blocked_address',\n `Refusing to fetch: ${hostname} resolves to an always-blocked address (link-local or cloud metadata)`,\n { url, hostname, address: a.address }\n );\n }\n }\n if (!allowPrivateIp) {\n for (const a of addresses) {\n if (isPrivateIp(a.address)) {\n throw new SsrfRefusedError(\n 'private_address',\n `Refusing to fetch: ${hostname} resolves to a private/loopback address`,\n { url, hostname, address: a.address }\n );\n }\n }\n }\n\n const pinned = addresses[0]!;\n const pinnedFamily = pinned.family === 6 ? 6 : 4;\n const dispatcher = new Agent({\n connect: {\n // All addresses were validated above; pin the connect to the first. The\n // custom lookup also means undici won't re-resolve and pick up a rebind.\n // undici's Agent may call lookup with `{ all: true }` (it does for HTTPS\n // targets under Node 22+), which expects the array form of the callback.\n lookup: (\n _h: string,\n opts: LookupOptions | undefined,\n cb: (err: NodeJS.ErrnoException | null, address: string | LookupAddress[], family?: number) => void\n ) => {\n if (opts?.all) {\n cb(null, [{ address: pinned.address, family: pinnedFamily }]);\n } else {\n cb(null, pinned.address, pinnedFamily);\n }\n },\n },\n });\n\n const ac = new AbortController();\n const onExternalAbort = () => ac.abort(options.signal?.reason);\n options.signal?.addEventListener('abort', onExternalAbort, { once: true });\n const timer = setTimeout(() => ac.abort(new Error('ssrf-fetch: timeout')), timeoutMs);\n\n try {\n const init: Parameters<typeof undiciFetch>[1] = {\n method: options.method ?? 'GET',\n redirect: 'manual',\n signal: ac.signal,\n headers: options.headers,\n dispatcher,\n };\n if (options.body !== undefined) init.body = options.body;\n\n const res = await undiciFetch(url, init);\n\n const headers: Record<string, string> = {};\n res.headers.forEach((v, k) => {\n headers[k.toLowerCase()] = v;\n });\n\n const reader = res.body?.getReader();\n if (!reader) {\n return {\n url,\n status: res.status,\n headers,\n body: new Uint8Array(),\n pinnedAddress: pinned.address,\n pinnedFamily,\n };\n }\n\n const chunks: Uint8Array[] = [];\n let bytes = 0;\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n bytes += value.byteLength;\n if (bytes > maxBodyBytes) {\n await reader.cancel();\n throw new SsrfRefusedError('body_exceeds_limit', `Response body exceeded ${maxBodyBytes} bytes`, {\n url,\n hostname: parsed.hostname,\n address: pinned.address,\n });\n }\n chunks.push(value);\n }\n\n const buf = new Uint8Array(bytes);\n let offset = 0;\n for (const c of chunks) {\n buf.set(c, offset);\n offset += c.byteLength;\n }\n\n return {\n url,\n status: res.status,\n headers,\n body: buf,\n pinnedAddress: pinned.address,\n pinnedFamily,\n };\n } finally {\n clearTimeout(timer);\n options.signal?.removeEventListener('abort', onExternalAbort);\n await dispatcher.close().catch(() => {});\n }\n}\n\n/**\n * Decode a UTF-8 byte buffer as JSON when the content-type declares JSON, or\n * fall back to a UTF-8 string. Handy shared helper for probe-style call sites\n * that don't care about binary bodies.\n */\nexport function decodeBodyAsJsonOrText(body: Uint8Array, contentType: string | undefined): unknown {\n if (body.byteLength === 0) return null;\n const text = Buffer.from(body.buffer, body.byteOffset, body.byteLength).toString('utf8');\n if (contentType?.toLowerCase().includes('application/json')) {\n try {\n return JSON.parse(text);\n } catch {\n return text;\n }\n }\n return text;\n}\n"],"mappings":"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","names":["dnsLookupAsync","undiciFetch"]}
1
+ {"version":3,"sources":["../../../src/lib/net/ssrf-fetch.ts"],"sourcesContent":["/**\n * SSRF-safe HTTP fetch primitive.\n *\n * Used by compliance probes, storyboard runners, and (future) JWKS /\n * revocation-list resolvers — anywhere the library dispatches a request to a\n * URL that came from counterparty-controlled data and therefore might point at\n * the host's private network or a cloud metadata endpoint.\n *\n * Guarantees:\n * - Scheme: only `https:` by default; `http:` allowed under the dev-opt-in\n * `allowPrivateIp` flag. `file:`, `ftp:`, `data:`, etc. are always refused.\n * - DNS: resolves every A/AAAA record once, validates the full set, then\n * pins the outbound connection to the first validated address via an\n * undici `Agent` whose `connect.lookup` returns the pinned tuple.\n * Defeats DNS rebinding (attacker returns a public address to the guard\n * lookup and a private address to the connect-time lookup) and any other\n * TOCTOU gap between validation and connect.\n * - IMDS (`169.254.169.254`, `fe80::`) stays refused even under\n * `allowPrivateIp` — cloud metadata exfiltration is never a legitimate\n * dev-loop use case.\n * - Redirects are not followed (`redirect: 'manual'`). The 3xx response is\n * returned with `Location` populated so callers can inspect it, but they\n * MUST NOT re-dispatch to the `Location` URL themselves — that bypasses\n * every guard above. To follow a redirect safely, re-invoke\n * `ssrfSafeFetch` with the new URL so it runs through validation again.\n * - Response body is buffered up to `maxBodyBytes` (default 64 KiB) and\n * returned as raw bytes; the dispatcher is torn down after reading so\n * connection-reuse can't carry an attacker-controlled keepalive.\n *\n * Returns a fully-buffered result. Callers that need streaming or large bodies\n * should extend this primitive rather than bypass it.\n */\nimport { type LookupAddress, type LookupOptions } from 'dns';\nimport { lookup as dnsLookupAsync } from 'dns/promises';\nimport { Agent, fetch as undiciFetch } from 'undici';\nimport { isAlwaysBlocked, isPrivateIp } from './address-guards';\n\nconst DEFAULT_TIMEOUT_MS = 10_000;\nconst DEFAULT_MAX_BODY_BYTES = 64 * 1024;\nconst ALLOWED_SCHEMES = new Set(['https:', 'http:']);\n\nexport type SsrfRefusedCode =\n | 'invalid_url'\n | 'scheme_not_allowed'\n | 'non_https_without_opt_in'\n | 'dns_lookup_failed'\n | 'dns_empty'\n | 'always_blocked_address'\n | 'private_address'\n | 'body_exceeds_limit';\n\n/**\n * SSRF refusal codes that indicate runtime/network conditions rather than\n * policy refusal. Callers that want to fall back to a \"host unreachable\" or\n * \"treat as unknown\" path on these codes — rather than surfacing the\n * SsrfRefusedError to their own caller — can intersect against this set:\n *\n * ```ts\n * if (err instanceof SsrfRefusedError && SSRF_TRANSIENT_CODES.has(err.code)) {\n * // network condition, not a policy attack — treat as unreachable\n * } else if (err instanceof SsrfRefusedError) {\n * // policy refusal — must propagate; silently downgrading to \"unreachable\"\n * // reintroduces the catch-swallow class flagged in adcp-client#1618 review\n * throw err;\n * }\n * ```\n *\n * - `dns_lookup_failed`, `dns_empty`: name does not resolve. CLI fixtures\n * use `*.example.invalid` to provoke these — preserving the runtime-error\n * path matches pre-`ssrfSafeFetch` native-fetch behavior.\n * - `body_exceeds_limit`: response started OK (validated address, scheme,\n * etc.) but exceeded the caller's defensive cap. The host is real and\n * knows the URL; classifying as \"policy attack\" would be a misread.\n *\n * NOT in this set: `always_blocked_address`, `private_address`,\n * `scheme_not_allowed`, `non_https_without_opt_in`, `invalid_url`. Those\n * are policy refusals — silently downgrading them to \"unreachable\" or\n * \"suspect\" reintroduces the SSRF gap the gate was added to close.\n *\n * Added in adcp-client#1633.\n */\nexport const SSRF_TRANSIENT_CODES: ReadonlySet<SsrfRefusedCode> = new Set([\n 'dns_lookup_failed',\n 'dns_empty',\n 'body_exceeds_limit',\n]);\n\n/**\n * Thrown when the SSRF guard refuses a request before (or during) the fetch.\n * Network failures after the guard passes are not wrapped in this type —\n * callers that want to distinguish \"we refused this\" from \"the remote broke\"\n * can `instanceof SsrfRefusedError` the catch.\n */\nexport class SsrfRefusedError extends Error {\n readonly code: SsrfRefusedCode;\n readonly url: string;\n readonly hostname?: string;\n readonly address?: string;\n\n constructor(code: SsrfRefusedCode, message: string, meta: { url: string; hostname?: string; address?: string }) {\n super(message);\n this.name = 'SsrfRefusedError';\n this.code = code;\n this.url = meta.url;\n this.hostname = meta.hostname;\n this.address = meta.address;\n }\n}\n\nexport interface SsrfFetchOptions {\n method?: string;\n /** Lowercased keys preferred; values preserved verbatim. */\n headers?: Record<string, string>;\n body?: string | Uint8Array;\n /** Allow `http://` and private/loopback targets. Default false. */\n allowPrivateIp?: boolean;\n /** Overall timeout including DNS + connect + body read. Default 10_000 ms. */\n timeoutMs?: number;\n /** Hard cap on response body bytes. Default 64 KiB. */\n maxBodyBytes?: number;\n /** Caller-provided abort signal, composed with the internal timeout. */\n signal?: AbortSignal;\n /**\n * Trusted scoped fetch implementation. URL validation and address\n * classification still run before invocation, but DNS pinning is delegated\n * to this implementation because custom fetchers do not accept undici\n * dispatchers. The caller MUST enforce DNS-rebinding protection itself.\n *\n * This deliberately explicit name prevents callers from mistaking a custom\n * transport for the internally DNS-pinned path.\n */\n trustedFetchFn?: typeof fetch;\n}\n\nexport interface SsrfFetchResult {\n url: string;\n status: number;\n /** Response headers, lowercased. */\n headers: Record<string, string>;\n /** Raw response body bytes (empty Uint8Array if no body). */\n body: Uint8Array;\n /** The validated IP address. The connection used it only when `connectionPinned` is true. */\n pinnedAddress: string;\n pinnedFamily: 4 | 6;\n /** Whether the internal undici dispatcher pinned the connection to `pinnedAddress`. */\n connectionPinned: boolean;\n}\n\n/**\n * GET/POST/etc. a URL with SSRF guarding + DNS pinning. Throws\n * {@link SsrfRefusedError} when the guard refuses; other errors (network\n * timeouts, remote resets) propagate as the native fetch error.\n */\nexport async function ssrfSafeFetch(url: string, options: SsrfFetchOptions = {}): Promise<SsrfFetchResult> {\n const allowPrivateIp = options.allowPrivateIp === true;\n const timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n const maxBodyBytes = options.maxBodyBytes ?? DEFAULT_MAX_BODY_BYTES;\n\n let parsed: URL;\n try {\n parsed = new URL(url);\n } catch {\n throw new SsrfRefusedError('invalid_url', `Invalid URL: ${url}`, { url });\n }\n\n // `URL.hostname` wraps IPv6 literals in brackets (`https://[::1]/` →\n // `[::1]`). `dns.lookup` and the address classifier both want the bare\n // form; strip brackets here so IPv6 localhost URLs work under\n // `allowPrivateIp` and so bracketed literals can't slip past classification\n // on a future Node release that tolerates them.\n const hostname = parsed.hostname.replace(/^\\[|\\]$/g, '');\n\n if (!ALLOWED_SCHEMES.has(parsed.protocol)) {\n throw new SsrfRefusedError(\n 'scheme_not_allowed',\n `Refusing to fetch URL with unsupported scheme: ${parsed.protocol}`,\n { url, hostname }\n );\n }\n if (parsed.protocol !== 'https:' && !allowPrivateIp) {\n throw new SsrfRefusedError('non_https_without_opt_in', `Refusing to fetch non-HTTPS URL: ${url}`, {\n url,\n hostname,\n });\n }\n\n let addresses: { address: string; family: number }[];\n try {\n addresses = await dnsLookupAsync(hostname, { all: true });\n } catch (err) {\n throw new SsrfRefusedError(\n 'dns_lookup_failed',\n `DNS lookup failed for ${hostname}: ${err instanceof Error ? err.message : String(err)}`,\n { url, hostname }\n );\n }\n if (addresses.length === 0) {\n throw new SsrfRefusedError('dns_empty', `DNS returned no addresses for ${hostname}`, {\n url,\n hostname,\n });\n }\n // Error messages intentionally do NOT include the resolved IP — a\n // counterparty-supplied hostname that resolves into the caller's internal\n // address space would otherwise leak network topology into compliance\n // reports and log aggregators. The address is still available on the\n // thrown error's `.address` field for programmatic debugging.\n for (const a of addresses) {\n if (isAlwaysBlocked(a.address)) {\n throw new SsrfRefusedError(\n 'always_blocked_address',\n `Refusing to fetch: ${hostname} resolves to an always-blocked address (link-local or cloud metadata)`,\n { url, hostname, address: a.address }\n );\n }\n }\n if (!allowPrivateIp) {\n for (const a of addresses) {\n if (isPrivateIp(a.address)) {\n throw new SsrfRefusedError(\n 'private_address',\n `Refusing to fetch: ${hostname} resolves to a private/loopback address`,\n { url, hostname, address: a.address }\n );\n }\n }\n }\n\n const pinned = addresses[0]!;\n const pinnedFamily = pinned.family === 6 ? 6 : 4;\n const dispatcher = new Agent({\n connect: {\n // All addresses were validated above; pin the connect to the first. The\n // custom lookup also means undici won't re-resolve and pick up a rebind.\n // undici's Agent may call lookup with `{ all: true }` (it does for HTTPS\n // targets under Node 22+), which expects the array form of the callback.\n lookup: (\n _h: string,\n opts: LookupOptions | undefined,\n cb: (err: NodeJS.ErrnoException | null, address: string | LookupAddress[], family?: number) => void\n ) => {\n if (opts?.all) {\n cb(null, [{ address: pinned.address, family: pinnedFamily }]);\n } else {\n cb(null, pinned.address, pinnedFamily);\n }\n },\n },\n });\n\n const ac = new AbortController();\n const onExternalAbort = () => ac.abort(options.signal?.reason);\n options.signal?.addEventListener('abort', onExternalAbort, { once: true });\n const timer = setTimeout(() => ac.abort(new Error('ssrf-fetch: timeout')), timeoutMs);\n\n try {\n const res = options.trustedFetchFn\n ? await options.trustedFetchFn(url, {\n method: options.method ?? 'GET',\n redirect: 'manual',\n signal: ac.signal,\n headers: options.headers,\n ...(options.body !== undefined && { body: options.body as BodyInit }),\n })\n : await undiciFetch(url, {\n method: options.method ?? 'GET',\n redirect: 'manual',\n signal: ac.signal,\n headers: options.headers,\n dispatcher,\n ...(options.body !== undefined && { body: options.body }),\n });\n\n const headers: Record<string, string> = {};\n res.headers.forEach((v, k) => {\n headers[k.toLowerCase()] = v;\n });\n\n const reader = res.body?.getReader();\n if (!reader) {\n return {\n url,\n status: res.status,\n headers,\n body: new Uint8Array(),\n pinnedAddress: pinned.address,\n pinnedFamily,\n connectionPinned: !options.trustedFetchFn,\n };\n }\n\n const chunks: Uint8Array[] = [];\n let bytes = 0;\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n bytes += value.byteLength;\n if (bytes > maxBodyBytes) {\n await reader.cancel();\n throw new SsrfRefusedError('body_exceeds_limit', `Response body exceeded ${maxBodyBytes} bytes`, {\n url,\n hostname: parsed.hostname,\n address: pinned.address,\n });\n }\n chunks.push(value);\n }\n\n const buf = new Uint8Array(bytes);\n let offset = 0;\n for (const c of chunks) {\n buf.set(c, offset);\n offset += c.byteLength;\n }\n\n return {\n url,\n status: res.status,\n headers,\n body: buf,\n pinnedAddress: pinned.address,\n pinnedFamily,\n connectionPinned: !options.trustedFetchFn,\n };\n } finally {\n clearTimeout(timer);\n options.signal?.removeEventListener('abort', onExternalAbort);\n await dispatcher.close().catch(() => {});\n }\n}\n\n/**\n * Decode a UTF-8 byte buffer as JSON when the content-type declares JSON, or\n * fall back to a UTF-8 string. Handy shared helper for probe-style call sites\n * that don't care about binary bodies.\n */\nexport function decodeBodyAsJsonOrText(body: Uint8Array, contentType: string | undefined): unknown {\n if (body.byteLength === 0) return null;\n const text = Buffer.from(body.buffer, body.byteOffset, body.byteLength).toString('utf8');\n if (contentType?.toLowerCase().includes('application/json')) {\n try {\n return JSON.parse(text);\n } catch {\n return text;\n }\n }\n return text;\n}\n"],"mappings":"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","names":["dnsLookupAsync","undiciFetch"]}
@@ -105,15 +105,20 @@ async function ssrfSafeFetch(url, options = {}) {
105
105
  options.signal?.addEventListener("abort", onExternalAbort, { once: true });
106
106
  const timer = setTimeout(() => ac.abort(new Error("ssrf-fetch: timeout")), timeoutMs);
107
107
  try {
108
- const init = {
108
+ const res = options.trustedFetchFn ? await options.trustedFetchFn(url, {
109
109
  method: options.method ?? "GET",
110
110
  redirect: "manual",
111
111
  signal: ac.signal,
112
112
  headers: options.headers,
113
- dispatcher
114
- };
115
- if (options.body !== void 0) init.body = options.body;
116
- const res = await undiciFetch(url, init);
113
+ ...options.body !== void 0 && { body: options.body }
114
+ }) : await undiciFetch(url, {
115
+ method: options.method ?? "GET",
116
+ redirect: "manual",
117
+ signal: ac.signal,
118
+ headers: options.headers,
119
+ dispatcher,
120
+ ...options.body !== void 0 && { body: options.body }
121
+ });
117
122
  const headers = {};
118
123
  res.headers.forEach((v, k) => {
119
124
  headers[k.toLowerCase()] = v;
@@ -126,7 +131,8 @@ async function ssrfSafeFetch(url, options = {}) {
126
131
  headers,
127
132
  body: new Uint8Array(),
128
133
  pinnedAddress: pinned.address,
129
- pinnedFamily
134
+ pinnedFamily,
135
+ connectionPinned: !options.trustedFetchFn
130
136
  };
131
137
  }
132
138
  const chunks = [];
@@ -157,7 +163,8 @@ async function ssrfSafeFetch(url, options = {}) {
157
163
  headers,
158
164
  body: buf,
159
165
  pinnedAddress: pinned.address,
160
- pinnedFamily
166
+ pinnedFamily,
167
+ connectionPinned: !options.trustedFetchFn
161
168
  };
162
169
  } finally {
163
170
  clearTimeout(timer);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/lib/net/ssrf-fetch.ts"],"sourcesContent":["/**\n * SSRF-safe HTTP fetch primitive.\n *\n * Used by compliance probes, storyboard runners, and (future) JWKS /\n * revocation-list resolvers — anywhere the library dispatches a request to a\n * URL that came from counterparty-controlled data and therefore might point at\n * the host's private network or a cloud metadata endpoint.\n *\n * Guarantees:\n * - Scheme: only `https:` by default; `http:` allowed under the dev-opt-in\n * `allowPrivateIp` flag. `file:`, `ftp:`, `data:`, etc. are always refused.\n * - DNS: resolves every A/AAAA record once, validates the full set, then\n * pins the outbound connection to the first validated address via an\n * undici `Agent` whose `connect.lookup` returns the pinned tuple.\n * Defeats DNS rebinding (attacker returns a public address to the guard\n * lookup and a private address to the connect-time lookup) and any other\n * TOCTOU gap between validation and connect.\n * - IMDS (`169.254.169.254`, `fe80::`) stays refused even under\n * `allowPrivateIp` — cloud metadata exfiltration is never a legitimate\n * dev-loop use case.\n * - Redirects are not followed (`redirect: 'manual'`). The 3xx response is\n * returned with `Location` populated so callers can inspect it, but they\n * MUST NOT re-dispatch to the `Location` URL themselves — that bypasses\n * every guard above. To follow a redirect safely, re-invoke\n * `ssrfSafeFetch` with the new URL so it runs through validation again.\n * - Response body is buffered up to `maxBodyBytes` (default 64 KiB) and\n * returned as raw bytes; the dispatcher is torn down after reading so\n * connection-reuse can't carry an attacker-controlled keepalive.\n *\n * Returns a fully-buffered result. Callers that need streaming or large bodies\n * should extend this primitive rather than bypass it.\n */\nimport { type LookupAddress, type LookupOptions } from 'dns';\nimport { lookup as dnsLookupAsync } from 'dns/promises';\nimport { Agent, fetch as undiciFetch } from 'undici';\nimport { isAlwaysBlocked, isPrivateIp } from './address-guards';\n\nconst DEFAULT_TIMEOUT_MS = 10_000;\nconst DEFAULT_MAX_BODY_BYTES = 64 * 1024;\nconst ALLOWED_SCHEMES = new Set(['https:', 'http:']);\n\nexport type SsrfRefusedCode =\n | 'invalid_url'\n | 'scheme_not_allowed'\n | 'non_https_without_opt_in'\n | 'dns_lookup_failed'\n | 'dns_empty'\n | 'always_blocked_address'\n | 'private_address'\n | 'body_exceeds_limit';\n\n/**\n * SSRF refusal codes that indicate runtime/network conditions rather than\n * policy refusal. Callers that want to fall back to a \"host unreachable\" or\n * \"treat as unknown\" path on these codes — rather than surfacing the\n * SsrfRefusedError to their own caller — can intersect against this set:\n *\n * ```ts\n * if (err instanceof SsrfRefusedError && SSRF_TRANSIENT_CODES.has(err.code)) {\n * // network condition, not a policy attack — treat as unreachable\n * } else if (err instanceof SsrfRefusedError) {\n * // policy refusal — must propagate; silently downgrading to \"unreachable\"\n * // reintroduces the catch-swallow class flagged in adcp-client#1618 review\n * throw err;\n * }\n * ```\n *\n * - `dns_lookup_failed`, `dns_empty`: name does not resolve. CLI fixtures\n * use `*.example.invalid` to provoke these — preserving the runtime-error\n * path matches pre-`ssrfSafeFetch` native-fetch behavior.\n * - `body_exceeds_limit`: response started OK (validated address, scheme,\n * etc.) but exceeded the caller's defensive cap. The host is real and\n * knows the URL; classifying as \"policy attack\" would be a misread.\n *\n * NOT in this set: `always_blocked_address`, `private_address`,\n * `scheme_not_allowed`, `non_https_without_opt_in`, `invalid_url`. Those\n * are policy refusals — silently downgrading them to \"unreachable\" or\n * \"suspect\" reintroduces the SSRF gap the gate was added to close.\n *\n * Added in adcp-client#1633.\n */\nexport const SSRF_TRANSIENT_CODES: ReadonlySet<SsrfRefusedCode> = new Set([\n 'dns_lookup_failed',\n 'dns_empty',\n 'body_exceeds_limit',\n]);\n\n/**\n * Thrown when the SSRF guard refuses a request before (or during) the fetch.\n * Network failures after the guard passes are not wrapped in this type —\n * callers that want to distinguish \"we refused this\" from \"the remote broke\"\n * can `instanceof SsrfRefusedError` the catch.\n */\nexport class SsrfRefusedError extends Error {\n readonly code: SsrfRefusedCode;\n readonly url: string;\n readonly hostname?: string;\n readonly address?: string;\n\n constructor(code: SsrfRefusedCode, message: string, meta: { url: string; hostname?: string; address?: string }) {\n super(message);\n this.name = 'SsrfRefusedError';\n this.code = code;\n this.url = meta.url;\n this.hostname = meta.hostname;\n this.address = meta.address;\n }\n}\n\nexport interface SsrfFetchOptions {\n method?: string;\n /** Lowercased keys preferred; values preserved verbatim. */\n headers?: Record<string, string>;\n body?: string | Uint8Array;\n /** Allow `http://` and private/loopback targets. Default false. */\n allowPrivateIp?: boolean;\n /** Overall timeout including DNS + connect + body read. Default 10_000 ms. */\n timeoutMs?: number;\n /** Hard cap on response body bytes. Default 64 KiB. */\n maxBodyBytes?: number;\n /** Caller-provided abort signal, composed with the internal timeout. */\n signal?: AbortSignal;\n}\n\nexport interface SsrfFetchResult {\n url: string;\n status: number;\n /** Response headers, lowercased. */\n headers: Record<string, string>;\n /** Raw response body bytes (empty Uint8Array if no body). */\n body: Uint8Array;\n /** The IP address we pinned the outbound connection to. */\n pinnedAddress: string;\n pinnedFamily: 4 | 6;\n}\n\n/**\n * GET/POST/etc. a URL with SSRF guarding + DNS pinning. Throws\n * {@link SsrfRefusedError} when the guard refuses; other errors (network\n * timeouts, remote resets) propagate as the native fetch error.\n */\nexport async function ssrfSafeFetch(url: string, options: SsrfFetchOptions = {}): Promise<SsrfFetchResult> {\n const allowPrivateIp = options.allowPrivateIp === true;\n const timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n const maxBodyBytes = options.maxBodyBytes ?? DEFAULT_MAX_BODY_BYTES;\n\n let parsed: URL;\n try {\n parsed = new URL(url);\n } catch {\n throw new SsrfRefusedError('invalid_url', `Invalid URL: ${url}`, { url });\n }\n\n // `URL.hostname` wraps IPv6 literals in brackets (`https://[::1]/` →\n // `[::1]`). `dns.lookup` and the address classifier both want the bare\n // form; strip brackets here so IPv6 localhost URLs work under\n // `allowPrivateIp` and so bracketed literals can't slip past classification\n // on a future Node release that tolerates them.\n const hostname = parsed.hostname.replace(/^\\[|\\]$/g, '');\n\n if (!ALLOWED_SCHEMES.has(parsed.protocol)) {\n throw new SsrfRefusedError(\n 'scheme_not_allowed',\n `Refusing to fetch URL with unsupported scheme: ${parsed.protocol}`,\n { url, hostname }\n );\n }\n if (parsed.protocol !== 'https:' && !allowPrivateIp) {\n throw new SsrfRefusedError('non_https_without_opt_in', `Refusing to fetch non-HTTPS URL: ${url}`, {\n url,\n hostname,\n });\n }\n\n let addresses: { address: string; family: number }[];\n try {\n addresses = await dnsLookupAsync(hostname, { all: true });\n } catch (err) {\n throw new SsrfRefusedError(\n 'dns_lookup_failed',\n `DNS lookup failed for ${hostname}: ${err instanceof Error ? err.message : String(err)}`,\n { url, hostname }\n );\n }\n if (addresses.length === 0) {\n throw new SsrfRefusedError('dns_empty', `DNS returned no addresses for ${hostname}`, {\n url,\n hostname,\n });\n }\n // Error messages intentionally do NOT include the resolved IP — a\n // counterparty-supplied hostname that resolves into the caller's internal\n // address space would otherwise leak network topology into compliance\n // reports and log aggregators. The address is still available on the\n // thrown error's `.address` field for programmatic debugging.\n for (const a of addresses) {\n if (isAlwaysBlocked(a.address)) {\n throw new SsrfRefusedError(\n 'always_blocked_address',\n `Refusing to fetch: ${hostname} resolves to an always-blocked address (link-local or cloud metadata)`,\n { url, hostname, address: a.address }\n );\n }\n }\n if (!allowPrivateIp) {\n for (const a of addresses) {\n if (isPrivateIp(a.address)) {\n throw new SsrfRefusedError(\n 'private_address',\n `Refusing to fetch: ${hostname} resolves to a private/loopback address`,\n { url, hostname, address: a.address }\n );\n }\n }\n }\n\n const pinned = addresses[0]!;\n const pinnedFamily = pinned.family === 6 ? 6 : 4;\n const dispatcher = new Agent({\n connect: {\n // All addresses were validated above; pin the connect to the first. The\n // custom lookup also means undici won't re-resolve and pick up a rebind.\n // undici's Agent may call lookup with `{ all: true }` (it does for HTTPS\n // targets under Node 22+), which expects the array form of the callback.\n lookup: (\n _h: string,\n opts: LookupOptions | undefined,\n cb: (err: NodeJS.ErrnoException | null, address: string | LookupAddress[], family?: number) => void\n ) => {\n if (opts?.all) {\n cb(null, [{ address: pinned.address, family: pinnedFamily }]);\n } else {\n cb(null, pinned.address, pinnedFamily);\n }\n },\n },\n });\n\n const ac = new AbortController();\n const onExternalAbort = () => ac.abort(options.signal?.reason);\n options.signal?.addEventListener('abort', onExternalAbort, { once: true });\n const timer = setTimeout(() => ac.abort(new Error('ssrf-fetch: timeout')), timeoutMs);\n\n try {\n const init: Parameters<typeof undiciFetch>[1] = {\n method: options.method ?? 'GET',\n redirect: 'manual',\n signal: ac.signal,\n headers: options.headers,\n dispatcher,\n };\n if (options.body !== undefined) init.body = options.body;\n\n const res = await undiciFetch(url, init);\n\n const headers: Record<string, string> = {};\n res.headers.forEach((v, k) => {\n headers[k.toLowerCase()] = v;\n });\n\n const reader = res.body?.getReader();\n if (!reader) {\n return {\n url,\n status: res.status,\n headers,\n body: new Uint8Array(),\n pinnedAddress: pinned.address,\n pinnedFamily,\n };\n }\n\n const chunks: Uint8Array[] = [];\n let bytes = 0;\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n bytes += value.byteLength;\n if (bytes > maxBodyBytes) {\n await reader.cancel();\n throw new SsrfRefusedError('body_exceeds_limit', `Response body exceeded ${maxBodyBytes} bytes`, {\n url,\n hostname: parsed.hostname,\n address: pinned.address,\n });\n }\n chunks.push(value);\n }\n\n const buf = new Uint8Array(bytes);\n let offset = 0;\n for (const c of chunks) {\n buf.set(c, offset);\n offset += c.byteLength;\n }\n\n return {\n url,\n status: res.status,\n headers,\n body: buf,\n pinnedAddress: pinned.address,\n pinnedFamily,\n };\n } finally {\n clearTimeout(timer);\n options.signal?.removeEventListener('abort', onExternalAbort);\n await dispatcher.close().catch(() => {});\n }\n}\n\n/**\n * Decode a UTF-8 byte buffer as JSON when the content-type declares JSON, or\n * fall back to a UTF-8 string. Handy shared helper for probe-style call sites\n * that don't care about binary bodies.\n */\nexport function decodeBodyAsJsonOrText(body: Uint8Array, contentType: string | undefined): unknown {\n if (body.byteLength === 0) return null;\n const text = Buffer.from(body.buffer, body.byteOffset, body.byteLength).toString('utf8');\n if (contentType?.toLowerCase().includes('application/json')) {\n try {\n return JSON.parse(text);\n } catch {\n return text;\n }\n }\n return text;\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../src/lib/net/ssrf-fetch.ts"],"sourcesContent":["/**\n * SSRF-safe HTTP fetch primitive.\n *\n * Used by compliance probes, storyboard runners, and (future) JWKS /\n * revocation-list resolvers — anywhere the library dispatches a request to a\n * URL that came from counterparty-controlled data and therefore might point at\n * the host's private network or a cloud metadata endpoint.\n *\n * Guarantees:\n * - Scheme: only `https:` by default; `http:` allowed under the dev-opt-in\n * `allowPrivateIp` flag. `file:`, `ftp:`, `data:`, etc. are always refused.\n * - DNS: resolves every A/AAAA record once, validates the full set, then\n * pins the outbound connection to the first validated address via an\n * undici `Agent` whose `connect.lookup` returns the pinned tuple.\n * Defeats DNS rebinding (attacker returns a public address to the guard\n * lookup and a private address to the connect-time lookup) and any other\n * TOCTOU gap between validation and connect.\n * - IMDS (`169.254.169.254`, `fe80::`) stays refused even under\n * `allowPrivateIp` — cloud metadata exfiltration is never a legitimate\n * dev-loop use case.\n * - Redirects are not followed (`redirect: 'manual'`). The 3xx response is\n * returned with `Location` populated so callers can inspect it, but they\n * MUST NOT re-dispatch to the `Location` URL themselves — that bypasses\n * every guard above. To follow a redirect safely, re-invoke\n * `ssrfSafeFetch` with the new URL so it runs through validation again.\n * - Response body is buffered up to `maxBodyBytes` (default 64 KiB) and\n * returned as raw bytes; the dispatcher is torn down after reading so\n * connection-reuse can't carry an attacker-controlled keepalive.\n *\n * Returns a fully-buffered result. Callers that need streaming or large bodies\n * should extend this primitive rather than bypass it.\n */\nimport { type LookupAddress, type LookupOptions } from 'dns';\nimport { lookup as dnsLookupAsync } from 'dns/promises';\nimport { Agent, fetch as undiciFetch } from 'undici';\nimport { isAlwaysBlocked, isPrivateIp } from './address-guards';\n\nconst DEFAULT_TIMEOUT_MS = 10_000;\nconst DEFAULT_MAX_BODY_BYTES = 64 * 1024;\nconst ALLOWED_SCHEMES = new Set(['https:', 'http:']);\n\nexport type SsrfRefusedCode =\n | 'invalid_url'\n | 'scheme_not_allowed'\n | 'non_https_without_opt_in'\n | 'dns_lookup_failed'\n | 'dns_empty'\n | 'always_blocked_address'\n | 'private_address'\n | 'body_exceeds_limit';\n\n/**\n * SSRF refusal codes that indicate runtime/network conditions rather than\n * policy refusal. Callers that want to fall back to a \"host unreachable\" or\n * \"treat as unknown\" path on these codes — rather than surfacing the\n * SsrfRefusedError to their own caller — can intersect against this set:\n *\n * ```ts\n * if (err instanceof SsrfRefusedError && SSRF_TRANSIENT_CODES.has(err.code)) {\n * // network condition, not a policy attack — treat as unreachable\n * } else if (err instanceof SsrfRefusedError) {\n * // policy refusal — must propagate; silently downgrading to \"unreachable\"\n * // reintroduces the catch-swallow class flagged in adcp-client#1618 review\n * throw err;\n * }\n * ```\n *\n * - `dns_lookup_failed`, `dns_empty`: name does not resolve. CLI fixtures\n * use `*.example.invalid` to provoke these — preserving the runtime-error\n * path matches pre-`ssrfSafeFetch` native-fetch behavior.\n * - `body_exceeds_limit`: response started OK (validated address, scheme,\n * etc.) but exceeded the caller's defensive cap. The host is real and\n * knows the URL; classifying as \"policy attack\" would be a misread.\n *\n * NOT in this set: `always_blocked_address`, `private_address`,\n * `scheme_not_allowed`, `non_https_without_opt_in`, `invalid_url`. Those\n * are policy refusals — silently downgrading them to \"unreachable\" or\n * \"suspect\" reintroduces the SSRF gap the gate was added to close.\n *\n * Added in adcp-client#1633.\n */\nexport const SSRF_TRANSIENT_CODES: ReadonlySet<SsrfRefusedCode> = new Set([\n 'dns_lookup_failed',\n 'dns_empty',\n 'body_exceeds_limit',\n]);\n\n/**\n * Thrown when the SSRF guard refuses a request before (or during) the fetch.\n * Network failures after the guard passes are not wrapped in this type —\n * callers that want to distinguish \"we refused this\" from \"the remote broke\"\n * can `instanceof SsrfRefusedError` the catch.\n */\nexport class SsrfRefusedError extends Error {\n readonly code: SsrfRefusedCode;\n readonly url: string;\n readonly hostname?: string;\n readonly address?: string;\n\n constructor(code: SsrfRefusedCode, message: string, meta: { url: string; hostname?: string; address?: string }) {\n super(message);\n this.name = 'SsrfRefusedError';\n this.code = code;\n this.url = meta.url;\n this.hostname = meta.hostname;\n this.address = meta.address;\n }\n}\n\nexport interface SsrfFetchOptions {\n method?: string;\n /** Lowercased keys preferred; values preserved verbatim. */\n headers?: Record<string, string>;\n body?: string | Uint8Array;\n /** Allow `http://` and private/loopback targets. Default false. */\n allowPrivateIp?: boolean;\n /** Overall timeout including DNS + connect + body read. Default 10_000 ms. */\n timeoutMs?: number;\n /** Hard cap on response body bytes. Default 64 KiB. */\n maxBodyBytes?: number;\n /** Caller-provided abort signal, composed with the internal timeout. */\n signal?: AbortSignal;\n /**\n * Trusted scoped fetch implementation. URL validation and address\n * classification still run before invocation, but DNS pinning is delegated\n * to this implementation because custom fetchers do not accept undici\n * dispatchers. The caller MUST enforce DNS-rebinding protection itself.\n *\n * This deliberately explicit name prevents callers from mistaking a custom\n * transport for the internally DNS-pinned path.\n */\n trustedFetchFn?: typeof fetch;\n}\n\nexport interface SsrfFetchResult {\n url: string;\n status: number;\n /** Response headers, lowercased. */\n headers: Record<string, string>;\n /** Raw response body bytes (empty Uint8Array if no body). */\n body: Uint8Array;\n /** The validated IP address. The connection used it only when `connectionPinned` is true. */\n pinnedAddress: string;\n pinnedFamily: 4 | 6;\n /** Whether the internal undici dispatcher pinned the connection to `pinnedAddress`. */\n connectionPinned: boolean;\n}\n\n/**\n * GET/POST/etc. a URL with SSRF guarding + DNS pinning. Throws\n * {@link SsrfRefusedError} when the guard refuses; other errors (network\n * timeouts, remote resets) propagate as the native fetch error.\n */\nexport async function ssrfSafeFetch(url: string, options: SsrfFetchOptions = {}): Promise<SsrfFetchResult> {\n const allowPrivateIp = options.allowPrivateIp === true;\n const timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n const maxBodyBytes = options.maxBodyBytes ?? DEFAULT_MAX_BODY_BYTES;\n\n let parsed: URL;\n try {\n parsed = new URL(url);\n } catch {\n throw new SsrfRefusedError('invalid_url', `Invalid URL: ${url}`, { url });\n }\n\n // `URL.hostname` wraps IPv6 literals in brackets (`https://[::1]/` →\n // `[::1]`). `dns.lookup` and the address classifier both want the bare\n // form; strip brackets here so IPv6 localhost URLs work under\n // `allowPrivateIp` and so bracketed literals can't slip past classification\n // on a future Node release that tolerates them.\n const hostname = parsed.hostname.replace(/^\\[|\\]$/g, '');\n\n if (!ALLOWED_SCHEMES.has(parsed.protocol)) {\n throw new SsrfRefusedError(\n 'scheme_not_allowed',\n `Refusing to fetch URL with unsupported scheme: ${parsed.protocol}`,\n { url, hostname }\n );\n }\n if (parsed.protocol !== 'https:' && !allowPrivateIp) {\n throw new SsrfRefusedError('non_https_without_opt_in', `Refusing to fetch non-HTTPS URL: ${url}`, {\n url,\n hostname,\n });\n }\n\n let addresses: { address: string; family: number }[];\n try {\n addresses = await dnsLookupAsync(hostname, { all: true });\n } catch (err) {\n throw new SsrfRefusedError(\n 'dns_lookup_failed',\n `DNS lookup failed for ${hostname}: ${err instanceof Error ? err.message : String(err)}`,\n { url, hostname }\n );\n }\n if (addresses.length === 0) {\n throw new SsrfRefusedError('dns_empty', `DNS returned no addresses for ${hostname}`, {\n url,\n hostname,\n });\n }\n // Error messages intentionally do NOT include the resolved IP — a\n // counterparty-supplied hostname that resolves into the caller's internal\n // address space would otherwise leak network topology into compliance\n // reports and log aggregators. The address is still available on the\n // thrown error's `.address` field for programmatic debugging.\n for (const a of addresses) {\n if (isAlwaysBlocked(a.address)) {\n throw new SsrfRefusedError(\n 'always_blocked_address',\n `Refusing to fetch: ${hostname} resolves to an always-blocked address (link-local or cloud metadata)`,\n { url, hostname, address: a.address }\n );\n }\n }\n if (!allowPrivateIp) {\n for (const a of addresses) {\n if (isPrivateIp(a.address)) {\n throw new SsrfRefusedError(\n 'private_address',\n `Refusing to fetch: ${hostname} resolves to a private/loopback address`,\n { url, hostname, address: a.address }\n );\n }\n }\n }\n\n const pinned = addresses[0]!;\n const pinnedFamily = pinned.family === 6 ? 6 : 4;\n const dispatcher = new Agent({\n connect: {\n // All addresses were validated above; pin the connect to the first. The\n // custom lookup also means undici won't re-resolve and pick up a rebind.\n // undici's Agent may call lookup with `{ all: true }` (it does for HTTPS\n // targets under Node 22+), which expects the array form of the callback.\n lookup: (\n _h: string,\n opts: LookupOptions | undefined,\n cb: (err: NodeJS.ErrnoException | null, address: string | LookupAddress[], family?: number) => void\n ) => {\n if (opts?.all) {\n cb(null, [{ address: pinned.address, family: pinnedFamily }]);\n } else {\n cb(null, pinned.address, pinnedFamily);\n }\n },\n },\n });\n\n const ac = new AbortController();\n const onExternalAbort = () => ac.abort(options.signal?.reason);\n options.signal?.addEventListener('abort', onExternalAbort, { once: true });\n const timer = setTimeout(() => ac.abort(new Error('ssrf-fetch: timeout')), timeoutMs);\n\n try {\n const res = options.trustedFetchFn\n ? await options.trustedFetchFn(url, {\n method: options.method ?? 'GET',\n redirect: 'manual',\n signal: ac.signal,\n headers: options.headers,\n ...(options.body !== undefined && { body: options.body as BodyInit }),\n })\n : await undiciFetch(url, {\n method: options.method ?? 'GET',\n redirect: 'manual',\n signal: ac.signal,\n headers: options.headers,\n dispatcher,\n ...(options.body !== undefined && { body: options.body }),\n });\n\n const headers: Record<string, string> = {};\n res.headers.forEach((v, k) => {\n headers[k.toLowerCase()] = v;\n });\n\n const reader = res.body?.getReader();\n if (!reader) {\n return {\n url,\n status: res.status,\n headers,\n body: new Uint8Array(),\n pinnedAddress: pinned.address,\n pinnedFamily,\n connectionPinned: !options.trustedFetchFn,\n };\n }\n\n const chunks: Uint8Array[] = [];\n let bytes = 0;\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n bytes += value.byteLength;\n if (bytes > maxBodyBytes) {\n await reader.cancel();\n throw new SsrfRefusedError('body_exceeds_limit', `Response body exceeded ${maxBodyBytes} bytes`, {\n url,\n hostname: parsed.hostname,\n address: pinned.address,\n });\n }\n chunks.push(value);\n }\n\n const buf = new Uint8Array(bytes);\n let offset = 0;\n for (const c of chunks) {\n buf.set(c, offset);\n offset += c.byteLength;\n }\n\n return {\n url,\n status: res.status,\n headers,\n body: buf,\n pinnedAddress: pinned.address,\n pinnedFamily,\n connectionPinned: !options.trustedFetchFn,\n };\n } finally {\n clearTimeout(timer);\n options.signal?.removeEventListener('abort', onExternalAbort);\n await dispatcher.close().catch(() => {});\n }\n}\n\n/**\n * Decode a UTF-8 byte buffer as JSON when the content-type declares JSON, or\n * fall back to a UTF-8 string. Handy shared helper for probe-style call sites\n * that don't care about binary bodies.\n */\nexport function decodeBodyAsJsonOrText(body: Uint8Array, contentType: string | undefined): unknown {\n if (body.byteLength === 0) return null;\n const text = Buffer.from(body.buffer, body.byteOffset, body.byteLength).toString('utf8');\n if (contentType?.toLowerCase().includes('application/json')) {\n try {\n return JSON.parse(text);\n } catch {\n return text;\n }\n }\n return text;\n}\n"],"mappings":"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","names":[]}
@@ -41,7 +41,7 @@ export declare function closeA2AConnections(): void;
41
41
  * @param agent The agent config (used for URL, auth token, signing).
42
42
  * @param taskId The server-assigned A2A Task.id to cancel.
43
43
  */
44
- export declare function cancelA2ATask(agent: AgentConfig, taskId: string): Promise<void>;
44
+ export declare function cancelA2ATask(agent: AgentConfig, taskId: string, fetchFn?: typeof fetch): Promise<void>;
45
45
  /**
46
46
  * Protocol-level session identifiers that ride on the A2A Message envelope
47
47
  * (not in the skill parameters). `contextId` binds sends to a server-side
@@ -54,4 +54,4 @@ export interface A2ASessionIds {
54
54
  contextId?: string;
55
55
  taskId?: string;
56
56
  }
57
- export declare function callA2ATool(agentUrl: string, toolName: string, parameters: Record<string, unknown>, authToken?: string, debugLogs?: DebugLogEntry[], pushNotificationConfig?: PushNotificationConfig, customHeaders?: Record<string, string>, signingContext?: AgentSigningContext, session?: A2ASessionIds, signal?: AbortSignal, requestTimeoutMs?: number): Promise<unknown>;
57
+ export declare function callA2ATool(agentUrl: string, toolName: string, parameters: Record<string, unknown>, authToken?: string, debugLogs?: DebugLogEntry[], pushNotificationConfig?: PushNotificationConfig, customHeaders?: Record<string, string>, signingContext?: AgentSigningContext, session?: A2ASessionIds, signal?: AbortSignal, requestTimeoutMs?: number, fetchFn?: typeof fetch): Promise<unknown>;
@@ -41,7 +41,7 @@ export declare function closeA2AConnections(): void;
41
41
  * @param agent The agent config (used for URL, auth token, signing).
42
42
  * @param taskId The server-assigned A2A Task.id to cancel.
43
43
  */
44
- export declare function cancelA2ATask(agent: AgentConfig, taskId: string): Promise<void>;
44
+ export declare function cancelA2ATask(agent: AgentConfig, taskId: string, fetchFn?: typeof fetch): Promise<void>;
45
45
  /**
46
46
  * Protocol-level session identifiers that ride on the A2A Message envelope
47
47
  * (not in the skill parameters). `contextId` binds sends to a server-side
@@ -54,5 +54,5 @@ export interface A2ASessionIds {
54
54
  contextId?: string;
55
55
  taskId?: string;
56
56
  }
57
- export declare function callA2ATool(agentUrl: string, toolName: string, parameters: Record<string, unknown>, authToken?: string, debugLogs?: DebugLogEntry[], pushNotificationConfig?: PushNotificationConfig, customHeaders?: Record<string, string>, signingContext?: AgentSigningContext, session?: A2ASessionIds, signal?: AbortSignal, requestTimeoutMs?: number): Promise<unknown>;
57
+ export declare function callA2ATool(agentUrl: string, toolName: string, parameters: Record<string, unknown>, authToken?: string, debugLogs?: DebugLogEntry[], pushNotificationConfig?: PushNotificationConfig, customHeaders?: Record<string, string>, signingContext?: AgentSigningContext, session?: A2ASessionIds, signal?: AbortSignal, requestTimeoutMs?: number, fetchFn?: typeof fetch): Promise<unknown>;
58
58
  //# sourceMappingURL=a2a.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"a2a.d.ts","sourceRoot":"","sources":["../../../src/lib/protocols/a2a.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AACvE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAMnD,OAAO,EAAiD,KAAK,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAI5G,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAoIjD;;;;GAIG;AACH,wBAAgB,mBAAmB,IAAI,IAAI,CAG1C;AASD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,wBAAsB,aAAa,CAAC,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA4ErF;AA0LD;;;;;;;GAOG;AACH,MAAM,WAAW,aAAa;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wBAAsB,WAAW,CAC/B,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACnC,SAAS,CAAC,EAAE,MAAM,EAClB,SAAS,GAAE,aAAa,EAAO,EAC/B,sBAAsB,CAAC,EAAE,sBAAsB,EAC/C,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EACtC,cAAc,CAAC,EAAE,mBAAmB,EACpC,OAAO,CAAC,EAAE,aAAa,EACvB,MAAM,CAAC,EAAE,WAAW,EACpB,gBAAgB,CAAC,EAAE,MAAM,GACxB,OAAO,CAAC,OAAO,CAAC,CA+BlB"}
1
+ {"version":3,"file":"a2a.d.ts","sourceRoot":"","sources":["../../../src/lib/protocols/a2a.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AACvE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAMnD,OAAO,EAAiD,KAAK,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAI5G,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAsIjD;;;;GAIG;AACH,wBAAgB,mBAAmB,IAAI,IAAI,CAG1C;AASD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,wBAAsB,aAAa,CAAC,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CA6E7G;AAkMD;;;;;;;GAOG;AACH,MAAM,WAAW,aAAa;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wBAAsB,WAAW,CAC/B,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACnC,SAAS,CAAC,EAAE,MAAM,EAClB,SAAS,GAAE,aAAa,EAAO,EAC/B,sBAAsB,CAAC,EAAE,sBAAsB,EAC/C,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EACtC,cAAc,CAAC,EAAE,mBAAmB,EACpC,OAAO,CAAC,EAAE,aAAa,EACvB,MAAM,CAAC,EAAE,WAAW,EACpB,gBAAgB,CAAC,EAAE,MAAM,EACzB,OAAO,CAAC,EAAE,OAAO,KAAK,GACrB,OAAO,CAAC,OAAO,CAAC,CAgClB"}
@@ -94,7 +94,7 @@ function closeA2AConnections() {
94
94
  pendingA2AClients.clear();
95
95
  }
96
96
  const CANCEL_TIMEOUT_MS = 5e3;
97
- async function cancelA2ATask(agent, taskId) {
97
+ async function cancelA2ATask(agent, taskId, fetchFn) {
98
98
  if (agent.protocol !== "a2a") {
99
99
  return;
100
100
  }
@@ -121,7 +121,7 @@ async function cancelA2ATask(agent, taskId) {
121
121
  signal: AbortSignal.timeout(CANCEL_TIMEOUT_MS)
122
122
  };
123
123
  if (agent.request_signing) {
124
- const upstream = (input, ini) => fetch(input, ini);
124
+ const upstream = (input, ini) => fetchFn ? fetchFn(input, ini) : fetch(input, ini);
125
125
  if ((0, import_agent_fetch.isInlineSigningConfig)(agent.request_signing)) {
126
126
  const signed = (0, import_fetch.createSigningFetch)(upstream, (0, import_agent_fetch.toSignerKey)(agent.request_signing));
127
127
  await signed(agentUrl, init);
@@ -133,12 +133,13 @@ async function cancelA2ATask(agent, taskId) {
133
133
  return;
134
134
  }
135
135
  }
136
- await fetch(agentUrl, init);
136
+ await (fetchFn ?? fetch)(agentUrl, init);
137
137
  }
138
138
  async function getOrCreateA2AClient(agentUrl, authToken, customHeaders, bypassCache = false) {
139
139
  const signingContext = import_client2.signingContextStorage.getStore();
140
+ const fetchFn = callContextStorage.getStore()?.fetchFn;
140
141
  const cacheKey = a2aCacheKey(agentUrl, authToken, signingContext?.cacheKey, customHeaders);
141
- if (bypassCache) {
142
+ if (bypassCache || fetchFn) {
142
143
  return createA2AClient(agentUrl, authToken);
143
144
  }
144
145
  const cached = a2aClientCache.get(cacheKey);
@@ -180,7 +181,10 @@ async function createA2AClient(agentUrl, authToken) {
180
181
  function buildFetchImpl(authToken) {
181
182
  const signingContext = import_client2.signingContextStorage.getStore();
182
183
  const networkFetch = (0, import_transportDiagnostics.wrapFetchWithTransportDiagnostics)(
183
- (0, import_responseSizeLimit.wrapFetchWithSizeLimit)((input, init) => fetch(input, init))
184
+ (0, import_responseSizeLimit.wrapFetchWithSizeLimit)((input, init) => {
185
+ const scopedFetch = callContextStorage.getStore()?.fetchFn;
186
+ return scopedFetch ? scopedFetch(input, init) : fetch(input, init);
187
+ })
184
188
  );
185
189
  const baseFetch = async (url, options) => {
186
190
  const context = callContextStorage.getStore();
@@ -247,7 +251,7 @@ function hasTerminalTaskWithDataArtifact(response) {
247
251
  if (typeof status?.state !== "string" || !TERMINAL_A2A_STATES.has(status.state)) return false;
248
252
  return (0, import_a2a_artifacts.getLatestA2ADataPartFromResponse)(response) !== void 0;
249
253
  }
250
- async function callA2ATool(agentUrl, toolName, parameters, authToken, debugLogs = [], pushNotificationConfig, customHeaders, signingContext, session, signal, requestTimeoutMs) {
254
+ async function callA2ATool(agentUrl, toolName, parameters, authToken, debugLogs = [], pushNotificationConfig, customHeaders, signingContext, session, signal, requestTimeoutMs, fetchFn) {
251
255
  return (0, import_tracing.withSpan)(
252
256
  "adcp.a2a.call_tool",
253
257
  {
@@ -260,7 +264,8 @@ async function callA2ATool(agentUrl, toolName, parameters, authToken, debugLogs
260
264
  debugLogs,
261
265
  got401Ref: { value: false },
262
266
  signal,
263
- requestTimeoutMs
267
+ requestTimeoutMs,
268
+ fetchFn
264
269
  };
265
270
  return import_client2.signingContextStorage.run(
266
271
  signingContext,
@@ -373,8 +378,8 @@ async function callA2AToolImpl(agentUrl, toolName, parameters, authToken, debugL
373
378
  message: `A2A: Authentication required for ${agentUrl}`,
374
379
  timestamp: (/* @__PURE__ */ new Date()).toISOString()
375
380
  });
376
- const challenge = await (0, import_authorization_required.probeAuthChallenge)(agentUrl);
377
- const oauthMetadata = await (0, import_discovery.discoverOAuthMetadata)(agentUrl);
381
+ const challenge = await (0, import_authorization_required.probeAuthChallenge)(agentUrl, { fetchFn: context.fetchFn });
382
+ const oauthMetadata = await (0, import_discovery.discoverOAuthMetadata)(agentUrl, { fetch: context.fetchFn });
378
383
  throw new import_errors.AuthenticationRequiredError(agentUrl, oauthMetadata || void 0, void 0, challenge ?? void 0);
379
384
  }
380
385
  throw error;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/lib/protocols/a2a.ts"],"sourcesContent":["// Official A2A client implementation - NO FALLBACKS\nimport { A2AClient as A2AClientImpl } from '@a2a-js/sdk/client';\nimport { AsyncLocalStorage } from 'node:async_hooks';\nimport { createHmac, randomUUID } from 'node:crypto';\nimport type { PushNotificationConfig } from '../types/tools.generated';\nimport type { DebugLogEntry } from '../types/adcp';\nimport { AuthenticationRequiredError, is401Error } from '../errors';\nimport { discoverOAuthMetadata } from '../auth/oauth/discovery';\nimport { probeAuthChallenge } from '../auth/oauth/authorization-required';\nimport { withSpan, injectTraceHeaders } from '../observability/tracing';\nimport { isAgentCardPath, buildCardUrls } from '../utils/a2a-discovery';\nimport { buildAgentSigningFetch, signingContextStorage, type AgentSigningContext } from '../signing/client';\nimport { toSignerKey, isInlineSigningConfig, isProviderSigningConfig } from '../signing/agent-fetch';\nimport { createSigningFetch, type FetchLike } from '../signing/fetch';\nimport { createSigningFetchAsync } from '../signing/fetch-async';\nimport type { AgentConfig } from '../types/adcp';\nimport { redactIdempotencyKeyInArgs } from '../utils/idempotency';\nimport { wrapFetchWithCapture } from './rawResponseCapture';\nimport { wrapFetchWithSizeLimit } from './responseSizeLimit';\nimport { wrapFetchWithTransportDiagnostics } from './transportDiagnostics';\nimport { DEFAULT_REQUEST_TIMEOUT_MS, resolveRequestTimeoutMs, withAbortSignal } from './abort';\nimport { getLatestA2ADataPartFromResponse } from '../utils/a2a-artifacts';\n\n// The A2A SDK client is used untyped: request/response shapes are validated at\n// runtime against the AdCP wire contract, not against the SDK's exported\n// types. Preserves the prior behaviour of the CommonJS `require` form.\nconst A2AClient: any = A2AClientImpl;\n\nif (!A2AClient) {\n throw new Error('A2A SDK client is required. Please install @a2a-js/sdk');\n}\n\n/**\n * Per-call state flowed through AsyncLocalStorage so concurrent callers\n * that share a cached A2AClient don't clobber each other's debugLogs,\n * customHeaders, or 401 flag.\n */\ninterface A2ACallContext {\n customHeaders?: Record<string, string>;\n debugLogs: DebugLogEntry[];\n got401Ref: { value: boolean };\n signal?: AbortSignal;\n requestTimeoutMs?: number;\n}\n\nconst callContextStorage = new AsyncLocalStorage<A2ACallContext>();\n\n/**\n * Cached A2AClient keyed by (agentUrl, authToken hash). Avoids re-fetching\n * /.well-known/agent.json on every tool call. The cached client's fetchImpl\n * reads per-call state from callContextStorage, so concurrent calls to the\n * same cache entry are safe.\n *\n * Process-global singleton — not suitable for multi-tenant servers that\n * want per-tenant isolation (use separate processes or explicit cache keys).\n */\nconst a2aClientCache = new Map<string, InstanceType<typeof A2AClient>>();\nconst pendingA2AClients = new Map<string, Promise<InstanceType<typeof A2AClient>>>();\n\n/**\n * Build the A2A connection-cache key. Mirrors the rationale in\n * `src/lib/protocols/mcp.ts:connectionCacheKey`: when the caller is using a\n * non-bearer scheme (RFC 7617 Basic from the CLI's `--auth-scheme basic`\n * shape, or any future caller-injected `Authorization` header), `authToken`\n * is undefined and the credential rides on the customHeaders bag. Hashing\n * only `authToken` would let two callers with different `user:pass`\n * credentials share a single cached A2AClient — single-CLI-process safe,\n * multi-tenant SDK consumer not safe.\n *\n * `customHeaders` also feed the key so tenant/routing headers cannot reuse\n * a card/client discovered for another caller.\n */\nfunction a2aCacheKey(\n agentUrl: string,\n authToken?: string,\n signingCacheKey?: string,\n customHeaders?: Record<string, string>\n): string {\n // 64-bit Map-key disambiguator — NOT a password hash. The cached client\n // closes over the full credential, so a hypothetical hash collision still\n // sends the original credential on the wire, just possibly cache-miss\n // and reconnect. Routed via `cacheDisambiguator` (HMAC-SHA256 with empty\n // key) instead of bare `createHash` so CodeQL's\n // `js/insufficient-password-hash` heuristic doesn't misclassify the\n // dataflow — see the helper docstring for the full rationale.\n const fingerprint = authToken ?? extractA2AAuthHeader(customHeaders);\n const tokenSuffix = fingerprint ? `::${cacheDisambiguator(fingerprint)}` : '';\n const headersKey = headersCacheDisambiguator(customHeaders);\n const headersSuffix = headersKey ? `::headers:${headersKey}` : '';\n const signingSuffix = signingCacheKey ? `::${signingCacheKey}` : '';\n return `${agentUrl}${tokenSuffix}${headersSuffix}${signingSuffix}`;\n}\n\n/**\n * Produce a stable 64-bit Map-key disambiguator from credential material.\n * Mirrors the helper in `src/lib/protocols/mcp.ts` — the two protocol\n * modules intentionally don't share runtime imports, so each carries its\n * own copy. See the MCP-side docstring for the full rationale.\n */\nfunction cacheDisambiguator(value: string): string {\n return createHmac('sha256', '').update(value).digest('hex').slice(0, 16);\n}\n\n/**\n * Case-insensitive lookup of `Authorization` on a header bag. Mirrors the\n * MCP-side helper; A2A keeps its own copy because the two protocol modules\n * intentionally don't share runtime imports.\n */\nfunction extractA2AAuthHeader(headers: Record<string, string> | undefined): string | undefined {\n if (!headers) return undefined;\n for (const [key, value] of Object.entries(headers)) {\n if (key.toLowerCase() === 'authorization' && value) return value;\n }\n return undefined;\n}\n\nfunction headersCacheDisambiguator(headers?: Record<string, string>): string | undefined {\n const entries = Object.entries(headers ?? {})\n .filter(([key]) => {\n const lower = key.toLowerCase();\n return lower !== 'traceparent' && lower !== 'tracestate' && lower !== 'baggage';\n })\n .map(([key, value]) => [key.toLowerCase(), value] as const)\n .sort(([a], [b]) => a.localeCompare(b));\n return entries.length > 0 ? cacheDisambiguator(JSON.stringify(entries)) : undefined;\n}\n\nfunction redactHeadersForDebug(headers: Record<string, string>): Record<string, string> {\n return Object.fromEntries(Object.keys(headers).map(key => [key, '***']));\n}\n\nfunction redactPushNotificationConfigForDebug(\n config: PushNotificationConfig | undefined\n): PushNotificationConfig | undefined {\n if (!config) return undefined;\n return {\n ...config,\n ...(config.token && { token: '***' }),\n ...(config.authentication && {\n authentication: {\n ...config.authentication,\n ...(config.authentication.credentials && { credentials: '***' }),\n },\n }),\n };\n}\n\n/**\n * Clear all cached A2A clients. Called by closeConnections('a2a').\n * A2A clients hold no persistent network resources (unlike MCP), so this\n * is just cache eviction.\n */\nexport function closeA2AConnections(): void {\n a2aClientCache.clear();\n pendingA2AClients.clear();\n}\n\n/**\n * Wall-clock cap on a fire-and-forget cancel. A2A sellers that accept the\n * TCP connect but never respond would otherwise pin the event loop past the\n * buyer's abort, which defeats the whole point of fire-and-forget.\n */\nconst CANCEL_TIMEOUT_MS = 5000;\n\n/**\n * Fire-and-forget A2A tasks/cancel for an in-flight task (A2A 0.3.0 §7.4).\n *\n * Sends a raw JSON-RPC 2.0 POST directly to the agent endpoint with the same\n * auth header shape as `callA2AToolImpl` (Bearer + x-adcp-auth). Does NOT\n * enter `callContextStorage` — debug-log capture and 401-cache-eviction are\n * intentionally skipped for best-effort cancellation.\n *\n * **Auth-code OAuth gap:** `authToken` is resolved by `getAuthToken(agent)`,\n * which returns `undefined` for authorization-code-flow sellers (those tokens\n * are managed by the OAuth provider path in `ProtocolClient.callTool`, not\n * accessible here). Cancel calls to those sellers go out unauthenticated and\n * will likely 401 non-fatally.\n *\n * **Phase 2 (adcp-client#1617 follow-up):** when `agent.request_signing` is\n * configured, the cancel POST is signed with the agent's signer key. The\n * `signingContextStorage` ALS scope around `callA2AToolImpl` does NOT extend\n * into `pollTaskCompletion` (sibling promise trees), so we can't replay the\n * captured ALS context — instead we rebuild a one-shot signer fetch from\n * `agent.request_signing` directly and use it for this single POST. Inline\n * keys go through `createSigningFetch` (sync); provider-backed configs use\n * `createSigningFetchAsync`. A `signed-requests` seller that requires\n * signing on `tasks/cancel` (or applies a uniform \"all mutating POSTs must\n * be signed\" policy) now accepts the cancel; one without signing config on\n * the agent gets the Phase 1 unsigned path.\n *\n * The caller is responsible for swallowing errors: cancel failure\n * (TaskNotCancelable, network error, auth rejection, network timeout) is\n * non-fatal because the buyer is already abandoning the task.\n *\n * @param agent The agent config (used for URL, auth token, signing).\n * @param taskId The server-assigned A2A Task.id to cancel.\n */\nexport async function cancelA2ATask(agent: AgentConfig, taskId: string): Promise<void> {\n // Defense-in-depth (ad-tech-protocol-expert review of #1640): the cancel\n // POST is JSON-RPC at the bare A2A endpoint. Calling this on an MCP agent\n // would POST `tasks/cancel` JSON-RPC at an MCP endpoint and 404. The\n // single call site (`pollTaskCompletion`) already gates on\n // `agent.protocol === 'a2a'`; this assertion catches future call sites\n // that forget the gate.\n if (agent.protocol !== 'a2a') {\n return;\n }\n const agentUrl = agent.agent_uri;\n const authToken = agent.auth_token;\n\n const headers: Record<string, string> = {\n 'content-type': 'application/json',\n accept: 'application/json',\n };\n if (authToken) {\n headers['Authorization'] = `Bearer ${authToken}`;\n headers['x-adcp-auth'] = authToken;\n }\n // JSON-RPC 2.0 §4.1.3: `id: null` flags the request as a *notification*,\n // and the server MUST NOT respond. A2A 0.3.0 §7.4 defines `tasks/cancel`\n // as a request/response method (returns the canceled `Task` or\n // `TaskNotCancelableError`), so a strict A2A server can legitimately\n // reject `id: null` as a protocol violation. Use a real id and just drop\n // the response on the floor — fire-and-forget is the caller's discipline,\n // not a wire-protocol claim.\n const body = JSON.stringify({\n jsonrpc: '2.0',\n id: randomUUID(),\n method: 'tasks/cancel',\n params: { id: taskId },\n });\n // Bound the cancel: a hung fetch would orphan-pin the event loop past the\n // buyer's abort, defeating fire-and-forget. AbortSignal.timeout() is the\n // standard primitive; the caller's `.catch()` swallows the AbortError.\n const init: RequestInit = {\n method: 'POST',\n headers,\n body,\n signal: AbortSignal.timeout(CANCEL_TIMEOUT_MS),\n };\n\n // adcp-client#1617 Phase 2: sign the cancel POST when the agent has a\n // signer configured. We bypass the `buildAgentSigningFetch` capability-\n // gate path because `tasks/cancel` is an A2A protocol method, not an\n // AdCP tool — the seller's `request_signing.supported_for` typically\n // lists AdCP tool names, not protocol-level methods. The right model\n // here: if the agent claims signing AT ALL, sign every mutating POST\n // we send to it on the cancel path. Sellers with uniform \"must be\n // signed\" policies accept this; sellers that only check signing on\n // specific AdCP tools simply ignore the extra signature.\n //\n // TODO(adcp#4318, adcp-client#1617): when the AdCP spec adds explicit\n // verifier coverage for A2A protocol methods (likely in 3.1 as a new\n // `protocol_methods_supported_for` / `protocol_methods_required_for`\n // field on `request_signing`), narrow this default by reading the\n // seller's advertised coverage from `getCapability()` and gating on\n // the `tasks/cancel` membership. The over-sign default stays as the\n // fallback for spec-silent sellers (3.0.x and earlier).\n if (agent.request_signing) {\n const upstream: FetchLike = (input, ini) => fetch(input as RequestInfo, ini);\n if (isInlineSigningConfig(agent.request_signing)) {\n const signed = createSigningFetch(upstream, toSignerKey(agent.request_signing));\n await signed(agentUrl, init);\n return;\n }\n if (isProviderSigningConfig(agent.request_signing)) {\n const signed = createSigningFetchAsync(upstream, agent.request_signing.provider);\n await signed(agentUrl, init);\n return;\n }\n }\n\n await fetch(agentUrl, init);\n}\n\nasync function getOrCreateA2AClient(\n agentUrl: string,\n authToken: string | undefined,\n customHeaders?: Record<string, string>,\n bypassCache = false\n): Promise<InstanceType<typeof A2AClient>> {\n const signingContext = signingContextStorage.getStore();\n const cacheKey = a2aCacheKey(agentUrl, authToken, signingContext?.cacheKey, customHeaders);\n if (bypassCache) {\n return createA2AClient(agentUrl, authToken);\n }\n const cached = a2aClientCache.get(cacheKey);\n if (cached) return cached;\n\n const pending = pendingA2AClients.get(cacheKey);\n if (pending) return pending;\n\n const promise = createA2AClient(agentUrl, authToken)\n .then(client => {\n a2aClientCache.set(cacheKey, client);\n return client;\n })\n .finally(() => {\n pendingA2AClients.delete(cacheKey);\n });\n\n pendingA2AClients.set(cacheKey, promise);\n return promise;\n}\n\nasync function createA2AClient(\n agentUrl: string,\n authToken: string | undefined\n): Promise<InstanceType<typeof A2AClient>> {\n const fetchImpl = buildFetchImpl(authToken);\n const cardUrls = buildCardUrls(agentUrl);\n\n const context = callContextStorage.getStore();\n context?.debugLogs.push({\n type: 'info',\n message: `A2A: Discovering agent card at ${cardUrls.join(', ')}`,\n timestamp: new Date().toISOString(),\n });\n\n let client: InstanceType<typeof A2AClient> | undefined;\n let lastError: Error = new Error(`A2A agent card not found at ${cardUrls.join(', ')}`);\n for (const cardUrl of cardUrls) {\n try {\n client = await A2AClient.fromCardUrl(cardUrl, { fetchImpl });\n break;\n } catch (err: unknown) {\n lastError = err as Error;\n if (context?.got401Ref.value) break;\n }\n }\n if (!client) throw lastError;\n\n return client;\n}\n\nfunction buildFetchImpl(authToken: string | undefined) {\n // The A2A client is cached per (url, authToken, signingCacheKey). We capture\n // the signing context at client-creation time so all subsequent calls that\n // share this cached client use the same signing identity — changing identity\n // requires a different cache entry, built on a separate call that enters ALS\n // with a different context.\n const signingContext = signingContextStorage.getStore();\n\n // Innermost wrapper: enforce response body size cap from the active\n // `responseSizeLimitStorage` slot. Pass-through when no slot is set.\n const networkFetch = wrapFetchWithTransportDiagnostics(\n wrapFetchWithSizeLimit((input, init) => fetch(input as any, init))\n );\n\n // Inner fetch handles auth/header injection and 401 detection. If the\n // agent has request-signing configured, we wrap it with the AdCP signing\n // fetch so the signature covers the exact bytes we're about to send (auth\n // headers included, since the signer re-reads the final header record).\n const baseFetch = async (url: string | URL | Request, options?: RequestInit): Promise<Response> => {\n const context = callContextStorage.getStore();\n\n const existingHeaders: Record<string, string> = {};\n if (options?.headers) {\n if (options.headers instanceof Headers) {\n options.headers.forEach((value, key) => {\n existingHeaders[key] = value;\n });\n } else if (Array.isArray(options.headers)) {\n for (const [key, value] of options.headers) {\n existingHeaders[key] = value;\n }\n } else {\n Object.assign(existingHeaders, options.headers);\n }\n }\n\n // Only inject trace context headers for actual tool requests, not discovery.\n // The agent card endpoint is external/untrusted — don't leak trace IDs to it.\n const urlString = typeof url === 'string' ? url : url.toString();\n const isDiscoveryRequest = isAgentCardPath(urlString);\n const traceHeaders = isDiscoveryRequest ? {} : injectTraceHeaders();\n const requestTimeoutMs = isDiscoveryRequest\n ? resolveRequestTimeoutMs(context?.requestTimeoutMs, DEFAULT_REQUEST_TIMEOUT_MS)\n : resolveRequestTimeoutMs(context?.requestTimeoutMs);\n\n // Merge: existing < trace < custom < auth (auth always wins)\n const headers: Record<string, string> = {\n ...existingHeaders,\n ...traceHeaders,\n ...context?.customHeaders,\n ...(authToken && {\n Authorization: `Bearer ${authToken}`,\n 'x-adcp-auth': authToken,\n }),\n };\n\n context?.debugLogs.push({\n type: 'info',\n message: `A2A: Fetch to ${urlString}`,\n timestamp: new Date().toISOString(),\n hasAuth: !!authToken,\n headers: redactHeadersForDebug(headers),\n });\n\n const response = await withAbortSignal<Response>([context?.signal, options?.signal], requestTimeoutMs, signal =>\n networkFetch(url as any, { ...options, headers, signal })\n );\n\n if (response.status === 401 && context) {\n context.got401Ref.value = true;\n }\n\n return response;\n };\n\n if (!signingContext) return wrapFetchWithCapture(baseFetch);\n\n // The signing wrapper assembles headers into the signature base. We invoke\n // it first so the signer sees the caller-supplied headers; baseFetch then\n // overlays auth/trace headers afterwards — A2A's auth scheme (bearer) is\n // not among the MANDATORY_COMPONENTS and is injected by the counterparty's\n // transport layer, not signed.\n const signingFetch = buildAgentSigningFetch({\n upstream: (input, init) => baseFetch(input as any, init),\n signing: signingContext.signing,\n getCapability: signingContext.getCapability,\n });\n return wrapFetchWithCapture(signingFetch as typeof fetch);\n}\n\n/**\n * Terminal A2A task states per A2A 0.3.0 §3.4. Only these can carry the\n * AdCP-mandated artifact + DataPart envelope (per transport-errors §A2A\n * Binding); intermediate states (`working`, `submitted`, `input-required`,\n * `auth-required`) carry no completion artifact.\n */\nconst TERMINAL_A2A_STATES = new Set(['completed', 'failed', 'rejected', 'canceled']);\n\n/**\n * Detect whether a JSON-RPC response carries a spec-compliant terminal-state\n * Task with at least one artifact containing a structured DataPart payload.\n * Per AdCP transport-errors §A2A Binding, the artifact's DataPart is the\n * canonical envelope for both the success arm (`completed`) and the error\n * arms (`failed` / `rejected` / `canceled`). The criterion intentionally\n * matches the unwrapper's terminal-state extraction in\n * `unwrapA2AResponse` — keeping protocol layer and unwrapper in lockstep\n * across all terminal states, not just the error arms.\n *\n * Used to short-circuit the generic \"A2A agent returned error\" throw when\n * a non-conformant seller surfaces both a transport-level `result.error`\n * hint and the canonical artifact envelope side-by-side. The DataPart is\n * authoritative; the throw would otherwise swallow it.\n */\nfunction hasTerminalTaskWithDataArtifact(response: unknown): boolean {\n if (!response || typeof response !== 'object') return false;\n const result = (response as { result?: unknown }).result;\n if (!result || typeof result !== 'object') return false;\n const r = result as { kind?: unknown; status?: unknown; artifacts?: unknown };\n if (r.kind !== 'task') return false;\n const status = r.status as { state?: unknown } | undefined;\n if (typeof status?.state !== 'string' || !TERMINAL_A2A_STATES.has(status.state)) return false;\n return getLatestA2ADataPartFromResponse(response) !== undefined;\n}\n\n/**\n * Protocol-level session identifiers that ride on the A2A Message envelope\n * (not in the skill parameters). `contextId` binds sends to a server-side\n * conversation; `taskId` resumes an existing non-terminal task.\n *\n * Callers (buyers) typically retain these across calls on a per-conversation\n * AgentClient; see AgentClient.getContextId() / getPendingTaskId().\n */\nexport interface A2ASessionIds {\n contextId?: string;\n taskId?: string;\n}\n\nexport async function callA2ATool(\n agentUrl: string,\n toolName: string,\n parameters: Record<string, unknown>,\n authToken?: string,\n debugLogs: DebugLogEntry[] = [],\n pushNotificationConfig?: PushNotificationConfig,\n customHeaders?: Record<string, string>,\n signingContext?: AgentSigningContext,\n session?: A2ASessionIds,\n signal?: AbortSignal,\n requestTimeoutMs?: number\n): Promise<unknown> {\n return withSpan(\n 'adcp.a2a.call_tool',\n {\n 'adcp.tool': toolName,\n 'http.url': agentUrl,\n },\n async () => {\n const context: A2ACallContext = {\n customHeaders,\n debugLogs,\n got401Ref: { value: false },\n signal,\n requestTimeoutMs,\n };\n return signingContextStorage.run(signingContext, () =>\n callContextStorage.run(context, () =>\n callA2AToolImpl(\n agentUrl,\n toolName,\n parameters,\n authToken,\n debugLogs,\n pushNotificationConfig,\n context,\n session\n )\n )\n );\n }\n );\n}\n\nasync function callA2AToolImpl(\n agentUrl: string,\n toolName: string,\n parameters: Record<string, unknown>,\n authToken: string | undefined,\n debugLogs: DebugLogEntry[],\n pushNotificationConfig: PushNotificationConfig | undefined,\n context: A2ACallContext,\n session: A2ASessionIds | undefined\n): Promise<unknown> {\n try {\n const client = await getOrCreateA2AClient(\n agentUrl,\n authToken,\n context.customHeaders,\n !!context.signal || context.requestTimeoutMs !== undefined\n );\n\n const requestPayload: {\n message: {\n messageId: string;\n role: string;\n kind: string;\n parts: Array<{ kind: string; data: { skill: string; parameters: Record<string, unknown> } }>;\n contextId?: string;\n taskId?: string;\n };\n configuration?: { pushNotificationConfig: PushNotificationConfig };\n } = {\n message: {\n messageId: `msg_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`,\n role: 'user',\n kind: 'message',\n parts: [\n {\n kind: 'data',\n data: {\n skill: toolName,\n parameters: parameters,\n },\n },\n ],\n ...(session?.contextId && { contextId: session.contextId }),\n ...(session?.taskId && { taskId: session.taskId }),\n },\n };\n\n if (pushNotificationConfig) {\n requestPayload.configuration = {\n pushNotificationConfig: pushNotificationConfig,\n };\n }\n\n const payloadSize = JSON.stringify(requestPayload).length;\n const redactedParameters = redactIdempotencyKeyInArgs(parameters);\n const redactedPayload = {\n ...requestPayload,\n message: {\n ...requestPayload.message,\n parts: [\n {\n kind: 'data',\n data: { skill: toolName, parameters: redactedParameters },\n },\n ],\n },\n ...(requestPayload.configuration && {\n configuration: {\n pushNotificationConfig: redactPushNotificationConfigForDebug(\n requestPayload.configuration.pushNotificationConfig\n )!,\n },\n }),\n };\n debugLogs.push({\n type: 'info',\n message: `A2A: Calling skill ${toolName} with parameters: ${JSON.stringify(\n redactedParameters\n )}. Payload size: ${payloadSize} bytes`,\n timestamp: new Date().toISOString(),\n payloadSize,\n actualPayload: redactedPayload,\n });\n\n debugLogs.push({\n type: 'info',\n message: `A2A: Sending message via sendMessage()`,\n timestamp: new Date().toISOString(),\n skill: toolName,\n });\n\n const messageResponse = await client.sendMessage(requestPayload);\n\n debugLogs.push({\n type: messageResponse?.error ? 'error' : 'success',\n message: `A2A: Response received (${messageResponse?.error ? 'error' : 'success'})`,\n timestamp: new Date().toISOString(),\n response: messageResponse,\n skill: toolName,\n });\n\n if (messageResponse?.error || messageResponse?.result?.error) {\n // adcp-client#1575: when the seller emits a spec-compliant terminal-state\n // Task carrying an `adcp_error` DataPart (per AdCP transport-errors §A2A\n // Binding), the structured artifact is canonical — even if the seller\n // also surfaced a transport-level error string. Pass the response\n // through so the upstream unwrapper extracts `adcp_error.code` instead\n // of throwing a generic message that loses the AdCP error envelope.\n if (!hasTerminalTaskWithDataArtifact(messageResponse)) {\n const errorObj = messageResponse.error || messageResponse.result?.error;\n const errorMessage = errorObj.message || JSON.stringify(errorObj);\n throw new Error(`A2A agent returned error: ${errorMessage}`);\n }\n }\n\n return messageResponse;\n } catch (error: unknown) {\n if (is401Error(error, context.got401Ref.value)) {\n // Evict this cache entry — credential may have expired or been\n // revoked. Same disambiguator as the original `getOrCreateA2AClient`\n // call: when the credential rode on customHeaders.Authorization (Basic\n // case) rather than authToken, the cache key must reflect that or we\n // evict the wrong entry.\n const signingContext = signingContextStorage.getStore();\n a2aClientCache.delete(a2aCacheKey(agentUrl, authToken, signingContext?.cacheKey, context.customHeaders));\n\n debugLogs.push({\n type: 'error',\n message: `A2A: Authentication required for ${agentUrl}`,\n timestamp: new Date().toISOString(),\n });\n\n // Re-probe to surface the WWW-Authenticate scheme on the error envelope.\n // Basic-fronted agents (Apigee/Kong/AWS API GW with a BasicAuthentication\n // policy) would otherwise leave consumers chasing OAuth metadata that\n // doesn't exist. Matches the MCP discovery throw site in\n // `SingleAgentClient.discoverMCPEndpoint`.\n const challenge = await probeAuthChallenge(agentUrl);\n const oauthMetadata = await discoverOAuthMetadata(agentUrl);\n throw new AuthenticationRequiredError(agentUrl, oauthMetadata || undefined, undefined, challenge ?? undefined);\n }\n\n throw error;\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,oBAA2C;AAC3C,8BAAkC;AAClC,yBAAuC;AAGvC,oBAAwD;AACxD,uBAAsC;AACtC,oCAAmC;AACnC,qBAA6C;AAC7C,2BAA+C;AAC/C,IAAAA,iBAAwF;AACxF,yBAA4E;AAC5E,mBAAmD;AACnD,yBAAwC;AAExC,yBAA2C;AAC3C,gCAAqC;AACrC,+BAAuC;AACvC,kCAAkD;AAClD,mBAAqF;AACrF,2BAAiD;AAKjD,MAAM,YAAiB,cAAAC;AAEvB,IAAI,CAAC,WAAW;AACd,QAAM,IAAI,MAAM,wDAAwD;AAC1E;AAeA,MAAM,qBAAqB,IAAI,0CAAkC;AAWjE,MAAM,iBAAiB,oBAAI,IAA4C;AACvE,MAAM,oBAAoB,oBAAI,IAAqD;AAenF,SAAS,YACP,UACA,WACA,iBACA,eACQ;AAQR,QAAM,cAAc,aAAa,qBAAqB,aAAa;AACnE,QAAM,cAAc,cAAc,KAAK,mBAAmB,WAAW,CAAC,KAAK;AAC3E,QAAM,aAAa,0BAA0B,aAAa;AAC1D,QAAM,gBAAgB,aAAa,aAAa,UAAU,KAAK;AAC/D,QAAM,gBAAgB,kBAAkB,KAAK,eAAe,KAAK;AACjE,SAAO,GAAG,QAAQ,GAAG,WAAW,GAAG,aAAa,GAAG,aAAa;AAClE;AAQA,SAAS,mBAAmB,OAAuB;AACjD,aAAO,+BAAW,UAAU,EAAE,EAAE,OAAO,KAAK,EAAE,OAAO,KAAK,EAAE,MAAM,GAAG,EAAE;AACzE;AAOA,SAAS,qBAAqB,SAAiE;AAC7F,MAAI,CAAC,QAAS,QAAO;AACrB,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,OAAO,GAAG;AAClD,QAAI,IAAI,YAAY,MAAM,mBAAmB,MAAO,QAAO;AAAA,EAC7D;AACA,SAAO;AACT;AAEA,SAAS,0BAA0B,SAAsD;AACvF,QAAM,UAAU,OAAO,QAAQ,WAAW,CAAC,CAAC,EACzC,OAAO,CAAC,CAAC,GAAG,MAAM;AACjB,UAAM,QAAQ,IAAI,YAAY;AAC9B,WAAO,UAAU,iBAAiB,UAAU,gBAAgB,UAAU;AAAA,EACxE,CAAC,EACA,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM,CAAC,IAAI,YAAY,GAAG,KAAK,CAAU,EACzD,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;AACxC,SAAO,QAAQ,SAAS,IAAI,mBAAmB,KAAK,UAAU,OAAO,CAAC,IAAI;AAC5E;AAEA,SAAS,sBAAsB,SAAyD;AACtF,SAAO,OAAO,YAAY,OAAO,KAAK,OAAO,EAAE,IAAI,SAAO,CAAC,KAAK,KAAK,CAAC,CAAC;AACzE;AAEA,SAAS,qCACP,QACoC;AACpC,MAAI,CAAC,OAAQ,QAAO;AACpB,SAAO;AAAA,IACL,GAAG;AAAA,IACH,GAAI,OAAO,SAAS,EAAE,OAAO,MAAM;AAAA,IACnC,GAAI,OAAO,kBAAkB;AAAA,MAC3B,gBAAgB;AAAA,QACd,GAAG,OAAO;AAAA,QACV,GAAI,OAAO,eAAe,eAAe,EAAE,aAAa,MAAM;AAAA,MAChE;AAAA,IACF;AAAA,EACF;AACF;AAOO,SAAS,sBAA4B;AAC1C,iBAAe,MAAM;AACrB,oBAAkB,MAAM;AAC1B;AAOA,MAAM,oBAAoB;AAmC1B,eAAsB,cAAc,OAAoB,QAA+B;AAOrF,MAAI,MAAM,aAAa,OAAO;AAC5B;AAAA,EACF;AACA,QAAM,WAAW,MAAM;AACvB,QAAM,YAAY,MAAM;AAExB,QAAM,UAAkC;AAAA,IACtC,gBAAgB;AAAA,IAChB,QAAQ;AAAA,EACV;AACA,MAAI,WAAW;AACb,YAAQ,eAAe,IAAI,UAAU,SAAS;AAC9C,YAAQ,aAAa,IAAI;AAAA,EAC3B;AAQA,QAAM,OAAO,KAAK,UAAU;AAAA,IAC1B,SAAS;AAAA,IACT,QAAI,+BAAW;AAAA,IACf,QAAQ;AAAA,IACR,QAAQ,EAAE,IAAI,OAAO;AAAA,EACvB,CAAC;AAID,QAAM,OAAoB;AAAA,IACxB,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,IACA,QAAQ,YAAY,QAAQ,iBAAiB;AAAA,EAC/C;AAmBA,MAAI,MAAM,iBAAiB;AACzB,UAAM,WAAsB,CAAC,OAAO,QAAQ,MAAM,OAAsB,GAAG;AAC3E,YAAI,0CAAsB,MAAM,eAAe,GAAG;AAChD,YAAM,aAAS,iCAAmB,cAAU,gCAAY,MAAM,eAAe,CAAC;AAC9E,YAAM,OAAO,UAAU,IAAI;AAC3B;AAAA,IACF;AACA,YAAI,4CAAwB,MAAM,eAAe,GAAG;AAClD,YAAM,aAAS,4CAAwB,UAAU,MAAM,gBAAgB,QAAQ;AAC/E,YAAM,OAAO,UAAU,IAAI;AAC3B;AAAA,IACF;AAAA,EACF;AAEA,QAAM,MAAM,UAAU,IAAI;AAC5B;AAEA,eAAe,qBACb,UACA,WACA,eACA,cAAc,OAC2B;AACzC,QAAM,iBAAiB,qCAAsB,SAAS;AACtD,QAAM,WAAW,YAAY,UAAU,WAAW,gBAAgB,UAAU,aAAa;AACzF,MAAI,aAAa;AACf,WAAO,gBAAgB,UAAU,SAAS;AAAA,EAC5C;AACA,QAAM,SAAS,eAAe,IAAI,QAAQ;AAC1C,MAAI,OAAQ,QAAO;AAEnB,QAAM,UAAU,kBAAkB,IAAI,QAAQ;AAC9C,MAAI,QAAS,QAAO;AAEpB,QAAM,UAAU,gBAAgB,UAAU,SAAS,EAChD,KAAK,YAAU;AACd,mBAAe,IAAI,UAAU,MAAM;AACnC,WAAO;AAAA,EACT,CAAC,EACA,QAAQ,MAAM;AACb,sBAAkB,OAAO,QAAQ;AAAA,EACnC,CAAC;AAEH,oBAAkB,IAAI,UAAU,OAAO;AACvC,SAAO;AACT;AAEA,eAAe,gBACb,UACA,WACyC;AACzC,QAAM,YAAY,eAAe,SAAS;AAC1C,QAAM,eAAW,oCAAc,QAAQ;AAEvC,QAAM,UAAU,mBAAmB,SAAS;AAC5C,WAAS,UAAU,KAAK;AAAA,IACtB,MAAM;AAAA,IACN,SAAS,kCAAkC,SAAS,KAAK,IAAI,CAAC;AAAA,IAC9D,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,EACpC,CAAC;AAED,MAAI;AACJ,MAAI,YAAmB,IAAI,MAAM,+BAA+B,SAAS,KAAK,IAAI,CAAC,EAAE;AACrF,aAAW,WAAW,UAAU;AAC9B,QAAI;AACF,eAAS,MAAM,UAAU,YAAY,SAAS,EAAE,UAAU,CAAC;AAC3D;AAAA,IACF,SAAS,KAAc;AACrB,kBAAY;AACZ,UAAI,SAAS,UAAU,MAAO;AAAA,IAChC;AAAA,EACF;AACA,MAAI,CAAC,OAAQ,OAAM;AAEnB,SAAO;AACT;AAEA,SAAS,eAAe,WAA+B;AAMrD,QAAM,iBAAiB,qCAAsB,SAAS;AAItD,QAAM,mBAAe;AAAA,QACnB,iDAAuB,CAAC,OAAO,SAAS,MAAM,OAAc,IAAI,CAAC;AAAA,EACnE;AAMA,QAAM,YAAY,OAAO,KAA6B,YAA6C;AACjG,UAAM,UAAU,mBAAmB,SAAS;AAE5C,UAAM,kBAA0C,CAAC;AACjD,QAAI,SAAS,SAAS;AACpB,UAAI,QAAQ,mBAAmB,SAAS;AACtC,gBAAQ,QAAQ,QAAQ,CAAC,OAAO,QAAQ;AACtC,0BAAgB,GAAG,IAAI;AAAA,QACzB,CAAC;AAAA,MACH,WAAW,MAAM,QAAQ,QAAQ,OAAO,GAAG;AACzC,mBAAW,CAAC,KAAK,KAAK,KAAK,QAAQ,SAAS;AAC1C,0BAAgB,GAAG,IAAI;AAAA,QACzB;AAAA,MACF,OAAO;AACL,eAAO,OAAO,iBAAiB,QAAQ,OAAO;AAAA,MAChD;AAAA,IACF;AAIA,UAAM,YAAY,OAAO,QAAQ,WAAW,MAAM,IAAI,SAAS;AAC/D,UAAM,yBAAqB,sCAAgB,SAAS;AACpD,UAAM,eAAe,qBAAqB,CAAC,QAAI,mCAAmB;AAClE,UAAM,mBAAmB,yBACrB,sCAAwB,SAAS,kBAAkB,uCAA0B,QAC7E,sCAAwB,SAAS,gBAAgB;AAGrD,UAAM,UAAkC;AAAA,MACtC,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG,SAAS;AAAA,MACZ,GAAI,aAAa;AAAA,QACf,eAAe,UAAU,SAAS;AAAA,QAClC,eAAe;AAAA,MACjB;AAAA,IACF;AAEA,aAAS,UAAU,KAAK;AAAA,MACtB,MAAM;AAAA,MACN,SAAS,iBAAiB,SAAS;AAAA,MACnC,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,MAClC,SAAS,CAAC,CAAC;AAAA,MACX,SAAS,sBAAsB,OAAO;AAAA,IACxC,CAAC;AAED,UAAM,WAAW,UAAM;AAAA,MAA0B,CAAC,SAAS,QAAQ,SAAS,MAAM;AAAA,MAAG;AAAA,MAAkB,YACrG,aAAa,KAAY,EAAE,GAAG,SAAS,SAAS,OAAO,CAAC;AAAA,IAC1D;AAEA,QAAI,SAAS,WAAW,OAAO,SAAS;AACtC,cAAQ,UAAU,QAAQ;AAAA,IAC5B;AAEA,WAAO;AAAA,EACT;AAEA,MAAI,CAAC,eAAgB,YAAO,gDAAqB,SAAS;AAO1D,QAAM,mBAAe,uCAAuB;AAAA,IAC1C,UAAU,CAAC,OAAO,SAAS,UAAU,OAAc,IAAI;AAAA,IACvD,SAAS,eAAe;AAAA,IACxB,eAAe,eAAe;AAAA,EAChC,CAAC;AACD,aAAO,gDAAqB,YAA4B;AAC1D;AAQA,MAAM,sBAAsB,oBAAI,IAAI,CAAC,aAAa,UAAU,YAAY,UAAU,CAAC;AAiBnF,SAAS,gCAAgC,UAA4B;AACnE,MAAI,CAAC,YAAY,OAAO,aAAa,SAAU,QAAO;AACtD,QAAM,SAAU,SAAkC;AAClD,MAAI,CAAC,UAAU,OAAO,WAAW,SAAU,QAAO;AAClD,QAAM,IAAI;AACV,MAAI,EAAE,SAAS,OAAQ,QAAO;AAC9B,QAAM,SAAS,EAAE;AACjB,MAAI,OAAO,QAAQ,UAAU,YAAY,CAAC,oBAAoB,IAAI,OAAO,KAAK,EAAG,QAAO;AACxF,aAAO,uDAAiC,QAAQ,MAAM;AACxD;AAeA,eAAsB,YACpB,UACA,UACA,YACA,WACA,YAA6B,CAAC,GAC9B,wBACA,eACA,gBACA,SACA,QACA,kBACkB;AAClB,aAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,YAAY;AAAA,IACd;AAAA,IACA,YAAY;AACV,YAAM,UAA0B;AAAA,QAC9B;AAAA,QACA;AAAA,QACA,WAAW,EAAE,OAAO,MAAM;AAAA,QAC1B;AAAA,QACA;AAAA,MACF;AACA,aAAO,qCAAsB;AAAA,QAAI;AAAA,QAAgB,MAC/C,mBAAmB;AAAA,UAAI;AAAA,UAAS,MAC9B;AAAA,YACE;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEA,eAAe,gBACb,UACA,UACA,YACA,WACA,WACA,wBACA,SACA,SACkB;AAClB,MAAI;AACF,UAAM,SAAS,MAAM;AAAA,MACnB;AAAA,MACA;AAAA,MACA,QAAQ;AAAA,MACR,CAAC,CAAC,QAAQ,UAAU,QAAQ,qBAAqB;AAAA,IACnD;AAEA,UAAM,iBAUF;AAAA,MACF,SAAS;AAAA,QACP,WAAW,OAAO,KAAK,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,OAAO,GAAG,CAAC,CAAC;AAAA,QACvE,MAAM;AAAA,QACN,MAAM;AAAA,QACN,OAAO;AAAA,UACL;AAAA,YACE,MAAM;AAAA,YACN,MAAM;AAAA,cACJ,OAAO;AAAA,cACP;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,QACA,GAAI,SAAS,aAAa,EAAE,WAAW,QAAQ,UAAU;AAAA,QACzD,GAAI,SAAS,UAAU,EAAE,QAAQ,QAAQ,OAAO;AAAA,MAClD;AAAA,IACF;AAEA,QAAI,wBAAwB;AAC1B,qBAAe,gBAAgB;AAAA,QAC7B;AAAA,MACF;AAAA,IACF;AAEA,UAAM,cAAc,KAAK,UAAU,cAAc,EAAE;AACnD,UAAM,yBAAqB,+CAA2B,UAAU;AAChE,UAAM,kBAAkB;AAAA,MACtB,GAAG;AAAA,MACH,SAAS;AAAA,QACP,GAAG,eAAe;AAAA,QAClB,OAAO;AAAA,UACL;AAAA,YACE,MAAM;AAAA,YACN,MAAM,EAAE,OAAO,UAAU,YAAY,mBAAmB;AAAA,UAC1D;AAAA,QACF;AAAA,MACF;AAAA,MACA,GAAI,eAAe,iBAAiB;AAAA,QAClC,eAAe;AAAA,UACb,wBAAwB;AAAA,YACtB,eAAe,cAAc;AAAA,UAC/B;AAAA,QACF;AAAA,MACF;AAAA,IACF;AACA,cAAU,KAAK;AAAA,MACb,MAAM;AAAA,MACN,SAAS,sBAAsB,QAAQ,qBAAqB,KAAK;AAAA,QAC/D;AAAA,MACF,CAAC,mBAAmB,WAAW;AAAA,MAC/B,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,MAClC;AAAA,MACA,eAAe;AAAA,IACjB,CAAC;AAED,cAAU,KAAK;AAAA,MACb,MAAM;AAAA,MACN,SAAS;AAAA,MACT,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,MAClC,OAAO;AAAA,IACT,CAAC;AAED,UAAM,kBAAkB,MAAM,OAAO,YAAY,cAAc;AAE/D,cAAU,KAAK;AAAA,MACb,MAAM,iBAAiB,QAAQ,UAAU;AAAA,MACzC,SAAS,2BAA2B,iBAAiB,QAAQ,UAAU,SAAS;AAAA,MAChF,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,MAClC,UAAU;AAAA,MACV,OAAO;AAAA,IACT,CAAC;AAED,QAAI,iBAAiB,SAAS,iBAAiB,QAAQ,OAAO;AAO5D,UAAI,CAAC,gCAAgC,eAAe,GAAG;AACrD,cAAM,WAAW,gBAAgB,SAAS,gBAAgB,QAAQ;AAClE,cAAM,eAAe,SAAS,WAAW,KAAK,UAAU,QAAQ;AAChE,cAAM,IAAI,MAAM,6BAA6B,YAAY,EAAE;AAAA,MAC7D;AAAA,IACF;AAEA,WAAO;AAAA,EACT,SAAS,OAAgB;AACvB,YAAI,0BAAW,OAAO,QAAQ,UAAU,KAAK,GAAG;AAM9C,YAAM,iBAAiB,qCAAsB,SAAS;AACtD,qBAAe,OAAO,YAAY,UAAU,WAAW,gBAAgB,UAAU,QAAQ,aAAa,CAAC;AAEvG,gBAAU,KAAK;AAAA,QACb,MAAM;AAAA,QACN,SAAS,oCAAoC,QAAQ;AAAA,QACrD,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,MACpC,CAAC;AAOD,YAAM,YAAY,UAAM,kDAAmB,QAAQ;AACnD,YAAM,gBAAgB,UAAM,wCAAsB,QAAQ;AAC1D,YAAM,IAAI,0CAA4B,UAAU,iBAAiB,QAAW,QAAW,aAAa,MAAS;AAAA,IAC/G;AAEA,UAAM;AAAA,EACR;AACF;","names":["import_client","A2AClientImpl"]}
1
+ {"version":3,"sources":["../../../src/lib/protocols/a2a.ts"],"sourcesContent":["// Official A2A client implementation - NO FALLBACKS\nimport { A2AClient as A2AClientImpl } from '@a2a-js/sdk/client';\nimport { AsyncLocalStorage } from 'node:async_hooks';\nimport { createHmac, randomUUID } from 'node:crypto';\nimport type { PushNotificationConfig } from '../types/tools.generated';\nimport type { DebugLogEntry } from '../types/adcp';\nimport { AuthenticationRequiredError, is401Error } from '../errors';\nimport { discoverOAuthMetadata } from '../auth/oauth/discovery';\nimport { probeAuthChallenge } from '../auth/oauth/authorization-required';\nimport { withSpan, injectTraceHeaders } from '../observability/tracing';\nimport { isAgentCardPath, buildCardUrls } from '../utils/a2a-discovery';\nimport { buildAgentSigningFetch, signingContextStorage, type AgentSigningContext } from '../signing/client';\nimport { toSignerKey, isInlineSigningConfig, isProviderSigningConfig } from '../signing/agent-fetch';\nimport { createSigningFetch, type FetchLike } from '../signing/fetch';\nimport { createSigningFetchAsync } from '../signing/fetch-async';\nimport type { AgentConfig } from '../types/adcp';\nimport { redactIdempotencyKeyInArgs } from '../utils/idempotency';\nimport { wrapFetchWithCapture } from './rawResponseCapture';\nimport { wrapFetchWithSizeLimit } from './responseSizeLimit';\nimport { wrapFetchWithTransportDiagnostics } from './transportDiagnostics';\nimport { DEFAULT_REQUEST_TIMEOUT_MS, resolveRequestTimeoutMs, withAbortSignal } from './abort';\nimport { getLatestA2ADataPartFromResponse } from '../utils/a2a-artifacts';\n\n// The A2A SDK client is used untyped: request/response shapes are validated at\n// runtime against the AdCP wire contract, not against the SDK's exported\n// types. Preserves the prior behaviour of the CommonJS `require` form.\nconst A2AClient: any = A2AClientImpl;\n\nif (!A2AClient) {\n throw new Error('A2A SDK client is required. Please install @a2a-js/sdk');\n}\n\n/**\n * Per-call state flowed through AsyncLocalStorage so concurrent callers\n * that share a cached A2AClient don't clobber each other's debugLogs,\n * customHeaders, or 401 flag.\n */\ninterface A2ACallContext {\n customHeaders?: Record<string, string>;\n debugLogs: DebugLogEntry[];\n got401Ref: { value: boolean };\n signal?: AbortSignal;\n requestTimeoutMs?: number;\n fetchFn?: typeof fetch;\n}\n\nconst callContextStorage = new AsyncLocalStorage<A2ACallContext>();\n\n/**\n * Cached A2AClient keyed by (agentUrl, authToken hash). Avoids re-fetching\n * /.well-known/agent.json on every tool call. The cached client's fetchImpl\n * reads per-call state from callContextStorage, so concurrent calls to the\n * same cache entry are safe.\n *\n * Process-global singleton — not suitable for multi-tenant servers that\n * want per-tenant isolation (use separate processes or explicit cache keys).\n */\nconst a2aClientCache = new Map<string, InstanceType<typeof A2AClient>>();\nconst pendingA2AClients = new Map<string, Promise<InstanceType<typeof A2AClient>>>();\n\n/**\n * Build the A2A connection-cache key. Mirrors the rationale in\n * `src/lib/protocols/mcp.ts:connectionCacheKey`: when the caller is using a\n * non-bearer scheme (RFC 7617 Basic from the CLI's `--auth-scheme basic`\n * shape, or any future caller-injected `Authorization` header), `authToken`\n * is undefined and the credential rides on the customHeaders bag. Hashing\n * only `authToken` would let two callers with different `user:pass`\n * credentials share a single cached A2AClient — single-CLI-process safe,\n * multi-tenant SDK consumer not safe.\n *\n * `customHeaders` also feed the key so tenant/routing headers cannot reuse a\n * card/client discovered for another caller. Scoped fetch calls bypass this\n * cache entirely (see `getOrCreateA2AClient`).\n */\nfunction a2aCacheKey(\n agentUrl: string,\n authToken?: string,\n signingCacheKey?: string,\n customHeaders?: Record<string, string>\n): string {\n // 64-bit Map-key disambiguator — NOT a password hash. The cached client\n // closes over the full credential, so a hypothetical hash collision still\n // sends the original credential on the wire, just possibly cache-miss\n // and reconnect. Routed via `cacheDisambiguator` (HMAC-SHA256 with empty\n // key) instead of bare `createHash` so CodeQL's\n // `js/insufficient-password-hash` heuristic doesn't misclassify the\n // dataflow — see the helper docstring for the full rationale.\n const fingerprint = authToken ?? extractA2AAuthHeader(customHeaders);\n const tokenSuffix = fingerprint ? `::${cacheDisambiguator(fingerprint)}` : '';\n const headersKey = headersCacheDisambiguator(customHeaders);\n const headersSuffix = headersKey ? `::headers:${headersKey}` : '';\n const signingSuffix = signingCacheKey ? `::${signingCacheKey}` : '';\n return `${agentUrl}${tokenSuffix}${headersSuffix}${signingSuffix}`;\n}\n\n/**\n * Produce a stable 64-bit Map-key disambiguator from credential material.\n * Mirrors the helper in `src/lib/protocols/mcp.ts` — the two protocol\n * modules intentionally don't share runtime imports, so each carries its\n * own copy. See the MCP-side docstring for the full rationale.\n */\nfunction cacheDisambiguator(value: string): string {\n return createHmac('sha256', '').update(value).digest('hex').slice(0, 16);\n}\n\n/**\n * Case-insensitive lookup of `Authorization` on a header bag. Mirrors the\n * MCP-side helper; A2A keeps its own copy because the two protocol modules\n * intentionally don't share runtime imports.\n */\nfunction extractA2AAuthHeader(headers: Record<string, string> | undefined): string | undefined {\n if (!headers) return undefined;\n for (const [key, value] of Object.entries(headers)) {\n if (key.toLowerCase() === 'authorization' && value) return value;\n }\n return undefined;\n}\n\nfunction headersCacheDisambiguator(headers?: Record<string, string>): string | undefined {\n const entries = Object.entries(headers ?? {})\n .filter(([key]) => {\n const lower = key.toLowerCase();\n return lower !== 'traceparent' && lower !== 'tracestate' && lower !== 'baggage';\n })\n .map(([key, value]) => [key.toLowerCase(), value] as const)\n .sort(([a], [b]) => a.localeCompare(b));\n return entries.length > 0 ? cacheDisambiguator(JSON.stringify(entries)) : undefined;\n}\n\nfunction redactHeadersForDebug(headers: Record<string, string>): Record<string, string> {\n return Object.fromEntries(Object.keys(headers).map(key => [key, '***']));\n}\n\nfunction redactPushNotificationConfigForDebug(\n config: PushNotificationConfig | undefined\n): PushNotificationConfig | undefined {\n if (!config) return undefined;\n return {\n ...config,\n ...(config.token && { token: '***' }),\n ...(config.authentication && {\n authentication: {\n ...config.authentication,\n ...(config.authentication.credentials && { credentials: '***' }),\n },\n }),\n };\n}\n\n/**\n * Clear all cached A2A clients. Called by closeConnections('a2a').\n * A2A clients hold no persistent network resources (unlike MCP), so this\n * is just cache eviction.\n */\nexport function closeA2AConnections(): void {\n a2aClientCache.clear();\n pendingA2AClients.clear();\n}\n\n/**\n * Wall-clock cap on a fire-and-forget cancel. A2A sellers that accept the\n * TCP connect but never respond would otherwise pin the event loop past the\n * buyer's abort, which defeats the whole point of fire-and-forget.\n */\nconst CANCEL_TIMEOUT_MS = 5000;\n\n/**\n * Fire-and-forget A2A tasks/cancel for an in-flight task (A2A 0.3.0 §7.4).\n *\n * Sends a raw JSON-RPC 2.0 POST directly to the agent endpoint with the same\n * auth header shape as `callA2AToolImpl` (Bearer + x-adcp-auth). Does NOT\n * enter `callContextStorage` — debug-log capture and 401-cache-eviction are\n * intentionally skipped for best-effort cancellation.\n *\n * **Auth-code OAuth gap:** `authToken` is resolved by `getAuthToken(agent)`,\n * which returns `undefined` for authorization-code-flow sellers (those tokens\n * are managed by the OAuth provider path in `ProtocolClient.callTool`, not\n * accessible here). Cancel calls to those sellers go out unauthenticated and\n * will likely 401 non-fatally.\n *\n * **Phase 2 (adcp-client#1617 follow-up):** when `agent.request_signing` is\n * configured, the cancel POST is signed with the agent's signer key. The\n * `signingContextStorage` ALS scope around `callA2AToolImpl` does NOT extend\n * into `pollTaskCompletion` (sibling promise trees), so we can't replay the\n * captured ALS context — instead we rebuild a one-shot signer fetch from\n * `agent.request_signing` directly and use it for this single POST. Inline\n * keys go through `createSigningFetch` (sync); provider-backed configs use\n * `createSigningFetchAsync`. A `signed-requests` seller that requires\n * signing on `tasks/cancel` (or applies a uniform \"all mutating POSTs must\n * be signed\" policy) now accepts the cancel; one without signing config on\n * the agent gets the Phase 1 unsigned path.\n *\n * The caller is responsible for swallowing errors: cancel failure\n * (TaskNotCancelable, network error, auth rejection, network timeout) is\n * non-fatal because the buyer is already abandoning the task.\n *\n * @param agent The agent config (used for URL, auth token, signing).\n * @param taskId The server-assigned A2A Task.id to cancel.\n */\nexport async function cancelA2ATask(agent: AgentConfig, taskId: string, fetchFn?: typeof fetch): Promise<void> {\n // Defense-in-depth (ad-tech-protocol-expert review of #1640): the cancel\n // POST is JSON-RPC at the bare A2A endpoint. Calling this on an MCP agent\n // would POST `tasks/cancel` JSON-RPC at an MCP endpoint and 404. The\n // single call site (`pollTaskCompletion`) already gates on\n // `agent.protocol === 'a2a'`; this assertion catches future call sites\n // that forget the gate.\n if (agent.protocol !== 'a2a') {\n return;\n }\n const agentUrl = agent.agent_uri;\n const authToken = agent.auth_token;\n\n const headers: Record<string, string> = {\n 'content-type': 'application/json',\n accept: 'application/json',\n };\n if (authToken) {\n headers['Authorization'] = `Bearer ${authToken}`;\n headers['x-adcp-auth'] = authToken;\n }\n // JSON-RPC 2.0 §4.1.3: `id: null` flags the request as a *notification*,\n // and the server MUST NOT respond. A2A 0.3.0 §7.4 defines `tasks/cancel`\n // as a request/response method (returns the canceled `Task` or\n // `TaskNotCancelableError`), so a strict A2A server can legitimately\n // reject `id: null` as a protocol violation. Use a real id and just drop\n // the response on the floor — fire-and-forget is the caller's discipline,\n // not a wire-protocol claim.\n const body = JSON.stringify({\n jsonrpc: '2.0',\n id: randomUUID(),\n method: 'tasks/cancel',\n params: { id: taskId },\n });\n // Bound the cancel: a hung fetch would orphan-pin the event loop past the\n // buyer's abort, defeating fire-and-forget. AbortSignal.timeout() is the\n // standard primitive; the caller's `.catch()` swallows the AbortError.\n const init: RequestInit = {\n method: 'POST',\n headers,\n body,\n signal: AbortSignal.timeout(CANCEL_TIMEOUT_MS),\n };\n\n // adcp-client#1617 Phase 2: sign the cancel POST when the agent has a\n // signer configured. We bypass the `buildAgentSigningFetch` capability-\n // gate path because `tasks/cancel` is an A2A protocol method, not an\n // AdCP tool — the seller's `request_signing.supported_for` typically\n // lists AdCP tool names, not protocol-level methods. The right model\n // here: if the agent claims signing AT ALL, sign every mutating POST\n // we send to it on the cancel path. Sellers with uniform \"must be\n // signed\" policies accept this; sellers that only check signing on\n // specific AdCP tools simply ignore the extra signature.\n //\n // TODO(adcp#4318, adcp-client#1617): when the AdCP spec adds explicit\n // verifier coverage for A2A protocol methods (likely in 3.1 as a new\n // `protocol_methods_supported_for` / `protocol_methods_required_for`\n // field on `request_signing`), narrow this default by reading the\n // seller's advertised coverage from `getCapability()` and gating on\n // the `tasks/cancel` membership. The over-sign default stays as the\n // fallback for spec-silent sellers (3.0.x and earlier).\n if (agent.request_signing) {\n const upstream: FetchLike = (input, ini) =>\n fetchFn ? fetchFn(input as RequestInfo | URL, ini) : fetch(input as RequestInfo, ini);\n if (isInlineSigningConfig(agent.request_signing)) {\n const signed = createSigningFetch(upstream, toSignerKey(agent.request_signing));\n await signed(agentUrl, init);\n return;\n }\n if (isProviderSigningConfig(agent.request_signing)) {\n const signed = createSigningFetchAsync(upstream, agent.request_signing.provider);\n await signed(agentUrl, init);\n return;\n }\n }\n\n await (fetchFn ?? fetch)(agentUrl, init);\n}\n\nasync function getOrCreateA2AClient(\n agentUrl: string,\n authToken: string | undefined,\n customHeaders?: Record<string, string>,\n bypassCache = false\n): Promise<InstanceType<typeof A2AClient>> {\n const signingContext = signingContextStorage.getStore();\n const fetchFn = callContextStorage.getStore()?.fetchFn;\n const cacheKey = a2aCacheKey(agentUrl, authToken, signingContext?.cacheKey, customHeaders);\n // Scoped fetchers often carry request/tenant-specific egress policy. Keep\n // those calls one-shot so neither agent-card discovery nor a client created\n // under one policy can be reused by another caller, and so short-lived\n // closure identities do not grow the global cache without bound.\n if (bypassCache || fetchFn) {\n return createA2AClient(agentUrl, authToken);\n }\n const cached = a2aClientCache.get(cacheKey);\n if (cached) return cached;\n\n const pending = pendingA2AClients.get(cacheKey);\n if (pending) return pending;\n\n const promise = createA2AClient(agentUrl, authToken)\n .then(client => {\n a2aClientCache.set(cacheKey, client);\n return client;\n })\n .finally(() => {\n pendingA2AClients.delete(cacheKey);\n });\n\n pendingA2AClients.set(cacheKey, promise);\n return promise;\n}\n\nasync function createA2AClient(\n agentUrl: string,\n authToken: string | undefined\n): Promise<InstanceType<typeof A2AClient>> {\n const fetchImpl = buildFetchImpl(authToken);\n const cardUrls = buildCardUrls(agentUrl);\n\n const context = callContextStorage.getStore();\n context?.debugLogs.push({\n type: 'info',\n message: `A2A: Discovering agent card at ${cardUrls.join(', ')}`,\n timestamp: new Date().toISOString(),\n });\n\n let client: InstanceType<typeof A2AClient> | undefined;\n let lastError: Error = new Error(`A2A agent card not found at ${cardUrls.join(', ')}`);\n for (const cardUrl of cardUrls) {\n try {\n client = await A2AClient.fromCardUrl(cardUrl, { fetchImpl });\n break;\n } catch (err: unknown) {\n lastError = err as Error;\n if (context?.got401Ref.value) break;\n }\n }\n if (!client) throw lastError;\n\n return client;\n}\n\nfunction buildFetchImpl(authToken: string | undefined) {\n // The A2A client is cached per (url, authToken, signingCacheKey). We capture\n // the signing context at client-creation time so all subsequent calls that\n // share this cached client use the same signing identity — changing identity\n // requires a different cache entry, built on a separate call that enters ALS\n // with a different context.\n const signingContext = signingContextStorage.getStore();\n\n // Innermost wrapper: enforce response body size cap from the active\n // `responseSizeLimitStorage` slot. Pass-through when no slot is set.\n const networkFetch = wrapFetchWithTransportDiagnostics(\n wrapFetchWithSizeLimit((input, init) => {\n const scopedFetch = callContextStorage.getStore()?.fetchFn;\n return scopedFetch ? scopedFetch(input, init) : fetch(input as any, init);\n })\n );\n\n // Inner fetch handles auth/header injection and 401 detection. If the\n // agent has request-signing configured, we wrap it with the AdCP signing\n // fetch so the signature covers the exact bytes we're about to send (auth\n // headers included, since the signer re-reads the final header record).\n const baseFetch = async (url: string | URL | Request, options?: RequestInit): Promise<Response> => {\n const context = callContextStorage.getStore();\n\n const existingHeaders: Record<string, string> = {};\n if (options?.headers) {\n if (options.headers instanceof Headers) {\n options.headers.forEach((value, key) => {\n existingHeaders[key] = value;\n });\n } else if (Array.isArray(options.headers)) {\n for (const [key, value] of options.headers) {\n existingHeaders[key] = value;\n }\n } else {\n Object.assign(existingHeaders, options.headers);\n }\n }\n\n // Only inject trace context headers for actual tool requests, not discovery.\n // The agent card endpoint is external/untrusted — don't leak trace IDs to it.\n const urlString = typeof url === 'string' ? url : url.toString();\n const isDiscoveryRequest = isAgentCardPath(urlString);\n const traceHeaders = isDiscoveryRequest ? {} : injectTraceHeaders();\n const requestTimeoutMs = isDiscoveryRequest\n ? resolveRequestTimeoutMs(context?.requestTimeoutMs, DEFAULT_REQUEST_TIMEOUT_MS)\n : resolveRequestTimeoutMs(context?.requestTimeoutMs);\n\n // Merge: existing < trace < custom < auth (auth always wins)\n const headers: Record<string, string> = {\n ...existingHeaders,\n ...traceHeaders,\n ...context?.customHeaders,\n ...(authToken && {\n Authorization: `Bearer ${authToken}`,\n 'x-adcp-auth': authToken,\n }),\n };\n\n context?.debugLogs.push({\n type: 'info',\n message: `A2A: Fetch to ${urlString}`,\n timestamp: new Date().toISOString(),\n hasAuth: !!authToken,\n headers: redactHeadersForDebug(headers),\n });\n\n const response = await withAbortSignal<Response>([context?.signal, options?.signal], requestTimeoutMs, signal =>\n networkFetch(url as any, { ...options, headers, signal })\n );\n\n if (response.status === 401 && context) {\n context.got401Ref.value = true;\n }\n\n return response;\n };\n\n if (!signingContext) return wrapFetchWithCapture(baseFetch);\n\n // The signing wrapper assembles headers into the signature base. We invoke\n // it first so the signer sees the caller-supplied headers; baseFetch then\n // overlays auth/trace headers afterwards — A2A's auth scheme (bearer) is\n // not among the MANDATORY_COMPONENTS and is injected by the counterparty's\n // transport layer, not signed.\n const signingFetch = buildAgentSigningFetch({\n upstream: (input, init) => baseFetch(input as any, init),\n signing: signingContext.signing,\n getCapability: signingContext.getCapability,\n });\n return wrapFetchWithCapture(signingFetch as typeof fetch);\n}\n\n/**\n * Terminal A2A task states per A2A 0.3.0 §3.4. Only these can carry the\n * AdCP-mandated artifact + DataPart envelope (per transport-errors §A2A\n * Binding); intermediate states (`working`, `submitted`, `input-required`,\n * `auth-required`) carry no completion artifact.\n */\nconst TERMINAL_A2A_STATES = new Set(['completed', 'failed', 'rejected', 'canceled']);\n\n/**\n * Detect whether a JSON-RPC response carries a spec-compliant terminal-state\n * Task with at least one artifact containing a structured DataPart payload.\n * Per AdCP transport-errors §A2A Binding, the artifact's DataPart is the\n * canonical envelope for both the success arm (`completed`) and the error\n * arms (`failed` / `rejected` / `canceled`). The criterion intentionally\n * matches the unwrapper's terminal-state extraction in\n * `unwrapA2AResponse` — keeping protocol layer and unwrapper in lockstep\n * across all terminal states, not just the error arms.\n *\n * Used to short-circuit the generic \"A2A agent returned error\" throw when\n * a non-conformant seller surfaces both a transport-level `result.error`\n * hint and the canonical artifact envelope side-by-side. The DataPart is\n * authoritative; the throw would otherwise swallow it.\n */\nfunction hasTerminalTaskWithDataArtifact(response: unknown): boolean {\n if (!response || typeof response !== 'object') return false;\n const result = (response as { result?: unknown }).result;\n if (!result || typeof result !== 'object') return false;\n const r = result as { kind?: unknown; status?: unknown; artifacts?: unknown };\n if (r.kind !== 'task') return false;\n const status = r.status as { state?: unknown } | undefined;\n if (typeof status?.state !== 'string' || !TERMINAL_A2A_STATES.has(status.state)) return false;\n return getLatestA2ADataPartFromResponse(response) !== undefined;\n}\n\n/**\n * Protocol-level session identifiers that ride on the A2A Message envelope\n * (not in the skill parameters). `contextId` binds sends to a server-side\n * conversation; `taskId` resumes an existing non-terminal task.\n *\n * Callers (buyers) typically retain these across calls on a per-conversation\n * AgentClient; see AgentClient.getContextId() / getPendingTaskId().\n */\nexport interface A2ASessionIds {\n contextId?: string;\n taskId?: string;\n}\n\nexport async function callA2ATool(\n agentUrl: string,\n toolName: string,\n parameters: Record<string, unknown>,\n authToken?: string,\n debugLogs: DebugLogEntry[] = [],\n pushNotificationConfig?: PushNotificationConfig,\n customHeaders?: Record<string, string>,\n signingContext?: AgentSigningContext,\n session?: A2ASessionIds,\n signal?: AbortSignal,\n requestTimeoutMs?: number,\n fetchFn?: typeof fetch\n): Promise<unknown> {\n return withSpan(\n 'adcp.a2a.call_tool',\n {\n 'adcp.tool': toolName,\n 'http.url': agentUrl,\n },\n async () => {\n const context: A2ACallContext = {\n customHeaders,\n debugLogs,\n got401Ref: { value: false },\n signal,\n requestTimeoutMs,\n fetchFn,\n };\n return signingContextStorage.run(signingContext, () =>\n callContextStorage.run(context, () =>\n callA2AToolImpl(\n agentUrl,\n toolName,\n parameters,\n authToken,\n debugLogs,\n pushNotificationConfig,\n context,\n session\n )\n )\n );\n }\n );\n}\n\nasync function callA2AToolImpl(\n agentUrl: string,\n toolName: string,\n parameters: Record<string, unknown>,\n authToken: string | undefined,\n debugLogs: DebugLogEntry[],\n pushNotificationConfig: PushNotificationConfig | undefined,\n context: A2ACallContext,\n session: A2ASessionIds | undefined\n): Promise<unknown> {\n try {\n const client = await getOrCreateA2AClient(\n agentUrl,\n authToken,\n context.customHeaders,\n !!context.signal || context.requestTimeoutMs !== undefined\n );\n\n const requestPayload: {\n message: {\n messageId: string;\n role: string;\n kind: string;\n parts: Array<{ kind: string; data: { skill: string; parameters: Record<string, unknown> } }>;\n contextId?: string;\n taskId?: string;\n };\n configuration?: { pushNotificationConfig: PushNotificationConfig };\n } = {\n message: {\n messageId: `msg_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`,\n role: 'user',\n kind: 'message',\n parts: [\n {\n kind: 'data',\n data: {\n skill: toolName,\n parameters: parameters,\n },\n },\n ],\n ...(session?.contextId && { contextId: session.contextId }),\n ...(session?.taskId && { taskId: session.taskId }),\n },\n };\n\n if (pushNotificationConfig) {\n requestPayload.configuration = {\n pushNotificationConfig: pushNotificationConfig,\n };\n }\n\n const payloadSize = JSON.stringify(requestPayload).length;\n const redactedParameters = redactIdempotencyKeyInArgs(parameters);\n const redactedPayload = {\n ...requestPayload,\n message: {\n ...requestPayload.message,\n parts: [\n {\n kind: 'data',\n data: { skill: toolName, parameters: redactedParameters },\n },\n ],\n },\n ...(requestPayload.configuration && {\n configuration: {\n pushNotificationConfig: redactPushNotificationConfigForDebug(\n requestPayload.configuration.pushNotificationConfig\n )!,\n },\n }),\n };\n debugLogs.push({\n type: 'info',\n message: `A2A: Calling skill ${toolName} with parameters: ${JSON.stringify(\n redactedParameters\n )}. Payload size: ${payloadSize} bytes`,\n timestamp: new Date().toISOString(),\n payloadSize,\n actualPayload: redactedPayload,\n });\n\n debugLogs.push({\n type: 'info',\n message: `A2A: Sending message via sendMessage()`,\n timestamp: new Date().toISOString(),\n skill: toolName,\n });\n\n const messageResponse = await client.sendMessage(requestPayload);\n\n debugLogs.push({\n type: messageResponse?.error ? 'error' : 'success',\n message: `A2A: Response received (${messageResponse?.error ? 'error' : 'success'})`,\n timestamp: new Date().toISOString(),\n response: messageResponse,\n skill: toolName,\n });\n\n if (messageResponse?.error || messageResponse?.result?.error) {\n // adcp-client#1575: when the seller emits a spec-compliant terminal-state\n // Task carrying an `adcp_error` DataPart (per AdCP transport-errors §A2A\n // Binding), the structured artifact is canonical — even if the seller\n // also surfaced a transport-level error string. Pass the response\n // through so the upstream unwrapper extracts `adcp_error.code` instead\n // of throwing a generic message that loses the AdCP error envelope.\n if (!hasTerminalTaskWithDataArtifact(messageResponse)) {\n const errorObj = messageResponse.error || messageResponse.result?.error;\n const errorMessage = errorObj.message || JSON.stringify(errorObj);\n throw new Error(`A2A agent returned error: ${errorMessage}`);\n }\n }\n\n return messageResponse;\n } catch (error: unknown) {\n if (is401Error(error, context.got401Ref.value)) {\n // Evict this cache entry — credential may have expired or been\n // revoked. Same disambiguator as the original `getOrCreateA2AClient`\n // call: when the credential rode on customHeaders.Authorization (Basic\n // case) rather than authToken, the cache key must reflect that or we\n // evict the wrong entry.\n const signingContext = signingContextStorage.getStore();\n a2aClientCache.delete(a2aCacheKey(agentUrl, authToken, signingContext?.cacheKey, context.customHeaders));\n\n debugLogs.push({\n type: 'error',\n message: `A2A: Authentication required for ${agentUrl}`,\n timestamp: new Date().toISOString(),\n });\n\n // Re-probe to surface the WWW-Authenticate scheme on the error envelope.\n // Basic-fronted agents (Apigee/Kong/AWS API GW with a BasicAuthentication\n // policy) would otherwise leave consumers chasing OAuth metadata that\n // doesn't exist. Matches the MCP discovery throw site in\n // `SingleAgentClient.discoverMCPEndpoint`.\n const challenge = await probeAuthChallenge(agentUrl, { fetchFn: context.fetchFn });\n const oauthMetadata = await discoverOAuthMetadata(agentUrl, { fetch: context.fetchFn });\n throw new AuthenticationRequiredError(agentUrl, oauthMetadata || undefined, undefined, challenge ?? undefined);\n }\n\n throw error;\n }\n}\n"],"mappings":"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","names":["import_client","A2AClientImpl"]}