@mcpmesh/sdk 1.3.4 → 2.0.0-beta.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 (262) hide show
  1. package/dist/__tests__/a2a/a2a-bearer.spec.d.ts +2 -0
  2. package/dist/__tests__/a2a/a2a-bearer.spec.d.ts.map +1 -0
  3. package/dist/__tests__/a2a/a2a-bearer.spec.js +58 -0
  4. package/dist/__tests__/a2a/a2a-bearer.spec.js.map +1 -0
  5. package/dist/__tests__/a2a/a2a-client.spec.d.ts +2 -0
  6. package/dist/__tests__/a2a/a2a-client.spec.d.ts.map +1 -0
  7. package/dist/__tests__/a2a/a2a-client.spec.js +334 -0
  8. package/dist/__tests__/a2a/a2a-client.spec.js.map +1 -0
  9. package/dist/__tests__/a2a/a2a-job.spec.d.ts +2 -0
  10. package/dist/__tests__/a2a/a2a-job.spec.d.ts.map +1 -0
  11. package/dist/__tests__/a2a/a2a-job.spec.js +255 -0
  12. package/dist/__tests__/a2a/a2a-job.spec.js.map +1 -0
  13. package/dist/__tests__/a2a/a2a-stream.spec.d.ts +2 -0
  14. package/dist/__tests__/a2a/a2a-stream.spec.d.ts.map +1 -0
  15. package/dist/__tests__/a2a/a2a-stream.spec.js +278 -0
  16. package/dist/__tests__/a2a/a2a-stream.spec.js.map +1 -0
  17. package/dist/__tests__/a2a/agent-a2a-config.spec.d.ts +2 -0
  18. package/dist/__tests__/a2a/agent-a2a-config.spec.d.ts.map +1 -0
  19. package/dist/__tests__/a2a/agent-a2a-config.spec.js +262 -0
  20. package/dist/__tests__/a2a/agent-a2a-config.spec.js.map +1 -0
  21. package/dist/__tests__/a2a/producer/auth-filter.spec.d.ts +2 -0
  22. package/dist/__tests__/a2a/producer/auth-filter.spec.d.ts.map +1 -0
  23. package/dist/__tests__/a2a/producer/auth-filter.spec.js +127 -0
  24. package/dist/__tests__/a2a/producer/auth-filter.spec.js.map +1 -0
  25. package/dist/__tests__/a2a/producer/card-builder.spec.d.ts +2 -0
  26. package/dist/__tests__/a2a/producer/card-builder.spec.d.ts.map +1 -0
  27. package/dist/__tests__/a2a/producer/card-builder.spec.js +113 -0
  28. package/dist/__tests__/a2a/producer/card-builder.spec.js.map +1 -0
  29. package/dist/__tests__/a2a/producer/dispatcher.spec.d.ts +2 -0
  30. package/dist/__tests__/a2a/producer/dispatcher.spec.d.ts.map +1 -0
  31. package/dist/__tests__/a2a/producer/dispatcher.spec.js +850 -0
  32. package/dist/__tests__/a2a/producer/dispatcher.spec.js.map +1 -0
  33. package/dist/__tests__/a2a/producer/mount-surface-push.spec.d.ts +2 -0
  34. package/dist/__tests__/a2a/producer/mount-surface-push.spec.d.ts.map +1 -0
  35. package/dist/__tests__/a2a/producer/mount-surface-push.spec.js +164 -0
  36. package/dist/__tests__/a2a/producer/mount-surface-push.spec.js.map +1 -0
  37. package/dist/__tests__/a2a/producer/mount.spec.d.ts +2 -0
  38. package/dist/__tests__/a2a/producer/mount.spec.d.ts.map +1 -0
  39. package/dist/__tests__/a2a/producer/mount.spec.js +433 -0
  40. package/dist/__tests__/a2a/producer/mount.spec.js.map +1 -0
  41. package/dist/__tests__/a2a/producer/public-url-cache.spec.d.ts +2 -0
  42. package/dist/__tests__/a2a/producer/public-url-cache.spec.d.ts.map +1 -0
  43. package/dist/__tests__/a2a/producer/public-url-cache.spec.js +116 -0
  44. package/dist/__tests__/a2a/producer/public-url-cache.spec.js.map +1 -0
  45. package/dist/__tests__/a2a/producer/sse-emitter.spec.d.ts +2 -0
  46. package/dist/__tests__/a2a/producer/sse-emitter.spec.d.ts.map +1 -0
  47. package/dist/__tests__/a2a/producer/sse-emitter.spec.js +754 -0
  48. package/dist/__tests__/a2a/producer/sse-emitter.spec.js.map +1 -0
  49. package/dist/__tests__/a2a/producer/state-translator.spec.d.ts +2 -0
  50. package/dist/__tests__/a2a/producer/state-translator.spec.d.ts.map +1 -0
  51. package/dist/__tests__/a2a/producer/state-translator.spec.js +124 -0
  52. package/dist/__tests__/a2a/producer/state-translator.spec.js.map +1 -0
  53. package/dist/__tests__/a2a/producer/task-store.spec.d.ts +2 -0
  54. package/dist/__tests__/a2a/producer/task-store.spec.d.ts.map +1 -0
  55. package/dist/__tests__/a2a/producer/task-store.spec.js +180 -0
  56. package/dist/__tests__/a2a/producer/task-store.spec.js.map +1 -0
  57. package/dist/__tests__/agent-add-tool.spec.d.ts +2 -0
  58. package/dist/__tests__/agent-add-tool.spec.d.ts.map +1 -0
  59. package/dist/__tests__/agent-add-tool.spec.js +483 -0
  60. package/dist/__tests__/agent-add-tool.spec.js.map +1 -0
  61. package/dist/__tests__/api-runtime-race.spec.d.ts +2 -0
  62. package/dist/__tests__/api-runtime-race.spec.d.ts.map +1 -0
  63. package/dist/__tests__/api-runtime-race.spec.js +193 -0
  64. package/dist/__tests__/api-runtime-race.spec.js.map +1 -0
  65. package/dist/__tests__/claim-dispatcher.spec.d.ts +2 -0
  66. package/dist/__tests__/claim-dispatcher.spec.d.ts.map +1 -0
  67. package/dist/__tests__/claim-dispatcher.spec.js +408 -0
  68. package/dist/__tests__/claim-dispatcher.spec.js.map +1 -0
  69. package/dist/__tests__/inbound-job-dispatch.spec.d.ts +2 -0
  70. package/dist/__tests__/inbound-job-dispatch.spec.d.ts.map +1 -0
  71. package/dist/__tests__/inbound-job-dispatch.spec.js +185 -0
  72. package/dist/__tests__/inbound-job-dispatch.spec.js.map +1 -0
  73. package/dist/__tests__/job-controller-progress.spec.d.ts +2 -0
  74. package/dist/__tests__/job-controller-progress.spec.d.ts.map +1 -0
  75. package/dist/__tests__/job-controller-progress.spec.js +85 -0
  76. package/dist/__tests__/job-controller-progress.spec.js.map +1 -0
  77. package/dist/__tests__/jobs-cancel-route.spec.d.ts +2 -0
  78. package/dist/__tests__/jobs-cancel-route.spec.d.ts.map +1 -0
  79. package/dist/__tests__/jobs-cancel-route.spec.js +88 -0
  80. package/dist/__tests__/jobs-cancel-route.spec.js.map +1 -0
  81. package/dist/__tests__/llm-agent-stream.test.d.ts +14 -0
  82. package/dist/__tests__/llm-agent-stream.test.d.ts.map +1 -0
  83. package/dist/__tests__/llm-agent-stream.test.js +341 -0
  84. package/dist/__tests__/llm-agent-stream.test.js.map +1 -0
  85. package/dist/__tests__/llm-provider.test.js +22 -1
  86. package/dist/__tests__/llm-provider.test.js.map +1 -1
  87. package/dist/__tests__/media-resolver.test.js +40 -0
  88. package/dist/__tests__/media-resolver.test.js.map +1 -1
  89. package/dist/__tests__/mesh-job-submitter.spec.d.ts +2 -0
  90. package/dist/__tests__/mesh-job-submitter.spec.d.ts.map +1 -0
  91. package/dist/__tests__/mesh-job-submitter.spec.js +110 -0
  92. package/dist/__tests__/mesh-job-submitter.spec.js.map +1 -0
  93. package/dist/__tests__/proxy-stream.test.d.ts +9 -0
  94. package/dist/__tests__/proxy-stream.test.d.ts.map +1 -0
  95. package/dist/__tests__/proxy-stream.test.js +347 -0
  96. package/dist/__tests__/proxy-stream.test.js.map +1 -0
  97. package/dist/__tests__/resolver-meshjob.spec.d.ts +26 -0
  98. package/dist/__tests__/resolver-meshjob.spec.d.ts.map +1 -0
  99. package/dist/__tests__/resolver-meshjob.spec.js +201 -0
  100. package/dist/__tests__/resolver-meshjob.spec.js.map +1 -0
  101. package/dist/__tests__/schema-verdict-policy.test.d.ts +6 -0
  102. package/dist/__tests__/schema-verdict-policy.test.d.ts.map +1 -0
  103. package/dist/__tests__/schema-verdict-policy.test.js +126 -0
  104. package/dist/__tests__/schema-verdict-policy.test.js.map +1 -0
  105. package/dist/__tests__/sse-stream.test.d.ts +12 -0
  106. package/dist/__tests__/sse-stream.test.d.ts.map +1 -0
  107. package/dist/__tests__/sse-stream.test.js +170 -0
  108. package/dist/__tests__/sse-stream.test.js.map +1 -0
  109. package/dist/a2a/a2a-bearer.d.ts +27 -0
  110. package/dist/a2a/a2a-bearer.d.ts.map +1 -0
  111. package/dist/a2a/a2a-bearer.js +63 -0
  112. package/dist/a2a/a2a-bearer.js.map +1 -0
  113. package/dist/a2a/a2a-client.d.ts +114 -0
  114. package/dist/a2a/a2a-client.d.ts.map +1 -0
  115. package/dist/a2a/a2a-client.js +405 -0
  116. package/dist/a2a/a2a-client.js.map +1 -0
  117. package/dist/a2a/a2a-event.d.ts +25 -0
  118. package/dist/a2a/a2a-event.d.ts.map +1 -0
  119. package/dist/a2a/a2a-event.js +9 -0
  120. package/dist/a2a/a2a-event.js.map +1 -0
  121. package/dist/a2a/a2a-job.d.ts +58 -0
  122. package/dist/a2a/a2a-job.d.ts.map +1 -0
  123. package/dist/a2a/a2a-job.js +264 -0
  124. package/dist/a2a/a2a-job.js.map +1 -0
  125. package/dist/a2a/a2a-stream.d.ts +39 -0
  126. package/dist/a2a/a2a-stream.d.ts.map +1 -0
  127. package/dist/a2a/a2a-stream.js +290 -0
  128. package/dist/a2a/a2a-stream.js.map +1 -0
  129. package/dist/a2a/errors.d.ts +29 -0
  130. package/dist/a2a/errors.d.ts.map +1 -0
  131. package/dist/a2a/errors.js +48 -0
  132. package/dist/a2a/errors.js.map +1 -0
  133. package/dist/a2a/index.d.ts +12 -0
  134. package/dist/a2a/index.d.ts.map +1 -0
  135. package/dist/a2a/index.js +11 -0
  136. package/dist/a2a/index.js.map +1 -0
  137. package/dist/a2a/producer/auth-filter.d.ts +34 -0
  138. package/dist/a2a/producer/auth-filter.d.ts.map +1 -0
  139. package/dist/a2a/producer/auth-filter.js +39 -0
  140. package/dist/a2a/producer/auth-filter.js.map +1 -0
  141. package/dist/a2a/producer/card-builder.d.ts +59 -0
  142. package/dist/a2a/producer/card-builder.d.ts.map +1 -0
  143. package/dist/a2a/producer/card-builder.js +59 -0
  144. package/dist/a2a/producer/card-builder.js.map +1 -0
  145. package/dist/a2a/producer/dispatcher.d.ts +276 -0
  146. package/dist/a2a/producer/dispatcher.d.ts.map +1 -0
  147. package/dist/a2a/producer/dispatcher.js +896 -0
  148. package/dist/a2a/producer/dispatcher.js.map +1 -0
  149. package/dist/a2a/producer/index.d.ts +26 -0
  150. package/dist/a2a/producer/index.d.ts.map +1 -0
  151. package/dist/a2a/producer/index.js +23 -0
  152. package/dist/a2a/producer/index.js.map +1 -0
  153. package/dist/a2a/producer/mount.d.ts +75 -0
  154. package/dist/a2a/producer/mount.d.ts.map +1 -0
  155. package/dist/a2a/producer/mount.js +422 -0
  156. package/dist/a2a/producer/mount.js.map +1 -0
  157. package/dist/a2a/producer/public-url-cache.d.ts +73 -0
  158. package/dist/a2a/producer/public-url-cache.d.ts.map +1 -0
  159. package/dist/a2a/producer/public-url-cache.js +0 -0
  160. package/dist/a2a/producer/public-url-cache.js.map +1 -0
  161. package/dist/a2a/producer/registry.d.ts +138 -0
  162. package/dist/a2a/producer/registry.d.ts.map +1 -0
  163. package/dist/a2a/producer/registry.js +117 -0
  164. package/dist/a2a/producer/registry.js.map +1 -0
  165. package/dist/a2a/producer/sse-emitter.d.ts +85 -0
  166. package/dist/a2a/producer/sse-emitter.d.ts.map +1 -0
  167. package/dist/a2a/producer/sse-emitter.js +405 -0
  168. package/dist/a2a/producer/sse-emitter.js.map +1 -0
  169. package/dist/a2a/producer/state-translator.d.ts +63 -0
  170. package/dist/a2a/producer/state-translator.d.ts.map +1 -0
  171. package/dist/a2a/producer/state-translator.js +108 -0
  172. package/dist/a2a/producer/state-translator.js.map +1 -0
  173. package/dist/a2a/producer/task-store.d.ts +128 -0
  174. package/dist/a2a/producer/task-store.d.ts.map +1 -0
  175. package/dist/a2a/producer/task-store.js +128 -0
  176. package/dist/a2a/producer/task-store.js.map +1 -0
  177. package/dist/agent.d.ts +99 -0
  178. package/dist/agent.d.ts.map +1 -1
  179. package/dist/agent.js +754 -19
  180. package/dist/agent.js.map +1 -1
  181. package/dist/api-runtime.d.ts +25 -0
  182. package/dist/api-runtime.d.ts.map +1 -1
  183. package/dist/api-runtime.js +75 -2
  184. package/dist/api-runtime.js.map +1 -1
  185. package/dist/claim-dispatcher.d.ts +126 -0
  186. package/dist/claim-dispatcher.d.ts.map +1 -0
  187. package/dist/claim-dispatcher.js +478 -0
  188. package/dist/claim-dispatcher.js.map +1 -0
  189. package/dist/express.d.ts.map +1 -1
  190. package/dist/express.js +33 -6
  191. package/dist/express.js.map +1 -1
  192. package/dist/inbound-job-dispatch.d.ts +105 -0
  193. package/dist/inbound-job-dispatch.d.ts.map +1 -0
  194. package/dist/inbound-job-dispatch.js +335 -0
  195. package/dist/inbound-job-dispatch.js.map +1 -0
  196. package/dist/index.d.ts +40 -4
  197. package/dist/index.d.ts.map +1 -1
  198. package/dist/index.js +40 -3
  199. package/dist/index.js.map +1 -1
  200. package/dist/job-context.d.ts +107 -0
  201. package/dist/job-context.d.ts.map +1 -0
  202. package/dist/job-context.js +95 -0
  203. package/dist/job-context.js.map +1 -0
  204. package/dist/jobs-cancel-route.d.ts +36 -0
  205. package/dist/jobs-cancel-route.d.ts.map +1 -0
  206. package/dist/jobs-cancel-route.js +60 -0
  207. package/dist/jobs-cancel-route.js.map +1 -0
  208. package/dist/jobs-helper-tools.d.ts +48 -0
  209. package/dist/jobs-helper-tools.d.ts.map +1 -0
  210. package/dist/jobs-helper-tools.js +133 -0
  211. package/dist/jobs-helper-tools.js.map +1 -0
  212. package/dist/llm-agent.d.ts +62 -53
  213. package/dist/llm-agent.d.ts.map +1 -1
  214. package/dist/llm-agent.js +211 -292
  215. package/dist/llm-agent.js.map +1 -1
  216. package/dist/llm-provider.d.ts +11 -4
  217. package/dist/llm-provider.d.ts.map +1 -1
  218. package/dist/llm-provider.js +57 -4
  219. package/dist/llm-provider.js.map +1 -1
  220. package/dist/llm.d.ts +4 -1
  221. package/dist/llm.d.ts.map +1 -1
  222. package/dist/llm.js +7 -17
  223. package/dist/llm.js.map +1 -1
  224. package/dist/media/resolver.d.ts.map +1 -1
  225. package/dist/media/resolver.js +3 -2
  226. package/dist/media/resolver.js.map +1 -1
  227. package/dist/mesh-job-submitter.d.ts +83 -0
  228. package/dist/mesh-job-submitter.d.ts.map +1 -0
  229. package/dist/mesh-job-submitter.js +143 -0
  230. package/dist/mesh-job-submitter.js.map +1 -0
  231. package/dist/provider-handlers/gemini-handler.js +5 -0
  232. package/dist/provider-handlers/gemini-handler.js.map +1 -1
  233. package/dist/proxy.d.ts +40 -0
  234. package/dist/proxy.d.ts.map +1 -1
  235. package/dist/proxy.js +375 -2
  236. package/dist/proxy.js.map +1 -1
  237. package/dist/resolver-meshjob.d.ts +170 -0
  238. package/dist/resolver-meshjob.d.ts.map +1 -0
  239. package/dist/resolver-meshjob.js +159 -0
  240. package/dist/resolver-meshjob.js.map +1 -0
  241. package/dist/route.d.ts +4 -0
  242. package/dist/route.d.ts.map +1 -1
  243. package/dist/route.js.map +1 -1
  244. package/dist/schema-normalize.d.ts +62 -0
  245. package/dist/schema-normalize.d.ts.map +1 -0
  246. package/dist/schema-normalize.js +128 -0
  247. package/dist/schema-normalize.js.map +1 -0
  248. package/dist/sse-stream.d.ts +44 -0
  249. package/dist/sse-stream.d.ts.map +1 -0
  250. package/dist/sse-stream.js +173 -0
  251. package/dist/sse-stream.js.map +1 -0
  252. package/dist/tool-worker-entry.d.ts +21 -0
  253. package/dist/tool-worker-entry.d.ts.map +1 -0
  254. package/dist/tool-worker-entry.js +162 -0
  255. package/dist/tool-worker-entry.js.map +1 -0
  256. package/dist/tool-worker-pool.d.ts +49 -0
  257. package/dist/tool-worker-pool.d.ts.map +1 -0
  258. package/dist/tool-worker-pool.js +272 -0
  259. package/dist/tool-worker-pool.js.map +1 -0
  260. package/dist/types.d.ts +351 -9
  261. package/dist/types.d.ts.map +1 -1
  262. package/package.json +5 -3
