@mcpmesh/sdk 0.8.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 (145) hide show
  1. package/dist/__tests__/claude-handler.test.d.ts +7 -0
  2. package/dist/__tests__/claude-handler.test.d.ts.map +1 -0
  3. package/dist/__tests__/claude-handler.test.js +455 -0
  4. package/dist/__tests__/claude-handler.test.js.map +1 -0
  5. package/dist/__tests__/config.test.d.ts +7 -0
  6. package/dist/__tests__/config.test.d.ts.map +1 -0
  7. package/dist/__tests__/config.test.js +156 -0
  8. package/dist/__tests__/config.test.js.map +1 -0
  9. package/dist/__tests__/errors.test.d.ts +7 -0
  10. package/dist/__tests__/errors.test.d.ts.map +1 -0
  11. package/dist/__tests__/errors.test.js +170 -0
  12. package/dist/__tests__/errors.test.js.map +1 -0
  13. package/dist/__tests__/generic-handler.test.d.ts +7 -0
  14. package/dist/__tests__/generic-handler.test.d.ts.map +1 -0
  15. package/dist/__tests__/generic-handler.test.js +243 -0
  16. package/dist/__tests__/generic-handler.test.js.map +1 -0
  17. package/dist/__tests__/llm-provider.test.d.ts +7 -0
  18. package/dist/__tests__/llm-provider.test.d.ts.map +1 -0
  19. package/dist/__tests__/llm-provider.test.js +217 -0
  20. package/dist/__tests__/llm-provider.test.js.map +1 -0
  21. package/dist/__tests__/openai-handler.test.d.ts +7 -0
  22. package/dist/__tests__/openai-handler.test.d.ts.map +1 -0
  23. package/dist/__tests__/openai-handler.test.js +359 -0
  24. package/dist/__tests__/openai-handler.test.js.map +1 -0
  25. package/dist/__tests__/provider-handler-registry.test.d.ts +9 -0
  26. package/dist/__tests__/provider-handler-registry.test.d.ts.map +1 -0
  27. package/dist/__tests__/provider-handler-registry.test.js +187 -0
  28. package/dist/__tests__/provider-handler-registry.test.js.map +1 -0
  29. package/dist/__tests__/response-parser.test.d.ts +7 -0
  30. package/dist/__tests__/response-parser.test.d.ts.map +1 -0
  31. package/dist/__tests__/response-parser.test.js +360 -0
  32. package/dist/__tests__/response-parser.test.js.map +1 -0
  33. package/dist/__tests__/route.test.d.ts +7 -0
  34. package/dist/__tests__/route.test.d.ts.map +1 -0
  35. package/dist/__tests__/route.test.js +281 -0
  36. package/dist/__tests__/route.test.js.map +1 -0
  37. package/dist/__tests__/sse.test.d.ts +7 -0
  38. package/dist/__tests__/sse.test.d.ts.map +1 -0
  39. package/dist/__tests__/sse.test.js +172 -0
  40. package/dist/__tests__/sse.test.js.map +1 -0
  41. package/dist/__tests__/template.test.d.ts +7 -0
  42. package/dist/__tests__/template.test.d.ts.map +1 -0
  43. package/dist/__tests__/template.test.js +176 -0
  44. package/dist/__tests__/template.test.js.map +1 -0
  45. package/dist/__tests__/tracing.test.d.ts +7 -0
  46. package/dist/__tests__/tracing.test.d.ts.map +1 -0
  47. package/dist/__tests__/tracing.test.js +264 -0
  48. package/dist/__tests__/tracing.test.js.map +1 -0
  49. package/dist/agent.d.ts +165 -0
  50. package/dist/agent.d.ts.map +1 -0
  51. package/dist/agent.js +626 -0
  52. package/dist/agent.js.map +1 -0
  53. package/dist/api-runtime.d.ts +166 -0
  54. package/dist/api-runtime.d.ts.map +1 -0
  55. package/dist/api-runtime.js +459 -0
  56. package/dist/api-runtime.js.map +1 -0
  57. package/dist/config.d.ts +31 -0
  58. package/dist/config.d.ts.map +1 -0
  59. package/dist/config.js +60 -0
  60. package/dist/config.js.map +1 -0
  61. package/dist/debug.d.ts +47 -0
  62. package/dist/debug.d.ts.map +1 -0
  63. package/dist/debug.js +86 -0
  64. package/dist/debug.js.map +1 -0
  65. package/dist/errors.d.ts +99 -0
  66. package/dist/errors.d.ts.map +1 -0
  67. package/dist/errors.js +110 -0
  68. package/dist/errors.js.map +1 -0
  69. package/dist/express.d.ts +146 -0
  70. package/dist/express.d.ts.map +1 -0
  71. package/dist/express.js +371 -0
  72. package/dist/express.js.map +1 -0
  73. package/dist/index.d.ts +96 -0
  74. package/dist/index.d.ts.map +1 -0
  75. package/dist/index.js +107 -0
  76. package/dist/index.js.map +1 -0
  77. package/dist/llm-agent.d.ts +193 -0
  78. package/dist/llm-agent.d.ts.map +1 -0
  79. package/dist/llm-agent.js +634 -0
  80. package/dist/llm-agent.js.map +1 -0
  81. package/dist/llm-provider.d.ts +323 -0
  82. package/dist/llm-provider.d.ts.map +1 -0
  83. package/dist/llm-provider.js +446 -0
  84. package/dist/llm-provider.js.map +1 -0
  85. package/dist/llm.d.ts +194 -0
  86. package/dist/llm.d.ts.map +1 -0
  87. package/dist/llm.js +304 -0
  88. package/dist/llm.js.map +1 -0
  89. package/dist/provider-handlers/claude-handler.d.ts +98 -0
  90. package/dist/provider-handlers/claude-handler.d.ts.map +1 -0
  91. package/dist/provider-handlers/claude-handler.js +268 -0
  92. package/dist/provider-handlers/claude-handler.js.map +1 -0
  93. package/dist/provider-handlers/gemini-handler.d.ts +82 -0
  94. package/dist/provider-handlers/gemini-handler.d.ts.map +1 -0
  95. package/dist/provider-handlers/gemini-handler.js +152 -0
  96. package/dist/provider-handlers/gemini-handler.js.map +1 -0
  97. package/dist/provider-handlers/generic-handler.d.ts +78 -0
  98. package/dist/provider-handlers/generic-handler.d.ts.map +1 -0
  99. package/dist/provider-handlers/generic-handler.js +152 -0
  100. package/dist/provider-handlers/generic-handler.js.map +1 -0
  101. package/dist/provider-handlers/index.d.ts +29 -0
  102. package/dist/provider-handlers/index.d.ts.map +1 -0
  103. package/dist/provider-handlers/index.js +32 -0
  104. package/dist/provider-handlers/index.js.map +1 -0
  105. package/dist/provider-handlers/openai-handler.d.ts +86 -0
  106. package/dist/provider-handlers/openai-handler.d.ts.map +1 -0
  107. package/dist/provider-handlers/openai-handler.js +160 -0
  108. package/dist/provider-handlers/openai-handler.js.map +1 -0
  109. package/dist/provider-handlers/provider-handler-registry.d.ts +124 -0
  110. package/dist/provider-handlers/provider-handler-registry.d.ts.map +1 -0
  111. package/dist/provider-handlers/provider-handler-registry.js +180 -0
  112. package/dist/provider-handlers/provider-handler-registry.js.map +1 -0
  113. package/dist/provider-handlers/provider-handler.d.ts +245 -0
  114. package/dist/provider-handlers/provider-handler.d.ts.map +1 -0
  115. package/dist/provider-handlers/provider-handler.js +238 -0
  116. package/dist/provider-handlers/provider-handler.js.map +1 -0
  117. package/dist/proxy.d.ts +44 -0
  118. package/dist/proxy.d.ts.map +1 -0
  119. package/dist/proxy.js +324 -0
  120. package/dist/proxy.js.map +1 -0
  121. package/dist/response-parser.d.ts +103 -0
  122. package/dist/response-parser.d.ts.map +1 -0
  123. package/dist/response-parser.js +232 -0
  124. package/dist/response-parser.js.map +1 -0
  125. package/dist/route.d.ts +185 -0
  126. package/dist/route.d.ts.map +1 -0
  127. package/dist/route.js +310 -0
  128. package/dist/route.js.map +1 -0
  129. package/dist/sse.d.ts +45 -0
  130. package/dist/sse.d.ts.map +1 -0
  131. package/dist/sse.js +77 -0
  132. package/dist/sse.js.map +1 -0
  133. package/dist/template.d.ts +86 -0
  134. package/dist/template.d.ts.map +1 -0
  135. package/dist/template.js +206 -0
  136. package/dist/template.js.map +1 -0
  137. package/dist/tracing.d.ts +88 -0
  138. package/dist/tracing.d.ts.map +1 -0
  139. package/dist/tracing.js +193 -0
  140. package/dist/tracing.js.map +1 -0
  141. package/dist/types.d.ts +618 -0
  142. package/dist/types.d.ts.map +1 -0
  143. package/dist/types.js +5 -0
  144. package/dist/types.js.map +1 -0
  145. package/package.json +68 -0
