@adcp/sdk 13.0.4 → 13.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 (235) hide show
  1. package/bin/adcp-grade.js +4 -3
  2. package/bin/adcp.js +18 -0
  3. package/dist/lib/conformance/invariants/uniformError.d.ts.map +1 -1
  4. package/dist/lib/conformance/invariants/uniformError.js +21 -0
  5. package/dist/lib/conformance/invariants/uniformError.js.map +1 -1
  6. package/dist/lib/conformance/invariants/uniformError.mjs +22 -1
  7. package/dist/lib/conformance/invariants/uniformError.mjs.map +1 -1
  8. package/dist/lib/core/AgentClient.d.mts +1 -1
  9. package/dist/lib/core/AgentClient.d.ts +1 -1
  10. package/dist/lib/core/AgentClient.d.ts.map +1 -1
  11. package/dist/lib/core/AgentClient.js +1 -1
  12. package/dist/lib/core/AgentClient.js.map +1 -1
  13. package/dist/lib/core/AgentClient.mjs +1 -1
  14. package/dist/lib/core/AgentClient.mjs.map +1 -1
  15. package/dist/lib/core/SingleAgentClient.d.mts +1 -1
  16. package/dist/lib/core/SingleAgentClient.d.ts +1 -1
  17. package/dist/lib/core/SingleAgentClient.d.ts.map +1 -1
  18. package/dist/lib/core/SingleAgentClient.js +88 -48
  19. package/dist/lib/core/SingleAgentClient.js.map +1 -1
  20. package/dist/lib/core/SingleAgentClient.mjs +88 -48
  21. package/dist/lib/core/SingleAgentClient.mjs.map +1 -1
  22. package/dist/lib/core/TaskExecutor.d.ts.map +1 -1
  23. package/dist/lib/core/TaskExecutor.js +8 -4
  24. package/dist/lib/core/TaskExecutor.js.map +1 -1
  25. package/dist/lib/core/TaskExecutor.mjs +8 -4
  26. package/dist/lib/core/TaskExecutor.mjs.map +1 -1
  27. package/dist/lib/index.d.mts +1 -1
  28. package/dist/lib/index.d.ts +1 -1
  29. package/dist/lib/index.d.ts.map +1 -1
  30. package/dist/lib/index.js.map +1 -1
  31. package/dist/lib/index.mjs.map +1 -1
  32. package/dist/lib/net/agent-transport-fetch.d.mts +15 -0
  33. package/dist/lib/net/agent-transport-fetch.d.ts +15 -0
  34. package/dist/lib/net/agent-transport-fetch.d.ts.map +1 -1
  35. package/dist/lib/net/agent-transport-fetch.js +37 -2
  36. package/dist/lib/net/agent-transport-fetch.js.map +1 -1
  37. package/dist/lib/net/agent-transport-fetch.mjs +37 -2
  38. package/dist/lib/net/agent-transport-fetch.mjs.map +1 -1
  39. package/dist/lib/net/credential-headers.d.mts +1 -0
  40. package/dist/lib/net/credential-headers.d.ts +2 -0
  41. package/dist/lib/net/credential-headers.d.ts.map +1 -0
  42. package/dist/lib/net/credential-headers.js +34 -0
  43. package/dist/lib/net/credential-headers.js.map +1 -0
  44. package/dist/lib/net/credential-headers.mjs +10 -0
  45. package/dist/lib/net/credential-headers.mjs.map +1 -0
  46. package/dist/lib/protocols/a2a-native-v1.d.mts +18 -0
  47. package/dist/lib/protocols/a2a-native-v1.d.ts +19 -0
  48. package/dist/lib/protocols/a2a-native-v1.d.ts.map +1 -0
  49. package/dist/lib/protocols/a2a-native-v1.js +183 -0
  50. package/dist/lib/protocols/a2a-native-v1.js.map +1 -0
  51. package/dist/lib/protocols/a2a-native-v1.mjs +167 -0
  52. package/dist/lib/protocols/a2a-native-v1.mjs.map +1 -0
  53. package/dist/lib/protocols/a2a-push-notification.d.mts +13 -0
  54. package/dist/lib/protocols/a2a-push-notification.d.ts +14 -0
  55. package/dist/lib/protocols/a2a-push-notification.d.ts.map +1 -0
  56. package/dist/lib/protocols/a2a-push-notification.js +42 -0
  57. package/dist/lib/protocols/a2a-push-notification.js.map +1 -0
  58. package/dist/lib/protocols/a2a-push-notification.mjs +23 -0
  59. package/dist/lib/protocols/a2a-push-notification.mjs.map +1 -0
  60. package/dist/lib/protocols/a2a.d.mts +15 -5
  61. package/dist/lib/protocols/a2a.d.ts +15 -5
  62. package/dist/lib/protocols/a2a.d.ts.map +1 -1
  63. package/dist/lib/protocols/a2a.js +102 -13
  64. package/dist/lib/protocols/a2a.js.map +1 -1
  65. package/dist/lib/protocols/a2a.mjs +90 -12
  66. package/dist/lib/protocols/a2a.mjs.map +1 -1
  67. package/dist/lib/protocols/index.d.mts +3 -0
  68. package/dist/lib/protocols/index.d.ts +3 -0
  69. package/dist/lib/protocols/index.d.ts.map +1 -1
  70. package/dist/lib/protocols/index.js +18 -6
  71. package/dist/lib/protocols/index.js.map +1 -1
  72. package/dist/lib/protocols/index.mjs +18 -6
  73. package/dist/lib/protocols/index.mjs.map +1 -1
  74. package/dist/lib/protocols/mcp-modern.d.ts.map +1 -1
  75. package/dist/lib/protocols/mcp-modern.js +3 -1
  76. package/dist/lib/protocols/mcp-modern.js.map +1 -1
  77. package/dist/lib/protocols/mcp-modern.mjs +3 -1
  78. package/dist/lib/protocols/mcp-modern.mjs.map +1 -1
  79. package/dist/lib/protocols/mcp-tasks.d.ts.map +1 -1
  80. package/dist/lib/protocols/mcp-tasks.js +2 -1
  81. package/dist/lib/protocols/mcp-tasks.js.map +1 -1
  82. package/dist/lib/protocols/mcp-tasks.mjs +2 -1
  83. package/dist/lib/protocols/mcp-tasks.mjs.map +1 -1
  84. package/dist/lib/protocols/mcp.d.mts +8 -5
  85. package/dist/lib/protocols/mcp.d.ts +8 -5
  86. package/dist/lib/protocols/mcp.d.ts.map +1 -1
  87. package/dist/lib/protocols/mcp.js +12 -4
  88. package/dist/lib/protocols/mcp.js.map +1 -1
  89. package/dist/lib/protocols/mcp.mjs +12 -4
  90. package/dist/lib/protocols/mcp.mjs.map +1 -1
  91. package/dist/lib/protocols/rawResponseCapture.d.mts +9 -1
  92. package/dist/lib/protocols/rawResponseCapture.d.ts +9 -1
  93. package/dist/lib/protocols/rawResponseCapture.d.ts.map +1 -1
  94. package/dist/lib/protocols/rawResponseCapture.js +153 -10
  95. package/dist/lib/protocols/rawResponseCapture.js.map +1 -1
  96. package/dist/lib/protocols/rawResponseCapture.mjs +153 -10
  97. package/dist/lib/protocols/rawResponseCapture.mjs.map +1 -1
  98. package/dist/lib/schemas-data/v2.5/_provenance.json +1 -1
  99. package/dist/lib/signing/agent-fetch.d.mts +3 -1
  100. package/dist/lib/signing/agent-fetch.d.ts +3 -1
  101. package/dist/lib/signing/agent-fetch.d.ts.map +1 -1
  102. package/dist/lib/signing/agent-fetch.js +4 -2
  103. package/dist/lib/signing/agent-fetch.js.map +1 -1
  104. package/dist/lib/signing/agent-fetch.mjs +4 -2
  105. package/dist/lib/signing/agent-fetch.mjs.map +1 -1
  106. package/dist/lib/signing/protocol-methods.d.mts +24 -0
  107. package/dist/lib/signing/protocol-methods.d.ts +25 -0
  108. package/dist/lib/signing/protocol-methods.d.ts.map +1 -0
  109. package/dist/lib/signing/protocol-methods.js +51 -0
  110. package/dist/lib/signing/protocol-methods.js.map +1 -0
  111. package/dist/lib/signing/protocol-methods.mjs +25 -0
  112. package/dist/lib/signing/protocol-methods.mjs.map +1 -0
  113. package/dist/lib/signing/types.d.mts +2 -0
  114. package/dist/lib/signing/types.d.ts +2 -0
  115. package/dist/lib/signing/types.d.ts.map +1 -1
  116. package/dist/lib/signing/types.js.map +1 -1
  117. package/dist/lib/signing/types.mjs.map +1 -1
  118. package/dist/lib/signing/verifier.d.ts.map +1 -1
  119. package/dist/lib/signing/verifier.js +6 -2
  120. package/dist/lib/signing/verifier.js.map +1 -1
  121. package/dist/lib/signing/verifier.mjs +6 -2
  122. package/dist/lib/signing/verifier.mjs.map +1 -1
  123. package/dist/lib/testing/client.d.ts.map +1 -1
  124. package/dist/lib/testing/client.js +4 -1
  125. package/dist/lib/testing/client.js.map +1 -1
  126. package/dist/lib/testing/client.mjs +4 -1
  127. package/dist/lib/testing/client.mjs.map +1 -1
  128. package/dist/lib/testing/compliance/comply.d.ts.map +1 -1
  129. package/dist/lib/testing/compliance/comply.js +3 -0
  130. package/dist/lib/testing/compliance/comply.js.map +1 -1
  131. package/dist/lib/testing/compliance/comply.mjs +3 -0
  132. package/dist/lib/testing/compliance/comply.mjs.map +1 -1
  133. package/dist/lib/testing/storyboard/agent-routing.d.mts +3 -1
  134. package/dist/lib/testing/storyboard/agent-routing.d.ts +3 -1
  135. package/dist/lib/testing/storyboard/agent-routing.d.ts.map +1 -1
  136. package/dist/lib/testing/storyboard/agent-routing.js +5 -2
  137. package/dist/lib/testing/storyboard/agent-routing.js.map +1 -1
  138. package/dist/lib/testing/storyboard/agent-routing.mjs +4 -2
  139. package/dist/lib/testing/storyboard/agent-routing.mjs.map +1 -1
  140. package/dist/lib/testing/storyboard/compliance.d.mts +1 -1
  141. package/dist/lib/testing/storyboard/compliance.d.ts +1 -1
  142. package/dist/lib/testing/storyboard/compliance.d.ts.map +1 -1
  143. package/dist/lib/testing/storyboard/compliance.js +4 -1
  144. package/dist/lib/testing/storyboard/compliance.js.map +1 -1
  145. package/dist/lib/testing/storyboard/compliance.mjs +4 -1
  146. package/dist/lib/testing/storyboard/compliance.mjs.map +1 -1
  147. package/dist/lib/testing/storyboard/native-a2a-compliance.d.mts +7 -0
  148. package/dist/lib/testing/storyboard/native-a2a-compliance.d.ts +8 -0
  149. package/dist/lib/testing/storyboard/native-a2a-compliance.d.ts.map +1 -0
  150. package/dist/lib/testing/storyboard/native-a2a-compliance.js +45 -0
  151. package/dist/lib/testing/storyboard/native-a2a-compliance.js.map +1 -0
  152. package/dist/lib/testing/storyboard/native-a2a-compliance.mjs +21 -0
  153. package/dist/lib/testing/storyboard/native-a2a-compliance.mjs.map +1 -0
  154. package/dist/lib/testing/storyboard/probes.d.mts +2 -0
  155. package/dist/lib/testing/storyboard/probes.d.ts +2 -0
  156. package/dist/lib/testing/storyboard/probes.d.ts.map +1 -1
  157. package/dist/lib/testing/storyboard/probes.js +3 -2
  158. package/dist/lib/testing/storyboard/probes.js.map +1 -1
  159. package/dist/lib/testing/storyboard/probes.mjs +3 -2
  160. package/dist/lib/testing/storyboard/probes.mjs.map +1 -1
  161. package/dist/lib/testing/storyboard/request-signing/a2a-dispatch.d.mts +31 -0
  162. package/dist/lib/testing/storyboard/request-signing/a2a-dispatch.d.ts +32 -0
  163. package/dist/lib/testing/storyboard/request-signing/a2a-dispatch.d.ts.map +1 -0
  164. package/dist/lib/testing/storyboard/request-signing/a2a-dispatch.js +279 -0
  165. package/dist/lib/testing/storyboard/request-signing/a2a-dispatch.js.map +1 -0
  166. package/dist/lib/testing/storyboard/request-signing/a2a-dispatch.mjs +244 -0
  167. package/dist/lib/testing/storyboard/request-signing/a2a-dispatch.mjs.map +1 -0
  168. package/dist/lib/testing/storyboard/request-signing/builder.d.mts +4 -1
  169. package/dist/lib/testing/storyboard/request-signing/builder.d.ts +4 -1
  170. package/dist/lib/testing/storyboard/request-signing/builder.d.ts.map +1 -1
  171. package/dist/lib/testing/storyboard/request-signing/builder.js +19 -0
  172. package/dist/lib/testing/storyboard/request-signing/builder.js.map +1 -1
  173. package/dist/lib/testing/storyboard/request-signing/builder.mjs +19 -0
  174. package/dist/lib/testing/storyboard/request-signing/builder.mjs.map +1 -1
  175. package/dist/lib/testing/storyboard/request-signing/grader.d.mts +5 -6
  176. package/dist/lib/testing/storyboard/request-signing/grader.d.ts +5 -6
  177. package/dist/lib/testing/storyboard/request-signing/grader.d.ts.map +1 -1
  178. package/dist/lib/testing/storyboard/request-signing/grader.js +82 -13
  179. package/dist/lib/testing/storyboard/request-signing/grader.js.map +1 -1
  180. package/dist/lib/testing/storyboard/request-signing/grader.mjs +86 -13
  181. package/dist/lib/testing/storyboard/request-signing/grader.mjs.map +1 -1
  182. package/dist/lib/testing/storyboard/request-signing/index.d.mts +1 -0
  183. package/dist/lib/testing/storyboard/request-signing/index.d.ts +1 -0
  184. package/dist/lib/testing/storyboard/request-signing/index.d.ts.map +1 -1
  185. package/dist/lib/testing/storyboard/request-signing/index.js +7 -0
  186. package/dist/lib/testing/storyboard/request-signing/index.js.map +1 -1
  187. package/dist/lib/testing/storyboard/request-signing/index.mjs +8 -0
  188. package/dist/lib/testing/storyboard/request-signing/index.mjs.map +1 -1
  189. package/dist/lib/testing/storyboard/request-signing/probe-dispatch.d.mts +2 -2
  190. package/dist/lib/testing/storyboard/request-signing/probe-dispatch.d.ts +2 -2
  191. package/dist/lib/testing/storyboard/request-signing/probe-dispatch.d.ts.map +1 -1
  192. package/dist/lib/testing/storyboard/request-signing/probe-dispatch.js +6 -5
  193. package/dist/lib/testing/storyboard/request-signing/probe-dispatch.js.map +1 -1
  194. package/dist/lib/testing/storyboard/request-signing/probe-dispatch.mjs +6 -5
  195. package/dist/lib/testing/storyboard/request-signing/probe-dispatch.mjs.map +1 -1
  196. package/dist/lib/testing/storyboard/request-signing/types.d.mts +1 -0
  197. package/dist/lib/testing/storyboard/request-signing/types.d.ts +1 -0
  198. package/dist/lib/testing/storyboard/request-signing/types.d.ts.map +1 -1
  199. package/dist/lib/testing/storyboard/request-signing/types.js.map +1 -1
  200. package/dist/lib/testing/storyboard/request-signing/types.mjs.map +1 -1
  201. package/dist/lib/testing/storyboard/request-signing/vector-loader.d.ts.map +1 -1
  202. package/dist/lib/testing/storyboard/request-signing/vector-loader.js +1 -0
  203. package/dist/lib/testing/storyboard/request-signing/vector-loader.js.map +1 -1
  204. package/dist/lib/testing/storyboard/request-signing/vector-loader.mjs +1 -0
  205. package/dist/lib/testing/storyboard/request-signing/vector-loader.mjs.map +1 -1
  206. package/dist/lib/testing/storyboard/runner.d.mts +28 -1
  207. package/dist/lib/testing/storyboard/runner.d.ts +28 -1
  208. package/dist/lib/testing/storyboard/runner.d.ts.map +1 -1
  209. package/dist/lib/testing/storyboard/runner.js +251 -55
  210. package/dist/lib/testing/storyboard/runner.js.map +1 -1
  211. package/dist/lib/testing/storyboard/runner.mjs +255 -60
  212. package/dist/lib/testing/storyboard/runner.mjs.map +1 -1
  213. package/dist/lib/testing/storyboard/types.d.mts +4 -2
  214. package/dist/lib/testing/storyboard/types.d.ts +4 -2
  215. package/dist/lib/testing/storyboard/types.d.ts.map +1 -1
  216. package/dist/lib/testing/storyboard/types.js +1 -0
  217. package/dist/lib/testing/storyboard/types.js.map +1 -1
  218. package/dist/lib/testing/storyboard/types.mjs +1 -0
  219. package/dist/lib/testing/storyboard/types.mjs.map +1 -1
  220. package/dist/lib/testing/storyboard/validations.d.mts +1 -1
  221. package/dist/lib/testing/storyboard/validations.d.ts +1 -1
  222. package/dist/lib/testing/storyboard/validations.d.ts.map +1 -1
  223. package/dist/lib/testing/storyboard/validations.js +97 -22
  224. package/dist/lib/testing/storyboard/validations.js.map +1 -1
  225. package/dist/lib/testing/storyboard/validations.mjs +98 -22
  226. package/dist/lib/testing/storyboard/validations.mjs.map +1 -1
  227. package/dist/lib/version.d.mts +3 -3
  228. package/dist/lib/version.d.ts +3 -3
  229. package/dist/lib/version.js +3 -3
  230. package/dist/lib/version.js.map +1 -1
  231. package/dist/lib/version.mjs +3 -3
  232. package/dist/lib/version.mjs.map +1 -1
  233. package/docs/guides/BUILD-AN-AGENT.md +1 -1
  234. package/docs/llms.txt +5 -3
  235. package/package.json +2 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/lib/testing/storyboard/request-signing/index.ts"],"sourcesContent":["/**\n * RFC 9421 request-signing conformance grader.\n *\n * Tests any agent advertising `request_signing.supported: true` against the\n * 28 conformance vectors shipped under\n * `compliance/cache/{version}/test-vectors/request-signing/`. Grading is\n * black-box and observable-behavior only — we construct signed HTTP requests\n * (dynamically, using the test keypairs in keys.json) and compare the\n * agent's responses to each vector's `expected_outcome`.\n *\n * @example\n * ```ts\n * import { gradeRequestSigning } from '@adcp/sdk/testing/storyboard/request-signing';\n *\n * const report = await gradeRequestSigning('https://sandbox.seller.com/adcp', {\n * skipRateAbuse: true, // skip the 101-request flood in routine runs\n * });\n * if (!report.passed) {\n * for (const r of [...report.positive, ...report.negative]) {\n * if (!r.passed && !r.skipped) console.log(`${r.vector_id}: ${r.diagnostic}`);\n * }\n * }\n * ```\n *\n * For storyboard-runner integration (synthesized per-vector steps dispatched\n * through `runStoryboard` / `runStoryboardStep`), see\n * `StoryboardRunOptions.request_signing` on the runner options.\n */\n\n// ── Public API ────────────────────────────────────────────────────\n// These are what 95% of consumers need. Start here.\n\nexport {\n gradeRequestSigning,\n gradeOneVector,\n type GradeOptions,\n type GradeReport,\n type VectorGradeResult,\n} from './grader';\n\n// ── Storyboard-runner hooks ───────────────────────────────────────\n// Surfaces used internally by the runner; exported so external runners and\n// custom harnesses can wire them the same way.\n\nexport {\n synthesizeRequestSigningSteps,\n parseRequestSigningStepId,\n REQUEST_SIGNING_PROBE_TASK,\n POSITIVE_STEP_PREFIX,\n NEGATIVE_STEP_PREFIX,\n type SynthesizeOptions,\n} from './synthesize';\n\nexport { probeRequestSigningVector } from './probe-dispatch';\n\n// ── Advanced: custom harness building blocks ──────────────────────\n// Escape hatches for constructing custom graders (alternate probe transports,\n// pre-flight staging, etc.). Most consumers should not need these.\n\nexport type {\n NegativeVector,\n PositiveVector,\n TestKeypair,\n TestKeyset,\n VectorRequest,\n VerifierCapabilityFixture,\n Vector,\n ContractId,\n} from './types';\n\nexport { CONTRACT_IDS } from './types';\n\nexport { loadRequestSigningVectors, findKey, type LoadVectorsOptions, type LoadedVectors } from './vector-loader';\n\nexport {\n buildPositiveRequest,\n buildNegativeRequest,\n listSupportedNegativeVectors,\n type BuildOptions,\n type SignedHttpRequest,\n} from './builder';\n\nexport {\n loadSignedRequestsRunnerContract,\n type LoadTestKitOptions,\n type RateAbuseContract,\n type ReplayWindowContract,\n type RevocationContract,\n type RunnerSigningKey,\n type SignedRequestsRunnerContract,\n} from './test-kit';\n\nexport {\n probeSignedRequest,\n initializeMcpSession,\n attachMcpSessionHeader,\n extractSignatureErrorCode,\n type ProbeOptions,\n type ProbeResult,\n} from './probe';\n"],"mappings":"AAgCA;AAAA,EACE;AAAA,EACA;AAAA,OAIK;AAMP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAEK;AAEP,SAAS,iCAAiC;AAiB1C,SAAS,oBAAoB;AAE7B,SAAS,2BAA2B,eAA4D;AAEhG;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OAGK;AAEP;AAAA,EACE;AAAA,OAOK;AAEP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAGK;","names":[]}