@@ -0,0 +1,63 @@
1
+ /**
2
+ * Bearer-token credential for an outbound A2A call (issue #917).
3
+ *
4
+ * Provide either `token` (literal) or `tokenEnv` (the name of an
5
+ * environment variable). Resolution happens at header-build time so
6
+ * rotating the env var between calls picks up the new value without
7
+ * reconstructing the surrounding A2AClient. Mirrors
8
+ * `mesh._a2a_consumer.A2ABearer` (Python) and `io.mcpmesh.a2a.A2ABearer`
9
+ * (Java).
10
+ */
11
+ import { A2AAuthError } from "./errors.js";
12
+ export class A2ABearer {
13
+ token;
14
+ tokenEnv;
15
+ constructor(config) {
16
+ if (!config.token && !config.tokenEnv) {
17
+ throw new A2AAuthError("A2ABearer: must specify either 'token' or 'tokenEnv'");
18
+ }
19
+ if (config.token && config.tokenEnv) {
20
+ throw new A2AAuthError("A2ABearer: 'token' and 'tokenEnv' are mutually exclusive");
21
+ }
22
+ if (config.token !== undefined && config.token.trim() === "") {
23
+ throw new A2AAuthError("A2ABearer: 'token' must be non-blank");
24
+ }
25
+ if (config.tokenEnv !== undefined && config.tokenEnv.trim() === "") {
26
+ throw new A2AAuthError("A2ABearer: 'tokenEnv' must be non-blank");
27
+ }
28
+ this.token = config.token;
29
+ this.tokenEnv = config.tokenEnv;
30
+ }
31
+ /**
32
+ * Build the value for the `Authorization` header at call time.
33
+ *
34
+ * Reads the env var (when configured) on every call so a rotated
35
+ * credential is honoured mid-process.
36
+ */
37
+ authorizationHeader() {
38
+ let resolved = this.token;
39
+ if (resolved === undefined && this.tokenEnv) {
40
+ resolved = process.env[this.tokenEnv];
41
+ }
42
+ if (!resolved || resolved.trim() === "") {
43
+ throw new A2AAuthError(`A2ABearer: no token resolved (token=${this.token ? "set" : "unset"}, ` +
44
+ `tokenEnv=${this.tokenEnv ?? "<unset>"})`);
45
+ }
46
+ return `Bearer ${resolved}`;
47
+ }
48
+ }
49
+ /**
50
+ * Helper: normalise the user-friendly union (`A2ABearer | A2ABearerConfig`)
51
+ * into a concrete `A2ABearer` instance, or `undefined` for "no auth".
52
+ *
53
+ * Lets the consumer-side `addTool({ a2aConfig: { auth: { tokenEnv: "X" } } })`
54
+ * shortcut work without forcing the user to `new A2ABearer(...)` every time.
55
+ */
56
+ export function resolveBearer(auth) {
57
+ if (auth === undefined)
58
+ return undefined;
59
+ if (auth instanceof A2ABearer)
60
+ return auth;
61
+ return new A2ABearer(auth);
62
+ }
63
+ //# sourceMappingURL=a2a-bearer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"a2a-bearer.js","sourceRoot":"","sources":["../../src/a2a/a2a-bearer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAS3C,MAAM,OAAO,SAAS;IACH,KAAK,CAAU;IACf,QAAQ,CAAU;IAEnC,YAAY,MAAuB;QACjC,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;YACtC,MAAM,IAAI,YAAY,CACpB,sDAAsD,CACvD,CAAC;QACJ,CAAC;QACD,IAAI,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;YACpC,MAAM,IAAI,YAAY,CACpB,0DAA0D,CAC3D,CAAC;QACJ,CAAC;QACD,IAAI,MAAM,CAAC,KAAK,KAAK,SAAS,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;YAC7D,MAAM,IAAI,YAAY,CAAC,sCAAsC,CAAC,CAAC;QACjE,CAAC;QACD,IAAI,MAAM,CAAC,QAAQ,KAAK,SAAS,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;YACnE,MAAM,IAAI,YAAY,CAAC,yCAAyC,CAAC,CAAC;QACpE,CAAC;QACD,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;QAC1B,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;IAClC,CAAC;IAED;;;;;OAKG;IACH,mBAAmB;QACjB,IAAI,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC;QAC1B,IAAI,QAAQ,KAAK,SAAS,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC5C,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACxC,CAAC;QACD,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;YACxC,MAAM,IAAI,YAAY,CACpB,uCAAuC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,IAAI;gBACrE,YAAY,IAAI,CAAC,QAAQ,IAAI,SAAS,GAAG,CAC5C,CAAC;QACJ,CAAC;QACD,OAAO,UAAU,QAAQ,EAAE,CAAC;IAC9B,CAAC;CACF;AAED;;;;;;GAMG;AACH,MAAM,UAAU,aAAa,CAC3B,IAA6C;IAE7C,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IACzC,IAAI,IAAI,YAAY,SAAS;QAAE,OAAO,IAAI,CAAC;IAC3C,OAAO,IAAI,SAAS,CAAC,IAAI,CAAC,CAAC;AAC7B,CAAC"}
@@ -0,0 +1,114 @@
1
+ import { A2ABearer, type A2ABearerConfig } from "./a2a-bearer.js";
2
+ import { A2AJob } from "./a2a-job.js";
3
+ import { A2AStream } from "./a2a-stream.js";
4
+ /** Default per-call deadline for `send`. */
5
+ export declare const DEFAULT_TIMEOUT_MS = 30000;
6
+ /** Initial poll interval for `tasks/get` (ms). */
7
+ export declare const DEFAULT_POLL_INTERVAL_MS = 500;
8
+ /** Capped poll interval for `tasks/get` (ms). */
9
+ export declare const DEFAULT_POLL_INTERVAL_MAX_MS = 2000;
10
+ /** Multiplier applied between consecutive polls. */
11
+ export declare const POLL_BACKOFF_FACTOR = 1.5;
12
+ export declare function isTerminalState(state: string | undefined | null): boolean;
13
+ /** A2A v1.0 message dict — `{ role, parts: [...] }` shape. */
14
+ export type A2AMessage = Record<string, unknown>;
15
+ export interface A2AClientConfig {
16
+ /** A2A endpoint URL. Trailing slashes are stripped. */
17
+ url: string;
18
+ /** Skill ID to invoke on the upstream. */
19
+ skillId: string;
20
+ /** Bearer credential (instance or config). */
21
+ auth?: A2ABearer | A2ABearerConfig;
22
+ /** Per-call deadline for `send` (ms). Default 30_000. */
23
+ timeoutMs?: number;
24
+ /** Initial backoff between `tasks/get` polls (ms). Default 500. */
25
+ pollIntervalMs?: number;
26
+ /** Cap on the backoff between polls (ms). Default 2_000. */
27
+ pollIntervalMaxMs?: number;
28
+ }
29
+ /** Result of a synchronous `A2AClient.send`. */
30
+ export interface A2AResponse {
31
+ /** First artifact's first text part — the canonical sync return. */
32
+ artifactText: string;
33
+ /** Final lifecycle state (typically "completed"). */
34
+ state: string;
35
+ /** Consumer-generated task ID echoed back by the producer. */
36
+ taskId: string;
37
+ /** Full Task envelope (status, artifacts, metadata, history). */
38
+ rawTask: Record<string, unknown>;
39
+ }
40
+ /** Raw task envelope returned by `A2AJob.status` etc. */
41
+ export type A2ATaskEnvelope = Record<string, unknown>;
42
+ export declare class A2AClient {
43
+ readonly url: string;
44
+ readonly skillId: string;
45
+ readonly auth?: A2ABearer;
46
+ readonly timeoutMs: number;
47
+ readonly pollIntervalMs: number;
48
+ readonly pollIntervalMaxMs: number;
49
+ private closed;
50
+ private nextRpcId;
51
+ constructor(config: A2AClientConfig);
52
+ /**
53
+ * POST `tasks/send` and poll `tasks/get` until terminal.
54
+ *
55
+ * `message` is the A2A v1.0 request message dict — typically
56
+ * `{ role: "user", parts: [{ type: "text", text: "..." }] }`.
57
+ * Returns an `A2AResponse` whose `artifactText` carries the
58
+ * producer-side handler's return value (JSON-stringified for
59
+ * non-string returns; consumers `JSON.parse` when the upstream
60
+ * returns a dict).
61
+ */
62
+ send(message: A2AMessage, options?: {
63
+ taskId?: string;
64
+ timeoutMs?: number;
65
+ }): Promise<A2AResponse>;
66
+ /**
67
+ * POST `tasks/send` and return an `A2AJob` handle WITHOUT polling.
68
+ *
69
+ * Use this when the surrounding `addTool({ task: true, ... })` body
70
+ * wants explicit control over when to poll — typically via
71
+ * `A2AJob.bridge(jobController)` which mirrors progress into the
72
+ * framework-injected `JobController`.
73
+ */
74
+ submit(message: A2AMessage, options?: {
75
+ taskId?: string;
76
+ }): Promise<A2AJob>;
77
+ /**
78
+ * POST `tasks/sendSubscribe` and return an `A2AStream` of parsed events.
79
+ *
80
+ * The returned stream MUST be either iterated to completion (the
81
+ * terminal `final=true` frame closes it) OR explicitly closed via
82
+ * `await using` / `await stream.aclose()` to release the underlying
83
+ * connection.
84
+ */
85
+ subscribe(message: A2AMessage, options?: {
86
+ taskId?: string;
87
+ }): Promise<A2AStream>;
88
+ /**
89
+ * Lifecycle marker (forward-compat).
90
+ *
91
+ * The undici Agent pool is shared process-wide via `closeHttpPool()`
92
+ * — there's no per-client connection state to tear down. We mark
93
+ * `closed = true` so subsequent `send`/`submit`/`subscribe` raise
94
+ * cleanly (matches Python's `_closed` flag behaviour).
95
+ */
96
+ close(): Promise<void>;
97
+ /** Internal: POST `tasks/get` for the supplied task ID. */
98
+ tasksGet(taskId: string): Promise<A2ATaskEnvelope>;
99
+ /** Internal: POST `tasks/cancel`. Best-effort; transport errors swallowed by caller. */
100
+ tasksCancel(taskId: string, reason?: string): Promise<void>;
101
+ /** Internal: build an `A2AResponse` from a Task envelope. */
102
+ buildResponse(taskId: string, result: A2ATaskEnvelope): A2AResponse;
103
+ private _newTaskId;
104
+ private _ensureOpen;
105
+ private _postJsonRpc;
106
+ private _buildResponse;
107
+ }
108
+ export declare function readState(result: A2ATaskEnvelope | undefined | null): string;
109
+ export declare function extractArtifactText(result: A2ATaskEnvelope): string;
110
+ export declare function readStatusMessage(result: A2ATaskEnvelope): string | undefined;
111
+ export declare function readProgress(result: A2ATaskEnvelope): number | undefined;
112
+ export declare function maybeJsonParse(text: string): unknown;
113
+ export declare function isCanceledState(state: string | undefined | null): boolean;
114
+ //# sourceMappingURL=a2a-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"a2a-client.d.ts","sourceRoot":"","sources":["../../src/a2a/a2a-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,405 @@
1
+ /**
2
+ * Thin A2A v1.0 client — sync `tasks/send` + non-blocking `submit` +
3
+ * SSE `subscribe` (issue #917).
4
+ *
5
+ * One instance per (url, skillId, auth, timeout) tuple — the framework
6
+ * caches and re-uses clients across tool invocations so the underlying
7
+ * undici connection pool is amortised. Mirrors
8
+ * `mesh._a2a_consumer.A2AClient` (Python) and
9
+ * `io.mcpmesh.a2a.A2AClient` (Java) — same JSON-RPC envelope shape +
10
+ * polling backoff + auth header semantics.
11
+ */
12
+ import { randomUUID } from "node:crypto";
13
+ import { getDispatcher } from "../http-pool.js";
14
+ import { resolveBearer, } from "./a2a-bearer.js";
15
+ import { A2AAuthError, A2AError, A2ATimeoutError, } from "./errors.js";
16
+ import { A2AJob } from "./a2a-job.js";
17
+ import { A2AStream } from "./a2a-stream.js";
18
+ /** Default per-call deadline for `send`. */
19
+ export const DEFAULT_TIMEOUT_MS = 30_000;
20
+ /** Initial poll interval for `tasks/get` (ms). */
21
+ export const DEFAULT_POLL_INTERVAL_MS = 500;
22
+ /** Capped poll interval for `tasks/get` (ms). */
23
+ export const DEFAULT_POLL_INTERVAL_MAX_MS = 2_000;
24
+ /** Multiplier applied between consecutive polls. */
25
+ export const POLL_BACKOFF_FACTOR = 1.5;
26
+ const _TERMINAL_STATES = new Set([
27
+ "completed",
28
+ "failed",
29
+ "canceled",
30
+ // A2A v1.0 uses US "canceled"; mesh JobController uses UK "cancelled".
31
+ // Accept both so a heterogeneous deployment doesn't get stuck polling.
32
+ "cancelled",
33
+ ]);
34
+ export function isTerminalState(state) {
35
+ return state != null && _TERMINAL_STATES.has(state.toLowerCase());
36
+ }
37
+ export class A2AClient {
38
+ url;
39
+ skillId;
40
+ auth;
41
+ timeoutMs;
42
+ pollIntervalMs;
43
+ pollIntervalMaxMs;
44
+ closed = false;
45
+ // JSON-RPC requires a unique id per request — a per-instance monotonic
46
+ // counter is the spec-conforming choice. Some servers/middleware
47
+ // enforce this, so don't reuse `2` across every tasks/get poll.
48
+ nextRpcId = 1;
49
+ constructor(config) {
50
+ if (!config.url || config.url.trim() === "") {
51
+ throw new A2AError("A2AClient: url must be non-empty");
52
+ }
53
+ if (config.timeoutMs !== undefined && config.timeoutMs <= 0) {
54
+ throw new A2AError("A2AClient: timeoutMs must be > 0");
55
+ }
56
+ // Trim trailing slashes to match Python's url.rstrip("/") and Java's
57
+ // trim loop — keeps the on-the-wire URL stable regardless of how
58
+ // the user wrote the constructor argument.
59
+ let trimmed = config.url;
60
+ while (trimmed.endsWith("/")) {
61
+ trimmed = trimmed.slice(0, -1);
62
+ }
63
+ this.url = trimmed;
64
+ this.skillId = config.skillId;
65
+ this.auth = resolveBearer(config.auth);
66
+ this.timeoutMs = config.timeoutMs ?? DEFAULT_TIMEOUT_MS;
67
+ this.pollIntervalMs = config.pollIntervalMs ?? DEFAULT_POLL_INTERVAL_MS;
68
+ this.pollIntervalMaxMs =
69
+ config.pollIntervalMaxMs ?? DEFAULT_POLL_INTERVAL_MAX_MS;
70
+ }
71
+ /**
72
+ * POST `tasks/send` and poll `tasks/get` until terminal.
73
+ *
74
+ * `message` is the A2A v1.0 request message dict — typically
75
+ * `{ role: "user", parts: [{ type: "text", text: "..." }] }`.
76
+ * Returns an `A2AResponse` whose `artifactText` carries the
77
+ * producer-side handler's return value (JSON-stringified for
78
+ * non-string returns; consumers `JSON.parse` when the upstream
79
+ * returns a dict).
80
+ */
81
+ async send(message, options) {
82
+ this._ensureOpen();
83
+ if (message == null) {
84
+ throw new A2AError("A2AClient.send: message must be non-null");
85
+ }
86
+ const timeoutMs = options?.timeoutMs ?? this.timeoutMs;
87
+ if (timeoutMs <= 0) {
88
+ throw new A2AError("A2AClient.send: timeoutMs must be > 0");
89
+ }
90
+ const taskId = options?.taskId ?? this._newTaskId();
91
+ const deadline = Date.now() + timeoutMs;
92
+ let result = await this._postJsonRpc("tasks/send", { id: taskId, message }, Math.max(1, deadline - Date.now()));
93
+ let state = readState(result);
94
+ if (isTerminalState(state)) {
95
+ return this._buildResponse(taskId, result);
96
+ }
97
+ let intervalMs = this.pollIntervalMs;
98
+ while (Date.now() < deadline) {
99
+ await sleep(Math.min(intervalMs, Math.max(1, deadline - Date.now())));
100
+ const remaining = deadline - Date.now();
101
+ if (remaining <= 0)
102
+ break;
103
+ result = await this._postJsonRpc("tasks/get", { id: taskId }, remaining);
104
+ state = readState(result);
105
+ if (isTerminalState(state)) {
106
+ return this._buildResponse(taskId, result);
107
+ }
108
+ intervalMs = Math.min(this.pollIntervalMaxMs, Math.floor(intervalMs * POLL_BACKOFF_FACTOR));
109
+ }
110
+ throw new A2ATimeoutError(`A2A task '${taskId}' on ${this.url} did not reach terminal state ` +
111
+ `within ${timeoutMs}ms (last state='${state}')`);
112
+ }
113
+ /**
114
+ * POST `tasks/send` and return an `A2AJob` handle WITHOUT polling.
115
+ *
116
+ * Use this when the surrounding `addTool({ task: true, ... })` body
117
+ * wants explicit control over when to poll — typically via
118
+ * `A2AJob.bridge(jobController)` which mirrors progress into the
119
+ * framework-injected `JobController`.
120
+ */
121
+ async submit(message, options) {
122
+ this._ensureOpen();
123
+ if (message == null) {
124
+ throw new A2AError("A2AClient.submit: message must be non-null");
125
+ }
126
+ const taskId = options?.taskId ?? this._newTaskId();
127
+ const result = await this._postJsonRpc("tasks/send", { id: taskId, message }, this.timeoutMs);
128
+ const state = readState(result);
129
+ return new A2AJob(this, taskId, state, result);
130
+ }
131
+ /**
132
+ * POST `tasks/sendSubscribe` and return an `A2AStream` of parsed events.
133
+ *
134
+ * The returned stream MUST be either iterated to completion (the
135
+ * terminal `final=true` frame closes it) OR explicitly closed via
136
+ * `await using` / `await stream.aclose()` to release the underlying
137
+ * connection.
138
+ */
139
+ async subscribe(message, options) {
140
+ this._ensureOpen();
141
+ if (message == null) {
142
+ throw new A2AError("A2AClient.subscribe: message must be non-null");
143
+ }
144
+ const taskId = options?.taskId ?? this._newTaskId();
145
+ const envelope = {
146
+ jsonrpc: "2.0",
147
+ id: this.nextRpcId++,
148
+ method: "tasks/sendSubscribe",
149
+ params: { id: taskId, message },
150
+ };
151
+ const headers = {
152
+ "Content-Type": "application/json",
153
+ Accept: "text/event-stream",
154
+ };
155
+ if (this.auth) {
156
+ headers["Authorization"] = this.auth.authorizationHeader();
157
+ }
158
+ let response;
159
+ try {
160
+ // No request timeout on the SSE call — the stream lifetime is
161
+ // dictated by the producer, not a per-request deadline. The
162
+ // dispatcher's keep-alive still applies to the initial handshake.
163
+ response = await fetch(this.url, {
164
+ method: "POST",
165
+ headers,
166
+ body: JSON.stringify(envelope),
167
+ // undici extension: dispatcher is honoured for connection pooling.
168
+ dispatcher: getDispatcher(this.url),
169
+ });
170
+ }
171
+ catch (err) {
172
+ throw new A2AError(`A2A tasks/sendSubscribe ${this.url} transport failure: ` +
173
+ `${err?.message ?? String(err)}`, err);
174
+ }
175
+ if (!response.ok) {
176
+ const body = await response.text().catch(() => "");
177
+ throw new A2AError(`A2A tasks/sendSubscribe ${this.url} HTTP ${response.status}: ` +
178
+ truncate(body, 256));
179
+ }
180
+ if (!response.body) {
181
+ throw new A2AError(`A2A tasks/sendSubscribe ${this.url} returned no response body`);
182
+ }
183
+ return new A2AStream(response, taskId);
184
+ }
185
+ /**
186
+ * Lifecycle marker (forward-compat).
187
+ *
188
+ * The undici Agent pool is shared process-wide via `closeHttpPool()`
189
+ * — there's no per-client connection state to tear down. We mark
190
+ * `closed = true` so subsequent `send`/`submit`/`subscribe` raise
191
+ * cleanly (matches Python's `_closed` flag behaviour).
192
+ */
193
+ async close() {
194
+ this.closed = true;
195
+ }
196
+ // --- internal API used by A2AJob / A2AStream -----------------------------
197
+ /** Internal: POST `tasks/get` for the supplied task ID. */
198
+ async tasksGet(taskId) {
199
+ this._ensureOpen();
200
+ return this._postJsonRpc("tasks/get", { id: taskId }, this.timeoutMs);
201
+ }
202
+ /** Internal: POST `tasks/cancel`. Best-effort; transport errors swallowed by caller. */
203
+ async tasksCancel(taskId, reason) {
204
+ this._ensureOpen();
205
+ const params = { id: taskId };
206
+ if (reason !== undefined)
207
+ params.reason = reason;
208
+ // A2A spec-conforming producers may return `{jsonrpc:"2.0",id:N}` for
209
+ // tasks/cancel (no result, no error) — accept that envelope shape so
210
+ // we don't false-fail the cancel on producers that don't echo a Task
211
+ // body back.
212
+ await this._postJsonRpc("tasks/cancel", params, this.timeoutMs, "result-or-error");
213
+ }
214
+ /** Internal: build an `A2AResponse` from a Task envelope. */
215
+ buildResponse(taskId, result) {
216
+ return this._buildResponse(taskId, result);
217
+ }
218
+ // --- helpers -------------------------------------------------------------
219
+ _newTaskId() {
220
+ return `c-${randomUUID().replace(/-/g, "")}`;
221
+ }
222
+ _ensureOpen() {
223
+ if (this.closed) {
224
+ throw new A2AError(`A2AClient(url=${this.url}) is closed; create a new instance instead.`);
225
+ }
226
+ }
227
+ async _postJsonRpc(method, params, timeoutMs, accept = "result-required") {
228
+ const envelope = {
229
+ jsonrpc: "2.0",
230
+ id: this.nextRpcId++,
231
+ method,
232
+ params,
233
+ };
234
+ const headers = {
235
+ "Content-Type": "application/json",
236
+ Accept: "application/json",
237
+ };
238
+ if (this.auth) {
239
+ try {
240
+ headers["Authorization"] = this.auth.authorizationHeader();
241
+ }
242
+ catch (err) {
243
+ if (err instanceof A2AAuthError)
244
+ throw err;
245
+ throw new A2AAuthError(`A2A ${method} ${this.url}: failed to resolve bearer header: ` +
246
+ `${err?.message ?? String(err)}`, err);
247
+ }
248
+ }
249
+ const controller = new AbortController();
250
+ const timer = setTimeout(() => controller.abort(), timeoutMs);
251
+ let response;
252
+ try {
253
+ response = await fetch(this.url, {
254
+ method: "POST",
255
+ headers,
256
+ body: JSON.stringify(envelope),
257
+ signal: controller.signal,
258
+ // undici extension: dispatcher is honoured for connection pooling.
259
+ dispatcher: getDispatcher(this.url),
260
+ });
261
+ }
262
+ catch (err) {
263
+ if (err?.name === "AbortError") {
264
+ throw new A2ATimeoutError(`A2A ${method} ${this.url} timed out after ${timeoutMs}ms`, err);
265
+ }
266
+ throw new A2AError(`A2A ${method} ${this.url} transport failure: ` +
267
+ `${err?.message ?? String(err)}`, err);
268
+ }
269
+ finally {
270
+ clearTimeout(timer);
271
+ }
272
+ const body = await response.text();
273
+ if (!response.ok) {
274
+ throw new A2AError(`A2A ${method} ${this.url} HTTP ${response.status}: ` +
275
+ truncate(body, 256));
276
+ }
277
+ let parsed;
278
+ try {
279
+ parsed = JSON.parse(body);
280
+ }
281
+ catch (err) {
282
+ throw new A2AError(`A2A ${method} ${this.url} returned malformed JSON: ` +
283
+ truncate(body, 256), err);
284
+ }
285
+ if (parsed == null || typeof parsed !== "object") {
286
+ throw new A2AError(`A2A ${method} ${this.url} returned empty body`);
287
+ }
288
+ const obj = parsed;
289
+ if (obj.error != null) {
290
+ const err = obj.error;
291
+ const code = err.code !== undefined ? String(err.code) : "?";
292
+ const msg = err.message !== undefined ? String(err.message) : "<no message>";
293
+ throw new A2AError(`A2A error from ${this.url}: ${code} ${msg}`);
294
+ }
295
+ if (obj.result === undefined || obj.result === null) {
296
+ if (accept === "result-or-error") {
297
+ return {};
298
+ }
299
+ // A producer that returns {"jsonrpc":"2.0","id":1} (no result and
300
+ // no error) is malformed JSON-RPC. Coercing this to an empty
301
+ // object would make `readState()` return "unknown" and the
302
+ // polling loop spin until the user-supplied deadline. Fail fast
303
+ // with a clear message instead — matches Java parity.
304
+ throw new A2AError(`A2A ${method} ${this.url} response has neither 'result' nor 'error' ` +
305
+ `field — malformed JSON-RPC envelope: ${truncate(body, 256)}`);
306
+ }
307
+ return obj.result;
308
+ }
309
+ _buildResponse(taskId, result) {
310
+ return {
311
+ artifactText: extractArtifactText(result),
312
+ state: readState(result),
313
+ taskId,
314
+ rawTask: result,
315
+ };
316
+ }
317
+ }
318
+ // --- exported helpers (used by A2AJob + A2AStream) ----------------------------
319
+ export function readState(result) {
320
+ if (!result || typeof result !== "object")
321
+ return "unknown";
322
+ const status = result.status;
323
+ if (!status || typeof status !== "object")
324
+ return "unknown";
325
+ const state = status.state;
326
+ if (typeof state !== "string")
327
+ return "unknown";
328
+ return state;
329
+ }
330
+ export function extractArtifactText(result) {
331
+ const artifacts = result.artifacts;
332
+ if (!Array.isArray(artifacts) || artifacts.length === 0)
333
+ return "";
334
+ const first = artifacts[0];
335
+ if (!first || typeof first !== "object")
336
+ return "";
337
+ const parts = first.parts;
338
+ if (!Array.isArray(parts) || parts.length === 0)
339
+ return "";
340
+ const firstPart = parts[0];
341
+ if (!firstPart || typeof firstPart !== "object")
342
+ return "";
343
+ const text = firstPart.text;
344
+ return typeof text === "string" ? text : "";
345
+ }
346
+ export function readStatusMessage(result) {
347
+ const status = result.status;
348
+ if (!status || typeof status !== "object")
349
+ return undefined;
350
+ const msg = status.message;
351
+ if (!msg || typeof msg !== "object")
352
+ return undefined;
353
+ const parts = msg.parts;
354
+ if (!Array.isArray(parts) || parts.length === 0)
355
+ return undefined;
356
+ const firstPart = parts[0];
357
+ if (!firstPart || typeof firstPart !== "object")
358
+ return undefined;
359
+ const text = firstPart.text;
360
+ return typeof text === "string" ? text : undefined;
361
+ }
362
+ export function readProgress(result) {
363
+ const metadata = result.metadata;
364
+ if (!metadata || typeof metadata !== "object")
365
+ return undefined;
366
+ const progress = metadata.progress;
367
+ if (progress === undefined || progress === null)
368
+ return undefined;
369
+ if (typeof progress === "number" && Number.isFinite(progress)) {
370
+ return progress;
371
+ }
372
+ // Tolerate stringified numerics — some producers JSON-encode metadata
373
+ // fields as strings.
374
+ if (typeof progress === "string") {
375
+ const n = Number.parseFloat(progress);
376
+ if (Number.isFinite(n))
377
+ return n;
378
+ }
379
+ return undefined;
380
+ }
381
+ export function maybeJsonParse(text) {
382
+ if (!text)
383
+ return text;
384
+ try {
385
+ return JSON.parse(text);
386
+ }
387
+ catch {
388
+ return text;
389
+ }
390
+ }
391
+ export function isCanceledState(state) {
392
+ if (!state)
393
+ return false;
394
+ const s = state.toLowerCase();
395
+ return s === "canceled" || s === "cancelled";
396
+ }
397
+ function truncate(s, max) {
398
+ if (s == null)
399
+ return "";
400
+ return s.length <= max ? s : s.slice(0, max) + "...";
401
+ }
402
+ function sleep(ms) {
403
+ return new Promise((resolve) => setTimeout(resolve, ms));
404
+ }
405
+ //# sourceMappingURL=a2a-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"a2a-client.js","sourceRoot":"","sources":["../../src/a2a/a2a-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Parsed A2A v1.0 SSE event surface (issue #917).
3
+ *
4
+ * One event per `tasks/sendSubscribe` SSE frame after the JSON-RPC
5
+ * envelope is decoded. Mirrors `mesh._a2a_consumer.A2AEvent` (Python)
6
+ * and `io.mcpmesh.a2a.A2AEvent` (Java).
7
+ */
8
+ export type A2AEventKind = "status" | "artifact";
9
+ export interface A2AEvent {
10
+ /** "status" for TaskStatusUpdateEvent frames; "artifact" for TaskArtifactUpdateEvent frames. */
11
+ kind: A2AEventKind;
12
+ /** Lifecycle state (status frames only). */
13
+ state?: string;
14
+ /** Normalized progress in [0, 1] (status frames only, when present). */
15
+ progress?: number;
16
+ /** Status message text (status frames only, when present). */
17
+ message?: string;
18
+ /** Artifact text (artifact frames only). */
19
+ artifactText?: string;
20
+ /** True on the terminal status frame. */
21
+ final: boolean;
22
+ /** Full JSON-RPC envelope for advanced consumers. */
23
+ raw: unknown;
24
+ }
25
+ //# sourceMappingURL=a2a-event.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"a2a-event.d.ts","sourceRoot":"","sources":["../../src/a2a/a2a-event.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,UAAU,CAAC;AAEjD,MAAM,WAAW,QAAQ;IACvB,gGAAgG;IAChG,IAAI,EAAE,YAAY,CAAC;IACnB,4CAA4C;IAC5C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,wEAAwE;IACxE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,8DAA8D;IAC9D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,4CAA4C;IAC5C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,yCAAyC;IACzC,KAAK,EAAE,OAAO,CAAC;IACf,qDAAqD;IACrD,GAAG,EAAE,OAAO,CAAC;CACd"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Parsed A2A v1.0 SSE event surface (issue #917).
3
+ *
4
+ * One event per `tasks/sendSubscribe` SSE frame after the JSON-RPC
5
+ * envelope is decoded. Mirrors `mesh._a2a_consumer.A2AEvent` (Python)
6
+ * and `io.mcpmesh.a2a.A2AEvent` (Java).
7
+ */
8
+ export {};
9
+ //# sourceMappingURL=a2a-event.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"a2a-event.js","sourceRoot":"","sources":["../../src/a2a/a2a-event.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}