@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
@@ -2,14 +2,16 @@ import { lookup as dnsLookup } from "node:dns/promises";
2
2
  import { isIP } from "node:net";
3
3
  import { Agent, fetch as undiciFetch } from "undici";
4
4
  import { isAlwaysBlocked, isLikelyPrivateUrl, isPrivateIp } from "./address-guards.mjs";
5
+ import { isCredentialHeaderName } from "./credential-headers.mjs";
5
6
  const REDIRECT_STATUSES = /* @__PURE__ */ new Set([301, 302, 303, 307, 308]);
6
- const SENSITIVE_REDIRECT_HEADERS = ["authorization", "cookie", "proxy-authorization", "x-adcp-auth"];
7
7
  function createAgentTransportFetch(agentUrl, options = {}) {
8
8
  const lookup = options.lookup ?? ((hostname) => dnsLookup(hostname, { all: true }));
9
9
  const maxRedirects = options.maxRedirects ?? 5;
10
10
  const initialUrl = new URL(agentUrl);
11
11
  const allowPrivateEverywhere = options.allowPrivateIp === true || process.env.ADCP_ALLOW_INTERNAL_PROBES === "1" || process.env.ADCP_ALLOW_PRIVATE_AGENT_URL === "1";
12
12
  const allowPrivateInitialOrigin = isLikelyPrivateUrl(initialUrl.toString());
13
+ const originBoundHeaders = new Set((options.originBoundHeaders ?? []).map((name) => name.toLowerCase()));
14
+ const crossOriginCredentialPolicy = options.crossOriginCredentialPolicy ?? "strip";
13
15
  const dispatchers = /* @__PURE__ */ new Map();
14
16
  const dispatcherFor = (url) => {
15
17
  const cached = dispatchers.get(url.origin);
@@ -32,8 +34,40 @@ function createAgentTransportFetch(agentUrl, options = {}) {
32
34
  let headers = new Headers(request?.headers);
33
35
  new Headers(init?.headers).forEach((value, key) => headers.set(key, value));
34
36
  const redirectMode = init?.redirect ?? request?.redirect ?? "follow";
37
+ const stripOriginBoundHeaders = (target) => {
38
+ if (target.origin === initialUrl.origin) return;
39
+ const stripped = [];
40
+ for (const name of originBoundHeaders) {
41
+ if (headers.has(name)) {
42
+ headers.delete(name);
43
+ stripped.push(name);
44
+ }
45
+ }
46
+ if (stripped.length > 0) options.onOriginBoundHeadersStripped?.(stripped, target);
47
+ };
48
+ const credentialHeaderNames = () => {
49
+ const names = [];
50
+ headers.forEach((_value, name) => {
51
+ if (isCredentialHeaderName(name)) names.push(name.toLowerCase());
52
+ });
53
+ return [...new Set(names)].sort();
54
+ };
55
+ const handleCredentialedCrossOrigin = (target, operation) => {
56
+ if (target.origin === initialUrl.origin) return;
57
+ const names = credentialHeaderNames();
58
+ if (names.length === 0) return;
59
+ if (crossOriginCredentialPolicy === "strip") {
60
+ for (const name of names) headers.delete(name);
61
+ return;
62
+ }
63
+ throw new TypeError(
64
+ `Agent transport refused credentialed cross-origin ${operation} to ${target.origin}; credential headers: ${names.join(", ")}`
65
+ );
66
+ };
35
67
  for (let redirects = 0; ; redirects++) {
36
68
  assertTransportScheme(url);
69
+ stripOriginBoundHeaders(url);
70
+ handleCredentialedCrossOrigin(url, "dispatch");
37
71
  const headerRecord = {};
38
72
  headers.forEach((value, key) => {
39
73
  headerRecord[key] = value;
@@ -64,7 +98,8 @@ function createAgentTransportFetch(agentUrl, options = {}) {
64
98
  const next = new URL(response.headers.get("location"), url);
65
99
  await response.body?.cancel();
66
100
  if (next.origin !== url.origin) {
67
- for (const header of SENSITIVE_REDIRECT_HEADERS) headers.delete(header);
101
+ stripOriginBoundHeaders(next);
102
+ handleCredentialedCrossOrigin(next, "redirect");
68
103
  }
69
104
  if (response.status === 303 || (response.status === 301 || response.status === 302) && method === "POST") {
70
105
  method = "GET";
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/lib/net/agent-transport-fetch.ts"],"sourcesContent":["/**\n * DNS-resolving, connection-pinning fetch for MCP and A2A transports.\n *\n * A fetch instance is created alongside a cached protocol client. Each origin\n * is resolved once, every returned address is classified, and an undici Agent\n * pins subsequent connects to the validated address. Redirects are either\n * returned to callers that requested `manual`, or followed hop-by-hop through\n * the same validation path.\n */\nimport { lookup as dnsLookup } from 'node:dns/promises';\nimport { isIP } from 'node:net';\nimport { Agent, fetch as undiciFetch } from 'undici';\nimport { isAlwaysBlocked, isLikelyPrivateUrl, isPrivateIp } from './address-guards';\n\ntype ResolvedAddress = { address: string; family: number };\n\nexport interface AgentTransportFetchOptions {\n /** A caller-owned fetch is trusted to provide its own connect-time pinning. */\n trustedFetchFn?: typeof fetch;\n /** @internal Deterministic network seam; production callers should omit. */\n networkFetch?: (url: URL, init: RequestInit, dispatcher: Agent) => Promise<Response>;\n /** Permit private DNS answers for this client. Prefer this to process-global flags. */\n allowPrivateIp?: boolean;\n /** Test seam for deterministic DNS answers. */\n lookup?: (hostname: string) => Promise<ResolvedAddress[]>;\n maxRedirects?: number;\n}\n\nconst REDIRECT_STATUSES = new Set([301, 302, 303, 307, 308]);\nconst SENSITIVE_REDIRECT_HEADERS = ['authorization', 'cookie', 'proxy-authorization', 'x-adcp-auth'];\n\nexport function createAgentTransportFetch(agentUrl: string, options: AgentTransportFetchOptions = {}): typeof fetch {\n const lookup = options.lookup ?? (hostname => dnsLookup(hostname, { all: true }));\n const maxRedirects = options.maxRedirects ?? 5;\n const initialUrl = new URL(agentUrl);\n const allowPrivateEverywhere =\n options.allowPrivateIp === true ||\n process.env.ADCP_ALLOW_INTERNAL_PROBES === '1' ||\n process.env.ADCP_ALLOW_PRIVATE_AGENT_URL === '1';\n const allowPrivateInitialOrigin = isLikelyPrivateUrl(initialUrl.toString());\n const dispatchers = new Map<string, Promise<Agent>>();\n\n const dispatcherFor = (url: URL): Promise<Agent> => {\n const cached = dispatchers.get(url.origin);\n if (cached) return cached;\n const allowPrivateIp = allowPrivateEverywhere || (allowPrivateInitialOrigin && url.origin === initialUrl.origin);\n const pending = resolveAndCreateDispatcher(url, lookup, allowPrivateIp);\n dispatchers.set(url.origin, pending);\n pending.catch(() => dispatchers.delete(url.origin));\n return pending;\n };\n\n return (async (input: RequestInfo | URL, init?: RequestInit): Promise<Response> => {\n const request = typeof Request !== 'undefined' && input instanceof Request ? input : undefined;\n let url = new URL(request?.url ?? input.toString());\n let method = (init?.method ?? request?.method ?? 'GET').toUpperCase();\n let body = init?.body;\n if (body === undefined && request?.body && method !== 'GET' && method !== 'HEAD') {\n body = new Uint8Array(await request.clone().arrayBuffer());\n }\n const signal = init?.signal ?? request?.signal;\n let headers = new Headers(request?.headers);\n new Headers(init?.headers).forEach((value, key) => headers.set(key, value));\n const redirectMode = init?.redirect ?? request?.redirect ?? 'follow';\n\n for (let redirects = 0; ; redirects++) {\n assertTransportScheme(url);\n const headerRecord: Record<string, string> = {};\n headers.forEach((value, key) => {\n headerRecord[key] = value;\n });\n const requestInit = { ...init, method, body, headers, signal, redirect: 'manual' as const };\n let response: Response;\n if (options.trustedFetchFn) {\n // Explicit trust means the caller owns connect-time DNS pinning. Do\n // not pre-resolve here: hardened proxies and virtual test transports\n // may intentionally use names the host resolver cannot resolve.\n response = await options.trustedFetchFn(url, requestInit);\n } else {\n const dispatcher = await dispatcherFor(url);\n response = options.networkFetch\n ? await options.networkFetch(url, { ...requestInit, headers: headerRecord }, dispatcher)\n : ((await undiciFetch(url, {\n ...requestInit,\n body: body as any,\n headers: headerRecord,\n dispatcher,\n })) as unknown as Response);\n }\n\n if (!REDIRECT_STATUSES.has(response.status) || !response.headers.get('location')) return response;\n if (redirectMode === 'manual') return response;\n if (redirectMode === 'error') {\n await response.body?.cancel();\n throw new TypeError('Redirect encountered while redirect mode is error');\n }\n if (redirects >= maxRedirects) {\n await response.body?.cancel();\n throw new TypeError(`Agent transport exceeded ${maxRedirects} redirects`);\n }\n\n const next = new URL(response.headers.get('location')!, url);\n await response.body?.cancel();\n if (next.origin !== url.origin) {\n for (const header of SENSITIVE_REDIRECT_HEADERS) headers.delete(header);\n }\n if (response.status === 303 || ((response.status === 301 || response.status === 302) && method === 'POST')) {\n method = 'GET';\n body = undefined;\n headers.delete('content-length');\n headers.delete('content-type');\n }\n url = next;\n }\n }) as typeof fetch;\n}\n\nasync function resolveAndCreateDispatcher(\n url: URL,\n lookup: (hostname: string) => Promise<ResolvedAddress[]>,\n allowPrivateIp: boolean\n): Promise<Agent> {\n const hostname = url.hostname.replace(/^\\[|\\]$/g, '');\n const addresses = await lookup(hostname);\n if (addresses.length === 0) throw new Error(`DNS returned no addresses for agent host ${hostname}`);\n for (const entry of addresses) {\n if (isAlwaysBlocked(entry.address)) {\n throw new Error(`Agent host ${hostname} resolves to an always-blocked address`);\n }\n if (!allowPrivateIp && isPrivateIp(entry.address)) {\n throw new Error(\n `Agent host ${hostname} resolves to a private or loopback address; ` +\n 'set transport.allowPrivateIp=true for an explicitly trusted private agent, or provide a trustedFetchFn that enforces its own address policy'\n );\n }\n }\n\n const pinned = addresses[0]!;\n const family = pinned.family === 6 ? 6 : 4;\n return new Agent({\n connect: {\n rejectUnauthorized: true,\n ...(url.protocol === 'https:' && isIP(hostname) === 0 ? { servername: hostname } : {}),\n lookup: (_hostname, lookupOptions, callback) => {\n if (lookupOptions?.all) callback(null, [{ address: pinned.address, family }]);\n else callback(null, pinned.address, family);\n },\n },\n });\n}\n\nfunction assertTransportScheme(url: URL): void {\n if (url.protocol !== 'http:' && url.protocol !== 'https:') {\n throw new TypeError(`Agent transport does not allow ${url.protocol} URLs`);\n }\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../src/lib/net/agent-transport-fetch.ts"],"sourcesContent":["/**\n * DNS-resolving, connection-pinning fetch for MCP and A2A transports.\n *\n * A fetch instance is created alongside a cached protocol client. Each origin\n * is resolved once, every returned address is classified, and an undici Agent\n * pins subsequent connects to the validated address. Redirects are either\n * returned to callers that requested `manual`, or followed hop-by-hop through\n * the same validation path.\n */\nimport { lookup as dnsLookup } from 'node:dns/promises';\nimport { isIP } from 'node:net';\nimport { Agent, fetch as undiciFetch } from 'undici';\nimport { isAlwaysBlocked, isLikelyPrivateUrl, isPrivateIp } from './address-guards';\nimport { isCredentialHeaderName } from './credential-headers';\n\ntype ResolvedAddress = { address: string; family: number };\n\nexport interface AgentTransportFetchOptions {\n /** A caller-owned fetch is trusted to provide its own connect-time pinning. */\n trustedFetchFn?: typeof fetch;\n /** @internal Deterministic network seam; production callers should omit. */\n networkFetch?: (url: URL, init: RequestInit, dispatcher: Agent) => Promise<Response>;\n /** Permit private DNS answers for this client. Prefer this to process-global flags. */\n allowPrivateIp?: boolean;\n /** Test seam for deterministic DNS answers. */\n lookup?: (hostname: string) => Promise<ResolvedAddress[]>;\n maxRedirects?: number;\n /**\n * Caller-configured headers that are trusted only at the configured agent\n * origin. Unlike the credential-name denylist, this binds arbitrary names\n * (for example X-Session) without classifying their contents.\n */\n originBoundHeaders?: readonly string[];\n /** Called after origin-bound headers are removed, without exposing values. */\n onOriginBoundHeadersStripped?: (headerNames: readonly string[], target: URL) => void;\n /**\n * Cross-origin handling for credential-shaped headers added by protocol\n * clients. Strict native A2A refuses; stable legacy A2A and MCP strip and\n * continue so redirects/endpoints remain compatible without leaking them.\n * @default 'strip'\n */\n crossOriginCredentialPolicy?: 'refuse' | 'strip';\n}\n\nconst REDIRECT_STATUSES = new Set([301, 302, 303, 307, 308]);\n\nexport function createAgentTransportFetch(agentUrl: string, options: AgentTransportFetchOptions = {}): typeof fetch {\n const lookup = options.lookup ?? (hostname => dnsLookup(hostname, { all: true }));\n const maxRedirects = options.maxRedirects ?? 5;\n const initialUrl = new URL(agentUrl);\n const allowPrivateEverywhere =\n options.allowPrivateIp === true ||\n process.env.ADCP_ALLOW_INTERNAL_PROBES === '1' ||\n process.env.ADCP_ALLOW_PRIVATE_AGENT_URL === '1';\n const allowPrivateInitialOrigin = isLikelyPrivateUrl(initialUrl.toString());\n const originBoundHeaders = new Set((options.originBoundHeaders ?? []).map(name => name.toLowerCase()));\n // Preserve the stable public helper's compatibility behavior: credentials\n // are origin-bound and removed on cross-origin dispatch. Security-sensitive\n // native A2A call sites opt into `refuse` explicitly.\n const crossOriginCredentialPolicy = options.crossOriginCredentialPolicy ?? 'strip';\n const dispatchers = new Map<string, Promise<Agent>>();\n\n const dispatcherFor = (url: URL): Promise<Agent> => {\n const cached = dispatchers.get(url.origin);\n if (cached) return cached;\n const allowPrivateIp = allowPrivateEverywhere || (allowPrivateInitialOrigin && url.origin === initialUrl.origin);\n const pending = resolveAndCreateDispatcher(url, lookup, allowPrivateIp);\n dispatchers.set(url.origin, pending);\n pending.catch(() => dispatchers.delete(url.origin));\n return pending;\n };\n\n return (async (input: RequestInfo | URL, init?: RequestInit): Promise<Response> => {\n const request = typeof Request !== 'undefined' && input instanceof Request ? input : undefined;\n let url = new URL(request?.url ?? input.toString());\n let method = (init?.method ?? request?.method ?? 'GET').toUpperCase();\n let body = init?.body;\n if (body === undefined && request?.body && method !== 'GET' && method !== 'HEAD') {\n body = new Uint8Array(await request.clone().arrayBuffer());\n }\n const signal = init?.signal ?? request?.signal;\n let headers = new Headers(request?.headers);\n new Headers(init?.headers).forEach((value, key) => headers.set(key, value));\n const redirectMode = init?.redirect ?? request?.redirect ?? 'follow';\n\n const stripOriginBoundHeaders = (target: URL): void => {\n if (target.origin === initialUrl.origin) return;\n const stripped: string[] = [];\n for (const name of originBoundHeaders) {\n if (headers.has(name)) {\n headers.delete(name);\n stripped.push(name);\n }\n }\n if (stripped.length > 0) options.onOriginBoundHeadersStripped?.(stripped, target);\n };\n\n const credentialHeaderNames = (): string[] => {\n const names: string[] = [];\n headers.forEach((_value, name) => {\n if (isCredentialHeaderName(name)) names.push(name.toLowerCase());\n });\n return [...new Set(names)].sort();\n };\n\n const handleCredentialedCrossOrigin = (target: URL, operation: 'dispatch' | 'redirect'): void => {\n if (target.origin === initialUrl.origin) return;\n const names = credentialHeaderNames();\n if (names.length === 0) return;\n if (crossOriginCredentialPolicy === 'strip') {\n for (const name of names) headers.delete(name);\n return;\n }\n throw new TypeError(\n `Agent transport refused credentialed cross-origin ${operation} to ${target.origin}; ` +\n `credential headers: ${names.join(', ')}`\n );\n };\n\n for (let redirects = 0; ; redirects++) {\n assertTransportScheme(url);\n stripOriginBoundHeaders(url);\n handleCredentialedCrossOrigin(url, 'dispatch');\n const headerRecord: Record<string, string> = {};\n headers.forEach((value, key) => {\n headerRecord[key] = value;\n });\n const requestInit = { ...init, method, body, headers, signal, redirect: 'manual' as const };\n let response: Response;\n if (options.trustedFetchFn) {\n // Explicit trust means the caller owns connect-time DNS pinning. Do\n // not pre-resolve here: hardened proxies and virtual test transports\n // may intentionally use names the host resolver cannot resolve.\n response = await options.trustedFetchFn(url, requestInit);\n } else {\n const dispatcher = await dispatcherFor(url);\n response = options.networkFetch\n ? await options.networkFetch(url, { ...requestInit, headers: headerRecord }, dispatcher)\n : ((await undiciFetch(url, {\n ...requestInit,\n body: body as any,\n headers: headerRecord,\n dispatcher,\n })) as unknown as Response);\n }\n\n if (!REDIRECT_STATUSES.has(response.status) || !response.headers.get('location')) return response;\n if (redirectMode === 'manual') return response;\n if (redirectMode === 'error') {\n await response.body?.cancel();\n throw new TypeError('Redirect encountered while redirect mode is error');\n }\n if (redirects >= maxRedirects) {\n await response.body?.cancel();\n throw new TypeError(`Agent transport exceeded ${maxRedirects} redirects`);\n }\n\n const next = new URL(response.headers.get('location')!, url);\n await response.body?.cancel();\n if (next.origin !== url.origin) {\n // Configured user headers are origin-bound regardless of their name.\n // Remove them before the generic credential check so an X-Session-like\n // header is stripped while SDK/auth/signature headers still fail closed.\n stripOriginBoundHeaders(next);\n handleCredentialedCrossOrigin(next, 'redirect');\n }\n if (response.status === 303 || ((response.status === 301 || response.status === 302) && method === 'POST')) {\n method = 'GET';\n body = undefined;\n headers.delete('content-length');\n headers.delete('content-type');\n }\n url = next;\n }\n }) as typeof fetch;\n}\n\nasync function resolveAndCreateDispatcher(\n url: URL,\n lookup: (hostname: string) => Promise<ResolvedAddress[]>,\n allowPrivateIp: boolean\n): Promise<Agent> {\n const hostname = url.hostname.replace(/^\\[|\\]$/g, '');\n const addresses = await lookup(hostname);\n if (addresses.length === 0) throw new Error(`DNS returned no addresses for agent host ${hostname}`);\n for (const entry of addresses) {\n if (isAlwaysBlocked(entry.address)) {\n throw new Error(`Agent host ${hostname} resolves to an always-blocked address`);\n }\n if (!allowPrivateIp && isPrivateIp(entry.address)) {\n throw new Error(\n `Agent host ${hostname} resolves to a private or loopback address; ` +\n 'set transport.allowPrivateIp=true for an explicitly trusted private agent, or provide a trustedFetchFn that enforces its own address policy'\n );\n }\n }\n\n const pinned = addresses[0]!;\n const family = pinned.family === 6 ? 6 : 4;\n return new Agent({\n connect: {\n rejectUnauthorized: true,\n ...(url.protocol === 'https:' && isIP(hostname) === 0 ? { servername: hostname } : {}),\n lookup: (_hostname, lookupOptions, callback) => {\n if (lookupOptions?.all) callback(null, [{ address: pinned.address, family }]);\n else callback(null, pinned.address, family);\n },\n },\n });\n}\n\nfunction assertTransportScheme(url: URL): void {\n if (url.protocol !== 'http:' && url.protocol !== 'https:') {\n throw new TypeError(`Agent transport does not allow ${url.protocol} URLs`);\n }\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=credential-headers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credential-headers.d.ts","sourceRoot":"","sources":["../../../src/lib/net/credential-headers.ts"],"names":[],"mappings":""}
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var credential_headers_exports = {};
20
+ __export(credential_headers_exports, {
21
+ isCredentialHeaderName: () => isCredentialHeaderName
22
+ });
23
+ module.exports = __toCommonJS(credential_headers_exports);
24
+ const CREDENTIAL_HEADER_NAMES = /* @__PURE__ */ new Set(["authorization", "proxy-authorization", "cookie", "x-adcp-auth", "x-api-key"]);
25
+ const CREDENTIAL_HEADER_RE = /(^|[-_])(auth(?:entication|orization)?|credentials?|secrets?|tokens?|keys?|api[-_]?keys?|access[-_]?keys?|private[-_]?keys?|password|passwd|signatures?|cert(?:ificate)?s?)([-_]|$)/i;
26
+ function isCredentialHeaderName(name) {
27
+ const normalized = name.toLowerCase();
28
+ return CREDENTIAL_HEADER_NAMES.has(normalized) || CREDENTIAL_HEADER_RE.test(normalized);
29
+ }
30
+ // Annotate the CommonJS export names for ESM import in node:
31
+ 0 && (module.exports = {
32
+ isCredentialHeaderName
33
+ });
34
+ //# sourceMappingURL=credential-headers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/lib/net/credential-headers.ts"],"sourcesContent":["const CREDENTIAL_HEADER_NAMES = new Set(['authorization', 'proxy-authorization', 'cookie', 'x-adcp-auth', 'x-api-key']);\n\nconst CREDENTIAL_HEADER_RE =\n /(^|[-_])(auth(?:entication|orization)?|credentials?|secrets?|tokens?|keys?|api[-_]?keys?|access[-_]?keys?|private[-_]?keys?|password|passwd|signatures?|cert(?:ificate)?s?)([-_]|$)/i;\n\n/** @internal Shared transport credential-header classifier for origin isolation. */\nexport function isCredentialHeaderName(name: string): boolean {\n const normalized = name.toLowerCase();\n return CREDENTIAL_HEADER_NAMES.has(normalized) || CREDENTIAL_HEADER_RE.test(normalized);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAAM,0BAA0B,oBAAI,IAAI,CAAC,iBAAiB,uBAAuB,UAAU,eAAe,WAAW,CAAC;AAEtH,MAAM,uBACJ;AAGK,SAAS,uBAAuB,MAAuB;AAC5D,QAAM,aAAa,KAAK,YAAY;AACpC,SAAO,wBAAwB,IAAI,UAAU,KAAK,qBAAqB,KAAK,UAAU;AACxF;","names":[]}
@@ -0,0 +1,10 @@
1
+ const CREDENTIAL_HEADER_NAMES = /* @__PURE__ */ new Set(["authorization", "proxy-authorization", "cookie", "x-adcp-auth", "x-api-key"]);
2
+ const CREDENTIAL_HEADER_RE = /(^|[-_])(auth(?:entication|orization)?|credentials?|secrets?|tokens?|keys?|api[-_]?keys?|access[-_]?keys?|private[-_]?keys?|password|passwd|signatures?|cert(?:ificate)?s?)([-_]|$)/i;
3
+ function isCredentialHeaderName(name) {
4
+ const normalized = name.toLowerCase();
5
+ return CREDENTIAL_HEADER_NAMES.has(normalized) || CREDENTIAL_HEADER_RE.test(normalized);
6
+ }
7
+ export {
8
+ isCredentialHeaderName
9
+ };
10
+ //# sourceMappingURL=credential-headers.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/lib/net/credential-headers.ts"],"sourcesContent":["const CREDENTIAL_HEADER_NAMES = new Set(['authorization', 'proxy-authorization', 'cookie', 'x-adcp-auth', 'x-api-key']);\n\nconst CREDENTIAL_HEADER_RE =\n /(^|[-_])(auth(?:entication|orization)?|credentials?|secrets?|tokens?|keys?|api[-_]?keys?|access[-_]?keys?|private[-_]?keys?|password|passwd|signatures?|cert(?:ificate)?s?)([-_]|$)/i;\n\n/** @internal Shared transport credential-header classifier for origin isolation. */\nexport function isCredentialHeaderName(name: string): boolean {\n const normalized = name.toLowerCase();\n return CREDENTIAL_HEADER_NAMES.has(normalized) || CREDENTIAL_HEADER_RE.test(normalized);\n}\n"],"mappings":"AAAA,MAAM,0BAA0B,oBAAI,IAAI,CAAC,iBAAiB,uBAAuB,UAAU,eAAe,WAAW,CAAC;AAEtH,MAAM,uBACJ;AAGK,SAAS,uBAAuB,MAAuB;AAC5D,QAAM,aAAa,KAAK,YAAY;AACpC,SAAO,wBAAwB,IAAI,UAAU,KAAK,qBAAqB,KAAK,UAAU;AACxF;","names":[]}
@@ -0,0 +1,18 @@
1
+ import { type Client } from '@a2a-js/sdk-v1/client';
2
+ import { type CancelTaskRequest } from '@a2a-js/sdk-v1';
3
+ import type { PushNotificationConfig } from '../types/tools.generated.mjs';
4
+ export declare function createNativeA2AClientFromCardUrl(cardUrl: string, fetchImpl: typeof fetch): Promise<Client>;
5
+ export declare function callNativeA2ATool(options: {
6
+ cardUrls: readonly string[];
7
+ fetchImpl: typeof fetch;
8
+ toolName: string;
9
+ parameters: Record<string, unknown>;
10
+ pushNotificationConfig?: PushNotificationConfig;
11
+ contextId?: string;
12
+ taskId?: string;
13
+ signal?: AbortSignal;
14
+ }): Promise<unknown>;
15
+ export declare function createNativeCancelTaskRequest(id: string): CancelTaskRequest;
16
+ export declare function normalizeNativeA2AResult(result: any): {
17
+ result: unknown;
18
+ };
@@ -0,0 +1,19 @@
1
+ import { type Client } from '@a2a-js/sdk-v1/client';
2
+ import { type CancelTaskRequest } from '@a2a-js/sdk-v1';
3
+ import type { PushNotificationConfig } from '../types/tools.generated';
4
+ export declare function createNativeA2AClientFromCardUrl(cardUrl: string, fetchImpl: typeof fetch): Promise<Client>;
5
+ export declare function callNativeA2ATool(options: {
6
+ cardUrls: readonly string[];
7
+ fetchImpl: typeof fetch;
8
+ toolName: string;
9
+ parameters: Record<string, unknown>;
10
+ pushNotificationConfig?: PushNotificationConfig;
11
+ contextId?: string;
12
+ taskId?: string;
13
+ signal?: AbortSignal;
14
+ }): Promise<unknown>;
15
+ export declare function createNativeCancelTaskRequest(id: string): CancelTaskRequest;
16
+ export declare function normalizeNativeA2AResult(result: any): {
17
+ result: unknown;
18
+ };
19
+ //# sourceMappingURL=a2a-native-v1.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"a2a-native-v1.d.ts","sourceRoot":"","sources":["../../../src/lib/protocols/a2a-native-v1.ts"],"names":[],"mappings":"AAAA,OAAO,EAML,KAAK,MAAM,EACZ,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAmB,KAAK,iBAAiB,EAA2B,MAAM,gBAAgB,CAAC;AAClG,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAOvE,wBAAsB,gCAAgC,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,CAMhH;AAED,wBAAsB,iBAAiB,CAAC,OAAO,EAAE;IAC/C,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;IAC5B,SAAS,EAAE,OAAO,KAAK,CAAC;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACpC,sBAAsB,CAAC,EAAE,sBAAsB,CAAC;IAChD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB,GAAG,OAAO,CAAC,OAAO,CAAC,CA0DnB;AAgDD,wBAAgB,6BAA6B,CAAC,EAAE,EAAE,MAAM,GAAG,iBAAiB,CAE3E;AAED,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,GAAG,GAAG;IAAE,MAAM,EAAE,OAAO,CAAA;CAAE,CAiDzE"}
@@ -0,0 +1,183 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var a2a_native_v1_exports = {};
20
+ __export(a2a_native_v1_exports, {
21
+ callNativeA2ATool: () => callNativeA2ATool,
22
+ createNativeA2AClientFromCardUrl: () => createNativeA2AClientFromCardUrl,
23
+ createNativeCancelTaskRequest: () => createNativeCancelTaskRequest,
24
+ normalizeNativeA2AResult: () => normalizeNativeA2AResult
25
+ });
26
+ module.exports = __toCommonJS(a2a_native_v1_exports);
27
+ var import_client = require("@a2a-js/sdk-v1/client");
28
+ var import_sdk_v1 = require("@a2a-js/sdk-v1");
29
+ var import_a2a_push_notification = require('./a2a-push-notification.js');
30
+ var import_abort = require('./abort.js');
31
+ const ADCP_A2A_EXTENSION = "https://adcontextprotocol.org/extensions/adcp/v3";
32
+ const NATIVE_ONLY = Object.freeze({ enabled: false });
33
+ async function createNativeA2AClientFromCardUrl(cardUrl, fetchImpl) {
34
+ const factory = new import_client.ClientFactory({
35
+ transports: [new import_client.JsonRpcTransportFactory({ fetchImpl, legacyCompat: NATIVE_ONLY })],
36
+ cardResolver: new import_client.DefaultAgentCardResolver({ fetchImpl, legacyCompat: NATIVE_ONLY })
37
+ });
38
+ return factory.createFromUrl(cardUrl, "");
39
+ }
40
+ async function callNativeA2ATool(options) {
41
+ let client;
42
+ let lastError;
43
+ for (const cardUrl of options.cardUrls) {
44
+ try {
45
+ client = await createNativeA2AClientFromCardUrl(cardUrl, options.fetchImpl);
46
+ break;
47
+ } catch (error) {
48
+ if ((0, import_abort.isAbortOrTimeoutError)(error)) throw error;
49
+ lastError = error;
50
+ }
51
+ }
52
+ if (!client) {
53
+ throw new Error(
54
+ "A2A agent card discovery failed. Native conformance uses the official A2A 1.0 client; for a maintained A2A 0.3 server use transport.legacyCompat.enabled=true (CLI: --a2a-legacy-compat).",
55
+ { cause: lastError }
56
+ );
57
+ }
58
+ const request = {
59
+ tenant: "",
60
+ message: {
61
+ messageId: `msg_${Date.now()}_${Math.random().toString(36).slice(2, 11)}`,
62
+ role: import_sdk_v1.Role.ROLE_USER,
63
+ parts: [
64
+ {
65
+ content: { $case: "data", value: { skill: options.toolName, input: options.parameters } },
66
+ metadata: void 0,
67
+ filename: "",
68
+ mediaType: "application/json"
69
+ }
70
+ ],
71
+ contextId: options.contextId ?? "",
72
+ taskId: options.taskId ?? "",
73
+ metadata: void 0,
74
+ extensions: [ADCP_A2A_EXTENSION],
75
+ referenceTaskIds: []
76
+ },
77
+ configuration: options.pushNotificationConfig ? {
78
+ acceptedOutputModes: ["application/json"],
79
+ taskPushNotificationConfig: (0, import_a2a_push_notification.toA2ATaskPushNotificationConfig)(options.pushNotificationConfig),
80
+ returnImmediately: false
81
+ } : void 0,
82
+ metadata: void 0
83
+ };
84
+ const result = await client.sendMessage(request, {
85
+ serviceParameters: import_client.ServiceParameters.create((0, import_client.withA2AExtensions)(ADCP_A2A_EXTENSION)),
86
+ signal: options.signal
87
+ });
88
+ return normalizeNativeA2AResult(result);
89
+ }
90
+ function normalizePart(part) {
91
+ switch (part?.content?.$case) {
92
+ case "data":
93
+ return { kind: "data", data: part.content.value, metadata: part.metadata };
94
+ case "text":
95
+ return { kind: "text", text: part.content.value, metadata: part.metadata };
96
+ case "url":
97
+ return {
98
+ kind: "file",
99
+ file: { uri: part.content.value, name: part.filename, mimeType: part.mediaType },
100
+ metadata: part.metadata
101
+ };
102
+ case "raw":
103
+ return {
104
+ kind: "file",
105
+ file: { bytes: part.content.value, name: part.filename, mimeType: part.mediaType },
106
+ metadata: part.metadata
107
+ };
108
+ default:
109
+ return part;
110
+ }
111
+ }
112
+ function taskStateName(state) {
113
+ switch (state) {
114
+ case import_sdk_v1.TaskState.TASK_STATE_SUBMITTED:
115
+ return "submitted";
116
+ case import_sdk_v1.TaskState.TASK_STATE_WORKING:
117
+ return "working";
118
+ case import_sdk_v1.TaskState.TASK_STATE_COMPLETED:
119
+ return "completed";
120
+ case import_sdk_v1.TaskState.TASK_STATE_FAILED:
121
+ return "failed";
122
+ case import_sdk_v1.TaskState.TASK_STATE_CANCELED:
123
+ return "canceled";
124
+ case import_sdk_v1.TaskState.TASK_STATE_INPUT_REQUIRED:
125
+ return "input-required";
126
+ case import_sdk_v1.TaskState.TASK_STATE_REJECTED:
127
+ return "rejected";
128
+ case import_sdk_v1.TaskState.TASK_STATE_AUTH_REQUIRED:
129
+ return "auth-required";
130
+ default:
131
+ return void 0;
132
+ }
133
+ }
134
+ function createNativeCancelTaskRequest(id) {
135
+ return { tenant: "", id, metadata: void 0 };
136
+ }
137
+ function normalizeNativeA2AResult(result) {
138
+ if (result && typeof result === "object") {
139
+ const oneof = result.result ?? result;
140
+ const payload = oneof.task ?? oneof.message ?? (oneof.$case === "task" ? oneof.task : void 0);
141
+ if (payload !== void 0) return normalizeNativeA2AResult(payload);
142
+ if ("error" in result) return result;
143
+ }
144
+ if (result && typeof result === "object" && typeof result.messageId === "string") {
145
+ return {
146
+ result: {
147
+ ...result,
148
+ kind: "message",
149
+ parts: Array.isArray(result.parts) ? result.parts.map(normalizePart) : []
150
+ }
151
+ };
152
+ }
153
+ if (result && typeof result === "object" && ("status" in result || "artifacts" in result || "history" in result)) {
154
+ return {
155
+ result: {
156
+ ...result,
157
+ kind: "task",
158
+ status: result.status ? {
159
+ ...result.status,
160
+ state: taskStateName(result.status.state),
161
+ message: result.status.message ? {
162
+ ...result.status.message,
163
+ kind: "message",
164
+ parts: Array.isArray(result.status.message.parts) ? result.status.message.parts.map(normalizePart) : []
165
+ } : void 0
166
+ } : void 0,
167
+ artifacts: Array.isArray(result.artifacts) ? result.artifacts.map((artifact) => ({
168
+ ...artifact,
169
+ parts: artifact.parts?.map(normalizePart) ?? []
170
+ })) : []
171
+ }
172
+ };
173
+ }
174
+ return { result };
175
+ }
176
+ // Annotate the CommonJS export names for ESM import in node:
177
+ 0 && (module.exports = {
178
+ callNativeA2ATool,
179
+ createNativeA2AClientFromCardUrl,
180
+ createNativeCancelTaskRequest,
181
+ normalizeNativeA2AResult
182
+ });
183
+ //# sourceMappingURL=a2a-native-v1.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/lib/protocols/a2a-native-v1.ts"],"sourcesContent":["import {\n ClientFactory,\n DefaultAgentCardResolver,\n JsonRpcTransportFactory,\n ServiceParameters,\n withA2AExtensions,\n type Client,\n} from '@a2a-js/sdk-v1/client';\nimport { Role, TaskState, type CancelTaskRequest, type SendMessageRequest } from '@a2a-js/sdk-v1';\nimport type { PushNotificationConfig } from '../types/tools.generated';\nimport { toA2ATaskPushNotificationConfig } from './a2a-push-notification';\nimport { isAbortOrTimeoutError } from './abort';\n\nconst ADCP_A2A_EXTENSION = 'https://adcontextprotocol.org/extensions/adcp/v3';\nconst NATIVE_ONLY = Object.freeze({ enabled: false });\n\nexport async function createNativeA2AClientFromCardUrl(cardUrl: string, fetchImpl: typeof fetch): Promise<Client> {\n const factory = new ClientFactory({\n transports: [new JsonRpcTransportFactory({ fetchImpl, legacyCompat: NATIVE_ONLY })],\n cardResolver: new DefaultAgentCardResolver({ fetchImpl, legacyCompat: NATIVE_ONLY }),\n });\n return factory.createFromUrl(cardUrl, '');\n}\n\nexport async function callNativeA2ATool(options: {\n cardUrls: readonly string[];\n fetchImpl: typeof fetch;\n toolName: string;\n parameters: Record<string, unknown>;\n pushNotificationConfig?: PushNotificationConfig;\n contextId?: string;\n taskId?: string;\n signal?: AbortSignal;\n}): Promise<unknown> {\n let client: Client | undefined;\n let lastError: unknown;\n for (const cardUrl of options.cardUrls) {\n try {\n client = await createNativeA2AClientFromCardUrl(cardUrl, options.fetchImpl);\n break;\n } catch (error) {\n // Cancellation and deadlines are terminal caller intent, not evidence\n // that the card URL is incompatible. Preserve their identity and avoid\n // probing fallback card paths after the request has already ended.\n if (isAbortOrTimeoutError(error)) throw error;\n lastError = error;\n }\n }\n if (!client) {\n throw new Error(\n 'A2A agent card discovery failed. Native conformance uses the official A2A 1.0 client; ' +\n 'for a maintained A2A 0.3 server use transport.legacyCompat.enabled=true ' +\n '(CLI: --a2a-legacy-compat).',\n { cause: lastError }\n );\n }\n\n const request: SendMessageRequest = {\n tenant: '',\n message: {\n messageId: `msg_${Date.now()}_${Math.random().toString(36).slice(2, 11)}`,\n role: Role.ROLE_USER,\n parts: [\n {\n content: { $case: 'data', value: { skill: options.toolName, input: options.parameters } },\n metadata: undefined,\n filename: '',\n mediaType: 'application/json',\n },\n ],\n contextId: options.contextId ?? '',\n taskId: options.taskId ?? '',\n metadata: undefined,\n extensions: [ADCP_A2A_EXTENSION],\n referenceTaskIds: [],\n },\n configuration: options.pushNotificationConfig\n ? {\n acceptedOutputModes: ['application/json'],\n taskPushNotificationConfig: toA2ATaskPushNotificationConfig(options.pushNotificationConfig),\n returnImmediately: false,\n }\n : undefined,\n metadata: undefined,\n };\n\n const result = await client.sendMessage(request, {\n serviceParameters: ServiceParameters.create(withA2AExtensions(ADCP_A2A_EXTENSION)),\n signal: options.signal,\n });\n return normalizeNativeA2AResult(result);\n}\n\nfunction normalizePart(part: any): Record<string, unknown> {\n switch (part?.content?.$case) {\n case 'data':\n return { kind: 'data', data: part.content.value, metadata: part.metadata };\n case 'text':\n return { kind: 'text', text: part.content.value, metadata: part.metadata };\n case 'url':\n return {\n kind: 'file',\n file: { uri: part.content.value, name: part.filename, mimeType: part.mediaType },\n metadata: part.metadata,\n };\n case 'raw':\n return {\n kind: 'file',\n file: { bytes: part.content.value, name: part.filename, mimeType: part.mediaType },\n metadata: part.metadata,\n };\n default:\n return part;\n }\n}\n\nfunction taskStateName(state: TaskState | undefined): string | undefined {\n switch (state) {\n case TaskState.TASK_STATE_SUBMITTED:\n return 'submitted';\n case TaskState.TASK_STATE_WORKING:\n return 'working';\n case TaskState.TASK_STATE_COMPLETED:\n return 'completed';\n case TaskState.TASK_STATE_FAILED:\n return 'failed';\n case TaskState.TASK_STATE_CANCELED:\n return 'canceled';\n case TaskState.TASK_STATE_INPUT_REQUIRED:\n return 'input-required';\n case TaskState.TASK_STATE_REJECTED:\n return 'rejected';\n case TaskState.TASK_STATE_AUTH_REQUIRED:\n return 'auth-required';\n default:\n return undefined;\n }\n}\n\nexport function createNativeCancelTaskRequest(id: string): CancelTaskRequest {\n return { tenant: '', id, metadata: undefined };\n}\n\nexport function normalizeNativeA2AResult(result: any): { result: unknown } {\n if (result && typeof result === 'object') {\n const oneof = result.result ?? result;\n const payload = oneof.task ?? oneof.message ?? (oneof.$case === 'task' ? oneof.task : undefined);\n if (payload !== undefined) return normalizeNativeA2AResult(payload);\n if ('error' in result) return result;\n }\n // Message.contextId is always materialized by the 1.0 protobuf runtime,\n // including as an empty string. Check the message-only identifier first so\n // a Message is never mistaken for a Task merely because it has contextId.\n if (result && typeof result === 'object' && typeof result.messageId === 'string') {\n return {\n result: {\n ...result,\n kind: 'message',\n parts: Array.isArray(result.parts) ? result.parts.map(normalizePart) : [],\n },\n };\n }\n if (result && typeof result === 'object' && ('status' in result || 'artifacts' in result || 'history' in result)) {\n return {\n result: {\n ...result,\n kind: 'task',\n status: result.status\n ? {\n ...result.status,\n state: taskStateName(result.status.state),\n message: result.status.message\n ? {\n ...result.status.message,\n kind: 'message',\n parts: Array.isArray(result.status.message.parts)\n ? result.status.message.parts.map(normalizePart)\n : [],\n }\n : undefined,\n }\n : undefined,\n artifacts: Array.isArray(result.artifacts)\n ? result.artifacts.map((artifact: any) => ({\n ...artifact,\n parts: artifact.parts?.map(normalizePart) ?? [],\n }))\n : [],\n },\n };\n }\n return { result };\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,167 @@
1
+ import { fileURLToPath as __adcpFileURLToPath } from "node:url";
2
+ import { dirname as __adcpDirname } from "node:path";
3
+ import { createRequire as __adcpCreateRequire } from "node:module";
4
+ const __dirname = __adcpDirname(__adcpFileURLToPath(import.meta.url));
5
+ const require2 = __adcpCreateRequire(import.meta.url);
6
+ import {
7
+ ClientFactory,
8
+ DefaultAgentCardResolver,
9
+ JsonRpcTransportFactory,
10
+ ServiceParameters,
11
+ withA2AExtensions
12
+ } from "@a2a-js/sdk-v1/client";
13
+ import { Role, TaskState } from "@a2a-js/sdk-v1";
14
+ import { toA2ATaskPushNotificationConfig } from "./a2a-push-notification.mjs";
15
+ import { isAbortOrTimeoutError } from "./abort.mjs";
16
+ const ADCP_A2A_EXTENSION = "https://adcontextprotocol.org/extensions/adcp/v3";
17
+ const NATIVE_ONLY = Object.freeze({ enabled: false });
18
+ async function createNativeA2AClientFromCardUrl(cardUrl, fetchImpl) {
19
+ const factory = new ClientFactory({
20
+ transports: [new JsonRpcTransportFactory({ fetchImpl, legacyCompat: NATIVE_ONLY })],
21
+ cardResolver: new DefaultAgentCardResolver({ fetchImpl, legacyCompat: NATIVE_ONLY })
22
+ });
23
+ return factory.createFromUrl(cardUrl, "");
24
+ }
25
+ async function callNativeA2ATool(options) {
26
+ let client;
27
+ let lastError;
28
+ for (const cardUrl of options.cardUrls) {
29
+ try {
30
+ client = await createNativeA2AClientFromCardUrl(cardUrl, options.fetchImpl);
31
+ break;
32
+ } catch (error) {
33
+ if (isAbortOrTimeoutError(error)) throw error;
34
+ lastError = error;
35
+ }
36
+ }
37
+ if (!client) {
38
+ throw new Error(
39
+ "A2A agent card discovery failed. Native conformance uses the official A2A 1.0 client; for a maintained A2A 0.3 server use transport.legacyCompat.enabled=true (CLI: --a2a-legacy-compat).",
40
+ { cause: lastError }
41
+ );
42
+ }
43
+ const request = {
44
+ tenant: "",
45
+ message: {
46
+ messageId: `msg_${Date.now()}_${Math.random().toString(36).slice(2, 11)}`,
47
+ role: Role.ROLE_USER,
48
+ parts: [
49
+ {
50
+ content: { $case: "data", value: { skill: options.toolName, input: options.parameters } },
51
+ metadata: void 0,
52
+ filename: "",
53
+ mediaType: "application/json"
54
+ }
55
+ ],
56
+ contextId: options.contextId ?? "",
57
+ taskId: options.taskId ?? "",
58
+ metadata: void 0,
59
+ extensions: [ADCP_A2A_EXTENSION],
60
+ referenceTaskIds: []
61
+ },
62
+ configuration: options.pushNotificationConfig ? {
63
+ acceptedOutputModes: ["application/json"],
64
+ taskPushNotificationConfig: toA2ATaskPushNotificationConfig(options.pushNotificationConfig),
65
+ returnImmediately: false
66
+ } : void 0,
67
+ metadata: void 0
68
+ };
69
+ const result = await client.sendMessage(request, {
70
+ serviceParameters: ServiceParameters.create(withA2AExtensions(ADCP_A2A_EXTENSION)),
71
+ signal: options.signal
72
+ });
73
+ return normalizeNativeA2AResult(result);
74
+ }
75
+ function normalizePart(part) {
76
+ switch (part?.content?.$case) {
77
+ case "data":
78
+ return { kind: "data", data: part.content.value, metadata: part.metadata };
79
+ case "text":
80
+ return { kind: "text", text: part.content.value, metadata: part.metadata };
81
+ case "url":
82
+ return {
83
+ kind: "file",
84
+ file: { uri: part.content.value, name: part.filename, mimeType: part.mediaType },
85
+ metadata: part.metadata
86
+ };
87
+ case "raw":
88
+ return {
89
+ kind: "file",
90
+ file: { bytes: part.content.value, name: part.filename, mimeType: part.mediaType },
91
+ metadata: part.metadata
92
+ };
93
+ default:
94
+ return part;
95
+ }
96
+ }
97
+ function taskStateName(state) {
98
+ switch (state) {
99
+ case TaskState.TASK_STATE_SUBMITTED:
100
+ return "submitted";
101
+ case TaskState.TASK_STATE_WORKING:
102
+ return "working";
103
+ case TaskState.TASK_STATE_COMPLETED:
104
+ return "completed";
105
+ case TaskState.TASK_STATE_FAILED:
106
+ return "failed";
107
+ case TaskState.TASK_STATE_CANCELED:
108
+ return "canceled";
109
+ case TaskState.TASK_STATE_INPUT_REQUIRED:
110
+ return "input-required";
111
+ case TaskState.TASK_STATE_REJECTED:
112
+ return "rejected";
113
+ case TaskState.TASK_STATE_AUTH_REQUIRED:
114
+ return "auth-required";
115
+ default:
116
+ return void 0;
117
+ }
118
+ }
119
+ function createNativeCancelTaskRequest(id) {
120
+ return { tenant: "", id, metadata: void 0 };
121
+ }
122
+ function normalizeNativeA2AResult(result) {
123
+ if (result && typeof result === "object") {
124
+ const oneof = result.result ?? result;
125
+ const payload = oneof.task ?? oneof.message ?? (oneof.$case === "task" ? oneof.task : void 0);
126
+ if (payload !== void 0) return normalizeNativeA2AResult(payload);
127
+ if ("error" in result) return result;
128
+ }
129
+ if (result && typeof result === "object" && typeof result.messageId === "string") {
130
+ return {
131
+ result: {
132
+ ...result,
133
+ kind: "message",
134
+ parts: Array.isArray(result.parts) ? result.parts.map(normalizePart) : []
135
+ }
136
+ };
137
+ }
138
+ if (result && typeof result === "object" && ("status" in result || "artifacts" in result || "history" in result)) {
139
+ return {
140
+ result: {
141
+ ...result,
142
+ kind: "task",
143
+ status: result.status ? {
144
+ ...result.status,
145
+ state: taskStateName(result.status.state),
146
+ message: result.status.message ? {
147
+ ...result.status.message,
148
+ kind: "message",
149
+ parts: Array.isArray(result.status.message.parts) ? result.status.message.parts.map(normalizePart) : []
150
+ } : void 0
151
+ } : void 0,
152
+ artifacts: Array.isArray(result.artifacts) ? result.artifacts.map((artifact) => ({
153
+ ...artifact,
154
+ parts: artifact.parts?.map(normalizePart) ?? []
155
+ })) : []
156
+ }
157
+ };
158
+ }
159
+ return { result };
160
+ }
161
+ export {
162
+ callNativeA2ATool,
163
+ createNativeA2AClientFromCardUrl,
164
+ createNativeCancelTaskRequest,
165
+ normalizeNativeA2AResult
166
+ };
167
+ //# sourceMappingURL=a2a-native-v1.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/lib/protocols/a2a-native-v1.ts"],"sourcesContent":["import { fileURLToPath as __adcpFileURLToPath } from 'node:url';\nimport { dirname as __adcpDirname } from 'node:path';\nimport { createRequire as __adcpCreateRequire } from 'node:module';\nconst __dirname = __adcpDirname(__adcpFileURLToPath(import.meta.url));\nconst require = __adcpCreateRequire(import.meta.url);\nimport {\n ClientFactory,\n DefaultAgentCardResolver,\n JsonRpcTransportFactory,\n ServiceParameters,\n withA2AExtensions,\n type Client,\n} from '@a2a-js/sdk-v1/client';\nimport { Role, TaskState, type CancelTaskRequest, type SendMessageRequest } from '@a2a-js/sdk-v1';\nimport type { PushNotificationConfig } from '../types/tools.generated';\nimport { toA2ATaskPushNotificationConfig } from './a2a-push-notification';\nimport { isAbortOrTimeoutError } from './abort';\n\nconst ADCP_A2A_EXTENSION = 'https://adcontextprotocol.org/extensions/adcp/v3';\nconst NATIVE_ONLY = Object.freeze({ enabled: false });\n\nexport async function createNativeA2AClientFromCardUrl(cardUrl: string, fetchImpl: typeof fetch): Promise<Client> {\n const factory = new ClientFactory({\n transports: [new JsonRpcTransportFactory({ fetchImpl, legacyCompat: NATIVE_ONLY })],\n cardResolver: new DefaultAgentCardResolver({ fetchImpl, legacyCompat: NATIVE_ONLY }),\n });\n return factory.createFromUrl(cardUrl, '');\n}\n\nexport async function callNativeA2ATool(options: {\n cardUrls: readonly string[];\n fetchImpl: typeof fetch;\n toolName: string;\n parameters: Record<string, unknown>;\n pushNotificationConfig?: PushNotificationConfig;\n contextId?: string;\n taskId?: string;\n signal?: AbortSignal;\n}): Promise<unknown> {\n let client: Client | undefined;\n let lastError: unknown;\n for (const cardUrl of options.cardUrls) {\n try {\n client = await createNativeA2AClientFromCardUrl(cardUrl, options.fetchImpl);\n break;\n } catch (error) {\n // Cancellation and deadlines are terminal caller intent, not evidence\n // that the card URL is incompatible. Preserve their identity and avoid\n // probing fallback card paths after the request has already ended.\n if (isAbortOrTimeoutError(error)) throw error;\n lastError = error;\n }\n }\n if (!client) {\n throw new Error(\n 'A2A agent card discovery failed. Native conformance uses the official A2A 1.0 client; ' +\n 'for a maintained A2A 0.3 server use transport.legacyCompat.enabled=true ' +\n '(CLI: --a2a-legacy-compat).',\n { cause: lastError }\n );\n }\n\n const request: SendMessageRequest = {\n tenant: '',\n message: {\n messageId: `msg_${Date.now()}_${Math.random().toString(36).slice(2, 11)}`,\n role: Role.ROLE_USER,\n parts: [\n {\n content: { $case: 'data', value: { skill: options.toolName, input: options.parameters } },\n metadata: undefined,\n filename: '',\n mediaType: 'application/json',\n },\n ],\n contextId: options.contextId ?? '',\n taskId: options.taskId ?? '',\n metadata: undefined,\n extensions: [ADCP_A2A_EXTENSION],\n referenceTaskIds: [],\n },\n configuration: options.pushNotificationConfig\n ? {\n acceptedOutputModes: ['application/json'],\n taskPushNotificationConfig: toA2ATaskPushNotificationConfig(options.pushNotificationConfig),\n returnImmediately: false,\n }\n : undefined,\n metadata: undefined,\n };\n\n const result = await client.sendMessage(request, {\n serviceParameters: ServiceParameters.create(withA2AExtensions(ADCP_A2A_EXTENSION)),\n signal: options.signal,\n });\n return normalizeNativeA2AResult(result);\n}\n\nfunction normalizePart(part: any): Record<string, unknown> {\n switch (part?.content?.$case) {\n case 'data':\n return { kind: 'data', data: part.content.value, metadata: part.metadata };\n case 'text':\n return { kind: 'text', text: part.content.value, metadata: part.metadata };\n case 'url':\n return {\n kind: 'file',\n file: { uri: part.content.value, name: part.filename, mimeType: part.mediaType },\n metadata: part.metadata,\n };\n case 'raw':\n return {\n kind: 'file',\n file: { bytes: part.content.value, name: part.filename, mimeType: part.mediaType },\n metadata: part.metadata,\n };\n default:\n return part;\n }\n}\n\nfunction taskStateName(state: TaskState | undefined): string | undefined {\n switch (state) {\n case TaskState.TASK_STATE_SUBMITTED:\n return 'submitted';\n case TaskState.TASK_STATE_WORKING:\n return 'working';\n case TaskState.TASK_STATE_COMPLETED:\n return 'completed';\n case TaskState.TASK_STATE_FAILED:\n return 'failed';\n case TaskState.TASK_STATE_CANCELED:\n return 'canceled';\n case TaskState.TASK_STATE_INPUT_REQUIRED:\n return 'input-required';\n case TaskState.TASK_STATE_REJECTED:\n return 'rejected';\n case TaskState.TASK_STATE_AUTH_REQUIRED:\n return 'auth-required';\n default:\n return undefined;\n }\n}\n\nexport function createNativeCancelTaskRequest(id: string): CancelTaskRequest {\n return { tenant: '', id, metadata: undefined };\n}\n\nexport function normalizeNativeA2AResult(result: any): { result: unknown } {\n if (result && typeof result === 'object') {\n const oneof = result.result ?? result;\n const payload = oneof.task ?? oneof.message ?? (oneof.$case === 'task' ? oneof.task : undefined);\n if (payload !== undefined) return normalizeNativeA2AResult(payload);\n if ('error' in result) return result;\n }\n // Message.contextId is always materialized by the 1.0 protobuf runtime,\n // including as an empty string. Check the message-only identifier first so\n // a Message is never mistaken for a Task merely because it has contextId.\n if (result && typeof result === 'object' && typeof result.messageId === 'string') {\n return {\n result: {\n ...result,\n kind: 'message',\n parts: Array.isArray(result.parts) ? result.parts.map(normalizePart) : [],\n },\n };\n }\n if (result && typeof result === 'object' && ('status' in result || 'artifacts' in result || 'history' in result)) {\n return {\n result: {\n ...result,\n kind: 'task',\n status: result.status\n ? {\n ...result.status,\n state: taskStateName(result.status.state),\n message: result.status.message\n ? {\n ...result.status.message,\n kind: 'message',\n parts: Array.isArray(result.status.message.parts)\n ? result.status.message.parts.map(normalizePart)\n : [],\n }\n : undefined,\n }\n : undefined,\n artifacts: Array.isArray(result.artifacts)\n ? result.artifacts.map((artifact: any) => ({\n ...artifact,\n parts: artifact.parts?.map(normalizePart) ?? [],\n }))\n : [],\n },\n };\n }\n return { result };\n}\n"],"mappings":"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","names":["require"]}