@adcp/sdk 14.0.0-beta.11 → 14.0.0-beta.12

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 (94) hide show
  1. package/bin/adcp-storyboard-sandbox.js +16 -0
  2. package/bin/adcp.js +28 -30
  3. package/dist/lib/schemas/index.d.mts +385 -1
  4. package/dist/lib/schemas/index.d.ts +385 -1
  5. package/dist/lib/schemas/index.d.ts.map +1 -1
  6. package/dist/lib/schemas/index.js +13 -0
  7. package/dist/lib/schemas/index.js.map +1 -1
  8. package/dist/lib/schemas/index.mjs +11 -0
  9. package/dist/lib/schemas/index.mjs.map +1 -1
  10. package/dist/lib/schemas-data/v2.5/_provenance.json +1 -1
  11. package/dist/lib/signing/agent-context.d.mts +1 -0
  12. package/dist/lib/signing/agent-context.d.ts +1 -0
  13. package/dist/lib/signing/agent-context.d.ts.map +1 -1
  14. package/dist/lib/signing/agent-context.js +37 -2
  15. package/dist/lib/signing/agent-context.js.map +1 -1
  16. package/dist/lib/signing/agent-context.mjs +38 -3
  17. package/dist/lib/signing/agent-context.mjs.map +1 -1
  18. package/dist/lib/signing/agent-fetch.d.mts +1 -2
  19. package/dist/lib/signing/agent-fetch.d.ts +1 -2
  20. package/dist/lib/signing/agent-fetch.d.ts.map +1 -1
  21. package/dist/lib/signing/agent-fetch.js +2 -0
  22. package/dist/lib/signing/agent-fetch.js.map +1 -1
  23. package/dist/lib/signing/agent-fetch.mjs +2 -0
  24. package/dist/lib/signing/agent-fetch.mjs.map +1 -1
  25. package/dist/lib/signing/agent-resolver/etld.js.map +1 -1
  26. package/dist/lib/signing/agent-resolver/etld.mjs.map +1 -1
  27. package/dist/lib/testing/client.d.mts +6 -0
  28. package/dist/lib/testing/client.d.ts +6 -0
  29. package/dist/lib/testing/client.d.ts.map +1 -1
  30. package/dist/lib/testing/client.js +76 -4
  31. package/dist/lib/testing/client.js.map +1 -1
  32. package/dist/lib/testing/client.mjs +75 -4
  33. package/dist/lib/testing/client.mjs.map +1 -1
  34. package/dist/lib/testing/compliance/comply.d.ts.map +1 -1
  35. package/dist/lib/testing/compliance/comply.js +6 -0
  36. package/dist/lib/testing/compliance/comply.js.map +1 -1
  37. package/dist/lib/testing/compliance/comply.mjs +7 -1
  38. package/dist/lib/testing/compliance/comply.mjs.map +1 -1
  39. package/dist/lib/testing/storyboard/request-signing/functional-dispatch.d.mts +15 -0
  40. package/dist/lib/testing/storyboard/request-signing/functional-dispatch.d.ts +16 -0
  41. package/dist/lib/testing/storyboard/request-signing/functional-dispatch.d.ts.map +1 -0
  42. package/dist/lib/testing/storyboard/request-signing/functional-dispatch.js +106 -0
  43. package/dist/lib/testing/storyboard/request-signing/functional-dispatch.js.map +1 -0
  44. package/dist/lib/testing/storyboard/request-signing/functional-dispatch.mjs +82 -0
  45. package/dist/lib/testing/storyboard/request-signing/functional-dispatch.mjs.map +1 -0
  46. package/dist/lib/testing/storyboard/request-signing/test-kit.d.mts +15 -0
  47. package/dist/lib/testing/storyboard/request-signing/test-kit.d.ts +15 -0
  48. package/dist/lib/testing/storyboard/request-signing/test-kit.d.ts.map +1 -1
  49. package/dist/lib/testing/storyboard/request-signing/test-kit.js +58 -0
  50. package/dist/lib/testing/storyboard/request-signing/test-kit.js.map +1 -1
  51. package/dist/lib/testing/storyboard/request-signing/test-kit.mjs +58 -0
  52. package/dist/lib/testing/storyboard/request-signing/test-kit.mjs.map +1 -1
  53. package/dist/lib/testing/storyboard/request-signing/vector-loader.d.mts +2 -0
  54. package/dist/lib/testing/storyboard/request-signing/vector-loader.d.ts +2 -0
  55. package/dist/lib/testing/storyboard/request-signing/vector-loader.d.ts.map +1 -1
  56. package/dist/lib/testing/storyboard/request-signing/vector-loader.js +7 -1
  57. package/dist/lib/testing/storyboard/request-signing/vector-loader.js.map +1 -1
  58. package/dist/lib/testing/storyboard/request-signing/vector-loader.mjs +6 -1
  59. package/dist/lib/testing/storyboard/request-signing/vector-loader.mjs.map +1 -1
  60. package/dist/lib/testing/storyboard/runner.d.ts.map +1 -1
  61. package/dist/lib/testing/storyboard/runner.js +10 -1
  62. package/dist/lib/testing/storyboard/runner.js.map +1 -1
  63. package/dist/lib/testing/storyboard/runner.mjs +10 -1
  64. package/dist/lib/testing/storyboard/runner.mjs.map +1 -1
  65. package/dist/lib/testing/storyboard/validations.d.mts +1 -1
  66. package/dist/lib/testing/storyboard/validations.d.ts +1 -1
  67. package/dist/lib/testing/types.d.mts +10 -0
  68. package/dist/lib/testing/types.d.ts +10 -0
  69. package/dist/lib/testing/types.d.ts.map +1 -1
  70. package/dist/lib/testing/types.js.map +1 -1
  71. package/dist/lib/types/comply-test-controller.d.ts +1 -14
  72. package/dist/lib/types/core.generated.d.mts +1 -1
  73. package/dist/lib/types/core.generated.d.ts +1 -1
  74. package/dist/lib/types/core.generated.d.ts.map +1 -1
  75. package/dist/lib/types/core.generated.js.map +1 -1
  76. package/dist/lib/types/get-products.d.ts +1 -14
  77. package/dist/lib/types/schemas.generated.d.ts +4 -56
  78. package/dist/lib/types/schemas.generated.d.ts.map +1 -1
  79. package/dist/lib/types/schemas.generated.js +2 -2
  80. package/dist/lib/types/schemas.generated.js.map +1 -1
  81. package/dist/lib/types/schemas.generated.mjs +2 -2
  82. package/dist/lib/types/schemas.generated.mjs.map +1 -1
  83. package/dist/lib/types/tools.generated.d.mts +1 -1
  84. package/dist/lib/types/tools.generated.d.ts +1 -1
  85. package/dist/lib/types/tools.generated.d.ts.map +1 -1
  86. package/dist/lib/types/tools.generated.js.map +1 -1
  87. package/dist/lib/version.d.mts +3 -3
  88. package/dist/lib/version.d.ts +3 -3
  89. package/dist/lib/version.js +3 -3
  90. package/dist/lib/version.js.map +1 -1
  91. package/dist/lib/version.mjs +3 -3
  92. package/dist/lib/version.mjs.map +1 -1
  93. package/docs/llms.txt +1 -1
  94. package/package.json +2 -2