@@ -0,0 +1,281 @@
1
+ /**
2
+ * Unit tests for route.ts
3
+ *
4
+ * Tests mesh.route() Express middleware and RouteRegistry.
5
+ */
6
+ import { describe, it, expect, vi, beforeEach } from "vitest";
7
+ import { route, routeWithConfig, RouteRegistry } from "../route.js";
8
+ // Mock createProxy from proxy.ts
9
+ vi.mock("../proxy.js", () => ({
10
+ normalizeDependency: vi.fn((dep) => {
11
+ if (typeof dep === "string") {
12
+ return { capability: dep, tags: [] };
13
+ }
14
+ return {
15
+ capability: dep.capability,
16
+ tags: dep.tags ?? [],
17
+ version: dep.version,
18
+ };
19
+ }),
20
+ createProxy: vi.fn((endpoint, capability, functionName) => {
21
+ // Create mock McpMeshAgent
22
+ const mockProxy = async (args) => {
23
+ return JSON.stringify({ result: "mock", args });
24
+ };
25
+ Object.defineProperties(mockProxy, {
26
+ endpoint: { value: endpoint },
27
+ capability: { value: capability },
28
+ functionName: { value: functionName },
29
+ isAvailable: { value: true },
30
+ callTool: { value: async () => "mock" },
31
+ });
32
+ return mockProxy;
33
+ }),
34
+ }));
35
+ describe("RouteRegistry", () => {
36
+ beforeEach(() => {
37
+ // Reset registry before each test
38
+ RouteRegistry.reset();
39
+ });
40
+ describe("getInstance", () => {
41
+ it("should return singleton instance", () => {
42
+ const instance1 = RouteRegistry.getInstance();
43
+ const instance2 = RouteRegistry.getInstance();
44
+ expect(instance1).toBe(instance2);
45
+ });
46
+ });
47
+ describe("registerRoute", () => {
48
+ it("should register a route with dependencies", () => {
49
+ const registry = RouteRegistry.getInstance();
50
+ const routeId = registry.registerRoute("POST", "/compute", [
51
+ { capability: "calculator" },
52
+ { capability: "logger", tags: ["async"] },
53
+ ]);
54
+ expect(routeId).toMatch(/^route_\d+_POST:\/compute$/);
55
+ const route = registry.getRoute(routeId);
56
+ expect(route).toBeDefined();
57
+ expect(route?.method).toBe("POST");
58
+ expect(route?.path).toBe("/compute");
59
+ expect(route?.dependencies).toHaveLength(2);
60
+ expect(route?.dependencies[0].capability).toBe("calculator");
61
+ expect(route?.dependencies[1].capability).toBe("logger");
62
+ expect(route?.dependencies[1].tags).toEqual(["async"]);
63
+ });
64
+ it("should generate unique route IDs", () => {
65
+ const registry = RouteRegistry.getInstance();
66
+ const id1 = registry.registerRoute("GET", "/a", []);
67
+ const id2 = registry.registerRoute("GET", "/b", []);
68
+ const id3 = registry.registerRoute("POST", "/a", []);
69
+ expect(id1).not.toBe(id2);
70
+ expect(id2).not.toBe(id3);
71
+ expect(id1).not.toBe(id3);
72
+ });
73
+ it("should handle string dependencies", () => {
74
+ const registry = RouteRegistry.getInstance();
75
+ const routeId = registry.registerRoute("GET", "/test", [
76
+ "service-a",
77
+ "service-b",
78
+ ]);
79
+ const route = registry.getRoute(routeId);
80
+ expect(route?.dependencies[0].capability).toBe("service-a");
81
+ expect(route?.dependencies[1].capability).toBe("service-b");
82
+ });
83
+ });
84
+ describe("getRoutes", () => {
85
+ it("should return all registered routes", () => {
86
+ const registry = RouteRegistry.getInstance();
87
+ registry.registerRoute("GET", "/a", ["svc1"]);
88
+ registry.registerRoute("POST", "/b", ["svc2"]);
89
+ const routes = registry.getRoutes();
90
+ expect(routes).toHaveLength(2);
91
+ });
92
+ });
93
+ describe("dependency management", () => {
94
+ it("should set and get dependencies", () => {
95
+ const registry = RouteRegistry.getInstance();
96
+ const routeId = registry.registerRoute("GET", "/test", ["calculator"]);
97
+ // Create mock proxy
98
+ const mockProxy = (() => Promise.resolve("test"));
99
+ Object.defineProperties(mockProxy, {
100
+ endpoint: { value: "http://localhost:8000" },
101
+ capability: { value: "calculator" },
102
+ functionName: { value: "add" },
103
+ isAvailable: { value: true },
104
+ });
105
+ // Set dependency
106
+ registry.setDependency(routeId, 0, mockProxy);
107
+ // Get dependency
108
+ const dep = registry.getDependency(routeId, 0);
109
+ expect(dep).toBe(mockProxy);
110
+ });
111
+ it("should return null for unset dependencies", () => {
112
+ const registry = RouteRegistry.getInstance();
113
+ const routeId = registry.registerRoute("GET", "/test", ["calculator"]);
114
+ const dep = registry.getDependency(routeId, 0);
115
+ expect(dep).toBeNull();
116
+ });
117
+ it("should remove dependencies", () => {
118
+ const registry = RouteRegistry.getInstance();
119
+ const routeId = registry.registerRoute("GET", "/test", ["calculator"]);
120
+ const mockProxy = (() => Promise.resolve("test"));
121
+ registry.setDependency(routeId, 0, mockProxy);
122
+ registry.removeDependency(routeId, 0);
123
+ const dep = registry.getDependency(routeId, 0);
124
+ expect(dep).toBeNull();
125
+ });
126
+ it("should get dependencies for route as object", () => {
127
+ const registry = RouteRegistry.getInstance();
128
+ const routeId = registry.registerRoute("GET", "/test", [
129
+ "calculator",
130
+ "logger",
131
+ ]);
132
+ const mockCalc = (() => Promise.resolve("calc"));
133
+ Object.defineProperties(mockCalc, { capability: { value: "calculator" } });
134
+ registry.setDependency(routeId, 0, mockCalc);
135
+ // Leave logger unset
136
+ const deps = registry.getDependenciesForRoute(routeId);
137
+ expect(deps.calculator).toBe(mockCalc);
138
+ expect(deps.logger).toBeNull();
139
+ });
140
+ it("should clear all dependencies", () => {
141
+ const registry = RouteRegistry.getInstance();
142
+ const routeId = registry.registerRoute("GET", "/test", ["calculator"]);
143
+ const mockProxy = (() => Promise.resolve("test"));
144
+ registry.setDependency(routeId, 0, mockProxy);
145
+ registry.clearAllDependencies();
146
+ const dep = registry.getDependency(routeId, 0);
147
+ expect(dep).toBeNull();
148
+ });
149
+ });
150
+ });
151
+ describe("route()", () => {
152
+ beforeEach(() => {
153
+ RouteRegistry.reset();
154
+ });
155
+ it("should create Express middleware", () => {
156
+ const handler = vi.fn();
157
+ const middleware = route([{ capability: "calculator" }], handler);
158
+ expect(typeof middleware).toBe("function");
159
+ expect(middleware.length).toBe(3); // (req, res, next)
160
+ });
161
+ it("should attach mesh metadata to middleware", () => {
162
+ const handler = vi.fn();
163
+ const middleware = route([{ capability: "calculator" }], handler);
164
+ expect(middleware._meshRouteId).toBeDefined();
165
+ expect(middleware._meshDependencies).toBeDefined();
166
+ expect(middleware._meshDependencies[0].capability).toBe("calculator");
167
+ });
168
+ it("should call handler with dependencies", async () => {
169
+ const handler = vi.fn();
170
+ const middleware = route(["calculator"], handler);
171
+ // Create mock request/response/next
172
+ const mockReq = {};
173
+ const mockRes = {};
174
+ const mockNext = vi.fn();
175
+ // Call middleware
176
+ await middleware(mockReq, mockRes, mockNext);
177
+ // Handler should be called with req, res, and deps object
178
+ expect(handler).toHaveBeenCalledTimes(1);
179
+ expect(handler).toHaveBeenCalledWith(mockReq, mockRes, expect.objectContaining({ calculator: null }) // No deps resolved yet
180
+ );
181
+ });
182
+ it("should inject resolved dependencies", async () => {
183
+ const registry = RouteRegistry.getInstance();
184
+ const handler = vi.fn();
185
+ const middleware = route(["calculator"], handler);
186
+ // Set up resolved dependency
187
+ const mockCalc = (async () => "result");
188
+ registry.setDependency(middleware._meshRouteId, 0, mockCalc);
189
+ // Create mock request/response/next
190
+ const mockReq = {};
191
+ const mockRes = {};
192
+ const mockNext = vi.fn();
193
+ // Call middleware
194
+ await middleware(mockReq, mockRes, mockNext);
195
+ // Handler should receive the resolved dependency
196
+ expect(handler).toHaveBeenCalledWith(mockReq, mockRes, expect.objectContaining({ calculator: mockCalc }));
197
+ });
198
+ it("should call next() on error", async () => {
199
+ const error = new Error("Test error");
200
+ const handler = vi.fn().mockRejectedValue(error);
201
+ const middleware = route(["calculator"], handler);
202
+ const mockReq = {};
203
+ const mockRes = {};
204
+ const mockNext = vi.fn();
205
+ await middleware(mockReq, mockRes, mockNext);
206
+ expect(mockNext).toHaveBeenCalledWith(error);
207
+ });
208
+ it("should support handler with next function", async () => {
209
+ const handler = vi.fn((_req, _res, _deps, next) => {
210
+ next();
211
+ });
212
+ const middleware = route(["calculator"], handler);
213
+ const mockReq = {};
214
+ const mockRes = {};
215
+ const mockNext = vi.fn();
216
+ await middleware(mockReq, mockRes, mockNext);
217
+ expect(handler).toHaveBeenCalledWith(mockReq, mockRes, expect.any(Object), mockNext);
218
+ });
219
+ });
220
+ describe("routeWithConfig()", () => {
221
+ beforeEach(() => {
222
+ RouteRegistry.reset();
223
+ });
224
+ it("should create middleware from config object", () => {
225
+ const handler = vi.fn();
226
+ const middleware = routeWithConfig({
227
+ dependencies: [{ capability: "calculator" }],
228
+ dependencyKwargs: [{ timeout: 60 }],
229
+ }, handler);
230
+ expect(typeof middleware).toBe("function");
231
+ });
232
+ it("should register route with kwargs", () => {
233
+ const handler = vi.fn();
234
+ const middleware = routeWithConfig({
235
+ dependencies: ["calculator"],
236
+ dependencyKwargs: [{ timeout: 60, maxAttempts: 3 }],
237
+ }, handler);
238
+ const registry = RouteRegistry.getInstance();
239
+ const route = registry.getRoute(middleware._meshRouteId);
240
+ expect(route?.dependencyKwargs).toEqual([{ timeout: 60, maxAttempts: 3 }]);
241
+ });
242
+ });
243
+ describe("mesh.route integration", () => {
244
+ beforeEach(() => {
245
+ RouteRegistry.reset();
246
+ });
247
+ it("should work with multiple dependencies", async () => {
248
+ const registry = RouteRegistry.getInstance();
249
+ const handler = vi.fn();
250
+ const middleware = route([
251
+ { capability: "calculator" },
252
+ { capability: "logger", tags: ["async"] },
253
+ "formatter",
254
+ ], handler);
255
+ // Set up some dependencies
256
+ const mockCalc = (async () => "calc");
257
+ const mockLogger = (async () => "log");
258
+ registry.setDependency(middleware._meshRouteId, 0, mockCalc);
259
+ registry.setDependency(middleware._meshRouteId, 1, mockLogger);
260
+ // formatter left unresolved
261
+ const mockReq = {};
262
+ const mockRes = {};
263
+ const mockNext = vi.fn();
264
+ await middleware(mockReq, mockRes, mockNext);
265
+ expect(handler).toHaveBeenCalledWith(mockReq, mockRes, expect.objectContaining({
266
+ calculator: mockCalc,
267
+ logger: mockLogger,
268
+ formatter: null,
269
+ }));
270
+ });
271
+ it("should handle empty dependencies", async () => {
272
+ const handler = vi.fn();
273
+ const middleware = route([], handler);
274
+ const mockReq = {};
275
+ const mockRes = {};
276
+ const mockNext = vi.fn();
277
+ await middleware(mockReq, mockRes, mockNext);
278
+ expect(handler).toHaveBeenCalledWith(mockReq, mockRes, {});
279
+ });
280
+ });
281
+ //# sourceMappingURL=route.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"route.test.js","sourceRoot":"","sources":["../../src/__tests__/route.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Unit tests for sse.ts
3
+ *
4
+ * Tests Server-Sent Events (SSE) parsing utilities.
5
+ */
6
+ export {};
7
+ //# sourceMappingURL=sse.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sse.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/sse.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
@@ -0,0 +1,172 @@
1
+ /**
2
+ * Unit tests for sse.ts
3
+ *
4
+ * Tests Server-Sent Events (SSE) parsing utilities.
5
+ */
6
+ import { describe, it, expect } from "vitest";
7
+ import { parseSSEResponse, isSSEResponse, parseSSEStream } from "../sse.js";
8
+ describe("isSSEResponse", () => {
9
+ it("should return true for SSE format", () => {
10
+ const sse = "event: message\ndata: {}\n";
11
+ expect(isSSEResponse(sse)).toBe(true);
12
+ });
13
+ it("should return false for plain JSON", () => {
14
+ const json = '{"result": 42}';
15
+ expect(isSSEResponse(json)).toBe(false);
16
+ });
17
+ it("should return false for JSON starting with bracket", () => {
18
+ const json = "[1, 2, 3]";
19
+ expect(isSSEResponse(json)).toBe(false);
20
+ });
21
+ it("should return false for text not starting with event:", () => {
22
+ const text = "Some text\nevent: message\ndata: {}";
23
+ expect(isSSEResponse(text)).toBe(false);
24
+ });
25
+ });
26
+ describe("parseSSEResponse", () => {
27
+ describe("SSE format", () => {
28
+ it("should parse basic SSE message", () => {
29
+ const sse = 'event: message\ndata: {"result": 42}\n';
30
+ const result = parseSSEResponse(sse);
31
+ expect(result).toEqual({ result: 42 });
32
+ });
33
+ it("should parse JSON-RPC style SSE response", () => {
34
+ const sse = `event: message
35
+ data: {"jsonrpc":"2.0","id":123,"result":{"value":"hello"}}
36
+ `;
37
+ const result = parseSSEResponse(sse);
38
+ expect(result.jsonrpc).toBe("2.0");
39
+ expect(result.id).toBe(123);
40
+ expect(result.result.value).toBe("hello");
41
+ });
42
+ it("should extract the last data line when multiple events exist", () => {
43
+ const sse = `event: progress
44
+ data: {"status": "processing"}
45
+
46
+ event: message
47
+ data: {"status": "complete", "result": 100}
48
+ `;
49
+ const result = parseSSEResponse(sse);
50
+ expect(result.status).toBe("complete");
51
+ expect(result.result).toBe(100);
52
+ });
53
+ it("should handle SSE with extra whitespace", () => {
54
+ const sse = "event: message\ndata: { \"value\" : 1 }\n\n";
55
+ const result = parseSSEResponse(sse);
56
+ expect(result.value).toBe(1);
57
+ });
58
+ it("should throw error when no data line found", () => {
59
+ const sse = "event: message\n\n";
60
+ expect(() => parseSSEResponse(sse)).toThrow("No data found in SSE response");
61
+ });
62
+ it("should throw error for invalid JSON in data line", () => {
63
+ const sse = "event: message\ndata: {invalid json}\n";
64
+ expect(() => parseSSEResponse(sse)).toThrow();
65
+ });
66
+ });
67
+ describe("plain JSON format", () => {
68
+ it("should parse plain JSON object", () => {
69
+ const json = '{"name": "test", "value": 123}';
70
+ const result = parseSSEResponse(json);
71
+ expect(result).toEqual({ name: "test", value: 123 });
72
+ });
73
+ it("should parse plain JSON array", () => {
74
+ const json = "[1, 2, 3, 4, 5]";
75
+ const result = parseSSEResponse(json);
76
+ expect(result).toEqual([1, 2, 3, 4, 5]);
77
+ });
78
+ it("should throw error for invalid plain JSON", () => {
79
+ const invalid = "not json at all";
80
+ expect(() => parseSSEResponse(invalid)).toThrow();
81
+ });
82
+ });
83
+ describe("real-world responses", () => {
84
+ it("should parse FastMCP tool call response", () => {
85
+ const sse = `event: message
86
+ data: {"jsonrpc":"2.0","id":"abc123","result":{"content":[{"type":"text","text":"Hello, world!"}]}}
87
+ `;
88
+ const result = parseSSEResponse(sse);
89
+ expect(result.id).toBe("abc123");
90
+ expect(result.result.content[0].text).toBe("Hello, world!");
91
+ });
92
+ it("should parse MCP Mesh registry heartbeat response", () => {
93
+ const response = JSON.stringify({
94
+ agent_id: "test-agent-123",
95
+ status: "success",
96
+ dependencies_resolved: { calculator: "http://localhost:9001" },
97
+ llm_tools: {},
98
+ message: "Agent registered via heartbeat",
99
+ });
100
+ const result = parseSSEResponse(response);
101
+ expect(result.agent_id).toBe("test-agent-123");
102
+ expect(result.status).toBe("success");
103
+ expect(result.dependencies_resolved.calculator).toBe("http://localhost:9001");
104
+ });
105
+ });
106
+ });
107
+ describe("parseSSEStream", () => {
108
+ it("should parse multiple data events", () => {
109
+ const sse = `event: progress
110
+ data: {"step": 1}
111
+
112
+ event: progress
113
+ data: {"step": 2}
114
+
115
+ event: done
116
+ data: {"step": 3, "complete": true}
117
+ `;
118
+ const results = parseSSEStream(sse);
119
+ expect(results).toHaveLength(3);
120
+ expect(results[0].step).toBe(1);
121
+ expect(results[1].step).toBe(2);
122
+ expect(results[2].step).toBe(3);
123
+ expect(results[2].complete).toBe(true);
124
+ });
125
+ it("should return empty array for non-SSE content", () => {
126
+ const json = '{"result": 42}';
127
+ const results = parseSSEStream(json);
128
+ expect(results).toEqual([]);
129
+ });
130
+ it("should skip empty data lines", () => {
131
+ const sse = `event: message
132
+ data: {"value": 1}
133
+
134
+ data:
135
+
136
+ event: message
137
+ data: {"value": 2}
138
+ `;
139
+ const results = parseSSEStream(sse);
140
+ expect(results).toHaveLength(2);
141
+ expect(results[0].value).toBe(1);
142
+ expect(results[1].value).toBe(2);
143
+ });
144
+ it("should handle streaming chat completion style", () => {
145
+ const sse = `event: message
146
+ data: {"delta": "Hello"}
147
+
148
+ event: message
149
+ data: {"delta": " world"}
150
+
151
+ event: message
152
+ data: {"delta": "!"}
153
+
154
+ event: done
155
+ data: {"finished": true}
156
+ `;
157
+ const results = parseSSEStream(sse);
158
+ expect(results).toHaveLength(4);
159
+ expect(results.filter((r) => r.delta).map((r) => r.delta).join("")).toBe("Hello world!");
160
+ expect(results[3].finished).toBe(true);
161
+ });
162
+ it("should throw for invalid JSON in stream", () => {
163
+ const sse = `event: message
164
+ data: {"valid": true}
165
+
166
+ event: message
167
+ data: invalid json here
168
+ `;
169
+ expect(() => parseSSEStream(sse)).toThrow();
170
+ });
171
+ });
172
+ //# sourceMappingURL=sse.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sse.test.js","sourceRoot":"","sources":["../../src/__tests__/sse.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Unit tests for template.ts
3
+ *
4
+ * Tests Handlebars template rendering and utilities.
5
+ */
6
+ export {};
7
+ //# sourceMappingURL=template.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"template.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/template.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}