@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
@@ -13,6 +13,7 @@ export declare const PROBE_TASKS: Set<string>;
13
13
  */
14
14
  export declare function probeProtectedResourceMetadata(agentUrl: string, options?: {
15
15
  allowPrivateIp?: boolean;
16
+ fetchFn?: typeof fetch;
16
17
  }): Promise<HttpProbeResult>;
17
18
  /**
18
19
  * GET `<issuer>/.well-known/oauth-authorization-server` for the first issuer
@@ -22,12 +23,15 @@ export declare function probeProtectedResourceMetadata(agentUrl: string, options
22
23
  */
23
24
  export declare function probeOauthAuthServerMetadata(priorProbe: HttpProbeResult | undefined, options?: {
24
25
  allowPrivateIp?: boolean;
26
+ fetchFn?: typeof fetch;
25
27
  }): Promise<HttpProbeResult>;
26
28
  export interface FetchProbeOptions {
27
29
  /** Allow http:// and private-IP destinations. Default false. */
28
30
  allowPrivateIp?: boolean;
29
31
  /** Override timeout for specific call sites. */
30
32
  timeoutMs?: number;
33
+ /** Trusted scoped fetch; must enforce DNS-rebinding protection. */
34
+ fetchFn?: typeof fetch;
31
35
  }
32
36
  /**
33
37
  * Perform a GET against an attacker-influenceable URL with defensive limits.
@@ -83,6 +87,8 @@ export declare function rawMcpProbe(options: {
83
87
  headers?: Record<string, string>;
84
88
  /** Allow http:// and private-IP agent URLs (dev loops). Default false. */
85
89
  allowPrivateIp?: boolean;
