@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
@@ -9,12 +9,14 @@ import { gte as semverGte, valid as validSemver } from "semver";
9
9
  import { isJsonContentType } from "../test-controller.mjs";
10
10
  import { globToRegExp } from "../../utils/glob.mjs";
11
11
  import {
12
+ parsePath,
12
13
  resolvePath,
13
14
  resolvePathAll,
14
15
  resolvePortableIdentifierPathAll,
15
16
  toJsonPointer,
16
17
  validatePortableIdentifierPath
17
18
  } from "./path.mjs";
19
+ import { canonicalTargetUri } from "../../signing/canonicalize.mjs";
18
20
  import { detectShapeDriftHints } from "./shape-drift-hints.mjs";
19
21
  import { PROBE_TASK_ALLOWLIST } from "./test-kit.mjs";
20
22
  import { validateCanonicalFormatSatisfaction } from "./canonical-format-satisfaction.mjs";
@@ -493,13 +495,67 @@ function validateFieldAbsent(validation, taskResult) {
493
495
  actual: value
494
496
  };
495
497
  }
496
- function valuesMatch(actual, expected) {
498
+ function comparisonKeyFromPath(path) {
499
+ const segments = parsePath(path);
500
+ for (let i = segments.length - 1; i >= 0; i -= 1) {
501
+ const segment = segments[i];
502
+ if (typeof segment === "string") return segment;
503
+ }
504
+ return void 0;
505
+ }
506
+ function isAgentUrlComparisonKey(key) {
507
+ const normalized = key?.toLowerCase();
508
+ return normalized === "agent_url" || normalized?.endsWith("_agent_url") === true;
509
+ }
510
+ function agentUrlValuesMatch(actual, expected) {
511
+ try {
512
+ return canonicalTargetUri(actual) === canonicalTargetUri(expected);
513
+ } catch {
514
+ return false;
515
+ }
516
+ }
517
+ function normalizeAgentUrlsForDistinctCount(value, comparisonKey) {
518
+ if (isAgentUrlComparisonKey(comparisonKey)) {
519
+ if (typeof value !== "string") return { value, valid: false };
520
+ try {
521
+ return { value: canonicalTargetUri(value), valid: true };
522
+ } catch {
523
+ return { value, valid: false };
524
+ }
525
+ }
526
+ if (Array.isArray(value)) {
527
+ const normalized = [];
528
+ for (const item of value) {
529
+ const result = normalizeAgentUrlsForDistinctCount(item, comparisonKey);
530
+ if (!result.valid) return { value, valid: false };
531
+ normalized.push(result.value);
532
+ }
533
+ return { value: normalized, valid: true };
534
+ }
535
+ if (typeof value === "object" && value !== null) {
536
+ const normalized = {};
537
+ for (const [key, item] of Object.entries(value)) {
538
+ const result = normalizeAgentUrlsForDistinctCount(item, key);
539
+ if (!result.valid) return { value, valid: false };
540
+ normalized[key] = result.value;
541
+ }
542
+ return { value: normalized, valid: true };
543
+ }
544
+ return { value, valid: true };
545
+ }
546
+ function valuesMatch(actual, expected, comparisonKey) {
547
+ if (isAgentUrlComparisonKey(comparisonKey)) {
548
+ return typeof actual === "string" && typeof expected === "string" && agentUrlValuesMatch(actual, expected);
549
+ }
497
550
  if (typeof actual === "object" && actual !== null) {
498
- return deepEqualJsonValue(actual, expected);
551
+ return deepEqualJsonValue(actual, expected, comparisonKey);
499
552
  }
500
553
  return actual === expected;
501
554
  }
502
- function deepEqualJsonValue(a, b) {
555
+ function deepEqualJsonValue(a, b, comparisonKey) {
556
+ if (isAgentUrlComparisonKey(comparisonKey)) {
557
+ return typeof a === "string" && typeof b === "string" && agentUrlValuesMatch(a, b);
558
+ }
503
559
  if (a === b) return true;
504
560
  if (typeof a !== typeof b) return false;
505
561
  if (a === null || b === null) return a === b;
@@ -508,7 +564,7 @@ function deepEqualJsonValue(a, b) {
508
564
  if (!Array.isArray(a) || !Array.isArray(b)) return false;
509
565
  if (a.length !== b.length) return false;
510
566
  for (let i = 0; i < a.length; i++) {
511
- if (!deepEqualJsonValue(a[i], b[i])) return false;
567
+ if (!deepEqualJsonValue(a[i], b[i], comparisonKey)) return false;
512
568
  }
513
569
  return true;
514
570
  }
@@ -517,21 +573,21 @@ function deepEqualJsonValue(a, b) {
517
573
  if (keysA.length !== keysB.length) return false;
518
574
  for (const k of keysA) {
519
575
  if (!Object.prototype.hasOwnProperty.call(b, k)) return false;
520
- if (!deepEqualJsonValue(a[k], b[k])) return false;
576
+ if (!deepEqualJsonValue(a[k], b[k], k)) return false;
521
577
  }
522
578
  return true;
523
579
  }
524
580
  function isRecord(value) {
525
581
  return value !== null && typeof value === "object" && !Array.isArray(value);
526
582
  }
527
- function containsValueMatches(actual, expected) {
583
+ function containsValueMatches(actual, expected, comparisonKey) {
528
584
  if (Array.isArray(expected)) {
529
585
  if (!Array.isArray(actual)) return false;
530
586
  if (expected.length === 0) return actual.length === 0;
531
587
  const used = /* @__PURE__ */ new Set();
532
588
  return expected.every((expectedItem) => {
533
589
  const matchIndex = actual.findIndex(
534
- (actualItem, index) => !used.has(index) && containsValueMatches(actualItem, expectedItem)
590
+ (actualItem, index) => !used.has(index) && containsValueMatches(actualItem, expectedItem, comparisonKey)
535
591
  );
536
592
  if (matchIndex === -1) return false;
537
593
  used.add(matchIndex);
@@ -541,10 +597,10 @@ function containsValueMatches(actual, expected) {
541
597
  if (isRecord(expected)) {
542
598
  if (!isRecord(actual)) return false;
543
599
  return Object.entries(expected).every(
544
- ([key, expectedValue]) => Object.prototype.hasOwnProperty.call(actual, key) && containsValueMatches(actual[key], expectedValue)
600
+ ([key, expectedValue]) => Object.prototype.hasOwnProperty.call(actual, key) && containsValueMatches(actual[key], expectedValue, key)
545
601
  );
546
602
  }
547
- return valuesMatch(actual, expected);
603
+ return valuesMatch(actual, expected, comparisonKey);
548
604
  }
549
605
  function pathUsesWildcardSyntax(path) {
550
606
  return /\[(?:\*|)\]/.test(path);
@@ -581,7 +637,8 @@ function validateFieldValue(validation, taskResult) {
581
637
  const actual = resolvePath(taskResult.data, validation.path);
582
638
  const pointer = toJsonPointer(validation.path);
583
639
  if (validation.allowed_values?.length) {
584
- const passed2 = validation.allowed_values.some((v) => valuesMatch(actual, v));
640
+ const comparisonKey = comparisonKeyFromPath(validation.path);
641
+ const passed2 = validation.allowed_values.some((v) => valuesMatch(actual, v, comparisonKey));
585
642
  if (passed2) {
586
643
  return {
587
644
  check: checkName,
@@ -602,7 +659,7 @@ function validateFieldValue(validation, taskResult) {
602
659
  actual: actual ?? null
603
660
  };
604
661
  }
605
- const passed = valuesMatch(actual, validation.value);
662
+ const passed = valuesMatch(actual, validation.value, comparisonKeyFromPath(validation.path));
606
663
  if (passed) {
607
664
  return {
608
665
  check: checkName,
@@ -652,7 +709,8 @@ function validateFieldValueOrAbsent(validation, taskResult) {
652
709
  };
653
710
  }
654
711
  if (validation.allowed_values?.length) {
655
- const passed2 = validation.allowed_values.some((v) => valuesMatch(actual, v));
712
+ const comparisonKey = comparisonKeyFromPath(validation.path);
713
+ const passed2 = validation.allowed_values.some((v) => valuesMatch(actual, v, comparisonKey));
656
714
  if (passed2) {
657
715
  return {
658
716
  check: checkName,
@@ -673,7 +731,7 @@ function validateFieldValueOrAbsent(validation, taskResult) {
673
731
  actual
674
732
  };
675
733
  }
676
- const passed = valuesMatch(actual, validation.value);
734
+ const passed = valuesMatch(actual, validation.value, comparisonKeyFromPath(validation.path));
677
735
  if (passed) {
678
736
  return {
679
737
  check: checkName,
@@ -815,7 +873,8 @@ function validateFieldContains(validation, taskResult) {
815
873
  const resolved = resolvePathAll(taskResult.data, validation.path);
816
874
  const pointer = toJsonPointer(validation.path);
817
875
  const candidates = validation.allowed_values?.length ? validation.allowed_values : [validation.value];
818
- const matched = resolved.some((actual) => candidates.some((c) => containsValueMatches(actual, c)));
876
+ const comparisonKey = comparisonKeyFromPath(validation.path);
877
+ const matched = resolved.some((actual) => candidates.some((c) => containsValueMatches(actual, c, comparisonKey)));
819
878
  if (matched) {
820
879
  return {
821
880
  check: checkName,
@@ -1884,7 +1943,7 @@ function validateFieldEqualsContext(validation, ctx) {
1884
1943
  const actual = resolvePath(resolveTarget(ctx).data, validation.path);
1885
1944
  const expected = comparandResult.value;
1886
1945
  const pointer = toJsonPointer(validation.path);
1887
- const passed = valuesMatch(actual, expected);
1946
+ const passed = valuesMatch(actual, expected, comparisonKeyFromPath(validation.path));
1888
1947
  if (passed) {
1889
1948
  return {
1890
1949
  check: "field_equals_context",
@@ -1952,7 +2011,8 @@ function validateFieldInContextArray(validation, ctx) {
1952
2011
  actual: allowed
1953
2012
  };
1954
2013
  }
1955
- if (allowed.some((candidate) => valuesMatch(actual, candidate))) {
2014
+ const comparisonKey = comparisonKeyFromPath(validation.path);
2015
+ if (allowed.some((candidate) => valuesMatch(actual, candidate, comparisonKey))) {
1956
2016
  return {
1957
2017
  check: "field_in_context_array",
1958
2018
  passed: true,
@@ -2020,7 +2080,8 @@ function validateAllFieldsInContextArray(validation, ctx) {
2020
2080
  actual: allowed
2021
2081
  };
2022
2082
  }
2023
- const passed = actual.every((value) => allowed.some((candidate) => deepEqualJsonValue(value, candidate)));
2083
+ const comparisonKey = comparisonKeyFromPath(validation.path);
2084
+ const passed = actual.every((value) => allowed.some((candidate) => deepEqualJsonValue(value, candidate, comparisonKey)));
2024
2085
  if (passed) {
2025
2086
  return {
2026
2087
  check,
@@ -2432,7 +2493,8 @@ function validateCrossResponseFieldEqual(validation, ctx) {
2432
2493
  }
2433
2494
  const values = cr.resolved.map((tr) => resolvePath(tr.data, path));
2434
2495
  const first = values[0];
2435
- const allEqual = values.every((v) => deepEqual(v, first));
2496
+ const comparisonKey = comparisonKeyFromPath(path);
2497
+ const allEqual = values.every((v) => valuesMatch(v, first, comparisonKey));
2436
2498
  if (allEqual) {
2437
2499
  return {
2438
2500
  check: validation.check,
@@ -2562,13 +2624,27 @@ function validateCrossResponseCountDistinct(validation, ctx) {
2562
2624
  schema_url: null
2563
2625
  };
2564
2626
  }
2565
- const distinct = /* @__PURE__ */ new Set();
2627
+ const comparisonKey = comparisonKeyFromPath(path);
2628
+ const exactValues = /* @__PURE__ */ new Set();
2566
2629
  for (const tr of cr.resolved) {
2567
2630
  const v = resolvePath(tr.data, path);
2568
- if (v === void 0 || v === null) continue;
2569
- distinct.add(JSON.stringify(v));
2631
+ if (v === void 0 || v === null && !isAgentUrlComparisonKey(comparisonKey)) continue;
2632
+ const normalized = normalizeAgentUrlsForDistinctCount(v, comparisonKey);
2633
+ if (!normalized.valid) {
2634
+ return {
2635
+ check: validation.check,
2636
+ passed: false,
2637
+ description: validation.description,
2638
+ json_pointer: toJsonPointer(path),
2639
+ expected: "valid URI strings in all agent URL identity fields",
2640
+ actual: v,
2641
+ schema_id: null,
2642
+ schema_url: null
2643
+ };
2644
+ }
2645
+ exactValues.add(JSON.stringify(normalized.value));
2570
2646
  }
2571
- const distinctCount = distinct.size;
2647
+ const distinctCount = exactValues.size;
2572
2648
  const allowed = validation.allowed_values;
2573
2649
  if (allowed.includes(distinctCount)) {
2574
2650
  return {