@@ -20,6 +20,7 @@ var vector_loader_exports = {};
20
20
  __export(vector_loader_exports, {
21
21
  __resetVectorCache: () => __resetVectorCache,
22
22
  findKey: () => findKey,
23
+ loadRequestSigningKeys: () => loadRequestSigningKeys,
23
24
  loadRequestSigningVectors: () => loadRequestSigningVectors
24
25
  });
25
26
  module.exports = __toCommonJS(vector_loader_exports);
@@ -67,12 +68,16 @@ function loadRequestSigningVectors(options = {}) {
67
68
  negative: loadDir((0, import_path.join)(profile32Dir, "negative"), parseNegative, "profile-3.2/negative/")
68
69
  }
69
70
  } : {},
70
- keys: loadKeys((0, import_path.join)(sourceDir, "keys.json")),
71
+ keys: loadRequestSigningKeys(options),
71
72
  sourceDir
72
73
  };
73
74
  VECTOR_CACHE.set(sourceDir, loaded);
74
75
  return loaded;
75
76
  }
77
+ function loadRequestSigningKeys(options = {}) {
78
+ const cacheDir = (0, import_compliance.getComplianceCacheDir)(options);
79
+ return loadKeys((0, import_path.join)(cacheDir, "test-vectors", "request-signing", "keys.json"));
80
+ }
76
81
  function __resetVectorCache() {
77
82
  VECTOR_CACHE.clear();
78
83
  }