90
+ /** Scoped fetch implementation for every handshake and tool request. */
91
+ fetchFn?: typeof fetch;
86
92
  }): Promise<{
87
93
  httpResult: HttpProbeResult;
88
94
  taskResult?: TaskResult;
@@ -13,6 +13,7 @@ export declare const PROBE_TASKS: Set<string>;
13
13
  */
14
14
  export declare function probeProtectedResourceMetadata(agentUrl: string, options?: {
15
15
  allowPrivateIp?: boolean;
16
+ fetchFn?: typeof fetch;
16
17
  }): Promise<HttpProbeResult>;
17
18
  /**
18
19
  * GET `<issuer>/.well-known/oauth-authorization-server` for the first issuer
@@ -22,12 +23,15 @@ export declare function probeProtectedResourceMetadata(agentUrl: string, options
22
23
  */
23
24
  export declare function probeOauthAuthServerMetadata(priorProbe: HttpProbeResult | undefined, options?: {
24
25
  allowPrivateIp?: boolean;
26
+ fetchFn?: typeof fetch;
25
27
  }): Promise<HttpProbeResult>;
26
28
  export interface FetchProbeOptions {
27
29
  /** Allow http:// and private-IP destinations. Default false. */
28
30
  allowPrivateIp?: boolean;
29
31
  /** Override timeout for specific call sites. */
30
32
  timeoutMs?: number;
33
+ /** Trusted scoped fetch; must enforce DNS-rebinding protection. */
34
+ fetchFn?: typeof fetch;
31
35
  }
32
36
  /**
33
37
  * Perform a GET against an attacker-influenceable URL with defensive limits.
@@ -83,6 +87,8 @@ export declare function rawMcpProbe(options: {
83
87
  headers?: Record<string, string>;
84
88
  /** Allow http:// and private-IP agent URLs (dev loops). Default false. */
85
89
  allowPrivateIp?: boolean;
90
+ /** Scoped fetch implementation for every handshake and tool request. */
91
+ fetchFn?: typeof fetch;
86
92
  }): Promise<{
87
93
  httpResult: HttpProbeResult;
88
94
  taskResult?: TaskResult;
@@ -1 +1 @@
1
- {"version":3,"file":"probes.d.ts","sourceRoot":"","sources":["../../../../src/lib/testing/storyboard/probes.ts"],"names":[],"mappings":"AAeA,OAAO,EAGL,gBAAgB,EAChB,eAAe,IAAI,qBAAqB,EACxC,WAAW,IAAI,iBAAiB,EACjC,MAAM,WAAW,CAAC;AACnB,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAC/C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAM3C,sEAAsE;AACtE,eAAO,MAAM,WAAW,aAQtB,CAAC;AAMH;;;;;;;GAOG;AACH,wBAAsB,8BAA8B,CAClD,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE;IAAE,cAAc,CAAC,EAAE,OAAO,CAAA;CAAO,GACzC,OAAO,CAAC,eAAe,CAAC,CAI1B;AAMD;;;;;GAKG;AACH,wBAAsB,4BAA4B,CAChD,UAAU,EAAE,eAAe,GAAG,SAAS,EACvC,OAAO,GAAE;IAAE,cAAc,CAAC,EAAE,OAAO,CAAA;CAAO,GACzC,OAAO,CAAC,eAAe,CAAC,CAwB1B;AAMD,MAAM,WAAW,iBAAiB;IAChC,gEAAgE;IAChE,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,gDAAgD;IAChD,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAsB,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE,iBAAsB,GAAG,OAAO,CAAC,eAAe,CAAC,CAuBvG;AAMD;;;GAGG;AACH,wBAAgB,2BAA2B,IAAI,MAAM,CAEpD;AAED;;;;;;GAMG;AACH,wBAAgB,wBAAwB,IAAI,MAAM,CAOjD;AAyLD;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,WAAW,CAAC,OAAO,EAAE;IACzC,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,0EAA0E;IAC1E,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B,GAAG,OAAO,CAAC;IAAE,UAAU,EAAE,eAAe,CAAC;IAAC,UAAU,CAAC,EAAE,UAAU,CAAA;CAAE,CAAC,CAgGpE;AAMD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,wBAAsB,WAAW,CAAC,OAAO,EAAE;IACzC,iFAAiF;IACjF,QAAQ,EAAE,MAAM,CAAC;IACjB,2EAA2E;IAC3E,MAAM,EAAE,MAAM,CAAC;IACf,oFAAoF;IACpF,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,0EAA0E;IAC1E,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B,GAAG,OAAO,CAAC;IAAE,UAAU,EAAE,eAAe,CAAC;IAAC,UAAU,CAAC,EAAE,UAAU,CAAA;CAAE,CAAC,CAkFpE;AAMD,eAAO,MAAM,eAAe,8BAAwB,CAAC;AACrD,eAAO,MAAM,WAAW,0BAAoB,CAAC;AAC7C,OAAO,EAAE,gBAAgB,EAAE,CAAC"}
1
+ {"version":3,"file":"probes.d.ts","sourceRoot":"","sources":["../../../../src/lib/testing/storyboard/probes.ts"],"names":[],"mappings":"AAeA,OAAO,EAGL,gBAAgB,EAChB,eAAe,IAAI,qBAAqB,EACxC,WAAW,IAAI,iBAAiB,EACjC,MAAM,WAAW,CAAC;AACnB,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAC/C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAM3C,sEAAsE;AACtE,eAAO,MAAM,WAAW,aAQtB,CAAC;AAMH;;;;;;;GAOG;AACH,wBAAsB,8BAA8B,CAClD,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE;IAAE,cAAc,CAAC,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,KAAK,CAAA;CAAO,GACjE,OAAO,CAAC,eAAe,CAAC,CAO1B;AAMD;;;;;GAKG;AACH,wBAAsB,4BAA4B,CAChD,UAAU,EAAE,eAAe,GAAG,SAAS,EACvC,OAAO,GAAE;IAAE,cAAc,CAAC,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,KAAK,CAAA;CAAO,GACjE,OAAO,CAAC,eAAe,CAAC,CA2B1B;AAMD,MAAM,WAAW,iBAAiB;IAChC,gEAAgE;IAChE,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,gDAAgD;IAChD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mEAAmE;IACnE,OAAO,CAAC,EAAE,OAAO,KAAK,CAAC;CACxB;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAsB,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE,iBAAsB,GAAG,OAAO,CAAC,eAAe,CAAC,CAwBvG;AAMD;;;GAGG;AACH,wBAAgB,2BAA2B,IAAI,MAAM,CAEpD;AAED;;;;;;GAMG;AACH,wBAAgB,wBAAwB,IAAI,MAAM,CAOjD;AA2LD;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,WAAW,CAAC,OAAO,EAAE;IACzC,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,0EAA0E;IAC1E,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,wEAAwE;IACxE,OAAO,CAAC,EAAE,OAAO,KAAK,CAAC;CACxB,GAAG,OAAO,CAAC;IAAE,UAAU,EAAE,eAAe,CAAC;IAAC,UAAU,CAAC,EAAE,UAAU,CAAA;CAAE,CAAC,CAmGpE;AAMD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,wBAAsB,WAAW,CAAC,OAAO,EAAE;IACzC,iFAAiF;IACjF,QAAQ,EAAE,MAAM,CAAC;IACjB,2EAA2E;IAC3E,MAAM,EAAE,MAAM,CAAC;IACf,oFAAoF;IACpF,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,0EAA0E;IAC1E,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B,GAAG,OAAO,CAAC;IAAE,UAAU,EAAE,eAAe,CAAC;IAAC,UAAU,CAAC,EAAE,UAAU,CAAA;CAAE,CAAC,CAkFpE;AAMD,eAAO,MAAM,eAAe,8BAAwB,CAAC;AACrD,eAAO,MAAM,WAAW,0BAAoB,CAAC;AAC7C,OAAO,EAAE,gBAAgB,EAAE,CAAC"}
@@ -46,7 +46,10 @@ const PROBE_TASKS = /* @__PURE__ */ new Set([
46
46
  async function probeProtectedResourceMetadata(agentUrl, options = {}) {
47
47
  const u = new URL(agentUrl);
48
48
  const metadataUrl = `${u.origin}/.well-known/oauth-protected-resource${u.pathname}`;
49
- return fetchProbe(metadataUrl, { allowPrivateIp: options.allowPrivateIp ?? false });
49
+ return fetchProbe(metadataUrl, {
50
+ allowPrivateIp: options.allowPrivateIp ?? false,
51
+ fetchFn: options.fetchFn
52
+ });
50
53
  }
51
54
  async function probeOauthAuthServerMetadata(priorProbe, options = {}) {
52
55
  if (!priorProbe || priorProbe.error) {
@@ -71,7 +74,10 @@ async function probeOauthAuthServerMetadata(priorProbe, options = {}) {
71
74
  }
72
75
  const issuer = servers[0].replace(/\/$/, "");
73
76
  const metadataUrl = `${issuer}/.well-known/oauth-authorization-server`;
74
- return fetchProbe(metadataUrl, { allowPrivateIp: options.allowPrivateIp ?? false });
77
+ return fetchProbe(metadataUrl, {
78
+ allowPrivateIp: options.allowPrivateIp ?? false,
79
+ fetchFn: options.fetchFn
80
+ });
75
81
  }
76
82
  async function fetchProbe(url, options = {}) {
77
83
  try {
@@ -79,7 +85,8 @@ async function fetchProbe(url, options = {}) {
79
85
  method: "GET",
80
86
  headers: { accept: "application/json" },
81
87
  allowPrivateIp: options.allowPrivateIp ?? false,
82
- ...options.timeoutMs !== void 0 ? { timeoutMs: options.timeoutMs } : {}
88
+ ...options.timeoutMs !== void 0 ? { timeoutMs: options.timeoutMs } : {},
89
+ ...options.fetchFn ? { trustedFetchFn: options.fetchFn } : {}
83
90
  });
84
91
  return {
85
92
  url,
@@ -138,7 +145,8 @@ async function postRawMcpJsonRpc(options) {
138
145
  ...protocolVersion ? { [MCP_PROTOCOL_VERSION_HEADER]: protocolVersion } : {}
139
146
  },
140
147
  body: JSON.stringify(envelope),
141
- allowPrivateIp
148
+ allowPrivateIp,
149
+ ...options.fetchFn ? { trustedFetchFn: options.fetchFn } : {}
142
150
  });
143
151
  httpResult.status = res.status;
144
152
  httpResult.headers = res.headers;
@@ -241,7 +249,7 @@ function taskResultFromPostFailure(posted) {
241
249
  return failedTaskResult(posted.httpResult.error ?? `HTTP ${posted.httpResult.status}`);
242
250
  }
243
251
  async function rawMcpProbe(options) {
244
- const { agentUrl, toolName, args, headers = {}, allowPrivateIp = false } = options;
252
+ const { agentUrl, toolName, args, headers = {}, allowPrivateIp = false, fetchFn } = options;
245
253
  const initializeId = ++probeRequestId;
246
254
  const initialize = await postRawMcpJsonRpc({
247
255
  agentUrl,
@@ -257,6 +265,7 @@ async function rawMcpProbe(options) {
257
265
  },
258
266
  headers,
259
267
  allowPrivateIp,
268
+ fetchFn,
260
269
  responseId: initializeId
261
270
  });
262
271
  if (initialize.httpResult.error || initialize.httpResult.status >= 400 || !initialize.parsed || initialize.parsed.error) {
@@ -284,6 +293,7 @@ async function rawMcpProbe(options) {
284
293
  },
285
294
  headers,
286
295
  allowPrivateIp,
296
+ fetchFn,
287
297
  ...sessionId && { sessionId },
288
298
  protocolVersion: negotiatedProtocolVersion,
289
299
  allowEmptyBody: true
@@ -306,6 +316,7 @@ async function rawMcpProbe(options) {
306
316
  envelope: toolEnvelope,
307
317
  headers,
308
318
  allowPrivateIp,
319
+ fetchFn,
309
320
  ...sessionId && { sessionId },
310
321
  protocolVersion: negotiatedProtocolVersion,
311
322
  responseId: requestId
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/lib/testing/storyboard/probes.ts"],"sourcesContent":["/**\n * HTTP probes used by security-baseline storyboard tasks.\n *\n * Three synthetic tasks dispatch through here instead of the MCP client:\n *\n * - `protected_resource_metadata` — GET the agent's\n * `/.well-known/oauth-protected-resource<mountPath>` and verify RFC 9728.\n * - `oauth_auth_server_metadata` — GET `<issuer>/.well-known/oauth-authorization-server`\n * using the first issuer from the previous step's response. Hardened against\n * SSRF because the URL comes from agent-controlled data.\n * - `assert_contribution` — no network; evaluates accumulated flags set by\n * prior steps that carried `contributes_to`.\n */\nimport { randomBytes } from 'crypto';\nimport { LATEST_PROTOCOL_VERSION, SUPPORTED_PROTOCOL_VERSIONS } from '@modelcontextprotocol/sdk/types.js';\nimport {\n ssrfSafeFetch,\n decodeBodyAsJsonOrText,\n SsrfRefusedError,\n isAlwaysBlocked as sharedIsAlwaysBlocked,\n isPrivateIp as sharedIsPrivateIp,\n} from '../../net';\nimport type { HttpProbeResult } from './types';\nimport type { TaskResult } from '../types';\n\n// Timeout + body-cap defaults come from `ssrfSafeFetch` (10 s, 64 KiB).\n// The probe wrappers deliberately don't override them so probe behavior\n// stays in sync with the shared primitive.\n\n/** Task names dispatched via HTTP probes (not via the MCP client). */\nexport const PROBE_TASKS = new Set([\n 'protected_resource_metadata',\n 'oauth_auth_server_metadata',\n 'assert_contribution',\n 'request_signing_probe',\n 'fetch_brand_jwks',\n 'assert_jwks_purpose',\n 'expect_rate_limit_not_replayed',\n]);\n\n// ---------------------------------------------------------------------------\n// Protected-resource metadata probe\n// ---------------------------------------------------------------------------\n\n/**\n * GET `<agentUrl origin>/.well-known/oauth-protected-resource<agentUrl path>`.\n * Same-origin as the agent, so SSRF risk is bounded.\n *\n * When `allowPrivateIp` is set (matches the runner's `--allow-http` flag),\n * loopback and RFC 1918 targets are allowed so dev loops against localhost\n * agents work end-to-end.\n */\nexport async function probeProtectedResourceMetadata(\n agentUrl: string,\n options: { allowPrivateIp?: boolean } = {}\n): Promise<HttpProbeResult> {\n const u = new URL(agentUrl);\n const metadataUrl = `${u.origin}/.well-known/oauth-protected-resource${u.pathname}`;\n return fetchProbe(metadataUrl, { allowPrivateIp: options.allowPrivateIp ?? false });\n}\n\n// ---------------------------------------------------------------------------\n// OAuth authorization-server metadata probe\n// ---------------------------------------------------------------------------\n\n/**\n * GET `<issuer>/.well-known/oauth-authorization-server` for the first issuer\n * named in the protected-resource metadata. Because the URL is agent-supplied,\n * this is the SSRF-hot path — {@link fetchProbe} rejects private networks,\n * non-https schemes, and unbounded responses.\n */\nexport async function probeOauthAuthServerMetadata(\n priorProbe: HttpProbeResult | undefined,\n options: { allowPrivateIp?: boolean } = {}\n): Promise<HttpProbeResult> {\n if (!priorProbe || priorProbe.error) {\n return {\n url: '',\n status: 0,\n headers: {},\n body: null,\n error: 'protected_resource_metadata step missing or errored — cannot resolve issuer',\n };\n }\n const body = priorProbe.body as { authorization_servers?: unknown } | null;\n const servers = Array.isArray(body?.authorization_servers) ? (body!.authorization_servers as string[]) : [];\n if (servers.length === 0 || typeof servers[0] !== 'string') {\n return {\n url: '',\n status: 0,\n headers: {},\n body: null,\n error: 'No authorization_servers[0] found in protected-resource metadata',\n };\n }\n const issuer = servers[0].replace(/\\/$/, '');\n const metadataUrl = `${issuer}/.well-known/oauth-authorization-server`;\n return fetchProbe(metadataUrl, { allowPrivateIp: options.allowPrivateIp ?? false });\n}\n\n// ---------------------------------------------------------------------------\n// Fetch with guardrails\n// ---------------------------------------------------------------------------\n\nexport interface FetchProbeOptions {\n /** Allow http:// and private-IP destinations. Default false. */\n allowPrivateIp?: boolean;\n /** Override timeout for specific call sites. */\n timeoutMs?: number;\n}\n\n/**\n * Perform a GET against an attacker-influenceable URL with defensive limits.\n *\n * Guardrails (RFC 9728 / RFC 8414 metadata endpoints typically live on public\n * HTTPS; anything else is suspicious):\n * - Scheme: `https:` only by default; `http:` allowed only when\n * `allowPrivateIp` is set. `file:`, `ftp:`, `data:`, etc. are always rejected.\n * - DNS: resolves all A/AAAA records once, rejects if any is private, then\n * pins the outbound connection to the validated IP. Defeats DNS rebinding\n * where an attacker's authoritative nameserver returns a public address\n * to our guard lookup and a private address to the connect-time lookup.\n * - Private-IP block applies RFC 1918, loopback, link-local, IPv6 ULA,\n * CGNAT (100.64/10), multicast, broadcast, and IPv4-mapped IPv6.\n * - IMDS (169.254.169.254 / fe80::) stays blocked **even under\n * `allowPrivateIp`** — no legitimate dev use for probing it.\n * - Redirects are NOT followed (`redirect: 'manual'`).\n * - Body capped at 64 KiB, total fetch time capped at 10 s.\n */\nexport async function fetchProbe(url: string, options: FetchProbeOptions = {}): Promise<HttpProbeResult> {\n try {\n const res = await ssrfSafeFetch(url, {\n method: 'GET',\n headers: { accept: 'application/json' },\n allowPrivateIp: options.allowPrivateIp ?? false,\n ...(options.timeoutMs !== undefined ? { timeoutMs: options.timeoutMs } : {}),\n });\n return {\n url,\n status: res.status,\n headers: res.headers,\n body: decodeBodyAsJsonOrText(res.body, res.headers['content-type']),\n };\n } catch (err) {\n return {\n url,\n status: 0,\n headers: {},\n body: null,\n error: err instanceof Error ? err.message : String(err),\n };\n }\n}\n\n// ---------------------------------------------------------------------------\n// Credential generators (value_strategy)\n// ---------------------------------------------------------------------------\n\n/**\n * Generate a per-run bogus API key. Prefix is human-readable for log grep;\n * the 32 random hex bytes guarantee no allowlist collision.\n */\nexport function generateRandomInvalidApiKey(): string {\n return `invalid-${randomBytes(32).toString('hex')}`;\n}\n\n/**\n * Generate a per-run bogus JWT-shaped Bearer token. Emits three segments with\n * valid base64url-encoded JSON header/payload and a random signature — so\n * well-implemented validators fail at signature verification (→ 401), and\n * strict parse-time validators that reject at the structural level also fail\n * cleanly (→ 400 per RFC 6750 §3.1). Either is conformant.\n */\nexport function generateRandomInvalidJwt(): string {\n const header = base64url(Buffer.from(JSON.stringify({ alg: 'RS256', typ: 'JWT' })));\n const payload = base64url(\n Buffer.from(JSON.stringify({ sub: `invalid-${randomBytes(8).toString('hex')}`, aud: 'invalid-probe' }))\n );\n const signature = base64url(randomBytes(32));\n return `${header}.${payload}.${signature}`;\n}\n\nfunction base64url(buf: Buffer): string {\n return buf.toString('base64').replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=+$/, '');\n}\n\n// ---------------------------------------------------------------------------\n// Raw-MCP probe (auth-override dispatch)\n// ---------------------------------------------------------------------------\n\nlet probeRequestId = 0;\nconst MCP_SESSION_ID_HEADER = 'mcp-session-id';\nconst MCP_PROTOCOL_VERSION_HEADER = 'mcp-protocol-version';\n\ntype JsonRpcEnvelope = {\n jsonrpc: '2.0';\n id?: number;\n method?: string;\n params?: Record<string, unknown>;\n result?: { structuredContent?: unknown; content?: unknown; isError?: boolean; protocolVersion?: string };\n error?: { message?: string; code?: number };\n};\n\ninterface RawJsonRpcPostResult {\n httpResult: HttpProbeResult;\n parsed?: JsonRpcEnvelope;\n parseError?: boolean;\n}\n\nasync function postRawMcpJsonRpc(options: {\n agentUrl: string;\n envelope: Record<string, unknown>;\n headers: Record<string, string>;\n allowPrivateIp: boolean;\n sessionId?: string;\n protocolVersion?: string;\n responseId?: number;\n parseBody?: boolean;\n allowEmptyBody?: boolean;\n}): Promise<RawJsonRpcPostResult> {\n const {\n agentUrl,\n envelope,\n headers,\n allowPrivateIp,\n sessionId,\n protocolVersion,\n responseId,\n parseBody = true,\n allowEmptyBody = false,\n } = options;\n const httpResult: HttpProbeResult = { url: agentUrl, status: 0, headers: {}, body: null };\n try {\n const res = await ssrfSafeFetch(agentUrl, {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n accept: 'application/json, text/event-stream',\n ...withoutMcpSessionHeaders(headers),\n ...(sessionId ? { [MCP_SESSION_ID_HEADER]: sessionId } : {}),\n ...(protocolVersion ? { [MCP_PROTOCOL_VERSION_HEADER]: protocolVersion } : {}),\n },\n body: JSON.stringify(envelope),\n allowPrivateIp,\n });\n httpResult.status = res.status;\n httpResult.headers = res.headers;\n\n const text = Buffer.from(res.body.buffer, res.body.byteOffset, res.body.byteLength).toString('utf8');\n if (!parseBody) {\n httpResult.body = text || null;\n return { httpResult };\n }\n if (allowEmptyBody && text.trim() === '') {\n httpResult.body = null;\n return { httpResult };\n }\n try {\n const parsed = parseMcpJsonRpcResponse(text, httpResult.headers['content-type'], responseId);\n httpResult.body = parsed;\n return { httpResult, parsed };\n } catch {\n httpResult.body = text;\n return { httpResult, parseError: true };\n }\n } catch (err) {\n httpResult.error = err instanceof Error ? err.message : String(err);\n return { httpResult };\n }\n}\n\nfunction withoutMcpSessionHeaders(headers: Record<string, string>): Record<string, string> {\n const cleaned: Record<string, string> = {};\n for (const [key, value] of Object.entries(headers)) {\n const normalized = key.toLowerCase();\n if (normalized === MCP_SESSION_ID_HEADER || normalized === MCP_PROTOCOL_VERSION_HEADER) continue;\n cleaned[key] = value;\n }\n return cleaned;\n}\n\nfunction parseMcpJsonRpcResponse(text: string, contentType: string | undefined, responseId?: number): JsonRpcEnvelope {\n if (contentType?.toLowerCase().includes('text/event-stream')) {\n // Streamable-HTTP MCP: the response is one or more SSE events whose\n // `data:` payloads are JSON-RPC envelopes. The spec lets a server emit\n // notifications before the final response, so choose the matching id.\n const dataLines = text.split(/\\r?\\n/).filter(l => l.startsWith('data:'));\n if (dataLines.length === 0) throw new Error('SSE response with no data event');\n let matched: JsonRpcEnvelope | undefined;\n let lastParsed: JsonRpcEnvelope | undefined;\n for (const line of dataLines) {\n const payload = line.slice('data:'.length).trim();\n if (!payload) continue;\n try {\n const envelope = JSON.parse(payload) as JsonRpcEnvelope;\n lastParsed = envelope;\n if (responseId !== undefined && envelope?.id === responseId) {\n matched = envelope;\n break;\n }\n } catch {\n // Skip non-JSON data lines (heartbeats, etc.); keep walking.\n }\n }\n const parsed = matched ?? lastParsed;\n if (parsed === undefined) throw new Error('SSE response had data events but none were parseable JSON');\n return parsed;\n }\n return JSON.parse(text) as JsonRpcEnvelope;\n}\n\nfunction taskResultFromRpc(httpResult: HttpProbeResult, rpc: JsonRpcEnvelope): TaskResult {\n if (httpResult.status >= 400) {\n return {\n success: false,\n data: undefined,\n error: rpc.error?.message ?? `HTTP ${httpResult.status}`,\n _extraction_path: 'error',\n };\n }\n if (rpc.error) {\n const code = rpc.error.code;\n return {\n success: false,\n data: undefined,\n error:\n code !== undefined\n ? `JSON-RPC error ${code}: ${rpc.error.message ?? 'no message'}`\n : (rpc.error.message ?? 'JSON-RPC error (no code)'),\n _extraction_path: 'error',\n };\n }\n const structured = rpc.result?.structuredContent;\n const hasStructured = structured !== undefined && structured !== null;\n const data = hasStructured ? structured : rpc.result?.content;\n const isError = !!rpc.result?.isError;\n const extractionPath: 'structured_content' | 'text_fallback' | 'error' | 'none' = isError\n ? 'error'\n : hasStructured\n ? 'structured_content'\n : data !== undefined && data !== null\n ? 'text_fallback'\n : 'none';\n return { success: !isError, data, _extraction_path: extractionPath };\n}\n\nfunction failedTaskResult(message: string): TaskResult {\n return {\n success: false,\n data: undefined,\n error: message,\n _extraction_path: 'error',\n };\n}\n\nfunction taskResultFromPostFailure(posted: RawJsonRpcPostResult): TaskResult {\n if (posted.parseError) {\n return failedTaskResult(\n `Non-JSON response body (content-type: ${posted.httpResult.headers['content-type'] ?? 'unknown'}).`\n );\n }\n if (posted.parsed) return taskResultFromRpc(posted.httpResult, posted.parsed);\n return failedTaskResult(posted.httpResult.error ?? `HTTP ${posted.httpResult.status}`);\n}\n\n/**\n * POST a JSON-RPC `tools/call` request to the MCP endpoint with caller-provided\n * headers. The probe first performs the Streamable HTTP initialize handshake,\n * including `notifications/initialized`, so auth probes hit the same session\n * boundary as normal MCP clients while still exposing raw HTTP status and\n * `WWW-Authenticate` headers for security storyboards.\n *\n * **Args are not secret** — must not contain credentials or PII. The server's\n * response body lands in `httpResult.body` and is written to compliance\n * reports. Outbound request body is not persisted.\n *\n * Returns an HttpProbeResult plus a synthetic TaskResult for steps that also\n * want to validate body shape — the structuredContent is unwrapped so\n * `field_present: \"context\"` resolves naturally.\n */\nexport async function rawMcpProbe(options: {\n agentUrl: string;\n toolName: string;\n args: Record<string, unknown>;\n headers?: Record<string, string>;\n /** Allow http:// and private-IP agent URLs (dev loops). Default false. */\n allowPrivateIp?: boolean;\n}): Promise<{ httpResult: HttpProbeResult; taskResult?: TaskResult }> {\n const { agentUrl, toolName, args, headers = {}, allowPrivateIp = false } = options;\n const initializeId = ++probeRequestId;\n const initialize = await postRawMcpJsonRpc({\n agentUrl,\n envelope: {\n jsonrpc: '2.0',\n id: initializeId,\n method: 'initialize',\n params: {\n protocolVersion: LATEST_PROTOCOL_VERSION,\n capabilities: {},\n clientInfo: { name: 'AdCP Storyboard Raw MCP Probe', version: '1.0.0' },\n },\n },\n headers,\n allowPrivateIp,\n responseId: initializeId,\n });\n if (\n initialize.httpResult.error ||\n initialize.httpResult.status >= 400 ||\n !initialize.parsed ||\n initialize.parsed.error\n ) {\n return {\n httpResult: initialize.httpResult,\n taskResult: taskResultFromPostFailure(initialize),\n };\n }\n const negotiatedProtocolVersion = initialize.parsed.result?.protocolVersion;\n if (\n typeof negotiatedProtocolVersion !== 'string' ||\n !SUPPORTED_PROTOCOL_VERSIONS.includes(negotiatedProtocolVersion)\n ) {\n return {\n httpResult: initialize.httpResult,\n taskResult: failedTaskResult(\n negotiatedProtocolVersion\n ? `Server's protocol version is not supported: ${negotiatedProtocolVersion}`\n : 'Server sent invalid initialize result: missing protocolVersion'\n ),\n };\n }\n\n const sessionId = initialize.httpResult.headers[MCP_SESSION_ID_HEADER];\n const initialized = await postRawMcpJsonRpc({\n agentUrl,\n envelope: {\n jsonrpc: '2.0',\n method: 'notifications/initialized',\n params: {},\n },\n headers,\n allowPrivateIp,\n ...(sessionId && { sessionId }),\n protocolVersion: negotiatedProtocolVersion,\n allowEmptyBody: true,\n });\n if (\n initialized.httpResult.error ||\n initialized.httpResult.status >= 400 ||\n initialized.parseError ||\n initialized.parsed?.error\n ) {\n return {\n httpResult: initialized.httpResult,\n taskResult: taskResultFromPostFailure(initialized),\n };\n }\n\n const requestId = ++probeRequestId;\n const toolEnvelope = {\n jsonrpc: '2.0',\n id: requestId,\n method: 'tools/call',\n params: { name: toolName, arguments: args },\n };\n const posted = await postRawMcpJsonRpc({\n agentUrl,\n envelope: toolEnvelope,\n headers,\n allowPrivateIp,\n ...(sessionId && { sessionId }),\n protocolVersion: negotiatedProtocolVersion,\n responseId: requestId,\n });\n const { httpResult, parsed } = posted;\n if (httpResult.error) return { httpResult, taskResult: taskResultFromPostFailure(posted) };\n if (!parsed) {\n return {\n httpResult,\n taskResult: taskResultFromPostFailure(posted),\n };\n }\n return { httpResult, taskResult: taskResultFromRpc(httpResult, parsed) };\n}\n\n// ---------------------------------------------------------------------------\n// Raw-A2A probe (transport-layer diagnostics for A2A agents)\n// ---------------------------------------------------------------------------\n\n/**\n * POST a JSON-RPC 2.0 request to an A2A agent endpoint with caller-provided\n * headers. Bypasses the A2A SDK so raw HTTP status, headers, and JSON-RPC\n * error codes can be captured by storyboard diagnostics.\n *\n * Mirrors `rawMcpProbe` in structure and SSRF-safety contract. Key\n * differences from the MCP variant:\n *\n * - The caller supplies `method` + optional `params` (not a fixed `tools/call`\n * body). A2A has no single canonical method — use `\"message/send\"` for most\n * auth and error-code probes, `\"tasks/get\"` / `\"tasks/cancel\"` for lifecycle\n * checks. **Note:** `message/send` requires `params.message` (a full A2A\n * `Message` object with `messageId`, `role`, `kind`, `parts`). Passing\n * `params: {}` will produce `-32602 Invalid params` from a conformant server,\n * masking auth rejections — supply a minimal message when probing auth paths.\n * - A2A JSON-RPC error codes differ from MCP's. Notably `-32002` means\n * `TaskNotCancelable` in A2A (not session-not-initialized). The probe\n * surfaces raw numeric codes without protocol-specific aliasing so\n * storyboards can assert on the exact code.\n * - SSE (streaming) responses are handled the same way as `rawMcpProbe`:\n * `Accept: application/json` is sent; non-JSON bodies surface a distinct\n * error so callers don't mistake an event-stream for a silent success.\n *\n * **Args are not secret** — must not contain credentials or PII. The\n * server's response body lands in `httpResult.body` and is written to\n * compliance reports.\n *\n * Returns an `HttpProbeResult` plus an optional `TaskResult` (same shape as\n * `rawMcpProbe`) so the storyboard `ValidationContext` can consume both probes\n * interchangeably. The A2A success `_extraction_path` is `'text_fallback'`\n * (not `'structured_content'`) because A2A's `result` field is a plain object,\n * not an MCP structured-content envelope.\n */\nexport async function rawA2aProbe(options: {\n /** Base URL of the A2A agent endpoint (e.g. `https://agent.example.com/a2a`). */\n agentUrl: string;\n /** A2A/JSON-RPC 2.0 method name (e.g. `\"message/send\"`, `\"tasks/get\"`). */\n method: string;\n /** JSON-RPC params. Defaults to `{}` so the probe always emits a valid envelope. */\n params?: Record<string, unknown>;\n headers?: Record<string, string>;\n /** Allow http:// and private-IP agent URLs (dev loops). Default false. */\n allowPrivateIp?: boolean;\n}): Promise<{ httpResult: HttpProbeResult; taskResult?: TaskResult }> {\n const { agentUrl, method, params, headers = {}, allowPrivateIp = false } = options;\n const body = JSON.stringify({\n jsonrpc: '2.0',\n id: ++probeRequestId,\n method,\n params: params ?? {},\n });\n\n const httpResult: HttpProbeResult = { url: agentUrl, status: 0, headers: {}, body: null };\n try {\n const res = await ssrfSafeFetch(agentUrl, {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n accept: 'application/json',\n ...headers,\n },\n body,\n allowPrivateIp,\n });\n httpResult.status = res.status;\n httpResult.headers = res.headers;\n\n const text = Buffer.from(res.body.buffer, res.body.byteOffset, res.body.byteLength).toString('utf8');\n let parsed: unknown;\n try {\n parsed = JSON.parse(text);\n } catch {\n httpResult.body = text;\n return {\n httpResult,\n taskResult: {\n success: false,\n data: undefined,\n error: `Non-JSON response body (content-type: ${httpResult.headers['content-type'] ?? 'unknown'}).`,\n _extraction_path: 'error',\n },\n };\n }\n httpResult.body = parsed;\n\n const rpc = parsed as {\n result?: unknown;\n error?: { message?: string; code?: number };\n };\n\n if (httpResult.status >= 400) {\n return {\n httpResult,\n taskResult: {\n success: false,\n data: undefined,\n error: rpc.error?.message ?? `HTTP ${httpResult.status}`,\n _extraction_path: 'error',\n },\n };\n }\n\n if (rpc.error) {\n const code = rpc.error.code;\n return {\n httpResult,\n taskResult: {\n success: false,\n data: undefined,\n error:\n code !== undefined\n ? `JSON-RPC error ${code}: ${rpc.error.message ?? 'no message'}`\n : (rpc.error.message ?? 'JSON-RPC error (no code)'),\n _extraction_path: 'error',\n },\n };\n }\n\n const data = rpc.result;\n const extractionPath: 'text_fallback' | 'none' = data !== undefined && data !== null ? 'text_fallback' : 'none';\n return { httpResult, taskResult: { success: true, data, _extraction_path: extractionPath } };\n } catch (err) {\n httpResult.error = err instanceof Error ? err.message : String(err);\n return { httpResult };\n }\n}\n\n// IP classifiers live in `src/lib/net/address-guards.ts` so the SSRF-safe\n// fetch primitive can use them without depending on the testing module.\n// Re-exported here for existing import sites (storyboard-security test + any\n// external probe consumers).\nexport const isAlwaysBlocked = sharedIsAlwaysBlocked;\nexport const isPrivateIp = sharedIsPrivateIp;\nexport { SsrfRefusedError };\n"],"mappings":"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","names":["sharedIsAlwaysBlocked","sharedIsPrivateIp"]}
1
+ {"version":3,"sources":["../../../../src/lib/testing/storyboard/probes.ts"],"sourcesContent":["/**\n * HTTP probes used by security-baseline storyboard tasks.\n *\n * Three synthetic tasks dispatch through here instead of the MCP client:\n *\n * - `protected_resource_metadata` — GET the agent's\n * `/.well-known/oauth-protected-resource<mountPath>` and verify RFC 9728.\n * - `oauth_auth_server_metadata` — GET `<issuer>/.well-known/oauth-authorization-server`\n * using the first issuer from the previous step's response. Hardened against\n * SSRF because the URL comes from agent-controlled data.\n * - `assert_contribution` — no network; evaluates accumulated flags set by\n * prior steps that carried `contributes_to`.\n */\nimport { randomBytes } from 'crypto';\nimport { LATEST_PROTOCOL_VERSION, SUPPORTED_PROTOCOL_VERSIONS } from '@modelcontextprotocol/sdk/types.js';\nimport {\n ssrfSafeFetch,\n decodeBodyAsJsonOrText,\n SsrfRefusedError,\n isAlwaysBlocked as sharedIsAlwaysBlocked,\n isPrivateIp as sharedIsPrivateIp,\n} from '../../net';\nimport type { HttpProbeResult } from './types';\nimport type { TaskResult } from '../types';\n\n// Timeout + body-cap defaults come from `ssrfSafeFetch` (10 s, 64 KiB).\n// The probe wrappers deliberately don't override them so probe behavior\n// stays in sync with the shared primitive.\n\n/** Task names dispatched via HTTP probes (not via the MCP client). */\nexport const PROBE_TASKS = new Set([\n 'protected_resource_metadata',\n 'oauth_auth_server_metadata',\n 'assert_contribution',\n 'request_signing_probe',\n 'fetch_brand_jwks',\n 'assert_jwks_purpose',\n 'expect_rate_limit_not_replayed',\n]);\n\n// ---------------------------------------------------------------------------\n// Protected-resource metadata probe\n// ---------------------------------------------------------------------------\n\n/**\n * GET `<agentUrl origin>/.well-known/oauth-protected-resource<agentUrl path>`.\n * Same-origin as the agent, so SSRF risk is bounded.\n *\n * When `allowPrivateIp` is set (matches the runner's `--allow-http` flag),\n * loopback and RFC 1918 targets are allowed so dev loops against localhost\n * agents work end-to-end.\n */\nexport async function probeProtectedResourceMetadata(\n agentUrl: string,\n options: { allowPrivateIp?: boolean; fetchFn?: typeof fetch } = {}\n): Promise<HttpProbeResult> {\n const u = new URL(agentUrl);\n const metadataUrl = `${u.origin}/.well-known/oauth-protected-resource${u.pathname}`;\n return fetchProbe(metadataUrl, {\n allowPrivateIp: options.allowPrivateIp ?? false,\n fetchFn: options.fetchFn,\n });\n}\n\n// ---------------------------------------------------------------------------\n// OAuth authorization-server metadata probe\n// ---------------------------------------------------------------------------\n\n/**\n * GET `<issuer>/.well-known/oauth-authorization-server` for the first issuer\n * named in the protected-resource metadata. Because the URL is agent-supplied,\n * this is the SSRF-hot path — {@link fetchProbe} rejects private networks,\n * non-https schemes, and unbounded responses.\n */\nexport async function probeOauthAuthServerMetadata(\n priorProbe: HttpProbeResult | undefined,\n options: { allowPrivateIp?: boolean; fetchFn?: typeof fetch } = {}\n): Promise<HttpProbeResult> {\n if (!priorProbe || priorProbe.error) {\n return {\n url: '',\n status: 0,\n headers: {},\n body: null,\n error: 'protected_resource_metadata step missing or errored — cannot resolve issuer',\n };\n }\n const body = priorProbe.body as { authorization_servers?: unknown } | null;\n const servers = Array.isArray(body?.authorization_servers) ? (body!.authorization_servers as string[]) : [];\n if (servers.length === 0 || typeof servers[0] !== 'string') {\n return {\n url: '',\n status: 0,\n headers: {},\n body: null,\n error: 'No authorization_servers[0] found in protected-resource metadata',\n };\n }\n const issuer = servers[0].replace(/\\/$/, '');\n const metadataUrl = `${issuer}/.well-known/oauth-authorization-server`;\n return fetchProbe(metadataUrl, {\n allowPrivateIp: options.allowPrivateIp ?? false,\n fetchFn: options.fetchFn,\n });\n}\n\n// ---------------------------------------------------------------------------\n// Fetch with guardrails\n// ---------------------------------------------------------------------------\n\nexport interface FetchProbeOptions {\n /** Allow http:// and private-IP destinations. Default false. */\n allowPrivateIp?: boolean;\n /** Override timeout for specific call sites. */\n timeoutMs?: number;\n /** Trusted scoped fetch; must enforce DNS-rebinding protection. */\n fetchFn?: typeof fetch;\n}\n\n/**\n * Perform a GET against an attacker-influenceable URL with defensive limits.\n *\n * Guardrails (RFC 9728 / RFC 8414 metadata endpoints typically live on public\n * HTTPS; anything else is suspicious):\n * - Scheme: `https:` only by default; `http:` allowed only when\n * `allowPrivateIp` is set. `file:`, `ftp:`, `data:`, etc. are always rejected.\n * - DNS: resolves all A/AAAA records once, rejects if any is private, then\n * pins the outbound connection to the validated IP. Defeats DNS rebinding\n * where an attacker's authoritative nameserver returns a public address\n * to our guard lookup and a private address to the connect-time lookup.\n * - Private-IP block applies RFC 1918, loopback, link-local, IPv6 ULA,\n * CGNAT (100.64/10), multicast, broadcast, and IPv4-mapped IPv6.\n * - IMDS (169.254.169.254 / fe80::) stays blocked **even under\n * `allowPrivateIp`** — no legitimate dev use for probing it.\n * - Redirects are NOT followed (`redirect: 'manual'`).\n * - Body capped at 64 KiB, total fetch time capped at 10 s.\n */\nexport async function fetchProbe(url: string, options: FetchProbeOptions = {}): Promise<HttpProbeResult> {\n try {\n const res = await ssrfSafeFetch(url, {\n method: 'GET',\n headers: { accept: 'application/json' },\n allowPrivateIp: options.allowPrivateIp ?? false,\n ...(options.timeoutMs !== undefined ? { timeoutMs: options.timeoutMs } : {}),\n ...(options.fetchFn ? { trustedFetchFn: options.fetchFn } : {}),\n });\n return {\n url,\n status: res.status,\n headers: res.headers,\n body: decodeBodyAsJsonOrText(res.body, res.headers['content-type']),\n };\n } catch (err) {\n return {\n url,\n status: 0,\n headers: {},\n body: null,\n error: err instanceof Error ? err.message : String(err),\n };\n }\n}\n\n// ---------------------------------------------------------------------------\n// Credential generators (value_strategy)\n// ---------------------------------------------------------------------------\n\n/**\n * Generate a per-run bogus API key. Prefix is human-readable for log grep;\n * the 32 random hex bytes guarantee no allowlist collision.\n */\nexport function generateRandomInvalidApiKey(): string {\n return `invalid-${randomBytes(32).toString('hex')}`;\n}\n\n/**\n * Generate a per-run bogus JWT-shaped Bearer token. Emits three segments with\n * valid base64url-encoded JSON header/payload and a random signature — so\n * well-implemented validators fail at signature verification (→ 401), and\n * strict parse-time validators that reject at the structural level also fail\n * cleanly (→ 400 per RFC 6750 §3.1). Either is conformant.\n */\nexport function generateRandomInvalidJwt(): string {\n const header = base64url(Buffer.from(JSON.stringify({ alg: 'RS256', typ: 'JWT' })));\n const payload = base64url(\n Buffer.from(JSON.stringify({ sub: `invalid-${randomBytes(8).toString('hex')}`, aud: 'invalid-probe' }))\n );\n const signature = base64url(randomBytes(32));\n return `${header}.${payload}.${signature}`;\n}\n\nfunction base64url(buf: Buffer): string {\n return buf.toString('base64').replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=+$/, '');\n}\n\n// ---------------------------------------------------------------------------\n// Raw-MCP probe (auth-override dispatch)\n// ---------------------------------------------------------------------------\n\nlet probeRequestId = 0;\nconst MCP_SESSION_ID_HEADER = 'mcp-session-id';\nconst MCP_PROTOCOL_VERSION_HEADER = 'mcp-protocol-version';\n\ntype JsonRpcEnvelope = {\n jsonrpc: '2.0';\n id?: number;\n method?: string;\n params?: Record<string, unknown>;\n result?: { structuredContent?: unknown; content?: unknown; isError?: boolean; protocolVersion?: string };\n error?: { message?: string; code?: number };\n};\n\ninterface RawJsonRpcPostResult {\n httpResult: HttpProbeResult;\n parsed?: JsonRpcEnvelope;\n parseError?: boolean;\n}\n\nasync function postRawMcpJsonRpc(options: {\n agentUrl: string;\n envelope: Record<string, unknown>;\n headers: Record<string, string>;\n allowPrivateIp: boolean;\n sessionId?: string;\n protocolVersion?: string;\n responseId?: number;\n parseBody?: boolean;\n allowEmptyBody?: boolean;\n fetchFn?: typeof fetch;\n}): Promise<RawJsonRpcPostResult> {\n const {\n agentUrl,\n envelope,\n headers,\n allowPrivateIp,\n sessionId,\n protocolVersion,\n responseId,\n parseBody = true,\n allowEmptyBody = false,\n } = options;\n const httpResult: HttpProbeResult = { url: agentUrl, status: 0, headers: {}, body: null };\n try {\n const res = await ssrfSafeFetch(agentUrl, {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n accept: 'application/json, text/event-stream',\n ...withoutMcpSessionHeaders(headers),\n ...(sessionId ? { [MCP_SESSION_ID_HEADER]: sessionId } : {}),\n ...(protocolVersion ? { [MCP_PROTOCOL_VERSION_HEADER]: protocolVersion } : {}),\n },\n body: JSON.stringify(envelope),\n allowPrivateIp,\n ...(options.fetchFn ? { trustedFetchFn: options.fetchFn } : {}),\n });\n httpResult.status = res.status;\n httpResult.headers = res.headers;\n\n const text = Buffer.from(res.body.buffer, res.body.byteOffset, res.body.byteLength).toString('utf8');\n if (!parseBody) {\n httpResult.body = text || null;\n return { httpResult };\n }\n if (allowEmptyBody && text.trim() === '') {\n httpResult.body = null;\n return { httpResult };\n }\n try {\n const parsed = parseMcpJsonRpcResponse(text, httpResult.headers['content-type'], responseId);\n httpResult.body = parsed;\n return { httpResult, parsed };\n } catch {\n httpResult.body = text;\n return { httpResult, parseError: true };\n }\n } catch (err) {\n httpResult.error = err instanceof Error ? err.message : String(err);\n return { httpResult };\n }\n}\n\nfunction withoutMcpSessionHeaders(headers: Record<string, string>): Record<string, string> {\n const cleaned: Record<string, string> = {};\n for (const [key, value] of Object.entries(headers)) {\n const normalized = key.toLowerCase();\n if (normalized === MCP_SESSION_ID_HEADER || normalized === MCP_PROTOCOL_VERSION_HEADER) continue;\n cleaned[key] = value;\n }\n return cleaned;\n}\n\nfunction parseMcpJsonRpcResponse(text: string, contentType: string | undefined, responseId?: number): JsonRpcEnvelope {\n if (contentType?.toLowerCase().includes('text/event-stream')) {\n // Streamable-HTTP MCP: the response is one or more SSE events whose\n // `data:` payloads are JSON-RPC envelopes. The spec lets a server emit\n // notifications before the final response, so choose the matching id.\n const dataLines = text.split(/\\r?\\n/).filter(l => l.startsWith('data:'));\n if (dataLines.length === 0) throw new Error('SSE response with no data event');\n let matched: JsonRpcEnvelope | undefined;\n let lastParsed: JsonRpcEnvelope | undefined;\n for (const line of dataLines) {\n const payload = line.slice('data:'.length).trim();\n if (!payload) continue;\n try {\n const envelope = JSON.parse(payload) as JsonRpcEnvelope;\n lastParsed = envelope;\n if (responseId !== undefined && envelope?.id === responseId) {\n matched = envelope;\n break;\n }\n } catch {\n // Skip non-JSON data lines (heartbeats, etc.); keep walking.\n }\n }\n const parsed = matched ?? lastParsed;\n if (parsed === undefined) throw new Error('SSE response had data events but none were parseable JSON');\n return parsed;\n }\n return JSON.parse(text) as JsonRpcEnvelope;\n}\n\nfunction taskResultFromRpc(httpResult: HttpProbeResult, rpc: JsonRpcEnvelope): TaskResult {\n if (httpResult.status >= 400) {\n return {\n success: false,\n data: undefined,\n error: rpc.error?.message ?? `HTTP ${httpResult.status}`,\n _extraction_path: 'error',\n };\n }\n if (rpc.error) {\n const code = rpc.error.code;\n return {\n success: false,\n data: undefined,\n error:\n code !== undefined\n ? `JSON-RPC error ${code}: ${rpc.error.message ?? 'no message'}`\n : (rpc.error.message ?? 'JSON-RPC error (no code)'),\n _extraction_path: 'error',\n };\n }\n const structured = rpc.result?.structuredContent;\n const hasStructured = structured !== undefined && structured !== null;\n const data = hasStructured ? structured : rpc.result?.content;\n const isError = !!rpc.result?.isError;\n const extractionPath: 'structured_content' | 'text_fallback' | 'error' | 'none' = isError\n ? 'error'\n : hasStructured\n ? 'structured_content'\n : data !== undefined && data !== null\n ? 'text_fallback'\n : 'none';\n return { success: !isError, data, _extraction_path: extractionPath };\n}\n\nfunction failedTaskResult(message: string): TaskResult {\n return {\n success: false,\n data: undefined,\n error: message,\n _extraction_path: 'error',\n };\n}\n\nfunction taskResultFromPostFailure(posted: RawJsonRpcPostResult): TaskResult {\n if (posted.parseError) {\n return failedTaskResult(\n `Non-JSON response body (content-type: ${posted.httpResult.headers['content-type'] ?? 'unknown'}).`\n );\n }\n if (posted.parsed) return taskResultFromRpc(posted.httpResult, posted.parsed);\n return failedTaskResult(posted.httpResult.error ?? `HTTP ${posted.httpResult.status}`);\n}\n\n/**\n * POST a JSON-RPC `tools/call` request to the MCP endpoint with caller-provided\n * headers. The probe first performs the Streamable HTTP initialize handshake,\n * including `notifications/initialized`, so auth probes hit the same session\n * boundary as normal MCP clients while still exposing raw HTTP status and\n * `WWW-Authenticate` headers for security storyboards.\n *\n * **Args are not secret** — must not contain credentials or PII. The server's\n * response body lands in `httpResult.body` and is written to compliance\n * reports. Outbound request body is not persisted.\n *\n * Returns an HttpProbeResult plus a synthetic TaskResult for steps that also\n * want to validate body shape — the structuredContent is unwrapped so\n * `field_present: \"context\"` resolves naturally.\n */\nexport async function rawMcpProbe(options: {\n agentUrl: string;\n toolName: string;\n args: Record<string, unknown>;\n headers?: Record<string, string>;\n /** Allow http:// and private-IP agent URLs (dev loops). Default false. */\n allowPrivateIp?: boolean;\n /** Scoped fetch implementation for every handshake and tool request. */\n fetchFn?: typeof fetch;\n}): Promise<{ httpResult: HttpProbeResult; taskResult?: TaskResult }> {\n const { agentUrl, toolName, args, headers = {}, allowPrivateIp = false, fetchFn } = options;\n const initializeId = ++probeRequestId;\n const initialize = await postRawMcpJsonRpc({\n agentUrl,\n envelope: {\n jsonrpc: '2.0',\n id: initializeId,\n method: 'initialize',\n params: {\n protocolVersion: LATEST_PROTOCOL_VERSION,\n capabilities: {},\n clientInfo: { name: 'AdCP Storyboard Raw MCP Probe', version: '1.0.0' },\n },\n },\n headers,\n allowPrivateIp,\n fetchFn,\n responseId: initializeId,\n });\n if (\n initialize.httpResult.error ||\n initialize.httpResult.status >= 400 ||\n !initialize.parsed ||\n initialize.parsed.error\n ) {\n return {\n httpResult: initialize.httpResult,\n taskResult: taskResultFromPostFailure(initialize),\n };\n }\n const negotiatedProtocolVersion = initialize.parsed.result?.protocolVersion;\n if (\n typeof negotiatedProtocolVersion !== 'string' ||\n !SUPPORTED_PROTOCOL_VERSIONS.includes(negotiatedProtocolVersion)\n ) {\n return {\n httpResult: initialize.httpResult,\n taskResult: failedTaskResult(\n negotiatedProtocolVersion\n ? `Server's protocol version is not supported: ${negotiatedProtocolVersion}`\n : 'Server sent invalid initialize result: missing protocolVersion'\n ),\n };\n }\n\n const sessionId = initialize.httpResult.headers[MCP_SESSION_ID_HEADER];\n const initialized = await postRawMcpJsonRpc({\n agentUrl,\n envelope: {\n jsonrpc: '2.0',\n method: 'notifications/initialized',\n params: {},\n },\n headers,\n allowPrivateIp,\n fetchFn,\n ...(sessionId && { sessionId }),\n protocolVersion: negotiatedProtocolVersion,\n allowEmptyBody: true,\n });\n if (\n initialized.httpResult.error ||\n initialized.httpResult.status >= 400 ||\n initialized.parseError ||\n initialized.parsed?.error\n ) {\n return {\n httpResult: initialized.httpResult,\n taskResult: taskResultFromPostFailure(initialized),\n };\n }\n\n const requestId = ++probeRequestId;\n const toolEnvelope = {\n jsonrpc: '2.0',\n id: requestId,\n method: 'tools/call',\n params: { name: toolName, arguments: args },\n };\n const posted = await postRawMcpJsonRpc({\n agentUrl,\n envelope: toolEnvelope,\n headers,\n allowPrivateIp,\n fetchFn,\n ...(sessionId && { sessionId }),\n protocolVersion: negotiatedProtocolVersion,\n responseId: requestId,\n });\n const { httpResult, parsed } = posted;\n if (httpResult.error) return { httpResult, taskResult: taskResultFromPostFailure(posted) };\n if (!parsed) {\n return {\n httpResult,\n taskResult: taskResultFromPostFailure(posted),\n };\n }\n return { httpResult, taskResult: taskResultFromRpc(httpResult, parsed) };\n}\n\n// ---------------------------------------------------------------------------\n// Raw-A2A probe (transport-layer diagnostics for A2A agents)\n// ---------------------------------------------------------------------------\n\n/**\n * POST a JSON-RPC 2.0 request to an A2A agent endpoint with caller-provided\n * headers. Bypasses the A2A SDK so raw HTTP status, headers, and JSON-RPC\n * error codes can be captured by storyboard diagnostics.\n *\n * Mirrors `rawMcpProbe` in structure and SSRF-safety contract. Key\n * differences from the MCP variant:\n *\n * - The caller supplies `method` + optional `params` (not a fixed `tools/call`\n * body). A2A has no single canonical method — use `\"message/send\"` for most\n * auth and error-code probes, `\"tasks/get\"` / `\"tasks/cancel\"` for lifecycle\n * checks. **Note:** `message/send` requires `params.message` (a full A2A\n * `Message` object with `messageId`, `role`, `kind`, `parts`). Passing\n * `params: {}` will produce `-32602 Invalid params` from a conformant server,\n * masking auth rejections — supply a minimal message when probing auth paths.\n * - A2A JSON-RPC error codes differ from MCP's. Notably `-32002` means\n * `TaskNotCancelable` in A2A (not session-not-initialized). The probe\n * surfaces raw numeric codes without protocol-specific aliasing so\n * storyboards can assert on the exact code.\n * - SSE (streaming) responses are handled the same way as `rawMcpProbe`:\n * `Accept: application/json` is sent; non-JSON bodies surface a distinct\n * error so callers don't mistake an event-stream for a silent success.\n *\n * **Args are not secret** — must not contain credentials or PII. The\n * server's response body lands in `httpResult.body` and is written to\n * compliance reports.\n *\n * Returns an `HttpProbeResult` plus an optional `TaskResult` (same shape as\n * `rawMcpProbe`) so the storyboard `ValidationContext` can consume both probes\n * interchangeably. The A2A success `_extraction_path` is `'text_fallback'`\n * (not `'structured_content'`) because A2A's `result` field is a plain object,\n * not an MCP structured-content envelope.\n */\nexport async function rawA2aProbe(options: {\n /** Base URL of the A2A agent endpoint (e.g. `https://agent.example.com/a2a`). */\n agentUrl: string;\n /** A2A/JSON-RPC 2.0 method name (e.g. `\"message/send\"`, `\"tasks/get\"`). */\n method: string;\n /** JSON-RPC params. Defaults to `{}` so the probe always emits a valid envelope. */\n params?: Record<string, unknown>;\n headers?: Record<string, string>;\n /** Allow http:// and private-IP agent URLs (dev loops). Default false. */\n allowPrivateIp?: boolean;\n}): Promise<{ httpResult: HttpProbeResult; taskResult?: TaskResult }> {\n const { agentUrl, method, params, headers = {}, allowPrivateIp = false } = options;\n const body = JSON.stringify({\n jsonrpc: '2.0',\n id: ++probeRequestId,\n method,\n params: params ?? {},\n });\n\n const httpResult: HttpProbeResult = { url: agentUrl, status: 0, headers: {}, body: null };\n try {\n const res = await ssrfSafeFetch(agentUrl, {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n accept: 'application/json',\n ...headers,\n },\n body,\n allowPrivateIp,\n });\n httpResult.status = res.status;\n httpResult.headers = res.headers;\n\n const text = Buffer.from(res.body.buffer, res.body.byteOffset, res.body.byteLength).toString('utf8');\n let parsed: unknown;\n try {\n parsed = JSON.parse(text);\n } catch {\n httpResult.body = text;\n return {\n httpResult,\n taskResult: {\n success: false,\n data: undefined,\n error: `Non-JSON response body (content-type: ${httpResult.headers['content-type'] ?? 'unknown'}).`,\n _extraction_path: 'error',\n },\n };\n }\n httpResult.body = parsed;\n\n const rpc = parsed as {\n result?: unknown;\n error?: { message?: string; code?: number };\n };\n\n if (httpResult.status >= 400) {\n return {\n httpResult,\n taskResult: {\n success: false,\n data: undefined,\n error: rpc.error?.message ?? `HTTP ${httpResult.status}`,\n _extraction_path: 'error',\n },\n };\n }\n\n if (rpc.error) {\n const code = rpc.error.code;\n return {\n httpResult,\n taskResult: {\n success: false,\n data: undefined,\n error:\n code !== undefined\n ? `JSON-RPC error ${code}: ${rpc.error.message ?? 'no message'}`\n : (rpc.error.message ?? 'JSON-RPC error (no code)'),\n _extraction_path: 'error',\n },\n };\n }\n\n const data = rpc.result;\n const extractionPath: 'text_fallback' | 'none' = data !== undefined && data !== null ? 'text_fallback' : 'none';\n return { httpResult, taskResult: { success: true, data, _extraction_path: extractionPath } };\n } catch (err) {\n httpResult.error = err instanceof Error ? err.message : String(err);\n return { httpResult };\n }\n}\n\n// IP classifiers live in `src/lib/net/address-guards.ts` so the SSRF-safe\n// fetch primitive can use them without depending on the testing module.\n// Re-exported here for existing import sites (storyboard-security test + any\n// external probe consumers).\nexport const isAlwaysBlocked = sharedIsAlwaysBlocked;\nexport const isPrivateIp = sharedIsPrivateIp;\nexport { SsrfRefusedError };\n"],"mappings":"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","names":["sharedIsAlwaysBlocked","sharedIsPrivateIp"]}
@@ -19,7 +19,10 @@ const PROBE_TASKS = /* @__PURE__ */ new Set([
19
19
  async function probeProtectedResourceMetadata(agentUrl, options = {}) {
20
20
  const u = new URL(agentUrl);
21
21
  const metadataUrl = `${u.origin}/.well-known/oauth-protected-resource${u.pathname}`;
22
- return fetchProbe(metadataUrl, { allowPrivateIp: options.allowPrivateIp ?? false });
22
+ return fetchProbe(metadataUrl, {
23
+ allowPrivateIp: options.allowPrivateIp ?? false,
24
+ fetchFn: options.fetchFn
25
+ });
23
26
  }
24
27
  async function probeOauthAuthServerMetadata(priorProbe, options = {}) {
25
28
  if (!priorProbe || priorProbe.error) {
@@ -44,7 +47,10 @@ async function probeOauthAuthServerMetadata(priorProbe, options = {}) {
44
47
  }
45
48
  const issuer = servers[0].replace(/\/$/, "");
46
49
  const metadataUrl = `${issuer}/.well-known/oauth-authorization-server`;
47
- return fetchProbe(metadataUrl, { allowPrivateIp: options.allowPrivateIp ?? false });
50
+ return fetchProbe(metadataUrl, {
51
+ allowPrivateIp: options.allowPrivateIp ?? false,
52
+ fetchFn: options.fetchFn
53
+ });
48
54
  }
49
55
  async function fetchProbe(url, options = {}) {
50
56
  try {
@@ -52,7 +58,8 @@ async function fetchProbe(url, options = {}) {
52
58
  method: "GET",
53
59
  headers: { accept: "application/json" },
54
60
  allowPrivateIp: options.allowPrivateIp ?? false,
55
- ...options.timeoutMs !== void 0 ? { timeoutMs: options.timeoutMs } : {}
61
+ ...options.timeoutMs !== void 0 ? { timeoutMs: options.timeoutMs } : {},
62
+ ...options.fetchFn ? { trustedFetchFn: options.fetchFn } : {}
56
63
  });
57
64
  return {
58
65
  url,
@@ -111,7 +118,8 @@ async function postRawMcpJsonRpc(options) {
111
118
  ...protocolVersion ? { [MCP_PROTOCOL_VERSION_HEADER]: protocolVersion } : {}
112
119
  },
113
120
  body: JSON.stringify(envelope),
114
- allowPrivateIp
121
+ allowPrivateIp,
122
+ ...options.fetchFn ? { trustedFetchFn: options.fetchFn } : {}
115
123
  });
116
124
  httpResult.status = res.status;
117
125
  httpResult.headers = res.headers;
@@ -214,7 +222,7 @@ function taskResultFromPostFailure(posted) {
214
222
  return failedTaskResult(posted.httpResult.error ?? `HTTP ${posted.httpResult.status}`);
215
223
  }
216
224
  async function rawMcpProbe(options) {
217
- const { agentUrl, toolName, args, headers = {}, allowPrivateIp = false } = options;
225
+ const { agentUrl, toolName, args, headers = {}, allowPrivateIp = false, fetchFn } = options;
218
226
  const initializeId = ++probeRequestId;
219
227
  const initialize = await postRawMcpJsonRpc({
220
228
  agentUrl,
@@ -230,6 +238,7 @@ async function rawMcpProbe(options) {
230
238
  },
231
239
  headers,
232
240
  allowPrivateIp,
241
+ fetchFn,
233
242
  responseId: initializeId
234
243
  });
235
244
  if (initialize.httpResult.error || initialize.httpResult.status >= 400 || !initialize.parsed || initialize.parsed.error) {
@@ -257,6 +266,7 @@ async function rawMcpProbe(options) {
257
266
  },
258
267
  headers,
259
268
  allowPrivateIp,
269
+ fetchFn,
260
270
  ...sessionId && { sessionId },
261
271
  protocolVersion: negotiatedProtocolVersion,
262
272
  allowEmptyBody: true
@@ -279,6 +289,7 @@ async function rawMcpProbe(options) {
279
289
  envelope: toolEnvelope,
280
290
  headers,
281
291
  allowPrivateIp,
292
+ fetchFn,
282
293
  ...sessionId && { sessionId },
283
294
  protocolVersion: negotiatedProtocolVersion,
284
295
  responseId: requestId
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/lib/testing/storyboard/probes.ts"],"sourcesContent":["/**\n * HTTP probes used by security-baseline storyboard tasks.\n *\n * Three synthetic tasks dispatch through here instead of the MCP client:\n *\n * - `protected_resource_metadata` — GET the agent's\n * `/.well-known/oauth-protected-resource<mountPath>` and verify RFC 9728.\n * - `oauth_auth_server_metadata` — GET `<issuer>/.well-known/oauth-authorization-server`\n * using the first issuer from the previous step's response. Hardened against\n * SSRF because the URL comes from agent-controlled data.\n * - `assert_contribution` — no network; evaluates accumulated flags set by\n * prior steps that carried `contributes_to`.\n */\nimport { randomBytes } from 'crypto';\nimport { LATEST_PROTOCOL_VERSION, SUPPORTED_PROTOCOL_VERSIONS } from '@modelcontextprotocol/sdk/types.js';\nimport {\n ssrfSafeFetch,\n decodeBodyAsJsonOrText,\n SsrfRefusedError,\n isAlwaysBlocked as sharedIsAlwaysBlocked,\n isPrivateIp as sharedIsPrivateIp,\n} from '../../net';\nimport type { HttpProbeResult } from './types';\nimport type { TaskResult } from '../types';\n\n// Timeout + body-cap defaults come from `ssrfSafeFetch` (10 s, 64 KiB).\n// The probe wrappers deliberately don't override them so probe behavior\n// stays in sync with the shared primitive.\n\n/** Task names dispatched via HTTP probes (not via the MCP client). */\nexport const PROBE_TASKS = new Set([\n 'protected_resource_metadata',\n 'oauth_auth_server_metadata',\n 'assert_contribution',\n 'request_signing_probe',\n 'fetch_brand_jwks',\n 'assert_jwks_purpose',\n 'expect_rate_limit_not_replayed',\n]);\n\n// ---------------------------------------------------------------------------\n// Protected-resource metadata probe\n// ---------------------------------------------------------------------------\n\n/**\n * GET `<agentUrl origin>/.well-known/oauth-protected-resource<agentUrl path>`.\n * Same-origin as the agent, so SSRF risk is bounded.\n *\n * When `allowPrivateIp` is set (matches the runner's `--allow-http` flag),\n * loopback and RFC 1918 targets are allowed so dev loops against localhost\n * agents work end-to-end.\n */\nexport async function probeProtectedResourceMetadata(\n agentUrl: string,\n options: { allowPrivateIp?: boolean } = {}\n): Promise<HttpProbeResult> {\n const u = new URL(agentUrl);\n const metadataUrl = `${u.origin}/.well-known/oauth-protected-resource${u.pathname}`;\n return fetchProbe(metadataUrl, { allowPrivateIp: options.allowPrivateIp ?? false });\n}\n\n// ---------------------------------------------------------------------------\n// OAuth authorization-server metadata probe\n// ---------------------------------------------------------------------------\n\n/**\n * GET `<issuer>/.well-known/oauth-authorization-server` for the first issuer\n * named in the protected-resource metadata. Because the URL is agent-supplied,\n * this is the SSRF-hot path — {@link fetchProbe} rejects private networks,\n * non-https schemes, and unbounded responses.\n */\nexport async function probeOauthAuthServerMetadata(\n priorProbe: HttpProbeResult | undefined,\n options: { allowPrivateIp?: boolean } = {}\n): Promise<HttpProbeResult> {\n if (!priorProbe || priorProbe.error) {\n return {\n url: '',\n status: 0,\n headers: {},\n body: null,\n error: 'protected_resource_metadata step missing or errored — cannot resolve issuer',\n };\n }\n const body = priorProbe.body as { authorization_servers?: unknown } | null;\n const servers = Array.isArray(body?.authorization_servers) ? (body!.authorization_servers as string[]) : [];\n if (servers.length === 0 || typeof servers[0] !== 'string') {\n return {\n url: '',\n status: 0,\n headers: {},\n body: null,\n error: 'No authorization_servers[0] found in protected-resource metadata',\n };\n }\n const issuer = servers[0].replace(/\\/$/, '');\n const metadataUrl = `${issuer}/.well-known/oauth-authorization-server`;\n return fetchProbe(metadataUrl, { allowPrivateIp: options.allowPrivateIp ?? false });\n}\n\n// ---------------------------------------------------------------------------\n// Fetch with guardrails\n// ---------------------------------------------------------------------------\n\nexport interface FetchProbeOptions {\n /** Allow http:// and private-IP destinations. Default false. */\n allowPrivateIp?: boolean;\n /** Override timeout for specific call sites. */\n timeoutMs?: number;\n}\n\n/**\n * Perform a GET against an attacker-influenceable URL with defensive limits.\n *\n * Guardrails (RFC 9728 / RFC 8414 metadata endpoints typically live on public\n * HTTPS; anything else is suspicious):\n * - Scheme: `https:` only by default; `http:` allowed only when\n * `allowPrivateIp` is set. `file:`, `ftp:`, `data:`, etc. are always rejected.\n * - DNS: resolves all A/AAAA records once, rejects if any is private, then\n * pins the outbound connection to the validated IP. Defeats DNS rebinding\n * where an attacker's authoritative nameserver returns a public address\n * to our guard lookup and a private address to the connect-time lookup.\n * - Private-IP block applies RFC 1918, loopback, link-local, IPv6 ULA,\n * CGNAT (100.64/10), multicast, broadcast, and IPv4-mapped IPv6.\n * - IMDS (169.254.169.254 / fe80::) stays blocked **even under\n * `allowPrivateIp`** — no legitimate dev use for probing it.\n * - Redirects are NOT followed (`redirect: 'manual'`).\n * - Body capped at 64 KiB, total fetch time capped at 10 s.\n */\nexport async function fetchProbe(url: string, options: FetchProbeOptions = {}): Promise<HttpProbeResult> {\n try {\n const res = await ssrfSafeFetch(url, {\n method: 'GET',\n headers: { accept: 'application/json' },\n allowPrivateIp: options.allowPrivateIp ?? false,\n ...(options.timeoutMs !== undefined ? { timeoutMs: options.timeoutMs } : {}),\n });\n return {\n url,\n status: res.status,\n headers: res.headers,\n body: decodeBodyAsJsonOrText(res.body, res.headers['content-type']),\n };\n } catch (err) {\n return {\n url,\n status: 0,\n headers: {},\n body: null,\n error: err instanceof Error ? err.message : String(err),\n };\n }\n}\n\n// ---------------------------------------------------------------------------\n// Credential generators (value_strategy)\n// ---------------------------------------------------------------------------\n\n/**\n * Generate a per-run bogus API key. Prefix is human-readable for log grep;\n * the 32 random hex bytes guarantee no allowlist collision.\n */\nexport function generateRandomInvalidApiKey(): string {\n return `invalid-${randomBytes(32).toString('hex')}`;\n}\n\n/**\n * Generate a per-run bogus JWT-shaped Bearer token. Emits three segments with\n * valid base64url-encoded JSON header/payload and a random signature — so\n * well-implemented validators fail at signature verification (→ 401), and\n * strict parse-time validators that reject at the structural level also fail\n * cleanly (→ 400 per RFC 6750 §3.1). Either is conformant.\n */\nexport function generateRandomInvalidJwt(): string {\n const header = base64url(Buffer.from(JSON.stringify({ alg: 'RS256', typ: 'JWT' })));\n const payload = base64url(\n Buffer.from(JSON.stringify({ sub: `invalid-${randomBytes(8).toString('hex')}`, aud: 'invalid-probe' }))\n );\n const signature = base64url(randomBytes(32));\n return `${header}.${payload}.${signature}`;\n}\n\nfunction base64url(buf: Buffer): string {\n return buf.toString('base64').replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=+$/, '');\n}\n\n// ---------------------------------------------------------------------------\n// Raw-MCP probe (auth-override dispatch)\n// ---------------------------------------------------------------------------\n\nlet probeRequestId = 0;\nconst MCP_SESSION_ID_HEADER = 'mcp-session-id';\nconst MCP_PROTOCOL_VERSION_HEADER = 'mcp-protocol-version';\n\ntype JsonRpcEnvelope = {\n jsonrpc: '2.0';\n id?: number;\n method?: string;\n params?: Record<string, unknown>;\n result?: { structuredContent?: unknown; content?: unknown; isError?: boolean; protocolVersion?: string };\n error?: { message?: string; code?: number };\n};\n\ninterface RawJsonRpcPostResult {\n httpResult: HttpProbeResult;\n parsed?: JsonRpcEnvelope;\n parseError?: boolean;\n}\n\nasync function postRawMcpJsonRpc(options: {\n agentUrl: string;\n envelope: Record<string, unknown>;\n headers: Record<string, string>;\n allowPrivateIp: boolean;\n sessionId?: string;\n protocolVersion?: string;\n responseId?: number;\n parseBody?: boolean;\n allowEmptyBody?: boolean;\n}): Promise<RawJsonRpcPostResult> {\n const {\n agentUrl,\n envelope,\n headers,\n allowPrivateIp,\n sessionId,\n protocolVersion,\n responseId,\n parseBody = true,\n allowEmptyBody = false,\n } = options;\n const httpResult: HttpProbeResult = { url: agentUrl, status: 0, headers: {}, body: null };\n try {\n const res = await ssrfSafeFetch(agentUrl, {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n accept: 'application/json, text/event-stream',\n ...withoutMcpSessionHeaders(headers),\n ...(sessionId ? { [MCP_SESSION_ID_HEADER]: sessionId } : {}),\n ...(protocolVersion ? { [MCP_PROTOCOL_VERSION_HEADER]: protocolVersion } : {}),\n },\n body: JSON.stringify(envelope),\n allowPrivateIp,\n });\n httpResult.status = res.status;\n httpResult.headers = res.headers;\n\n const text = Buffer.from(res.body.buffer, res.body.byteOffset, res.body.byteLength).toString('utf8');\n if (!parseBody) {\n httpResult.body = text || null;\n return { httpResult };\n }\n if (allowEmptyBody && text.trim() === '') {\n httpResult.body = null;\n return { httpResult };\n }\n try {\n const parsed = parseMcpJsonRpcResponse(text, httpResult.headers['content-type'], responseId);\n httpResult.body = parsed;\n return { httpResult, parsed };\n } catch {\n httpResult.body = text;\n return { httpResult, parseError: true };\n }\n } catch (err) {\n httpResult.error = err instanceof Error ? err.message : String(err);\n return { httpResult };\n }\n}\n\nfunction withoutMcpSessionHeaders(headers: Record<string, string>): Record<string, string> {\n const cleaned: Record<string, string> = {};\n for (const [key, value] of Object.entries(headers)) {\n const normalized = key.toLowerCase();\n if (normalized === MCP_SESSION_ID_HEADER || normalized === MCP_PROTOCOL_VERSION_HEADER) continue;\n cleaned[key] = value;\n }\n return cleaned;\n}\n\nfunction parseMcpJsonRpcResponse(text: string, contentType: string | undefined, responseId?: number): JsonRpcEnvelope {\n if (contentType?.toLowerCase().includes('text/event-stream')) {\n // Streamable-HTTP MCP: the response is one or more SSE events whose\n // `data:` payloads are JSON-RPC envelopes. The spec lets a server emit\n // notifications before the final response, so choose the matching id.\n const dataLines = text.split(/\\r?\\n/).filter(l => l.startsWith('data:'));\n if (dataLines.length === 0) throw new Error('SSE response with no data event');\n let matched: JsonRpcEnvelope | undefined;\n let lastParsed: JsonRpcEnvelope | undefined;\n for (const line of dataLines) {\n const payload = line.slice('data:'.length).trim();\n if (!payload) continue;\n try {\n const envelope = JSON.parse(payload) as JsonRpcEnvelope;\n lastParsed = envelope;\n if (responseId !== undefined && envelope?.id === responseId) {\n matched = envelope;\n break;\n }\n } catch {\n // Skip non-JSON data lines (heartbeats, etc.); keep walking.\n }\n }\n const parsed = matched ?? lastParsed;\n if (parsed === undefined) throw new Error('SSE response had data events but none were parseable JSON');\n return parsed;\n }\n return JSON.parse(text) as JsonRpcEnvelope;\n}\n\nfunction taskResultFromRpc(httpResult: HttpProbeResult, rpc: JsonRpcEnvelope): TaskResult {\n if (httpResult.status >= 400) {\n return {\n success: false,\n data: undefined,\n error: rpc.error?.message ?? `HTTP ${httpResult.status}`,\n _extraction_path: 'error',\n };\n }\n if (rpc.error) {\n const code = rpc.error.code;\n return {\n success: false,\n data: undefined,\n error:\n code !== undefined\n ? `JSON-RPC error ${code}: ${rpc.error.message ?? 'no message'}`\n : (rpc.error.message ?? 'JSON-RPC error (no code)'),\n _extraction_path: 'error',\n };\n }\n const structured = rpc.result?.structuredContent;\n const hasStructured = structured !== undefined && structured !== null;\n const data = hasStructured ? structured : rpc.result?.content;\n const isError = !!rpc.result?.isError;\n const extractionPath: 'structured_content' | 'text_fallback' | 'error' | 'none' = isError\n ? 'error'\n : hasStructured\n ? 'structured_content'\n : data !== undefined && data !== null\n ? 'text_fallback'\n : 'none';\n return { success: !isError, data, _extraction_path: extractionPath };\n}\n\nfunction failedTaskResult(message: string): TaskResult {\n return {\n success: false,\n data: undefined,\n error: message,\n _extraction_path: 'error',\n };\n}\n\nfunction taskResultFromPostFailure(posted: RawJsonRpcPostResult): TaskResult {\n if (posted.parseError) {\n return failedTaskResult(\n `Non-JSON response body (content-type: ${posted.httpResult.headers['content-type'] ?? 'unknown'}).`\n );\n }\n if (posted.parsed) return taskResultFromRpc(posted.httpResult, posted.parsed);\n return failedTaskResult(posted.httpResult.error ?? `HTTP ${posted.httpResult.status}`);\n}\n\n/**\n * POST a JSON-RPC `tools/call` request to the MCP endpoint with caller-provided\n * headers. The probe first performs the Streamable HTTP initialize handshake,\n * including `notifications/initialized`, so auth probes hit the same session\n * boundary as normal MCP clients while still exposing raw HTTP status and\n * `WWW-Authenticate` headers for security storyboards.\n *\n * **Args are not secret** — must not contain credentials or PII. The server's\n * response body lands in `httpResult.body` and is written to compliance\n * reports. Outbound request body is not persisted.\n *\n * Returns an HttpProbeResult plus a synthetic TaskResult for steps that also\n * want to validate body shape — the structuredContent is unwrapped so\n * `field_present: \"context\"` resolves naturally.\n */\nexport async function rawMcpProbe(options: {\n agentUrl: string;\n toolName: string;\n args: Record<string, unknown>;\n headers?: Record<string, string>;\n /** Allow http:// and private-IP agent URLs (dev loops). Default false. */\n allowPrivateIp?: boolean;\n}): Promise<{ httpResult: HttpProbeResult; taskResult?: TaskResult }> {\n const { agentUrl, toolName, args, headers = {}, allowPrivateIp = false } = options;\n const initializeId = ++probeRequestId;\n const initialize = await postRawMcpJsonRpc({\n agentUrl,\n envelope: {\n jsonrpc: '2.0',\n id: initializeId,\n method: 'initialize',\n params: {\n protocolVersion: LATEST_PROTOCOL_VERSION,\n capabilities: {},\n clientInfo: { name: 'AdCP Storyboard Raw MCP Probe', version: '1.0.0' },\n },\n },\n headers,\n allowPrivateIp,\n responseId: initializeId,\n });\n if (\n initialize.httpResult.error ||\n initialize.httpResult.status >= 400 ||\n !initialize.parsed ||\n initialize.parsed.error\n ) {\n return {\n httpResult: initialize.httpResult,\n taskResult: taskResultFromPostFailure(initialize),\n };\n }\n const negotiatedProtocolVersion = initialize.parsed.result?.protocolVersion;\n if (\n typeof negotiatedProtocolVersion !== 'string' ||\n !SUPPORTED_PROTOCOL_VERSIONS.includes(negotiatedProtocolVersion)\n ) {\n return {\n httpResult: initialize.httpResult,\n taskResult: failedTaskResult(\n negotiatedProtocolVersion\n ? `Server's protocol version is not supported: ${negotiatedProtocolVersion}`\n : 'Server sent invalid initialize result: missing protocolVersion'\n ),\n };\n }\n\n const sessionId = initialize.httpResult.headers[MCP_SESSION_ID_HEADER];\n const initialized = await postRawMcpJsonRpc({\n agentUrl,\n envelope: {\n jsonrpc: '2.0',\n method: 'notifications/initialized',\n params: {},\n },\n headers,\n allowPrivateIp,\n ...(sessionId && { sessionId }),\n protocolVersion: negotiatedProtocolVersion,\n allowEmptyBody: true,\n });\n if (\n initialized.httpResult.error ||\n initialized.httpResult.status >= 400 ||\n initialized.parseError ||\n initialized.parsed?.error\n ) {\n return {\n httpResult: initialized.httpResult,\n taskResult: taskResultFromPostFailure(initialized),\n };\n }\n\n const requestId = ++probeRequestId;\n const toolEnvelope = {\n jsonrpc: '2.0',\n id: requestId,\n method: 'tools/call',\n params: { name: toolName, arguments: args },\n };\n const posted = await postRawMcpJsonRpc({\n agentUrl,\n envelope: toolEnvelope,\n headers,\n allowPrivateIp,\n ...(sessionId && { sessionId }),\n protocolVersion: negotiatedProtocolVersion,\n responseId: requestId,\n });\n const { httpResult, parsed } = posted;\n if (httpResult.error) return { httpResult, taskResult: taskResultFromPostFailure(posted) };\n if (!parsed) {\n return {\n httpResult,\n taskResult: taskResultFromPostFailure(posted),\n };\n }\n return { httpResult, taskResult: taskResultFromRpc(httpResult, parsed) };\n}\n\n// ---------------------------------------------------------------------------\n// Raw-A2A probe (transport-layer diagnostics for A2A agents)\n// ---------------------------------------------------------------------------\n\n/**\n * POST a JSON-RPC 2.0 request to an A2A agent endpoint with caller-provided\n * headers. Bypasses the A2A SDK so raw HTTP status, headers, and JSON-RPC\n * error codes can be captured by storyboard diagnostics.\n *\n * Mirrors `rawMcpProbe` in structure and SSRF-safety contract. Key\n * differences from the MCP variant:\n *\n * - The caller supplies `method` + optional `params` (not a fixed `tools/call`\n * body). A2A has no single canonical method — use `\"message/send\"` for most\n * auth and error-code probes, `\"tasks/get\"` / `\"tasks/cancel\"` for lifecycle\n * checks. **Note:** `message/send` requires `params.message` (a full A2A\n * `Message` object with `messageId`, `role`, `kind`, `parts`). Passing\n * `params: {}` will produce `-32602 Invalid params` from a conformant server,\n * masking auth rejections — supply a minimal message when probing auth paths.\n * - A2A JSON-RPC error codes differ from MCP's. Notably `-32002` means\n * `TaskNotCancelable` in A2A (not session-not-initialized). The probe\n * surfaces raw numeric codes without protocol-specific aliasing so\n * storyboards can assert on the exact code.\n * - SSE (streaming) responses are handled the same way as `rawMcpProbe`:\n * `Accept: application/json` is sent; non-JSON bodies surface a distinct\n * error so callers don't mistake an event-stream for a silent success.\n *\n * **Args are not secret** — must not contain credentials or PII. The\n * server's response body lands in `httpResult.body` and is written to\n * compliance reports.\n *\n * Returns an `HttpProbeResult` plus an optional `TaskResult` (same shape as\n * `rawMcpProbe`) so the storyboard `ValidationContext` can consume both probes\n * interchangeably. The A2A success `_extraction_path` is `'text_fallback'`\n * (not `'structured_content'`) because A2A's `result` field is a plain object,\n * not an MCP structured-content envelope.\n */\nexport async function rawA2aProbe(options: {\n /** Base URL of the A2A agent endpoint (e.g. `https://agent.example.com/a2a`). */\n agentUrl: string;\n /** A2A/JSON-RPC 2.0 method name (e.g. `\"message/send\"`, `\"tasks/get\"`). */\n method: string;\n /** JSON-RPC params. Defaults to `{}` so the probe always emits a valid envelope. */\n params?: Record<string, unknown>;\n headers?: Record<string, string>;\n /** Allow http:// and private-IP agent URLs (dev loops). Default false. */\n allowPrivateIp?: boolean;\n}): Promise<{ httpResult: HttpProbeResult; taskResult?: TaskResult }> {\n const { agentUrl, method, params, headers = {}, allowPrivateIp = false } = options;\n const body = JSON.stringify({\n jsonrpc: '2.0',\n id: ++probeRequestId,\n method,\n params: params ?? {},\n });\n\n const httpResult: HttpProbeResult = { url: agentUrl, status: 0, headers: {}, body: null };\n try {\n const res = await ssrfSafeFetch(agentUrl, {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n accept: 'application/json',\n ...headers,\n },\n body,\n allowPrivateIp,\n });\n httpResult.status = res.status;\n httpResult.headers = res.headers;\n\n const text = Buffer.from(res.body.buffer, res.body.byteOffset, res.body.byteLength).toString('utf8');\n let parsed: unknown;\n try {\n parsed = JSON.parse(text);\n } catch {\n httpResult.body = text;\n return {\n httpResult,\n taskResult: {\n success: false,\n data: undefined,\n error: `Non-JSON response body (content-type: ${httpResult.headers['content-type'] ?? 'unknown'}).`,\n _extraction_path: 'error',\n },\n };\n }\n httpResult.body = parsed;\n\n const rpc = parsed as {\n result?: unknown;\n error?: { message?: string; code?: number };\n };\n\n if (httpResult.status >= 400) {\n return {\n httpResult,\n taskResult: {\n success: false,\n data: undefined,\n error: rpc.error?.message ?? `HTTP ${httpResult.status}`,\n _extraction_path: 'error',\n },\n };\n }\n\n if (rpc.error) {\n const code = rpc.error.code;\n return {\n httpResult,\n taskResult: {\n success: false,\n data: undefined,\n error:\n code !== undefined\n ? `JSON-RPC error ${code}: ${rpc.error.message ?? 'no message'}`\n : (rpc.error.message ?? 'JSON-RPC error (no code)'),\n _extraction_path: 'error',\n },\n };\n }\n\n const data = rpc.result;\n const extractionPath: 'text_fallback' | 'none' = data !== undefined && data !== null ? 'text_fallback' : 'none';\n return { httpResult, taskResult: { success: true, data, _extraction_path: extractionPath } };\n } catch (err) {\n httpResult.error = err instanceof Error ? err.message : String(err);\n return { httpResult };\n }\n}\n\n// IP classifiers live in `src/lib/net/address-guards.ts` so the SSRF-safe\n// fetch primitive can use them without depending on the testing module.\n// Re-exported here for existing import sites (storyboard-security test + any\n// external probe consumers).\nexport const isAlwaysBlocked = sharedIsAlwaysBlocked;\nexport const isPrivateIp = sharedIsPrivateIp;\nexport { SsrfRefusedError };\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../../src/lib/testing/storyboard/probes.ts"],"sourcesContent":["/**\n * HTTP probes used by security-baseline storyboard tasks.\n *\n * Three synthetic tasks dispatch through here instead of the MCP client:\n *\n * - `protected_resource_metadata` — GET the agent's\n * `/.well-known/oauth-protected-resource<mountPath>` and verify RFC 9728.\n * - `oauth_auth_server_metadata` — GET `<issuer>/.well-known/oauth-authorization-server`\n * using the first issuer from the previous step's response. Hardened against\n * SSRF because the URL comes from agent-controlled data.\n * - `assert_contribution` — no network; evaluates accumulated flags set by\n * prior steps that carried `contributes_to`.\n */\nimport { randomBytes } from 'crypto';\nimport { LATEST_PROTOCOL_VERSION, SUPPORTED_PROTOCOL_VERSIONS } from '@modelcontextprotocol/sdk/types.js';\nimport {\n ssrfSafeFetch,\n decodeBodyAsJsonOrText,\n SsrfRefusedError,\n isAlwaysBlocked as sharedIsAlwaysBlocked,\n isPrivateIp as sharedIsPrivateIp,\n} from '../../net';\nimport type { HttpProbeResult } from './types';\nimport type { TaskResult } from '../types';\n\n// Timeout + body-cap defaults come from `ssrfSafeFetch` (10 s, 64 KiB).\n// The probe wrappers deliberately don't override them so probe behavior\n// stays in sync with the shared primitive.\n\n/** Task names dispatched via HTTP probes (not via the MCP client). */\nexport const PROBE_TASKS = new Set([\n 'protected_resource_metadata',\n 'oauth_auth_server_metadata',\n 'assert_contribution',\n 'request_signing_probe',\n 'fetch_brand_jwks',\n 'assert_jwks_purpose',\n 'expect_rate_limit_not_replayed',\n]);\n\n// ---------------------------------------------------------------------------\n// Protected-resource metadata probe\n// ---------------------------------------------------------------------------\n\n/**\n * GET `<agentUrl origin>/.well-known/oauth-protected-resource<agentUrl path>`.\n * Same-origin as the agent, so SSRF risk is bounded.\n *\n * When `allowPrivateIp` is set (matches the runner's `--allow-http` flag),\n * loopback and RFC 1918 targets are allowed so dev loops against localhost\n * agents work end-to-end.\n */\nexport async function probeProtectedResourceMetadata(\n agentUrl: string,\n options: { allowPrivateIp?: boolean; fetchFn?: typeof fetch } = {}\n): Promise<HttpProbeResult> {\n const u = new URL(agentUrl);\n const metadataUrl = `${u.origin}/.well-known/oauth-protected-resource${u.pathname}`;\n return fetchProbe(metadataUrl, {\n allowPrivateIp: options.allowPrivateIp ?? false,\n fetchFn: options.fetchFn,\n });\n}\n\n// ---------------------------------------------------------------------------\n// OAuth authorization-server metadata probe\n// ---------------------------------------------------------------------------\n\n/**\n * GET `<issuer>/.well-known/oauth-authorization-server` for the first issuer\n * named in the protected-resource metadata. Because the URL is agent-supplied,\n * this is the SSRF-hot path — {@link fetchProbe} rejects private networks,\n * non-https schemes, and unbounded responses.\n */\nexport async function probeOauthAuthServerMetadata(\n priorProbe: HttpProbeResult | undefined,\n options: { allowPrivateIp?: boolean; fetchFn?: typeof fetch } = {}\n): Promise<HttpProbeResult> {\n if (!priorProbe || priorProbe.error) {\n return {\n url: '',\n status: 0,\n headers: {},\n body: null,\n error: 'protected_resource_metadata step missing or errored — cannot resolve issuer',\n };\n }\n const body = priorProbe.body as { authorization_servers?: unknown } | null;\n const servers = Array.isArray(body?.authorization_servers) ? (body!.authorization_servers as string[]) : [];\n if (servers.length === 0 || typeof servers[0] !== 'string') {\n return {\n url: '',\n status: 0,\n headers: {},\n body: null,\n error: 'No authorization_servers[0] found in protected-resource metadata',\n };\n }\n const issuer = servers[0].replace(/\\/$/, '');\n const metadataUrl = `${issuer}/.well-known/oauth-authorization-server`;\n return fetchProbe(metadataUrl, {\n allowPrivateIp: options.allowPrivateIp ?? false,\n fetchFn: options.fetchFn,\n });\n}\n\n// ---------------------------------------------------------------------------\n// Fetch with guardrails\n// ---------------------------------------------------------------------------\n\nexport interface FetchProbeOptions {\n /** Allow http:// and private-IP destinations. Default false. */\n allowPrivateIp?: boolean;\n /** Override timeout for specific call sites. */\n timeoutMs?: number;\n /** Trusted scoped fetch; must enforce DNS-rebinding protection. */\n fetchFn?: typeof fetch;\n}\n\n/**\n * Perform a GET against an attacker-influenceable URL with defensive limits.\n *\n * Guardrails (RFC 9728 / RFC 8414 metadata endpoints typically live on public\n * HTTPS; anything else is suspicious):\n * - Scheme: `https:` only by default; `http:` allowed only when\n * `allowPrivateIp` is set. `file:`, `ftp:`, `data:`, etc. are always rejected.\n * - DNS: resolves all A/AAAA records once, rejects if any is private, then\n * pins the outbound connection to the validated IP. Defeats DNS rebinding\n * where an attacker's authoritative nameserver returns a public address\n * to our guard lookup and a private address to the connect-time lookup.\n * - Private-IP block applies RFC 1918, loopback, link-local, IPv6 ULA,\n * CGNAT (100.64/10), multicast, broadcast, and IPv4-mapped IPv6.\n * - IMDS (169.254.169.254 / fe80::) stays blocked **even under\n * `allowPrivateIp`** — no legitimate dev use for probing it.\n * - Redirects are NOT followed (`redirect: 'manual'`).\n * - Body capped at 64 KiB, total fetch time capped at 10 s.\n */\nexport async function fetchProbe(url: string, options: FetchProbeOptions = {}): Promise<HttpProbeResult> {\n try {\n const res = await ssrfSafeFetch(url, {\n method: 'GET',\n headers: { accept: 'application/json' },\n allowPrivateIp: options.allowPrivateIp ?? false,\n ...(options.timeoutMs !== undefined ? { timeoutMs: options.timeoutMs } : {}),\n ...(options.fetchFn ? { trustedFetchFn: options.fetchFn } : {}),\n });\n return {\n url,\n status: res.status,\n headers: res.headers,\n body: decodeBodyAsJsonOrText(res.body, res.headers['content-type']),\n };\n } catch (err) {\n return {\n url,\n status: 0,\n headers: {},\n body: null,\n error: err instanceof Error ? err.message : String(err),\n };\n }\n}\n\n// ---------------------------------------------------------------------------\n// Credential generators (value_strategy)\n// ---------------------------------------------------------------------------\n\n/**\n * Generate a per-run bogus API key. Prefix is human-readable for log grep;\n * the 32 random hex bytes guarantee no allowlist collision.\n */\nexport function generateRandomInvalidApiKey(): string {\n return `invalid-${randomBytes(32).toString('hex')}`;\n}\n\n/**\n * Generate a per-run bogus JWT-shaped Bearer token. Emits three segments with\n * valid base64url-encoded JSON header/payload and a random signature — so\n * well-implemented validators fail at signature verification (→ 401), and\n * strict parse-time validators that reject at the structural level also fail\n * cleanly (→ 400 per RFC 6750 §3.1). Either is conformant.\n */\nexport function generateRandomInvalidJwt(): string {\n const header = base64url(Buffer.from(JSON.stringify({ alg: 'RS256', typ: 'JWT' })));\n const payload = base64url(\n Buffer.from(JSON.stringify({ sub: `invalid-${randomBytes(8).toString('hex')}`, aud: 'invalid-probe' }))\n );\n const signature = base64url(randomBytes(32));\n return `${header}.${payload}.${signature}`;\n}\n\nfunction base64url(buf: Buffer): string {\n return buf.toString('base64').replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=+$/, '');\n}\n\n// ---------------------------------------------------------------------------\n// Raw-MCP probe (auth-override dispatch)\n// ---------------------------------------------------------------------------\n\nlet probeRequestId = 0;\nconst MCP_SESSION_ID_HEADER = 'mcp-session-id';\nconst MCP_PROTOCOL_VERSION_HEADER = 'mcp-protocol-version';\n\ntype JsonRpcEnvelope = {\n jsonrpc: '2.0';\n id?: number;\n method?: string;\n params?: Record<string, unknown>;\n result?: { structuredContent?: unknown; content?: unknown; isError?: boolean; protocolVersion?: string };\n error?: { message?: string; code?: number };\n};\n\ninterface RawJsonRpcPostResult {\n httpResult: HttpProbeResult;\n parsed?: JsonRpcEnvelope;\n parseError?: boolean;\n}\n\nasync function postRawMcpJsonRpc(options: {\n agentUrl: string;\n envelope: Record<string, unknown>;\n headers: Record<string, string>;\n allowPrivateIp: boolean;\n sessionId?: string;\n protocolVersion?: string;\n responseId?: number;\n parseBody?: boolean;\n allowEmptyBody?: boolean;\n fetchFn?: typeof fetch;\n}): Promise<RawJsonRpcPostResult> {\n const {\n agentUrl,\n envelope,\n headers,\n allowPrivateIp,\n sessionId,\n protocolVersion,\n responseId,\n parseBody = true,\n allowEmptyBody = false,\n } = options;\n const httpResult: HttpProbeResult = { url: agentUrl, status: 0, headers: {}, body: null };\n try {\n const res = await ssrfSafeFetch(agentUrl, {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n accept: 'application/json, text/event-stream',\n ...withoutMcpSessionHeaders(headers),\n ...(sessionId ? { [MCP_SESSION_ID_HEADER]: sessionId } : {}),\n ...(protocolVersion ? { [MCP_PROTOCOL_VERSION_HEADER]: protocolVersion } : {}),\n },\n body: JSON.stringify(envelope),\n allowPrivateIp,\n ...(options.fetchFn ? { trustedFetchFn: options.fetchFn } : {}),\n });\n httpResult.status = res.status;\n httpResult.headers = res.headers;\n\n const text = Buffer.from(res.body.buffer, res.body.byteOffset, res.body.byteLength).toString('utf8');\n if (!parseBody) {\n httpResult.body = text || null;\n return { httpResult };\n }\n if (allowEmptyBody && text.trim() === '') {\n httpResult.body = null;\n return { httpResult };\n }\n try {\n const parsed = parseMcpJsonRpcResponse(text, httpResult.headers['content-type'], responseId);\n httpResult.body = parsed;\n return { httpResult, parsed };\n } catch {\n httpResult.body = text;\n return { httpResult, parseError: true };\n }\n } catch (err) {\n httpResult.error = err instanceof Error ? err.message : String(err);\n return { httpResult };\n }\n}\n\nfunction withoutMcpSessionHeaders(headers: Record<string, string>): Record<string, string> {\n const cleaned: Record<string, string> = {};\n for (const [key, value] of Object.entries(headers)) {\n const normalized = key.toLowerCase();\n if (normalized === MCP_SESSION_ID_HEADER || normalized === MCP_PROTOCOL_VERSION_HEADER) continue;\n cleaned[key] = value;\n }\n return cleaned;\n}\n\nfunction parseMcpJsonRpcResponse(text: string, contentType: string | undefined, responseId?: number): JsonRpcEnvelope {\n if (contentType?.toLowerCase().includes('text/event-stream')) {\n // Streamable-HTTP MCP: the response is one or more SSE events whose\n // `data:` payloads are JSON-RPC envelopes. The spec lets a server emit\n // notifications before the final response, so choose the matching id.\n const dataLines = text.split(/\\r?\\n/).filter(l => l.startsWith('data:'));\n if (dataLines.length === 0) throw new Error('SSE response with no data event');\n let matched: JsonRpcEnvelope | undefined;\n let lastParsed: JsonRpcEnvelope | undefined;\n for (const line of dataLines) {\n const payload = line.slice('data:'.length).trim();\n if (!payload) continue;\n try {\n const envelope = JSON.parse(payload) as JsonRpcEnvelope;\n lastParsed = envelope;\n if (responseId !== undefined && envelope?.id === responseId) {\n matched = envelope;\n break;\n }\n } catch {\n // Skip non-JSON data lines (heartbeats, etc.); keep walking.\n }\n }\n const parsed = matched ?? lastParsed;\n if (parsed === undefined) throw new Error('SSE response had data events but none were parseable JSON');\n return parsed;\n }\n return JSON.parse(text) as JsonRpcEnvelope;\n}\n\nfunction taskResultFromRpc(httpResult: HttpProbeResult, rpc: JsonRpcEnvelope): TaskResult {\n if (httpResult.status >= 400) {\n return {\n success: false,\n data: undefined,\n error: rpc.error?.message ?? `HTTP ${httpResult.status}`,\n _extraction_path: 'error',\n };\n }\n if (rpc.error) {\n const code = rpc.error.code;\n return {\n success: false,\n data: undefined,\n error:\n code !== undefined\n ? `JSON-RPC error ${code}: ${rpc.error.message ?? 'no message'}`\n : (rpc.error.message ?? 'JSON-RPC error (no code)'),\n _extraction_path: 'error',\n };\n }\n const structured = rpc.result?.structuredContent;\n const hasStructured = structured !== undefined && structured !== null;\n const data = hasStructured ? structured : rpc.result?.content;\n const isError = !!rpc.result?.isError;\n const extractionPath: 'structured_content' | 'text_fallback' | 'error' | 'none' = isError\n ? 'error'\n : hasStructured\n ? 'structured_content'\n : data !== undefined && data !== null\n ? 'text_fallback'\n : 'none';\n return { success: !isError, data, _extraction_path: extractionPath };\n}\n\nfunction failedTaskResult(message: string): TaskResult {\n return {\n success: false,\n data: undefined,\n error: message,\n _extraction_path: 'error',\n };\n}\n\nfunction taskResultFromPostFailure(posted: RawJsonRpcPostResult): TaskResult {\n if (posted.parseError) {\n return failedTaskResult(\n `Non-JSON response body (content-type: ${posted.httpResult.headers['content-type'] ?? 'unknown'}).`\n );\n }\n if (posted.parsed) return taskResultFromRpc(posted.httpResult, posted.parsed);\n return failedTaskResult(posted.httpResult.error ?? `HTTP ${posted.httpResult.status}`);\n}\n\n/**\n * POST a JSON-RPC `tools/call` request to the MCP endpoint with caller-provided\n * headers. The probe first performs the Streamable HTTP initialize handshake,\n * including `notifications/initialized`, so auth probes hit the same session\n * boundary as normal MCP clients while still exposing raw HTTP status and\n * `WWW-Authenticate` headers for security storyboards.\n *\n * **Args are not secret** — must not contain credentials or PII. The server's\n * response body lands in `httpResult.body` and is written to compliance\n * reports. Outbound request body is not persisted.\n *\n * Returns an HttpProbeResult plus a synthetic TaskResult for steps that also\n * want to validate body shape — the structuredContent is unwrapped so\n * `field_present: \"context\"` resolves naturally.\n */\nexport async function rawMcpProbe(options: {\n agentUrl: string;\n toolName: string;\n args: Record<string, unknown>;\n headers?: Record<string, string>;\n /** Allow http:// and private-IP agent URLs (dev loops). Default false. */\n allowPrivateIp?: boolean;\n /** Scoped fetch implementation for every handshake and tool request. */\n fetchFn?: typeof fetch;\n}): Promise<{ httpResult: HttpProbeResult; taskResult?: TaskResult }> {\n const { agentUrl, toolName, args, headers = {}, allowPrivateIp = false, fetchFn } = options;\n const initializeId = ++probeRequestId;\n const initialize = await postRawMcpJsonRpc({\n agentUrl,\n envelope: {\n jsonrpc: '2.0',\n id: initializeId,\n method: 'initialize',\n params: {\n protocolVersion: LATEST_PROTOCOL_VERSION,\n capabilities: {},\n clientInfo: { name: 'AdCP Storyboard Raw MCP Probe', version: '1.0.0' },\n },\n },\n headers,\n allowPrivateIp,\n fetchFn,\n responseId: initializeId,\n });\n if (\n initialize.httpResult.error ||\n initialize.httpResult.status >= 400 ||\n !initialize.parsed ||\n initialize.parsed.error\n ) {\n return {\n httpResult: initialize.httpResult,\n taskResult: taskResultFromPostFailure(initialize),\n };\n }\n const negotiatedProtocolVersion = initialize.parsed.result?.protocolVersion;\n if (\n typeof negotiatedProtocolVersion !== 'string' ||\n !SUPPORTED_PROTOCOL_VERSIONS.includes(negotiatedProtocolVersion)\n ) {\n return {\n httpResult: initialize.httpResult,\n taskResult: failedTaskResult(\n negotiatedProtocolVersion\n ? `Server's protocol version is not supported: ${negotiatedProtocolVersion}`\n : 'Server sent invalid initialize result: missing protocolVersion'\n ),\n };\n }\n\n const sessionId = initialize.httpResult.headers[MCP_SESSION_ID_HEADER];\n const initialized = await postRawMcpJsonRpc({\n agentUrl,\n envelope: {\n jsonrpc: '2.0',\n method: 'notifications/initialized',\n params: {},\n },\n headers,\n allowPrivateIp,\n fetchFn,\n ...(sessionId && { sessionId }),\n protocolVersion: negotiatedProtocolVersion,\n allowEmptyBody: true,\n });\n if (\n initialized.httpResult.error ||\n initialized.httpResult.status >= 400 ||\n initialized.parseError ||\n initialized.parsed?.error\n ) {\n return {\n httpResult: initialized.httpResult,\n taskResult: taskResultFromPostFailure(initialized),\n };\n }\n\n const requestId = ++probeRequestId;\n const toolEnvelope = {\n jsonrpc: '2.0',\n id: requestId,\n method: 'tools/call',\n params: { name: toolName, arguments: args },\n };\n const posted = await postRawMcpJsonRpc({\n agentUrl,\n envelope: toolEnvelope,\n headers,\n allowPrivateIp,\n fetchFn,\n ...(sessionId && { sessionId }),\n protocolVersion: negotiatedProtocolVersion,\n responseId: requestId,\n });\n const { httpResult, parsed } = posted;\n if (httpResult.error) return { httpResult, taskResult: taskResultFromPostFailure(posted) };\n if (!parsed) {\n return {\n httpResult,\n taskResult: taskResultFromPostFailure(posted),\n };\n }\n return { httpResult, taskResult: taskResultFromRpc(httpResult, parsed) };\n}\n\n// ---------------------------------------------------------------------------\n// Raw-A2A probe (transport-layer diagnostics for A2A agents)\n// ---------------------------------------------------------------------------\n\n/**\n * POST a JSON-RPC 2.0 request to an A2A agent endpoint with caller-provided\n * headers. Bypasses the A2A SDK so raw HTTP status, headers, and JSON-RPC\n * error codes can be captured by storyboard diagnostics.\n *\n * Mirrors `rawMcpProbe` in structure and SSRF-safety contract. Key\n * differences from the MCP variant:\n *\n * - The caller supplies `method` + optional `params` (not a fixed `tools/call`\n * body). A2A has no single canonical method — use `\"message/send\"` for most\n * auth and error-code probes, `\"tasks/get\"` / `\"tasks/cancel\"` for lifecycle\n * checks. **Note:** `message/send` requires `params.message` (a full A2A\n * `Message` object with `messageId`, `role`, `kind`, `parts`). Passing\n * `params: {}` will produce `-32602 Invalid params` from a conformant server,\n * masking auth rejections — supply a minimal message when probing auth paths.\n * - A2A JSON-RPC error codes differ from MCP's. Notably `-32002` means\n * `TaskNotCancelable` in A2A (not session-not-initialized). The probe\n * surfaces raw numeric codes without protocol-specific aliasing so\n * storyboards can assert on the exact code.\n * - SSE (streaming) responses are handled the same way as `rawMcpProbe`:\n * `Accept: application/json` is sent; non-JSON bodies surface a distinct\n * error so callers don't mistake an event-stream for a silent success.\n *\n * **Args are not secret** — must not contain credentials or PII. The\n * server's response body lands in `httpResult.body` and is written to\n * compliance reports.\n *\n * Returns an `HttpProbeResult` plus an optional `TaskResult` (same shape as\n * `rawMcpProbe`) so the storyboard `ValidationContext` can consume both probes\n * interchangeably. The A2A success `_extraction_path` is `'text_fallback'`\n * (not `'structured_content'`) because A2A's `result` field is a plain object,\n * not an MCP structured-content envelope.\n */\nexport async function rawA2aProbe(options: {\n /** Base URL of the A2A agent endpoint (e.g. `https://agent.example.com/a2a`). */\n agentUrl: string;\n /** A2A/JSON-RPC 2.0 method name (e.g. `\"message/send\"`, `\"tasks/get\"`). */\n method: string;\n /** JSON-RPC params. Defaults to `{}` so the probe always emits a valid envelope. */\n params?: Record<string, unknown>;\n headers?: Record<string, string>;\n /** Allow http:// and private-IP agent URLs (dev loops). Default false. */\n allowPrivateIp?: boolean;\n}): Promise<{ httpResult: HttpProbeResult; taskResult?: TaskResult }> {\n const { agentUrl, method, params, headers = {}, allowPrivateIp = false } = options;\n const body = JSON.stringify({\n jsonrpc: '2.0',\n id: ++probeRequestId,\n method,\n params: params ?? {},\n });\n\n const httpResult: HttpProbeResult = { url: agentUrl, status: 0, headers: {}, body: null };\n try {\n const res = await ssrfSafeFetch(agentUrl, {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n accept: 'application/json',\n ...headers,\n },\n body,\n allowPrivateIp,\n });\n httpResult.status = res.status;\n httpResult.headers = res.headers;\n\n const text = Buffer.from(res.body.buffer, res.body.byteOffset, res.body.byteLength).toString('utf8');\n let parsed: unknown;\n try {\n parsed = JSON.parse(text);\n } catch {\n httpResult.body = text;\n return {\n httpResult,\n taskResult: {\n success: false,\n data: undefined,\n error: `Non-JSON response body (content-type: ${httpResult.headers['content-type'] ?? 'unknown'}).`,\n _extraction_path: 'error',\n },\n };\n }\n httpResult.body = parsed;\n\n const rpc = parsed as {\n result?: unknown;\n error?: { message?: string; code?: number };\n };\n\n if (httpResult.status >= 400) {\n return {\n httpResult,\n taskResult: {\n success: false,\n data: undefined,\n error: rpc.error?.message ?? `HTTP ${httpResult.status}`,\n _extraction_path: 'error',\n },\n };\n }\n\n if (rpc.error) {\n const code = rpc.error.code;\n return {\n httpResult,\n taskResult: {\n success: false,\n data: undefined,\n error:\n code !== undefined\n ? `JSON-RPC error ${code}: ${rpc.error.message ?? 'no message'}`\n : (rpc.error.message ?? 'JSON-RPC error (no code)'),\n _extraction_path: 'error',\n },\n };\n }\n\n const data = rpc.result;\n const extractionPath: 'text_fallback' | 'none' = data !== undefined && data !== null ? 'text_fallback' : 'none';\n return { httpResult, taskResult: { success: true, data, _extraction_path: extractionPath } };\n } catch (err) {\n httpResult.error = err instanceof Error ? err.message : String(err);\n return { httpResult };\n }\n}\n\n// IP classifiers live in `src/lib/net/address-guards.ts` so the SSRF-safe\n// fetch primitive can use them without depending on the testing module.\n// Re-exported here for existing import sites (storyboard-security test + any\n// external probe consumers).\nexport const isAlwaysBlocked = sharedIsAlwaysBlocked;\nexport const isPrivateIp = sharedIsPrivateIp;\nexport { SsrfRefusedError };\n"],"mappings":"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","names":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../../../src/lib/testing/storyboard/runner.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../../../src/lib/testing/storyboard/runner.ts"],"names":[],"mappings":"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"}
@@ -2348,7 +2348,8 @@ async function executeStep(client, step, storyboardId, phaseId, context, allStep
2348
2348
  toolName: effectiveStep.task,
2349
2349
  args: request,
2350
2350
  headers: rawProbeHeaders,
2351
- allowPrivateIp: options.allow_http === true
2351
+ allowPrivateIp: options.allow_http === true,
2352
+ fetchFn: options.transport?.fetchFn
2352
2353
  });
2353
2354
  httpResult = probe.httpResult;
2354
2355
  taskResult = probe.taskResult;
@@ -2776,7 +2777,10 @@ async function executeStep(client, step, storyboardId, phaseId, context, allStep
2776
2777
  async function executeProbeStep(client, step, phaseId, context, allSteps, options, runState) {
2777
2778
  const start = Date.now();
2778
2779
  let httpResult;
2779
- const probeOpts = { allowPrivateIp: options.allow_http === true };
2780
+ const probeOpts = {
2781
+ allowPrivateIp: options.allow_http === true,
2782
+ fetchFn: options.transport?.fetchFn
2783
+ };
2780
2784
  let requestRecordOverride;
2781
2785
  if (step.requires_contract) {
2782
2786
  const contracts = new Set(options.contracts ?? []);