1
+ {"version":3,"sources":["../../../../../src/lib/testing/storyboard/request-signing/index.ts"],"sourcesContent":["/**\n * RFC 9421 request-signing conformance grader.\n *\n * Tests any agent advertising `request_signing.supported: true` against the\n * 28 conformance vectors shipped under\n * `compliance/cache/{version}/test-vectors/request-signing/`. Grading is\n * black-box and observable-behavior only — we construct signed HTTP requests\n * (dynamically, using the test keypairs in keys.json) and compare the\n * agent's responses to each vector's `expected_outcome`.\n *\n * @example\n * ```ts\n * import { gradeRequestSigning } from '@adcp/sdk/testing/storyboard/request-signing';\n *\n * const report = await gradeRequestSigning('https://sandbox.seller.com/adcp', {\n * skipRateAbuse: true, // skip the 101-request flood in routine runs\n * });\n * if (!report.passed) {\n * for (const r of [...report.positive, ...report.negative]) {\n * if (!r.passed && !r.skipped) console.log(`${r.vector_id}: ${r.diagnostic}`);\n * }\n * }\n * ```\n *\n * For storyboard-runner integration (synthesized per-vector steps dispatched\n * through `runStoryboard` / `runStoryboardStep`), see\n * `StoryboardRunOptions.request_signing` on the runner options.\n */\n\n// ── Public API ────────────────────────────────────────────────────\n// These are what 95% of consumers need. Start here.\n\nexport {\n gradeRequestSigning,\n gradeOneVector,\n type GradeOptions,\n type GradeReport,\n type VectorGradeResult,\n} from './grader';\n\n// ── Storyboard-runner hooks ───────────────────────────────────────\n// Surfaces used internally by the runner; exported so external runners and\n// custom harnesses can wire them the same way.\n\nexport {\n synthesizeRequestSigningSteps,\n parseRequestSigningStepId,\n REQUEST_SIGNING_PROBE_TASK,\n POSITIVE_STEP_PREFIX,\n NEGATIVE_STEP_PREFIX,\n type SynthesizeOptions,\n} from './synthesize';\n\nexport { probeRequestSigningVector } from './probe-dispatch';\n\n// ── Advanced: custom harness building blocks ──────────────────────\n// Escape hatches for constructing custom graders (alternate probe transports,\n// pre-flight staging, etc.). Most consumers should not need these.\n\nexport type {\n NegativeVector,\n PositiveVector,\n TestKeypair,\n TestKeyset,\n VectorRequest,\n VerifierCapabilityFixture,\n Vector,\n ContractId,\n} from './types';\n\nexport { CONTRACT_IDS } from './types';\n\nexport { loadRequestSigningVectors, findKey, type LoadVectorsOptions, type LoadedVectors } from './vector-loader';\n\nexport {\n buildPositiveRequest,\n buildNegativeRequest,\n listSupportedNegativeVectors,\n type BuildOptions,\n type SignedHttpRequest,\n} from './builder';\n\nexport {\n captureA2aRequest,\n resolveA2aDispatchTarget,\n operationFromVectorUrl,\n type A2aCall,\n type A2aDispatchOptions,\n type CapturedA2aRequest,\n} from './a2a-dispatch';\n\nexport {\n loadSignedRequestsRunnerContract,\n type LoadTestKitOptions,\n type RateAbuseContract,\n type ReplayWindowContract,\n type RevocationContract,\n type RunnerSigningKey,\n type SignedRequestsRunnerContract,\n} from './test-kit';\n\nexport {\n probeSignedRequest,\n initializeMcpSession,\n attachMcpSessionHeader,\n extractSignatureErrorCode,\n type ProbeOptions,\n type ProbeResult,\n} from './probe';\n"],"mappings":"AAgCA;AAAA,EACE;AAAA,EACA;AAAA,OAIK;AAMP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAEK;AAEP,SAAS,iCAAiC;AAiB1C,SAAS,oBAAoB;AAE7B,SAAS,2BAA2B,eAA4D;AAEhG;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OAGK;AAEP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OAIK;AAEP;AAAA,EACE;AAAA,OAOK;AAEP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAGK;","names":[]}
@@ -10,8 +10,8 @@ import type { HttpProbeResult, StoryboardRunOptions } from '../types.mjs';
10
10
  * `request_signing.transport: 'raw'`.
11
11
  */
12
12
  export declare function resolveVectorTransport(rsOpts: {
13
- transport?: 'raw' | 'mcp';
14
- }): 'raw' | 'mcp';
13
+ transport?: 'raw' | 'mcp' | 'a2a';
14
+ }, protocol?: 'mcp' | 'a2a'): 'raw' | 'mcp' | 'a2a';
15
15
  /**
16
16
  * Dispatch a synthesized request-signing step. The step ID encodes the vector
17
17
  * (`positive-<id>` / `negative-<id>`); this helper decodes it, runs the
@@ -10,8 +10,8 @@ import type { HttpProbeResult, StoryboardRunOptions } from '../types';
10
10
  * `request_signing.transport: 'raw'`.
11
11
  */
