@tambo-ai/react 0.59.0 → 0.60.0

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 (83) hide show
  1. package/dist/hooks/react-query-hooks.d.ts +14 -1
  2. package/dist/hooks/react-query-hooks.d.ts.map +1 -1
  3. package/dist/hooks/react-query-hooks.js +13 -0
  4. package/dist/hooks/react-query-hooks.js.map +1 -1
  5. package/dist/index.js +2 -0
  6. package/dist/index.js.map +1 -1
  7. package/dist/mcp/__tests__/elicitation.test.d.ts +2 -0
  8. package/dist/mcp/__tests__/elicitation.test.d.ts.map +1 -0
  9. package/dist/mcp/__tests__/elicitation.test.js +261 -0
  10. package/dist/mcp/__tests__/elicitation.test.js.map +1 -0
  11. package/dist/mcp/__tests__/mcp-hooks.test.d.ts +2 -0
  12. package/dist/mcp/__tests__/mcp-hooks.test.d.ts.map +1 -0
  13. package/dist/mcp/__tests__/mcp-hooks.test.js +504 -0
  14. package/dist/mcp/__tests__/mcp-hooks.test.js.map +1 -0
  15. package/dist/mcp/__tests__/tambo-mcp-provider.test.js +151 -12
  16. package/dist/mcp/__tests__/tambo-mcp-provider.test.js.map +1 -1
  17. package/dist/mcp/elicitation.d.ts +80 -0
  18. package/dist/mcp/elicitation.d.ts.map +1 -0
  19. package/dist/mcp/elicitation.js +55 -0
  20. package/dist/mcp/elicitation.js.map +1 -0
  21. package/dist/mcp/index.d.ts +3 -2
  22. package/dist/mcp/index.d.ts.map +1 -1
  23. package/dist/mcp/index.js +2 -1
  24. package/dist/mcp/index.js.map +1 -1
  25. package/dist/mcp/mcp-client.d.ts +41 -9
  26. package/dist/mcp/mcp-client.d.ts.map +1 -1
  27. package/dist/mcp/mcp-client.js.map +1 -1
  28. package/dist/mcp/mcp-hooks.d.ts +20 -6
  29. package/dist/mcp/mcp-hooks.d.ts.map +1 -1
  30. package/dist/mcp/mcp-hooks.js +71 -24
  31. package/dist/mcp/mcp-hooks.js.map +1 -1
  32. package/dist/mcp/tambo-mcp-provider.d.ts +60 -6
  33. package/dist/mcp/tambo-mcp-provider.d.ts.map +1 -1
  34. package/dist/mcp/tambo-mcp-provider.js +231 -172
  35. package/dist/mcp/tambo-mcp-provider.js.map +1 -1
  36. package/dist/providers/tambo-interactable-provider.d.ts.map +1 -1
  37. package/dist/providers/tambo-interactable-provider.js +11 -4
  38. package/dist/providers/tambo-interactable-provider.js.map +1 -1
  39. package/dist/providers/tambo-provider.d.ts.map +1 -1
  40. package/dist/providers/tambo-provider.js +0 -4
  41. package/dist/providers/tambo-provider.js.map +1 -1
  42. package/esm/hooks/react-query-hooks.d.ts +14 -1
  43. package/esm/hooks/react-query-hooks.d.ts.map +1 -1
  44. package/esm/hooks/react-query-hooks.js +13 -1
  45. package/esm/hooks/react-query-hooks.js.map +1 -1
  46. package/esm/index.js +2 -0
  47. package/esm/index.js.map +1 -1
  48. package/esm/mcp/__tests__/elicitation.test.d.ts +2 -0
  49. package/esm/mcp/__tests__/elicitation.test.d.ts.map +1 -0
  50. package/esm/mcp/__tests__/elicitation.test.js +259 -0
  51. package/esm/mcp/__tests__/elicitation.test.js.map +1 -0
  52. package/esm/mcp/__tests__/mcp-hooks.test.d.ts +2 -0
  53. package/esm/mcp/__tests__/mcp-hooks.test.d.ts.map +1 -0
  54. package/esm/mcp/__tests__/mcp-hooks.test.js +469 -0
  55. package/esm/mcp/__tests__/mcp-hooks.test.js.map +1 -0
  56. package/esm/mcp/__tests__/tambo-mcp-provider.test.js +151 -12
  57. package/esm/mcp/__tests__/tambo-mcp-provider.test.js.map +1 -1
  58. package/esm/mcp/elicitation.d.ts +80 -0
  59. package/esm/mcp/elicitation.d.ts.map +1 -0
  60. package/esm/mcp/elicitation.js +52 -0
  61. package/esm/mcp/elicitation.js.map +1 -0
  62. package/esm/mcp/index.d.ts +3 -2
  63. package/esm/mcp/index.d.ts.map +1 -1
  64. package/esm/mcp/index.js +1 -1
  65. package/esm/mcp/index.js.map +1 -1
  66. package/esm/mcp/mcp-client.d.ts +41 -9
  67. package/esm/mcp/mcp-client.d.ts.map +1 -1
  68. package/esm/mcp/mcp-client.js.map +1 -1
  69. package/esm/mcp/mcp-hooks.d.ts +20 -6
  70. package/esm/mcp/mcp-hooks.d.ts.map +1 -1
  71. package/esm/mcp/mcp-hooks.js +73 -26
  72. package/esm/mcp/mcp-hooks.js.map +1 -1
  73. package/esm/mcp/tambo-mcp-provider.d.ts +60 -6
  74. package/esm/mcp/tambo-mcp-provider.d.ts.map +1 -1
  75. package/esm/mcp/tambo-mcp-provider.js +231 -173
  76. package/esm/mcp/tambo-mcp-provider.js.map +1 -1
  77. package/esm/providers/tambo-interactable-provider.d.ts.map +1 -1
  78. package/esm/providers/tambo-interactable-provider.js +11 -4
  79. package/esm/providers/tambo-interactable-provider.js.map +1 -1
  80. package/esm/providers/tambo-provider.d.ts.map +1 -1
  81. package/esm/providers/tambo-provider.js +0 -4
  82. package/esm/providers/tambo-provider.js.map +1 -1
  83. package/package.json +8 -8