@@ -268,6 +273,7 @@ function strArray(v, where) {
268
273
  0 && (module.exports = {
269
274
  __resetVectorCache,
270
275
  findKey,
276
+ loadRequestSigningKeys,
271
277
  loadRequestSigningVectors
272
278
  });
273
279
  //# sourceMappingURL=vector-loader.js.map
@@ -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 profiles: Record<string, { positive: PositiveVector[]; 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_target_uri_malformed',\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 profile32Dir = join(sourceDir, 'profile-3.2');\n const loaded: LoadedVectors = {\n positive: loadDir(join(sourceDir, 'positive'), parsePositive),\n negative: loadDir(join(sourceDir, 'negative'), parseNegative),\n profiles: existsSync(profile32Dir)\n ? {\n '3.2': {\n positive: loadDir(join(profile32Dir, 'positive'), parsePositive, 'profile-3.2/positive/'),\n negative: loadDir(join(profile32Dir, 'negative'), parseNegative, 'profile-3.2/negative/'),\n },\n }\n : {},\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, idPrefix = ''): 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(`${idPrefix}${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 signing_profile_version: optionalSigningProfileVersion(r),\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 signing_profile_version: optionalSigningProfileVersion(r),\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 optionalSigningProfileVersion(vector: Record<string, unknown>): string {\n // Older cached bundles predate the explicit marker; every root vector in\n // those bundles exercises the legacy 3.1 binary profile.\n return typeof vector.signing_profile_version === 'string' ? vector.signing_profile_version : '3.1';\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":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,gBAAsD;AACtD,kBAA+B;AAC/B,wBAAsC;AAEtC,mBAA6B;AAgB7B,MAAM,cAAmC,oBAAI,IAAI;AAAA,EAC/C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAED,MAAM,kBAAuC,IAAI,IAAI,yBAAY;AAQjE,MAAM,eAAe,oBAAI,IAA2B;AAE7C,SAAS,0BAA0B,UAA8B,CAAC,GAAkB;AACzF,QAAM,eAAW,yCAAsB,OAAO;AAC9C,QAAM,gBAAY,kBAAK,UAAU,gBAAgB,iBAAiB;AAClE,QAAM,SAAS,aAAa,IAAI,SAAS;AACzC,MAAI,OAAQ,QAAO;AAEnB,MAAI,KAAC,sBAAW,SAAS,GAAG;AAC1B,UAAM,IAAI;AAAA,MACR,wCAAwC,SAAS;AAAA,IACnD;AAAA,EACF;AAEA,QAAM,mBAAe,kBAAK,WAAW,aAAa;AAClD,QAAM,SAAwB;AAAA,IAC5B,UAAU,YAAQ,kBAAK,WAAW,UAAU,GAAG,aAAa;AAAA,IAC5D,UAAU,YAAQ,kBAAK,WAAW,UAAU,GAAG,aAAa;AAAA,IAC5D,cAAU,sBAAW,YAAY,IAC7B;AAAA,MACE,OAAO;AAAA,QACL,UAAU,YAAQ,kBAAK,cAAc,UAAU,GAAG,eAAe,uBAAuB;AAAA,QACxF,UAAU,YAAQ,kBAAK,cAAc,UAAU,GAAG,eAAe,uBAAuB;AAAA,MAC1F;AAAA,IACF,IACA,CAAC;AAAA,IACL,MAAM,aAAS,kBAAK,WAAW,WAAW,CAAC;AAAA,IAC3C;AAAA,EACF;AACA,eAAa,IAAI,WAAW,MAAM;AAClC,SAAO;AACT;AAGO,SAAS,qBAA2B;AACzC,eAAa,MAAM;AACrB;AAEA,SAAS,QAA0B,KAAa,OAAwC,WAAW,IAAS;AAC1G,MAAI,KAAC,sBAAW,GAAG,GAAG;AACpB,UAAM,IAAI,MAAM,6BAA6B,GAAG,EAAE;AAAA,EACpD;AACA,QAAM,YAAQ,uBAAY,GAAG,EAC1B,OAAO,OAAK,EAAE,SAAS,OAAO,CAAC,EAC/B,KAAK;AACR,SAAO,MAAM,IAAI,OAAK;AACpB,UAAM,MAAM,KAAK,UAAM,4BAAa,kBAAK,KAAK,CAAC,GAAG,OAAO,CAAC;AAC1D,WAAO,MAAM,GAAG,QAAQ,GAAG,qBAAqB,CAAC,CAAC,IAAI,GAAG;AAAA,EAC3D,CAAC;AACH;AAEA,SAAS,qBAAqB,MAAsB;AAClD,aAAO,sBAAS,MAAM,OAAO;AAC/B;AAEA,SAAS,cAAc,IAAY,KAA8B;AAC/D,QAAM,IAAI;AACV,gBAAc,IAAI,GAAG,IAAI;AACzB,QAAM,EAAE,UAAU,cAAc,IAAI,kBAAkB,IAAI,CAAC;AAC3D,SAAO;AAAA,IACL,MAAM;AAAA,IACN;AAAA,IACA,MAAM,IAAI,EAAE,MAAM,GAAG,EAAE,OAAO;AAAA,IAC9B,yBAAyB,8BAA8B,CAAC;AAAA,IACxD,eAAe,IAAI,EAAE,eAAe,GAAG,EAAE,gBAAgB;AAAA,IACzD,SAAS,aAAa,IAAI,EAAE,OAAO;AAAA,IACnC,qBAAqB,gBAAgB,IAAI,EAAE,mBAAmB;AAAA,IAC9D;AAAA,IACA;AAAA,IACA,yBAAyB,OAAO,EAAE,4BAA4B,WAAW,EAAE,0BAA0B;AAAA,IACrG,gBAAgB,OAAO,EAAE,mBAAmB,WAAW,EAAE,iBAAiB;AAAA,EAC5E;AACF;AAEA,SAAS,cAAc,IAAY,KAA8B;AAC/D,QAAM,IAAI;AACV,gBAAc,IAAI,GAAG,KAAK;AAC1B,QAAM,UAAU,EAAE;AAClB,QAAM,YAAY,IAAI,QAAQ,YAAY,GAAG,EAAE,8BAA8B;AAC7E,MAAI,CAAC,YAAY,IAAI,SAAS,GAAG;AAC/B,UAAM,IAAI,MAAM,GAAG,EAAE,0CAA0C,SAAS,iBAAiB;AAAA,EAC3F;AACA,QAAM,aAAa,QAAQ;AAC3B,MAAI,OAAO,eAAe,YAAY,OAAO,eAAe,UAAU;AACpE,UAAM,IAAI,MAAM,GAAG,EAAE,yDAAyD;AAAA,EAChF;AACA,MAAI;AACJ,MAAI,EAAE,sBAAsB,QAAW;AACrC,UAAM,IAAI,IAAI,EAAE,mBAAmB,GAAG,EAAE,oBAAoB;AAC5D,QAAI,CAAC,gBAAgB,IAAI,CAAC,GAAG;AAC3B,YAAM,IAAI,MAAM,GAAG,EAAE,gCAAgC,CAAC,iBAAiB;AAAA,IACzE;AACA,eAAW;AAAA,EACb;AACA,QAAM,EAAE,UAAU,cAAc,IAAI,kBAAkB,IAAI,CAAC;AAC3D,SAAO;AAAA,IACL,MAAM;AAAA,IACN;AAAA,IACA,MAAM,IAAI,EAAE,MAAM,GAAG,EAAE,OAAO;AAAA,IAC9B,yBAAyB,8BAA8B,CAAC;AAAA,IACxD,eAAe,IAAI,EAAE,eAAe,GAAG,EAAE,gBAAgB;AAAA,IACzD,SAAS,aAAa,IAAI,EAAE,OAAO;AAAA,IACnC,qBAAqB,gBAAgB,IAAI,EAAE,mBAAmB;AAAA,IAC9D;AAAA,IACA;AAAA,IACA,qBAAqB;AAAA,IACrB,sBAAsB;AAAA,IACtB,mBAAmB;AAAA,IACnB,gBAAgB,OAAO,EAAE,mBAAmB,WAAW,EAAE,iBAAiB;AAAA,EAC5E;AACF;AAEA,SAAS,8BAA8B,QAAyC;AAG9E,SAAO,OAAO,OAAO,4BAA4B,WAAW,OAAO,0BAA0B;AAC/F;AAEA,SAAS,kBACP,IACA,GACmF;AACnF,QAAM,SAAS,EAAE,aAAa;AAC9B,QAAM,cAAc,EAAE,kBAAkB;AACxC,MAAI,UAAU,aAAa;AACzB,UAAM,IAAI,MAAM,GAAG,EAAE,qDAAqD;AAAA,EAC5E;AACA,MAAI,CAAC,UAAU,CAAC,aAAa;AAC3B,UAAM,IAAI,MAAM,GAAG,EAAE,iDAAiD;AAAA,EACxE;AACA,MAAI,aAAa;AACf,UAAM,WAAW,EAAE;AACnB,UAAM,OAAO,SAAS;AACtB,QAAI,CAAC,MAAM,QAAQ,IAAI,KAAK,KAAK,WAAW,GAAG;AAC7C,YAAM,IAAI,MAAM,GAAG,EAAE,+CAA+C;AAAA,IACtE;AACA,eAAW,KAAK,MAAM;AACpB,UAAI,CAAC,KAAK,OAAO,MAAM,UAAU;AAC/B,cAAM,IAAI,MAAM,GAAG,EAAE,+CAA+C;AAAA,MACtE;AAAA,IACF;AACA,WAAO,EAAE,eAAe,EAAE,KAA6C,EAAE;AAAA,EAC3E;AACA,SAAO,EAAE,UAAU,SAAS,EAAE,UAAU,GAAG,EAAE,WAAW,EAAE;AAC5D;AAEA,SAAS,cAAc,IAAY,QAAiC,UAAyB;AAC3F,QAAM,UAAU,OAAO;AACvB,MAAI,CAAC,WAAW,QAAQ,YAAY,UAAU;AAC5C,UAAM,IAAI;AAAA,MACR,GAAG,EAAE,sCAAsC,QAAQ,QAAQ,WAAW,aAAa,UAAU;AAAA,IAC/F;AAAA,EACF;AACF;AAEA,SAAS,aAAa,IAAY,KAAyC;AACzE,QAAM,IAAI;AACV,MAAI,CAAC,EAAG,OAAM,IAAI,MAAM,GAAG,EAAE,kBAAkB;AAC/C,QAAM,UAAU,EAAE;AAClB,MAAI,CAAC,QAAS,OAAM,IAAI,MAAM,GAAG,EAAE,0BAA0B;AAC7D,SAAO;AAAA,IACL,QAAQ,IAAI,EAAE,QAAQ,GAAG,EAAE,iBAAiB;AAAA,IAC5C,KAAK,IAAI,EAAE,KAAK,GAAG,EAAE,cAAc;AAAA,IACnC,SAAS,EAAE,GAAG,QAAQ;AAAA,IACtB,MAAM,OAAO,EAAE,SAAS,WAAW,EAAE,OAAO;AAAA,EAC9C;AACF;AAEA,SAAS,gBAAgB,IAAY,KAAqD;AACxF,QAAM,IAAI;AACV,MAAI,CAAC,EAAG,OAAM,IAAI,MAAM,GAAG,EAAE,8BAA8B;AAC3D,QAAM,SAAS,IAAI,EAAE,uBAAuB,GAAG,EAAE,4CAA4C;AAC7F,MAAI,WAAW,cAAc,WAAW,eAAe,WAAW,UAAU;AAC1E,UAAM,IAAI,MAAM,GAAG,EAAE,oCAAoC,MAAM,GAAG;AAAA,EACpE;AACA,SAAO;AAAA,IACL,WAAW,KAAK,EAAE,WAAW,GAAG,EAAE,gCAAgC;AAAA,IAClE,uBAAuB;AAAA,IACvB,cAAc,SAAS,EAAE,cAAc,GAAG,EAAE,mCAAmC;AAAA,IAC/E,eAAe,MAAM,QAAQ,EAAE,aAAa,IAAK,EAAE,gBAA6B;AAAA,IAChF,gCAAgC,MAAM,QAAQ,EAAE,8BAA8B,IACzE,EAAE,iCACH;AAAA,IACJ,+BAA+B,MAAM,QAAQ,EAAE,6BAA6B,IACvE,EAAE,gCACH;AAAA,EACN;AACF;AAEA,SAAS,SAAS,UAA8B;AAC9C,MAAI,KAAC,sBAAW,QAAQ,GAAG;AACzB,UAAM,IAAI,MAAM,wBAAwB,QAAQ,EAAE;AAAA,EACpD;AACA,QAAM,MAAM,KAAK,UAAM,wBAAa,UAAU,OAAO,CAAC;AACtD,MAAI,CAAC,MAAM,QAAQ,IAAI,IAAI,GAAG;AAC5B,UAAM,IAAI,MAAM,uCAAuC;AAAA,EACzD;AACA,SAAO,EAAE,MAAM,IAAI,KAAK,IAAI,CAAC,GAAG,MAAM,SAAS,GAAG,CAAC,CAAC,EAAE;AACxD;AAEA,SAAS,SAAS,OAAe,KAA2B;AAC1D,QAAM,IAAI;AACV,QAAM,QAAQ,aAAa,KAAK;AAChC,QAAM,WAAW,EAAE;AACnB,MAAI,OAAO,aAAa,YAAY,SAAS,WAAW,GAAG;AACzD,UAAM,IAAI,MAAM,GAAG,KAAK,kEAAkE;AAAA,EAC5F;AACA,SAAO;AAAA,IACL,KAAK,IAAI,EAAE,KAAK,GAAG,KAAK,MAAM;AAAA,IAC9B,KAAK,IAAI,EAAE,KAAK,GAAG,KAAK,MAAM;AAAA,IAC9B,KAAK,OAAO,EAAE,QAAQ,WAAW,EAAE,MAAM;AAAA,IACzC,KAAK,OAAO,EAAE,QAAQ,WAAW,EAAE,MAAM;AAAA,IACzC,KAAK,OAAO,EAAE,QAAQ,WAAW,EAAE,MAAM;AAAA,IACzC,SAAS,MAAM,QAAQ,EAAE,OAAO,IAAK,EAAE,UAAuB;AAAA,IAC9D,UAAU,OAAO,EAAE,aAAa,WAAW,EAAE,WAAW;AAAA,IACxD,GAAG,OAAO,EAAE,MAAM,WAAW,EAAE,IAAI;AAAA,IACnC,GAAG,OAAO,EAAE,MAAM,WAAW,EAAE,IAAI;AAAA,IACnC,WAAW;AAAA,EACb;AACF;AAEO,SAAS,QAAQ,QAAoB,KAA0B;AACpE,QAAM,QAAQ,OAAO,KAAK,KAAK,OAAK,EAAE,QAAQ,GAAG;AACjD,MAAI,CAAC,OAAO;AACV,UAAM,IAAI;AAAA,MACR,6BAA6B,GAAG,8BAA8B,OAAO,KAAK,IAAI,OAAK,EAAE,GAAG,EAAE,KAAK,IAAI,CAAC;AAAA,IACtG;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,IAAI,GAAY,OAAuB;AAC9C,MAAI,OAAO,MAAM,SAAU,OAAM,IAAI,MAAM,GAAG,KAAK,iBAAiB;AACpE,SAAO;AACT;AAEA,SAAS,IAAI,GAAY,OAAuB;AAC9C,MAAI,OAAO,MAAM,SAAU,OAAM,IAAI,MAAM,GAAG,KAAK,iBAAiB;AACpE,SAAO;AACT;AAEA,SAAS,KAAK,GAAY,OAAwB;AAChD,MAAI,OAAO,MAAM,UAAW,OAAM,IAAI,MAAM,GAAG,KAAK,kBAAkB;AACtE,SAAO;AACT;AAEA,SAAS,SAAS,GAAY,OAAyB;AACrD,MAAI,CAAC,MAAM,QAAQ,CAAC,KAAK,EAAE,KAAK,UAAQ,OAAO,SAAS,QAAQ,GAAG;AACjE,UAAM,IAAI,MAAM,GAAG,KAAK,mBAAmB;AAAA,EAC7C;AACA,SAAO;AACT;","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 profiles: Record<string, { positive: PositiveVector[]; 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_target_uri_malformed',\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 profile32Dir = join(sourceDir, 'profile-3.2');\n const loaded: LoadedVectors = {\n positive: loadDir(join(sourceDir, 'positive'), parsePositive),\n negative: loadDir(join(sourceDir, 'negative'), parseNegative),\n profiles: existsSync(profile32Dir)\n ? {\n '3.2': {\n positive: loadDir(join(profile32Dir, 'positive'), parsePositive, 'profile-3.2/positive/'),\n negative: loadDir(join(profile32Dir, 'negative'), parseNegative, 'profile-3.2/negative/'),\n },\n }\n : {},\n keys: loadRequestSigningKeys(options),\n sourceDir,\n };\n VECTOR_CACHE.set(sourceDir, loaded);\n return loaded;\n}\n\n/** Load only the shared signing keyset, without requiring the grader vectors. */\nexport function loadRequestSigningKeys(options: LoadVectorsOptions = {}): TestKeyset {\n const cacheDir = getComplianceCacheDir(options);\n return loadKeys(join(cacheDir, 'test-vectors', 'request-signing', 'keys.json'));\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, idPrefix = ''): 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(`${idPrefix}${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 signing_profile_version: optionalSigningProfileVersion(r),\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 signing_profile_version: optionalSigningProfileVersion(r),\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 optionalSigningProfileVersion(vector: Record<string, unknown>): string {\n // Older cached bundles predate the explicit marker; every root vector in\n // those bundles exercises the legacy 3.1 binary profile.\n return typeof vector.signing_profile_version === 'string' ? vector.signing_profile_version : '3.1';\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":[]}
@@ -42,12 +42,16 @@ function loadRequestSigningVectors(options = {}) {
42
42
  negative: loadDir(join(profile32Dir, "negative"), parseNegative, "profile-3.2/negative/")
43
43
  }
44
44
  } : {},
45
- keys: loadKeys(join(sourceDir, "keys.json")),
45
+ keys: loadRequestSigningKeys(options),
46
46
  sourceDir
47
47
  };
48
48
  VECTOR_CACHE.set(sourceDir, loaded);
49
49
  return loaded;
50
50
  }
51
+ function loadRequestSigningKeys(options = {}) {
52
+ const cacheDir = getComplianceCacheDir(options);
53
+ return loadKeys(join(cacheDir, "test-vectors", "request-signing", "keys.json"));
54
+ }
51
55
  function __resetVectorCache() {
52
56
  VECTOR_CACHE.clear();
53
57
  }
@@ -242,6 +246,7 @@ function strArray(v, where) {
242
246
  export {
243
247
  __resetVectorCache,
244
248
  findKey,
249
+ loadRequestSigningKeys,
245
250
  loadRequestSigningVectors
246
251
  };
247
252
  //# sourceMappingURL=vector-loader.mjs.map
@@ -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 profiles: Record<string, { positive: PositiveVector[]; 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_target_uri_malformed',\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 profile32Dir = join(sourceDir, 'profile-3.2');\n const loaded: LoadedVectors = {\n positive: loadDir(join(sourceDir, 'positive'), parsePositive),\n negative: loadDir(join(sourceDir, 'negative'), parseNegative),\n profiles: existsSync(profile32Dir)\n ? {\n '3.2': {\n positive: loadDir(join(profile32Dir, 'positive'), parsePositive, 'profile-3.2/positive/'),\n negative: loadDir(join(profile32Dir, 'negative'), parseNegative, 'profile-3.2/negative/'),\n },\n }\n : {},\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, idPrefix = ''): 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(`${idPrefix}${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 signing_profile_version: optionalSigningProfileVersion(r),\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 signing_profile_version: optionalSigningProfileVersion(r),\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 optionalSigningProfileVersion(vector: Record<string, unknown>): string {\n // Older cached bundles predate the explicit marker; every root vector in\n // those bundles exercises the legacy 3.1 binary profile.\n return typeof vector.signing_profile_version === 'string' ? vector.signing_profile_version : '3.1';\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 profiles: Record<string, { positive: PositiveVector[]; 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_target_uri_malformed',\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 profile32Dir = join(sourceDir, 'profile-3.2');\n const loaded: LoadedVectors = {\n positive: loadDir(join(sourceDir, 'positive'), parsePositive),\n negative: loadDir(join(sourceDir, 'negative'), parseNegative),\n profiles: existsSync(profile32Dir)\n ? {\n '3.2': {\n positive: loadDir(join(profile32Dir, 'positive'), parsePositive, 'profile-3.2/positive/'),\n negative: loadDir(join(profile32Dir, 'negative'), parseNegative, 'profile-3.2/negative/'),\n },\n }\n : {},\n keys: loadRequestSigningKeys(options),\n sourceDir,\n };\n VECTOR_CACHE.set(sourceDir, loaded);\n return loaded;\n}\n\n/** Load only the shared signing keyset, without requiring the grader vectors. */\nexport function loadRequestSigningKeys(options: LoadVectorsOptions = {}): TestKeyset {\n const cacheDir = getComplianceCacheDir(options);\n return loadKeys(join(cacheDir, 'test-vectors', 'request-signing', 'keys.json'));\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, idPrefix = ''): 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(`${idPrefix}${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 signing_profile_version: optionalSigningProfileVersion(r),\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 signing_profile_version: optionalSigningProfileVersion(r),\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 optionalSigningProfileVersion(vector: Record<string, unknown>): string {\n // Older cached bundles predate the explicit marker; every root vector in\n // those bundles exercises the legacy 3.1 binary profile.\n return typeof vector.signing_profile_version === 'string' ? vector.signing_profile_version : '3.1';\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 +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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"}
@@ -44,6 +44,7 @@ var import_client = require('../client.js');
44
44
  var import_protocols = require('../../protocols/index.js');
45
45
  var import_rawResponseCapture = require('../../protocols/rawResponseCapture.js');
46
46
  var import_task_map = require('./task-map.js');
47
+ var import_functional_dispatch = require('./request-signing/functional-dispatch.js');
47
48
  var import_context = require('./context.js');
48
49
  var import_rejection_hints = require('./rejection-hints.js');
49
50
  var import_shape_drift_hints = require('./shape-drift-hints.js');
@@ -650,6 +651,10 @@ async function runStoryboard(agentUrlOrUrls, storyboard, options = {}) {
650
651
  return (0, import_protocols.withMCPConnectionScope)(
651
652
  async () => {
652
653
  options = applyStoryboardVersionOptions(storyboard, options);
654
+ options = (0, import_functional_dispatch.applyFunctionalRequestSigning)(options, {
655
+ ...options.complianceDir && { complianceDir: options.complianceDir },
656
+ ...options.adcpVersion && { version: options.adcpVersion }
657
+ });
653
658
  options = (0, import_test_kit.resolveDeclaredTestKit)(storyboard, options);
654
659
  options = { ...options, transport: (0, import_protocols.normalizeTransportOptions)(options.transport) };
655
660
  const schemaRoot = getRunSchemaRoot(options);
@@ -2478,6 +2483,10 @@ async function runStoryboardStep(agentUrl, storyboard, stepId, options = {}) {
2478
2483
  async () => {
2479
2484
  (0, import_loader.validateStoryboardShape)(storyboard);
2480
2485
  options = applyStoryboardVersionOptions(storyboard, options);
2486
+ options = (0, import_functional_dispatch.applyFunctionalRequestSigning)(options, {
2487
+ ...options.complianceDir && { complianceDir: options.complianceDir },
2488
+ ...options.adcpVersion && { version: options.adcpVersion }
2489
+ });
2481
2490
  options = (0, import_test_kit.resolveDeclaredTestKit)(storyboard, options);
2482
2491
  const schemaRoot = getRunSchemaRoot(options);
2483
2492
  if (schemaRoot) {
@@ -3077,7 +3086,7 @@ async function executeStep(client, step, storyboardId, phaseId, context, allStep
3077
3086
  runState.agentProfile?.raw_capabilities,
3078
3087
  "request_signing.required_for"
3079
3088
  );
3080
- if (taskResult?.adcp_error?.code === "request_signature_required" && Array.isArray(requiredForSigning) && requiredForSigning.includes(effectiveStep.task) && runState.storyboardRequiresRequestSigner !== true) {
3089
+ if (taskResult?.adcp_error?.code === "request_signature_required" && Array.isArray(requiredForSigning) && requiredForSigning.includes(effectiveStep.task) && options.functional_request_signing === void 0 && runState.storyboardRequiresRequestSigner !== true) {
3081
3090
  const next2 = getNextStepPreview(step.id, allSteps, context, runState.runnerVars);
3082
3091
  const detail = `Agent declared request_signing.required_for includes "${effectiveStep.task}" and rejected the unsigned request with request_signature_required; storyboard "${storyboardId}" does not require request_signer.`;
3083
3092
  return {