12
12
  export declare function resolveVectorTransport(rsOpts: {
13
- transport?: 'raw' | 'mcp';
14
- }): 'raw' | 'mcp';
13
+ transport?: 'raw' | 'mcp' | 'a2a';
14
+ }, protocol?: 'mcp' | 'a2a'): 'raw' | 'mcp' | 'a2a';
15
15
  /**
16
16
  * Dispatch a synthesized request-signing step. The step ID encodes the vector
17
17
  * (`positive-<id>` / `negative-<id>`); this helper decodes it, runs the
@@ -1 +1 @@
1
- {"version":3,"file":"probe-dispatch.d.ts","sourceRoot":"","sources":["../../../../../src/lib/testing/storyboard/request-signing/probe-dispatch.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAA4B,oBAAoB,EAAE,MAAM,UAAU,CAAC;AAKhG;;;;;;;;;GASG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE;IAAE,SAAS,CAAC,EAAE,KAAK,GAAG,KAAK,CAAA;CAAE,GAAG,KAAK,GAAG,KAAK,CAE3F;AAED;;;;;;GAMG;AACH,wBAAsB,yBAAyB,CAC7C,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,oBAAoB,GAC5B,OAAO,CAAC,eAAe,CAAC,CAoE1B"}
1
+ {"version":3,"file":"probe-dispatch.d.ts","sourceRoot":"","sources":["../../../../../src/lib/testing/storyboard/request-signing/probe-dispatch.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAA4B,oBAAoB,EAAE,MAAM,UAAU,CAAC;AAKhG;;;;;;;;;GASG;AACH,wBAAgB,sBAAsB,CACpC,MAAM,EAAE;IAAE,SAAS,CAAC,EAAE,KAAK,GAAG,KAAK,GAAG,KAAK,CAAA;CAAE,EAC7C,QAAQ,CAAC,EAAE,KAAK,GAAG,KAAK,GACvB,KAAK,GAAG,KAAK,GAAG,KAAK,CAEvB;AAED;;;;;;GAMG;AACH,wBAAsB,yBAAyB,CAC7C,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,oBAAoB,GAC5B,OAAO,CAAC,eAAe,CAAC,CAqE1B"}
@@ -25,8 +25,8 @@ module.exports = __toCommonJS(probe_dispatch_exports);
25
25
  var import_grader = require('./grader.js');
26
26
  var import_synthesize = require('./synthesize.js');
27
27
  var import_vector_loader = require('./vector-loader.js');
28
- function resolveVectorTransport(rsOpts) {
29
- return rsOpts.transport ?? "mcp";
28
+ function resolveVectorTransport(rsOpts, protocol) {
29
+ return rsOpts.transport ?? (protocol === "a2a" ? "a2a" : "mcp");
30
30
  }
31
31
  async function probeRequestSigningVector(stepId, agentUrl, options) {
32
32
  const parsed = (0, import_synthesize.parseRequestSigningStepId)(stepId);
@@ -61,12 +61,13 @@ async function probeRequestSigningVector(stepId, agentUrl, options) {
61
61
  onlyVectors: rsOpts.onlyVectors,
62
62
  skipVectors: rsOpts.skipVectors,
63
63
  skipRateAbuse: rsOpts.skipRateAbuse,
64
- transport: resolveVectorTransport(rsOpts),
64
+ transport: resolveVectorTransport(rsOpts, options.protocol),
65
65
  // The auto-initialize handshake authenticates like any MCP client;
66
66
  // agents commonly require auth on `initialize` (the signed vectors
67
67
  // themselves stay bearer-less — the signature is their auth).
68
68
  ...options.auth?.type === "bearer" && options.auth.token ? { initializeHeaders: { authorization: `Bearer ${options.auth.token}` } } : {},
69
- mcpSessionId: rsOpts.mcpSessionId
69
+ mcpSessionId: rsOpts.mcpSessionId,
70
+ ...options.transport?.trustedFetchFn ? { cardFetch: options.transport.trustedFetchFn } : {}
70
71
  });
71
72
  if (result.skipped) {
72
73
  return skipProbe(agentUrl, result.skip_reason ?? "grader_skipped");
@@ -76,7 +77,7 @@ async function probeRequestSigningVector(stepId, agentUrl, options) {
76
77
  headers["www-authenticate"] = `Signature error="${result.actual_error_code}"`;
77
78
  }
78
79
  return {
79
- url: agentUrl,
80
+ url: result.probe_url ?? agentUrl,
80
81
  status: result.http_status,
81
82
  headers,
82
83
  body: result.diagnostic ?? null,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/lib/testing/storyboard/request-signing/probe-dispatch.ts"],"sourcesContent":["import type { HttpProbeResult, RunnerDetailedSkipReason, StoryboardRunOptions } from '../types';\nimport { gradeOneVector } from './grader';\nimport { parseRequestSigningStepId } from './synthesize';\nimport { loadRequestSigningVectors } from './vector-loader';\n\n/**\n * Resolve the vector transport for a graded agent. Defaults to `'mcp'`: the\n * storyboard runner reaches agents through `tools/call` (MCP, or the\n * AdCP-over-A2A binding) — never through per-task HTTP paths — so replaying\n * the vectors' recorded REST targets (`/adcp/create_media_buy`, raw task\n * body) verbatim guarantees a routing 404 on every MCP-transport agent\n * before its verifier can run (adcontextprotocol/adcp#6548). Operators\n * grading a REST-binding agent opt back in with\n * `request_signing.transport: 'raw'`.\n */\nexport function resolveVectorTransport(rsOpts: { transport?: 'raw' | 'mcp' }): 'raw' | 'mcp' {\n return rsOpts.transport ?? 'mcp';\n}\n\n/**\n * Dispatch a synthesized request-signing step. The step ID encodes the vector\n * (`positive-<id>` / `negative-<id>`); this helper decodes it, runs the\n * grader's per-vector logic, and maps the `VectorGradeResult` to an\n * `HttpProbeResult`-shaped return so the existing validation pipeline\n * (`http_status`, `http_status_in`) works unchanged.\n */\nexport async function probeRequestSigningVector(\n stepId: string,\n agentUrl: string,\n options: StoryboardRunOptions\n): Promise<HttpProbeResult> {\n const parsed = parseRequestSigningStepId(stepId);\n if (!parsed) {\n return {\n url: agentUrl,\n status: 0,\n headers: {},\n body: null,\n error: `request_signing_probe: step id \"${stepId}\" does not match positive-/negative- prefix`,\n };\n }\n const rsOpts = options.request_signing ?? {};\n // Vector-id lookup so we skip by the vector's `requires_contract`, not by\n // hardcoded vector id. Keeps the dispatch resilient to upstream renames.\n if (parsed.kind === 'negative' && rsOpts.skipRateAbuse) {\n try {\n const loaded = loadRequestSigningVectors();\n const vector = loaded.negative.find(v => v.id === parsed.vector_id);\n if (vector?.requires_contract === 'rate_abuse') {\n return skipProbe(agentUrl, 'rate_abuse_opt_out');\n }\n } catch {\n // fall through — surfaces as a grader error below\n }\n }\n if (rsOpts.skipVectors?.includes(parsed.vector_id)) {\n return skipProbe(agentUrl, 'operator_skip');\n }\n try {\n const result = await gradeOneVector(parsed.vector_id, parsed.kind, agentUrl, {\n allowPrivateIp: options.allow_http === true,\n rateAbuseCap: rsOpts.rateAbuseCap,\n allowLiveSideEffects: rsOpts.allowLiveSideEffects,\n onlyVectors: rsOpts.onlyVectors,\n skipVectors: rsOpts.skipVectors,\n skipRateAbuse: rsOpts.skipRateAbuse,\n transport: resolveVectorTransport(rsOpts),\n // The auto-initialize handshake authenticates like any MCP client;\n // agents commonly require auth on `initialize` (the signed vectors\n // themselves stay bearer-less — the signature is their auth).\n ...(options.auth?.type === 'bearer' && options.auth.token\n ? { initializeHeaders: { authorization: `Bearer ${options.auth.token}` } }\n : {}),\n mcpSessionId: rsOpts.mcpSessionId,\n });\n if (result.skipped) {\n return skipProbe(agentUrl, (result.skip_reason as RunnerDetailedSkipReason | undefined) ?? 'grader_skipped');\n }\n const headers: Record<string, string> = {};\n if (result.actual_error_code) {\n headers['www-authenticate'] = `Signature error=\"${result.actual_error_code}\"`;\n }\n return {\n url: agentUrl,\n status: result.http_status,\n headers,\n body: result.diagnostic ?? null,\n error: result.passed ? undefined : (result.diagnostic ?? 'vector grade failed'),\n };\n } catch (err) {\n return {\n url: agentUrl,\n status: 0,\n headers: {},\n body: null,\n error: `request_signing_probe threw: ${err instanceof Error ? err.message : String(err)}`,\n };\n }\n}\n\nfunction skipProbe(url: string, reason: RunnerDetailedSkipReason): HttpProbeResult {\n return { url, status: 0, headers: {}, body: null, skipped: true, skip_reason: reason };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,oBAA+B;AAC/B,wBAA0C;AAC1C,2BAA0C;AAYnC,SAAS,uBAAuB,QAAsD;AAC3F,SAAO,OAAO,aAAa;AAC7B;AASA,eAAsB,0BACpB,QACA,UACA,SAC0B;AAC1B,QAAM,aAAS,6CAA0B,MAAM;AAC/C,MAAI,CAAC,QAAQ;AACX,WAAO;AAAA,MACL,KAAK;AAAA,MACL,QAAQ;AAAA,MACR,SAAS,CAAC;AAAA,MACV,MAAM;AAAA,MACN,OAAO,mCAAmC,MAAM;AAAA,IAClD;AAAA,EACF;AACA,QAAM,SAAS,QAAQ,mBAAmB,CAAC;AAG3C,MAAI,OAAO,SAAS,cAAc,OAAO,eAAe;AACtD,QAAI;AACF,YAAM,aAAS,gDAA0B;AACzC,YAAM,SAAS,OAAO,SAAS,KAAK,OAAK,EAAE,OAAO,OAAO,SAAS;AAClE,UAAI,QAAQ,sBAAsB,cAAc;AAC9C,eAAO,UAAU,UAAU,oBAAoB;AAAA,MACjD;AAAA,IACF,QAAQ;AAAA,IAER;AAAA,EACF;AACA,MAAI,OAAO,aAAa,SAAS,OAAO,SAAS,GAAG;AAClD,WAAO,UAAU,UAAU,eAAe;AAAA,EAC5C;AACA,MAAI;AACF,UAAM,SAAS,UAAM,8BAAe,OAAO,WAAW,OAAO,MAAM,UAAU;AAAA,MAC3E,gBAAgB,QAAQ,eAAe;AAAA,MACvC,cAAc,OAAO;AAAA,MACrB,sBAAsB,OAAO;AAAA,MAC7B,aAAa,OAAO;AAAA,MACpB,aAAa,OAAO;AAAA,MACpB,eAAe,OAAO;AAAA,MACtB,WAAW,uBAAuB,MAAM;AAAA;AAAA;AAAA;AAAA,MAIxC,GAAI,QAAQ,MAAM,SAAS,YAAY,QAAQ,KAAK,QAChD,EAAE,mBAAmB,EAAE,eAAe,UAAU,QAAQ,KAAK,KAAK,GAAG,EAAE,IACvE,CAAC;AAAA,MACL,cAAc,OAAO;AAAA,IACvB,CAAC;AACD,QAAI,OAAO,SAAS;AAClB,aAAO,UAAU,UAAW,OAAO,eAAwD,gBAAgB;AAAA,IAC7G;AACA,UAAM,UAAkC,CAAC;AACzC,QAAI,OAAO,mBAAmB;AAC5B,cAAQ,kBAAkB,IAAI,oBAAoB,OAAO,iBAAiB;AAAA,IAC5E;AACA,WAAO;AAAA,MACL,KAAK;AAAA,MACL,QAAQ,OAAO;AAAA,MACf;AAAA,MACA,MAAM,OAAO,cAAc;AAAA,MAC3B,OAAO,OAAO,SAAS,SAAa,OAAO,cAAc;AAAA,IAC3D;AAAA,EACF,SAAS,KAAK;AACZ,WAAO;AAAA,MACL,KAAK;AAAA,MACL,QAAQ;AAAA,MACR,SAAS,CAAC;AAAA,MACV,MAAM;AAAA,MACN,OAAO,gCAAgC,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,IACzF;AAAA,EACF;AACF;AAEA,SAAS,UAAU,KAAa,QAAmD;AACjF,SAAO,EAAE,KAAK,QAAQ,GAAG,SAAS,CAAC,GAAG,MAAM,MAAM,SAAS,MAAM,aAAa,OAAO;AACvF;","names":[]}
1
+ {"version":3,"sources":["../../../../../src/lib/testing/storyboard/request-signing/probe-dispatch.ts"],"sourcesContent":["import type { HttpProbeResult, RunnerDetailedSkipReason, StoryboardRunOptions } from '../types';\nimport { gradeOneVector } from './grader';\nimport { parseRequestSigningStepId } from './synthesize';\nimport { loadRequestSigningVectors } from './vector-loader';\n\n/**\n * Resolve the vector transport for a graded agent. Defaults to `'mcp'`: the\n * storyboard runner reaches agents through `tools/call` (MCP, or the\n * AdCP-over-A2A binding) — never through per-task HTTP paths — so replaying\n * the vectors' recorded REST targets (`/adcp/create_media_buy`, raw task\n * body) verbatim guarantees a routing 404 on every MCP-transport agent\n * before its verifier can run (adcontextprotocol/adcp#6548). Operators\n * grading a REST-binding agent opt back in with\n * `request_signing.transport: 'raw'`.\n */\nexport function resolveVectorTransport(\n rsOpts: { transport?: 'raw' | 'mcp' | 'a2a' },\n protocol?: 'mcp' | 'a2a'\n): 'raw' | 'mcp' | 'a2a' {\n return rsOpts.transport ?? (protocol === 'a2a' ? 'a2a' : 'mcp');\n}\n\n/**\n * Dispatch a synthesized request-signing step. The step ID encodes the vector\n * (`positive-<id>` / `negative-<id>`); this helper decodes it, runs the\n * grader's per-vector logic, and maps the `VectorGradeResult` to an\n * `HttpProbeResult`-shaped return so the existing validation pipeline\n * (`http_status`, `http_status_in`) works unchanged.\n */\nexport async function probeRequestSigningVector(\n stepId: string,\n agentUrl: string,\n options: StoryboardRunOptions\n): Promise<HttpProbeResult> {\n const parsed = parseRequestSigningStepId(stepId);\n if (!parsed) {\n return {\n url: agentUrl,\n status: 0,\n headers: {},\n body: null,\n error: `request_signing_probe: step id \"${stepId}\" does not match positive-/negative- prefix`,\n };\n }\n const rsOpts = options.request_signing ?? {};\n // Vector-id lookup so we skip by the vector's `requires_contract`, not by\n // hardcoded vector id. Keeps the dispatch resilient to upstream renames.\n if (parsed.kind === 'negative' && rsOpts.skipRateAbuse) {\n try {\n const loaded = loadRequestSigningVectors();\n const vector = loaded.negative.find(v => v.id === parsed.vector_id);\n if (vector?.requires_contract === 'rate_abuse') {\n return skipProbe(agentUrl, 'rate_abuse_opt_out');\n }\n } catch {\n // fall through — surfaces as a grader error below\n }\n }\n if (rsOpts.skipVectors?.includes(parsed.vector_id)) {\n return skipProbe(agentUrl, 'operator_skip');\n }\n try {\n const result = await gradeOneVector(parsed.vector_id, parsed.kind, agentUrl, {\n allowPrivateIp: options.allow_http === true,\n rateAbuseCap: rsOpts.rateAbuseCap,\n allowLiveSideEffects: rsOpts.allowLiveSideEffects,\n onlyVectors: rsOpts.onlyVectors,\n skipVectors: rsOpts.skipVectors,\n skipRateAbuse: rsOpts.skipRateAbuse,\n transport: resolveVectorTransport(rsOpts, options.protocol),\n // The auto-initialize handshake authenticates like any MCP client;\n // agents commonly require auth on `initialize` (the signed vectors\n // themselves stay bearer-less — the signature is their auth).\n ...(options.auth?.type === 'bearer' && options.auth.token\n ? { initializeHeaders: { authorization: `Bearer ${options.auth.token}` } }\n : {}),\n mcpSessionId: rsOpts.mcpSessionId,\n ...(options.transport?.trustedFetchFn ? { cardFetch: options.transport.trustedFetchFn } : {}),\n });\n if (result.skipped) {\n return skipProbe(agentUrl, (result.skip_reason as RunnerDetailedSkipReason | undefined) ?? 'grader_skipped');\n }\n const headers: Record<string, string> = {};\n if (result.actual_error_code) {\n headers['www-authenticate'] = `Signature error=\"${result.actual_error_code}\"`;\n }\n return {\n url: result.probe_url ?? agentUrl,\n status: result.http_status,\n headers,\n body: result.diagnostic ?? null,\n error: result.passed ? undefined : (result.diagnostic ?? 'vector grade failed'),\n };\n } catch (err) {\n return {\n url: agentUrl,\n status: 0,\n headers: {},\n body: null,\n error: `request_signing_probe threw: ${err instanceof Error ? err.message : String(err)}`,\n };\n }\n}\n\nfunction skipProbe(url: string, reason: RunnerDetailedSkipReason): HttpProbeResult {\n return { url, status: 0, headers: {}, body: null, skipped: true, skip_reason: reason };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,oBAA+B;AAC/B,wBAA0C;AAC1C,2BAA0C;AAYnC,SAAS,uBACd,QACA,UACuB;AACvB,SAAO,OAAO,cAAc,aAAa,QAAQ,QAAQ;AAC3D;AASA,eAAsB,0BACpB,QACA,UACA,SAC0B;AAC1B,QAAM,aAAS,6CAA0B,MAAM;AAC/C,MAAI,CAAC,QAAQ;AACX,WAAO;AAAA,MACL,KAAK;AAAA,MACL,QAAQ;AAAA,MACR,SAAS,CAAC;AAAA,MACV,MAAM;AAAA,MACN,OAAO,mCAAmC,MAAM;AAAA,IAClD;AAAA,EACF;AACA,QAAM,SAAS,QAAQ,mBAAmB,CAAC;AAG3C,MAAI,OAAO,SAAS,cAAc,OAAO,eAAe;AACtD,QAAI;AACF,YAAM,aAAS,gDAA0B;AACzC,YAAM,SAAS,OAAO,SAAS,KAAK,OAAK,EAAE,OAAO,OAAO,SAAS;AAClE,UAAI,QAAQ,sBAAsB,cAAc;AAC9C,eAAO,UAAU,UAAU,oBAAoB;AAAA,MACjD;AAAA,IACF,QAAQ;AAAA,IAER;AAAA,EACF;AACA,MAAI,OAAO,aAAa,SAAS,OAAO,SAAS,GAAG;AAClD,WAAO,UAAU,UAAU,eAAe;AAAA,EAC5C;AACA,MAAI;AACF,UAAM,SAAS,UAAM,8BAAe,OAAO,WAAW,OAAO,MAAM,UAAU;AAAA,MAC3E,gBAAgB,QAAQ,eAAe;AAAA,MACvC,cAAc,OAAO;AAAA,MACrB,sBAAsB,OAAO;AAAA,MAC7B,aAAa,OAAO;AAAA,MACpB,aAAa,OAAO;AAAA,MACpB,eAAe,OAAO;AAAA,MACtB,WAAW,uBAAuB,QAAQ,QAAQ,QAAQ;AAAA;AAAA;AAAA;AAAA,MAI1D,GAAI,QAAQ,MAAM,SAAS,YAAY,QAAQ,KAAK,QAChD,EAAE,mBAAmB,EAAE,eAAe,UAAU,QAAQ,KAAK,KAAK,GAAG,EAAE,IACvE,CAAC;AAAA,MACL,cAAc,OAAO;AAAA,MACrB,GAAI,QAAQ,WAAW,iBAAiB,EAAE,WAAW,QAAQ,UAAU,eAAe,IAAI,CAAC;AAAA,IAC7F,CAAC;AACD,QAAI,OAAO,SAAS;AAClB,aAAO,UAAU,UAAW,OAAO,eAAwD,gBAAgB;AAAA,IAC7G;AACA,UAAM,UAAkC,CAAC;AACzC,QAAI,OAAO,mBAAmB;AAC5B,cAAQ,kBAAkB,IAAI,oBAAoB,OAAO,iBAAiB;AAAA,IAC5E;AACA,WAAO;AAAA,MACL,KAAK,OAAO,aAAa;AAAA,MACzB,QAAQ,OAAO;AAAA,MACf;AAAA,MACA,MAAM,OAAO,cAAc;AAAA,MAC3B,OAAO,OAAO,SAAS,SAAa,OAAO,cAAc;AAAA,IAC3D;AAAA,EACF,SAAS,KAAK;AACZ,WAAO;AAAA,MACL,KAAK;AAAA,MACL,QAAQ;AAAA,MACR,SAAS,CAAC;AAAA,MACV,MAAM;AAAA,MACN,OAAO,gCAAgC,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,IACzF;AAAA,EACF;AACF;AAEA,SAAS,UAAU,KAAa,QAAmD;AACjF,SAAO,EAAE,KAAK,QAAQ,GAAG,SAAS,CAAC,GAAG,MAAM,MAAM,SAAS,MAAM,aAAa,OAAO;AACvF;","names":[]}
@@ -1,8 +1,8 @@
1
1
  import { gradeOneVector } from "./grader.mjs";
2
2
  import { parseRequestSigningStepId } from "./synthesize.mjs";
3
3
  import { loadRequestSigningVectors } from "./vector-loader.mjs";
4
- function resolveVectorTransport(rsOpts) {
5
- return rsOpts.transport ?? "mcp";
4
+ function resolveVectorTransport(rsOpts, protocol) {
5
+ return rsOpts.transport ?? (protocol === "a2a" ? "a2a" : "mcp");
6
6
  }
7
7
  async function probeRequestSigningVector(stepId, agentUrl, options) {
8
8
  const parsed = parseRequestSigningStepId(stepId);
@@ -37,12 +37,13 @@ async function probeRequestSigningVector(stepId, agentUrl, options) {
37
37
  onlyVectors: rsOpts.onlyVectors,
38
38
  skipVectors: rsOpts.skipVectors,
39
39
  skipRateAbuse: rsOpts.skipRateAbuse,
40
- transport: resolveVectorTransport(rsOpts),
40
+ transport: resolveVectorTransport(rsOpts, options.protocol),
41
41
  // The auto-initialize handshake authenticates like any MCP client;
42
42
  // agents commonly require auth on `initialize` (the signed vectors
43
43
  // themselves stay bearer-less — the signature is their auth).
44
44
  ...options.auth?.type === "bearer" && options.auth.token ? { initializeHeaders: { authorization: `Bearer ${options.auth.token}` } } : {},
45
- mcpSessionId: rsOpts.mcpSessionId
45
+ mcpSessionId: rsOpts.mcpSessionId,
46
+ ...options.transport?.trustedFetchFn ? { cardFetch: options.transport.trustedFetchFn } : {}
46
47
  });
47
48
  if (result.skipped) {
48
49
  return skipProbe(agentUrl, result.skip_reason ?? "grader_skipped");
@@ -52,7 +53,7 @@ async function probeRequestSigningVector(stepId, agentUrl, options) {
52
53
  headers["www-authenticate"] = `Signature error="${result.actual_error_code}"`;
53
54
  }
54
55
  return {
55
- url: agentUrl,
56
+ url: result.probe_url ?? agentUrl,
56
57
  status: result.http_status,
57
58
  headers,
58
59
  body: result.diagnostic ?? null,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/lib/testing/storyboard/request-signing/probe-dispatch.ts"],"sourcesContent":["import type { HttpProbeResult, RunnerDetailedSkipReason, StoryboardRunOptions } from '../types';\nimport { gradeOneVector } from './grader';\nimport { parseRequestSigningStepId } from './synthesize';\nimport { loadRequestSigningVectors } from './vector-loader';\n\n/**\n * Resolve the vector transport for a graded agent. Defaults to `'mcp'`: the\n * storyboard runner reaches agents through `tools/call` (MCP, or the\n * AdCP-over-A2A binding) — never through per-task HTTP paths — so replaying\n * the vectors' recorded REST targets (`/adcp/create_media_buy`, raw task\n * body) verbatim guarantees a routing 404 on every MCP-transport agent\n * before its verifier can run (adcontextprotocol/adcp#6548). Operators\n * grading a REST-binding agent opt back in with\n * `request_signing.transport: 'raw'`.\n */\nexport function resolveVectorTransport(rsOpts: { transport?: 'raw' | 'mcp' }): 'raw' | 'mcp' {\n return rsOpts.transport ?? 'mcp';\n}\n\n/**\n * Dispatch a synthesized request-signing step. The step ID encodes the vector\n * (`positive-<id>` / `negative-<id>`); this helper decodes it, runs the\n * grader's per-vector logic, and maps the `VectorGradeResult` to an\n * `HttpProbeResult`-shaped return so the existing validation pipeline\n * (`http_status`, `http_status_in`) works unchanged.\n */\nexport async function probeRequestSigningVector(\n stepId: string,\n agentUrl: string,\n options: StoryboardRunOptions\n): Promise<HttpProbeResult> {\n const parsed = parseRequestSigningStepId(stepId);\n if (!parsed) {\n return {\n url: agentUrl,\n status: 0,\n headers: {},\n body: null,\n error: `request_signing_probe: step id \"${stepId}\" does not match positive-/negative- prefix`,\n };\n }\n const rsOpts = options.request_signing ?? {};\n // Vector-id lookup so we skip by the vector's `requires_contract`, not by\n // hardcoded vector id. Keeps the dispatch resilient to upstream renames.\n if (parsed.kind === 'negative' && rsOpts.skipRateAbuse) {\n try {\n const loaded = loadRequestSigningVectors();\n const vector = loaded.negative.find(v => v.id === parsed.vector_id);\n if (vector?.requires_contract === 'rate_abuse') {\n return skipProbe(agentUrl, 'rate_abuse_opt_out');\n }\n } catch {\n // fall through — surfaces as a grader error below\n }\n }\n if (rsOpts.skipVectors?.includes(parsed.vector_id)) {\n return skipProbe(agentUrl, 'operator_skip');\n }\n try {\n const result = await gradeOneVector(parsed.vector_id, parsed.kind, agentUrl, {\n allowPrivateIp: options.allow_http === true,\n rateAbuseCap: rsOpts.rateAbuseCap,\n allowLiveSideEffects: rsOpts.allowLiveSideEffects,\n onlyVectors: rsOpts.onlyVectors,\n skipVectors: rsOpts.skipVectors,\n skipRateAbuse: rsOpts.skipRateAbuse,\n transport: resolveVectorTransport(rsOpts),\n // The auto-initialize handshake authenticates like any MCP client;\n // agents commonly require auth on `initialize` (the signed vectors\n // themselves stay bearer-less — the signature is their auth).\n ...(options.auth?.type === 'bearer' && options.auth.token\n ? { initializeHeaders: { authorization: `Bearer ${options.auth.token}` } }\n : {}),\n mcpSessionId: rsOpts.mcpSessionId,\n });\n if (result.skipped) {\n return skipProbe(agentUrl, (result.skip_reason as RunnerDetailedSkipReason | undefined) ?? 'grader_skipped');\n }\n const headers: Record<string, string> = {};\n if (result.actual_error_code) {\n headers['www-authenticate'] = `Signature error=\"${result.actual_error_code}\"`;\n }\n return {\n url: agentUrl,\n status: result.http_status,\n headers,\n body: result.diagnostic ?? null,\n error: result.passed ? undefined : (result.diagnostic ?? 'vector grade failed'),\n };\n } catch (err) {\n return {\n url: agentUrl,\n status: 0,\n headers: {},\n body: null,\n error: `request_signing_probe threw: ${err instanceof Error ? err.message : String(err)}`,\n };\n }\n}\n\nfunction skipProbe(url: string, reason: RunnerDetailedSkipReason): HttpProbeResult {\n return { url, status: 0, headers: {}, body: null, skipped: true, skip_reason: reason };\n}\n"],"mappings":"AACA,SAAS,sBAAsB;AAC/B,SAAS,iCAAiC;AAC1C,SAAS,iCAAiC;AAYnC,SAAS,uBAAuB,QAAsD;AAC3F,SAAO,OAAO,aAAa;AAC7B;AASA,eAAsB,0BACpB,QACA,UACA,SAC0B;AAC1B,QAAM,SAAS,0BAA0B,MAAM;AAC/C,MAAI,CAAC,QAAQ;AACX,WAAO;AAAA,MACL,KAAK;AAAA,MACL,QAAQ;AAAA,MACR,SAAS,CAAC;AAAA,MACV,MAAM;AAAA,MACN,OAAO,mCAAmC,MAAM;AAAA,IAClD;AAAA,EACF;AACA,QAAM,SAAS,QAAQ,mBAAmB,CAAC;AAG3C,MAAI,OAAO,SAAS,cAAc,OAAO,eAAe;AACtD,QAAI;AACF,YAAM,SAAS,0BAA0B;AACzC,YAAM,SAAS,OAAO,SAAS,KAAK,OAAK,EAAE,OAAO,OAAO,SAAS;AAClE,UAAI,QAAQ,sBAAsB,cAAc;AAC9C,eAAO,UAAU,UAAU,oBAAoB;AAAA,MACjD;AAAA,IACF,QAAQ;AAAA,IAER;AAAA,EACF;AACA,MAAI,OAAO,aAAa,SAAS,OAAO,SAAS,GAAG;AAClD,WAAO,UAAU,UAAU,eAAe;AAAA,EAC5C;AACA,MAAI;AACF,UAAM,SAAS,MAAM,eAAe,OAAO,WAAW,OAAO,MAAM,UAAU;AAAA,MAC3E,gBAAgB,QAAQ,eAAe;AAAA,MACvC,cAAc,OAAO;AAAA,MACrB,sBAAsB,OAAO;AAAA,MAC7B,aAAa,OAAO;AAAA,MACpB,aAAa,OAAO;AAAA,MACpB,eAAe,OAAO;AAAA,MACtB,WAAW,uBAAuB,MAAM;AAAA;AAAA;AAAA;AAAA,MAIxC,GAAI,QAAQ,MAAM,SAAS,YAAY,QAAQ,KAAK,QAChD,EAAE,mBAAmB,EAAE,eAAe,UAAU,QAAQ,KAAK,KAAK,GAAG,EAAE,IACvE,CAAC;AAAA,MACL,cAAc,OAAO;AAAA,IACvB,CAAC;AACD,QAAI,OAAO,SAAS;AAClB,aAAO,UAAU,UAAW,OAAO,eAAwD,gBAAgB;AAAA,IAC7G;AACA,UAAM,UAAkC,CAAC;AACzC,QAAI,OAAO,mBAAmB;AAC5B,cAAQ,kBAAkB,IAAI,oBAAoB,OAAO,iBAAiB;AAAA,IAC5E;AACA,WAAO;AAAA,MACL,KAAK;AAAA,MACL,QAAQ,OAAO;AAAA,MACf;AAAA,MACA,MAAM,OAAO,cAAc;AAAA,MAC3B,OAAO,OAAO,SAAS,SAAa,OAAO,cAAc;AAAA,IAC3D;AAAA,EACF,SAAS,KAAK;AACZ,WAAO;AAAA,MACL,KAAK;AAAA,MACL,QAAQ;AAAA,MACR,SAAS,CAAC;AAAA,MACV,MAAM;AAAA,MACN,OAAO,gCAAgC,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,IACzF;AAAA,EACF;AACF;AAEA,SAAS,UAAU,KAAa,QAAmD;AACjF,SAAO,EAAE,KAAK,QAAQ,GAAG,SAAS,CAAC,GAAG,MAAM,MAAM,SAAS,MAAM,aAAa,OAAO;AACvF;","names":[]}
1
+ {"version":3,"sources":["../../../../../src/lib/testing/storyboard/request-signing/probe-dispatch.ts"],"sourcesContent":["import type { HttpProbeResult, RunnerDetailedSkipReason, StoryboardRunOptions } from '../types';\nimport { gradeOneVector } from './grader';\nimport { parseRequestSigningStepId } from './synthesize';\nimport { loadRequestSigningVectors } from './vector-loader';\n\n/**\n * Resolve the vector transport for a graded agent. Defaults to `'mcp'`: the\n * storyboard runner reaches agents through `tools/call` (MCP, or the\n * AdCP-over-A2A binding) — never through per-task HTTP paths — so replaying\n * the vectors' recorded REST targets (`/adcp/create_media_buy`, raw task\n * body) verbatim guarantees a routing 404 on every MCP-transport agent\n * before its verifier can run (adcontextprotocol/adcp#6548). Operators\n * grading a REST-binding agent opt back in with\n * `request_signing.transport: 'raw'`.\n */\nexport function resolveVectorTransport(\n rsOpts: { transport?: 'raw' | 'mcp' | 'a2a' },\n protocol?: 'mcp' | 'a2a'\n): 'raw' | 'mcp' | 'a2a' {\n return rsOpts.transport ?? (protocol === 'a2a' ? 'a2a' : 'mcp');\n}\n\n/**\n * Dispatch a synthesized request-signing step. The step ID encodes the vector\n * (`positive-<id>` / `negative-<id>`); this helper decodes it, runs the\n * grader's per-vector logic, and maps the `VectorGradeResult` to an\n * `HttpProbeResult`-shaped return so the existing validation pipeline\n * (`http_status`, `http_status_in`) works unchanged.\n */\nexport async function probeRequestSigningVector(\n stepId: string,\n agentUrl: string,\n options: StoryboardRunOptions\n): Promise<HttpProbeResult> {\n const parsed = parseRequestSigningStepId(stepId);\n if (!parsed) {\n return {\n url: agentUrl,\n status: 0,\n headers: {},\n body: null,\n error: `request_signing_probe: step id \"${stepId}\" does not match positive-/negative- prefix`,\n };\n }\n const rsOpts = options.request_signing ?? {};\n // Vector-id lookup so we skip by the vector's `requires_contract`, not by\n // hardcoded vector id. Keeps the dispatch resilient to upstream renames.\n if (parsed.kind === 'negative' && rsOpts.skipRateAbuse) {\n try {\n const loaded = loadRequestSigningVectors();\n const vector = loaded.negative.find(v => v.id === parsed.vector_id);\n if (vector?.requires_contract === 'rate_abuse') {\n return skipProbe(agentUrl, 'rate_abuse_opt_out');\n }\n } catch {\n // fall through — surfaces as a grader error below\n }\n }\n if (rsOpts.skipVectors?.includes(parsed.vector_id)) {\n return skipProbe(agentUrl, 'operator_skip');\n }\n try {\n const result = await gradeOneVector(parsed.vector_id, parsed.kind, agentUrl, {\n allowPrivateIp: options.allow_http === true,\n rateAbuseCap: rsOpts.rateAbuseCap,\n allowLiveSideEffects: rsOpts.allowLiveSideEffects,\n onlyVectors: rsOpts.onlyVectors,\n skipVectors: rsOpts.skipVectors,\n skipRateAbuse: rsOpts.skipRateAbuse,\n transport: resolveVectorTransport(rsOpts, options.protocol),\n // The auto-initialize handshake authenticates like any MCP client;\n // agents commonly require auth on `initialize` (the signed vectors\n // themselves stay bearer-less — the signature is their auth).\n ...(options.auth?.type === 'bearer' && options.auth.token\n ? { initializeHeaders: { authorization: `Bearer ${options.auth.token}` } }\n : {}),\n mcpSessionId: rsOpts.mcpSessionId,\n ...(options.transport?.trustedFetchFn ? { cardFetch: options.transport.trustedFetchFn } : {}),\n });\n if (result.skipped) {\n return skipProbe(agentUrl, (result.skip_reason as RunnerDetailedSkipReason | undefined) ?? 'grader_skipped');\n }\n const headers: Record<string, string> = {};\n if (result.actual_error_code) {\n headers['www-authenticate'] = `Signature error=\"${result.actual_error_code}\"`;\n }\n return {\n url: result.probe_url ?? agentUrl,\n status: result.http_status,\n headers,\n body: result.diagnostic ?? null,\n error: result.passed ? undefined : (result.diagnostic ?? 'vector grade failed'),\n };\n } catch (err) {\n return {\n url: agentUrl,\n status: 0,\n headers: {},\n body: null,\n error: `request_signing_probe threw: ${err instanceof Error ? err.message : String(err)}`,\n };\n }\n}\n\nfunction skipProbe(url: string, reason: RunnerDetailedSkipReason): HttpProbeResult {\n return { url, status: 0, headers: {}, body: null, skipped: true, skip_reason: reason };\n}\n"],"mappings":"AACA,SAAS,sBAAsB;AAC/B,SAAS,iCAAiC;AAC1C,SAAS,iCAAiC;AAYnC,SAAS,uBACd,QACA,UACuB;AACvB,SAAO,OAAO,cAAc,aAAa,QAAQ,QAAQ;AAC3D;AASA,eAAsB,0BACpB,QACA,UACA,SAC0B;AAC1B,QAAM,SAAS,0BAA0B,MAAM;AAC/C,MAAI,CAAC,QAAQ;AACX,WAAO;AAAA,MACL,KAAK;AAAA,MACL,QAAQ;AAAA,MACR,SAAS,CAAC;AAAA,MACV,MAAM;AAAA,MACN,OAAO,mCAAmC,MAAM;AAAA,IAClD;AAAA,EACF;AACA,QAAM,SAAS,QAAQ,mBAAmB,CAAC;AAG3C,MAAI,OAAO,SAAS,cAAc,OAAO,eAAe;AACtD,QAAI;AACF,YAAM,SAAS,0BAA0B;AACzC,YAAM,SAAS,OAAO,SAAS,KAAK,OAAK,EAAE,OAAO,OAAO,SAAS;AAClE,UAAI,QAAQ,sBAAsB,cAAc;AAC9C,eAAO,UAAU,UAAU,oBAAoB;AAAA,MACjD;AAAA,IACF,QAAQ;AAAA,IAER;AAAA,EACF;AACA,MAAI,OAAO,aAAa,SAAS,OAAO,SAAS,GAAG;AAClD,WAAO,UAAU,UAAU,eAAe;AAAA,EAC5C;AACA,MAAI;AACF,UAAM,SAAS,MAAM,eAAe,OAAO,WAAW,OAAO,MAAM,UAAU;AAAA,MAC3E,gBAAgB,QAAQ,eAAe;AAAA,MACvC,cAAc,OAAO;AAAA,MACrB,sBAAsB,OAAO;AAAA,MAC7B,aAAa,OAAO;AAAA,MACpB,aAAa,OAAO;AAAA,MACpB,eAAe,OAAO;AAAA,MACtB,WAAW,uBAAuB,QAAQ,QAAQ,QAAQ;AAAA;AAAA;AAAA;AAAA,MAI1D,GAAI,QAAQ,MAAM,SAAS,YAAY,QAAQ,KAAK,QAChD,EAAE,mBAAmB,EAAE,eAAe,UAAU,QAAQ,KAAK,KAAK,GAAG,EAAE,IACvE,CAAC;AAAA,MACL,cAAc,OAAO;AAAA,MACrB,GAAI,QAAQ,WAAW,iBAAiB,EAAE,WAAW,QAAQ,UAAU,eAAe,IAAI,CAAC;AAAA,IAC7F,CAAC;AACD,QAAI,OAAO,SAAS;AAClB,aAAO,UAAU,UAAW,OAAO,eAAwD,gBAAgB;AAAA,IAC7G;AACA,UAAM,UAAkC,CAAC;AACzC,QAAI,OAAO,mBAAmB;AAC5B,cAAQ,kBAAkB,IAAI,oBAAoB,OAAO,iBAAiB;AAAA,IAC5E;AACA,WAAO;AAAA,MACL,KAAK,OAAO,aAAa;AAAA,MACzB,QAAQ,OAAO;AAAA,MACf;AAAA,MACA,MAAM,OAAO,cAAc;AAAA,MAC3B,OAAO,OAAO,SAAS,SAAa,OAAO,cAAc;AAAA,IAC3D;AAAA,EACF,SAAS,KAAK;AACZ,WAAO;AAAA,MACL,KAAK;AAAA,MACL,QAAQ;AAAA,MACR,SAAS,CAAC;AAAA,MACV,MAAM;AAAA,MACN,OAAO,gCAAgC,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,IACzF;AAAA,EACF;AACF;AAEA,SAAS,UAAU,KAAa,QAAmD;AACjF,SAAO,EAAE,KAAK,QAAQ,GAAG,SAAS,CAAC,GAAG,MAAM,MAAM,SAAS,MAAM,aAAa,OAAO;AACvF;","names":[]}
@@ -22,6 +22,7 @@ export interface VerifierCapabilityFixture {
22
22
  * leave them undefined.
23
23
  */
24
24
  protocol_methods_supported_for?: string[];
25
+ protocol_methods_warn_for?: string[];
25
26
  protocol_methods_required_for?: string[];
26
27
  }
27
28
  /**
@@ -22,6 +22,7 @@ export interface VerifierCapabilityFixture {
22
22
  * leave them undefined.
23
23
  */
24
24
  protocol_methods_supported_for?: string[];
25
+ protocol_methods_warn_for?: string[];
25
26
  protocol_methods_required_for?: string[];
26
27
  }
27
28
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../../src/lib/testing/storyboard/request-signing/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,kBAAkB,CAAC;AAElE,qFAAqF;AACrF,eAAO,MAAM,YAAY,wDAAyD,CAAC;AACnF,MAAM,MAAM,UAAU,GAAG,CAAC,OAAO,YAAY,CAAC,CAAC,MAAM,CAAC,CAAC;AAEvD,MAAM,WAAW,aAAc,SAAQ,WAAW;IAChD,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,yBAAyB;IACxC,SAAS,EAAE,OAAO,CAAC;IACnB,qBAAqB,EAAE,UAAU,GAAG,WAAW,GAAG,QAAQ,CAAC;IAC3D,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB;;;;;;OAMG;IACH,8BAA8B,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1C,6BAA6B,CAAC,EAAE,MAAM,EAAE,CAAC;CAC1C;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;CACtC;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,UAAU,CAAC;IACjB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,aAAa,CAAC;IACvB,mBAAmB,EAAE,yBAAyB,CAAC;IAC/C,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,aAAa,CAAC,EAAE,YAAY,CAAC;IAC7B,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,UAAU,CAAC;IACjB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,aAAa,CAAC;IACvB,mBAAmB,EAAE,yBAAyB,CAAC;IAC/C,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,aAAa,CAAC,EAAE,YAAY,CAAC;IAC7B,mBAAmB,EAAE,yBAAyB,CAAC;IAC/C,oBAAoB,EAAE,MAAM,GAAG,MAAM,CAAC;IACtC,iBAAiB,CAAC,EAAE,UAAU,CAAC;IAC/B,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,MAAM,MAAM,GAAG,cAAc,GAAG,cAAc,CAAC;AAErD,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,CAAC,CAAC,EAAE,MAAM,CAAC;IACX,CAAC,CAAC,EAAE,MAAM,CAAC;IACX,iFAAiF;IACjF,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,WAAW,EAAE,CAAC;CACrB"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../../src/lib/testing/storyboard/request-signing/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,kBAAkB,CAAC;AAElE,qFAAqF;AACrF,eAAO,MAAM,YAAY,wDAAyD,CAAC;AACnF,MAAM,MAAM,UAAU,GAAG,CAAC,OAAO,YAAY,CAAC,CAAC,MAAM,CAAC,CAAC;AAEvD,MAAM,WAAW,aAAc,SAAQ,WAAW;IAChD,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,yBAAyB;IACxC,SAAS,EAAE,OAAO,CAAC;IACnB,qBAAqB,EAAE,UAAU,GAAG,WAAW,GAAG,QAAQ,CAAC;IAC3D,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB;;;;;;OAMG;IACH,8BAA8B,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1C,yBAAyB,CAAC,EAAE,MAAM,EAAE,CAAC;IACrC,6BAA6B,CAAC,EAAE,MAAM,EAAE,CAAC;CAC1C;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;CACtC;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,UAAU,CAAC;IACjB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,aAAa,CAAC;IACvB,mBAAmB,EAAE,yBAAyB,CAAC;IAC/C,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,aAAa,CAAC,EAAE,YAAY,CAAC;IAC7B,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,UAAU,CAAC;IACjB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,aAAa,CAAC;IACvB,mBAAmB,EAAE,yBAAyB,CAAC;IAC/C,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,aAAa,CAAC,EAAE,YAAY,CAAC;IAC7B,mBAAmB,EAAE,yBAAyB,CAAC;IAC/C,oBAAoB,EAAE,MAAM,GAAG,MAAM,CAAC;IACtC,iBAAiB,CAAC,EAAE,UAAU,CAAC;IAC/B,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,MAAM,MAAM,GAAG,cAAc,GAAG,cAAc,CAAC;AAErD,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,CAAC,CAAC,EAAE,MAAM,CAAC;IACX,CAAC,CAAC,EAAE,MAAM,CAAC;IACX,iFAAiF;IACjF,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,WAAW,EAAE,CAAC;CACrB"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/lib/testing/storyboard/request-signing/types.ts"],"sourcesContent":["import type { RequestLike } from '../../../signing';\nimport type { RequestSignatureErrorCode } from '../../../signing';\n\n/** Stateful-vector contracts declared in `test-kits/signed-requests-runner.yaml`. */\nexport const CONTRACT_IDS = ['replay_window', 'revocation', 'rate_abuse'] as const;\nexport type ContractId = (typeof CONTRACT_IDS)[number];\n\nexport interface VectorRequest extends RequestLike {\n method: string;\n url: string;\n headers: Record<string, string>;\n body?: string;\n}\n\nexport interface VerifierCapabilityFixture {\n supported: boolean;\n covers_content_digest: 'required' | 'forbidden' | 'either';\n required_for: string[];\n supported_for?: string[];\n /**\n * JSON-RPC protocol-method coverage (e.g. `tasks/cancel`, `tasks/get`) —\n * separate namespace from `required_for` / `supported_for` (which carry\n * AdCP tool names). Introduced in adcp#4326. Vectors targeting protocol\n * methods (e.g. negative/028) populate these; vectors targeting AdCP tools\n * leave them undefined.\n */\n protocol_methods_supported_for?: string[];\n protocol_methods_required_for?: string[];\n}\n\n/**\n * Inline JWK set shipped with a negative vector that wants to publish a\n * deliberately-malformed JWK (e.g., vector 025 declares alg=EdDSA but\n * crv=P-256 to exercise step-8 parameter consistency). Using `jwks_override`\n * instead of adding a malformed key to `keys.json` keeps the canonical\n * keyset clean so other vectors can't inherit the broken shape.\n * Mutually exclusive with `jwks_ref`.\n */\nexport interface JwksOverride {\n keys: Array<Record<string, unknown>>;\n}\n\nexport interface PositiveVector {\n kind: 'positive';\n id: string;\n name: string;\n reference_now: number;\n request: VectorRequest;\n verifier_capability: VerifierCapabilityFixture;\n jwks_ref?: string[];\n jwks_override?: JwksOverride;\n expected_signature_base?: string;\n spec_reference?: string;\n}\n\nexport interface NegativeVector {\n kind: 'negative';\n id: string;\n name: string;\n reference_now: number;\n request: VectorRequest;\n verifier_capability: VerifierCapabilityFixture;\n jwks_ref?: string[];\n jwks_override?: JwksOverride;\n expected_error_code: RequestSignatureErrorCode;\n expected_failed_step: number | string;\n requires_contract?: ContractId;\n spec_reference?: string;\n}\n\nexport type Vector = PositiveVector | NegativeVector;\n\nexport interface TestKeypair {\n kid: string;\n kty: string;\n crv?: string;\n alg?: string;\n use?: string;\n key_ops?: string[];\n adcp_use?: string;\n x?: string;\n y?: string;\n /** base64url-encoded private scalar, published only in test-vector keys.json. */\n private_d: string;\n}\n\nexport interface TestKeyset {\n keys: TestKeypair[];\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAIO,MAAM,eAAe,CAAC,iBAAiB,cAAc,YAAY;","names":[]}
1
+ {"version":3,"sources":["../../../../../src/lib/testing/storyboard/request-signing/types.ts"],"sourcesContent":["import type { RequestLike } from '../../../signing';\nimport type { RequestSignatureErrorCode } from '../../../signing';\n\n/** Stateful-vector contracts declared in `test-kits/signed-requests-runner.yaml`. */\nexport const CONTRACT_IDS = ['replay_window', 'revocation', 'rate_abuse'] as const;\nexport type ContractId = (typeof CONTRACT_IDS)[number];\n\nexport interface VectorRequest extends RequestLike {\n method: string;\n url: string;\n headers: Record<string, string>;\n body?: string;\n}\n\nexport interface VerifierCapabilityFixture {\n supported: boolean;\n covers_content_digest: 'required' | 'forbidden' | 'either';\n required_for: string[];\n supported_for?: string[];\n /**\n * JSON-RPC protocol-method coverage (e.g. `tasks/cancel`, `tasks/get`) —\n * separate namespace from `required_for` / `supported_for` (which carry\n * AdCP tool names). Introduced in adcp#4326. Vectors targeting protocol\n * methods (e.g. negative/028) populate these; vectors targeting AdCP tools\n * leave them undefined.\n */\n protocol_methods_supported_for?: string[];\n protocol_methods_warn_for?: string[];\n protocol_methods_required_for?: string[];\n}\n\n/**\n * Inline JWK set shipped with a negative vector that wants to publish a\n * deliberately-malformed JWK (e.g., vector 025 declares alg=EdDSA but\n * crv=P-256 to exercise step-8 parameter consistency). Using `jwks_override`\n * instead of adding a malformed key to `keys.json` keeps the canonical\n * keyset clean so other vectors can't inherit the broken shape.\n * Mutually exclusive with `jwks_ref`.\n */\nexport interface JwksOverride {\n keys: Array<Record<string, unknown>>;\n}\n\nexport interface PositiveVector {\n kind: 'positive';\n id: string;\n name: string;\n reference_now: number;\n request: VectorRequest;\n verifier_capability: VerifierCapabilityFixture;\n jwks_ref?: string[];\n jwks_override?: JwksOverride;\n expected_signature_base?: string;\n spec_reference?: string;\n}\n\nexport interface NegativeVector {\n kind: 'negative';\n id: string;\n name: string;\n reference_now: number;\n request: VectorRequest;\n verifier_capability: VerifierCapabilityFixture;\n jwks_ref?: string[];\n jwks_override?: JwksOverride;\n expected_error_code: RequestSignatureErrorCode;\n expected_failed_step: number | string;\n requires_contract?: ContractId;\n spec_reference?: string;\n}\n\nexport type Vector = PositiveVector | NegativeVector;\n\nexport interface TestKeypair {\n kid: string;\n kty: string;\n crv?: string;\n alg?: string;\n use?: string;\n key_ops?: string[];\n adcp_use?: string;\n x?: string;\n y?: string;\n /** base64url-encoded private scalar, published only in test-vector keys.json. */\n private_d: string;\n}\n\nexport interface TestKeyset {\n keys: TestKeypair[];\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAIO,MAAM,eAAe,CAAC,iBAAiB,cAAc,YAAY;","names":[]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/lib/testing/storyboard/request-signing/types.ts"],"sourcesContent":["import type { RequestLike } from '../../../signing';\nimport type { RequestSignatureErrorCode } from '../../../signing';\n\n/** Stateful-vector contracts declared in `test-kits/signed-requests-runner.yaml`. */\nexport const CONTRACT_IDS = ['replay_window', 'revocation', 'rate_abuse'] as const;\nexport type ContractId = (typeof CONTRACT_IDS)[number];\n\nexport interface VectorRequest extends RequestLike {\n method: string;\n url: string;\n headers: Record<string, string>;\n body?: string;\n}\n\nexport interface VerifierCapabilityFixture {\n supported: boolean;\n covers_content_digest: 'required' | 'forbidden' | 'either';\n required_for: string[];\n supported_for?: string[];\n /**\n * JSON-RPC protocol-method coverage (e.g. `tasks/cancel`, `tasks/get`) —\n * separate namespace from `required_for` / `supported_for` (which carry\n * AdCP tool names). Introduced in adcp#4326. Vectors targeting protocol\n * methods (e.g. negative/028) populate these; vectors targeting AdCP tools\n * leave them undefined.\n */\n protocol_methods_supported_for?: string[];\n protocol_methods_required_for?: string[];\n}\n\n/**\n * Inline JWK set shipped with a negative vector that wants to publish a\n * deliberately-malformed JWK (e.g., vector 025 declares alg=EdDSA but\n * crv=P-256 to exercise step-8 parameter consistency). Using `jwks_override`\n * instead of adding a malformed key to `keys.json` keeps the canonical\n * keyset clean so other vectors can't inherit the broken shape.\n * Mutually exclusive with `jwks_ref`.\n */\nexport interface JwksOverride {\n keys: Array<Record<string, unknown>>;\n}\n\nexport interface PositiveVector {\n kind: 'positive';\n id: string;\n name: string;\n reference_now: number;\n request: VectorRequest;\n verifier_capability: VerifierCapabilityFixture;\n jwks_ref?: string[];\n jwks_override?: JwksOverride;\n expected_signature_base?: string;\n spec_reference?: string;\n}\n\nexport interface NegativeVector {\n kind: 'negative';\n id: string;\n name: string;\n reference_now: number;\n request: VectorRequest;\n verifier_capability: VerifierCapabilityFixture;\n jwks_ref?: string[];\n jwks_override?: JwksOverride;\n expected_error_code: RequestSignatureErrorCode;\n expected_failed_step: number | string;\n requires_contract?: ContractId;\n spec_reference?: string;\n}\n\nexport type Vector = PositiveVector | NegativeVector;\n\nexport interface TestKeypair {\n kid: string;\n kty: string;\n crv?: string;\n alg?: string;\n use?: string;\n key_ops?: string[];\n adcp_use?: string;\n x?: string;\n y?: string;\n /** base64url-encoded private scalar, published only in test-vector keys.json. */\n private_d: string;\n}\n\nexport interface TestKeyset {\n keys: TestKeypair[];\n}\n"],"mappings":"AAIO,MAAM,eAAe,CAAC,iBAAiB,cAAc,YAAY;","names":[]}
1
+ {"version":3,"sources":["../../../../../src/lib/testing/storyboard/request-signing/types.ts"],"sourcesContent":["import type { RequestLike } from '../../../signing';\nimport type { RequestSignatureErrorCode } from '../../../signing';\n\n/** Stateful-vector contracts declared in `test-kits/signed-requests-runner.yaml`. */\nexport const CONTRACT_IDS = ['replay_window', 'revocation', 'rate_abuse'] as const;\nexport type ContractId = (typeof CONTRACT_IDS)[number];\n\nexport interface VectorRequest extends RequestLike {\n method: string;\n url: string;\n headers: Record<string, string>;\n body?: string;\n}\n\nexport interface VerifierCapabilityFixture {\n supported: boolean;\n covers_content_digest: 'required' | 'forbidden' | 'either';\n required_for: string[];\n supported_for?: string[];\n /**\n * JSON-RPC protocol-method coverage (e.g. `tasks/cancel`, `tasks/get`) —\n * separate namespace from `required_for` / `supported_for` (which carry\n * AdCP tool names). Introduced in adcp#4326. Vectors targeting protocol\n * methods (e.g. negative/028) populate these; vectors targeting AdCP tools\n * leave them undefined.\n */\n protocol_methods_supported_for?: string[];\n protocol_methods_warn_for?: string[];\n protocol_methods_required_for?: string[];\n}\n\n/**\n * Inline JWK set shipped with a negative vector that wants to publish a\n * deliberately-malformed JWK (e.g., vector 025 declares alg=EdDSA but\n * crv=P-256 to exercise step-8 parameter consistency). Using `jwks_override`\n * instead of adding a malformed key to `keys.json` keeps the canonical\n * keyset clean so other vectors can't inherit the broken shape.\n * Mutually exclusive with `jwks_ref`.\n */\nexport interface JwksOverride {\n keys: Array<Record<string, unknown>>;\n}\n\nexport interface PositiveVector {\n kind: 'positive';\n id: string;\n name: string;\n reference_now: number;\n request: VectorRequest;\n verifier_capability: VerifierCapabilityFixture;\n jwks_ref?: string[];\n jwks_override?: JwksOverride;\n expected_signature_base?: string;\n spec_reference?: string;\n}\n\nexport interface NegativeVector {\n kind: 'negative';\n id: string;\n name: string;\n reference_now: number;\n request: VectorRequest;\n verifier_capability: VerifierCapabilityFixture;\n jwks_ref?: string[];\n jwks_override?: JwksOverride;\n expected_error_code: RequestSignatureErrorCode;\n expected_failed_step: number | string;\n requires_contract?: ContractId;\n spec_reference?: string;\n}\n\nexport type Vector = PositiveVector | NegativeVector;\n\nexport interface TestKeypair {\n kid: string;\n kty: string;\n crv?: string;\n alg?: string;\n use?: string;\n key_ops?: string[];\n adcp_use?: string;\n x?: string;\n y?: string;\n /** base64url-encoded private scalar, published only in test-vector keys.json. */\n private_d: string;\n}\n\nexport interface TestKeyset {\n keys: TestKeypair[];\n}\n"],"mappings":"AAIO,MAAM,eAAe,CAAC,iBAAiB,cAAc,YAAY;","names":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"vector-loader.d.ts","sourceRoot":"","sources":["../../../../../src/lib/testing/storyboard/request-signing/vector-loader.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAc,cAAc,EAAE,cAAc,EAAE,WAAW,EAAE,UAAU,EAAU,MAAM,SAAS,CAAC;AAE3G,MAAM,WAAW,kBAAkB;IACjC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,cAAc,EAAE,CAAC;IAC3B,QAAQ,EAAE,cAAc,EAAE,CAAC;IAC3B,IAAI,EAAE,UAAU,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB;AA8BD,wBAAgB,yBAAyB,CAAC,OAAO,GAAE,kBAAuB,GAAG,aAAa,CAoBzF;AAED,8EAA8E;AAC9E,wBAAgB,kBAAkB,IAAI,IAAI,CAEzC;AAiLD,wBAAgB,OAAO,CAAC,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,GAAG,WAAW,CAQpE"}
1
+ {"version":3,"file":"vector-loader.d.ts","sourceRoot":"","sources":["../../../../../src/lib/testing/storyboard/request-signing/vector-loader.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAc,cAAc,EAAE,cAAc,EAAE,WAAW,EAAE,UAAU,EAAU,MAAM,SAAS,CAAC;AAE3G,MAAM,WAAW,kBAAkB;IACjC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,cAAc,EAAE,CAAC;IAC3B,QAAQ,EAAE,cAAc,EAAE,CAAC;IAC3B,IAAI,EAAE,UAAU,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB;AA8BD,wBAAgB,yBAAyB,CAAC,OAAO,GAAE,kBAAuB,GAAG,aAAa,CAoBzF;AAED,8EAA8E;AAC9E,wBAAgB,kBAAkB,IAAI,IAAI,CAEzC;AAoLD,wBAAgB,OAAO,CAAC,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,GAAG,WAAW,CAQpE"}
@@ -191,6 +191,7 @@ function parseCapability(id, raw) {
191
191
  required_for: strArray(r.required_for, `${id}.verifier_capability.required_for`),
192
192
  supported_for: Array.isArray(r.supported_for) ? r.supported_for : void 0,
193
193
  protocol_methods_supported_for: Array.isArray(r.protocol_methods_supported_for) ? r.protocol_methods_supported_for : void 0,
194
+ protocol_methods_warn_for: Array.isArray(r.protocol_methods_warn_for) ? r.protocol_methods_warn_for : void 0,
194
195
  protocol_methods_required_for: Array.isArray(r.protocol_methods_required_for) ? r.protocol_methods_required_for : void 0
195
196
  };
196
197
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/lib/testing/storyboard/request-signing/vector-loader.ts"],"sourcesContent":["import { existsSync, readFileSync, readdirSync } from 'fs';\nimport { basename, join } from 'path';\nimport { getComplianceCacheDir } from '../compliance';\nimport type { RequestSignatureErrorCode } from '../../../signing';\nimport { CONTRACT_IDS } from './types';\nimport type { ContractId, NegativeVector, PositiveVector, TestKeypair, TestKeyset, Vector } from './types';\n\nexport interface LoadVectorsOptions {\n complianceDir?: string;\n version?: string;\n}\n\nexport interface LoadedVectors {\n positive: PositiveVector[];\n negative: NegativeVector[];\n keys: TestKeyset;\n sourceDir: string;\n}\n\nconst ERROR_CODES: ReadonlySet<string> = new Set([\n 'request_signature_required',\n 'request_signature_header_malformed',\n 'request_signature_params_incomplete',\n 'request_signature_tag_invalid',\n 'request_signature_alg_not_allowed',\n 'request_signature_window_invalid',\n 'request_signature_components_incomplete',\n 'request_signature_components_unexpected',\n 'request_signature_key_unknown',\n 'request_signature_key_purpose_invalid',\n 'request_signature_key_revoked',\n 'request_signature_invalid',\n 'request_signature_digest_mismatch',\n 'request_signature_replayed',\n 'request_signature_rate_abuse',\n]);\n\nconst CONTRACT_ID_SET: ReadonlySet<string> = new Set(CONTRACT_IDS);\n\n// Memoized per sourceDir — loading 28 JSON fixtures + keys.json on every\n// per-vector call in the runner path added up (~28 disk reads × 2-3 storyboard\n// resolve calls per CLI run). Invariant: the compliance cache is immutable\n// during a process lifetime — `npm run sync-schemas` runs before the process,\n// never concurrently. Cache key is the absolute cacheDir so env-var overrides\n// don't poison the entry.\nconst VECTOR_CACHE = new Map<string, LoadedVectors>();\n\nexport function loadRequestSigningVectors(options: LoadVectorsOptions = {}): LoadedVectors {\n const cacheDir = getComplianceCacheDir(options);\n const sourceDir = join(cacheDir, 'test-vectors', 'request-signing');\n const cached = VECTOR_CACHE.get(sourceDir);\n if (cached) return cached;\n\n if (!existsSync(sourceDir)) {\n throw new Error(\n `Request-signing vectors not found at ${sourceDir}. Run \\`npm run sync-schemas\\` or check your ADCP_COMPLIANCE_DIR.`\n );\n }\n\n const loaded: LoadedVectors = {\n positive: loadDir(join(sourceDir, 'positive'), parsePositive),\n negative: loadDir(join(sourceDir, 'negative'), parseNegative),\n keys: loadKeys(join(sourceDir, 'keys.json')),\n sourceDir,\n };\n VECTOR_CACHE.set(sourceDir, loaded);\n return loaded;\n}\n\n/** Test-only: clear the memoization cache so a fresh cache path is reread. */\nexport function __resetVectorCache(): void {\n VECTOR_CACHE.clear();\n}\n\nfunction loadDir<T extends Vector>(dir: string, parse: (id: string, raw: unknown) => T): T[] {\n if (!existsSync(dir)) {\n throw new Error(`Vector directory missing: ${dir}`);\n }\n const files = readdirSync(dir)\n .filter(f => f.endsWith('.json'))\n .sort();\n return files.map(f => {\n const raw = JSON.parse(readFileSync(join(dir, f), 'utf-8'));\n return parse(vectorIdFromFilename(f), raw);\n });\n}\n\nfunction vectorIdFromFilename(file: string): string {\n return basename(file, '.json');\n}\n\nfunction parsePositive(id: string, raw: unknown): PositiveVector {\n const r = raw as Record<string, unknown>;\n assertSuccess(id, r, true);\n const { jwks_ref, jwks_override } = parseJwksSelector(id, r);\n return {\n kind: 'positive',\n id,\n name: str(r.name, `${id}.name`),\n reference_now: num(r.reference_now, `${id}.reference_now`),\n request: parseRequest(id, r.request),\n verifier_capability: parseCapability(id, r.verifier_capability),\n jwks_ref,\n jwks_override,\n expected_signature_base: typeof r.expected_signature_base === 'string' ? r.expected_signature_base : undefined,\n spec_reference: typeof r.spec_reference === 'string' ? r.spec_reference : undefined,\n };\n}\n\nfunction parseNegative(id: string, raw: unknown): NegativeVector {\n const r = raw as Record<string, unknown>;\n assertSuccess(id, r, false);\n const outcome = r.expected_outcome as Record<string, unknown>;\n const errorCode = str(outcome.error_code, `${id}.expected_outcome.error_code`);\n if (!ERROR_CODES.has(errorCode)) {\n throw new Error(`${id}: unknown expected_outcome.error_code \"${errorCode}\" (spec drift?)`);\n }\n const failedStep = outcome.failed_step;\n if (typeof failedStep !== 'number' && typeof failedStep !== 'string') {\n throw new Error(`${id}: expected_outcome.failed_step must be number or string`);\n }\n let contract: ContractId | undefined;\n if (r.requires_contract !== undefined) {\n const c = str(r.requires_contract, `${id}.requires_contract`);\n if (!CONTRACT_ID_SET.has(c)) {\n throw new Error(`${id}: unknown requires_contract \"${c}\" (spec drift?)`);\n }\n contract = c as ContractId;\n }\n const { jwks_ref, jwks_override } = parseJwksSelector(id, r);\n return {\n kind: 'negative',\n id,\n name: str(r.name, `${id}.name`),\n reference_now: num(r.reference_now, `${id}.reference_now`),\n request: parseRequest(id, r.request),\n verifier_capability: parseCapability(id, r.verifier_capability),\n jwks_ref,\n jwks_override,\n expected_error_code: errorCode as RequestSignatureErrorCode,\n expected_failed_step: failedStep,\n requires_contract: contract,\n spec_reference: typeof r.spec_reference === 'string' ? r.spec_reference : undefined,\n };\n}\n\nfunction parseJwksSelector(\n id: string,\n r: Record<string, unknown>\n): { jwks_ref?: string[]; jwks_override?: { keys: Array<Record<string, unknown>> } } {\n const hasRef = r.jwks_ref !== undefined;\n const hasOverride = r.jwks_override !== undefined;\n if (hasRef && hasOverride) {\n throw new Error(`${id}: jwks_ref and jwks_override are mutually exclusive`);\n }\n if (!hasRef && !hasOverride) {\n throw new Error(`${id}: must declare either jwks_ref or jwks_override`);\n }\n if (hasOverride) {\n const override = r.jwks_override as Record<string, unknown>;\n const keys = override.keys;\n if (!Array.isArray(keys) || keys.length === 0) {\n throw new Error(`${id}.jwks_override.keys must be a non-empty array`);\n }\n for (const k of keys) {\n if (!k || typeof k !== 'object') {\n throw new Error(`${id}.jwks_override.keys[] entries must be objects`);\n }\n }\n return { jwks_override: { keys: keys as Array<Record<string, unknown>> } };\n }\n return { jwks_ref: strArray(r.jwks_ref, `${id}.jwks_ref`) };\n}\n\nfunction assertSuccess(id: string, vector: Record<string, unknown>, expected: boolean): void {\n const outcome = vector.expected_outcome as Record<string, unknown> | undefined;\n if (!outcome || outcome.success !== expected) {\n throw new Error(\n `${id}: expected_outcome.success must be ${expected} for ${expected ? 'positive' : 'negative'} vector`\n );\n }\n}\n\nfunction parseRequest(id: string, raw: unknown): PositiveVector['request'] {\n const r = raw as Record<string, unknown> | undefined;\n if (!r) throw new Error(`${id}.request missing`);\n const headers = r.headers as Record<string, string> | undefined;\n if (!headers) throw new Error(`${id}.request.headers missing`);\n return {\n method: str(r.method, `${id}.request.method`),\n url: str(r.url, `${id}.request.url`),\n headers: { ...headers },\n body: typeof r.body === 'string' ? r.body : undefined,\n };\n}\n\nfunction parseCapability(id: string, raw: unknown): PositiveVector['verifier_capability'] {\n const r = raw as Record<string, unknown> | undefined;\n if (!r) throw new Error(`${id}.verifier_capability missing`);\n const digest = str(r.covers_content_digest, `${id}.verifier_capability.covers_content_digest`);\n if (digest !== 'required' && digest !== 'forbidden' && digest !== 'either') {\n throw new Error(`${id}: invalid covers_content_digest \"${digest}\"`);\n }\n return {\n supported: bool(r.supported, `${id}.verifier_capability.supported`),\n covers_content_digest: digest,\n required_for: strArray(r.required_for, `${id}.verifier_capability.required_for`),\n supported_for: Array.isArray(r.supported_for) ? (r.supported_for as string[]) : undefined,\n protocol_methods_supported_for: Array.isArray(r.protocol_methods_supported_for)\n ? (r.protocol_methods_supported_for as string[])\n : undefined,\n protocol_methods_required_for: Array.isArray(r.protocol_methods_required_for)\n ? (r.protocol_methods_required_for as string[])\n : undefined,\n };\n}\n\nfunction loadKeys(keysPath: string): TestKeyset {\n if (!existsSync(keysPath)) {\n throw new Error(`keys.json missing at ${keysPath}`);\n }\n const raw = JSON.parse(readFileSync(keysPath, 'utf-8')) as { keys?: unknown };\n if (!Array.isArray(raw.keys)) {\n throw new Error(`keys.json must contain a \"keys\" array`);\n }\n return { keys: raw.keys.map((k, i) => parseKey(i, k)) };\n}\n\nfunction parseKey(index: number, raw: unknown): TestKeypair {\n const r = raw as Record<string, unknown>;\n const where = `keys.json[${index}]`;\n const privateD = r._private_d_for_test_only;\n if (typeof privateD !== 'string' || privateD.length === 0) {\n throw new Error(`${where}._private_d_for_test_only missing (required for dynamic signing)`);\n }\n return {\n kid: str(r.kid, `${where}.kid`),\n kty: str(r.kty, `${where}.kty`),\n crv: typeof r.crv === 'string' ? r.crv : undefined,\n alg: typeof r.alg === 'string' ? r.alg : undefined,\n use: typeof r.use === 'string' ? r.use : undefined,\n key_ops: Array.isArray(r.key_ops) ? (r.key_ops as string[]) : undefined,\n adcp_use: typeof r.adcp_use === 'string' ? r.adcp_use : undefined,\n x: typeof r.x === 'string' ? r.x : undefined,\n y: typeof r.y === 'string' ? r.y : undefined,\n private_d: privateD,\n };\n}\n\nexport function findKey(keyset: TestKeyset, kid: string): TestKeypair {\n const match = keyset.keys.find(k => k.kid === kid);\n if (!match) {\n throw new Error(\n `No test keypair with kid=\"${kid}\" in keys.json (available: ${keyset.keys.map(k => k.kid).join(', ')})`\n );\n }\n return match;\n}\n\nfunction str(v: unknown, where: string): string {\n if (typeof v !== 'string') throw new Error(`${where} must be string`);\n return v;\n}\n\nfunction num(v: unknown, where: string): number {\n if (typeof v !== 'number') throw new Error(`${where} must be number`);\n return v;\n}\n\nfunction bool(v: unknown, where: string): boolean {\n if (typeof v !== 'boolean') throw new Error(`${where} must be boolean`);\n return v;\n}\n\nfunction strArray(v: unknown, where: string): string[] {\n if (!Array.isArray(v) || v.some(item => typeof item !== 'string')) {\n throw new Error(`${where} must be string[]`);\n }\n return v as string[];\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../../../src/lib/testing/storyboard/request-signing/vector-loader.ts"],"sourcesContent":["import { existsSync, readFileSync, readdirSync } from 'fs';\nimport { basename, join } from 'path';\nimport { getComplianceCacheDir } from '../compliance';\nimport type { RequestSignatureErrorCode } from '../../../signing';\nimport { CONTRACT_IDS } from './types';\nimport type { ContractId, NegativeVector, PositiveVector, TestKeypair, TestKeyset, Vector } from './types';\n\nexport interface LoadVectorsOptions {\n complianceDir?: string;\n version?: string;\n}\n\nexport interface LoadedVectors {\n positive: PositiveVector[];\n negative: NegativeVector[];\n keys: TestKeyset;\n sourceDir: string;\n}\n\nconst ERROR_CODES: ReadonlySet<string> = new Set([\n 'request_signature_required',\n 'request_signature_header_malformed',\n 'request_signature_params_incomplete',\n 'request_signature_tag_invalid',\n 'request_signature_alg_not_allowed',\n 'request_signature_window_invalid',\n 'request_signature_components_incomplete',\n 'request_signature_components_unexpected',\n 'request_signature_key_unknown',\n 'request_signature_key_purpose_invalid',\n 'request_signature_key_revoked',\n 'request_signature_invalid',\n 'request_signature_digest_mismatch',\n 'request_signature_replayed',\n 'request_signature_rate_abuse',\n]);\n\nconst CONTRACT_ID_SET: ReadonlySet<string> = new Set(CONTRACT_IDS);\n\n// Memoized per sourceDir — loading 28 JSON fixtures + keys.json on every\n// per-vector call in the runner path added up (~28 disk reads × 2-3 storyboard\n// resolve calls per CLI run). Invariant: the compliance cache is immutable\n// during a process lifetime — `npm run sync-schemas` runs before the process,\n// never concurrently. Cache key is the absolute cacheDir so env-var overrides\n// don't poison the entry.\nconst VECTOR_CACHE = new Map<string, LoadedVectors>();\n\nexport function loadRequestSigningVectors(options: LoadVectorsOptions = {}): LoadedVectors {\n const cacheDir = getComplianceCacheDir(options);\n const sourceDir = join(cacheDir, 'test-vectors', 'request-signing');\n const cached = VECTOR_CACHE.get(sourceDir);\n if (cached) return cached;\n\n if (!existsSync(sourceDir)) {\n throw new Error(\n `Request-signing vectors not found at ${sourceDir}. Run \\`npm run sync-schemas\\` or check your ADCP_COMPLIANCE_DIR.`\n );\n }\n\n const loaded: LoadedVectors = {\n positive: loadDir(join(sourceDir, 'positive'), parsePositive),\n negative: loadDir(join(sourceDir, 'negative'), parseNegative),\n keys: loadKeys(join(sourceDir, 'keys.json')),\n sourceDir,\n };\n VECTOR_CACHE.set(sourceDir, loaded);\n return loaded;\n}\n\n/** Test-only: clear the memoization cache so a fresh cache path is reread. */\nexport function __resetVectorCache(): void {\n VECTOR_CACHE.clear();\n}\n\nfunction loadDir<T extends Vector>(dir: string, parse: (id: string, raw: unknown) => T): T[] {\n if (!existsSync(dir)) {\n throw new Error(`Vector directory missing: ${dir}`);\n }\n const files = readdirSync(dir)\n .filter(f => f.endsWith('.json'))\n .sort();\n return files.map(f => {\n const raw = JSON.parse(readFileSync(join(dir, f), 'utf-8'));\n return parse(vectorIdFromFilename(f), raw);\n });\n}\n\nfunction vectorIdFromFilename(file: string): string {\n return basename(file, '.json');\n}\n\nfunction parsePositive(id: string, raw: unknown): PositiveVector {\n const r = raw as Record<string, unknown>;\n assertSuccess(id, r, true);\n const { jwks_ref, jwks_override } = parseJwksSelector(id, r);\n return {\n kind: 'positive',\n id,\n name: str(r.name, `${id}.name`),\n reference_now: num(r.reference_now, `${id}.reference_now`),\n request: parseRequest(id, r.request),\n verifier_capability: parseCapability(id, r.verifier_capability),\n jwks_ref,\n jwks_override,\n expected_signature_base: typeof r.expected_signature_base === 'string' ? r.expected_signature_base : undefined,\n spec_reference: typeof r.spec_reference === 'string' ? r.spec_reference : undefined,\n };\n}\n\nfunction parseNegative(id: string, raw: unknown): NegativeVector {\n const r = raw as Record<string, unknown>;\n assertSuccess(id, r, false);\n const outcome = r.expected_outcome as Record<string, unknown>;\n const errorCode = str(outcome.error_code, `${id}.expected_outcome.error_code`);\n if (!ERROR_CODES.has(errorCode)) {\n throw new Error(`${id}: unknown expected_outcome.error_code \"${errorCode}\" (spec drift?)`);\n }\n const failedStep = outcome.failed_step;\n if (typeof failedStep !== 'number' && typeof failedStep !== 'string') {\n throw new Error(`${id}: expected_outcome.failed_step must be number or string`);\n }\n let contract: ContractId | undefined;\n if (r.requires_contract !== undefined) {\n const c = str(r.requires_contract, `${id}.requires_contract`);\n if (!CONTRACT_ID_SET.has(c)) {\n throw new Error(`${id}: unknown requires_contract \"${c}\" (spec drift?)`);\n }\n contract = c as ContractId;\n }\n const { jwks_ref, jwks_override } = parseJwksSelector(id, r);\n return {\n kind: 'negative',\n id,\n name: str(r.name, `${id}.name`),\n reference_now: num(r.reference_now, `${id}.reference_now`),\n request: parseRequest(id, r.request),\n verifier_capability: parseCapability(id, r.verifier_capability),\n jwks_ref,\n jwks_override,\n expected_error_code: errorCode as RequestSignatureErrorCode,\n expected_failed_step: failedStep,\n requires_contract: contract,\n spec_reference: typeof r.spec_reference === 'string' ? r.spec_reference : undefined,\n };\n}\n\nfunction parseJwksSelector(\n id: string,\n r: Record<string, unknown>\n): { jwks_ref?: string[]; jwks_override?: { keys: Array<Record<string, unknown>> } } {\n const hasRef = r.jwks_ref !== undefined;\n const hasOverride = r.jwks_override !== undefined;\n if (hasRef && hasOverride) {\n throw new Error(`${id}: jwks_ref and jwks_override are mutually exclusive`);\n }\n if (!hasRef && !hasOverride) {\n throw new Error(`${id}: must declare either jwks_ref or jwks_override`);\n }\n if (hasOverride) {\n const override = r.jwks_override as Record<string, unknown>;\n const keys = override.keys;\n if (!Array.isArray(keys) || keys.length === 0) {\n throw new Error(`${id}.jwks_override.keys must be a non-empty array`);\n }\n for (const k of keys) {\n if (!k || typeof k !== 'object') {\n throw new Error(`${id}.jwks_override.keys[] entries must be objects`);\n }\n }\n return { jwks_override: { keys: keys as Array<Record<string, unknown>> } };\n }\n return { jwks_ref: strArray(r.jwks_ref, `${id}.jwks_ref`) };\n}\n\nfunction assertSuccess(id: string, vector: Record<string, unknown>, expected: boolean): void {\n const outcome = vector.expected_outcome as Record<string, unknown> | undefined;\n if (!outcome || outcome.success !== expected) {\n throw new Error(\n `${id}: expected_outcome.success must be ${expected} for ${expected ? 'positive' : 'negative'} vector`\n );\n }\n}\n\nfunction parseRequest(id: string, raw: unknown): PositiveVector['request'] {\n const r = raw as Record<string, unknown> | undefined;\n if (!r) throw new Error(`${id}.request missing`);\n const headers = r.headers as Record<string, string> | undefined;\n if (!headers) throw new Error(`${id}.request.headers missing`);\n return {\n method: str(r.method, `${id}.request.method`),\n url: str(r.url, `${id}.request.url`),\n headers: { ...headers },\n body: typeof r.body === 'string' ? r.body : undefined,\n };\n}\n\nfunction parseCapability(id: string, raw: unknown): PositiveVector['verifier_capability'] {\n const r = raw as Record<string, unknown> | undefined;\n if (!r) throw new Error(`${id}.verifier_capability missing`);\n const digest = str(r.covers_content_digest, `${id}.verifier_capability.covers_content_digest`);\n if (digest !== 'required' && digest !== 'forbidden' && digest !== 'either') {\n throw new Error(`${id}: invalid covers_content_digest \"${digest}\"`);\n }\n return {\n supported: bool(r.supported, `${id}.verifier_capability.supported`),\n covers_content_digest: digest,\n required_for: strArray(r.required_for, `${id}.verifier_capability.required_for`),\n supported_for: Array.isArray(r.supported_for) ? (r.supported_for as string[]) : undefined,\n protocol_methods_supported_for: Array.isArray(r.protocol_methods_supported_for)\n ? (r.protocol_methods_supported_for as string[])\n : undefined,\n protocol_methods_warn_for: Array.isArray(r.protocol_methods_warn_for)\n ? (r.protocol_methods_warn_for as string[])\n : undefined,\n protocol_methods_required_for: Array.isArray(r.protocol_methods_required_for)\n ? (r.protocol_methods_required_for as string[])\n : undefined,\n };\n}\n\nfunction loadKeys(keysPath: string): TestKeyset {\n if (!existsSync(keysPath)) {\n throw new Error(`keys.json missing at ${keysPath}`);\n }\n const raw = JSON.parse(readFileSync(keysPath, 'utf-8')) as { keys?: unknown };\n if (!Array.isArray(raw.keys)) {\n throw new Error(`keys.json must contain a \"keys\" array`);\n }\n return { keys: raw.keys.map((k, i) => parseKey(i, k)) };\n}\n\nfunction parseKey(index: number, raw: unknown): TestKeypair {\n const r = raw as Record<string, unknown>;\n const where = `keys.json[${index}]`;\n const privateD = r._private_d_for_test_only;\n if (typeof privateD !== 'string' || privateD.length === 0) {\n throw new Error(`${where}._private_d_for_test_only missing (required for dynamic signing)`);\n }\n return {\n kid: str(r.kid, `${where}.kid`),\n kty: str(r.kty, `${where}.kty`),\n crv: typeof r.crv === 'string' ? r.crv : undefined,\n alg: typeof r.alg === 'string' ? r.alg : undefined,\n use: typeof r.use === 'string' ? r.use : undefined,\n key_ops: Array.isArray(r.key_ops) ? (r.key_ops as string[]) : undefined,\n adcp_use: typeof r.adcp_use === 'string' ? r.adcp_use : undefined,\n x: typeof r.x === 'string' ? r.x : undefined,\n y: typeof r.y === 'string' ? r.y : undefined,\n private_d: privateD,\n };\n}\n\nexport function findKey(keyset: TestKeyset, kid: string): TestKeypair {\n const match = keyset.keys.find(k => k.kid === kid);\n if (!match) {\n throw new Error(\n `No test keypair with kid=\"${kid}\" in keys.json (available: ${keyset.keys.map(k => k.kid).join(', ')})`\n );\n }\n return match;\n}\n\nfunction str(v: unknown, where: string): string {\n if (typeof v !== 'string') throw new Error(`${where} must be string`);\n return v;\n}\n\nfunction num(v: unknown, where: string): number {\n if (typeof v !== 'number') throw new Error(`${where} must be number`);\n return v;\n}\n\nfunction bool(v: unknown, where: string): boolean {\n if (typeof v !== 'boolean') throw new Error(`${where} must be boolean`);\n return v;\n}\n\nfunction strArray(v: unknown, where: string): string[] {\n if (!Array.isArray(v) || v.some(item => typeof item !== 'string')) {\n throw new Error(`${where} must be string[]`);\n }\n return v as string[];\n}\n"],"mappings":"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","names":[]}
@@ -166,6 +166,7 @@ function parseCapability(id, raw) {
166
166
  required_for: strArray(r.required_for, `${id}.verifier_capability.required_for`),
167
167
  supported_for: Array.isArray(r.supported_for) ? r.supported_for : void 0,
168
168
  protocol_methods_supported_for: Array.isArray(r.protocol_methods_supported_for) ? r.protocol_methods_supported_for : void 0,
169
+ protocol_methods_warn_for: Array.isArray(r.protocol_methods_warn_for) ? r.protocol_methods_warn_for : void 0,
169
170
  protocol_methods_required_for: Array.isArray(r.protocol_methods_required_for) ? r.protocol_methods_required_for : void 0
170
171
  };
171
172
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/lib/testing/storyboard/request-signing/vector-loader.ts"],"sourcesContent":["import { existsSync, readFileSync, readdirSync } from 'fs';\nimport { basename, join } from 'path';\nimport { getComplianceCacheDir } from '../compliance';\nimport type { RequestSignatureErrorCode } from '../../../signing';\nimport { CONTRACT_IDS } from './types';\nimport type { ContractId, NegativeVector, PositiveVector, TestKeypair, TestKeyset, Vector } from './types';\n\nexport interface LoadVectorsOptions {\n complianceDir?: string;\n version?: string;\n}\n\nexport interface LoadedVectors {\n positive: PositiveVector[];\n negative: NegativeVector[];\n keys: TestKeyset;\n sourceDir: string;\n}\n\nconst ERROR_CODES: ReadonlySet<string> = new Set([\n 'request_signature_required',\n 'request_signature_header_malformed',\n 'request_signature_params_incomplete',\n 'request_signature_tag_invalid',\n 'request_signature_alg_not_allowed',\n 'request_signature_window_invalid',\n 'request_signature_components_incomplete',\n 'request_signature_components_unexpected',\n 'request_signature_key_unknown',\n 'request_signature_key_purpose_invalid',\n 'request_signature_key_revoked',\n 'request_signature_invalid',\n 'request_signature_digest_mismatch',\n 'request_signature_replayed',\n 'request_signature_rate_abuse',\n]);\n\nconst CONTRACT_ID_SET: ReadonlySet<string> = new Set(CONTRACT_IDS);\n\n// Memoized per sourceDir — loading 28 JSON fixtures + keys.json on every\n// per-vector call in the runner path added up (~28 disk reads × 2-3 storyboard\n// resolve calls per CLI run). Invariant: the compliance cache is immutable\n// during a process lifetime — `npm run sync-schemas` runs before the process,\n// never concurrently. Cache key is the absolute cacheDir so env-var overrides\n// don't poison the entry.\nconst VECTOR_CACHE = new Map<string, LoadedVectors>();\n\nexport function loadRequestSigningVectors(options: LoadVectorsOptions = {}): LoadedVectors {\n const cacheDir = getComplianceCacheDir(options);\n const sourceDir = join(cacheDir, 'test-vectors', 'request-signing');\n const cached = VECTOR_CACHE.get(sourceDir);\n if (cached) return cached;\n\n if (!existsSync(sourceDir)) {\n throw new Error(\n `Request-signing vectors not found at ${sourceDir}. Run \\`npm run sync-schemas\\` or check your ADCP_COMPLIANCE_DIR.`\n );\n }\n\n const loaded: LoadedVectors = {\n positive: loadDir(join(sourceDir, 'positive'), parsePositive),\n negative: loadDir(join(sourceDir, 'negative'), parseNegative),\n keys: loadKeys(join(sourceDir, 'keys.json')),\n sourceDir,\n };\n VECTOR_CACHE.set(sourceDir, loaded);\n return loaded;\n}\n\n/** Test-only: clear the memoization cache so a fresh cache path is reread. */\nexport function __resetVectorCache(): void {\n VECTOR_CACHE.clear();\n}\n\nfunction loadDir<T extends Vector>(dir: string, parse: (id: string, raw: unknown) => T): T[] {\n if (!existsSync(dir)) {\n throw new Error(`Vector directory missing: ${dir}`);\n }\n const files = readdirSync(dir)\n .filter(f => f.endsWith('.json'))\n .sort();\n return files.map(f => {\n const raw = JSON.parse(readFileSync(join(dir, f), 'utf-8'));\n return parse(vectorIdFromFilename(f), raw);\n });\n}\n\nfunction vectorIdFromFilename(file: string): string {\n return basename(file, '.json');\n}\n\nfunction parsePositive(id: string, raw: unknown): PositiveVector {\n const r = raw as Record<string, unknown>;\n assertSuccess(id, r, true);\n const { jwks_ref, jwks_override } = parseJwksSelector(id, r);\n return {\n kind: 'positive',\n id,\n name: str(r.name, `${id}.name`),\n reference_now: num(r.reference_now, `${id}.reference_now`),\n request: parseRequest(id, r.request),\n verifier_capability: parseCapability(id, r.verifier_capability),\n jwks_ref,\n jwks_override,\n expected_signature_base: typeof r.expected_signature_base === 'string' ? r.expected_signature_base : undefined,\n spec_reference: typeof r.spec_reference === 'string' ? r.spec_reference : undefined,\n };\n}\n\nfunction parseNegative(id: string, raw: unknown): NegativeVector {\n const r = raw as Record<string, unknown>;\n assertSuccess(id, r, false);\n const outcome = r.expected_outcome as Record<string, unknown>;\n const errorCode = str(outcome.error_code, `${id}.expected_outcome.error_code`);\n if (!ERROR_CODES.has(errorCode)) {\n throw new Error(`${id}: unknown expected_outcome.error_code \"${errorCode}\" (spec drift?)`);\n }\n const failedStep = outcome.failed_step;\n if (typeof failedStep !== 'number' && typeof failedStep !== 'string') {\n throw new Error(`${id}: expected_outcome.failed_step must be number or string`);\n }\n let contract: ContractId | undefined;\n if (r.requires_contract !== undefined) {\n const c = str(r.requires_contract, `${id}.requires_contract`);\n if (!CONTRACT_ID_SET.has(c)) {\n throw new Error(`${id}: unknown requires_contract \"${c}\" (spec drift?)`);\n }\n contract = c as ContractId;\n }\n const { jwks_ref, jwks_override } = parseJwksSelector(id, r);\n return {\n kind: 'negative',\n id,\n name: str(r.name, `${id}.name`),\n reference_now: num(r.reference_now, `${id}.reference_now`),\n request: parseRequest(id, r.request),\n verifier_capability: parseCapability(id, r.verifier_capability),\n jwks_ref,\n jwks_override,\n expected_error_code: errorCode as RequestSignatureErrorCode,\n expected_failed_step: failedStep,\n requires_contract: contract,\n spec_reference: typeof r.spec_reference === 'string' ? r.spec_reference : undefined,\n };\n}\n\nfunction parseJwksSelector(\n id: string,\n r: Record<string, unknown>\n): { jwks_ref?: string[]; jwks_override?: { keys: Array<Record<string, unknown>> } } {\n const hasRef = r.jwks_ref !== undefined;\n const hasOverride = r.jwks_override !== undefined;\n if (hasRef && hasOverride) {\n throw new Error(`${id}: jwks_ref and jwks_override are mutually exclusive`);\n }\n if (!hasRef && !hasOverride) {\n throw new Error(`${id}: must declare either jwks_ref or jwks_override`);\n }\n if (hasOverride) {\n const override = r.jwks_override as Record<string, unknown>;\n const keys = override.keys;\n if (!Array.isArray(keys) || keys.length === 0) {\n throw new Error(`${id}.jwks_override.keys must be a non-empty array`);\n }\n for (const k of keys) {\n if (!k || typeof k !== 'object') {\n throw new Error(`${id}.jwks_override.keys[] entries must be objects`);\n }\n }\n return { jwks_override: { keys: keys as Array<Record<string, unknown>> } };\n }\n return { jwks_ref: strArray(r.jwks_ref, `${id}.jwks_ref`) };\n}\n\nfunction assertSuccess(id: string, vector: Record<string, unknown>, expected: boolean): void {\n const outcome = vector.expected_outcome as Record<string, unknown> | undefined;\n if (!outcome || outcome.success !== expected) {\n throw new Error(\n `${id}: expected_outcome.success must be ${expected} for ${expected ? 'positive' : 'negative'} vector`\n );\n }\n}\n\nfunction parseRequest(id: string, raw: unknown): PositiveVector['request'] {\n const r = raw as Record<string, unknown> | undefined;\n if (!r) throw new Error(`${id}.request missing`);\n const headers = r.headers as Record<string, string> | undefined;\n if (!headers) throw new Error(`${id}.request.headers missing`);\n return {\n method: str(r.method, `${id}.request.method`),\n url: str(r.url, `${id}.request.url`),\n headers: { ...headers },\n body: typeof r.body === 'string' ? r.body : undefined,\n };\n}\n\nfunction parseCapability(id: string, raw: unknown): PositiveVector['verifier_capability'] {\n const r = raw as Record<string, unknown> | undefined;\n if (!r) throw new Error(`${id}.verifier_capability missing`);\n const digest = str(r.covers_content_digest, `${id}.verifier_capability.covers_content_digest`);\n if (digest !== 'required' && digest !== 'forbidden' && digest !== 'either') {\n throw new Error(`${id}: invalid covers_content_digest \"${digest}\"`);\n }\n return {\n supported: bool(r.supported, `${id}.verifier_capability.supported`),\n covers_content_digest: digest,\n required_for: strArray(r.required_for, `${id}.verifier_capability.required_for`),\n supported_for: Array.isArray(r.supported_for) ? (r.supported_for as string[]) : undefined,\n protocol_methods_supported_for: Array.isArray(r.protocol_methods_supported_for)\n ? (r.protocol_methods_supported_for as string[])\n : undefined,\n protocol_methods_required_for: Array.isArray(r.protocol_methods_required_for)\n ? (r.protocol_methods_required_for as string[])\n : undefined,\n };\n}\n\nfunction loadKeys(keysPath: string): TestKeyset {\n if (!existsSync(keysPath)) {\n throw new Error(`keys.json missing at ${keysPath}`);\n }\n const raw = JSON.parse(readFileSync(keysPath, 'utf-8')) as { keys?: unknown };\n if (!Array.isArray(raw.keys)) {\n throw new Error(`keys.json must contain a \"keys\" array`);\n }\n return { keys: raw.keys.map((k, i) => parseKey(i, k)) };\n}\n\nfunction parseKey(index: number, raw: unknown): TestKeypair {\n const r = raw as Record<string, unknown>;\n const where = `keys.json[${index}]`;\n const privateD = r._private_d_for_test_only;\n if (typeof privateD !== 'string' || privateD.length === 0) {\n throw new Error(`${where}._private_d_for_test_only missing (required for dynamic signing)`);\n }\n return {\n kid: str(r.kid, `${where}.kid`),\n kty: str(r.kty, `${where}.kty`),\n crv: typeof r.crv === 'string' ? r.crv : undefined,\n alg: typeof r.alg === 'string' ? r.alg : undefined,\n use: typeof r.use === 'string' ? r.use : undefined,\n key_ops: Array.isArray(r.key_ops) ? (r.key_ops as string[]) : undefined,\n adcp_use: typeof r.adcp_use === 'string' ? r.adcp_use : undefined,\n x: typeof r.x === 'string' ? r.x : undefined,\n y: typeof r.y === 'string' ? r.y : undefined,\n private_d: privateD,\n };\n}\n\nexport function findKey(keyset: TestKeyset, kid: string): TestKeypair {\n const match = keyset.keys.find(k => k.kid === kid);\n if (!match) {\n throw new Error(\n `No test keypair with kid=\"${kid}\" in keys.json (available: ${keyset.keys.map(k => k.kid).join(', ')})`\n );\n }\n return match;\n}\n\nfunction str(v: unknown, where: string): string {\n if (typeof v !== 'string') throw new Error(`${where} must be string`);\n return v;\n}\n\nfunction num(v: unknown, where: string): number {\n if (typeof v !== 'number') throw new Error(`${where} must be number`);\n return v;\n}\n\nfunction bool(v: unknown, where: string): boolean {\n if (typeof v !== 'boolean') throw new Error(`${where} must be boolean`);\n return v;\n}\n\nfunction strArray(v: unknown, where: string): string[] {\n if (!Array.isArray(v) || v.some(item => typeof item !== 'string')) {\n throw new Error(`${where} must be string[]`);\n }\n return v as string[];\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../../../src/lib/testing/storyboard/request-signing/vector-loader.ts"],"sourcesContent":["import { existsSync, readFileSync, readdirSync } from 'fs';\nimport { basename, join } from 'path';\nimport { getComplianceCacheDir } from '../compliance';\nimport type { RequestSignatureErrorCode } from '../../../signing';\nimport { CONTRACT_IDS } from './types';\nimport type { ContractId, NegativeVector, PositiveVector, TestKeypair, TestKeyset, Vector } from './types';\n\nexport interface LoadVectorsOptions {\n complianceDir?: string;\n version?: string;\n}\n\nexport interface LoadedVectors {\n positive: PositiveVector[];\n negative: NegativeVector[];\n keys: TestKeyset;\n sourceDir: string;\n}\n\nconst ERROR_CODES: ReadonlySet<string> = new Set([\n 'request_signature_required',\n 'request_signature_header_malformed',\n 'request_signature_params_incomplete',\n 'request_signature_tag_invalid',\n 'request_signature_alg_not_allowed',\n 'request_signature_window_invalid',\n 'request_signature_components_incomplete',\n 'request_signature_components_unexpected',\n 'request_signature_key_unknown',\n 'request_signature_key_purpose_invalid',\n 'request_signature_key_revoked',\n 'request_signature_invalid',\n 'request_signature_digest_mismatch',\n 'request_signature_replayed',\n 'request_signature_rate_abuse',\n]);\n\nconst CONTRACT_ID_SET: ReadonlySet<string> = new Set(CONTRACT_IDS);\n\n// Memoized per sourceDir — loading 28 JSON fixtures + keys.json on every\n// per-vector call in the runner path added up (~28 disk reads × 2-3 storyboard\n// resolve calls per CLI run). Invariant: the compliance cache is immutable\n// during a process lifetime — `npm run sync-schemas` runs before the process,\n// never concurrently. Cache key is the absolute cacheDir so env-var overrides\n// don't poison the entry.\nconst VECTOR_CACHE = new Map<string, LoadedVectors>();\n\nexport function loadRequestSigningVectors(options: LoadVectorsOptions = {}): LoadedVectors {\n const cacheDir = getComplianceCacheDir(options);\n const sourceDir = join(cacheDir, 'test-vectors', 'request-signing');\n const cached = VECTOR_CACHE.get(sourceDir);\n if (cached) return cached;\n\n if (!existsSync(sourceDir)) {\n throw new Error(\n `Request-signing vectors not found at ${sourceDir}. Run \\`npm run sync-schemas\\` or check your ADCP_COMPLIANCE_DIR.`\n );\n }\n\n const loaded: LoadedVectors = {\n positive: loadDir(join(sourceDir, 'positive'), parsePositive),\n negative: loadDir(join(sourceDir, 'negative'), parseNegative),\n keys: loadKeys(join(sourceDir, 'keys.json')),\n sourceDir,\n };\n VECTOR_CACHE.set(sourceDir, loaded);\n return loaded;\n}\n\n/** Test-only: clear the memoization cache so a fresh cache path is reread. */\nexport function __resetVectorCache(): void {\n VECTOR_CACHE.clear();\n}\n\nfunction loadDir<T extends Vector>(dir: string, parse: (id: string, raw: unknown) => T): T[] {\n if (!existsSync(dir)) {\n throw new Error(`Vector directory missing: ${dir}`);\n }\n const files = readdirSync(dir)\n .filter(f => f.endsWith('.json'))\n .sort();\n return files.map(f => {\n const raw = JSON.parse(readFileSync(join(dir, f), 'utf-8'));\n return parse(vectorIdFromFilename(f), raw);\n });\n}\n\nfunction vectorIdFromFilename(file: string): string {\n return basename(file, '.json');\n}\n\nfunction parsePositive(id: string, raw: unknown): PositiveVector {\n const r = raw as Record<string, unknown>;\n assertSuccess(id, r, true);\n const { jwks_ref, jwks_override } = parseJwksSelector(id, r);\n return {\n kind: 'positive',\n id,\n name: str(r.name, `${id}.name`),\n reference_now: num(r.reference_now, `${id}.reference_now`),\n request: parseRequest(id, r.request),\n verifier_capability: parseCapability(id, r.verifier_capability),\n jwks_ref,\n jwks_override,\n expected_signature_base: typeof r.expected_signature_base === 'string' ? r.expected_signature_base : undefined,\n spec_reference: typeof r.spec_reference === 'string' ? r.spec_reference : undefined,\n };\n}\n\nfunction parseNegative(id: string, raw: unknown): NegativeVector {\n const r = raw as Record<string, unknown>;\n assertSuccess(id, r, false);\n const outcome = r.expected_outcome as Record<string, unknown>;\n const errorCode = str(outcome.error_code, `${id}.expected_outcome.error_code`);\n if (!ERROR_CODES.has(errorCode)) {\n throw new Error(`${id}: unknown expected_outcome.error_code \"${errorCode}\" (spec drift?)`);\n }\n const failedStep = outcome.failed_step;\n if (typeof failedStep !== 'number' && typeof failedStep !== 'string') {\n throw new Error(`${id}: expected_outcome.failed_step must be number or string`);\n }\n let contract: ContractId | undefined;\n if (r.requires_contract !== undefined) {\n const c = str(r.requires_contract, `${id}.requires_contract`);\n if (!CONTRACT_ID_SET.has(c)) {\n throw new Error(`${id}: unknown requires_contract \"${c}\" (spec drift?)`);\n }\n contract = c as ContractId;\n }\n const { jwks_ref, jwks_override } = parseJwksSelector(id, r);\n return {\n kind: 'negative',\n id,\n name: str(r.name, `${id}.name`),\n reference_now: num(r.reference_now, `${id}.reference_now`),\n request: parseRequest(id, r.request),\n verifier_capability: parseCapability(id, r.verifier_capability),\n jwks_ref,\n jwks_override,\n expected_error_code: errorCode as RequestSignatureErrorCode,\n expected_failed_step: failedStep,\n requires_contract: contract,\n spec_reference: typeof r.spec_reference === 'string' ? r.spec_reference : undefined,\n };\n}\n\nfunction parseJwksSelector(\n id: string,\n r: Record<string, unknown>\n): { jwks_ref?: string[]; jwks_override?: { keys: Array<Record<string, unknown>> } } {\n const hasRef = r.jwks_ref !== undefined;\n const hasOverride = r.jwks_override !== undefined;\n if (hasRef && hasOverride) {\n throw new Error(`${id}: jwks_ref and jwks_override are mutually exclusive`);\n }\n if (!hasRef && !hasOverride) {\n throw new Error(`${id}: must declare either jwks_ref or jwks_override`);\n }\n if (hasOverride) {\n const override = r.jwks_override as Record<string, unknown>;\n const keys = override.keys;\n if (!Array.isArray(keys) || keys.length === 0) {\n throw new Error(`${id}.jwks_override.keys must be a non-empty array`);\n }\n for (const k of keys) {\n if (!k || typeof k !== 'object') {\n throw new Error(`${id}.jwks_override.keys[] entries must be objects`);\n }\n }\n return { jwks_override: { keys: keys as Array<Record<string, unknown>> } };\n }\n return { jwks_ref: strArray(r.jwks_ref, `${id}.jwks_ref`) };\n}\n\nfunction assertSuccess(id: string, vector: Record<string, unknown>, expected: boolean): void {\n const outcome = vector.expected_outcome as Record<string, unknown> | undefined;\n if (!outcome || outcome.success !== expected) {\n throw new Error(\n `${id}: expected_outcome.success must be ${expected} for ${expected ? 'positive' : 'negative'} vector`\n );\n }\n}\n\nfunction parseRequest(id: string, raw: unknown): PositiveVector['request'] {\n const r = raw as Record<string, unknown> | undefined;\n if (!r) throw new Error(`${id}.request missing`);\n const headers = r.headers as Record<string, string> | undefined;\n if (!headers) throw new Error(`${id}.request.headers missing`);\n return {\n method: str(r.method, `${id}.request.method`),\n url: str(r.url, `${id}.request.url`),\n headers: { ...headers },\n body: typeof r.body === 'string' ? r.body : undefined,\n };\n}\n\nfunction parseCapability(id: string, raw: unknown): PositiveVector['verifier_capability'] {\n const r = raw as Record<string, unknown> | undefined;\n if (!r) throw new Error(`${id}.verifier_capability missing`);\n const digest = str(r.covers_content_digest, `${id}.verifier_capability.covers_content_digest`);\n if (digest !== 'required' && digest !== 'forbidden' && digest !== 'either') {\n throw new Error(`${id}: invalid covers_content_digest \"${digest}\"`);\n }\n return {\n supported: bool(r.supported, `${id}.verifier_capability.supported`),\n covers_content_digest: digest,\n required_for: strArray(r.required_for, `${id}.verifier_capability.required_for`),\n supported_for: Array.isArray(r.supported_for) ? (r.supported_for as string[]) : undefined,\n protocol_methods_supported_for: Array.isArray(r.protocol_methods_supported_for)\n ? (r.protocol_methods_supported_for as string[])\n : undefined,\n protocol_methods_warn_for: Array.isArray(r.protocol_methods_warn_for)\n ? (r.protocol_methods_warn_for as string[])\n : undefined,\n protocol_methods_required_for: Array.isArray(r.protocol_methods_required_for)\n ? (r.protocol_methods_required_for as string[])\n : undefined,\n };\n}\n\nfunction loadKeys(keysPath: string): TestKeyset {\n if (!existsSync(keysPath)) {\n throw new Error(`keys.json missing at ${keysPath}`);\n }\n const raw = JSON.parse(readFileSync(keysPath, 'utf-8')) as { keys?: unknown };\n if (!Array.isArray(raw.keys)) {\n throw new Error(`keys.json must contain a \"keys\" array`);\n }\n return { keys: raw.keys.map((k, i) => parseKey(i, k)) };\n}\n\nfunction parseKey(index: number, raw: unknown): TestKeypair {\n const r = raw as Record<string, unknown>;\n const where = `keys.json[${index}]`;\n const privateD = r._private_d_for_test_only;\n if (typeof privateD !== 'string' || privateD.length === 0) {\n throw new Error(`${where}._private_d_for_test_only missing (required for dynamic signing)`);\n }\n return {\n kid: str(r.kid, `${where}.kid`),\n kty: str(r.kty, `${where}.kty`),\n crv: typeof r.crv === 'string' ? r.crv : undefined,\n alg: typeof r.alg === 'string' ? r.alg : undefined,\n use: typeof r.use === 'string' ? r.use : undefined,\n key_ops: Array.isArray(r.key_ops) ? (r.key_ops as string[]) : undefined,\n adcp_use: typeof r.adcp_use === 'string' ? r.adcp_use : undefined,\n x: typeof r.x === 'string' ? r.x : undefined,\n y: typeof r.y === 'string' ? r.y : undefined,\n private_d: privateD,\n };\n}\n\nexport function findKey(keyset: TestKeyset, kid: string): TestKeypair {\n const match = keyset.keys.find(k => k.kid === kid);\n if (!match) {\n throw new Error(\n `No test keypair with kid=\"${kid}\" in keys.json (available: ${keyset.keys.map(k => k.kid).join(', ')})`\n );\n }\n return match;\n}\n\nfunction str(v: unknown, where: string): string {\n if (typeof v !== 'string') throw new Error(`${where} must be string`);\n return v;\n}\n\nfunction num(v: unknown, where: string): number {\n if (typeof v !== 'number') throw new Error(`${where} must be number`);\n return v;\n}\n\nfunction bool(v: unknown, where: string): boolean {\n if (typeof v !== 'boolean') throw new Error(`${where} must be boolean`);\n return v;\n}\n\nfunction strArray(v: unknown, where: string): string[] {\n if (!Array.isArray(v) || v.some(item => typeof item !== 'string')) {\n throw new Error(`${where} must be string[]`);\n }\n return v as string[];\n}\n"],"mappings":"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","names":[]}
@@ -5,7 +5,8 @@
5
5
  * - runStoryboard(): run all phases/steps sequentially
6
6
  * - runStoryboardStep(): run a single step (stateless, LLM-friendly)
7
7
  */
8
- import type { RequiresCapabilityPredicate, Storyboard, StoryboardStep, StoryboardContext, StoryboardRunOptions, StoryboardResult, StoryboardPhaseResult, StoryboardStepResult, StoryboardStepPreview, StrictValidationSummary, SchemaValidationError } from './types.mjs';
8
+ import { type RawHttpCapture } from '../../protocols/rawResponseCapture.mjs';
9
+ import type { A2ATaskEnvelope, RequiresCapabilityPredicate, Storyboard, StoryboardStep, StoryboardContext, StoryboardRunOptions, StoryboardResult, StoryboardPhaseResult, StoryboardStepResult, StoryboardStepPreview, StrictValidationSummary, SchemaValidationError } from './types.mjs';
9
10
  import type { TestStepResult } from '../types.mjs';
10
11
  export declare function applyStoryboardVersionOptions(storyboard: Storyboard, options: StoryboardRunOptions): StoryboardRunOptions;
11
12
  export declare function applyAdcpVersionRunOptions(defaultAdcpVersion: string | undefined, options: StoryboardRunOptions): StoryboardRunOptions;
@@ -133,6 +134,32 @@ export declare function summarizeStrictValidation(phases: StoryboardPhaseResult[
133
134
  * Context is passed in and returned, enabling step-by-step orchestration.
134
135
  */
135
136
  export declare function runStoryboardStep(agentUrl: string, storyboard: Storyboard, stepId: string, options?: StoryboardRunOptions): Promise<StoryboardStepResult>;
137
+ /**
138
+ * Reduce the captured fetch traffic for an A2A step into the
139
+ * `A2ATaskEnvelope` validations consume. The A2A SDK fires multiple
140
+ * requests per call (agent-card discovery on fresh clients, then either
141
+ * native `SendMessage` or compatibility `message/send`), and a dispatch
142
+ * may also poll afterwards. We pick the capture whose response returned an
143
+ * A2A Task; if no capture does, we use the last POST with a JSON-RPC-shaped
144
+ * body. GET captures and non-JSON bodies are
145
+ * skipped — `undefined` here surfaces as `not_applicable` in the
146
+ * validator, which is more useful than a garbage envelope.
147
+ *
148
+ * Captured response bodies pass through `redactSecrets` before
149
+ * landing in `ValidationContext.a2aEnvelope`. The bearer-token
150
+ * regex in `wrapFetchWithCapture` only catches `Bearer <token>`
151
+ * substrings; AdCP-style secret-shaped fields (`api_key`,
152
+ * `client_secret`, `access_token`) inside a DataPart payload only
153
+ * get redacted here. Failure paths thread the envelope into
154
+ * `ValidationResult.actual.failures[].actual` which lands in
155
+ * persisted compliance reports — redacting at capture parse time
156
+ * keeps that surface consistent with `responseRecord.payload`,
157
+ * which the runner already redacts on the success path.
158
+ */
159
+ export declare function selectLastA2aSkillCapture(captures: readonly RawHttpCapture[], skill: string): RawHttpCapture | undefined;
160
+ export declare function parseLastA2aMessageSendCapture(captures: readonly RawHttpCapture[]): A2ATaskEnvelope | undefined;
161
+ /** Normalize the official A2A 1.0 JSON oneof to the legacy validator shape. */
162
+ export declare function normalizeCapturedA2AResult(result: unknown): unknown;
136
163
  /**
137
164
  * Force every outgoing request onto the storyboard's brand context.
138
165
  *
@@ -5,7 +5,8 @@
5
5
  * - runStoryboard(): run all phases/steps sequentially
6
6
  * - runStoryboardStep(): run a single step (stateless, LLM-friendly)
7
7
  */
8
- import type { RequiresCapabilityPredicate, Storyboard, StoryboardStep, StoryboardContext, StoryboardRunOptions, StoryboardResult, StoryboardPhaseResult, StoryboardStepResult, StoryboardStepPreview, StrictValidationSummary, SchemaValidationError } from './types';
8
+ import { type RawHttpCapture } from '../../protocols/rawResponseCapture';
9
+ import type { A2ATaskEnvelope, RequiresCapabilityPredicate, Storyboard, StoryboardStep, StoryboardContext, StoryboardRunOptions, StoryboardResult, StoryboardPhaseResult, StoryboardStepResult, StoryboardStepPreview, StrictValidationSummary, SchemaValidationError } from './types';
9
10
  import type { TestStepResult } from '../types';
10
11
  export declare function applyStoryboardVersionOptions(storyboard: Storyboard, options: StoryboardRunOptions): StoryboardRunOptions;
11
12
  export declare function applyAdcpVersionRunOptions(defaultAdcpVersion: string | undefined, options: StoryboardRunOptions): StoryboardRunOptions;
@@ -133,6 +134,32 @@ export declare function summarizeStrictValidation(phases: StoryboardPhaseResult[
133
134
  * Context is passed in and returned, enabling step-by-step orchestration.
134
135
  */
135
136
  export declare function runStoryboardStep(agentUrl: string, storyboard: Storyboard, stepId: string, options?: StoryboardRunOptions): Promise<StoryboardStepResult>;
137
+ /**
138
+ * Reduce the captured fetch traffic for an A2A step into the
139
+ * `A2ATaskEnvelope` validations consume. The A2A SDK fires multiple
140
+ * requests per call (agent-card discovery on fresh clients, then either
141
+ * native `SendMessage` or compatibility `message/send`), and a dispatch
142
+ * may also poll afterwards. We pick the capture whose response returned an
143
+ * A2A Task; if no capture does, we use the last POST with a JSON-RPC-shaped
144
+ * body. GET captures and non-JSON bodies are
145
+ * skipped — `undefined` here surfaces as `not_applicable` in the
146
+ * validator, which is more useful than a garbage envelope.
147
+ *
148
+ * Captured response bodies pass through `redactSecrets` before
149
+ * landing in `ValidationContext.a2aEnvelope`. The bearer-token
150
+ * regex in `wrapFetchWithCapture` only catches `Bearer <token>`
151
+ * substrings; AdCP-style secret-shaped fields (`api_key`,
152
+ * `client_secret`, `access_token`) inside a DataPart payload only
153
+ * get redacted here. Failure paths thread the envelope into
154
+ * `ValidationResult.actual.failures[].actual` which lands in
155
+ * persisted compliance reports — redacting at capture parse time
156
+ * keeps that surface consistent with `responseRecord.payload`,
157
+ * which the runner already redacts on the success path.
158
+ */
159
+ export declare function selectLastA2aSkillCapture(captures: readonly RawHttpCapture[], skill: string): RawHttpCapture | undefined;
160
+ export declare function parseLastA2aMessageSendCapture(captures: readonly RawHttpCapture[]): A2ATaskEnvelope | undefined;
161
+ /** Normalize the official A2A 1.0 JSON oneof to the legacy validator shape. */
162
+ export declare function normalizeCapturedA2AResult(result: unknown): unknown;
136
163
  /**
137
164
  * Force every outgoing request onto the storyboard's brand context.
138
165
  *
@@ -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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"}