@mcpmesh/sdk 1.4.1 → 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 (242) 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__/mesh-job-submitter.spec.d.ts +2 -0
  86. package/dist/__tests__/mesh-job-submitter.spec.d.ts.map +1 -0
  87. package/dist/__tests__/mesh-job-submitter.spec.js +110 -0
  88. package/dist/__tests__/mesh-job-submitter.spec.js.map +1 -0
  89. package/dist/__tests__/proxy-stream.test.d.ts +9 -0
  90. package/dist/__tests__/proxy-stream.test.d.ts.map +1 -0
  91. package/dist/__tests__/proxy-stream.test.js +347 -0
  92. package/dist/__tests__/proxy-stream.test.js.map +1 -0
  93. package/dist/__tests__/resolver-meshjob.spec.d.ts +26 -0
  94. package/dist/__tests__/resolver-meshjob.spec.d.ts.map +1 -0
  95. package/dist/__tests__/resolver-meshjob.spec.js +201 -0
  96. package/dist/__tests__/resolver-meshjob.spec.js.map +1 -0
  97. package/dist/__tests__/schema-verdict-policy.test.d.ts +6 -0
  98. package/dist/__tests__/schema-verdict-policy.test.d.ts.map +1 -0
  99. package/dist/__tests__/schema-verdict-policy.test.js +126 -0
  100. package/dist/__tests__/schema-verdict-policy.test.js.map +1 -0
  101. package/dist/__tests__/sse-stream.test.d.ts +12 -0
  102. package/dist/__tests__/sse-stream.test.d.ts.map +1 -0
  103. package/dist/__tests__/sse-stream.test.js +170 -0
  104. package/dist/__tests__/sse-stream.test.js.map +1 -0
  105. package/dist/a2a/a2a-bearer.d.ts +27 -0
  106. package/dist/a2a/a2a-bearer.d.ts.map +1 -0
  107. package/dist/a2a/a2a-bearer.js +63 -0
  108. package/dist/a2a/a2a-bearer.js.map +1 -0
  109. package/dist/a2a/a2a-client.d.ts +114 -0
  110. package/dist/a2a/a2a-client.d.ts.map +1 -0
  111. package/dist/a2a/a2a-client.js +405 -0
  112. package/dist/a2a/a2a-client.js.map +1 -0
  113. package/dist/a2a/a2a-event.d.ts +25 -0
  114. package/dist/a2a/a2a-event.d.ts.map +1 -0
  115. package/dist/a2a/a2a-event.js +9 -0
  116. package/dist/a2a/a2a-event.js.map +1 -0
  117. package/dist/a2a/a2a-job.d.ts +58 -0
  118. package/dist/a2a/a2a-job.d.ts.map +1 -0
  119. package/dist/a2a/a2a-job.js +264 -0
  120. package/dist/a2a/a2a-job.js.map +1 -0
  121. package/dist/a2a/a2a-stream.d.ts +39 -0
  122. package/dist/a2a/a2a-stream.d.ts.map +1 -0
  123. package/dist/a2a/a2a-stream.js +290 -0
  124. package/dist/a2a/a2a-stream.js.map +1 -0
  125. package/dist/a2a/errors.d.ts +29 -0
  126. package/dist/a2a/errors.d.ts.map +1 -0
  127. package/dist/a2a/errors.js +48 -0
  128. package/dist/a2a/errors.js.map +1 -0
  129. package/dist/a2a/index.d.ts +12 -0
  130. package/dist/a2a/index.d.ts.map +1 -0
  131. package/dist/a2a/index.js +11 -0
  132. package/dist/a2a/index.js.map +1 -0
  133. package/dist/a2a/producer/auth-filter.d.ts +34 -0
  134. package/dist/a2a/producer/auth-filter.d.ts.map +1 -0
  135. package/dist/a2a/producer/auth-filter.js +39 -0
  136. package/dist/a2a/producer/auth-filter.js.map +1 -0
  137. package/dist/a2a/producer/card-builder.d.ts +59 -0
  138. package/dist/a2a/producer/card-builder.d.ts.map +1 -0
  139. package/dist/a2a/producer/card-builder.js +59 -0
  140. package/dist/a2a/producer/card-builder.js.map +1 -0
  141. package/dist/a2a/producer/dispatcher.d.ts +276 -0
  142. package/dist/a2a/producer/dispatcher.d.ts.map +1 -0
  143. package/dist/a2a/producer/dispatcher.js +896 -0
  144. package/dist/a2a/producer/dispatcher.js.map +1 -0
  145. package/dist/a2a/producer/index.d.ts +26 -0
  146. package/dist/a2a/producer/index.d.ts.map +1 -0
  147. package/dist/a2a/producer/index.js +23 -0
  148. package/dist/a2a/producer/index.js.map +1 -0
  149. package/dist/a2a/producer/mount.d.ts +75 -0
  150. package/dist/a2a/producer/mount.d.ts.map +1 -0
  151. package/dist/a2a/producer/mount.js +422 -0
  152. package/dist/a2a/producer/mount.js.map +1 -0
  153. package/dist/a2a/producer/public-url-cache.d.ts +73 -0
  154. package/dist/a2a/producer/public-url-cache.d.ts.map +1 -0
  155. package/dist/a2a/producer/public-url-cache.js +0 -0
  156. package/dist/a2a/producer/public-url-cache.js.map +1 -0
  157. package/dist/a2a/producer/registry.d.ts +138 -0
  158. package/dist/a2a/producer/registry.d.ts.map +1 -0
  159. package/dist/a2a/producer/registry.js +117 -0
  160. package/dist/a2a/producer/registry.js.map +1 -0
  161. package/dist/a2a/producer/sse-emitter.d.ts +85 -0
  162. package/dist/a2a/producer/sse-emitter.d.ts.map +1 -0
  163. package/dist/a2a/producer/sse-emitter.js +405 -0
  164. package/dist/a2a/producer/sse-emitter.js.map +1 -0
  165. package/dist/a2a/producer/state-translator.d.ts +63 -0
  166. package/dist/a2a/producer/state-translator.d.ts.map +1 -0
  167. package/dist/a2a/producer/state-translator.js +108 -0
  168. package/dist/a2a/producer/state-translator.js.map +1 -0
  169. package/dist/a2a/producer/task-store.d.ts +128 -0
  170. package/dist/a2a/producer/task-store.d.ts.map +1 -0
  171. package/dist/a2a/producer/task-store.js +128 -0
  172. package/dist/a2a/producer/task-store.js.map +1 -0
  173. package/dist/agent.d.ts +72 -0
  174. package/dist/agent.d.ts.map +1 -1
  175. package/dist/agent.js +618 -13
  176. package/dist/agent.js.map +1 -1
  177. package/dist/api-runtime.d.ts +25 -0
  178. package/dist/api-runtime.d.ts.map +1 -1
  179. package/dist/api-runtime.js +75 -2
  180. package/dist/api-runtime.js.map +1 -1
  181. package/dist/claim-dispatcher.d.ts +126 -0
  182. package/dist/claim-dispatcher.d.ts.map +1 -0
  183. package/dist/claim-dispatcher.js +478 -0
  184. package/dist/claim-dispatcher.js.map +1 -0
  185. package/dist/express.d.ts.map +1 -1
  186. package/dist/express.js +33 -6
  187. package/dist/express.js.map +1 -1
  188. package/dist/inbound-job-dispatch.d.ts +105 -0
  189. package/dist/inbound-job-dispatch.d.ts.map +1 -0
  190. package/dist/inbound-job-dispatch.js +335 -0
  191. package/dist/inbound-job-dispatch.js.map +1 -0
  192. package/dist/index.d.ts +37 -4
  193. package/dist/index.d.ts.map +1 -1
  194. package/dist/index.js +29 -3
  195. package/dist/index.js.map +1 -1
  196. package/dist/job-context.d.ts +107 -0
  197. package/dist/job-context.d.ts.map +1 -0
  198. package/dist/job-context.js +95 -0
  199. package/dist/job-context.js.map +1 -0
  200. package/dist/jobs-cancel-route.d.ts +36 -0
  201. package/dist/jobs-cancel-route.d.ts.map +1 -0
  202. package/dist/jobs-cancel-route.js +60 -0
  203. package/dist/jobs-cancel-route.js.map +1 -0
  204. package/dist/jobs-helper-tools.d.ts +48 -0
  205. package/dist/jobs-helper-tools.d.ts.map +1 -0
  206. package/dist/jobs-helper-tools.js +133 -0
  207. package/dist/jobs-helper-tools.js.map +1 -0
  208. package/dist/llm-agent.d.ts +62 -53
  209. package/dist/llm-agent.d.ts.map +1 -1
  210. package/dist/llm-agent.js +211 -292
  211. package/dist/llm-agent.js.map +1 -1
  212. package/dist/llm-provider.d.ts +4 -4
  213. package/dist/llm.d.ts +4 -1
  214. package/dist/llm.d.ts.map +1 -1
  215. package/dist/llm.js +7 -17
  216. package/dist/llm.js.map +1 -1
  217. package/dist/mesh-job-submitter.d.ts +83 -0
  218. package/dist/mesh-job-submitter.d.ts.map +1 -0
  219. package/dist/mesh-job-submitter.js +143 -0
  220. package/dist/mesh-job-submitter.js.map +1 -0
  221. package/dist/proxy.d.ts +30 -0
  222. package/dist/proxy.d.ts.map +1 -1
  223. package/dist/proxy.js +351 -1
  224. package/dist/proxy.js.map +1 -1
  225. package/dist/resolver-meshjob.d.ts +170 -0
  226. package/dist/resolver-meshjob.d.ts.map +1 -0
  227. package/dist/resolver-meshjob.js +159 -0
  228. package/dist/resolver-meshjob.js.map +1 -0
  229. package/dist/route.d.ts +4 -0
  230. package/dist/route.d.ts.map +1 -1
  231. package/dist/route.js.map +1 -1
  232. package/dist/schema-normalize.d.ts +62 -0
  233. package/dist/schema-normalize.d.ts.map +1 -0
  234. package/dist/schema-normalize.js +128 -0
  235. package/dist/schema-normalize.js.map +1 -0
  236. package/dist/sse-stream.d.ts +44 -0
  237. package/dist/sse-stream.d.ts.map +1 -0
  238. package/dist/sse-stream.js +173 -0
  239. package/dist/sse-stream.js.map +1 -0
  240. package/dist/types.d.ts +351 -9
  241. package/dist/types.d.ts.map +1 -1
  242. package/package.json +4 -3
