@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,7 @@
1
+ /**
2
+ * Unit tests for claude-handler.ts
3
+ *
4
+ * Tests the ClaudeHandler provider for Anthropic Claude models.
5
+ */
6
+ export {};
7
+ //# sourceMappingURL=claude-handler.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-handler.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/claude-handler.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
@@ -0,0 +1,455 @@
1
+ /**
2
+ * Unit tests for claude-handler.ts
3
+ *
4
+ * Tests the ClaudeHandler provider for Anthropic Claude models.
5
+ */
6
+ import { describe, it, expect, beforeEach } from "vitest";
7
+ import { ClaudeHandler } from "../provider-handlers/claude-handler.js";
8
+ describe("ClaudeHandler", () => {
9
+ let handler;
10
+ beforeEach(() => {
11
+ handler = new ClaudeHandler();
12
+ });
13
+ describe("vendor", () => {
14
+ it("should have vendor set to 'anthropic'", () => {
15
+ expect(handler.vendor).toBe("anthropic");
16
+ });
17
+ });
18
+ describe("getCapabilities", () => {
19
+ it("should return Claude capabilities", () => {
20
+ const capabilities = handler.getCapabilities();
21
+ expect(capabilities.nativeToolCalling).toBe(true);
22
+ expect(capabilities.structuredOutput).toBe(true);
23
+ expect(capabilities.streaming).toBe(true);
24
+ expect(capabilities.vision).toBe(true);
25
+ expect(capabilities.jsonMode).toBe(true);
26
+ expect(capabilities.promptCaching).toBe(false); // Disabled for AI SDK v6
27
+ });
28
+ });
29
+ describe("determineOutputMode", () => {
30
+ it("should return 'text' when no schema provided", () => {
31
+ const mode = handler.determineOutputMode(null);
32
+ expect(mode).toBe("text");
33
+ });
34
+ it("should return override mode when specified", () => {
35
+ const schema = {
36
+ name: "TestSchema",
37
+ schema: { type: "object", properties: { a: { type: "string" } } },
38
+ };
39
+ expect(handler.determineOutputMode(schema, "hint")).toBe("hint");
40
+ expect(handler.determineOutputMode(schema, "strict")).toBe("strict");
41
+ expect(handler.determineOutputMode(schema, "text")).toBe("text");
42
+ });
43
+ it("should return 'hint' for simple schemas (< 5 fields)", () => {
44
+ const simpleSchema = {
45
+ name: "SimpleSchema",
46
+ schema: {
47
+ type: "object",
48
+ properties: {
49
+ name: { type: "string" },
50
+ age: { type: "number" },
51
+ },
52
+ },
53
+ };
54
+ const mode = handler.determineOutputMode(simpleSchema);
55
+ expect(mode).toBe("hint");
56
+ });
57
+ it("should return 'strict' for complex schemas (>= 5 fields)", () => {
58
+ const complexSchema = {
59
+ name: "ComplexSchema",
60
+ schema: {
61
+ type: "object",
62
+ properties: {
63
+ field1: { type: "string" },
64
+ field2: { type: "string" },
65
+ field3: { type: "string" },
66
+ field4: { type: "string" },
67
+ field5: { type: "string" },
68
+ },
69
+ },
70
+ };
71
+ const mode = handler.determineOutputMode(complexSchema);
72
+ expect(mode).toBe("strict");
73
+ });
74
+ it("should return 'strict' for schemas with nested objects", () => {
75
+ const nestedSchema = {
76
+ name: "NestedSchema",
77
+ schema: {
78
+ type: "object",
79
+ properties: {
80
+ name: { type: "string" },
81
+ address: {
82
+ type: "object",
83
+ properties: {
84
+ street: { type: "string" },
85
+ city: { type: "string" },
86
+ },
87
+ },
88
+ },
89
+ },
90
+ };
91
+ const mode = handler.determineOutputMode(nestedSchema);
92
+ expect(mode).toBe("strict");
93
+ });
94
+ it("should return 'strict' for schemas with $defs", () => {
95
+ const schemaWithDefs = {
96
+ name: "SchemaWithDefs",
97
+ schema: {
98
+ type: "object",
99
+ properties: {
100
+ name: { type: "string" },
101
+ },
102
+ $defs: {
103
+ Address: { type: "object", properties: { city: { type: "string" } } },
104
+ },
105
+ },
106
+ };
107
+ const mode = handler.determineOutputMode(schemaWithDefs);
108
+ expect(mode).toBe("strict");
109
+ });
110
+ it("should return 'strict' for schemas with $ref", () => {
111
+ const schemaWithRef = {
112
+ name: "SchemaWithRef",
113
+ schema: {
114
+ type: "object",
115
+ properties: {
116
+ address: { $ref: "#/$defs/Address" },
117
+ },
118
+ },
119
+ };
120
+ const mode = handler.determineOutputMode(schemaWithRef);
121
+ expect(mode).toBe("strict");
122
+ });
123
+ it("should use pre-computed fieldCount if available", () => {
124
+ const schemaWithFieldCount = {
125
+ name: "SchemaWithFieldCount",
126
+ schema: { type: "object" },
127
+ fieldCount: 10,
128
+ };
129
+ const mode = handler.determineOutputMode(schemaWithFieldCount);
130
+ expect(mode).toBe("strict");
131
+ });
132
+ it("should use pre-computed hasNestedObjects if available", () => {
133
+ const schemaWithFlag = {
134
+ name: "SchemaWithFlag",
135
+ schema: { type: "object", properties: { a: { type: "string" } } },
136
+ fieldCount: 1,
137
+ hasNestedObjects: false,
138
+ };
139
+ const mode = handler.determineOutputMode(schemaWithFlag);
140
+ expect(mode).toBe("hint");
141
+ });
142
+ });
143
+ describe("prepareRequest", () => {
144
+ it("should convert messages to Vercel format", () => {
145
+ const messages = [
146
+ { role: "system", content: "You are helpful." },
147
+ { role: "user", content: "Hello" },
148
+ { role: "assistant", content: "Hi there!" },
149
+ ];
150
+ const request = handler.prepareRequest(messages, null, null);
151
+ expect(request.messages).toHaveLength(3);
152
+ });
153
+ it("should keep system messages as strings (prompt caching disabled for AI SDK v6)", () => {
154
+ const messages = [
155
+ { role: "system", content: "You are a helpful assistant." },
156
+ { role: "user", content: "Hello" },
157
+ ];
158
+ const request = handler.prepareRequest(messages, null, null);
159
+ // System message should remain as string content (AI SDK v6 requires string, not array)
160
+ // Prompt caching is disabled to maintain compatibility with AI SDK v6
161
+ const systemMsg = request.messages[0];
162
+ expect(systemMsg.role).toBe("system");
163
+ expect(typeof systemMsg.content).toBe("string");
164
+ expect(systemMsg.content).toBe("You are a helpful assistant.");
165
+ });
166
+ it("should include tools when provided", () => {
167
+ const messages = [{ role: "user", content: "Hello" }];
168
+ const tools = [
169
+ {
170
+ type: "function",
171
+ function: { name: "get_weather", description: "Get weather info" },
172
+ },
173
+ ];
174
+ const request = handler.prepareRequest(messages, tools, null);
175
+ expect(request.tools).toEqual(tools);
176
+ });
177
+ it("should include response_format in strict mode with schema", () => {
178
+ const messages = [{ role: "user", content: "Hello" }];
179
+ const outputSchema = {
180
+ name: "Response",
181
+ schema: {
182
+ type: "object",
183
+ properties: {
184
+ field1: { type: "string" },
185
+ field2: { type: "string" },
186
+ field3: { type: "string" },
187
+ field4: { type: "string" },
188
+ field5: { type: "string" },
189
+ },
190
+ },
191
+ };
192
+ const request = handler.prepareRequest(messages, null, outputSchema);
193
+ expect(request.responseFormat).toBeDefined();
194
+ expect(request.responseFormat?.type).toBe("json_schema");
195
+ expect(request.responseFormat?.jsonSchema.name).toBe("Response");
196
+ });
197
+ it("should not include response_format in hint mode", () => {
198
+ const messages = [{ role: "user", content: "Hello" }];
199
+ const simpleSchema = {
200
+ name: "Simple",
201
+ schema: {
202
+ type: "object",
203
+ properties: { name: { type: "string" } },
204
+ },
205
+ };
206
+ const request = handler.prepareRequest(messages, null, simpleSchema);
207
+ // Simple schema uses hint mode, no response_format
208
+ expect(request.responseFormat).toBeUndefined();
209
+ });
210
+ it("should not include response_format in text mode", () => {
211
+ const messages = [{ role: "user", content: "Hello" }];
212
+ const request = handler.prepareRequest(messages, null, null, { outputMode: "text" });
213
+ expect(request.responseFormat).toBeUndefined();
214
+ });
215
+ it("should add additionalProperties:false to schema in strict mode", () => {
216
+ const messages = [{ role: "user", content: "Hello" }];
217
+ const outputSchema = {
218
+ name: "Test",
219
+ schema: {
220
+ type: "object",
221
+ properties: {
222
+ field1: { type: "string" },
223
+ field2: { type: "string" },
224
+ field3: { type: "string" },
225
+ field4: { type: "string" },
226
+ field5: { type: "string" },
227
+ },
228
+ },
229
+ };
230
+ const request = handler.prepareRequest(messages, null, outputSchema);
231
+ expect(request.responseFormat?.jsonSchema.schema.additionalProperties).toBe(false);
232
+ });
233
+ it("should pass through temperature, maxOutputTokens, and topP", () => {
234
+ const messages = [{ role: "user", content: "Hello" }];
235
+ const request = handler.prepareRequest(messages, null, null, {
236
+ temperature: 0.7,
237
+ maxOutputTokens: 1000,
238
+ topP: 0.9,
239
+ });
240
+ expect(request.temperature).toBe(0.7);
241
+ expect(request.maxOutputTokens).toBe(1000);
242
+ expect(request.topP).toBe(0.9);
243
+ });
244
+ it("should convert assistant tool_calls to Vercel format", () => {
245
+ const messages = [
246
+ { role: "user", content: "What's the weather?" },
247
+ {
248
+ role: "assistant",
249
+ content: "",
250
+ tool_calls: [
251
+ {
252
+ id: "call_123",
253
+ type: "function",
254
+ function: { name: "get_weather", arguments: '{"city":"NYC"}' },
255
+ },
256
+ ],
257
+ },
258
+ ];
259
+ const request = handler.prepareRequest(messages, null, null);
260
+ const assistantMsg = request.messages[1];
261
+ expect(Array.isArray(assistantMsg.content)).toBe(true);
262
+ const content = assistantMsg.content;
263
+ expect(content[0].type).toBe("tool-call");
264
+ expect(content[0].toolCallId).toBe("call_123");
265
+ expect(content[0].toolName).toBe("get_weather");
266
+ expect(content[0].input).toEqual({ city: "NYC" });
267
+ });
268
+ it("should convert tool result messages to Vercel format", () => {
269
+ const messages = [
270
+ {
271
+ role: "tool",
272
+ content: "Sunny, 75°F",
273
+ tool_call_id: "call_123",
274
+ name: "get_weather",
275
+ },
276
+ ];
277
+ const request = handler.prepareRequest(messages, null, null);
278
+ const toolMsg = request.messages[0];
279
+ expect(toolMsg.role).toBe("tool");
280
+ expect(Array.isArray(toolMsg.content)).toBe(true);
281
+ const content = toolMsg.content;
282
+ expect(content[0].type).toBe("tool-result");
283
+ expect(content[0].toolCallId).toBe("call_123");
284
+ expect(content[0].toolName).toBe("get_weather");
285
+ // AI SDK v6 expects output as { type: 'text' | 'json', value: ... }
286
+ expect(content[0].output.type).toBe("text");
287
+ expect(content[0].output.value).toBe("Sunny, 75°F");
288
+ });
289
+ it("should handle malformed tool_call arguments gracefully", () => {
290
+ const messages = [
291
+ {
292
+ role: "assistant",
293
+ content: "",
294
+ tool_calls: [
295
+ {
296
+ id: "call_456",
297
+ type: "function",
298
+ function: { name: "test_tool", arguments: "invalid json{" },
299
+ },
300
+ ],
301
+ },
302
+ ];
303
+ // Should not throw
304
+ const request = handler.prepareRequest(messages, null, null);
305
+ const assistantMsg = request.messages[0];
306
+ const content = assistantMsg.content;
307
+ // Should fallback to empty object (AI SDK v6 uses 'input' instead of 'args')
308
+ expect(content[0].input).toEqual({});
309
+ });
310
+ });
311
+ describe("formatSystemPrompt", () => {
312
+ it("should return base prompt as-is when no tools or schema", () => {
313
+ const basePrompt = "You are a helpful assistant.";
314
+ const result = handler.formatSystemPrompt(basePrompt, null, null);
315
+ expect(result).toBe(basePrompt);
316
+ });
317
+ it("should add tool calling rules when tools provided", () => {
318
+ const basePrompt = "You are a helpful assistant.";
319
+ const tools = [
320
+ { type: "function", function: { name: "test" } },
321
+ ];
322
+ const result = handler.formatSystemPrompt(basePrompt, tools, null);
323
+ expect(result).toContain("IMPORTANT TOOL CALLING RULES:");
324
+ expect(result).toContain("Make ONE tool call at a time");
325
+ expect(result).toContain("NEVER use XML-style syntax");
326
+ });
327
+ it("should add brief JSON note in strict mode", () => {
328
+ const basePrompt = "You are a helpful assistant.";
329
+ const complexSchema = {
330
+ name: "ComplexOutput",
331
+ schema: {
332
+ type: "object",
333
+ properties: {
334
+ a: { type: "string" },
335
+ b: { type: "string" },
336
+ c: { type: "string" },
337
+ d: { type: "string" },
338
+ e: { type: "string" },
339
+ },
340
+ },
341
+ };
342
+ const result = handler.formatSystemPrompt(basePrompt, null, complexSchema);
343
+ expect(result).toContain("ComplexOutput format");
344
+ // Should NOT contain detailed schema (that's handled by response_format)
345
+ expect(result).not.toContain("RESPONSE FORMAT:");
346
+ });
347
+ it("should add detailed JSON schema in hint mode", () => {
348
+ const basePrompt = "You are a helpful assistant.";
349
+ const simpleSchema = {
350
+ name: "SimpleOutput",
351
+ schema: {
352
+ type: "object",
353
+ properties: {
354
+ name: { type: "string", description: "The name" },
355
+ age: { type: "number" },
356
+ },
357
+ required: ["name"],
358
+ },
359
+ };
360
+ const result = handler.formatSystemPrompt(basePrompt, null, simpleSchema);
361
+ expect(result).toContain("RESPONSE FORMAT:");
362
+ expect(result).toContain("name: string (required)");
363
+ expect(result).toContain("age: number (optional)");
364
+ expect(result).toContain("Respond ONLY with valid JSON");
365
+ });
366
+ it("should not add JSON instructions in text mode", () => {
367
+ const basePrompt = "You are a helpful assistant.";
368
+ const result = handler.formatSystemPrompt(basePrompt, null, null, "text");
369
+ expect(result).toBe(basePrompt);
370
+ expect(result).not.toContain("JSON");
371
+ });
372
+ });
373
+ describe("schema strictness (makeSchemaStrict)", () => {
374
+ it("should add additionalProperties:false to nested objects", () => {
375
+ const messages = [{ role: "user", content: "Hello" }];
376
+ const nestedSchema = {
377
+ name: "Nested",
378
+ schema: {
379
+ type: "object",
380
+ properties: {
381
+ user: {
382
+ type: "object",
383
+ properties: {
384
+ name: { type: "string" },
385
+ },
386
+ },
387
+ a: { type: "string" },
388
+ b: { type: "string" },
389
+ c: { type: "string" },
390
+ d: { type: "string" },
391
+ },
392
+ },
393
+ };
394
+ const request = handler.prepareRequest(messages, null, nestedSchema);
395
+ const schema = request.responseFormat?.jsonSchema.schema;
396
+ expect(schema.additionalProperties).toBe(false);
397
+ const properties = schema.properties;
398
+ expect(properties.user.additionalProperties).toBe(false);
399
+ });
400
+ it("should add additionalProperties:false to $defs", () => {
401
+ const messages = [{ role: "user", content: "Hello" }];
402
+ const schemaWithDefs = {
403
+ name: "WithDefs",
404
+ schema: {
405
+ type: "object",
406
+ properties: {
407
+ a: { type: "string" },
408
+ b: { type: "string" },
409
+ c: { type: "string" },
410
+ d: { type: "string" },
411
+ e: { type: "string" },
412
+ },
413
+ $defs: {
414
+ Address: {
415
+ type: "object",
416
+ properties: { city: { type: "string" } },
417
+ },
418
+ },
419
+ },
420
+ };
421
+ const request = handler.prepareRequest(messages, null, schemaWithDefs);
422
+ const schema = request.responseFormat?.jsonSchema.schema;
423
+ const defs = schema.$defs;
424
+ expect(defs.Address.additionalProperties).toBe(false);
425
+ });
426
+ it("should add additionalProperties:false to array items", () => {
427
+ const messages = [{ role: "user", content: "Hello" }];
428
+ const arraySchema = {
429
+ name: "ArraySchema",
430
+ schema: {
431
+ type: "object",
432
+ properties: {
433
+ items: {
434
+ type: "array",
435
+ items: {
436
+ type: "object",
437
+ properties: { id: { type: "number" } },
438
+ },
439
+ },
440
+ a: { type: "string" },
441
+ b: { type: "string" },
442
+ c: { type: "string" },
443
+ d: { type: "string" },
444
+ },
445
+ },
446
+ };
447
+ const request = handler.prepareRequest(messages, null, arraySchema);
448
+ const schema = request.responseFormat?.jsonSchema.schema;
449
+ const properties = schema.properties;
450
+ const items = properties.items.items;
451
+ expect(items.additionalProperties).toBe(false);
452
+ });
453
+ });
454
+ });
455
+ //# sourceMappingURL=claude-handler.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-handler.test.js","sourceRoot":"","sources":["../../src/__tests__/claude-handler.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,wCAAwC,CAAC;AAIvE,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;IAC7B,IAAI,OAAsB,CAAC;IAE3B,UAAU,CAAC,GAAG,EAAE;QACd,OAAO,GAAG,IAAI,aAAa,EAAE,CAAC;IAChC,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE;QACtB,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;YAC/C,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAC3C,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;QAC/B,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;YAC3C,MAAM,YAAY,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;YAE/C,MAAM,CAAC,YAAY,CAAC,iBAAiB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAClD,MAAM,CAAC,YAAY,CAAC,gBAAgB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACjD,MAAM,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC1C,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACvC,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACzC,MAAM,CAAC,YAAY,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,yBAAyB;QAC3E,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;QACnC,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;YACtD,MAAM,IAAI,GAAG,OAAO,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC;YAC/C,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC5B,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;YACpD,MAAM,MAAM,GAAiB;gBAC3B,IAAI,EAAE,YAAY;gBAClB,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE;aAClE,CAAC;YAEF,MAAM,CAAC,OAAO,CAAC,mBAAmB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACjE,MAAM,CAAC,OAAO,CAAC,mBAAmB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACrE,MAAM,CAAC,OAAO,CAAC,mBAAmB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACnE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;YAC9D,MAAM,YAAY,GAAiB;gBACjC,IAAI,EAAE,cAAc;gBACpB,MAAM,EAAE;oBACN,IAAI,EAAE,QAAQ;oBACd,UAAU,EAAE;wBACV,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;wBACxB,GAAG,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;qBACxB;iBACF;aACF,CAAC;YAEF,MAAM,IAAI,GAAG,OAAO,CAAC,mBAAmB,CAAC,YAAY,CAAC,CAAC;YACvD,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC5B,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,0DAA0D,EAAE,GAAG,EAAE;YAClE,MAAM,aAAa,GAAiB;gBAClC,IAAI,EAAE,eAAe;gBACrB,MAAM,EAAE;oBACN,IAAI,EAAE,QAAQ;oBACd,UAAU,EAAE;wBACV,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;wBAC1B,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;wBAC1B,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;wBAC1B,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;wBAC1B,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;qBAC3B;iBACF;aACF,CAAC;YAEF,MAAM,IAAI,GAAG,OAAO,CAAC,mBAAmB,CAAC,aAAa,CAAC,CAAC;YACxD,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC9B,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,wDAAwD,EAAE,GAAG,EAAE;YAChE,MAAM,YAAY,GAAiB;gBACjC,IAAI,EAAE,cAAc;gBACpB,MAAM,EAAE;oBACN,IAAI,EAAE,QAAQ;oBACd,UAAU,EAAE;wBACV,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;wBACxB,OAAO,EAAE;4BACP,IAAI,EAAE,QAAQ;4BACd,UAAU,EAAE;gCACV,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;gCAC1B,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;6BACzB;yBACF;qBACF;iBACF;aACF,CAAC;YAEF,MAAM,IAAI,GAAG,OAAO,CAAC,mBAAmB,CAAC,YAAY,CAAC,CAAC;YACvD,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC9B,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;YACvD,MAAM,cAAc,GAAiB;gBACnC,IAAI,EAAE,gBAAgB;gBACtB,MAAM,EAAE;oBACN,IAAI,EAAE,QAAQ;oBACd,UAAU,EAAE;wBACV,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;qBACzB;oBACD,KAAK,EAAE;wBACL,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE;qBACtE;iBACF;aACF,CAAC;YAEF,MAAM,IAAI,GAAG,OAAO,CAAC,mBAAmB,CAAC,cAAc,CAAC,CAAC;YACzD,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC9B,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;YACtD,MAAM,aAAa,GAAiB;gBAClC,IAAI,EAAE,eAAe;gBACrB,MAAM,EAAE;oBACN,IAAI,EAAE,QAAQ;oBACd,UAAU,EAAE;wBACV,OAAO,EAAE,EAAE,IAAI,EAAE,iBAAiB,EAAE;qBACrC;iBACF;aACF,CAAC;YAEF,MAAM,IAAI,GAAG,OAAO,CAAC,mBAAmB,CAAC,aAAa,CAAC,CAAC;YACxD,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC9B,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;YACzD,MAAM,oBAAoB,GAAiB;gBACzC,IAAI,EAAE,sBAAsB;gBAC5B,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;gBAC1B,UAAU,EAAE,EAAE;aACf,CAAC;YAEF,MAAM,IAAI,GAAG,OAAO,CAAC,mBAAmB,CAAC,oBAAoB,CAAC,CAAC;YAC/D,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC9B,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,uDAAuD,EAAE,GAAG,EAAE;YAC/D,MAAM,cAAc,GAAiB;gBACnC,IAAI,EAAE,gBAAgB;gBACtB,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE;gBACjE,UAAU,EAAE,CAAC;gBACb,gBAAgB,EAAE,KAAK;aACxB,CAAC;YAEF,MAAM,IAAI,GAAG,OAAO,CAAC,mBAAmB,CAAC,cAAc,CAAC,CAAC;YACzD,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC5B,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;QAC9B,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;YAClD,MAAM,QAAQ,GAAiB;gBAC7B,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,kBAAkB,EAAE;gBAC/C,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE;gBAClC,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,WAAW,EAAE;aAC5C,CAAC;YAEF,MAAM,OAAO,GAAG,OAAO,CAAC,cAAc,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;YAE7D,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAC3C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gFAAgF,EAAE,GAAG,EAAE;YACxF,MAAM,QAAQ,GAAiB;gBAC7B,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,8BAA8B,EAAE;gBAC3D,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE;aACnC,CAAC;YAEF,MAAM,OAAO,GAAG,OAAO,CAAC,cAAc,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;YAE7D,wFAAwF;YACxF,sEAAsE;YACtE,MAAM,SAAS,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;YACtC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACtC,MAAM,CAAC,OAAO,SAAS,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAChD,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;QACjE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;YAC5C,MAAM,QAAQ,GAAiB,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;YACpE,MAAM,KAAK,GAAiB;gBAC1B;oBACE,IAAI,EAAE,UAAU;oBAChB,QAAQ,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,WAAW,EAAE,kBAAkB,EAAE;iBACnE;aACF,CAAC;YAEF,MAAM,OAAO,GAAG,OAAO,CAAC,cAAc,CAAC,QAAQ,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;YAE9D,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACvC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,2DAA2D,EAAE,GAAG,EAAE;YACnE,MAAM,QAAQ,GAAiB,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;YACpE,MAAM,YAAY,GAAiB;gBACjC,IAAI,EAAE,UAAU;gBAChB,MAAM,EAAE;oBACN,IAAI,EAAE,QAAQ;oBACd,UAAU,EAAE;wBACV,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;wBAC1B,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;wBAC1B,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;wBAC1B,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;wBAC1B,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;qBAC3B;iBACF;aACF,CAAC;YAEF,MAAM,OAAO,GAAG,OAAO,CAAC,cAAc,CAAC,QAAQ,EAAE,IAAI,EAAE,YAAY,CAAC,CAAC;YAErE,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,WAAW,EAAE,CAAC;YAC7C,MAAM,CAAC,OAAO,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YACzD,MAAM,CAAC,OAAO,CAAC,cAAc,EAAE,UAAU,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACnE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;YACzD,MAAM,QAAQ,GAAiB,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;YACpE,MAAM,YAAY,GAAiB;gBACjC,IAAI,EAAE,QAAQ;gBACd,MAAM,EAAE;oBACN,IAAI,EAAE,QAAQ;oBACd,UAAU,EAAE,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE;iBACzC;aACF,CAAC;YAEF,MAAM,OAAO,GAAG,OAAO,CAAC,cAAc,CAAC,QAAQ,EAAE,IAAI,EAAE,YAAY,CAAC,CAAC;YAErE,mDAAmD;YACnD,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,aAAa,EAAE,CAAC;QACjD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;YACzD,MAAM,QAAQ,GAAiB,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;YAEpE,MAAM,OAAO,GAAG,OAAO,CAAC,cAAc,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC,CAAC;YAErF,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,aAAa,EAAE,CAAC;QACjD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gEAAgE,EAAE,GAAG,EAAE;YACxE,MAAM,QAAQ,GAAiB,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;YACpE,MAAM,YAAY,GAAiB;gBACjC,IAAI,EAAE,MAAM;gBACZ,MAAM,EAAE;oBACN,IAAI,EAAE,QAAQ;oBACd,UAAU,EAAE;wBACV,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;wBAC1B,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;wBAC1B,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;wBAC1B,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;wBAC1B,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;qBAC3B;iBACF;aACF,CAAC;YAEF,MAAM,OAAO,GAAG,OAAO,CAAC,cAAc,CAAC,QAAQ,EAAE,IAAI,EAAE,YAAY,CAAC,CAAC;YAErE,MAAM,CAAC,OAAO,CAAC,cAAc,EAAE,UAAU,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrF,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,4DAA4D,EAAE,GAAG,EAAE;YACpE,MAAM,QAAQ,GAAiB,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;YAEpE,MAAM,OAAO,GAAG,OAAO,CAAC,cAAc,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE;gBAC3D,WAAW,EAAE,GAAG;gBAChB,eAAe,EAAE,IAAI;gBACrB,IAAI,EAAE,GAAG;aACV,CAAC,CAAC;YAEH,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACtC,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC3C,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACjC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;YAC9D,MAAM,QAAQ,GAAiB;gBAC7B,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,qBAAqB,EAAE;gBAChD;oBACE,IAAI,EAAE,WAAW;oBACjB,OAAO,EAAE,EAAE;oBACX,UAAU,EAAE;wBACV;4BACE,EAAE,EAAE,UAAU;4BACd,IAAI,EAAE,UAAU;4BAChB,QAAQ,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,SAAS,EAAE,gBAAgB,EAAE;yBAC/D;qBACF;iBACF;aACF,CAAC;YAEF,MAAM,OAAO,GAAG,OAAO,CAAC,cAAc,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;YAE7D,MAAM,YAAY,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;YACzC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACvD,MAAM,OAAO,GAAG,YAAY,CAAC,OAAsG,CAAC;YACpI,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YAC1C,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAC/C,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YAChD,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QACpD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;YAC9D,MAAM,QAAQ,GAAiB;gBAC7B;oBACE,IAAI,EAAE,MAAM;oBACZ,OAAO,EAAE,aAAa;oBACtB,YAAY,EAAE,UAAU;oBACxB,IAAI,EAAE,aAAa;iBACN;aAChB,CAAC;YAEF,MAAM,OAAO,GAAG,OAAO,CAAC,cAAc,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;YAE7D,MAAM,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;YACpC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAClC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAClD,MAAM,OAAO,GAAG,OAAO,CAAC,OAA6H,CAAC;YACtJ,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YAC5C,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAC/C,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YAChD,oEAAoE;YACpE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAC5C,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QACtD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,wDAAwD,EAAE,GAAG,EAAE;YAChE,MAAM,QAAQ,GAAiB;gBAC7B;oBACE,IAAI,EAAE,WAAW;oBACjB,OAAO,EAAE,EAAE;oBACX,UAAU,EAAE;wBACV;4BACE,EAAE,EAAE,UAAU;4BACd,IAAI,EAAE,UAAU;4BAChB,QAAQ,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,eAAe,EAAE;yBAC5D;qBACF;iBACF;aACF,CAAC;YAEF,mBAAmB;YACnB,MAAM,OAAO,GAAG,OAAO,CAAC,cAAc,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;YAE7D,MAAM,YAAY,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;YACzC,MAAM,OAAO,GAAG,YAAY,CAAC,OAA+C,CAAC;YAC7E,6EAA6E;YAC7E,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACvC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;QAClC,EAAE,CAAC,yDAAyD,EAAE,GAAG,EAAE;YACjE,MAAM,UAAU,GAAG,8BAA8B,CAAC;YAClD,MAAM,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC,UAAU,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;YAElE,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAClC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;YAC3D,MAAM,UAAU,GAAG,8BAA8B,CAAC;YAClD,MAAM,KAAK,GAAiB;gBAC1B,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE;aACjD,CAAC;YAEF,MAAM,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC,UAAU,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;YAEnE,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,+BAA+B,CAAC,CAAC;YAC1D,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,8BAA8B,CAAC,CAAC;YACzD,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,4BAA4B,CAAC,CAAC;QACzD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;YACnD,MAAM,UAAU,GAAG,8BAA8B,CAAC;YAClD,MAAM,aAAa,GAAiB;gBAClC,IAAI,EAAE,eAAe;gBACrB,MAAM,EAAE;oBACN,IAAI,EAAE,QAAQ;oBACd,UAAU,EAAE;wBACV,CAAC,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;wBACrB,CAAC,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;wBACrB,CAAC,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;wBACrB,CAAC,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;wBACrB,CAAC,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;qBACtB;iBACF;aACF,CAAC;YAEF,MAAM,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC,UAAU,EAAE,IAAI,EAAE,aAAa,CAAC,CAAC;YAE3E,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,sBAAsB,CAAC,CAAC;YACjD,yEAAyE;YACzE,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC;QACnD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;YACtD,MAAM,UAAU,GAAG,8BAA8B,CAAC;YAClD,MAAM,YAAY,GAAiB;gBACjC,IAAI,EAAE,cAAc;gBACpB,MAAM,EAAE;oBACN,IAAI,EAAE,QAAQ;oBACd,UAAU,EAAE;wBACV,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,UAAU,EAAE;wBACjD,GAAG,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;qBACxB;oBACD,QAAQ,EAAE,CAAC,MAAM,CAAC;iBACnB;aACF,CAAC;YAEF,MAAM,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC,UAAU,EAAE,IAAI,EAAE,YAAY,CAAC,CAAC;YAE1E,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC;YAC7C,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,yBAAyB,CAAC,CAAC;YACpD,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,wBAAwB,CAAC,CAAC;YACnD,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,8BAA8B,CAAC,CAAC;QAC3D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;YACvD,MAAM,UAAU,GAAG,8BAA8B,CAAC;YAElD,MAAM,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC,UAAU,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;YAE1E,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAChC,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QACvC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,sCAAsC,EAAE,GAAG,EAAE;QACpD,EAAE,CAAC,yDAAyD,EAAE,GAAG,EAAE;YACjE,MAAM,QAAQ,GAAiB,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;YACpE,MAAM,YAAY,GAAiB;gBACjC,IAAI,EAAE,QAAQ;gBACd,MAAM,EAAE;oBACN,IAAI,EAAE,QAAQ;oBACd,UAAU,EAAE;wBACV,IAAI,EAAE;4BACJ,IAAI,EAAE,QAAQ;4BACd,UAAU,EAAE;gCACV,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;6BACzB;yBACF;wBACD,CAAC,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;wBACrB,CAAC,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;wBACrB,CAAC,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;wBACrB,CAAC,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;qBACtB;iBACF;aACF,CAAC;YAEF,MAAM,OAAO,GAAG,OAAO,CAAC,cAAc,CAAC,QAAQ,EAAE,IAAI,EAAE,YAAY,CAAC,CAAC;YAErE,MAAM,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,UAAU,CAAC,MAAiC,CAAC;YACpF,MAAM,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAEhD,MAAM,UAAU,GAAG,MAAM,CAAC,UAAqD,CAAC;YAChF,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC3D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;YACxD,MAAM,QAAQ,GAAiB,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;YACpE,MAAM,cAAc,GAAiB;gBACnC,IAAI,EAAE,UAAU;gBAChB,MAAM,EAAE;oBACN,IAAI,EAAE,QAAQ;oBACd,UAAU,EAAE;wBACV,CAAC,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;wBACrB,CAAC,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;wBACrB,CAAC,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;wBACrB,CAAC,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;wBACrB,CAAC,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;qBACtB;oBACD,KAAK,EAAE;wBACL,OAAO,EAAE;4BACP,IAAI,EAAE,QAAQ;4BACd,UAAU,EAAE,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE;yBACzC;qBACF;iBACF;aACF,CAAC;YAEF,MAAM,OAAO,GAAG,OAAO,CAAC,cAAc,CAAC,QAAQ,EAAE,IAAI,EAAE,cAAc,CAAC,CAAC;YAEvE,MAAM,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,UAAU,CAAC,MAAiC,CAAC;YACpF,MAAM,IAAI,GAAG,MAAM,CAAC,KAAgD,CAAC;YACrE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACxD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;YAC9D,MAAM,QAAQ,GAAiB,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;YACpE,MAAM,WAAW,GAAiB;gBAChC,IAAI,EAAE,aAAa;gBACnB,MAAM,EAAE;oBACN,IAAI,EAAE,QAAQ;oBACd,UAAU,EAAE;wBACV,KAAK,EAAE;4BACL,IAAI,EAAE,OAAO;4BACb,KAAK,EAAE;gCACL,IAAI,EAAE,QAAQ;gCACd,UAAU,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE;6BACvC;yBACF;wBACD,CAAC,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;wBACrB,CAAC,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;wBACrB,CAAC,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;wBACrB,CAAC,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;qBACtB;iBACF;aACF,CAAC;YAEF,MAAM,OAAO,GAAG,OAAO,CAAC,cAAc,CAAC,QAAQ,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC;YAEpE,MAAM,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,UAAU,CAAC,MAAiC,CAAC;YACpF,MAAM,UAAU,GAAG,MAAM,CAAC,UAAqD,CAAC;YAChF,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,KAAgC,CAAC;YAChE,MAAM,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACjD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Unit tests for config.ts
3
+ *
4
+ * Tests configuration resolution utilities for MCP Mesh TypeScript SDK.
5
+ */
6
+ export {};
7
+ //# sourceMappingURL=config.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/config.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
@@ -0,0 +1,156 @@
1
+ /**
2
+ * Unit tests for config.ts
3
+ *
4
+ * Tests configuration resolution utilities for MCP Mesh TypeScript SDK.
5
+ */
6
+ import { describe, it, expect, vi, beforeEach } from "vitest";
7
+ import { generateAgentIdSuffix, resolveConfig } from "../config.js";
8
+ // Mock the @mcpmesh/core module
9
+ vi.mock("@mcpmesh/core", () => ({
10
+ resolveConfig: vi.fn((key, value) => {
11
+ // Simulate Rust core behavior: return value if provided, else default
12
+ if (key === "agent_name")
13
+ return value ?? "default-agent";
14
+ if (key === "http_host")
15
+ return value ?? "10.0.0.1";
16
+ if (key === "namespace")
17
+ return value ?? "default";
18
+ if (key === "registry_url")
19
+ return value ?? "http://localhost:8000";
20
+ return value ?? "";
21
+ }),
22
+ resolveConfigInt: vi.fn((key, value) => {
23
+ if (key === "http_port")
24
+ return value;
25
+ if (key === "health_interval")
26
+ return value ?? 5;
27
+ return value;
28
+ }),
29
+ getDefault: vi.fn((key) => {
30
+ // Simulate Rust core defaults
31
+ if (key === "registry_url")
32
+ return "http://localhost:8000";
33
+ if (key === "namespace")
34
+ return "default";
35
+ if (key === "health_interval")
36
+ return "5";
37
+ if (key === "distributed_tracing_enabled")
38
+ return "false";
39
+ if (key === "redis_url")
40
+ return "redis://localhost:6379";
41
+ return null;
42
+ }),
43
+ }));
44
+ describe("generateAgentIdSuffix", () => {
45
+ it("should generate an 8-character hex string", () => {
46
+ const suffix = generateAgentIdSuffix();
47
+ expect(suffix).toHaveLength(8);
48
+ expect(suffix).toMatch(/^[0-9a-f]{8}$/);
49
+ });
50
+ it("should generate unique suffixes on each call", () => {
51
+ const suffix1 = generateAgentIdSuffix();
52
+ const suffix2 = generateAgentIdSuffix();
53
+ const suffix3 = generateAgentIdSuffix();
54
+ expect(suffix1).not.toBe(suffix2);
55
+ expect(suffix2).not.toBe(suffix3);
56
+ expect(suffix1).not.toBe(suffix3);
57
+ });
58
+ it("should generate 1000 unique suffixes without collision", () => {
59
+ const suffixes = new Set();
60
+ for (let i = 0; i < 1000; i++) {
61
+ suffixes.add(generateAgentIdSuffix());
62
+ }
63
+ expect(suffixes.size).toBe(1000);
64
+ });
65
+ });
66
+ describe("resolveConfig", () => {
67
+ beforeEach(() => {
68
+ vi.clearAllMocks();
69
+ });
70
+ it("should resolve config with all values provided", () => {
71
+ const config = {
72
+ name: "test-agent",
73
+ version: "2.0.0",
74
+ description: "Test description",
75
+ port: 9000,
76
+ host: "192.168.1.100",
77
+ namespace: "production",
78
+ registryUrl: "http://registry.example.com:8000",
79
+ heartbeatInterval: 10,
80
+ };
81
+ const resolved = resolveConfig(config);
82
+ expect(resolved.name).toBe("test-agent");
83
+ expect(resolved.version).toBe("2.0.0");
84
+ expect(resolved.description).toBe("Test description");
85
+ expect(resolved.port).toBe(9000);
86
+ expect(resolved.host).toBe("192.168.1.100");
87
+ expect(resolved.namespace).toBe("production");
88
+ expect(resolved.registryUrl).toBe("http://registry.example.com:8000");
89
+ expect(resolved.heartbeatInterval).toBe(10);
90
+ });
91
+ it("should use defaults for optional values not provided", () => {
92
+ const config = {
93
+ name: "minimal-agent",
94
+ port: 8080,
95
+ };
96
+ const resolved = resolveConfig(config);
97
+ expect(resolved.name).toBe("minimal-agent");
98
+ expect(resolved.version).toBe("1.0.0");
99
+ expect(resolved.description).toBe("");
100
+ expect(resolved.port).toBe(8080);
101
+ expect(resolved.host).toBe("10.0.0.1"); // Auto-detected by Rust
102
+ expect(resolved.namespace).toBe("default");
103
+ expect(resolved.registryUrl).toBe("http://localhost:8000");
104
+ expect(resolved.heartbeatInterval).toBe(5);
105
+ });
106
+ it("should delegate to Rust core for config resolution", async () => {
107
+ const { resolveConfig: rustResolveConfig, resolveConfigInt } = await import("@mcpmesh/core");
108
+ const config = {
109
+ name: "rust-test",
110
+ port: 7777,
111
+ };
112
+ resolveConfig(config);
113
+ // Verify Rust core functions were called
114
+ expect(rustResolveConfig).toHaveBeenCalledWith("agent_name", "rust-test");
115
+ expect(rustResolveConfig).toHaveBeenCalledWith("http_host", null);
116
+ expect(rustResolveConfig).toHaveBeenCalledWith("namespace", null);
117
+ expect(rustResolveConfig).toHaveBeenCalledWith("registry_url", null);
118
+ expect(resolveConfigInt).toHaveBeenCalledWith("http_port", 7777);
119
+ expect(resolveConfigInt).toHaveBeenCalledWith("health_interval", null);
120
+ });
121
+ it("should handle null/undefined optional values", () => {
122
+ const config = {
123
+ name: "null-test",
124
+ port: 5000,
125
+ host: undefined,
126
+ namespace: undefined,
127
+ registryUrl: undefined,
128
+ heartbeatInterval: undefined,
129
+ };
130
+ const resolved = resolveConfig(config);
131
+ // Should use Rust core defaults
132
+ expect(resolved.host).toBe("10.0.0.1");
133
+ expect(resolved.namespace).toBe("default");
134
+ expect(resolved.registryUrl).toBe("http://localhost:8000");
135
+ expect(resolved.heartbeatInterval).toBe(5);
136
+ });
137
+ });
138
+ describe("ResolvedAgentConfig", () => {
139
+ it("should have all required fields after resolution", () => {
140
+ const config = {
141
+ name: "complete-test",
142
+ port: 3000,
143
+ };
144
+ const resolved = resolveConfig(config);
145
+ // All fields should be defined (Required<AgentConfig>)
146
+ expect(resolved.name).toBeDefined();
147
+ expect(resolved.version).toBeDefined();
148
+ expect(resolved.description).toBeDefined();
149
+ expect(resolved.port).toBeDefined();
150
+ expect(resolved.host).toBeDefined();
151
+ expect(resolved.namespace).toBeDefined();
152
+ expect(resolved.registryUrl).toBeDefined();
153
+ expect(resolved.heartbeatInterval).toBeDefined();
154
+ });
155
+ });
156
+ //# sourceMappingURL=config.test.js.map