@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
@@ -14,6 +14,7 @@ import { withTaskDeadline } from "./task-deadline.mjs";
14
14
  import { createMCPRequestHeaders } from "../auth/index.mjs";
15
15
  import { isAbortOrTimeoutError } from "../protocols/abort.mjs";
16
16
  import { normalizeTransportOptions } from "../protocols/index.mjs";
17
+ import { createA2AClientFromCardUrl } from "../protocols/a2a.mjs";
17
18
  import {
18
19
  AuthenticationRequiredError,
19
20
  ConfigurationError,
@@ -24,6 +25,7 @@ import {
24
25
  is401Error
25
26
  } from "../errors/index.mjs";
26
27
  import { createAgentTransportFetch, isLikelyPrivateUrl } from "../net/index.mjs";
28
+ import { isCredentialHeaderName } from "../net/credential-headers.mjs";
27
29
  import {
28
30
  discoverAuthorizationRequirements,
29
31
  NeedsAuthorizationError,
@@ -981,20 +983,22 @@ class SingleAgentClient {
981
983
  const sizeLimitedFetch = wrapFetchWithSizeLimit(
982
984
  createAgentTransportFetch(agentUri, {
983
985
  trustedFetchFn: transport?.trustedFetchFn,
984
- allowPrivateIp: transport?.allowPrivateIp
986
+ allowPrivateIp: transport?.allowPrivateIp,
987
+ originBoundHeaders: Object.keys(this.normalizedAgent.headers ?? {}),
988
+ crossOriginCredentialPolicy: transport?.legacyCompat?.enabled === false ? "refuse" : "strip"
985
989
  })
986
990
  );
987
991
  const authToken = this.normalizedAgent.oauth_client_credentials ? this.normalizedAgent.oauth_tokens?.access_token : this.normalizedAgent.auth_token;
988
992
  let got401 = false;
989
993
  const fetchImpl = async (url, requestInit) => {
990
- const headers = {
991
- ...requestInit?.headers,
992
- ...this.normalizedAgent.headers,
993
- ...authToken && {
994
- Authorization: `Bearer ${authToken}`,
995
- "x-adcp-auth": authToken
996
- }
997
- };
994
+ const headers = buildA2ADiscoveryHeaders(requestInit?.headers, this.normalizedAgent.headers, authToken);
995
+ assertNativeA2ADiscoveryCredentialOrigin(
996
+ agentUri,
997
+ url,
998
+ transport?.legacyCompat?.enabled,
999
+ headers,
1000
+ this.normalizedAgent.headers
1001
+ );
998
1002
  const response = await withAbortSignal(
999
1003
  [readOptions?.signal, requestInit?.signal],
1000
1004
  requestTimeoutMs,
@@ -1011,7 +1015,10 @@ class SingleAgentClient {
1011
1015
  let lastError = new Error(`A2A agent card not found at ${cardUrls.join(", ")}`);
1012
1016
  for (const cardUrl of cardUrls) {
1013
1017
  try {
1014
- client = await withResponseSizeLimit(maxResponseBytes, () => A2AClient.fromCardUrl(cardUrl, { fetchImpl }));
1018
+ client = await withResponseSizeLimit(
1019
+ maxResponseBytes,
1020
+ () => createA2AClientFromCardUrl(cardUrl, fetchImpl, transport?.legacyCompat)
1021
+ );
1015
1022
  break;
1016
1023
  } catch (err) {
1017
1024
  lastError = err;
@@ -1021,11 +1028,18 @@ class SingleAgentClient {
1021
1028
  if (!client) {
1022
1029
  throw lastError;
1023
1030
  }
1024
- const agentCard = await withResponseSizeLimit(
1025
- maxResponseBytes,
1026
- async () => client.agentCardPromise ? client.agentCardPromise : client.agentCard
1027
- );
1028
- if (agentCard?.url) {
1031
+ const agentCard = await withResponseSizeLimit(maxResponseBytes, async () => {
1032
+ if (transport?.legacyCompat?.enabled === false) {
1033
+ return client.getAgentCard();
1034
+ }
1035
+ const compatibleClient = client;
1036
+ return typeof compatibleClient.getAgentCard === "function" ? compatibleClient.getAgentCard() : compatibleClient.agentCardPromise ?? compatibleClient.agentCard;
1037
+ });
1038
+ if (transport?.legacyCompat?.enabled === false) {
1039
+ const nativeJsonRpc = selectNativeJsonRpcInterface(agentCard);
1040
+ if (nativeJsonRpc) return nativeJsonRpc.url;
1041
+ }
1042
+ if (agentCard && "url" in agentCard && typeof agentCard.url === "string" && agentCard.url.length > 0) {
1029
1043
  return agentCard.url;
1030
1044
  }
1031
1045
  return this.computeBaseUrl(agentUri);
@@ -3807,7 +3821,7 @@ Hint: this usually means agent_uri does not include the MCP endpoint path. The S
3807
3821
  * Get the fully resolved agent configuration
3808
3822
  *
3809
3823
  * This async method ensures the agent config has the canonical URL resolved:
3810
- * - For A2A: Fetches the agent card and uses its 'url' field
3824
+ * - For A2A: Fetches the agent card and uses its selected native interface or legacy `url`
3811
3825
  * - For MCP: Performs endpoint discovery
3812
3826
  *
3813
3827
  * @returns Promise resolving to agent config with canonical URL
@@ -3870,7 +3884,8 @@ Hint: this usually means agent_uri does not include the MCP endpoint path. The S
3870
3884
  return this.canonicalBaseUrl;
3871
3885
  }
3872
3886
  if (this.normalizedAgent.protocol === "a2a") {
3873
- await this.ensureCanonicalUrlResolved();
3887
+ const resolved = await this.ensureCanonicalUrlResolved();
3888
+ return resolved.agent_uri;
3874
3889
  } else if (this.normalizedAgent.protocol === "mcp") {
3875
3890
  await this.ensureEndpointDiscovered();
3876
3891
  }
@@ -4220,34 +4235,22 @@ Hint: this usually means agent_uri does not include the MCP endpoint path. The S
4220
4235
  const authToken = await ensureReadAuthToken();
4221
4236
  const agentHeaders = this.normalizedAgent.headers ?? {};
4222
4237
  const sizeLimitedFetch = wrapFetchWithSizeLimit(
4223
- (input, init) => transport?.trustedFetchFn ? transport.trustedFetchFn(input, init) : fetch(input, init)
4238
+ createAgentTransportFetch(this.normalizedAgent.agent_uri, {
4239
+ trustedFetchFn: transport?.trustedFetchFn,
4240
+ allowPrivateIp: transport?.allowPrivateIp,
4241
+ originBoundHeaders: Object.keys(agentHeaders),
4242
+ crossOriginCredentialPolicy: transport?.legacyCompat?.enabled === false ? "refuse" : "strip"
4243
+ })
4224
4244
  );
4225
- const normalizeHeaders = (headers) => {
4226
- const normalized = {};
4227
- if (!headers) return normalized;
4228
- if (headers instanceof Headers) {
4229
- headers.forEach((value, key) => {
4230
- normalized[key] = value;
4231
- });
4232
- } else if (Array.isArray(headers)) {
4233
- for (const [key, value] of headers) {
4234
- normalized[key] = value;
4235
- }
4236
- } else {
4237
- Object.assign(normalized, headers);
4238
- }
4239
- return normalized;
4240
- };
4241
- const buildHeaders = (requestInit) => ({
4242
- ...normalizeHeaders(requestInit?.headers),
4243
- ...agentHeaders,
4244
- ...authToken && {
4245
- Authorization: `Bearer ${authToken}`,
4246
- "x-adcp-auth": authToken
4247
- }
4248
- });
4249
4245
  const fetchImpl = async (url, requestInit) => {
4250
- const headers = buildHeaders(requestInit);
4246
+ const headers = buildA2ADiscoveryHeaders(requestInit?.headers, agentHeaders, authToken);
4247
+ assertNativeA2ADiscoveryCredentialOrigin(
4248
+ this.normalizedAgent.agent_uri,
4249
+ url,
4250
+ transport?.legacyCompat?.enabled,
4251
+ headers,
4252
+ agentHeaders
4253
+ );
4251
4254
  return withAbortSignal(
4252
4255
  [options?.signal, requestInit?.signal],
4253
4256
  requestTimeoutMs,
@@ -4259,7 +4262,10 @@ Hint: this usually means agent_uri does not include the MCP endpoint path. The S
4259
4262
  let lastCardError = new Error(`A2A agent card not found at ${cardUrls.join(", ")}`);
4260
4263
  for (const cardUrl of cardUrls) {
4261
4264
  try {
4262
- client = await withResponseSizeLimit(maxResponseBytes, () => A2AClient.fromCardUrl(cardUrl, { fetchImpl }));
4265
+ client = await withResponseSizeLimit(
4266
+ maxResponseBytes,
4267
+ () => createA2AClientFromCardUrl(cardUrl, fetchImpl, transport?.legacyCompat)
4268
+ );
4263
4269
  break;
4264
4270
  } catch (err) {
4265
4271
  lastCardError = err;
@@ -4268,10 +4274,10 @@ Hint: this usually means agent_uri does not include the MCP endpoint path. The S
4268
4274
  if (!client) {
4269
4275
  throw lastCardError;
4270
4276
  }
4271
- const agentCard = await withResponseSizeLimit(
4272
- maxResponseBytes,
4273
- async () => client.agentCardPromise ? client.agentCardPromise : client.agentCard
4274
- );
4277
+ const agentCard = await withResponseSizeLimit(maxResponseBytes, async () => {
4278
+ const compatibleClient = client;
4279
+ return typeof compatibleClient.getAgentCard === "function" ? compatibleClient.getAgentCard() : compatibleClient.agentCardPromise ?? compatibleClient.agentCard;
4280
+ });
4275
4281
  const tools = agentCard?.skills ? agentCard.skills.map(
4276
4282
  (skill) => ({
4277
4283
  name: skill.id || skill.name,
@@ -4800,6 +4806,40 @@ Hint: this usually means agent_uri does not include the MCP endpoint path. The S
4800
4806
  return schemaMap[taskType] || null;
4801
4807
  }
4802
4808
  }
4809
+ function selectNativeJsonRpcInterface(card) {
4810
+ let selected;
4811
+ for (const agentInterface of card.supportedInterfaces ?? []) {
4812
+ if (agentInterface.protocolBinding.toUpperCase() !== "JSONRPC") continue;
4813
+ if (!selected || agentInterface.protocolVersion === "1.0") selected = agentInterface;
4814
+ }
4815
+ return selected;
4816
+ }
4817
+ function buildA2ADiscoveryHeaders(requestHeaders, agentHeaders, authToken) {
4818
+ const headers = new Headers(requestHeaders);
4819
+ for (const [name, value] of Object.entries(agentHeaders ?? {})) {
4820
+ headers.set(name, value);
4821
+ }
4822
+ if (authToken) {
4823
+ headers.set("authorization", `Bearer ${authToken}`);
4824
+ headers.set("x-adcp-auth", authToken);
4825
+ }
4826
+ return headers;
4827
+ }
4828
+ function assertNativeA2ADiscoveryCredentialOrigin(agentUrl, requestUrl, legacyCompatEnabled, headers, configuredHeaders) {
4829
+ if (legacyCompatEnabled !== false) return;
4830
+ const targetUrl = requestUrl instanceof Request ? requestUrl.url : requestUrl.toString();
4831
+ if (new URL(targetUrl).origin === new URL(agentUrl).origin) return;
4832
+ const configuredHeaderNames = new Set(Object.keys(configuredHeaders ?? {}).map((name) => name.toLowerCase()));
4833
+ const credentialHeaders = [];
4834
+ headers.forEach((_value, name) => {
4835
+ if (configuredHeaderNames.has(name.toLowerCase()) || isCredentialHeaderName(name)) credentialHeaders.push(name);
4836
+ });
4837
+ if (credentialHeaders.length === 0) return;
4838
+ const targetOrigin = new URL(targetUrl).origin;
4839
+ throw new Error(
4840
+ `A2A native discovery refused credentialed cross-origin dispatch to ${targetOrigin}; credential headers: ${credentialHeaders.map((name) => name.toLowerCase()).sort().join(", ")}`
4841
+ );
4842
+ }
4803
4843
  let hasWarnedAboutUnverifiedWebhookReceive = false;
4804
4844
  function warnUnverifiedWebhookReceive() {
4805
4845
  if (hasWarnedAboutUnverifiedWebhookReceive) return;