@@ -0,0 +1,126 @@
1
+ /**
2
+ * Issue #547 Phase 4: unit tests for the schema verdict policy helpers in
3
+ * `schema-normalize.ts`.
4
+ */
5
+ import { describe, it, expect, vi, beforeEach, afterEach } from "vitest";
6
+ // Mock @mcpmesh/core so we don't load the napi binding for these unit tests.
7
+ vi.mock("@mcpmesh/core", () => ({
8
+ normalizeSchema: vi.fn(),
9
+ }));
10
+ import * as core from "@mcpmesh/core";
11
+ import { clusterStrictEnabled, normalizeSchemaWithPolicy, shouldRefuseStartup, } from "../schema-normalize.js";
12
+ describe("shouldRefuseStartup", () => {
13
+ it("OK never refuses regardless of flags", () => {
14
+ expect(shouldRefuseStartup("OK", false, true)).toBe(false);
15
+ expect(shouldRefuseStartup("OK", true, true)).toBe(false);
16
+ expect(shouldRefuseStartup("OK", true, false)).toBe(false);
17
+ });
18
+ it("BLOCK with default tool_strict refuses", () => {
19
+ expect(shouldRefuseStartup("BLOCK", false, true)).toBe(true);
20
+ });
21
+ it("BLOCK with per-tool override does not refuse", () => {
22
+ expect(shouldRefuseStartup("BLOCK", false, false)).toBe(false);
23
+ });
24
+ it("WARN with defaults does not refuse", () => {
25
+ expect(shouldRefuseStartup("WARN", false, true)).toBe(false);
26
+ });
27
+ it("WARN with cluster strict refuses", () => {
28
+ expect(shouldRefuseStartup("WARN", true, true)).toBe(true);
29
+ });
30
+ it("per-tool override wins over cluster strict", () => {
31
+ expect(shouldRefuseStartup("BLOCK", true, false)).toBe(false);
32
+ expect(shouldRefuseStartup("WARN", true, false)).toBe(false);
33
+ });
34
+ });
35
+ describe("clusterStrictEnabled", () => {
36
+ const originalEnv = process.env.MCP_MESH_SCHEMA_STRICT;
37
+ afterEach(() => {
38
+ if (originalEnv === undefined) {
39
+ delete process.env.MCP_MESH_SCHEMA_STRICT;
40
+ }
41
+ else {
42
+ process.env.MCP_MESH_SCHEMA_STRICT = originalEnv;
43
+ }
44
+ });
45
+ it.each(["1", "true", "TRUE", "True", "yes", "YES"])("truthy value %s -> true", (v) => {
46
+ process.env.MCP_MESH_SCHEMA_STRICT = v;
47
+ expect(clusterStrictEnabled()).toBe(true);
48
+ });
49
+ it.each(["", "0", "false", "no", "off", "anything-else"])("falsy value %s -> false", (v) => {
50
+ process.env.MCP_MESH_SCHEMA_STRICT = v;
51
+ expect(clusterStrictEnabled()).toBe(false);
52
+ });
53
+ it("unset -> false", () => {
54
+ delete process.env.MCP_MESH_SCHEMA_STRICT;
55
+ expect(clusterStrictEnabled()).toBe(false);
56
+ });
57
+ });
58
+ describe("normalizeSchemaWithPolicy", () => {
59
+ const mockNormalize = core.normalizeSchema;
60
+ let warnSpy;
61
+ beforeEach(() => {
62
+ mockNormalize.mockReset();
63
+ warnSpy = vi.spyOn(console, "warn").mockImplementation(() => undefined);
64
+ });
65
+ afterEach(() => {
66
+ warnSpy.mockRestore();
67
+ });
68
+ it("OK passes through with canonical+hash", () => {
69
+ mockNormalize.mockReturnValue(JSON.stringify({
70
+ canonical: { type: "string" },
71
+ hash: "sha256:deadbeef",
72
+ verdict: "OK",
73
+ warnings: [],
74
+ }));
75
+ const r = normalizeSchemaWithPolicy({}, "ctx", false, true);
76
+ expect(r.verdict).toBe("OK");
77
+ expect(r.canonicalJson).toBe('{"type":"string"}');
78
+ expect(r.hash).toBe("sha256:deadbeef");
79
+ expect(r.warnings).toEqual([]);
80
+ });
81
+ it("BLOCK with toolStrict=true throws", () => {
82
+ mockNormalize.mockReturnValue(JSON.stringify({ verdict: "BLOCK", warnings: ["unsupported keyword"] }));
83
+ expect(() => normalizeSchemaWithPolicy({}, "ctx", false, true)).toThrow(/BLOCK for ctx.*unsupported keyword.*Cannot start agent/);
84
+ });
85
+ it("BLOCK with toolStrict=false does not throw, tags warnings", () => {
86
+ mockNormalize.mockReturnValue(JSON.stringify({
87
+ canonical: { type: "string" },
88
+ hash: "sha256:abc",
89
+ verdict: "BLOCK",
90
+ warnings: ["something bad"],
91
+ }));
92
+ const r = normalizeSchemaWithPolicy({}, "ctx", false, false);
93
+ expect(r.verdict).toBe("BLOCK");
94
+ expect(r.warnings).toEqual(["[demoted from BLOCK] something bad"]);
95
+ expect(r.canonicalJson).toBe('{"type":"string"}');
96
+ expect(warnSpy).toHaveBeenCalled();
97
+ });
98
+ it("WARN with cluster strict + tool strict throws (promoted)", () => {
99
+ mockNormalize.mockReturnValue(JSON.stringify({ verdict: "WARN", warnings: ["soft issue"] }));
100
+ expect(() => normalizeSchemaWithPolicy({}, "ctx", true, true)).toThrow(/WARN for ctx \(MCP_MESH_SCHEMA_STRICT=true upgraded WARN.*soft issue/);
101
+ });
102
+ it("WARN with cluster strict + tool override does not throw", () => {
103
+ mockNormalize.mockReturnValue(JSON.stringify({
104
+ canonical: { type: "string" },
105
+ hash: "sha256:abc",
106
+ verdict: "WARN",
107
+ warnings: ["soft issue"],
108
+ }));
109
+ const r = normalizeSchemaWithPolicy({}, "ctx", true, false);
110
+ expect(r.verdict).toBe("WARN");
111
+ expect(r.warnings).toEqual(["soft issue"]);
112
+ });
113
+ it("WARN without cluster strict logs and continues", () => {
114
+ mockNormalize.mockReturnValue(JSON.stringify({
115
+ canonical: { type: "string" },
116
+ hash: "sha256:abc",
117
+ verdict: "WARN",
118
+ warnings: ["soft issue"],
119
+ }));
120
+ const r = normalizeSchemaWithPolicy({}, "ctx", false, true);
121
+ expect(r.verdict).toBe("WARN");
122
+ expect(r.warnings).toEqual(["soft issue"]);
123
+ expect(warnSpy).toHaveBeenCalled();
124
+ });
125
+ });
126
+ //# sourceMappingURL=schema-verdict-policy.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema-verdict-policy.test.js","sourceRoot":"","sources":["../../src/__tests__/schema-verdict-policy.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Unit tests for sse-stream.ts (mesh.sseStream).
3
+ *
4
+ * Verifies the SSE wire format mirrors the Python ``mesh.route`` adapter:
5
+ * - ``data: <chunk>\n\n`` per item
6
+ * - ``data: [DONE]\n\n`` terminator on normal completion
7
+ * - ``event: error\ndata: <json>\n\n`` on per-chunk error
8
+ * - Standard headers (Content-Type, Cache-Control, Connection, X-Accel-Buffering)
9
+ * - Idempotent end()
10
+ */
11
+ export {};
12
+ //# sourceMappingURL=sse-stream.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sse-stream.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/sse-stream.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG"}
@@ -0,0 +1,170 @@
1
+ /**
2
+ * Unit tests for sse-stream.ts (mesh.sseStream).
3
+ *
4
+ * Verifies the SSE wire format mirrors the Python ``mesh.route`` adapter:
5
+ * - ``data: <chunk>\n\n`` per item
6
+ * - ``data: [DONE]\n\n`` terminator on normal completion
7
+ * - ``event: error\ndata: <json>\n\n`` on per-chunk error
8
+ * - Standard headers (Content-Type, Cache-Control, Connection, X-Accel-Buffering)
9
+ * - Idempotent end()
10
+ */
11
+ import { describe, it, expect, vi } from "vitest";
12
+ import { sseStream } from "../sse-stream.js";
13
+ function makeFakeRes() {
14
+ const res = {
15
+ headersSent: false,
16
+ writableEnded: false,
17
+ destroyed: false,
18
+ setHeader: vi.fn(),
19
+ write: vi.fn((data) => {
20
+ res._written.push(data);
21
+ return true;
22
+ }),
23
+ end: vi.fn(() => {
24
+ res.writableEnded = true;
25
+ }),
26
+ flushHeaders: vi.fn(() => {
27
+ res.headersSent = true;
28
+ }),
29
+ _written: [],
30
+ };
31
+ return res;
32
+ }
33
+ async function* asyncIter(items) {
34
+ for (const item of items) {
35
+ yield item;
36
+ }
37
+ }
38
+ describe("sseStream", () => {
39
+ it("sets the standard SSE headers", async () => {
40
+ const res = makeFakeRes();
41
+ await sseStream(res, asyncIter(["a"]));
42
+ const setHeaderCalls = Object.fromEntries(res.setHeader.mock.calls.map((c) => [c[0], c[1]]));
43
+ expect(setHeaderCalls["Content-Type"]).toBe("text/event-stream");
44
+ expect(setHeaderCalls["Cache-Control"]).toBe("no-cache");
45
+ expect(setHeaderCalls["Connection"]).toBe("keep-alive");
46
+ expect(setHeaderCalls["X-Accel-Buffering"]).toBe("no");
47
+ expect(res.flushHeaders).toHaveBeenCalledTimes(1);
48
+ });
49
+ it("writes data: <chunk>\\n\\n per item then data: [DONE]\\n\\n and ends once", async () => {
50
+ const res = makeFakeRes();
51
+ await sseStream(res, asyncIter(["a", "b", "c"]));
52
+ expect(res._written).toEqual([
53
+ "data: a\n\n",
54
+ "data: b\n\n",
55
+ "data: c\n\n",
56
+ "data: [DONE]\n\n",
57
+ ]);
58
+ expect(res.end).toHaveBeenCalledTimes(1);
59
+ });
60
+ it("does not double-end on already-completed response", async () => {
61
+ const res = makeFakeRes();
62
+ await sseStream(res, asyncIter([]));
63
+ // No items: should still write [DONE] and end exactly once
64
+ expect(res._written).toEqual(["data: [DONE]\n\n"]);
65
+ expect(res.end).toHaveBeenCalledTimes(1);
66
+ });
67
+ it("emits one data: line per newline in a multi-line chunk", async () => {
68
+ const res = makeFakeRes();
69
+ await sseStream(res, asyncIter(["line1\nline2\nline3"]));
70
+ // Per SSE spec, multi-line data is multiple data: prefixes inside one event
71
+ expect(res._written[0]).toBe("data: line1\ndata: line2\ndata: line3\n\n");
72
+ expect(res._written[1]).toBe("data: [DONE]\n\n");
73
+ expect(res.end).toHaveBeenCalledTimes(1);
74
+ });
75
+ it("emits a heartbeat-style empty data line for empty chunks", async () => {
76
+ const res = makeFakeRes();
77
+ await sseStream(res, asyncIter([""]));
78
+ expect(res._written[0]).toBe("data: \n\n");
79
+ expect(res._written[1]).toBe("data: [DONE]\n\n");
80
+ });
81
+ it("writes event: error on iterator throw and ends without sending [DONE]", async () => {
82
+ const res = makeFakeRes();
83
+ async function* throwing() {
84
+ yield "first";
85
+ throw new Error("upstream blew up");
86
+ }
87
+ await sseStream(res, throwing());
88
+ expect(res._written[0]).toBe("data: first\n\n");
89
+ // Last frame is the error; [DONE] should NOT have been sent
90
+ expect(res._written.at(-1)).toMatch(/^event: error\ndata: /);
91
+ const errFrame = res._written.at(-1);
92
+ const payloadJson = errFrame.replace(/^event: error\ndata: /, "").replace(/\n\n$/, "");
93
+ const payload = JSON.parse(payloadJson);
94
+ expect(payload.error).toBe("upstream blew up");
95
+ expect(payload.type).toBe("Error");
96
+ // No [DONE] anywhere
97
+ expect(res._written.some((s) => s === "data: [DONE]\n\n")).toBe(false);
98
+ expect(res.end).toHaveBeenCalledTimes(1);
99
+ });
100
+ it("writes event: error and stops on non-string chunks (TypeError)", async () => {
101
+ const res = makeFakeRes();
102
+ // Iterator yields a non-string — should be rejected with a structured error
103
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
104
+ async function* bad() {
105
+ yield "ok";
106
+ yield 42;
107
+ yield "never-reached";
108
+ }
109
+ await sseStream(res, bad());
110
+ expect(res._written[0]).toBe("data: ok\n\n");
111
+ expect(res._written[1]).toMatch(/^event: error\ndata: /);
112
+ const payloadJson = res._written[1].replace(/^event: error\ndata: /, "").replace(/\n\n$/, "");
113
+ const payload = JSON.parse(payloadJson);
114
+ expect(payload.type).toBe("TypeError");
115
+ expect(payload.error).toMatch(/expected string chunk/);
116
+ expect(res.end).toHaveBeenCalledTimes(1);
117
+ });
118
+ it("stops iterating and calls return() on consumer disconnect (write returns false)", async () => {
119
+ const res = makeFakeRes();
120
+ let returnCalled = false;
121
+ let yielded = 0;
122
+ const iter = {
123
+ [Symbol.asyncIterator]() {
124
+ return {
125
+ async next() {
126
+ yielded += 1;
127
+ if (yielded > 5)
128
+ return { value: undefined, done: true };
129
+ return { value: `chunk${yielded}`, done: false };
130
+ },
131
+ async return() {
132
+ returnCalled = true;
133
+ return { value: undefined, done: true };
134
+ },
135
+ };
136
+ },
137
+ };
138
+ // After first write, simulate disconnect
139
+ res.write = vi.fn(() => {
140
+ res._written.push("first-write");
141
+ res.writableEnded = true; // Simulate consumer disconnect
142
+ return false;
143
+ });
144
+ await sseStream(res, iter);
145
+ expect(returnCalled).toBe(true);
146
+ // Only one chunk was attempted, then disconnect detected
147
+ expect(yielded).toBe(1);
148
+ // [DONE] was NOT written
149
+ expect(res._written).not.toContain("data: [DONE]\n\n");
150
+ });
151
+ it("does not set headers if headersSent is already true", async () => {
152
+ const res = makeFakeRes();
153
+ res.headersSent = true;
154
+ await sseStream(res, asyncIter(["a"]));
155
+ expect(res.setHeader).not.toHaveBeenCalled();
156
+ expect(res.flushHeaders).not.toHaveBeenCalled();
157
+ // Still writes data + [DONE]
158
+ expect(res._written).toEqual(["data: a\n\n", "data: [DONE]\n\n"]);
159
+ });
160
+ it("handles synchronous res.write throwing without crashing", async () => {
161
+ const res = makeFakeRes();
162
+ res.write = vi.fn(() => {
163
+ throw new Error("socket closed");
164
+ });
165
+ // Should not throw out of sseStream — it swallows write errors and ends
166
+ await expect(sseStream(res, asyncIter(["a", "b"]))).resolves.toBeUndefined();
167
+ expect(res.end).toHaveBeenCalledTimes(1);
168
+ });
169
+ });
170
+ //# sourceMappingURL=sse-stream.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sse-stream.test.js","sourceRoot":"","sources":["../../src/__tests__/sse-stream.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ export interface A2ABearerConfig {
2
+ /** Literal bearer token. Mutually exclusive with `tokenEnv`. */
3
+ token?: string;
4
+ /** Env-var name to read the token from on each call. Mutually exclusive with `token`. */
5
+ tokenEnv?: string;
6
+ }
7
+ export declare class A2ABearer {
8
+ private readonly token?;
9
+ private readonly tokenEnv?;
10
+ constructor(config: A2ABearerConfig);
11
+ /**
12
+ * Build the value for the `Authorization` header at call time.
13
+ *
14
+ * Reads the env var (when configured) on every call so a rotated
15
+ * credential is honoured mid-process.
16
+ */
17
+ authorizationHeader(): string;
18
+ }
19
+ /**
20
+ * Helper: normalise the user-friendly union (`A2ABearer | A2ABearerConfig`)
21
+ * into a concrete `A2ABearer` instance, or `undefined` for "no auth".
22
+ *
23
+ * Lets the consumer-side `addTool({ a2aConfig: { auth: { tokenEnv: "X" } } })`
24
+ * shortcut work without forcing the user to `new A2ABearer(...)` every time.
25
+ */
26
+ export declare function resolveBearer(auth: A2ABearer | A2ABearerConfig | undefined): A2ABearer | undefined;
27
+ //# sourceMappingURL=a2a-bearer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"a2a-bearer.d.ts","sourceRoot":"","sources":["../../src/a2a/a2a-bearer.ts"],"names":[],"mappings":"AAYA,MAAM,WAAW,eAAe;IAC9B,gEAAgE;IAChE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,yFAAyF;IACzF,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,qBAAa,SAAS;IACpB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAS;gBAEvB,MAAM,EAAE,eAAe;IAqBnC;;;;;OAKG;IACH,mBAAmB,IAAI,MAAM;CAa9B;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAC3B,IAAI,EAAE,SAAS,GAAG,eAAe,GAAG,SAAS,GAC5C,SAAS,GAAG,SAAS,CAIvB"}
@@ -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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"}