@@ -40,6 +40,15 @@ const tambo_mcp_token_provider_1 = require("../../providers/tambo-mcp-token-prov
40
40
  const tambo_registry_provider_1 = require("../../providers/tambo-registry-provider");
41
41
  const mcp_client_1 = require("../mcp-client");
42
42
  const tambo_mcp_provider_1 = require("../tambo-mcp-provider");
43
+ // Helper to create mock RequestHandlerExtra for testing
44
+ function createMockExtra() {
45
+ return {
46
+ signal: new AbortController().signal,
47
+ requestId: "test-request-id",
48
+ sendNotification: (async () => { }),
49
+ sendRequest: (async () => ({ _meta: {} })),
50
+ };
51
+ }
43
52
  // Mock the MCP client to avoid ES module issues
44
53
  jest.mock("../mcp-client", () => ({
45
54
  MCPClient: jest.fn(),
@@ -165,10 +174,11 @@ describe("TamboMcpProvider server list changes", () => {
165
174
  tambo_client_provider_1.useTamboClient.mockReturnValue({
166
175
  baseURL: "https://api.tambo.co",
167
176
  });
168
- // Ensure MCPClient.create exists and returns a fake client with listTools
169
- mcp_client_1.MCPClient.create = jest
170
- .fn()
171
- .mockResolvedValue({ listTools: jest.fn().mockResolvedValue([]) });
177
+ // Ensure MCPClient.create exists and returns a fake client with listTools and close
178
+ mcp_client_1.MCPClient.create = jest.fn().mockResolvedValue({
179
+ listTools: jest.fn().mockResolvedValue([]),
180
+ close: jest.fn(),
181
+ });
172
182
  });
173
183
  const Capture = ({ onUpdate, }) => {
174
184
  const servers = (0, tambo_mcp_provider_1.useTamboMcpServers)();
@@ -242,6 +252,131 @@ describe("TamboMcpProvider server list changes", () => {
242
252
  expect(urls).toEqual(["https://a.example", "https://b.example"].sort());
243
253
  });
244
254
  });
255
+ it("reuses client when same server is passed with new array instance", async () => {
256
+ const createSpy = jest.fn().mockResolvedValue({
257
+ listTools: jest.fn().mockResolvedValue([]),
258
+ close: jest.fn(),
259
+ });
260
+ mcp_client_1.MCPClient.create = createSpy;
261
+ let latest = [];
262
+ const initial = [{ url: "https://a.example", transport: mcp_client_1.MCPTransport.SSE }];
263
+ const { rerender } = (0, react_1.render)(react_2.default.createElement(tambo_mcp_token_provider_1.TamboMcpTokenProvider, null,
264
+ react_2.default.createElement(tambo_mcp_provider_1.TamboMcpProvider, { mcpServers: initial },
265
+ react_2.default.createElement(Capture, { onUpdate: (s) => (latest = s) }))));
266
+ await (0, react_1.waitFor)(() => {
267
+ expect(latest.length).toBe(1);
268
+ });
269
+ // Verify client was created once
270
+ expect(createSpy).toHaveBeenCalledTimes(1);
271
+ const firstClient = latest[0].client;
272
+ // Pass a new array with same server
273
+ const same = [{ url: "https://a.example", transport: mcp_client_1.MCPTransport.SSE }];
274
+ rerender(react_2.default.createElement(tambo_mcp_token_provider_1.TamboMcpTokenProvider, null,
275
+ react_2.default.createElement(tambo_mcp_provider_1.TamboMcpProvider, { mcpServers: same },
276
+ react_2.default.createElement(Capture, { onUpdate: (s) => (latest = s) }))));
277
+ await (0, react_1.waitFor)(() => {
278
+ expect(latest.length).toBe(1);
279
+ });
280
+ // Client should NOT have been created again
281
+ expect(createSpy).toHaveBeenCalledTimes(1);
282
+ // Should be the exact same client instance
283
+ expect(latest[0].client).toBe(firstClient);
284
+ });
285
+ it("calls close() on removed server clients", async () => {
286
+ const closeSpy = jest.fn();
287
+ const createSpy = jest.fn().mockResolvedValue({
288
+ listTools: jest.fn().mockResolvedValue([]),
289
+ close: closeSpy,
290
+ });
291
+ mcp_client_1.MCPClient.create = createSpy;
292
+ let latest = [];
293
+ const { rerender } = (0, react_1.render)(react_2.default.createElement(tambo_mcp_token_provider_1.TamboMcpTokenProvider, null,
294
+ react_2.default.createElement(tambo_mcp_provider_1.TamboMcpProvider, { mcpServers: ["https://a.example", "https://b.example"] },
295
+ react_2.default.createElement(Capture, { onUpdate: (s) => (latest = s) }))));
296
+ await (0, react_1.waitFor)(() => {
297
+ expect(latest.length).toBe(2);
298
+ });
299
+ expect(closeSpy).not.toHaveBeenCalled();
300
+ // Remove one server
301
+ rerender(react_2.default.createElement(tambo_mcp_token_provider_1.TamboMcpTokenProvider, null,
302
+ react_2.default.createElement(tambo_mcp_provider_1.TamboMcpProvider, { mcpServers: ["https://a.example"] },
303
+ react_2.default.createElement(Capture, { onUpdate: (s) => (latest = s) }))));
304
+ await (0, react_1.waitFor)(() => {
305
+ expect(latest.length).toBe(1);
306
+ });
307
+ // close() should have been called once for the removed server
308
+ expect(closeSpy).toHaveBeenCalledTimes(1);
309
+ });
310
+ it("calls close() on all clients when provider unmounts", async () => {
311
+ const closeSpy = jest.fn();
312
+ const createSpy = jest.fn().mockResolvedValue({
313
+ listTools: jest.fn().mockResolvedValue([]),
314
+ close: closeSpy,
315
+ });
316
+ mcp_client_1.MCPClient.create = createSpy;
317
+ let latest = [];
318
+ const { unmount } = (0, react_1.render)(react_2.default.createElement(tambo_mcp_token_provider_1.TamboMcpTokenProvider, null,
319
+ react_2.default.createElement(tambo_mcp_provider_1.TamboMcpProvider, { mcpServers: ["https://a.example", "https://b.example"] },
320
+ react_2.default.createElement(Capture, { onUpdate: (s) => (latest = s) }))));
321
+ await (0, react_1.waitFor)(() => {
322
+ expect(latest.length).toBe(2);
323
+ });
324
+ expect(closeSpy).not.toHaveBeenCalled();
325
+ // Unmount the provider
326
+ unmount();
327
+ // close() should have been called for both clients
328
+ expect(closeSpy).toHaveBeenCalledTimes(2);
329
+ });
330
+ it("creates new client when customHeaders change", async () => {
331
+ const closeSpy = jest.fn();
332
+ let clientIdCounter = 0;
333
+ const createSpy = jest.fn().mockImplementation(async () => {
334
+ const id = ++clientIdCounter;
335
+ return {
336
+ id, // Add an ID so we can track which client is which
337
+ listTools: jest.fn().mockResolvedValue([]),
338
+ close: closeSpy,
339
+ };
340
+ });
341
+ mcp_client_1.MCPClient.create = createSpy;
342
+ let latest = [];
343
+ const { rerender } = (0, react_1.render)(react_2.default.createElement(tambo_mcp_token_provider_1.TamboMcpTokenProvider, null,
344
+ react_2.default.createElement(tambo_mcp_provider_1.TamboMcpProvider, { mcpServers: [
345
+ {
346
+ url: "https://a.example",
347
+ transport: mcp_client_1.MCPTransport.SSE,
348
+ customHeaders: { Authorization: "Bearer token1" },
349
+ },
350
+ ] },
351
+ react_2.default.createElement(Capture, { onUpdate: (s) => (latest = s) }))));
352
+ await (0, react_1.waitFor)(() => {
353
+ expect(latest.length).toBe(1);
354
+ expect(createSpy).toHaveBeenCalledTimes(1);
355
+ });
356
+ const firstClientId = latest[0].client?.id;
357
+ expect(firstClientId).toBe(1);
358
+ // Change the customHeaders
359
+ rerender(react_2.default.createElement(tambo_mcp_token_provider_1.TamboMcpTokenProvider, null,
360
+ react_2.default.createElement(tambo_mcp_provider_1.TamboMcpProvider, { mcpServers: [
361
+ {
362
+ url: "https://a.example",
363
+ transport: mcp_client_1.MCPTransport.SSE,
364
+ customHeaders: { Authorization: "Bearer token2" },
365
+ },
366
+ ] },
367
+ react_2.default.createElement(Capture, { onUpdate: (s) => (latest = s) }))));
368
+ // Wait for old client to be closed and new client to be created
369
+ await (0, react_1.waitFor)(() => {
370
+ expect(closeSpy).toHaveBeenCalledTimes(1);
371
+ expect(createSpy).toHaveBeenCalledTimes(2);
372
+ expect(latest.length).toBe(1);
373
+ const newClientId = latest[0].client?.id;
374
+ expect(newClientId).toBe(2); // Should be the new client
375
+ }, { timeout: 3000 });
376
+ });
377
+ // Note: Token changes for the internal Tambo server are covered by the
378
+ // "creates new client when customHeaders change" test above, since token
379
+ // changes result in different Authorization headers, which trigger client recreation.
245
380
  });
246
381
  describe("TamboMcpProvider handler support", () => {
247
382
  let mockClient;
@@ -260,6 +395,7 @@ describe("TamboMcpProvider handler support", () => {
260
395
  listTools: jest.fn().mockResolvedValue([]),
261
396
  updateElicitationHandler: jest.fn(),
262
397
  updateSamplingHandler: jest.fn(),
398
+ close: jest.fn(),
263
399
  };
264
400
  // Mock MCPClient.create to return our mock client
265
401
  createSpy = jest.fn().mockResolvedValue(mockClient);
@@ -298,8 +434,9 @@ describe("TamboMcpProvider handler support", () => {
298
434
  method: "sampling/createMessage",
299
435
  params: {},
300
436
  };
301
- await passedHandlers.elicitation(mockRequest);
302
- expect(mockElicitationHandler).toHaveBeenCalledWith(mockRequest, expect.objectContaining({
437
+ const mockExtra = createMockExtra();
438
+ await passedHandlers.elicitation(mockRequest, mockExtra);
439
+ expect(mockElicitationHandler).toHaveBeenCalledWith(mockRequest, mockExtra, expect.objectContaining({
303
440
  url: "https://test.example",
304
441
  transport: mcp_client_1.MCPTransport.SSE,
305
442
  }));
@@ -334,8 +471,9 @@ describe("TamboMcpProvider handler support", () => {
334
471
  modelPreferences: {},
335
472
  },
336
473
  };
337
- await passedHandlers.sampling(mockRequest);
338
- expect(mockSamplingHandler).toHaveBeenCalledWith(mockRequest, expect.objectContaining({
474
+ const mockExtra = createMockExtra();
475
+ await passedHandlers.sampling(mockRequest, mockExtra);
476
+ expect(mockSamplingHandler).toHaveBeenCalledWith(mockRequest, mockExtra, expect.objectContaining({
339
477
  url: "https://test.example",
340
478
  transport: mcp_client_1.MCPTransport.SSE,
341
479
  }));
@@ -394,16 +532,17 @@ describe("TamboMcpProvider handler support", () => {
394
532
  method: "sampling/createMessage",
395
533
  params: {},
396
534
  };
535
+ const mockExtra = createMockExtra();
397
536
  // Call handler for server A
398
- await serverAHandlers.elicitation(mockRequest);
399
- expect(mockElicitationHandler).toHaveBeenCalledWith(mockRequest, expect.objectContaining({
537
+ await serverAHandlers.elicitation(mockRequest, mockExtra);
538
+ expect(mockElicitationHandler).toHaveBeenCalledWith(mockRequest, mockExtra, expect.objectContaining({
400
539
  url: "https://server-a.example",
401
540
  name: "Server A",
402
541
  }));
403
542
  mockElicitationHandler.mockClear();
404
543
  // Call handler for server B
405
- await serverBHandlers.elicitation(mockRequest);
406
- expect(mockElicitationHandler).toHaveBeenCalledWith(mockRequest, expect.objectContaining({
544
+ await serverBHandlers.elicitation(mockRequest, mockExtra);
545
+ expect(mockElicitationHandler).toHaveBeenCalledWith(mockRequest, mockExtra, expect.objectContaining({
407
546
  url: "https://server-b.example",
408
547
  name: "Server B",
409
548
  }));
@@ -1 +1 @@
1
- {"version":3,"file":"tambo-mcp-provider.test.js","sourceRoot":"","sources":["../../../src/mcp/__tests__/tambo-mcp-provider.test.tsx"],"names":[],"mappings":"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","sourcesContent":["import { render, waitFor } from \"@testing-library/react\";\nimport React, { useEffect } from \"react\";\nimport { useTamboClient } from \"../../providers/tambo-client-provider\";\nimport { TamboMcpTokenProvider } from \"../../providers/tambo-mcp-token-provider\";\nimport { useTamboRegistry } from \"../../providers/tambo-registry-provider\";\nimport { MCPClient, MCPTransport } from \"../mcp-client\";\nimport {\n extractErrorMessage,\n TamboMcpProvider,\n useTamboMcpServers,\n type McpServer,\n type ProviderMCPHandlers,\n} from \"../tambo-mcp-provider\";\n\n// Mock the MCP client to avoid ES module issues\njest.mock(\"../mcp-client\", () => ({\n MCPClient: jest.fn(),\n MCPTransport: {\n SSE: \"sse\",\n HTTP: \"http\",\n },\n}));\n\n// Mock the registry provider to avoid dependency issues\njest.mock(\"../../providers/tambo-registry-provider\", () => ({\n useTamboRegistry: jest.fn(),\n}));\n\n// Mock the client provider to avoid dependency issues\njest.mock(\"../../providers/tambo-client-provider\", () => ({\n useTamboClient: jest.fn(),\n}));\n\ndescribe(\"extractErrorMessage\", () => {\n describe(\"Array content handling\", () => {\n it(\"should extract text from array content with multiple text items\", () => {\n const content = [\n { type: \"text\", text: \"Error:\" },\n { type: \"text\", text: \"Tool execution failed\" },\n { type: \"image\", url: \"http://example.com/error.png\" }, // Should be filtered out\n ];\n\n const result = extractErrorMessage(content);\n\n expect(result).toBe(\"Error: Tool execution failed\");\n });\n\n it(\"should extract text from array content with single text item\", () => {\n const content = [{ type: \"text\", text: \"Simple error message\" }];\n\n const result = extractErrorMessage(content);\n\n expect(result).toBe(\"Simple error message\");\n });\n\n it(\"should return fallback message for array content with no text items\", () => {\n const content = [\n { type: \"image\", url: \"http://example.com/error.png\" },\n { type: \"resource\", uri: \"file://error.log\" },\n ];\n\n const result = extractErrorMessage(content);\n\n expect(result).toBe(\"Error occurred but no details provided\");\n });\n\n it(\"should return fallback message for empty array content\", () => {\n const content: any[] = [];\n\n const result = extractErrorMessage(content);\n\n expect(result).toBe(\"Error occurred but no details provided\");\n });\n\n it(\"should handle array content with mixed types correctly\", () => {\n const content = [\n { type: \"resource\", uri: \"file://log.txt\" },\n { type: \"text\", text: \"First error\" },\n { type: \"image\", url: \"http://example.com/img.png\" },\n { type: \"text\", text: \"Second error\" },\n { type: \"unknown\", data: \"something\" },\n ];\n\n const result = extractErrorMessage(content);\n\n expect(result).toBe(\"First error Second error\");\n });\n\n it(\"should handle array content with malformed items\", () => {\n const content = [\n null,\n { type: \"text\", text: \"Valid error\" },\n { type: \"text\" }, // Missing text property\n { type: \"text\", text: null }, // Invalid text type\n { type: \"text\", text: \"Another valid error\" },\n ];\n\n const result = extractErrorMessage(content);\n\n expect(result).toBe(\"Valid error Another valid error\");\n });\n });\n\n describe(\"Non-array content handling\", () => {\n it(\"should return string content as-is\", () => {\n const content = \"Direct error message\";\n\n const result = extractErrorMessage(content);\n\n expect(result).toBe(\"Direct error message\");\n });\n\n it(\"should handle null content\", () => {\n const content = null;\n\n const result = extractErrorMessage(content);\n\n expect(result).toBe(\"Unknown error occurred\");\n });\n\n it(\"should handle undefined content\", () => {\n const content = undefined;\n\n const result = extractErrorMessage(content);\n\n expect(result).toBe(\"Unknown error occurred\");\n });\n\n it(\"should handle number content\", () => {\n const content = 42;\n\n const result = extractErrorMessage(content);\n\n expect(result).toBe(\"42\");\n });\n\n it(\"should handle boolean content\", () => {\n const content = false;\n\n const result = extractErrorMessage(content);\n\n expect(result).toBe(\"false\");\n });\n\n it(\"should handle object content\", () => {\n const content = { error: \"Something went wrong\" };\n\n const result = extractErrorMessage(content);\n\n expect(result).toBe('{\"error\":\"Something went wrong\"}');\n });\n\n it(\"should handle complex object content\", () => {\n const content = {\n error: \"Something went wrong\",\n code: 500,\n details: { message: \"Internal server error\" },\n };\n\n const result = extractErrorMessage(content);\n\n expect(result).toBe(\n '{\"error\":\"Something went wrong\",\"code\":500,\"details\":{\"message\":\"Internal server error\"}}',\n );\n });\n\n it(\"should handle empty object content\", () => {\n const content = {};\n\n const result = extractErrorMessage(content);\n\n expect(result).toBe(\"{}\");\n });\n });\n});\n\ndescribe(\"TamboMcpProvider server list changes\", () => {\n beforeEach(() => {\n // Mock registry so tool registration is a no-op\n (useTamboRegistry as unknown as jest.Mock).mockReturnValue({\n registerTool: jest.fn(),\n });\n\n // Mock client with baseURL\n (useTamboClient as unknown as jest.Mock).mockReturnValue({\n baseURL: \"https://api.tambo.co\",\n });\n\n // Ensure MCPClient.create exists and returns a fake client with listTools\n (MCPClient as unknown as any).create = jest\n .fn()\n .mockResolvedValue({ listTools: jest.fn().mockResolvedValue([]) });\n });\n\n const Capture: React.FC<{ onUpdate: (servers: McpServer[]) => void }> = ({\n onUpdate,\n }) => {\n const servers = useTamboMcpServers();\n useEffect(() => {\n onUpdate(servers);\n }, [servers, onUpdate]);\n return <div data-testid=\"urls\">{servers.map((s) => s.url).join(\",\")}</div>;\n };\n\n it(\"adds a new server when the list grows\", async () => {\n let latest: McpServer[] = [];\n const { rerender, getByTestId } = render(\n <TamboMcpTokenProvider>\n <TamboMcpProvider mcpServers={[\"https://a.example\"]}>\n <Capture onUpdate={(s) => (latest = s)} />\n </TamboMcpProvider>\n </TamboMcpTokenProvider>,\n );\n\n // Wait for initial connection\n await waitFor(() => {\n expect(latest.length).toBe(1);\n });\n\n // Add new server\n rerender(\n <TamboMcpTokenProvider>\n <TamboMcpProvider\n mcpServers={[\"https://a.example\", \"https://b.example\"]}\n >\n <Capture onUpdate={(s) => (latest = s)} />\n </TamboMcpProvider>\n </TamboMcpTokenProvider>,\n );\n\n await waitFor(() => {\n expect(latest.length).toBe(2);\n const urls = getByTestId(\"urls\").textContent || \"\";\n expect(urls).toContain(\"https://a.example\");\n expect(urls).toContain(\"https://b.example\");\n });\n });\n\n it(\"removes a server when the list shrinks\", async () => {\n let latest: McpServer[] = [];\n const { rerender, getByTestId } = render(\n <TamboMcpTokenProvider>\n <TamboMcpProvider\n mcpServers={[\"https://a.example\", \"https://b.example\"]}\n >\n <Capture onUpdate={(s) => (latest = s)} />\n </TamboMcpProvider>\n </TamboMcpTokenProvider>,\n );\n\n await waitFor(() => {\n expect(latest.length).toBe(2);\n });\n\n // Remove one server\n rerender(\n <TamboMcpTokenProvider>\n <TamboMcpProvider mcpServers={[\"https://a.example\"]}>\n <Capture onUpdate={(s) => (latest = s)} />\n </TamboMcpProvider>\n </TamboMcpTokenProvider>,\n );\n\n await waitFor(() => {\n expect(latest.length).toBe(1);\n const urls = getByTestId(\"urls\").textContent || \"\";\n expect(urls).toContain(\"https://a.example\");\n expect(urls).not.toContain(\"https://b.example\");\n });\n });\n\n it(\"does not duplicate when a new copy of the same list is passed\", async () => {\n let latest: McpServer[] = [];\n const initial = [\n { url: \"https://a.example\", transport: MCPTransport.SSE },\n { url: \"https://b.example\", transport: MCPTransport.SSE },\n ];\n\n const { rerender } = render(\n <TamboMcpTokenProvider>\n <TamboMcpProvider mcpServers={initial}>\n <Capture onUpdate={(s) => (latest = s)} />\n </TamboMcpProvider>\n </TamboMcpTokenProvider>,\n );\n\n await waitFor(() => {\n expect(latest.length).toBe(2);\n });\n\n // Pass a new array instance with the same logical servers\n const same = [\n { url: \"https://a.example\", transport: MCPTransport.SSE },\n { url: \"https://b.example\", transport: MCPTransport.SSE },\n ];\n rerender(\n <TamboMcpTokenProvider>\n <TamboMcpProvider mcpServers={same}>\n <Capture onUpdate={(s) => (latest = s)} />\n </TamboMcpProvider>\n </TamboMcpTokenProvider>,\n );\n\n await waitFor(() => {\n expect(latest.length).toBe(2);\n const urls = latest.map((s) => s.url).sort();\n expect(urls).toEqual([\"https://a.example\", \"https://b.example\"].sort());\n });\n });\n});\n\ndescribe(\"TamboMcpProvider handler support\", () => {\n let mockClient: any;\n let createSpy: jest.Mock;\n\n beforeEach(() => {\n // Mock registry so tool registration is a no-op\n (useTamboRegistry as unknown as jest.Mock).mockReturnValue({\n registerTool: jest.fn(),\n });\n\n // Mock client with baseURL\n (useTamboClient as unknown as jest.Mock).mockReturnValue({\n baseURL: \"https://api.tambo.co\",\n });\n\n // Create a mock client with update methods\n mockClient = {\n listTools: jest.fn().mockResolvedValue([]),\n updateElicitationHandler: jest.fn(),\n updateSamplingHandler: jest.fn(),\n };\n\n // Mock MCPClient.create to return our mock client\n createSpy = jest.fn().mockResolvedValue(mockClient);\n (MCPClient as unknown as any).create = createSpy;\n });\n\n const Capture: React.FC<{ onUpdate: (servers: McpServer[]) => void }> = ({\n onUpdate,\n }) => {\n const servers = useTamboMcpServers();\n useEffect(() => {\n onUpdate(servers);\n }, [servers, onUpdate]);\n return null;\n };\n\n it(\"should pass provider-level elicitation handler to MCPClient.create\", async () => {\n const mockElicitationHandler = jest.fn().mockResolvedValue({\n content: [{ type: \"text\", text: \"test\" }],\n });\n\n const handlers: ProviderMCPHandlers = {\n elicitation: mockElicitationHandler,\n };\n\n let latest: McpServer[] = [];\n render(\n <TamboMcpTokenProvider>\n <TamboMcpProvider\n mcpServers={[\"https://test.example\"]}\n handlers={handlers}\n >\n <Capture onUpdate={(s) => (latest = s)} />\n </TamboMcpProvider>\n </TamboMcpTokenProvider>,\n );\n\n await waitFor(() => {\n expect(latest.length).toBe(1);\n });\n\n // Verify MCPClient.create was called\n expect(createSpy).toHaveBeenCalledWith(\n \"https://test.example\",\n MCPTransport.SSE,\n undefined,\n undefined,\n undefined,\n expect.objectContaining({\n elicitation: expect.any(Function),\n }),\n );\n\n // Get the actual handler that was passed\n const passedHandlers = createSpy.mock.calls[0][5];\n expect(passedHandlers.elicitation).toBeDefined();\n\n // Call the wrapped handler and verify it receives serverInfo\n const mockRequest = {\n method: \"sampling/createMessage\" as const,\n params: {},\n };\n await passedHandlers.elicitation(mockRequest);\n\n expect(mockElicitationHandler).toHaveBeenCalledWith(\n mockRequest,\n expect.objectContaining({\n url: \"https://test.example\",\n transport: MCPTransport.SSE,\n }),\n );\n });\n\n it(\"should pass provider-level sampling handler to MCPClient.create\", async () => {\n const mockSamplingHandler = jest.fn().mockResolvedValue({\n model: \"test-model\",\n stopReason: \"endTurn\",\n role: \"assistant\",\n content: { type: \"text\", text: \"response\" },\n });\n\n const handlers: ProviderMCPHandlers = {\n sampling: mockSamplingHandler,\n };\n\n let latest: McpServer[] = [];\n render(\n <TamboMcpTokenProvider>\n <TamboMcpProvider\n mcpServers={[\"https://test.example\"]}\n handlers={handlers}\n >\n <Capture onUpdate={(s) => (latest = s)} />\n </TamboMcpProvider>\n </TamboMcpTokenProvider>,\n );\n\n await waitFor(() => {\n expect(latest.length).toBe(1);\n });\n\n // Verify MCPClient.create was called with sampling handler\n expect(createSpy).toHaveBeenCalledWith(\n \"https://test.example\",\n MCPTransport.SSE,\n undefined,\n undefined,\n undefined,\n expect.objectContaining({\n sampling: expect.any(Function),\n }),\n );\n\n // Get the actual handler and verify it receives serverInfo\n const passedHandlers = createSpy.mock.calls[0][5];\n const mockRequest = {\n method: \"sampling/createMessage\" as const,\n params: {\n messages: [],\n modelPreferences: {},\n },\n };\n await passedHandlers.sampling(mockRequest);\n\n expect(mockSamplingHandler).toHaveBeenCalledWith(\n mockRequest,\n expect.objectContaining({\n url: \"https://test.example\",\n transport: MCPTransport.SSE,\n }),\n );\n });\n\n it(\"should allow per-server handlers to override provider-level handlers\", async () => {\n const providerElicitationHandler = jest.fn().mockResolvedValue({\n content: [{ type: \"text\", text: \"provider\" }],\n });\n\n const serverElicitationHandler = jest.fn().mockResolvedValue({\n content: [{ type: \"text\", text: \"server\" }],\n });\n\n const handlers: ProviderMCPHandlers = {\n elicitation: providerElicitationHandler,\n };\n\n let latest: McpServer[] = [];\n render(\n <TamboMcpTokenProvider>\n <TamboMcpProvider\n mcpServers={[\n {\n url: \"https://test.example\",\n handlers: {\n elicitation: serverElicitationHandler,\n },\n },\n ]}\n handlers={handlers}\n >\n <Capture onUpdate={(s) => (latest = s)} />\n </TamboMcpProvider>\n </TamboMcpTokenProvider>,\n );\n\n await waitFor(() => {\n expect(latest.length).toBe(1);\n });\n\n // Verify the per-server handler was used, not the provider handler\n const passedHandlers = createSpy.mock.calls[0][5];\n expect(passedHandlers.elicitation).toBe(serverElicitationHandler);\n });\n\n it(\"should pass different serverInfo to handlers for different servers\", async () => {\n const mockElicitationHandler = jest.fn().mockResolvedValue({\n content: [{ type: \"text\", text: \"test\" }],\n });\n\n const handlers: ProviderMCPHandlers = {\n elicitation: mockElicitationHandler,\n };\n\n let latest: McpServer[] = [];\n render(\n <TamboMcpTokenProvider>\n <TamboMcpProvider\n mcpServers={[\n { url: \"https://server-a.example\", name: \"Server A\" },\n { url: \"https://server-b.example\", name: \"Server B\" },\n ]}\n handlers={handlers}\n >\n <Capture onUpdate={(s) => (latest = s)} />\n </TamboMcpProvider>\n </TamboMcpTokenProvider>,\n );\n\n await waitFor(() => {\n expect(latest.length).toBe(2);\n });\n\n // Verify both servers got handlers\n expect(createSpy).toHaveBeenCalledTimes(2);\n\n // Get handlers for both servers\n const serverAHandlers = createSpy.mock.calls[0][5];\n const serverBHandlers = createSpy.mock.calls[1][5];\n\n const mockRequest = {\n method: \"sampling/createMessage\" as const,\n params: {},\n };\n\n // Call handler for server A\n await serverAHandlers.elicitation(mockRequest);\n expect(mockElicitationHandler).toHaveBeenCalledWith(\n mockRequest,\n expect.objectContaining({\n url: \"https://server-a.example\",\n name: \"Server A\",\n }),\n );\n\n mockElicitationHandler.mockClear();\n\n // Call handler for server B\n await serverBHandlers.elicitation(mockRequest);\n expect(mockElicitationHandler).toHaveBeenCalledWith(\n mockRequest,\n expect.objectContaining({\n url: \"https://server-b.example\",\n name: \"Server B\",\n }),\n );\n });\n\n it(\"should update handlers when provider handlers change\", async () => {\n const initialHandler = jest.fn().mockResolvedValue({\n content: [{ type: \"text\", text: \"initial\" }],\n });\n\n const updatedHandler = jest.fn().mockResolvedValue({\n content: [{ type: \"text\", text: \"updated\" }],\n });\n\n let latest: McpServer[] = [];\n const { rerender } = render(\n <TamboMcpTokenProvider>\n <TamboMcpProvider\n mcpServers={[\"https://test.example\"]}\n handlers={{ elicitation: initialHandler }}\n >\n <Capture onUpdate={(s) => (latest = s)} />\n </TamboMcpProvider>\n </TamboMcpTokenProvider>,\n );\n\n await waitFor(() => {\n expect(latest.length).toBe(1);\n });\n\n // Update the handlers\n rerender(\n <TamboMcpTokenProvider>\n <TamboMcpProvider\n mcpServers={[\"https://test.example\"]}\n handlers={{ elicitation: updatedHandler }}\n >\n <Capture onUpdate={(s) => (latest = s)} />\n </TamboMcpProvider>\n </TamboMcpTokenProvider>,\n );\n\n await waitFor(() => {\n expect(mockClient.updateElicitationHandler).toHaveBeenCalled();\n });\n\n // Verify the handler was updated\n expect(mockClient.updateElicitationHandler).toHaveBeenCalledWith(\n expect.any(Function),\n );\n });\n});\n"]}
1
+ {"version":3,"file":"tambo-mcp-provider.test.js","sourceRoot":"","sources":["../../../src/mcp/__tests__/tambo-mcp-provider.test.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,kDAAyD;AACzD,+CAAyC;AAMzC,iFAAuE;AACvE,uFAAiF;AACjF,qFAA2E;AAC3E,8CAAwD;AACxD,8DAM+B;AAE/B,wDAAwD;AACxD,SAAS,eAAe;IAItB,OAAO;QACL,MAAM,EAAE,IAAI,eAAe,EAAE,CAAC,MAAM;QACpC,SAAS,EAAE,iBAAiB;QAC5B,gBAAgB,EAAE,CAAC,KAAK,IAAI,EAAE,GAAE,CAAC,CAAQ;QACzC,WAAW,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAQ;KAClD,CAAC;AACJ,CAAC;AAED,gDAAgD;AAChD,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,GAAG,EAAE,CAAC,CAAC;IAChC,SAAS,EAAE,IAAI,CAAC,EAAE,EAAE;IACpB,YAAY,EAAE;QACZ,GAAG,EAAE,KAAK;QACV,IAAI,EAAE,MAAM;KACb;CACF,CAAC,CAAC,CAAC;AAEJ,wDAAwD;AACxD,IAAI,CAAC,IAAI,CAAC,yCAAyC,EAAE,GAAG,EAAE,CAAC,CAAC;IAC1D,gBAAgB,EAAE,IAAI,CAAC,EAAE,EAAE;CAC5B,CAAC,CAAC,CAAC;AAEJ,sDAAsD;AACtD,IAAI,CAAC,IAAI,CAAC,uCAAuC,EAAE,GAAG,EAAE,CAAC,CAAC;IACxD,cAAc,EAAE,IAAI,CAAC,EAAE,EAAE;CAC1B,CAAC,CAAC,CAAC;AAEJ,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;IACnC,QAAQ,CAAC,wBAAwB,EAAE,GAAG,EAAE;QACtC,EAAE,CAAC,iEAAiE,EAAE,GAAG,EAAE;YACzE,MAAM,OAAO,GAAG;gBACd,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE;gBAChC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,uBAAuB,EAAE;gBAC/C,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,8BAA8B,EAAE,EAAE,yBAAyB;aAClF,CAAC;YAEF,MAAM,MAAM,GAAG,IAAA,wCAAmB,EAAC,OAAO,CAAC,CAAC;YAE5C,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;QACtD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,8DAA8D,EAAE,GAAG,EAAE;YACtE,MAAM,OAAO,GAAG,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,sBAAsB,EAAE,CAAC,CAAC;YAEjE,MAAM,MAAM,GAAG,IAAA,wCAAmB,EAAC,OAAO,CAAC,CAAC;YAE5C,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;QAC9C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,qEAAqE,EAAE,GAAG,EAAE;YAC7E,MAAM,OAAO,GAAG;gBACd,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,8BAA8B,EAAE;gBACtD,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,kBAAkB,EAAE;aAC9C,CAAC;YAEF,MAAM,MAAM,GAAG,IAAA,wCAAmB,EAAC,OAAO,CAAC,CAAC;YAE5C,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAC;QAChE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,wDAAwD,EAAE,GAAG,EAAE;YAChE,MAAM,OAAO,GAAU,EAAE,CAAC;YAE1B,MAAM,MAAM,GAAG,IAAA,wCAAmB,EAAC,OAAO,CAAC,CAAC;YAE5C,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAC;QAChE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,wDAAwD,EAAE,GAAG,EAAE;YAChE,MAAM,OAAO,GAAG;gBACd,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,gBAAgB,EAAE;gBAC3C,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,EAAE;gBACrC,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,4BAA4B,EAAE;gBACpD,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,EAAE;gBACtC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,WAAW,EAAE;aACvC,CAAC;YAEF,MAAM,MAAM,GAAG,IAAA,wCAAmB,EAAC,OAAO,CAAC,CAAC;YAE5C,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;QAClD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE;YAC1D,MAAM,OAAO,GAAG;gBACd,IAAI;gBACJ,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,EAAE;gBACrC,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,wBAAwB;gBAC1C,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,oBAAoB;gBAClD,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,qBAAqB,EAAE;aAC9C,CAAC;YAEF,MAAM,MAAM,GAAG,IAAA,wCAAmB,EAAC,OAAO,CAAC,CAAC;YAE5C,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;QACzD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,4BAA4B,EAAE,GAAG,EAAE;QAC1C,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;YAC5C,MAAM,OAAO,GAAG,sBAAsB,CAAC;YAEvC,MAAM,MAAM,GAAG,IAAA,wCAAmB,EAAC,OAAO,CAAC,CAAC;YAE5C,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;QAC9C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;YACpC,MAAM,OAAO,GAAG,IAAI,CAAC;YAErB,MAAM,MAAM,GAAG,IAAA,wCAAmB,EAAC,OAAO,CAAC,CAAC;YAE5C,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;QAChD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;YACzC,MAAM,OAAO,GAAG,SAAS,CAAC;YAE1B,MAAM,MAAM,GAAG,IAAA,wCAAmB,EAAC,OAAO,CAAC,CAAC;YAE5C,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;QAChD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;YACtC,MAAM,OAAO,GAAG,EAAE,CAAC;YAEnB,MAAM,MAAM,GAAG,IAAA,wCAAmB,EAAC,OAAO,CAAC,CAAC;YAE5C,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC5B,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;YACvC,MAAM,OAAO,GAAG,KAAK,CAAC;YAEtB,MAAM,MAAM,GAAG,IAAA,wCAAmB,EAAC,OAAO,CAAC,CAAC;YAE5C,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC/B,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;YACtC,MAAM,OAAO,GAAG,EAAE,KAAK,EAAE,sBAAsB,EAAE,CAAC;YAElD,MAAM,MAAM,GAAG,IAAA,wCAAmB,EAAC,OAAO,CAAC,CAAC;YAE5C,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC;QAC1D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;YAC9C,MAAM,OAAO,GAAG;gBACd,KAAK,EAAE,sBAAsB;gBAC7B,IAAI,EAAE,GAAG;gBACT,OAAO,EAAE,EAAE,OAAO,EAAE,uBAAuB,EAAE;aAC9C,CAAC;YAEF,MAAM,MAAM,GAAG,IAAA,wCAAmB,EAAC,OAAO,CAAC,CAAC;YAE5C,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CACjB,2FAA2F,CAC5F,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;YAC5C,MAAM,OAAO,GAAG,EAAE,CAAC;YAEnB,MAAM,MAAM,GAAG,IAAA,wCAAmB,EAAC,OAAO,CAAC,CAAC;YAE5C,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC5B,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,sCAAsC,EAAE,GAAG,EAAE;IACpD,UAAU,CAAC,GAAG,EAAE;QACd,gDAAgD;QAC/C,0CAAyC,CAAC,eAAe,CAAC;YACzD,YAAY,EAAE,IAAI,CAAC,EAAE,EAAE;SACxB,CAAC,CAAC;QAEH,2BAA2B;QAC1B,sCAAuC,CAAC,eAAe,CAAC;YACvD,OAAO,EAAE,sBAAsB;SAChC,CAAC,CAAC;QAEH,oFAAoF;QACnF,sBAA4B,CAAC,MAAM,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC;YACjE,SAAS,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,EAAE,CAAC;YAC1C,KAAK,EAAE,IAAI,CAAC,EAAE,EAAE;SACjB,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,MAAM,OAAO,GAA2D,CAAC,EACvE,QAAQ,GACT,EAAE,EAAE;QACH,MAAM,OAAO,GAAG,IAAA,uCAAkB,GAAE,CAAC;QACrC,IAAA,iBAAS,EAAC,GAAG,EAAE;YACb,QAAQ,CAAC,OAAO,CAAC,CAAC;QACpB,CAAC,EAAE,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC;QACxB,OAAO,sDAAiB,MAAM,IAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAO,CAAC;IAC7E,CAAC,CAAC;IAEF,EAAE,CAAC,uCAAuC,EAAE,KAAK,IAAI,EAAE;QACrD,IAAI,MAAM,GAAgB,EAAE,CAAC;QAC7B,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,GAAG,IAAA,cAAM,EACtC,8BAAC,gDAAqB;YACpB,8BAAC,qCAAgB,IAAC,UAAU,EAAE,CAAC,mBAAmB,CAAC;gBACjD,8BAAC,OAAO,IAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,GAAI,CACzB,CACG,CACzB,CAAC;QAEF,8BAA8B;QAC9B,MAAM,IAAA,eAAO,EAAC,GAAG,EAAE;YACjB,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAChC,CAAC,CAAC,CAAC;QAEH,iBAAiB;QACjB,QAAQ,CACN,8BAAC,gDAAqB;YACpB,8BAAC,qCAAgB,IACf,UAAU,EAAE,CAAC,mBAAmB,EAAE,mBAAmB,CAAC;gBAEtD,8BAAC,OAAO,IAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,GAAI,CACzB,CACG,CACzB,CAAC;QAEF,MAAM,IAAA,eAAO,EAAC,GAAG,EAAE;YACjB,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAC9B,MAAM,IAAI,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,WAAW,IAAI,EAAE,CAAC;YACnD,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC;YAC5C,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC;QAC9C,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wCAAwC,EAAE,KAAK,IAAI,EAAE;QACtD,IAAI,MAAM,GAAgB,EAAE,CAAC;QAC7B,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,GAAG,IAAA,cAAM,EACtC,8BAAC,gDAAqB;YACpB,8BAAC,qCAAgB,IACf,UAAU,EAAE,CAAC,mBAAmB,EAAE,mBAAmB,CAAC;gBAEtD,8BAAC,OAAO,IAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,GAAI,CACzB,CACG,CACzB,CAAC;QAEF,MAAM,IAAA,eAAO,EAAC,GAAG,EAAE;YACjB,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAChC,CAAC,CAAC,CAAC;QAEH,oBAAoB;QACpB,QAAQ,CACN,8BAAC,gDAAqB;YACpB,8BAAC,qCAAgB,IAAC,UAAU,EAAE,CAAC,mBAAmB,CAAC;gBACjD,8BAAC,OAAO,IAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,GAAI,CACzB,CACG,CACzB,CAAC;QAEF,MAAM,IAAA,eAAO,EAAC,GAAG,EAAE;YACjB,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAC9B,MAAM,IAAI,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,WAAW,IAAI,EAAE,CAAC;YACnD,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC;YAC5C,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC;QAClD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+DAA+D,EAAE,KAAK,IAAI,EAAE;QAC7E,IAAI,MAAM,GAAgB,EAAE,CAAC;QAC7B,MAAM,OAAO,GAAG;YACd,EAAE,GAAG,EAAE,mBAAmB,EAAE,SAAS,EAAE,yBAAY,CAAC,GAAG,EAAE;YACzD,EAAE,GAAG,EAAE,mBAAmB,EAAE,SAAS,EAAE,yBAAY,CAAC,GAAG,EAAE;SAC1D,CAAC;QAEF,MAAM,EAAE,QAAQ,EAAE,GAAG,IAAA,cAAM,EACzB,8BAAC,gDAAqB;YACpB,8BAAC,qCAAgB,IAAC,UAAU,EAAE,OAAO;gBACnC,8BAAC,OAAO,IAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,GAAI,CACzB,CACG,CACzB,CAAC;QAEF,MAAM,IAAA,eAAO,EAAC,GAAG,EAAE;YACjB,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAChC,CAAC,CAAC,CAAC;QAEH,0DAA0D;QAC1D,MAAM,IAAI,GAAG;YACX,EAAE,GAAG,EAAE,mBAAmB,EAAE,SAAS,EAAE,yBAAY,CAAC,GAAG,EAAE;YACzD,EAAE,GAAG,EAAE,mBAAmB,EAAE,SAAS,EAAE,yBAAY,CAAC,GAAG,EAAE;SAC1D,CAAC;QACF,QAAQ,CACN,8BAAC,gDAAqB;YACpB,8BAAC,qCAAgB,IAAC,UAAU,EAAE,IAAI;gBAChC,8BAAC,OAAO,IAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,GAAI,CACzB,CACG,CACzB,CAAC;QAEF,MAAM,IAAA,eAAO,EAAC,GAAG,EAAE;YACjB,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAC9B,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;YAC7C,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,mBAAmB,EAAE,mBAAmB,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QAC1E,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kEAAkE,EAAE,KAAK,IAAI,EAAE;QAChF,MAAM,SAAS,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC;YAC5C,SAAS,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,EAAE,CAAC;YAC1C,KAAK,EAAE,IAAI,CAAC,EAAE,EAAE;SACjB,CAAC,CAAC;QACF,sBAA4B,CAAC,MAAM,GAAG,SAAS,CAAC;QAEjD,IAAI,MAAM,GAAgB,EAAE,CAAC;QAC7B,MAAM,OAAO,GAAG,CAAC,EAAE,GAAG,EAAE,mBAAmB,EAAE,SAAS,EAAE,yBAAY,CAAC,GAAG,EAAE,CAAC,CAAC;QAE5E,MAAM,EAAE,QAAQ,EAAE,GAAG,IAAA,cAAM,EACzB,8BAAC,gDAAqB;YACpB,8BAAC,qCAAgB,IAAC,UAAU,EAAE,OAAO;gBACnC,8BAAC,OAAO,IAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,GAAI,CACzB,CACG,CACzB,CAAC;QAEF,MAAM,IAAA,eAAO,EAAC,GAAG,EAAE;YACjB,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAChC,CAAC,CAAC,CAAC;QAEH,iCAAiC;QACjC,MAAM,CAAC,SAAS,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QAC3C,MAAM,WAAW,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;QAErC,oCAAoC;QACpC,MAAM,IAAI,GAAG,CAAC,EAAE,GAAG,EAAE,mBAAmB,EAAE,SAAS,EAAE,yBAAY,CAAC,GAAG,EAAE,CAAC,CAAC;QACzE,QAAQ,CACN,8BAAC,gDAAqB;YACpB,8BAAC,qCAAgB,IAAC,UAAU,EAAE,IAAI;gBAChC,8BAAC,OAAO,IAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,GAAI,CACzB,CACG,CACzB,CAAC;QAEF,MAAM,IAAA,eAAO,EAAC,GAAG,EAAE;YACjB,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAChC,CAAC,CAAC,CAAC;QAEH,4CAA4C;QAC5C,MAAM,CAAC,SAAS,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QAC3C,2CAA2C;QAC3C,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yCAAyC,EAAE,KAAK,IAAI,EAAE;QACvD,MAAM,QAAQ,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;QAC3B,MAAM,SAAS,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC;YAC5C,SAAS,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,EAAE,CAAC;YAC1C,KAAK,EAAE,QAAQ;SAChB,CAAC,CAAC;QACF,sBAA4B,CAAC,MAAM,GAAG,SAAS,CAAC;QAEjD,IAAI,MAAM,GAAgB,EAAE,CAAC;QAC7B,MAAM,EAAE,QAAQ,EAAE,GAAG,IAAA,cAAM,EACzB,8BAAC,gDAAqB;YACpB,8BAAC,qCAAgB,IACf,UAAU,EAAE,CAAC,mBAAmB,EAAE,mBAAmB,CAAC;gBAEtD,8BAAC,OAAO,IAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,GAAI,CACzB,CACG,CACzB,CAAC;QAEF,MAAM,IAAA,eAAO,EAAC,GAAG,EAAE;YACjB,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAChC,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QAExC,oBAAoB;QACpB,QAAQ,CACN,8BAAC,gDAAqB;YACpB,8BAAC,qCAAgB,IAAC,UAAU,EAAE,CAAC,mBAAmB,CAAC;gBACjD,8BAAC,OAAO,IAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,GAAI,CACzB,CACG,CACzB,CAAC;QAEF,MAAM,IAAA,eAAO,EAAC,GAAG,EAAE;YACjB,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAChC,CAAC,CAAC,CAAC;QAEH,8DAA8D;QAC9D,MAAM,CAAC,QAAQ,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qDAAqD,EAAE,KAAK,IAAI,EAAE;QACnE,MAAM,QAAQ,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;QAC3B,MAAM,SAAS,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC;YAC5C,SAAS,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,EAAE,CAAC;YAC1C,KAAK,EAAE,QAAQ;SAChB,CAAC,CAAC;QACF,sBAA4B,CAAC,MAAM,GAAG,SAAS,CAAC;QAEjD,IAAI,MAAM,GAAgB,EAAE,CAAC;QAC7B,MAAM,EAAE,OAAO,EAAE,GAAG,IAAA,cAAM,EACxB,8BAAC,gDAAqB;YACpB,8BAAC,qCAAgB,IACf,UAAU,EAAE,CAAC,mBAAmB,EAAE,mBAAmB,CAAC;gBAEtD,8BAAC,OAAO,IAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,GAAI,CACzB,CACG,CACzB,CAAC;QAEF,MAAM,IAAA,eAAO,EAAC,GAAG,EAAE;YACjB,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAChC,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QAExC,uBAAuB;QACvB,OAAO,EAAE,CAAC;QAEV,mDAAmD;QACnD,MAAM,CAAC,QAAQ,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8CAA8C,EAAE,KAAK,IAAI,EAAE;QAC5D,MAAM,QAAQ,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;QAC3B,IAAI,eAAe,GAAG,CAAC,CAAC;QACxB,MAAM,SAAS,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC,kBAAkB,CAAC,KAAK,IAAI,EAAE;YACxD,MAAM,EAAE,GAAG,EAAE,eAAe,CAAC;YAC7B,OAAO;gBACL,EAAE,EAAE,kDAAkD;gBACtD,SAAS,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,EAAE,CAAC;gBAC1C,KAAK,EAAE,QAAQ;aAChB,CAAC;QACJ,CAAC,CAAC,CAAC;QACF,sBAA4B,CAAC,MAAM,GAAG,SAAS,CAAC;QAEjD,IAAI,MAAM,GAAgB,EAAE,CAAC;QAC7B,MAAM,EAAE,QAAQ,EAAE,GAAG,IAAA,cAAM,EACzB,8BAAC,gDAAqB;YACpB,8BAAC,qCAAgB,IACf,UAAU,EAAE;oBACV;wBACE,GAAG,EAAE,mBAAmB;wBACxB,SAAS,EAAE,yBAAY,CAAC,GAAG;wBAC3B,aAAa,EAAE,EAAE,aAAa,EAAE,eAAe,EAAE;qBAClD;iBACF;gBAED,8BAAC,OAAO,IAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,GAAI,CACzB,CACG,CACzB,CAAC;QAEF,MAAM,IAAA,eAAO,EAAC,GAAG,EAAE;YACjB,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAC9B,MAAM,CAAC,SAAS,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QAC7C,CAAC,CAAC,CAAC;QAEH,MAAM,aAAa,GAAI,MAAM,CAAC,CAAC,CAAC,CAAC,MAAc,EAAE,EAAE,CAAC;QACpD,MAAM,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAE9B,2BAA2B;QAC3B,QAAQ,CACN,8BAAC,gDAAqB;YACpB,8BAAC,qCAAgB,IACf,UAAU,EAAE;oBACV;wBACE,GAAG,EAAE,mBAAmB;wBACxB,SAAS,EAAE,yBAAY,CAAC,GAAG;wBAC3B,aAAa,EAAE,EAAE,aAAa,EAAE,eAAe,EAAE;qBAClD;iBACF;gBAED,8BAAC,OAAO,IAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,GAAI,CACzB,CACG,CACzB,CAAC;QAEF,gEAAgE;QAChE,MAAM,IAAA,eAAO,EACX,GAAG,EAAE;YACH,MAAM,CAAC,QAAQ,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;YAC1C,MAAM,CAAC,SAAS,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;YAC3C,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAC9B,MAAM,WAAW,GAAI,MAAM,CAAC,CAAC,CAAC,CAAC,MAAc,EAAE,EAAE,CAAC;YAClD,MAAM,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,2BAA2B;QAC1D,CAAC,EACD,EAAE,OAAO,EAAE,IAAI,EAAE,CAClB,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,uEAAuE;IACvE,yEAAyE;IACzE,sFAAsF;AACxF,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,kCAAkC,EAAE,GAAG,EAAE;IAChD,IAAI,UAAe,CAAC;IACpB,IAAI,SAAoB,CAAC;IAEzB,UAAU,CAAC,GAAG,EAAE;QACd,gDAAgD;QAC/C,0CAAyC,CAAC,eAAe,CAAC;YACzD,YAAY,EAAE,IAAI,CAAC,EAAE,EAAE;SACxB,CAAC,CAAC;QAEH,2BAA2B;QAC1B,sCAAuC,CAAC,eAAe,CAAC;YACvD,OAAO,EAAE,sBAAsB;SAChC,CAAC,CAAC;QAEH,2CAA2C;QAC3C,UAAU,GAAG;YACX,SAAS,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,EAAE,CAAC;YAC1C,wBAAwB,EAAE,IAAI,CAAC,EAAE,EAAE;YACnC,qBAAqB,EAAE,IAAI,CAAC,EAAE,EAAE;YAChC,KAAK,EAAE,IAAI,CAAC,EAAE,EAAE;SACjB,CAAC;QAEF,kDAAkD;QAClD,SAAS,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC;QACnD,sBAA4B,CAAC,MAAM,GAAG,SAAS,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,MAAM,OAAO,GAA2D,CAAC,EACvE,QAAQ,GACT,EAAE,EAAE;QACH,MAAM,OAAO,GAAG,IAAA,uCAAkB,GAAE,CAAC;QACrC,IAAA,iBAAS,EAAC,GAAG,EAAE;YACb,QAAQ,CAAC,OAAO,CAAC,CAAC;QACpB,CAAC,EAAE,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC;QACxB,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;IAEF,EAAE,CAAC,oEAAoE,EAAE,KAAK,IAAI,EAAE;QAClF,MAAM,sBAAsB,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC;YACzD,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;SAC1C,CAAC,CAAC;QAEH,MAAM,QAAQ,GAAwB;YACpC,WAAW,EAAE,sBAAsB;SACpC,CAAC;QAEF,IAAI,MAAM,GAAgB,EAAE,CAAC;QAC7B,IAAA,cAAM,EACJ,8BAAC,gDAAqB;YACpB,8BAAC,qCAAgB,IACf,UAAU,EAAE,CAAC,sBAAsB,CAAC,EACpC,QAAQ,EAAE,QAAQ;gBAElB,8BAAC,OAAO,IAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,GAAI,CACzB,CACG,CACzB,CAAC;QAEF,MAAM,IAAA,eAAO,EAAC,GAAG,EAAE;YACjB,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAChC,CAAC,CAAC,CAAC;QAEH,qCAAqC;QACrC,MAAM,CAAC,SAAS,CAAC,CAAC,oBAAoB,CACpC,sBAAsB,EACtB,yBAAY,CAAC,GAAG,EAChB,SAAS,EACT,SAAS,EACT,SAAS,EACT,MAAM,CAAC,gBAAgB,CAAC;YACtB,WAAW,EAAE,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;SAClC,CAAC,CACH,CAAC;QAEF,yCAAyC;QACzC,MAAM,cAAc,GAAG,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAClD,MAAM,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC,WAAW,EAAE,CAAC;QAEjD,6DAA6D;QAC7D,MAAM,WAAW,GAAG;YAClB,MAAM,EAAE,wBAAiC;YACzC,MAAM,EAAE,EAAE;SACX,CAAC;QACF,MAAM,SAAS,GAAG,eAAe,EAAE,CAAC;QACpC,MAAM,cAAc,CAAC,WAAW,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;QAEzD,MAAM,CAAC,sBAAsB,CAAC,CAAC,oBAAoB,CACjD,WAAW,EACX,SAAS,EACT,MAAM,CAAC,gBAAgB,CAAC;YACtB,GAAG,EAAE,sBAAsB;YAC3B,SAAS,EAAE,yBAAY,CAAC,GAAG;SAC5B,CAAC,CACH,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iEAAiE,EAAE,KAAK,IAAI,EAAE;QAC/E,MAAM,mBAAmB,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC;YACtD,KAAK,EAAE,YAAY;YACnB,UAAU,EAAE,SAAS;YACrB,IAAI,EAAE,WAAW;YACjB,OAAO,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE;SAC5C,CAAC,CAAC;QAEH,MAAM,QAAQ,GAAwB;YACpC,QAAQ,EAAE,mBAAmB;SAC9B,CAAC;QAEF,IAAI,MAAM,GAAgB,EAAE,CAAC;QAC7B,IAAA,cAAM,EACJ,8BAAC,gDAAqB;YACpB,8BAAC,qCAAgB,IACf,UAAU,EAAE,CAAC,sBAAsB,CAAC,EACpC,QAAQ,EAAE,QAAQ;gBAElB,8BAAC,OAAO,IAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,GAAI,CACzB,CACG,CACzB,CAAC;QAEF,MAAM,IAAA,eAAO,EAAC,GAAG,EAAE;YACjB,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAChC,CAAC,CAAC,CAAC;QAEH,2DAA2D;QAC3D,MAAM,CAAC,SAAS,CAAC,CAAC,oBAAoB,CACpC,sBAAsB,EACtB,yBAAY,CAAC,GAAG,EAChB,SAAS,EACT,SAAS,EACT,SAAS,EACT,MAAM,CAAC,gBAAgB,CAAC;YACtB,QAAQ,EAAE,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;SAC/B,CAAC,CACH,CAAC;QAEF,2DAA2D;QAC3D,MAAM,cAAc,GAAG,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAClD,MAAM,WAAW,GAAG;YAClB,MAAM,EAAE,wBAAiC;YACzC,MAAM,EAAE;gBACN,QAAQ,EAAE,EAAE;gBACZ,gBAAgB,EAAE,EAAE;aACrB;SACF,CAAC;QACF,MAAM,SAAS,GAAG,eAAe,EAAE,CAAC;QACpC,MAAM,cAAc,CAAC,QAAQ,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;QAEtD,MAAM,CAAC,mBAAmB,CAAC,CAAC,oBAAoB,CAC9C,WAAW,EACX,SAAS,EACT,MAAM,CAAC,gBAAgB,CAAC;YACtB,GAAG,EAAE,sBAAsB;YAC3B,SAAS,EAAE,yBAAY,CAAC,GAAG;SAC5B,CAAC,CACH,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sEAAsE,EAAE,KAAK,IAAI,EAAE;QACpF,MAAM,0BAA0B,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC;YAC7D,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;SAC9C,CAAC,CAAC;QAEH,MAAM,wBAAwB,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC;YAC3D,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;SAC5C,CAAC,CAAC;QAEH,MAAM,QAAQ,GAAwB;YACpC,WAAW,EAAE,0BAA0B;SACxC,CAAC;QAEF,IAAI,MAAM,GAAgB,EAAE,CAAC;QAC7B,IAAA,cAAM,EACJ,8BAAC,gDAAqB;YACpB,8BAAC,qCAAgB,IACf,UAAU,EAAE;oBACV;wBACE,GAAG,EAAE,sBAAsB;wBAC3B,QAAQ,EAAE;4BACR,WAAW,EAAE,wBAAwB;yBACtC;qBACF;iBACF,EACD,QAAQ,EAAE,QAAQ;gBAElB,8BAAC,OAAO,IAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,GAAI,CACzB,CACG,CACzB,CAAC;QAEF,MAAM,IAAA,eAAO,EAAC,GAAG,EAAE;YACjB,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAChC,CAAC,CAAC,CAAC;QAEH,mEAAmE;QACnE,MAAM,cAAc,GAAG,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAClD,MAAM,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;IACpE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oEAAoE,EAAE,KAAK,IAAI,EAAE;QAClF,MAAM,sBAAsB,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC;YACzD,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;SAC1C,CAAC,CAAC;QAEH,MAAM,QAAQ,GAAwB;YACpC,WAAW,EAAE,sBAAsB;SACpC,CAAC;QAEF,IAAI,MAAM,GAAgB,EAAE,CAAC;QAC7B,IAAA,cAAM,EACJ,8BAAC,gDAAqB;YACpB,8BAAC,qCAAgB,IACf,UAAU,EAAE;oBACV,EAAE,GAAG,EAAE,0BAA0B,EAAE,IAAI,EAAE,UAAU,EAAE;oBACrD,EAAE,GAAG,EAAE,0BAA0B,EAAE,IAAI,EAAE,UAAU,EAAE;iBACtD,EACD,QAAQ,EAAE,QAAQ;gBAElB,8BAAC,OAAO,IAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,GAAI,CACzB,CACG,CACzB,CAAC;QAEF,MAAM,IAAA,eAAO,EAAC,GAAG,EAAE;YACjB,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAChC,CAAC,CAAC,CAAC;QAEH,mCAAmC;QACnC,MAAM,CAAC,SAAS,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QAE3C,gCAAgC;QAChC,MAAM,eAAe,GAAG,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACnD,MAAM,eAAe,GAAG,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAEnD,MAAM,WAAW,GAAG;YAClB,MAAM,EAAE,wBAAiC;YACzC,MAAM,EAAE,EAAE;SACX,CAAC;QACF,MAAM,SAAS,GAAG,eAAe,EAAE,CAAC;QAEpC,4BAA4B;QAC5B,MAAM,eAAe,CAAC,WAAW,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;QAC1D,MAAM,CAAC,sBAAsB,CAAC,CAAC,oBAAoB,CACjD,WAAW,EACX,SAAS,EACT,MAAM,CAAC,gBAAgB,CAAC;YACtB,GAAG,EAAE,0BAA0B;YAC/B,IAAI,EAAE,UAAU;SACjB,CAAC,CACH,CAAC;QAEF,sBAAsB,CAAC,SAAS,EAAE,CAAC;QAEnC,4BAA4B;QAC5B,MAAM,eAAe,CAAC,WAAW,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;QAC1D,MAAM,CAAC,sBAAsB,CAAC,CAAC,oBAAoB,CACjD,WAAW,EACX,SAAS,EACT,MAAM,CAAC,gBAAgB,CAAC;YACtB,GAAG,EAAE,0BAA0B;YAC/B,IAAI,EAAE,UAAU;SACjB,CAAC,CACH,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sDAAsD,EAAE,KAAK,IAAI,EAAE;QACpE,MAAM,cAAc,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC;YACjD,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;SAC7C,CAAC,CAAC;QAEH,MAAM,cAAc,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC;YACjD,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;SAC7C,CAAC,CAAC;QAEH,IAAI,MAAM,GAAgB,EAAE,CAAC;QAC7B,MAAM,EAAE,QAAQ,EAAE,GAAG,IAAA,cAAM,EACzB,8BAAC,gDAAqB;YACpB,8BAAC,qCAAgB,IACf,UAAU,EAAE,CAAC,sBAAsB,CAAC,EACpC,QAAQ,EAAE,EAAE,WAAW,EAAE,cAAc,EAAE;gBAEzC,8BAAC,OAAO,IAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,GAAI,CACzB,CACG,CACzB,CAAC;QAEF,MAAM,IAAA,eAAO,EAAC,GAAG,EAAE;YACjB,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAChC,CAAC,CAAC,CAAC;QAEH,sBAAsB;QACtB,QAAQ,CACN,8BAAC,gDAAqB;YACpB,8BAAC,qCAAgB,IACf,UAAU,EAAE,CAAC,sBAAsB,CAAC,EACpC,QAAQ,EAAE,EAAE,WAAW,EAAE,cAAc,EAAE;gBAEzC,8BAAC,OAAO,IAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,GAAI,CACzB,CACG,CACzB,CAAC;QAEF,MAAM,IAAA,eAAO,EAAC,GAAG,EAAE;YACjB,MAAM,CAAC,UAAU,CAAC,wBAAwB,CAAC,CAAC,gBAAgB,EAAE,CAAC;QACjE,CAAC,CAAC,CAAC;QAEH,iCAAiC;QACjC,MAAM,CAAC,UAAU,CAAC,wBAAwB,CAAC,CAAC,oBAAoB,CAC9D,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CACrB,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["import { render, waitFor } from \"@testing-library/react\";\nimport React, { useEffect } from \"react\";\nimport type { RequestHandlerExtra } from \"@modelcontextprotocol/sdk/shared/protocol.js\";\nimport type {\n ClientNotification,\n ClientRequest,\n} from \"@modelcontextprotocol/sdk/types.js\";\nimport { useTamboClient } from \"../../providers/tambo-client-provider\";\nimport { TamboMcpTokenProvider } from \"../../providers/tambo-mcp-token-provider\";\nimport { useTamboRegistry } from \"../../providers/tambo-registry-provider\";\nimport { MCPClient, MCPTransport } from \"../mcp-client\";\nimport {\n extractErrorMessage,\n TamboMcpProvider,\n useTamboMcpServers,\n type McpServer,\n type ProviderMCPHandlers,\n} from \"../tambo-mcp-provider\";\n\n// Helper to create mock RequestHandlerExtra for testing\nfunction createMockExtra(): RequestHandlerExtra<\n ClientRequest,\n ClientNotification\n> {\n return {\n signal: new AbortController().signal,\n requestId: \"test-request-id\",\n sendNotification: (async () => {}) as any,\n sendRequest: (async () => ({ _meta: {} })) as any,\n };\n}\n\n// Mock the MCP client to avoid ES module issues\njest.mock(\"../mcp-client\", () => ({\n MCPClient: jest.fn(),\n MCPTransport: {\n SSE: \"sse\",\n HTTP: \"http\",\n },\n}));\n\n// Mock the registry provider to avoid dependency issues\njest.mock(\"../../providers/tambo-registry-provider\", () => ({\n useTamboRegistry: jest.fn(),\n}));\n\n// Mock the client provider to avoid dependency issues\njest.mock(\"../../providers/tambo-client-provider\", () => ({\n useTamboClient: jest.fn(),\n}));\n\ndescribe(\"extractErrorMessage\", () => {\n describe(\"Array content handling\", () => {\n it(\"should extract text from array content with multiple text items\", () => {\n const content = [\n { type: \"text\", text: \"Error:\" },\n { type: \"text\", text: \"Tool execution failed\" },\n { type: \"image\", url: \"http://example.com/error.png\" }, // Should be filtered out\n ];\n\n const result = extractErrorMessage(content);\n\n expect(result).toBe(\"Error: Tool execution failed\");\n });\n\n it(\"should extract text from array content with single text item\", () => {\n const content = [{ type: \"text\", text: \"Simple error message\" }];\n\n const result = extractErrorMessage(content);\n\n expect(result).toBe(\"Simple error message\");\n });\n\n it(\"should return fallback message for array content with no text items\", () => {\n const content = [\n { type: \"image\", url: \"http://example.com/error.png\" },\n { type: \"resource\", uri: \"file://error.log\" },\n ];\n\n const result = extractErrorMessage(content);\n\n expect(result).toBe(\"Error occurred but no details provided\");\n });\n\n it(\"should return fallback message for empty array content\", () => {\n const content: any[] = [];\n\n const result = extractErrorMessage(content);\n\n expect(result).toBe(\"Error occurred but no details provided\");\n });\n\n it(\"should handle array content with mixed types correctly\", () => {\n const content = [\n { type: \"resource\", uri: \"file://log.txt\" },\n { type: \"text\", text: \"First error\" },\n { type: \"image\", url: \"http://example.com/img.png\" },\n { type: \"text\", text: \"Second error\" },\n { type: \"unknown\", data: \"something\" },\n ];\n\n const result = extractErrorMessage(content);\n\n expect(result).toBe(\"First error Second error\");\n });\n\n it(\"should handle array content with malformed items\", () => {\n const content = [\n null,\n { type: \"text\", text: \"Valid error\" },\n { type: \"text\" }, // Missing text property\n { type: \"text\", text: null }, // Invalid text type\n { type: \"text\", text: \"Another valid error\" },\n ];\n\n const result = extractErrorMessage(content);\n\n expect(result).toBe(\"Valid error Another valid error\");\n });\n });\n\n describe(\"Non-array content handling\", () => {\n it(\"should return string content as-is\", () => {\n const content = \"Direct error message\";\n\n const result = extractErrorMessage(content);\n\n expect(result).toBe(\"Direct error message\");\n });\n\n it(\"should handle null content\", () => {\n const content = null;\n\n const result = extractErrorMessage(content);\n\n expect(result).toBe(\"Unknown error occurred\");\n });\n\n it(\"should handle undefined content\", () => {\n const content = undefined;\n\n const result = extractErrorMessage(content);\n\n expect(result).toBe(\"Unknown error occurred\");\n });\n\n it(\"should handle number content\", () => {\n const content = 42;\n\n const result = extractErrorMessage(content);\n\n expect(result).toBe(\"42\");\n });\n\n it(\"should handle boolean content\", () => {\n const content = false;\n\n const result = extractErrorMessage(content);\n\n expect(result).toBe(\"false\");\n });\n\n it(\"should handle object content\", () => {\n const content = { error: \"Something went wrong\" };\n\n const result = extractErrorMessage(content);\n\n expect(result).toBe('{\"error\":\"Something went wrong\"}');\n });\n\n it(\"should handle complex object content\", () => {\n const content = {\n error: \"Something went wrong\",\n code: 500,\n details: { message: \"Internal server error\" },\n };\n\n const result = extractErrorMessage(content);\n\n expect(result).toBe(\n '{\"error\":\"Something went wrong\",\"code\":500,\"details\":{\"message\":\"Internal server error\"}}',\n );\n });\n\n it(\"should handle empty object content\", () => {\n const content = {};\n\n const result = extractErrorMessage(content);\n\n expect(result).toBe(\"{}\");\n });\n });\n});\n\ndescribe(\"TamboMcpProvider server list changes\", () => {\n beforeEach(() => {\n // Mock registry so tool registration is a no-op\n (useTamboRegistry as unknown as jest.Mock).mockReturnValue({\n registerTool: jest.fn(),\n });\n\n // Mock client with baseURL\n (useTamboClient as unknown as jest.Mock).mockReturnValue({\n baseURL: \"https://api.tambo.co\",\n });\n\n // Ensure MCPClient.create exists and returns a fake client with listTools and close\n (MCPClient as unknown as any).create = jest.fn().mockResolvedValue({\n listTools: jest.fn().mockResolvedValue([]),\n close: jest.fn(),\n });\n });\n\n const Capture: React.FC<{ onUpdate: (servers: McpServer[]) => void }> = ({\n onUpdate,\n }) => {\n const servers = useTamboMcpServers();\n useEffect(() => {\n onUpdate(servers);\n }, [servers, onUpdate]);\n return <div data-testid=\"urls\">{servers.map((s) => s.url).join(\",\")}</div>;\n };\n\n it(\"adds a new server when the list grows\", async () => {\n let latest: McpServer[] = [];\n const { rerender, getByTestId } = render(\n <TamboMcpTokenProvider>\n <TamboMcpProvider mcpServers={[\"https://a.example\"]}>\n <Capture onUpdate={(s) => (latest = s)} />\n </TamboMcpProvider>\n </TamboMcpTokenProvider>,\n );\n\n // Wait for initial connection\n await waitFor(() => {\n expect(latest.length).toBe(1);\n });\n\n // Add new server\n rerender(\n <TamboMcpTokenProvider>\n <TamboMcpProvider\n mcpServers={[\"https://a.example\", \"https://b.example\"]}\n >\n <Capture onUpdate={(s) => (latest = s)} />\n </TamboMcpProvider>\n </TamboMcpTokenProvider>,\n );\n\n await waitFor(() => {\n expect(latest.length).toBe(2);\n const urls = getByTestId(\"urls\").textContent || \"\";\n expect(urls).toContain(\"https://a.example\");\n expect(urls).toContain(\"https://b.example\");\n });\n });\n\n it(\"removes a server when the list shrinks\", async () => {\n let latest: McpServer[] = [];\n const { rerender, getByTestId } = render(\n <TamboMcpTokenProvider>\n <TamboMcpProvider\n mcpServers={[\"https://a.example\", \"https://b.example\"]}\n >\n <Capture onUpdate={(s) => (latest = s)} />\n </TamboMcpProvider>\n </TamboMcpTokenProvider>,\n );\n\n await waitFor(() => {\n expect(latest.length).toBe(2);\n });\n\n // Remove one server\n rerender(\n <TamboMcpTokenProvider>\n <TamboMcpProvider mcpServers={[\"https://a.example\"]}>\n <Capture onUpdate={(s) => (latest = s)} />\n </TamboMcpProvider>\n </TamboMcpTokenProvider>,\n );\n\n await waitFor(() => {\n expect(latest.length).toBe(1);\n const urls = getByTestId(\"urls\").textContent || \"\";\n expect(urls).toContain(\"https://a.example\");\n expect(urls).not.toContain(\"https://b.example\");\n });\n });\n\n it(\"does not duplicate when a new copy of the same list is passed\", async () => {\n let latest: McpServer[] = [];\n const initial = [\n { url: \"https://a.example\", transport: MCPTransport.SSE },\n { url: \"https://b.example\", transport: MCPTransport.SSE },\n ];\n\n const { rerender } = render(\n <TamboMcpTokenProvider>\n <TamboMcpProvider mcpServers={initial}>\n <Capture onUpdate={(s) => (latest = s)} />\n </TamboMcpProvider>\n </TamboMcpTokenProvider>,\n );\n\n await waitFor(() => {\n expect(latest.length).toBe(2);\n });\n\n // Pass a new array instance with the same logical servers\n const same = [\n { url: \"https://a.example\", transport: MCPTransport.SSE },\n { url: \"https://b.example\", transport: MCPTransport.SSE },\n ];\n rerender(\n <TamboMcpTokenProvider>\n <TamboMcpProvider mcpServers={same}>\n <Capture onUpdate={(s) => (latest = s)} />\n </TamboMcpProvider>\n </TamboMcpTokenProvider>,\n );\n\n await waitFor(() => {\n expect(latest.length).toBe(2);\n const urls = latest.map((s) => s.url).sort();\n expect(urls).toEqual([\"https://a.example\", \"https://b.example\"].sort());\n });\n });\n\n it(\"reuses client when same server is passed with new array instance\", async () => {\n const createSpy = jest.fn().mockResolvedValue({\n listTools: jest.fn().mockResolvedValue([]),\n close: jest.fn(),\n });\n (MCPClient as unknown as any).create = createSpy;\n\n let latest: McpServer[] = [];\n const initial = [{ url: \"https://a.example\", transport: MCPTransport.SSE }];\n\n const { rerender } = render(\n <TamboMcpTokenProvider>\n <TamboMcpProvider mcpServers={initial}>\n <Capture onUpdate={(s) => (latest = s)} />\n </TamboMcpProvider>\n </TamboMcpTokenProvider>,\n );\n\n await waitFor(() => {\n expect(latest.length).toBe(1);\n });\n\n // Verify client was created once\n expect(createSpy).toHaveBeenCalledTimes(1);\n const firstClient = latest[0].client;\n\n // Pass a new array with same server\n const same = [{ url: \"https://a.example\", transport: MCPTransport.SSE }];\n rerender(\n <TamboMcpTokenProvider>\n <TamboMcpProvider mcpServers={same}>\n <Capture onUpdate={(s) => (latest = s)} />\n </TamboMcpProvider>\n </TamboMcpTokenProvider>,\n );\n\n await waitFor(() => {\n expect(latest.length).toBe(1);\n });\n\n // Client should NOT have been created again\n expect(createSpy).toHaveBeenCalledTimes(1);\n // Should be the exact same client instance\n expect(latest[0].client).toBe(firstClient);\n });\n\n it(\"calls close() on removed server clients\", async () => {\n const closeSpy = jest.fn();\n const createSpy = jest.fn().mockResolvedValue({\n listTools: jest.fn().mockResolvedValue([]),\n close: closeSpy,\n });\n (MCPClient as unknown as any).create = createSpy;\n\n let latest: McpServer[] = [];\n const { rerender } = render(\n <TamboMcpTokenProvider>\n <TamboMcpProvider\n mcpServers={[\"https://a.example\", \"https://b.example\"]}\n >\n <Capture onUpdate={(s) => (latest = s)} />\n </TamboMcpProvider>\n </TamboMcpTokenProvider>,\n );\n\n await waitFor(() => {\n expect(latest.length).toBe(2);\n });\n\n expect(closeSpy).not.toHaveBeenCalled();\n\n // Remove one server\n rerender(\n <TamboMcpTokenProvider>\n <TamboMcpProvider mcpServers={[\"https://a.example\"]}>\n <Capture onUpdate={(s) => (latest = s)} />\n </TamboMcpProvider>\n </TamboMcpTokenProvider>,\n );\n\n await waitFor(() => {\n expect(latest.length).toBe(1);\n });\n\n // close() should have been called once for the removed server\n expect(closeSpy).toHaveBeenCalledTimes(1);\n });\n\n it(\"calls close() on all clients when provider unmounts\", async () => {\n const closeSpy = jest.fn();\n const createSpy = jest.fn().mockResolvedValue({\n listTools: jest.fn().mockResolvedValue([]),\n close: closeSpy,\n });\n (MCPClient as unknown as any).create = createSpy;\n\n let latest: McpServer[] = [];\n const { unmount } = render(\n <TamboMcpTokenProvider>\n <TamboMcpProvider\n mcpServers={[\"https://a.example\", \"https://b.example\"]}\n >\n <Capture onUpdate={(s) => (latest = s)} />\n </TamboMcpProvider>\n </TamboMcpTokenProvider>,\n );\n\n await waitFor(() => {\n expect(latest.length).toBe(2);\n });\n\n expect(closeSpy).not.toHaveBeenCalled();\n\n // Unmount the provider\n unmount();\n\n // close() should have been called for both clients\n expect(closeSpy).toHaveBeenCalledTimes(2);\n });\n\n it(\"creates new client when customHeaders change\", async () => {\n const closeSpy = jest.fn();\n let clientIdCounter = 0;\n const createSpy = jest.fn().mockImplementation(async () => {\n const id = ++clientIdCounter;\n return {\n id, // Add an ID so we can track which client is which\n listTools: jest.fn().mockResolvedValue([]),\n close: closeSpy,\n };\n });\n (MCPClient as unknown as any).create = createSpy;\n\n let latest: McpServer[] = [];\n const { rerender } = render(\n <TamboMcpTokenProvider>\n <TamboMcpProvider\n mcpServers={[\n {\n url: \"https://a.example\",\n transport: MCPTransport.SSE,\n customHeaders: { Authorization: \"Bearer token1\" },\n },\n ]}\n >\n <Capture onUpdate={(s) => (latest = s)} />\n </TamboMcpProvider>\n </TamboMcpTokenProvider>,\n );\n\n await waitFor(() => {\n expect(latest.length).toBe(1);\n expect(createSpy).toHaveBeenCalledTimes(1);\n });\n\n const firstClientId = (latest[0].client as any)?.id;\n expect(firstClientId).toBe(1);\n\n // Change the customHeaders\n rerender(\n <TamboMcpTokenProvider>\n <TamboMcpProvider\n mcpServers={[\n {\n url: \"https://a.example\",\n transport: MCPTransport.SSE,\n customHeaders: { Authorization: \"Bearer token2\" },\n },\n ]}\n >\n <Capture onUpdate={(s) => (latest = s)} />\n </TamboMcpProvider>\n </TamboMcpTokenProvider>,\n );\n\n // Wait for old client to be closed and new client to be created\n await waitFor(\n () => {\n expect(closeSpy).toHaveBeenCalledTimes(1);\n expect(createSpy).toHaveBeenCalledTimes(2);\n expect(latest.length).toBe(1);\n const newClientId = (latest[0].client as any)?.id;\n expect(newClientId).toBe(2); // Should be the new client\n },\n { timeout: 3000 },\n );\n });\n\n // Note: Token changes for the internal Tambo server are covered by the\n // \"creates new client when customHeaders change\" test above, since token\n // changes result in different Authorization headers, which trigger client recreation.\n});\n\ndescribe(\"TamboMcpProvider handler support\", () => {\n let mockClient: any;\n let createSpy: jest.Mock;\n\n beforeEach(() => {\n // Mock registry so tool registration is a no-op\n (useTamboRegistry as unknown as jest.Mock).mockReturnValue({\n registerTool: jest.fn(),\n });\n\n // Mock client with baseURL\n (useTamboClient as unknown as jest.Mock).mockReturnValue({\n baseURL: \"https://api.tambo.co\",\n });\n\n // Create a mock client with update methods\n mockClient = {\n listTools: jest.fn().mockResolvedValue([]),\n updateElicitationHandler: jest.fn(),\n updateSamplingHandler: jest.fn(),\n close: jest.fn(),\n };\n\n // Mock MCPClient.create to return our mock client\n createSpy = jest.fn().mockResolvedValue(mockClient);\n (MCPClient as unknown as any).create = createSpy;\n });\n\n const Capture: React.FC<{ onUpdate: (servers: McpServer[]) => void }> = ({\n onUpdate,\n }) => {\n const servers = useTamboMcpServers();\n useEffect(() => {\n onUpdate(servers);\n }, [servers, onUpdate]);\n return null;\n };\n\n it(\"should pass provider-level elicitation handler to MCPClient.create\", async () => {\n const mockElicitationHandler = jest.fn().mockResolvedValue({\n content: [{ type: \"text\", text: \"test\" }],\n });\n\n const handlers: ProviderMCPHandlers = {\n elicitation: mockElicitationHandler,\n };\n\n let latest: McpServer[] = [];\n render(\n <TamboMcpTokenProvider>\n <TamboMcpProvider\n mcpServers={[\"https://test.example\"]}\n handlers={handlers}\n >\n <Capture onUpdate={(s) => (latest = s)} />\n </TamboMcpProvider>\n </TamboMcpTokenProvider>,\n );\n\n await waitFor(() => {\n expect(latest.length).toBe(1);\n });\n\n // Verify MCPClient.create was called\n expect(createSpy).toHaveBeenCalledWith(\n \"https://test.example\",\n MCPTransport.SSE,\n undefined,\n undefined,\n undefined,\n expect.objectContaining({\n elicitation: expect.any(Function),\n }),\n );\n\n // Get the actual handler that was passed\n const passedHandlers = createSpy.mock.calls[0][5];\n expect(passedHandlers.elicitation).toBeDefined();\n\n // Call the wrapped handler and verify it receives serverInfo\n const mockRequest = {\n method: \"sampling/createMessage\" as const,\n params: {},\n };\n const mockExtra = createMockExtra();\n await passedHandlers.elicitation(mockRequest, mockExtra);\n\n expect(mockElicitationHandler).toHaveBeenCalledWith(\n mockRequest,\n mockExtra,\n expect.objectContaining({\n url: \"https://test.example\",\n transport: MCPTransport.SSE,\n }),\n );\n });\n\n it(\"should pass provider-level sampling handler to MCPClient.create\", async () => {\n const mockSamplingHandler = jest.fn().mockResolvedValue({\n model: \"test-model\",\n stopReason: \"endTurn\",\n role: \"assistant\",\n content: { type: \"text\", text: \"response\" },\n });\n\n const handlers: ProviderMCPHandlers = {\n sampling: mockSamplingHandler,\n };\n\n let latest: McpServer[] = [];\n render(\n <TamboMcpTokenProvider>\n <TamboMcpProvider\n mcpServers={[\"https://test.example\"]}\n handlers={handlers}\n >\n <Capture onUpdate={(s) => (latest = s)} />\n </TamboMcpProvider>\n </TamboMcpTokenProvider>,\n );\n\n await waitFor(() => {\n expect(latest.length).toBe(1);\n });\n\n // Verify MCPClient.create was called with sampling handler\n expect(createSpy).toHaveBeenCalledWith(\n \"https://test.example\",\n MCPTransport.SSE,\n undefined,\n undefined,\n undefined,\n expect.objectContaining({\n sampling: expect.any(Function),\n }),\n );\n\n // Get the actual handler and verify it receives serverInfo\n const passedHandlers = createSpy.mock.calls[0][5];\n const mockRequest = {\n method: \"sampling/createMessage\" as const,\n params: {\n messages: [],\n modelPreferences: {},\n },\n };\n const mockExtra = createMockExtra();\n await passedHandlers.sampling(mockRequest, mockExtra);\n\n expect(mockSamplingHandler).toHaveBeenCalledWith(\n mockRequest,\n mockExtra,\n expect.objectContaining({\n url: \"https://test.example\",\n transport: MCPTransport.SSE,\n }),\n );\n });\n\n it(\"should allow per-server handlers to override provider-level handlers\", async () => {\n const providerElicitationHandler = jest.fn().mockResolvedValue({\n content: [{ type: \"text\", text: \"provider\" }],\n });\n\n const serverElicitationHandler = jest.fn().mockResolvedValue({\n content: [{ type: \"text\", text: \"server\" }],\n });\n\n const handlers: ProviderMCPHandlers = {\n elicitation: providerElicitationHandler,\n };\n\n let latest: McpServer[] = [];\n render(\n <TamboMcpTokenProvider>\n <TamboMcpProvider\n mcpServers={[\n {\n url: \"https://test.example\",\n handlers: {\n elicitation: serverElicitationHandler,\n },\n },\n ]}\n handlers={handlers}\n >\n <Capture onUpdate={(s) => (latest = s)} />\n </TamboMcpProvider>\n </TamboMcpTokenProvider>,\n );\n\n await waitFor(() => {\n expect(latest.length).toBe(1);\n });\n\n // Verify the per-server handler was used, not the provider handler\n const passedHandlers = createSpy.mock.calls[0][5];\n expect(passedHandlers.elicitation).toBe(serverElicitationHandler);\n });\n\n it(\"should pass different serverInfo to handlers for different servers\", async () => {\n const mockElicitationHandler = jest.fn().mockResolvedValue({\n content: [{ type: \"text\", text: \"test\" }],\n });\n\n const handlers: ProviderMCPHandlers = {\n elicitation: mockElicitationHandler,\n };\n\n let latest: McpServer[] = [];\n render(\n <TamboMcpTokenProvider>\n <TamboMcpProvider\n mcpServers={[\n { url: \"https://server-a.example\", name: \"Server A\" },\n { url: \"https://server-b.example\", name: \"Server B\" },\n ]}\n handlers={handlers}\n >\n <Capture onUpdate={(s) => (latest = s)} />\n </TamboMcpProvider>\n </TamboMcpTokenProvider>,\n );\n\n await waitFor(() => {\n expect(latest.length).toBe(2);\n });\n\n // Verify both servers got handlers\n expect(createSpy).toHaveBeenCalledTimes(2);\n\n // Get handlers for both servers\n const serverAHandlers = createSpy.mock.calls[0][5];\n const serverBHandlers = createSpy.mock.calls[1][5];\n\n const mockRequest = {\n method: \"sampling/createMessage\" as const,\n params: {},\n };\n const mockExtra = createMockExtra();\n\n // Call handler for server A\n await serverAHandlers.elicitation(mockRequest, mockExtra);\n expect(mockElicitationHandler).toHaveBeenCalledWith(\n mockRequest,\n mockExtra,\n expect.objectContaining({\n url: \"https://server-a.example\",\n name: \"Server A\",\n }),\n );\n\n mockElicitationHandler.mockClear();\n\n // Call handler for server B\n await serverBHandlers.elicitation(mockRequest, mockExtra);\n expect(mockElicitationHandler).toHaveBeenCalledWith(\n mockRequest,\n mockExtra,\n expect.objectContaining({\n url: \"https://server-b.example\",\n name: \"Server B\",\n }),\n );\n });\n\n it(\"should update handlers when provider handlers change\", async () => {\n const initialHandler = jest.fn().mockResolvedValue({\n content: [{ type: \"text\", text: \"initial\" }],\n });\n\n const updatedHandler = jest.fn().mockResolvedValue({\n content: [{ type: \"text\", text: \"updated\" }],\n });\n\n let latest: McpServer[] = [];\n const { rerender } = render(\n <TamboMcpTokenProvider>\n <TamboMcpProvider\n mcpServers={[\"https://test.example\"]}\n handlers={{ elicitation: initialHandler }}\n >\n <Capture onUpdate={(s) => (latest = s)} />\n </TamboMcpProvider>\n </TamboMcpTokenProvider>,\n );\n\n await waitFor(() => {\n expect(latest.length).toBe(1);\n });\n\n // Update the handlers\n rerender(\n <TamboMcpTokenProvider>\n <TamboMcpProvider\n mcpServers={[\"https://test.example\"]}\n handlers={{ elicitation: updatedHandler }}\n >\n <Capture onUpdate={(s) => (latest = s)} />\n </TamboMcpProvider>\n </TamboMcpTokenProvider>,\n );\n\n await waitFor(() => {\n expect(mockClient.updateElicitationHandler).toHaveBeenCalled();\n });\n\n // Verify the handler was updated\n expect(mockClient.updateElicitationHandler).toHaveBeenCalledWith(\n expect.any(Function),\n );\n });\n});\n"]}
@@ -0,0 +1,80 @@
1
+ import type { RequestHandlerExtra } from "@modelcontextprotocol/sdk/shared/protocol.js";
2
+ import type { ClientNotification, ClientRequest } from "@modelcontextprotocol/sdk/types.js";
3
+ /**
4
+ * JSON Schema types for elicitation fields
5
+ */
6
+ interface BaseFieldSchema {
7
+ type: "string" | "number" | "integer" | "boolean";
8
+ description?: string;
9
+ default?: unknown;
10
+ }
11
+ interface StringFieldSchema extends BaseFieldSchema {
12
+ type: "string";
13
+ minLength?: number;
14
+ maxLength?: number;
15
+ pattern?: string;
16
+ format?: "email" | "uri" | "date" | "date-time";
17
+ enum?: string[];
18
+ enumNames?: string[];
19
+ }
20
+ interface NumberFieldSchema extends BaseFieldSchema {
21
+ type: "number" | "integer";
22
+ minimum?: number;
23
+ maximum?: number;
24
+ }
25
+ interface BooleanFieldSchema extends BaseFieldSchema {
26
+ type: "boolean";
27
+ }
28
+ type FieldSchema = StringFieldSchema | NumberFieldSchema | BooleanFieldSchema;
29
+ /**
30
+ * Elicitation request from MCP server
31
+ */
32
+ export interface TamboElicitationRequest {
33
+ message: string;
34
+ requestedSchema: {
35
+ type: "object";
36
+ properties: Record<string, FieldSchema>;
37
+ required?: string[];
38
+ };
39
+ /** AbortSignal that fires when the server cancels the request (e.g., timeout) */
40
+ signal?: AbortSignal;
41
+ }
42
+ /**
43
+ * Elicitation response to be sent back
44
+ */
45
+ export interface TamboElicitationResponse {
46
+ action: "accept" | "decline" | "cancel";
47
+ content?: Record<string, unknown>;
48
+ [x: string]: unknown;
49
+ }
50
+ /**
51
+ * Elicitation context state - read-only interface for consumers.
52
+ * State management is handled internally by useElicitation hook.
53
+ */
54
+ export interface ElicitationContextState {
55
+ /** Current elicitation request, or null if none active */
56
+ elicitation: TamboElicitationRequest | null;
57
+ /** Function to call when user responds to elicitation (clears state automatically) */
58
+ resolveElicitation: ((response: TamboElicitationResponse) => void) | null;
59
+ }
60
+ /**
61
+ * Internal hook that manages elicitation state and creates a default handler.
62
+ * This bundles all the state management and handler creation for elicitation.
63
+ *
64
+ * Do not export this hook from this package. It is only intended to be used internally by the TamboMcpProvider.
65
+ * @returns Elicitation state and default handler
66
+ */
67
+ export declare function useElicitation(): {
68
+ elicitation: TamboElicitationRequest | null;
69
+ setElicitation: import("react").Dispatch<import("react").SetStateAction<TamboElicitationRequest | null>>;
70
+ resolveElicitation: ((response: TamboElicitationResponse) => void) | null;
71
+ setResolveElicitation: import("react").Dispatch<import("react").SetStateAction<((response: TamboElicitationResponse) => void) | null>>;
72
+ defaultElicitationHandler: (request: {
73
+ params: {
74
+ message: string;
75
+ requestedSchema: TamboElicitationRequest["requestedSchema"];
76
+ };
77
+ }, extra: RequestHandlerExtra<ClientRequest, ClientNotification>) => Promise<TamboElicitationResponse>;
78
+ };
79
+ export {};
80
+ //# sourceMappingURL=elicitation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"elicitation.d.ts","sourceRoot":"","sources":["../../src/mcp/elicitation.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,8CAA8C,CAAC;AACxF,OAAO,KAAK,EACV,kBAAkB,EAClB,aAAa,EACd,MAAM,oCAAoC,CAAC;AAE5C;;GAEG;AACH,UAAU,eAAe;IACvB,IAAI,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,SAAS,CAAC;IAClD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,UAAU,iBAAkB,SAAQ,eAAe;IACjD,IAAI,EAAE,QAAQ,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,GAAG,KAAK,GAAG,MAAM,GAAG,WAAW,CAAC;IAChD,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,UAAU,iBAAkB,SAAQ,eAAe;IACjD,IAAI,EAAE,QAAQ,GAAG,SAAS,CAAC;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,UAAU,kBAAmB,SAAQ,eAAe;IAClD,IAAI,EAAE,SAAS,CAAC;CACjB;AAED,KAAK,WAAW,GAAG,iBAAiB,GAAG,iBAAiB,GAAG,kBAAkB,CAAC;AAE9E;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACtC,OAAO,EAAE,MAAM,CAAC;IAChB,eAAe,EAAE;QACf,IAAI,EAAE,QAAQ,CAAC;QACf,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;QACxC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;KACrB,CAAC;IACF,iFAAiF;IACjF,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACvC,MAAM,EAAE,QAAQ,GAAG,SAAS,GAAG,QAAQ,CAAC;IACxC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;CACtB;AAED;;;GAGG;AACH,MAAM,WAAW,uBAAuB;IACtC,0DAA0D;IAC1D,WAAW,EAAE,uBAAuB,GAAG,IAAI,CAAC;IAC5C,sFAAsF;IACtF,kBAAkB,EAAE,CAAC,CAAC,QAAQ,EAAE,wBAAwB,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC;CAC3E;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc;;;oCAId,wBAAwB,KAAK,IAAI;+FAAjC,wBAAwB,KAAK,IAAI;yCAMhC;QACP,MAAM,EAAE;YACN,OAAO,EAAE,MAAM,CAAC;YAChB,eAAe,EAAE,uBAAuB,CAAC,iBAAiB,CAAC,CAAC;SAC7D,CAAC;KACH,SACM,mBAAmB,CAAC,aAAa,EAAE,kBAAkB,CAAC,KAC5D,OAAO,CAAC,wBAAwB,CAAC;EAkDzC"}
@@ -0,0 +1,55 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.useElicitation = useElicitation;
4
+ const react_1 = require("react");
5
+ /**
6
+ * Internal hook that manages elicitation state and creates a default handler.
7
+ * This bundles all the state management and handler creation for elicitation.
8
+ *
9
+ * Do not export this hook from this package. It is only intended to be used internally by the TamboMcpProvider.
10
+ * @returns Elicitation state and default handler
11
+ */
12
+ function useElicitation() {
13
+ const [elicitation, setElicitation] = (0, react_1.useState)(null);
14
+ const [resolveElicitation, setResolveElicitation] = (0, react_1.useState)(null);
15
+ const defaultElicitationHandler = (0, react_1.useMemo)(() => async (request, extra) => {
16
+ return await new Promise((resolve, reject) => {
17
+ // Set the elicitation request to show the UI
18
+ setElicitation({
19
+ message: request.params.message,
20
+ requestedSchema: request.params.requestedSchema,
21
+ signal: extra.signal,
22
+ });
23
+ // If the signal is already aborted, reject immediately
24
+ if (extra.signal.aborted) {
25
+ setElicitation(null);
26
+ reject(new Error("Request aborted"));
27
+ return;
28
+ }
29
+ // Listen for abort signal to clean up
30
+ const handleAbort = () => {
31
+ setElicitation(null);
32
+ setResolveElicitation(null);
33
+ reject(new Error("Request aborted"));
34
+ };
35
+ extra.signal.addEventListener("abort", handleAbort, { once: true });
36
+ // Store the resolve function so we can call it when the user responds
37
+ setResolveElicitation(() => (response) => {
38
+ // Remove abort listener since we're resolving normally
39
+ extra.signal.removeEventListener("abort", handleAbort);
40
+ // Clear state now that user has responded
41
+ setElicitation(null);
42
+ setResolveElicitation(null);
43
+ resolve(response);
44
+ });
45
+ });
46
+ }, []);
47
+ return {
48
+ elicitation,
49
+ setElicitation,
50
+ resolveElicitation,
51
+ setResolveElicitation,
52
+ defaultElicitationHandler,
53
+ };
54
+ }
55
+ //# sourceMappingURL=elicitation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"elicitation.js","sourceRoot":"","sources":["../../src/mcp/elicitation.ts"],"names":[],"mappings":";;AA+EA,wCAmEC;AAlJD,iCAA0C;AAwE1C;;;;;;GAMG;AACH,SAAgB,cAAc;IAC5B,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GACjC,IAAA,gBAAQ,EAAiC,IAAI,CAAC,CAAC;IACjD,MAAM,CAAC,kBAAkB,EAAE,qBAAqB,CAAC,GAAG,IAAA,gBAAQ,EAE1D,IAAI,CAAC,CAAC;IAER,MAAM,yBAAyB,GAAG,IAAA,eAAO,EACvC,GAAG,EAAE,CACH,KAAK,EACH,OAKC,EACD,KAA6D,EAC1B,EAAE;QACrC,OAAO,MAAM,IAAI,OAAO,CACtB,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAClB,6CAA6C;YAC7C,cAAc,CAAC;gBACb,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,OAAO;gBAC/B,eAAe,EAAE,OAAO,CAAC,MAAM,CAAC,eAAe;gBAC/C,MAAM,EAAE,KAAK,CAAC,MAAM;aACrB,CAAC,CAAC;YAEH,uDAAuD;YACvD,IAAI,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;gBACzB,cAAc,CAAC,IAAI,CAAC,CAAC;gBACrB,MAAM,CAAC,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC,CAAC;gBACrC,OAAO;YACT,CAAC;YAED,sCAAsC;YACtC,MAAM,WAAW,GAAG,GAAG,EAAE;gBACvB,cAAc,CAAC,IAAI,CAAC,CAAC;gBACrB,qBAAqB,CAAC,IAAI,CAAC,CAAC;gBAC5B,MAAM,CAAC,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC,CAAC;YACvC,CAAC,CAAC;YAEF,KAAK,CAAC,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,WAAW,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;YAEpE,sEAAsE;YACtE,qBAAqB,CACnB,GAAG,EAAE,CAAC,CAAC,QAAkC,EAAE,EAAE;gBAC3C,uDAAuD;gBACvD,KAAK,CAAC,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;gBACvD,0CAA0C;gBAC1C,cAAc,CAAC,IAAI,CAAC,CAAC;gBACrB,qBAAqB,CAAC,IAAI,CAAC,CAAC;gBAC5B,OAAO,CAAC,QAAQ,CAAC,CAAC;YACpB,CAAC,CACF,CAAC;QACJ,CAAC,CACF,CAAC;IACJ,CAAC,EACH,EAAE,CACH,CAAC;IAEF,OAAO;QACL,WAAW;QACX,cAAc;QACd,kBAAkB;QAClB,qBAAqB;QACrB,yBAAyB;KAC1B,CAAC;AACJ,CAAC","sourcesContent":["import { useMemo, useState } from \"react\";\nimport type { RequestHandlerExtra } from \"@modelcontextprotocol/sdk/shared/protocol.js\";\nimport type {\n ClientNotification,\n ClientRequest,\n} from \"@modelcontextprotocol/sdk/types.js\";\n\n/**\n * JSON Schema types for elicitation fields\n */\ninterface BaseFieldSchema {\n type: \"string\" | \"number\" | \"integer\" | \"boolean\";\n description?: string;\n default?: unknown;\n}\n\ninterface StringFieldSchema extends BaseFieldSchema {\n type: \"string\";\n minLength?: number;\n maxLength?: number;\n pattern?: string;\n format?: \"email\" | \"uri\" | \"date\" | \"date-time\";\n enum?: string[];\n enumNames?: string[];\n}\n\ninterface NumberFieldSchema extends BaseFieldSchema {\n type: \"number\" | \"integer\";\n minimum?: number;\n maximum?: number;\n}\n\ninterface BooleanFieldSchema extends BaseFieldSchema {\n type: \"boolean\";\n}\n\ntype FieldSchema = StringFieldSchema | NumberFieldSchema | BooleanFieldSchema;\n\n/**\n * Elicitation request from MCP server\n */\nexport interface TamboElicitationRequest {\n message: string;\n requestedSchema: {\n type: \"object\";\n properties: Record<string, FieldSchema>;\n required?: string[];\n };\n /** AbortSignal that fires when the server cancels the request (e.g., timeout) */\n signal?: AbortSignal;\n}\n\n/**\n * Elicitation response to be sent back\n */\nexport interface TamboElicitationResponse {\n action: \"accept\" | \"decline\" | \"cancel\";\n content?: Record<string, unknown>;\n [x: string]: unknown;\n}\n\n/**\n * Elicitation context state - read-only interface for consumers.\n * State management is handled internally by useElicitation hook.\n */\nexport interface ElicitationContextState {\n /** Current elicitation request, or null if none active */\n elicitation: TamboElicitationRequest | null;\n /** Function to call when user responds to elicitation (clears state automatically) */\n resolveElicitation: ((response: TamboElicitationResponse) => void) | null;\n}\n\n/**\n * Internal hook that manages elicitation state and creates a default handler.\n * This bundles all the state management and handler creation for elicitation.\n *\n * Do not export this hook from this package. It is only intended to be used internally by the TamboMcpProvider.\n * @returns Elicitation state and default handler\n */\nexport function useElicitation() {\n const [elicitation, setElicitation] =\n useState<TamboElicitationRequest | null>(null);\n const [resolveElicitation, setResolveElicitation] = useState<\n ((response: TamboElicitationResponse) => void) | null\n >(null);\n\n const defaultElicitationHandler = useMemo(\n () =>\n async (\n request: {\n params: {\n message: string;\n requestedSchema: TamboElicitationRequest[\"requestedSchema\"];\n };\n },\n extra: RequestHandlerExtra<ClientRequest, ClientNotification>,\n ): Promise<TamboElicitationResponse> => {\n return await new Promise<TamboElicitationResponse>(\n (resolve, reject) => {\n // Set the elicitation request to show the UI\n setElicitation({\n message: request.params.message,\n requestedSchema: request.params.requestedSchema,\n signal: extra.signal,\n });\n\n // If the signal is already aborted, reject immediately\n if (extra.signal.aborted) {\n setElicitation(null);\n reject(new Error(\"Request aborted\"));\n return;\n }\n\n // Listen for abort signal to clean up\n const handleAbort = () => {\n setElicitation(null);\n setResolveElicitation(null);\n reject(new Error(\"Request aborted\"));\n };\n\n extra.signal.addEventListener(\"abort\", handleAbort, { once: true });\n\n // Store the resolve function so we can call it when the user responds\n setResolveElicitation(\n () => (response: TamboElicitationResponse) => {\n // Remove abort listener since we're resolving normally\n extra.signal.removeEventListener(\"abort\", handleAbort);\n // Clear state now that user has responded\n setElicitation(null);\n setResolveElicitation(null);\n resolve(response);\n },\n );\n },\n );\n },\n [],\n );\n\n return {\n elicitation,\n setElicitation,\n resolveElicitation,\n setResolveElicitation,\n defaultElicitationHandler,\n };\n}\n"]}
@@ -1,5 +1,6 @@
1
1
  export { MCPTransport } from "./mcp-client";
2
- export type { MCPHandlers } from "./mcp-client";
2
+ export type { MCPElicitationHandler, MCPHandlers, MCPSamplingHandler, } from "./mcp-client";
3
+ export type { TamboElicitationRequest, TamboElicitationResponse, } from "./elicitation";
3
4
  export { useTamboMcpPrompt, useTamboMcpPromptList } from "./mcp-hooks";
4
- export { TamboMcpProvider, useTamboMcpServers, type ConnectedMcpServer, type FailedMcpServer, type McpServer, type McpServerInfo, type ProviderMCPHandlers, } from "./tambo-mcp-provider";
5
+ export { TamboMcpProvider, useTamboMcpServers, useTamboElicitationContext, type ConnectedMcpServer, type FailedMcpServer, type McpServer, type McpServerInfo, type ProviderMCPHandlers, } from "./tambo-mcp-provider";
5
6
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/mcp/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,YAAY,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACvE,OAAO,EACL,gBAAgB,EAChB,kBAAkB,EAClB,KAAK,kBAAkB,EACvB,KAAK,eAAe,EACpB,KAAK,SAAS,EACd,KAAK,aAAa,EAClB,KAAK,mBAAmB,GACzB,MAAM,sBAAsB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/mcp/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,YAAY,EACV,qBAAqB,EACrB,WAAW,EACX,kBAAkB,GACnB,MAAM,cAAc,CAAC;AACtB,YAAY,EACV,uBAAuB,EACvB,wBAAwB,GACzB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACvE,OAAO,EACL,gBAAgB,EAChB,kBAAkB,EAClB,0BAA0B,EAC1B,KAAK,kBAAkB,EACvB,KAAK,eAAe,EACpB,KAAK,SAAS,EACd,KAAK,aAAa,EAClB,KAAK,mBAAmB,GACzB,MAAM,sBAAsB,CAAC"}
package/dist/mcp/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.useTamboMcpServers = exports.TamboMcpProvider = exports.useTamboMcpPromptList = exports.useTamboMcpPrompt = exports.MCPTransport = void 0;
3
+ exports.useTamboElicitationContext = exports.useTamboMcpServers = exports.TamboMcpProvider = exports.useTamboMcpPromptList = exports.useTamboMcpPrompt = exports.MCPTransport = void 0;
4
4
  var mcp_client_1 = require("./mcp-client");
5
5
  Object.defineProperty(exports, "MCPTransport", { enumerable: true, get: function () { return mcp_client_1.MCPTransport; } });
6
6
  var mcp_hooks_1 = require("./mcp-hooks");
@@ -9,4 +9,5 @@ Object.defineProperty(exports, "useTamboMcpPromptList", { enumerable: true, get:
9
9
  var tambo_mcp_provider_1 = require("./tambo-mcp-provider");
10
10
  Object.defineProperty(exports, "TamboMcpProvider", { enumerable: true, get: function () { return tambo_mcp_provider_1.TamboMcpProvider; } });
11
11
  Object.defineProperty(exports, "useTamboMcpServers", { enumerable: true, get: function () { return tambo_mcp_provider_1.useTamboMcpServers; } });
12
+ Object.defineProperty(exports, "useTamboElicitationContext", { enumerable: true, get: function () { return tambo_mcp_provider_1.useTamboElicitationContext; } });
12
13
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/mcp/index.ts"],"names":[],"mappings":";;;AAAA,2CAA4C;AAAnC,0GAAA,YAAY,OAAA;AAErB,yCAAuE;AAA9D,8GAAA,iBAAiB,OAAA;AAAE,kHAAA,qBAAqB,OAAA;AACjD,2DAQ8B;AAP5B,sHAAA,gBAAgB,OAAA;AAChB,wHAAA,kBAAkB,OAAA","sourcesContent":["export { MCPTransport } from \"./mcp-client\";\nexport type { MCPHandlers } from \"./mcp-client\";\nexport { useTamboMcpPrompt, useTamboMcpPromptList } from \"./mcp-hooks\";\nexport {\n TamboMcpProvider,\n useTamboMcpServers,\n type ConnectedMcpServer,\n type FailedMcpServer,\n type McpServer,\n type McpServerInfo,\n type ProviderMCPHandlers,\n} from \"./tambo-mcp-provider\";\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/mcp/index.ts"],"names":[],"mappings":";;;AAAA,2CAA4C;AAAnC,0GAAA,YAAY,OAAA;AAUrB,yCAAuE;AAA9D,8GAAA,iBAAiB,OAAA;AAAE,kHAAA,qBAAqB,OAAA;AACjD,2DAS8B;AAR5B,sHAAA,gBAAgB,OAAA;AAChB,wHAAA,kBAAkB,OAAA;AAClB,gIAAA,0BAA0B,OAAA","sourcesContent":["export { MCPTransport } from \"./mcp-client\";\nexport type {\n MCPElicitationHandler,\n MCPHandlers,\n MCPSamplingHandler,\n} from \"./mcp-client\";\nexport type {\n TamboElicitationRequest,\n TamboElicitationResponse,\n} from \"./elicitation\";\nexport { useTamboMcpPrompt, useTamboMcpPromptList } from \"./mcp-hooks\";\nexport {\n TamboMcpProvider,\n useTamboMcpServers,\n useTamboElicitationContext,\n type ConnectedMcpServer,\n type FailedMcpServer,\n type McpServer,\n type McpServerInfo,\n type ProviderMCPHandlers,\n} from \"./tambo-mcp-provider\";\n"]}