@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,255 @@
1
+ /**
2
+ * Tests for A2AJob (issue #917).
3
+ *
4
+ * Avoids binding a real napi JobController — we mock @mcpmesh/core's
5
+ * `awaitJobCancel` and pass a hand-rolled controller object whose
6
+ * `updateProgress` we can spy on.
7
+ */
8
+ import { describe, it, expect, beforeEach, afterEach, vi, } from "vitest";
9
+ import * as http from "node:http";
10
+ // Mock @mcpmesh/core's awaitJobCancel so we can simulate cancel
11
+ // without binding a real napi cancel registry.
12
+ vi.mock("@mcpmesh/core", async () => {
13
+ const actual = await vi.importActual("@mcpmesh/core");
14
+ return {
15
+ ...actual,
16
+ awaitJobCancel: vi.fn().mockReturnValue(new Promise(() => { })),
17
+ };
18
+ });
19
+ import { awaitJobCancel } from "@mcpmesh/core";
20
+ import { A2AClient } from "../../a2a/a2a-client.js";
21
+ import { A2AJobCanceledError, A2AJobFailedError, } from "../../a2a/errors.js";
22
+ const awaitJobCancelMock = awaitJobCancel;
23
+ function startServer() {
24
+ return new Promise((resolve) => {
25
+ const responses = new Map();
26
+ const envelopes = [];
27
+ const server = http.createServer((req, res) => {
28
+ let body = "";
29
+ req.on("data", (chunk) => (body += chunk));
30
+ req.on("end", () => {
31
+ const env = JSON.parse(body);
32
+ envelopes.push({ method: env.method, params: env.params });
33
+ const queue = responses.get(env.method) ?? [];
34
+ const next = queue.shift() ?? { status: { state: "working" } };
35
+ res.setHeader("Content-Type", "application/json");
36
+ res.end(JSON.stringify({ jsonrpc: "2.0", id: env.id, result: next }));
37
+ });
38
+ });
39
+ server.listen(0, "127.0.0.1", () => {
40
+ const port = server.address().port;
41
+ resolve({
42
+ url: `http://127.0.0.1:${port}/agents/test`,
43
+ responses,
44
+ envelopes,
45
+ close: () => new Promise((rs, rj) => server.close((err) => (err ? rj(err) : rs()))),
46
+ });
47
+ });
48
+ });
49
+ }
50
+ function makeMockController(jobId = "job-test") {
51
+ return {
52
+ jobId,
53
+ updateProgress: vi.fn().mockResolvedValue(undefined),
54
+ complete: vi.fn().mockResolvedValue(undefined),
55
+ fail: vi.fn().mockResolvedValue(undefined),
56
+ isTerminal: vi.fn().mockResolvedValue(false),
57
+ releaseLease: vi.fn().mockResolvedValue(undefined),
58
+ };
59
+ }
60
+ describe("A2AJob.bridge", () => {
61
+ let server;
62
+ beforeEach(() => {
63
+ awaitJobCancelMock.mockReset();
64
+ awaitJobCancelMock.mockReturnValue(new Promise(() => { }));
65
+ });
66
+ afterEach(async () => {
67
+ await server?.close();
68
+ });
69
+ it("polls until terminal then returns the parsed artifact", async () => {
70
+ server = await startServer();
71
+ server.responses.set("tasks/send", [{ status: { state: "working" } }]);
72
+ server.responses.set("tasks/get", [
73
+ {
74
+ status: { state: "working" },
75
+ metadata: { progress: 0.3 },
76
+ },
77
+ {
78
+ status: { state: "completed" },
79
+ artifacts: [{ parts: [{ text: '{"section":"intro"}' }] }],
80
+ },
81
+ ]);
82
+ const client = new A2AClient({
83
+ url: server.url,
84
+ skillId: "x",
85
+ pollIntervalMs: 5,
86
+ pollIntervalMaxMs: 20,
87
+ });
88
+ const job = await client.submit({ role: "user", parts: [] });
89
+ const ctrl = makeMockController();
90
+ const value = await job.bridge(ctrl);
91
+ expect(value).toEqual({ section: "intro" });
92
+ expect(ctrl
93
+ .updateProgress).toHaveBeenCalledWith(0.3, null);
94
+ });
95
+ it("throws A2AJobFailedError on terminal failed", async () => {
96
+ server = await startServer();
97
+ server.responses.set("tasks/send", [
98
+ {
99
+ status: {
100
+ state: "failed",
101
+ message: { parts: [{ text: "boom" }] },
102
+ },
103
+ },
104
+ ]);
105
+ const client = new A2AClient({ url: server.url, skillId: "x" });
106
+ const job = await client.submit({ role: "user", parts: [] });
107
+ await expect(job.bridge(makeMockController())).rejects.toBeInstanceOf(A2AJobFailedError);
108
+ });
109
+ it("throws A2AJobCanceledError on terminal canceled", async () => {
110
+ server = await startServer();
111
+ server.responses.set("tasks/send", [
112
+ {
113
+ status: {
114
+ state: "canceled",
115
+ message: { parts: [{ text: "user-cancel" }] },
116
+ },
117
+ },
118
+ ]);
119
+ const client = new A2AClient({ url: server.url, skillId: "x" });
120
+ const job = await client.submit({ role: "user", parts: [] });
121
+ await expect(job.bridge(makeMockController())).rejects.toBeInstanceOf(A2AJobCanceledError);
122
+ });
123
+ it("propagates mesh-side cancel: POSTs tasks/cancel + throws A2AJobCanceledError", async () => {
124
+ server = await startServer();
125
+ server.responses.set("tasks/send", [{ status: { state: "working" } }]);
126
+ server.responses.set("tasks/get", [
127
+ { status: { state: "working" } },
128
+ { status: { state: "working" } },
129
+ { status: { state: "working" } },
130
+ ]);
131
+ server.responses.set("tasks/cancel", [{ status: { state: "canceled" } }]);
132
+ // Resolver-controlled cancel — eliminates the previous timing-
133
+ // sensitive setTimeout(30ms). We trigger it explicitly after the
134
+ // bridge has had a chance to enter its poll loop (one tick).
135
+ let cancelResolve;
136
+ const cancelPromise = new Promise((r) => {
137
+ cancelResolve = r;
138
+ });
139
+ awaitJobCancelMock.mockReturnValue(cancelPromise);
140
+ const client = new A2AClient({
141
+ url: server.url,
142
+ skillId: "x",
143
+ pollIntervalMs: 10,
144
+ pollIntervalMaxMs: 20,
145
+ });
146
+ const job = await client.submit({ role: "user", parts: [] });
147
+ const bridgePromise = job.bridge(makeMockController());
148
+ // Yield once so bridge attaches its .then on cancelPromise + enters
149
+ // the poll loop, then explicitly fire the cancel signal.
150
+ await Promise.resolve();
151
+ cancelResolve();
152
+ await expect(bridgePromise).rejects.toBeInstanceOf(A2AJobCanceledError);
153
+ // The bridge MUST have POSTed tasks/cancel upstream.
154
+ expect(server.envelopes.some((e) => e.method === "tasks/cancel")).toBe(true);
155
+ });
156
+ it("surfaces transport failure as A2AJobFailedError + best-effort upstream cancel", async () => {
157
+ server = await startServer();
158
+ server.responses.set("tasks/send", [{ status: { state: "working" } }]);
159
+ server.responses.set("tasks/cancel", [{ status: { state: "canceled" } }]);
160
+ const client = new A2AClient({
161
+ url: server.url,
162
+ skillId: "x",
163
+ pollIntervalMs: 5,
164
+ });
165
+ const job = await client.submit({ role: "user", parts: [] });
166
+ await server.close(); // Force tasks/get to fail
167
+ server = { ...server, close: async () => { } };
168
+ await expect(job.bridge(makeMockController())).rejects.toBeInstanceOf(A2AJobFailedError);
169
+ });
170
+ });
171
+ describe("A2AJob.cancel", () => {
172
+ let server;
173
+ afterEach(async () => {
174
+ await server?.close();
175
+ });
176
+ it("POSTs tasks/cancel with the supplied reason", async () => {
177
+ server = await startServer();
178
+ server.responses.set("tasks/send", [{ status: { state: "working" } }]);
179
+ server.responses.set("tasks/cancel", [{ status: { state: "canceled" } }]);
180
+ const client = new A2AClient({ url: server.url, skillId: "x" });
181
+ const job = await client.submit({ role: "user", parts: [] });
182
+ await job.cancel("why");
183
+ const cancelEnv = server.envelopes.find((e) => e.method === "tasks/cancel");
184
+ expect(cancelEnv).toBeDefined();
185
+ expect((cancelEnv?.params).reason).toBe("why");
186
+ });
187
+ it("swallows transport errors (best-effort)", async () => {
188
+ server = await startServer();
189
+ server.responses.set("tasks/send", [{ status: { state: "working" } }]);
190
+ const client = new A2AClient({ url: server.url, skillId: "x" });
191
+ const job = await client.submit({ role: "user", parts: [] });
192
+ await server.close();
193
+ server = { ...server, close: async () => { } };
194
+ // Should not throw.
195
+ await job.cancel("after-close");
196
+ });
197
+ });
198
+ describe("A2AJob.wait", () => {
199
+ let server;
200
+ afterEach(async () => {
201
+ await server?.close();
202
+ });
203
+ it("returns A2AResponse on completed terminal", async () => {
204
+ server = await startServer();
205
+ server.responses.set("tasks/send", [{ status: { state: "working" } }]);
206
+ server.responses.set("tasks/get", [
207
+ {
208
+ status: { state: "completed" },
209
+ artifacts: [{ parts: [{ text: "ok" }] }],
210
+ },
211
+ ]);
212
+ const client = new A2AClient({
213
+ url: server.url,
214
+ skillId: "x",
215
+ pollIntervalMs: 5,
216
+ });
217
+ const job = await client.submit({ role: "user", parts: [] });
218
+ const r = await job.wait();
219
+ expect(r.state).toBe("completed");
220
+ expect(r.artifactText).toBe("ok");
221
+ });
222
+ it("short-circuits on initial terminal state", async () => {
223
+ server = await startServer();
224
+ server.responses.set("tasks/send", [
225
+ {
226
+ status: { state: "completed" },
227
+ artifacts: [{ parts: [{ text: "ok" }] }],
228
+ },
229
+ ]);
230
+ const client = new A2AClient({ url: server.url, skillId: "x" });
231
+ const job = await client.submit({ role: "user", parts: [] });
232
+ const r = await job.wait();
233
+ expect(r.state).toBe("completed");
234
+ // Only the initial submit envelope — no tasks/get.
235
+ expect(server.envelopes.filter((e) => e.method === "tasks/get")).toHaveLength(0);
236
+ });
237
+ });
238
+ describe("A2AJob.status (raw envelope)", () => {
239
+ let server;
240
+ afterEach(async () => {
241
+ await server?.close();
242
+ });
243
+ it("returns the live envelope for the configured task", async () => {
244
+ server = await startServer();
245
+ server.responses.set("tasks/send", [{ status: { state: "working" } }]);
246
+ server.responses.set("tasks/get", [
247
+ { status: { state: "working" }, metadata: { progress: 0.5 } },
248
+ ]);
249
+ const client = new A2AClient({ url: server.url, skillId: "x" });
250
+ const job = await client.submit({ role: "user", parts: [] });
251
+ const result = await job.status();
252
+ expect(result.status.state).toBe("working");
253
+ });
254
+ });
255
+ //# sourceMappingURL=a2a-job.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"a2a-job.spec.js","sourceRoot":"","sources":["../../../src/__tests__/a2a/a2a-job.spec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=a2a-stream.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"a2a-stream.spec.d.ts","sourceRoot":"","sources":["../../../src/__tests__/a2a/a2a-stream.spec.ts"],"names":[],"mappings":""}
@@ -0,0 +1,278 @@
1
+ /**
2
+ * Tests for A2AStream + A2AClient.subscribe (issue #917).
3
+ *
4
+ * Spins up a tiny SSE producer over node:http that pushes a sequence
5
+ * of `data: { ... }` frames (status + artifact + final) so we exercise
6
+ * the full SSE line parser + JobController bridge.
7
+ */
8
+ import { describe, it, expect, afterEach, vi } from "vitest";
9
+ import * as http from "node:http";
10
+ import { A2AClient } from "../../a2a/a2a-client.js";
11
+ import { A2AJobCanceledError, A2AJobFailedError, } from "../../a2a/errors.js";
12
+ function startSseServer(frames) {
13
+ return new Promise((resolve) => {
14
+ const server = http.createServer((_req, res) => {
15
+ res.setHeader("Content-Type", "text/event-stream");
16
+ res.setHeader("Cache-Control", "no-cache");
17
+ // Push frames one at a time with small gaps so the consumer sees
18
+ // a true streaming response (not a single buffered write).
19
+ let i = 0;
20
+ const writeNext = () => {
21
+ if (i >= frames.length) {
22
+ res.end();
23
+ return;
24
+ }
25
+ const lines = frames[i++];
26
+ for (const l of lines) {
27
+ res.write(l + "\n");
28
+ }
29
+ res.write("\n"); // event boundary
30
+ setTimeout(writeNext, 5);
31
+ };
32
+ writeNext();
33
+ });
34
+ server.listen(0, "127.0.0.1", () => {
35
+ const port = server.address().port;
36
+ resolve({
37
+ url: `http://127.0.0.1:${port}/agents/test`,
38
+ close: () => new Promise((rs, rj) => server.close((err) => (err ? rj(err) : rs()))),
39
+ });
40
+ });
41
+ });
42
+ }
43
+ function makeMockController(jobId = "job-test") {
44
+ return {
45
+ jobId,
46
+ updateProgress: vi.fn().mockResolvedValue(undefined),
47
+ complete: vi.fn().mockResolvedValue(undefined),
48
+ fail: vi.fn().mockResolvedValue(undefined),
49
+ isTerminal: vi.fn().mockResolvedValue(false),
50
+ releaseLease: vi.fn().mockResolvedValue(undefined),
51
+ };
52
+ }
53
+ const sse = (envelope) => `data: ${JSON.stringify(envelope)}`;
54
+ describe("A2AStream iterator", () => {
55
+ let server;
56
+ afterEach(async () => {
57
+ await server?.close();
58
+ });
59
+ it("yields parsed status and artifact events", async () => {
60
+ server = await startSseServer([
61
+ [
62
+ sse({
63
+ jsonrpc: "2.0",
64
+ id: 1,
65
+ result: {
66
+ status: {
67
+ state: "working",
68
+ message: { parts: [{ text: "warming up" }] },
69
+ },
70
+ metadata: { progress: 0.1 },
71
+ },
72
+ }),
73
+ ],
74
+ [
75
+ sse({
76
+ jsonrpc: "2.0",
77
+ id: 1,
78
+ result: {
79
+ artifact: { parts: [{ text: '{"x":1}' }] },
80
+ },
81
+ }),
82
+ ],
83
+ [
84
+ sse({
85
+ jsonrpc: "2.0",
86
+ id: 1,
87
+ result: {
88
+ status: { state: "completed" },
89
+ final: true,
90
+ },
91
+ }),
92
+ ],
93
+ ]);
94
+ const client = new A2AClient({ url: server.url, skillId: "x" });
95
+ const stream = await client.subscribe({ role: "user", parts: [] });
96
+ const events = [];
97
+ for await (const e of stream) {
98
+ events.push({
99
+ kind: e.kind,
100
+ state: e.state,
101
+ progress: e.progress,
102
+ message: e.message,
103
+ artifactText: e.artifactText,
104
+ final: e.final,
105
+ });
106
+ }
107
+ expect(events.map((e) => e.kind)).toEqual([
108
+ "status",
109
+ "artifact",
110
+ "status",
111
+ ]);
112
+ expect(events[0].progress).toBe(0.1);
113
+ expect(events[0].message).toBe("warming up");
114
+ expect(events[1].artifactText).toBe('{"x":1}');
115
+ expect(events[2].state).toBe("completed");
116
+ expect(events[2].final).toBe(true);
117
+ });
118
+ it("ignores SSE comment + non-data lines", async () => {
119
+ server = await startSseServer([
120
+ [": keepalive", "id: 1", "event: message"],
121
+ [
122
+ sse({
123
+ jsonrpc: "2.0",
124
+ id: 1,
125
+ result: {
126
+ status: { state: "completed" },
127
+ final: true,
128
+ },
129
+ }),
130
+ ],
131
+ ]);
132
+ const client = new A2AClient({ url: server.url, skillId: "x" });
133
+ const stream = await client.subscribe({ role: "user", parts: [] });
134
+ const events = [];
135
+ for await (const e of stream)
136
+ events.push(e);
137
+ expect(events).toHaveLength(1);
138
+ expect(events[0].state).toBe("completed");
139
+ });
140
+ });
141
+ describe("A2AStream.bridge", () => {
142
+ let server;
143
+ afterEach(async () => {
144
+ await server?.close();
145
+ });
146
+ it("mirrors progress + returns the artifact value", async () => {
147
+ server = await startSseServer([
148
+ [
149
+ sse({
150
+ jsonrpc: "2.0",
151
+ id: 1,
152
+ result: {
153
+ status: {
154
+ state: "working",
155
+ message: { parts: [{ text: "step1" }] },
156
+ },
157
+ metadata: { progress: 0.25 },
158
+ },
159
+ }),
160
+ ],
161
+ [
162
+ sse({
163
+ jsonrpc: "2.0",
164
+ id: 1,
165
+ result: {
166
+ status: {
167
+ state: "working",
168
+ message: { parts: [{ text: "step2" }] },
169
+ },
170
+ metadata: { progress: 0.75 },
171
+ },
172
+ }),
173
+ ],
174
+ [
175
+ sse({
176
+ jsonrpc: "2.0",
177
+ id: 1,
178
+ result: {
179
+ artifact: { parts: [{ text: '{"sections":["a","b"]}' }] },
180
+ },
181
+ }),
182
+ ],
183
+ [
184
+ sse({
185
+ jsonrpc: "2.0",
186
+ id: 1,
187
+ result: { status: { state: "completed" }, final: true },
188
+ }),
189
+ ],
190
+ ]);
191
+ const client = new A2AClient({ url: server.url, skillId: "x" });
192
+ const stream = await client.subscribe({ role: "user", parts: [] });
193
+ const ctrl = makeMockController();
194
+ const value = await stream.bridge(ctrl);
195
+ expect(value).toEqual({ sections: ["a", "b"] });
196
+ expect(ctrl
197
+ .updateProgress.mock.calls.length).toBeGreaterThanOrEqual(2);
198
+ });
199
+ it("throws A2AJobFailedError when terminal state is failed", async () => {
200
+ server = await startSseServer([
201
+ [
202
+ sse({
203
+ jsonrpc: "2.0",
204
+ id: 1,
205
+ result: {
206
+ status: {
207
+ state: "failed",
208
+ message: { parts: [{ text: "boom" }] },
209
+ },
210
+ final: true,
211
+ },
212
+ }),
213
+ ],
214
+ ]);
215
+ const client = new A2AClient({ url: server.url, skillId: "x" });
216
+ const stream = await client.subscribe({ role: "user", parts: [] });
217
+ await expect(stream.bridge(makeMockController())).rejects.toBeInstanceOf(A2AJobFailedError);
218
+ });
219
+ it("throws A2AJobCanceledError when terminal state is canceled", async () => {
220
+ server = await startSseServer([
221
+ [
222
+ sse({
223
+ jsonrpc: "2.0",
224
+ id: 1,
225
+ result: {
226
+ status: {
227
+ state: "canceled",
228
+ message: { parts: [{ text: "user cancel" }] },
229
+ },
230
+ final: true,
231
+ },
232
+ }),
233
+ ],
234
+ ]);
235
+ const client = new A2AClient({ url: server.url, skillId: "x" });
236
+ const stream = await client.subscribe({ role: "user", parts: [] });
237
+ await expect(stream.bridge(makeMockController())).rejects.toBeInstanceOf(A2AJobCanceledError);
238
+ });
239
+ it("returns empty string on terminal completed with no artifact (parity with A2AJob)", async () => {
240
+ server = await startSseServer([
241
+ [
242
+ sse({
243
+ jsonrpc: "2.0",
244
+ id: 1,
245
+ result: {
246
+ status: { state: "completed" },
247
+ final: true,
248
+ },
249
+ }),
250
+ ],
251
+ ]);
252
+ const client = new A2AClient({ url: server.url, skillId: "x" });
253
+ const stream = await client.subscribe({ role: "user", parts: [] });
254
+ const value = await stream.bridge(makeMockController());
255
+ expect(value).toBe("");
256
+ });
257
+ it("throws A2AJobFailedError when stream ends with no terminal state and no artifact", async () => {
258
+ server = await startSseServer([
259
+ [
260
+ sse({
261
+ jsonrpc: "2.0",
262
+ id: 1,
263
+ result: {
264
+ status: {
265
+ state: "working",
266
+ message: { parts: [{ text: "still going" }] },
267
+ },
268
+ metadata: { progress: 0.1 },
269
+ },
270
+ }),
271
+ ],
272
+ ]);
273
+ const client = new A2AClient({ url: server.url, skillId: "x" });
274
+ const stream = await client.subscribe({ role: "user", parts: [] });
275
+ await expect(stream.bridge(makeMockController())).rejects.toThrow(/ended without artifact/);
276
+ });
277
+ });
278
+ //# sourceMappingURL=a2a-stream.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"a2a-stream.spec.js","sourceRoot":"","sources":["../../../src/__tests__/a2a/a2a-stream.spec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=agent-a2a-config.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-a2a-config.spec.d.ts","sourceRoot":"","sources":["../../../src/__tests__/a2a/agent-a2a-config.spec.ts"],"names":[],"mappings":""}