@tambo-ai/react 0.64.1 → 0.65.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (130) hide show
  1. package/README.md +304 -327
  2. package/dist/hooks/use-tambo-threads.d.ts +0 -12
  3. package/dist/hooks/use-tambo-threads.d.ts.map +1 -1
  4. package/dist/hooks/use-tambo-threads.js.map +1 -1
  5. package/dist/index.d.ts +3 -1
  6. package/dist/index.d.ts.map +1 -1
  7. package/dist/index.js +6 -2
  8. package/dist/index.js.map +1 -1
  9. package/dist/mcp/__tests__/elicitation.test.js +7 -3
  10. package/dist/mcp/__tests__/elicitation.test.js.map +1 -1
  11. package/dist/mcp/__tests__/mcp-hooks.test.js +149 -123
  12. package/dist/mcp/__tests__/mcp-hooks.test.js.map +1 -1
  13. package/dist/mcp/__tests__/tambo-mcp-provider.test.js +176 -120
  14. package/dist/mcp/__tests__/tambo-mcp-provider.test.js.map +1 -1
  15. package/dist/mcp/__tests__/use-mcp-servers.test.js +12 -9
  16. package/dist/mcp/__tests__/use-mcp-servers.test.js.map +1 -1
  17. package/dist/mcp/elicitation.d.ts +4 -40
  18. package/dist/mcp/elicitation.d.ts.map +1 -1
  19. package/dist/mcp/elicitation.js +1 -1
  20. package/dist/mcp/elicitation.js.map +1 -1
  21. package/dist/mcp/index.d.ts +2 -1
  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 +14 -26
  26. package/dist/mcp/mcp-client.d.ts.map +1 -1
  27. package/dist/mcp/mcp-client.js +4 -7
  28. package/dist/mcp/mcp-client.js.map +1 -1
  29. package/dist/mcp/mcp-hooks.d.ts +27 -78
  30. package/dist/mcp/mcp-hooks.d.ts.map +1 -1
  31. package/dist/mcp/tambo-mcp-provider.d.ts +27 -45
  32. package/dist/mcp/tambo-mcp-provider.d.ts.map +1 -1
  33. package/dist/mcp/tambo-mcp-provider.js +36 -87
  34. package/dist/mcp/tambo-mcp-provider.js.map +1 -1
  35. package/dist/model/mcp-server-info.d.ts +74 -0
  36. package/dist/model/mcp-server-info.d.ts.map +1 -0
  37. package/dist/model/mcp-server-info.js +29 -0
  38. package/dist/model/mcp-server-info.js.map +1 -0
  39. package/dist/providers/__tests__/tambo-thread-provider-initial-messages.test.js +22 -8
  40. package/dist/providers/__tests__/tambo-thread-provider-initial-messages.test.js.map +1 -1
  41. package/dist/providers/__tests__/tambo-thread-provider.test.js +318 -129
  42. package/dist/providers/__tests__/tambo-thread-provider.test.js.map +1 -1
  43. package/dist/providers/index.d.ts +1 -1
  44. package/dist/providers/index.d.ts.map +1 -1
  45. package/dist/providers/index.js +2 -1
  46. package/dist/providers/index.js.map +1 -1
  47. package/dist/providers/tambo-client-provider.d.ts +4 -0
  48. package/dist/providers/tambo-client-provider.d.ts.map +1 -1
  49. package/dist/providers/tambo-client-provider.js +3 -0
  50. package/dist/providers/tambo-client-provider.js.map +1 -1
  51. package/dist/providers/tambo-mcp-token-provider.d.ts +3 -0
  52. package/dist/providers/tambo-mcp-token-provider.d.ts.map +1 -1
  53. package/dist/providers/tambo-mcp-token-provider.js +11 -3
  54. package/dist/providers/tambo-mcp-token-provider.js.map +1 -1
  55. package/dist/providers/tambo-provider.d.ts +1 -0
  56. package/dist/providers/tambo-provider.d.ts.map +1 -1
  57. package/dist/providers/tambo-provider.js +10 -5
  58. package/dist/providers/tambo-provider.js.map +1 -1
  59. package/dist/providers/tambo-registry-provider.d.ts +37 -0
  60. package/dist/providers/tambo-registry-provider.d.ts.map +1 -1
  61. package/dist/providers/tambo-registry-provider.js +162 -2
  62. package/dist/providers/tambo-registry-provider.js.map +1 -1
  63. package/dist/providers/tambo-stubs.d.ts.map +1 -1
  64. package/dist/providers/tambo-stubs.js +10 -1
  65. package/dist/providers/tambo-stubs.js.map +1 -1
  66. package/esm/hooks/use-tambo-threads.d.ts +0 -12
  67. package/esm/hooks/use-tambo-threads.d.ts.map +1 -1
  68. package/esm/hooks/use-tambo-threads.js.map +1 -1
  69. package/esm/index.d.ts +3 -1
  70. package/esm/index.d.ts.map +1 -1
  71. package/esm/index.js +3 -2
  72. package/esm/index.js.map +1 -1
  73. package/esm/mcp/__tests__/elicitation.test.js +8 -4
  74. package/esm/mcp/__tests__/elicitation.test.js.map +1 -1
  75. package/esm/mcp/__tests__/mcp-hooks.test.js +149 -123
  76. package/esm/mcp/__tests__/mcp-hooks.test.js.map +1 -1
  77. package/esm/mcp/__tests__/tambo-mcp-provider.test.js +178 -122
  78. package/esm/mcp/__tests__/tambo-mcp-provider.test.js.map +1 -1
  79. package/esm/mcp/__tests__/use-mcp-servers.test.js +12 -9
  80. package/esm/mcp/__tests__/use-mcp-servers.test.js.map +1 -1
  81. package/esm/mcp/elicitation.d.ts +4 -40
  82. package/esm/mcp/elicitation.d.ts.map +1 -1
  83. package/esm/mcp/elicitation.js +2 -2
  84. package/esm/mcp/elicitation.js.map +1 -1
  85. package/esm/mcp/index.d.ts +2 -1
  86. package/esm/mcp/index.d.ts.map +1 -1
  87. package/esm/mcp/index.js +1 -1
  88. package/esm/mcp/index.js.map +1 -1
  89. package/esm/mcp/mcp-client.d.ts +14 -26
  90. package/esm/mcp/mcp-client.d.ts.map +1 -1
  91. package/esm/mcp/mcp-client.js +3 -5
  92. package/esm/mcp/mcp-client.js.map +1 -1
  93. package/esm/mcp/mcp-hooks.d.ts +27 -78
  94. package/esm/mcp/mcp-hooks.d.ts.map +1 -1
  95. package/esm/mcp/tambo-mcp-provider.d.ts +27 -45
  96. package/esm/mcp/tambo-mcp-provider.d.ts.map +1 -1
  97. package/esm/mcp/tambo-mcp-provider.js +35 -86
  98. package/esm/mcp/tambo-mcp-provider.js.map +1 -1
  99. package/esm/model/mcp-server-info.d.ts +74 -0
  100. package/esm/model/mcp-server-info.d.ts.map +1 -0
  101. package/esm/model/mcp-server-info.js +25 -0
  102. package/esm/model/mcp-server-info.js.map +1 -0
  103. package/esm/providers/__tests__/tambo-thread-provider-initial-messages.test.js +23 -9
  104. package/esm/providers/__tests__/tambo-thread-provider-initial-messages.test.js.map +1 -1
  105. package/esm/providers/__tests__/tambo-thread-provider.test.js +319 -130
  106. package/esm/providers/__tests__/tambo-thread-provider.test.js.map +1 -1
  107. package/esm/providers/index.d.ts +1 -1
  108. package/esm/providers/index.d.ts.map +1 -1
  109. package/esm/providers/index.js +1 -1
  110. package/esm/providers/index.js.map +1 -1
  111. package/esm/providers/tambo-client-provider.d.ts +4 -0
  112. package/esm/providers/tambo-client-provider.d.ts.map +1 -1
  113. package/esm/providers/tambo-client-provider.js +3 -0
  114. package/esm/providers/tambo-client-provider.js.map +1 -1
  115. package/esm/providers/tambo-mcp-token-provider.d.ts +3 -0
  116. package/esm/providers/tambo-mcp-token-provider.d.ts.map +1 -1
  117. package/esm/providers/tambo-mcp-token-provider.js +13 -5
  118. package/esm/providers/tambo-mcp-token-provider.js.map +1 -1
  119. package/esm/providers/tambo-provider.d.ts +1 -0
  120. package/esm/providers/tambo-provider.d.ts.map +1 -1
  121. package/esm/providers/tambo-provider.js +11 -6
  122. package/esm/providers/tambo-provider.js.map +1 -1
  123. package/esm/providers/tambo-registry-provider.d.ts +37 -0
  124. package/esm/providers/tambo-registry-provider.d.ts.map +1 -1
  125. package/esm/providers/tambo-registry-provider.js +161 -2
  126. package/esm/providers/tambo-registry-provider.js.map +1 -1
  127. package/esm/providers/tambo-stubs.d.ts.map +1 -1
  128. package/esm/providers/tambo-stubs.js +10 -1
  129. package/esm/providers/tambo-stubs.js.map +1 -1
  130. package/package.json +6 -6
@@ -21,10 +21,13 @@ Object.defineProperty(global, "crypto", {
21
21
  },
22
22
  });
23
23
  // Mock the required providers
24
- jest.mock("../tambo-client-provider", () => ({
25
- useTamboClient: jest.fn(),
26
- useTamboQueryClient: jest.fn(),
27
- }));
24
+ jest.mock("../tambo-client-provider", () => {
25
+ return {
26
+ useTamboClient: jest.fn(),
27
+ useTamboQueryClient: jest.fn(),
28
+ TamboClientContext: react_2.default.createContext(undefined),
29
+ };
30
+ });
28
31
  jest.mock("@tambo-ai/typescript-sdk", () => ({
29
32
  advanceStream: jest.fn(),
30
33
  }));
@@ -113,13 +116,24 @@ describe("TamboThreadProvider", () => {
113
116
  },
114
117
  ];
115
118
  // Use helpers that explicitly return null so they don't appear in additionalContext
116
- const wrapper = ({ children }) => (react_2.default.createElement(tambo_registry_provider_1.TamboRegistryProvider, { components: mockRegistry },
117
- react_2.default.createElement(tambo_context_helpers_provider_1.TamboContextHelpersProvider, { contextHelpers: {
118
- currentTimeContextHelper: () => null,
119
- currentPageContextHelper: () => null,
119
+ const Wrapper = ({ children }) => {
120
+ const client = (0, tambo_client_provider_1.useTamboClient)();
121
+ const queryClient = (0, tambo_client_provider_1.useTamboQueryClient)();
122
+ return (react_2.default.createElement(tambo_client_provider_1.TamboClientContext.Provider, { value: {
123
+ client,
124
+ queryClient,
125
+ isUpdatingToken: false,
126
+ mcpAccessToken: null,
127
+ setMcpAccessToken: () => { },
120
128
  } },
121
- react_2.default.createElement(tambo_mcp_token_provider_1.TamboMcpTokenProvider, null,
122
- react_2.default.createElement(tambo_thread_provider_1.TamboThreadProvider, { streaming: false }, children)))));
129
+ react_2.default.createElement(tambo_registry_provider_1.TamboRegistryProvider, { components: mockRegistry },
130
+ react_2.default.createElement(tambo_context_helpers_provider_1.TamboContextHelpersProvider, { contextHelpers: {
131
+ currentTimeContextHelper: () => null,
132
+ currentPageContextHelper: () => null,
133
+ } },
134
+ react_2.default.createElement(tambo_mcp_token_provider_1.TamboMcpTokenProvider, null,
135
+ react_2.default.createElement(tambo_thread_provider_1.TamboThreadProvider, { streaming: false }, children))))));
136
+ };
123
137
  beforeEach(() => {
124
138
  jest.clearAllMocks();
125
139
  // Setup mock query client
@@ -154,13 +168,13 @@ describe("TamboThreadProvider", () => {
154
168
  jest.mocked(tambo_client_provider_1.useTamboClient).mockReturnValue(mockTamboAI);
155
169
  });
156
170
  it("should initialize with placeholder thread", () => {
157
- const { result } = (0, react_1.renderHook)(() => (0, tambo_thread_provider_1.useTamboThread)(), { wrapper });
171
+ const { result } = (0, react_1.renderHook)(() => (0, tambo_thread_provider_1.useTamboThread)(), { wrapper: Wrapper });
158
172
  expect(result.current.thread.id).toBe("placeholder");
159
173
  expect(result.current.isIdle).toBe(true);
160
174
  expect(result.current.generationStage).toBe(generate_component_response_1.GenerationStage.IDLE);
161
175
  });
162
176
  it("should switch to a new thread", async () => {
163
- const { result } = (0, react_1.renderHook)(() => (0, tambo_thread_provider_1.useTamboThread)(), { wrapper });
177
+ const { result } = (0, react_1.renderHook)(() => (0, tambo_thread_provider_1.useTamboThread)(), { wrapper: Wrapper });
164
178
  await (0, react_1.act)(async () => {
165
179
  await result.current.switchCurrentThread("test-thread-1");
166
180
  });
@@ -168,7 +182,7 @@ describe("TamboThreadProvider", () => {
168
182
  expect(result.current.thread.id).toBe("test-thread-1");
169
183
  });
170
184
  it("should start a new thread", async () => {
171
- const { result } = (0, react_1.renderHook)(() => (0, tambo_thread_provider_1.useTamboThread)(), { wrapper });
185
+ const { result } = (0, react_1.renderHook)(() => (0, tambo_thread_provider_1.useTamboThread)(), { wrapper: Wrapper });
172
186
  await (0, react_1.act)(async () => {
173
187
  result.current.startNewThread();
174
188
  });
@@ -176,7 +190,7 @@ describe("TamboThreadProvider", () => {
176
190
  expect(result.current.isIdle).toBe(true);
177
191
  });
178
192
  it("should add a message to the thread", async () => {
179
- const { result } = (0, react_1.renderHook)(() => (0, tambo_thread_provider_1.useTamboThread)(), { wrapper });
193
+ const { result } = (0, react_1.renderHook)(() => (0, tambo_thread_provider_1.useTamboThread)(), { wrapper: Wrapper });
180
194
  const testMessage = {
181
195
  id: "test-message-1",
182
196
  content: [{ type: "text", text: "Hello" }],
@@ -194,7 +208,7 @@ describe("TamboThreadProvider", () => {
194
208
  });
195
209
  });
196
210
  it("should update a message in the thread", async () => {
197
- const { result } = (0, react_1.renderHook)(() => (0, tambo_thread_provider_1.useTamboThread)(), { wrapper });
211
+ const { result } = (0, react_1.renderHook)(() => (0, tambo_thread_provider_1.useTamboThread)(), { wrapper: Wrapper });
198
212
  const testMessage = {
199
213
  id: "test-message-1",
200
214
  content: [{ type: "text", text: "Updated message" }],
@@ -228,7 +242,7 @@ describe("TamboThreadProvider", () => {
228
242
  jest
229
243
  .mocked(mockThreadsApi.advanceByID)
230
244
  .mockResolvedValue(mockAdvanceResponse);
231
- const { result } = (0, react_1.renderHook)(() => (0, tambo_thread_provider_1.useTamboThread)(), { wrapper });
245
+ const { result } = (0, react_1.renderHook)(() => (0, tambo_thread_provider_1.useTamboThread)(), { wrapper: Wrapper });
232
246
  await (0, react_1.act)(async () => {
233
247
  await result.current.sendThreadMessage("Hello", {
234
248
  threadId: "test-thread-1",
@@ -279,7 +293,7 @@ describe("TamboThreadProvider", () => {
279
293
  };
280
294
  // Mock advanceStream to return our async iterator
281
295
  jest.mocked(typescript_sdk_1.advanceStream).mockResolvedValue(mockAsyncIterator);
282
- const { result } = (0, react_1.renderHook)(() => (0, tambo_thread_provider_1.useTamboThread)(), { wrapper });
296
+ const { result } = (0, react_1.renderHook)(() => (0, tambo_thread_provider_1.useTamboThread)(), { wrapper: Wrapper });
283
297
  await (0, react_1.act)(async () => {
284
298
  await result.current.sendThreadMessage("Hello", {
285
299
  threadId: "test-thread-1",
@@ -320,7 +334,7 @@ describe("TamboThreadProvider", () => {
320
334
  generationStage: generate_component_response_1.GenerationStage.COMPLETE,
321
335
  mcpAccessToken: "test-mcp-access-token",
322
336
  });
323
- const { result } = (0, react_1.renderHook)(() => (0, tambo_thread_provider_1.useTamboThread)(), { wrapper });
337
+ const { result } = (0, react_1.renderHook)(() => (0, tambo_thread_provider_1.useTamboThread)(), { wrapper: Wrapper });
324
338
  await (0, react_1.act)(async () => {
325
339
  await result.current.sendThreadMessage("Use tool", {
326
340
  threadId: "test-thread-1",
@@ -334,13 +348,24 @@ describe("TamboThreadProvider", () => {
334
348
  const mockOnCallUnregisteredTool = jest
335
349
  .fn()
336
350
  .mockResolvedValue("unregistered-tool-result");
337
- const wrapperWithUnregisteredTool = ({ children, }) => (react_2.default.createElement(tambo_registry_provider_1.TamboRegistryProvider, { components: mockRegistry, onCallUnregisteredTool: mockOnCallUnregisteredTool },
338
- react_2.default.createElement(tambo_context_helpers_provider_1.TamboContextHelpersProvider, { contextHelpers: {
339
- currentTimeContextHelper: () => null,
340
- currentPageContextHelper: () => null,
351
+ const WrapperWithUnregisteredTool = ({ children, }) => {
352
+ const client = (0, tambo_client_provider_1.useTamboClient)();
353
+ const queryClient = (0, tambo_client_provider_1.useTamboQueryClient)();
354
+ return (react_2.default.createElement(tambo_client_provider_1.TamboClientContext.Provider, { value: {
355
+ client,
356
+ queryClient,
357
+ isUpdatingToken: false,
358
+ mcpAccessToken: null,
359
+ setMcpAccessToken: () => { },
341
360
  } },
342
- react_2.default.createElement(tambo_mcp_token_provider_1.TamboMcpTokenProvider, null,
343
- react_2.default.createElement(tambo_thread_provider_1.TamboThreadProvider, { streaming: false }, children)))));
361
+ react_2.default.createElement(tambo_registry_provider_1.TamboRegistryProvider, { components: mockRegistry, onCallUnregisteredTool: mockOnCallUnregisteredTool },
362
+ react_2.default.createElement(tambo_context_helpers_provider_1.TamboContextHelpersProvider, { contextHelpers: {
363
+ currentTimeContextHelper: () => null,
364
+ currentPageContextHelper: () => null,
365
+ } },
366
+ react_2.default.createElement(tambo_mcp_token_provider_1.TamboMcpTokenProvider, null,
367
+ react_2.default.createElement(tambo_thread_provider_1.TamboThreadProvider, { streaming: false }, children))))));
368
+ };
344
369
  const mockUnregisteredToolCallResponse = {
345
370
  responseMessageDto: {
346
371
  id: "unregistered-tool-call-1",
@@ -375,7 +400,7 @@ describe("TamboThreadProvider", () => {
375
400
  mcpAccessToken: "test-mcp-access-token",
376
401
  });
377
402
  const { result } = (0, react_1.renderHook)(() => (0, tambo_thread_provider_1.useTamboThread)(), {
378
- wrapper: wrapperWithUnregisteredTool,
403
+ wrapper: WrapperWithUnregisteredTool,
379
404
  });
380
405
  await (0, react_1.act)(async () => {
381
406
  await result.current.sendThreadMessage("Use unregistered tool", {
@@ -420,7 +445,7 @@ describe("TamboThreadProvider", () => {
420
445
  generationStage: generate_component_response_1.GenerationStage.COMPLETE,
421
446
  mcpAccessToken: "test-mcp-access-token",
422
447
  });
423
- const { result } = (0, react_1.renderHook)(() => (0, tambo_thread_provider_1.useTamboThread)(), { wrapper });
448
+ const { result } = (0, react_1.renderHook)(() => (0, tambo_thread_provider_1.useTamboThread)(), { wrapper: Wrapper });
424
449
  await (0, react_1.act)(async () => {
425
450
  await result.current.sendThreadMessage("Use unregistered tool", {
426
451
  threadId: "test-thread-1",
@@ -433,13 +458,24 @@ describe("TamboThreadProvider", () => {
433
458
  describe("streaming behavior", () => {
434
459
  it("should call advanceStream when streamResponse=true", async () => {
435
460
  // Use wrapper with streaming=true to show that explicit streamResponse=true works
436
- const wrapperWithStreaming = ({ children, }) => (react_2.default.createElement(tambo_registry_provider_1.TamboRegistryProvider, { components: mockRegistry },
437
- react_2.default.createElement(tambo_context_helpers_provider_1.TamboContextHelpersProvider, { contextHelpers: {
438
- currentTimeContextHelper: () => null,
439
- currentPageContextHelper: () => null,
461
+ const WrapperWithStreaming = ({ children, }) => {
462
+ const client = (0, tambo_client_provider_1.useTamboClient)();
463
+ const queryClient = (0, tambo_client_provider_1.useTamboQueryClient)();
464
+ return (react_2.default.createElement(tambo_client_provider_1.TamboClientContext.Provider, { value: {
465
+ client,
466
+ queryClient,
467
+ isUpdatingToken: false,
468
+ mcpAccessToken: null,
469
+ setMcpAccessToken: () => { },
440
470
  } },
441
- react_2.default.createElement(tambo_mcp_token_provider_1.TamboMcpTokenProvider, null,
442
- react_2.default.createElement(tambo_thread_provider_1.TamboThreadProvider, { streaming: true }, children)))));
471
+ react_2.default.createElement(tambo_registry_provider_1.TamboRegistryProvider, { components: mockRegistry },
472
+ react_2.default.createElement(tambo_context_helpers_provider_1.TamboContextHelpersProvider, { contextHelpers: {
473
+ currentTimeContextHelper: () => null,
474
+ currentPageContextHelper: () => null,
475
+ } },
476
+ react_2.default.createElement(tambo_mcp_token_provider_1.TamboMcpTokenProvider, null,
477
+ react_2.default.createElement(tambo_thread_provider_1.TamboThreadProvider, { streaming: true }, children))))));
478
+ };
443
479
  const mockStreamResponse = {
444
480
  responseMessageDto: {
445
481
  id: "stream-response",
@@ -460,7 +496,7 @@ describe("TamboThreadProvider", () => {
460
496
  };
461
497
  jest.mocked(typescript_sdk_1.advanceStream).mockResolvedValue(mockAsyncIterator);
462
498
  const { result } = (0, react_1.renderHook)(() => (0, tambo_thread_provider_1.useTamboThread)(), {
463
- wrapper: wrapperWithStreaming,
499
+ wrapper: WrapperWithStreaming,
464
500
  });
465
501
  await (0, react_1.act)(async () => {
466
502
  await result.current.sendThreadMessage("Hello streaming", {
@@ -495,15 +531,26 @@ describe("TamboThreadProvider", () => {
495
531
  });
496
532
  it("should call advanceById when streamResponse=false for existing thread", async () => {
497
533
  // Use wrapper with streaming=true to show that explicit streamResponse=false overrides provider setting
498
- const wrapperWithStreaming = ({ children, }) => (react_2.default.createElement(tambo_registry_provider_1.TamboRegistryProvider, { components: mockRegistry },
499
- react_2.default.createElement(tambo_context_helpers_provider_1.TamboContextHelpersProvider, { contextHelpers: {
500
- currentTimeContextHelper: () => null,
501
- currentPageContextHelper: () => null,
534
+ const WrapperWithStreaming = ({ children, }) => {
535
+ const client = (0, tambo_client_provider_1.useTamboClient)();
536
+ const queryClient = (0, tambo_client_provider_1.useTamboQueryClient)();
537
+ return (react_2.default.createElement(tambo_client_provider_1.TamboClientContext.Provider, { value: {
538
+ client,
539
+ queryClient,
540
+ isUpdatingToken: false,
541
+ mcpAccessToken: null,
542
+ setMcpAccessToken: () => { },
502
543
  } },
503
- react_2.default.createElement(tambo_mcp_token_provider_1.TamboMcpTokenProvider, null,
504
- react_2.default.createElement(tambo_thread_provider_1.TamboThreadProvider, { streaming: true }, children)))));
544
+ react_2.default.createElement(tambo_registry_provider_1.TamboRegistryProvider, { components: mockRegistry },
545
+ react_2.default.createElement(tambo_context_helpers_provider_1.TamboContextHelpersProvider, { contextHelpers: {
546
+ currentTimeContextHelper: () => null,
547
+ currentPageContextHelper: () => null,
548
+ } },
549
+ react_2.default.createElement(tambo_mcp_token_provider_1.TamboMcpTokenProvider, null,
550
+ react_2.default.createElement(tambo_thread_provider_1.TamboThreadProvider, { streaming: true }, children))))));
551
+ };
505
552
  const { result } = (0, react_1.renderHook)(() => (0, tambo_thread_provider_1.useTamboThread)(), {
506
- wrapper: wrapperWithStreaming,
553
+ wrapper: WrapperWithStreaming,
507
554
  });
508
555
  await (0, react_1.act)(async () => {
509
556
  await result.current.sendThreadMessage("Hello non-streaming", {
@@ -538,15 +585,26 @@ describe("TamboThreadProvider", () => {
538
585
  });
539
586
  it("should call advanceById when streamResponse is undefined and provider streaming=false", async () => {
540
587
  // Use wrapper with streaming=false to test that undefined streamResponse respects provider setting
541
- const wrapperWithoutStreaming = ({ children, }) => (react_2.default.createElement(tambo_registry_provider_1.TamboRegistryProvider, { components: mockRegistry },
542
- react_2.default.createElement(tambo_context_helpers_provider_1.TamboContextHelpersProvider, { contextHelpers: {
543
- currentTimeContextHelper: () => null,
544
- currentPageContextHelper: () => null,
588
+ const WrapperWithoutStreaming = ({ children, }) => {
589
+ const client = (0, tambo_client_provider_1.useTamboClient)();
590
+ const queryClient = (0, tambo_client_provider_1.useTamboQueryClient)();
591
+ return (react_2.default.createElement(tambo_client_provider_1.TamboClientContext.Provider, { value: {
592
+ client,
593
+ queryClient,
594
+ isUpdatingToken: false,
595
+ mcpAccessToken: null,
596
+ setMcpAccessToken: () => { },
545
597
  } },
546
- react_2.default.createElement(tambo_mcp_token_provider_1.TamboMcpTokenProvider, null,
547
- react_2.default.createElement(tambo_thread_provider_1.TamboThreadProvider, { streaming: false }, children)))));
598
+ react_2.default.createElement(tambo_registry_provider_1.TamboRegistryProvider, { components: mockRegistry },
599
+ react_2.default.createElement(tambo_context_helpers_provider_1.TamboContextHelpersProvider, { contextHelpers: {
600
+ currentTimeContextHelper: () => null,
601
+ currentPageContextHelper: () => null,
602
+ } },
603
+ react_2.default.createElement(tambo_mcp_token_provider_1.TamboMcpTokenProvider, null,
604
+ react_2.default.createElement(tambo_thread_provider_1.TamboThreadProvider, { streaming: false }, children))))));
605
+ };
548
606
  const { result } = (0, react_1.renderHook)(() => (0, tambo_thread_provider_1.useTamboThread)(), {
549
- wrapper: wrapperWithoutStreaming,
607
+ wrapper: WrapperWithoutStreaming,
550
608
  });
551
609
  await (0, react_1.act)(async () => {
552
610
  await result.current.sendThreadMessage("Hello default", {
@@ -581,13 +639,24 @@ describe("TamboThreadProvider", () => {
581
639
  });
582
640
  it("should call advanceStream when streamResponse is undefined and provider streaming=true (default)", async () => {
583
641
  // Use wrapper with streaming=true (default) to test that undefined streamResponse respects provider setting
584
- const wrapperWithDefaultStreaming = ({ children, }) => (react_2.default.createElement(tambo_registry_provider_1.TamboRegistryProvider, { components: mockRegistry },
585
- react_2.default.createElement(tambo_context_helpers_provider_1.TamboContextHelpersProvider, { contextHelpers: {
586
- currentTimeContextHelper: () => null,
587
- currentPageContextHelper: () => null,
642
+ const WrapperWithDefaultStreaming = ({ children, }) => {
643
+ const client = (0, tambo_client_provider_1.useTamboClient)();
644
+ const queryClient = (0, tambo_client_provider_1.useTamboQueryClient)();
645
+ return (react_2.default.createElement(tambo_client_provider_1.TamboClientContext.Provider, { value: {
646
+ client,
647
+ queryClient,
648
+ isUpdatingToken: false,
649
+ mcpAccessToken: null,
650
+ setMcpAccessToken: () => { },
588
651
  } },
589
- react_2.default.createElement(tambo_mcp_token_provider_1.TamboMcpTokenProvider, null,
590
- react_2.default.createElement(tambo_thread_provider_1.TamboThreadProvider, null, children)))));
652
+ react_2.default.createElement(tambo_registry_provider_1.TamboRegistryProvider, { components: mockRegistry },
653
+ react_2.default.createElement(tambo_context_helpers_provider_1.TamboContextHelpersProvider, { contextHelpers: {
654
+ currentTimeContextHelper: () => null,
655
+ currentPageContextHelper: () => null,
656
+ } },
657
+ react_2.default.createElement(tambo_mcp_token_provider_1.TamboMcpTokenProvider, null,
658
+ react_2.default.createElement(tambo_thread_provider_1.TamboThreadProvider, null, children))))));
659
+ };
591
660
  const mockStreamResponse = {
592
661
  responseMessageDto: {
593
662
  id: "stream-response",
@@ -608,7 +677,7 @@ describe("TamboThreadProvider", () => {
608
677
  };
609
678
  jest.mocked(typescript_sdk_1.advanceStream).mockResolvedValue(mockAsyncIterator);
610
679
  const { result } = (0, react_1.renderHook)(() => (0, tambo_thread_provider_1.useTamboThread)(), {
611
- wrapper: wrapperWithDefaultStreaming,
680
+ wrapper: WrapperWithDefaultStreaming,
612
681
  });
613
682
  await (0, react_1.act)(async () => {
614
683
  await result.current.sendThreadMessage("Hello default streaming", {
@@ -643,15 +712,26 @@ describe("TamboThreadProvider", () => {
643
712
  });
644
713
  it("should call advance when streamResponse=false for placeholder thread", async () => {
645
714
  // Use wrapper with streaming=true to show that explicit streamResponse=false overrides provider setting
646
- const wrapperWithStreaming = ({ children, }) => (react_2.default.createElement(tambo_registry_provider_1.TamboRegistryProvider, { components: mockRegistry },
647
- react_2.default.createElement(tambo_context_helpers_provider_1.TamboContextHelpersProvider, { contextHelpers: {
648
- currentTimeContextHelper: () => null,
649
- currentPageContextHelper: () => null,
715
+ const WrapperWithStreaming = ({ children, }) => {
716
+ const client = (0, tambo_client_provider_1.useTamboClient)();
717
+ const queryClient = (0, tambo_client_provider_1.useTamboQueryClient)();
718
+ return (react_2.default.createElement(tambo_client_provider_1.TamboClientContext.Provider, { value: {
719
+ client,
720
+ queryClient,
721
+ isUpdatingToken: false,
722
+ mcpAccessToken: null,
723
+ setMcpAccessToken: () => { },
650
724
  } },
651
- react_2.default.createElement(tambo_mcp_token_provider_1.TamboMcpTokenProvider, null,
652
- react_2.default.createElement(tambo_thread_provider_1.TamboThreadProvider, { streaming: true }, children)))));
725
+ react_2.default.createElement(tambo_registry_provider_1.TamboRegistryProvider, { components: mockRegistry },
726
+ react_2.default.createElement(tambo_context_helpers_provider_1.TamboContextHelpersProvider, { contextHelpers: {
727
+ currentTimeContextHelper: () => null,
728
+ currentPageContextHelper: () => null,
729
+ } },
730
+ react_2.default.createElement(tambo_mcp_token_provider_1.TamboMcpTokenProvider, null,
731
+ react_2.default.createElement(tambo_thread_provider_1.TamboThreadProvider, { streaming: true }, children))))));
732
+ };
653
733
  const { result } = (0, react_1.renderHook)(() => (0, tambo_thread_provider_1.useTamboThread)(), {
654
- wrapper: wrapperWithStreaming,
734
+ wrapper: WrapperWithStreaming,
655
735
  });
656
736
  // Start with placeholder thread (which is the default state)
657
737
  expect(result.current.thread.id).toBe("placeholder");
@@ -688,13 +768,24 @@ describe("TamboThreadProvider", () => {
688
768
  });
689
769
  it("should call advanceStream when streamResponse=true for placeholder thread", async () => {
690
770
  // Use wrapper with streaming=false to show that explicit streamResponse=true overrides provider setting
691
- const wrapperWithoutStreaming = ({ children, }) => (react_2.default.createElement(tambo_registry_provider_1.TamboRegistryProvider, { components: mockRegistry },
692
- react_2.default.createElement(tambo_context_helpers_provider_1.TamboContextHelpersProvider, { contextHelpers: {
693
- currentTimeContextHelper: () => null,
694
- currentPageContextHelper: () => null,
771
+ const WrapperWithoutStreaming = ({ children, }) => {
772
+ const client = (0, tambo_client_provider_1.useTamboClient)();
773
+ const queryClient = (0, tambo_client_provider_1.useTamboQueryClient)();
774
+ return (react_2.default.createElement(tambo_client_provider_1.TamboClientContext.Provider, { value: {
775
+ client,
776
+ queryClient,
777
+ isUpdatingToken: false,
778
+ mcpAccessToken: null,
779
+ setMcpAccessToken: () => { },
695
780
  } },
696
- react_2.default.createElement(tambo_mcp_token_provider_1.TamboMcpTokenProvider, null,
697
- react_2.default.createElement(tambo_thread_provider_1.TamboThreadProvider, { streaming: false }, children)))));
781
+ react_2.default.createElement(tambo_registry_provider_1.TamboRegistryProvider, { components: mockRegistry },
782
+ react_2.default.createElement(tambo_context_helpers_provider_1.TamboContextHelpersProvider, { contextHelpers: {
783
+ currentTimeContextHelper: () => null,
784
+ currentPageContextHelper: () => null,
785
+ } },
786
+ react_2.default.createElement(tambo_mcp_token_provider_1.TamboMcpTokenProvider, null,
787
+ react_2.default.createElement(tambo_thread_provider_1.TamboThreadProvider, { streaming: false }, children))))));
788
+ };
698
789
  const mockStreamResponse = {
699
790
  responseMessageDto: {
700
791
  id: "stream-response",
@@ -715,7 +806,7 @@ describe("TamboThreadProvider", () => {
715
806
  };
716
807
  jest.mocked(typescript_sdk_1.advanceStream).mockResolvedValue(mockAsyncIterator);
717
808
  const { result } = (0, react_1.renderHook)(() => (0, tambo_thread_provider_1.useTamboThread)(), {
718
- wrapper: wrapperWithoutStreaming,
809
+ wrapper: WrapperWithoutStreaming,
719
810
  });
720
811
  // Start with placeholder thread (which is the default state)
721
812
  expect(result.current.thread.id).toBe("placeholder");
@@ -756,7 +847,9 @@ describe("TamboThreadProvider", () => {
756
847
  const testError = new Error("API call failed");
757
848
  // Mock advanceById to throw an error
758
849
  jest.mocked(mockThreadsApi.advanceByID).mockRejectedValue(testError);
759
- const { result } = (0, react_1.renderHook)(() => (0, tambo_thread_provider_1.useTamboThread)(), { wrapper });
850
+ const { result } = (0, react_1.renderHook)(() => (0, tambo_thread_provider_1.useTamboThread)(), {
851
+ wrapper: Wrapper,
852
+ });
760
853
  // Expect the error to be thrown
761
854
  await (0, react_1.act)(async () => {
762
855
  await result.current.switchCurrentThread("test-thread-1");
@@ -772,7 +865,9 @@ describe("TamboThreadProvider", () => {
772
865
  const testError = new Error("Streaming API call failed");
773
866
  // Mock advanceStream to throw an error
774
867
  jest.mocked(typescript_sdk_1.advanceStream).mockRejectedValue(testError);
775
- const { result } = (0, react_1.renderHook)(() => (0, tambo_thread_provider_1.useTamboThread)(), { wrapper });
868
+ const { result } = (0, react_1.renderHook)(() => (0, tambo_thread_provider_1.useTamboThread)(), {
869
+ wrapper: Wrapper,
870
+ });
776
871
  // Expect the error to be thrown
777
872
  await (0, react_1.act)(async () => {
778
873
  await result.current.switchCurrentThread("test-thread-1");
@@ -788,7 +883,9 @@ describe("TamboThreadProvider", () => {
788
883
  const testError = new Error("Advance API call failed");
789
884
  // Mock advance to throw an error
790
885
  jest.mocked(mockThreadsApi.advance).mockRejectedValue(testError);
791
- const { result } = (0, react_1.renderHook)(() => (0, tambo_thread_provider_1.useTamboThread)(), { wrapper });
886
+ const { result } = (0, react_1.renderHook)(() => (0, tambo_thread_provider_1.useTamboThread)(), {
887
+ wrapper: Wrapper,
888
+ });
792
889
  // Start with placeholder thread (which is the default state)
793
890
  expect(result.current.thread.id).toBe("placeholder");
794
891
  // Expect the error to be thrown
@@ -804,7 +901,9 @@ describe("TamboThreadProvider", () => {
804
901
  });
805
902
  describe("refetch threads list behavior", () => {
806
903
  it("should refetch threads list when creating a new thread via sendThreadMessage", async () => {
807
- const { result } = (0, react_1.renderHook)(() => (0, tambo_thread_provider_1.useTamboThread)(), { wrapper });
904
+ const { result } = (0, react_1.renderHook)(() => (0, tambo_thread_provider_1.useTamboThread)(), {
905
+ wrapper: Wrapper,
906
+ });
808
907
  // Mock the advance response to return a new thread ID
809
908
  const mockAdvanceResponse = {
810
909
  responseMessageDto: {
@@ -840,7 +939,9 @@ describe("TamboThreadProvider", () => {
840
939
  });
841
940
  });
842
941
  it("should not refetch threads list when switching between existing threads", async () => {
843
- const { result } = (0, react_1.renderHook)(() => (0, tambo_thread_provider_1.useTamboThread)(), { wrapper });
942
+ const { result } = (0, react_1.renderHook)(() => (0, tambo_thread_provider_1.useTamboThread)(), {
943
+ wrapper: Wrapper,
944
+ });
844
945
  // Start with placeholder thread
845
946
  expect(result.current.thread.id).toBe("placeholder");
846
947
  // Clear any previous mock calls
@@ -892,13 +993,24 @@ describe("TamboThreadProvider", () => {
892
993
  ],
893
994
  },
894
995
  ];
895
- const wrapperWithCustomTool = ({ children, }) => (react_2.default.createElement(tambo_registry_provider_1.TamboRegistryProvider, { components: customToolRegistry },
896
- react_2.default.createElement(tambo_context_helpers_provider_1.TamboContextHelpersProvider, { contextHelpers: {
897
- currentTimeContextHelper: () => null,
898
- currentPageContextHelper: () => null,
996
+ const WrapperWithCustomTool = ({ children, }) => {
997
+ const client = (0, tambo_client_provider_1.useTamboClient)();
998
+ const queryClient = (0, tambo_client_provider_1.useTamboQueryClient)();
999
+ return (react_2.default.createElement(tambo_client_provider_1.TamboClientContext.Provider, { value: {
1000
+ client,
1001
+ queryClient,
1002
+ isUpdatingToken: false,
1003
+ mcpAccessToken: null,
1004
+ setMcpAccessToken: () => { },
899
1005
  } },
900
- react_2.default.createElement(tambo_mcp_token_provider_1.TamboMcpTokenProvider, null,
901
- react_2.default.createElement(tambo_thread_provider_1.TamboThreadProvider, { streaming: false }, children)))));
1006
+ react_2.default.createElement(tambo_registry_provider_1.TamboRegistryProvider, { components: customToolRegistry },
1007
+ react_2.default.createElement(tambo_context_helpers_provider_1.TamboContextHelpersProvider, { contextHelpers: {
1008
+ currentTimeContextHelper: () => null,
1009
+ currentPageContextHelper: () => null,
1010
+ } },
1011
+ react_2.default.createElement(tambo_mcp_token_provider_1.TamboMcpTokenProvider, null,
1012
+ react_2.default.createElement(tambo_thread_provider_1.TamboThreadProvider, { streaming: false }, children))))));
1013
+ };
902
1014
  const mockToolCallResponse = {
903
1015
  responseMessageDto: {
904
1016
  id: "tool-call-1",
@@ -931,7 +1043,7 @@ describe("TamboThreadProvider", () => {
931
1043
  mcpAccessToken: "test-mcp-access-token",
932
1044
  });
933
1045
  const { result } = (0, react_1.renderHook)(() => (0, tambo_thread_provider_1.useTamboThread)(), {
934
- wrapper: wrapperWithCustomTool,
1046
+ wrapper: WrapperWithCustomTool,
935
1047
  });
936
1048
  await (0, react_1.act)(async () => {
937
1049
  await result.current.sendThreadMessage("Use custom tool", {
@@ -986,13 +1098,24 @@ describe("TamboThreadProvider", () => {
986
1098
  ],
987
1099
  },
988
1100
  ];
989
- const wrapperWithAsyncTool = ({ children, }) => (react_2.default.createElement(tambo_registry_provider_1.TamboRegistryProvider, { components: customToolRegistry },
990
- react_2.default.createElement(tambo_context_helpers_provider_1.TamboContextHelpersProvider, { contextHelpers: {
991
- currentTimeContextHelper: () => null,
992
- currentPageContextHelper: () => null,
1101
+ const WrapperWithAsyncTool = ({ children, }) => {
1102
+ const client = (0, tambo_client_provider_1.useTamboClient)();
1103
+ const queryClient = (0, tambo_client_provider_1.useTamboQueryClient)();
1104
+ return (react_2.default.createElement(tambo_client_provider_1.TamboClientContext.Provider, { value: {
1105
+ client,
1106
+ queryClient,
1107
+ isUpdatingToken: false,
1108
+ mcpAccessToken: null,
1109
+ setMcpAccessToken: () => { },
993
1110
  } },
994
- react_2.default.createElement(tambo_mcp_token_provider_1.TamboMcpTokenProvider, null,
995
- react_2.default.createElement(tambo_thread_provider_1.TamboThreadProvider, { streaming: true }, children)))));
1111
+ react_2.default.createElement(tambo_registry_provider_1.TamboRegistryProvider, { components: customToolRegistry },
1112
+ react_2.default.createElement(tambo_context_helpers_provider_1.TamboContextHelpersProvider, { contextHelpers: {
1113
+ currentTimeContextHelper: () => null,
1114
+ currentPageContextHelper: () => null,
1115
+ } },
1116
+ react_2.default.createElement(tambo_mcp_token_provider_1.TamboMcpTokenProvider, null,
1117
+ react_2.default.createElement(tambo_thread_provider_1.TamboThreadProvider, { streaming: true }, children))))));
1118
+ };
996
1119
  const mockToolCallChunk = {
997
1120
  responseMessageDto: {
998
1121
  id: "tool-call-chunk",
@@ -1038,7 +1161,7 @@ describe("TamboThreadProvider", () => {
1038
1161
  },
1039
1162
  });
1040
1163
  const { result } = (0, react_1.renderHook)(() => (0, tambo_thread_provider_1.useTamboThread)(), {
1041
- wrapper: wrapperWithAsyncTool,
1164
+ wrapper: WrapperWithAsyncTool,
1042
1165
  });
1043
1166
  await (0, react_1.act)(async () => {
1044
1167
  await result.current.sendThreadMessage("Use async tool", {
@@ -1088,13 +1211,24 @@ describe("TamboThreadProvider", () => {
1088
1211
  ],
1089
1212
  },
1090
1213
  ];
1091
- const wrapperWithoutTransform = ({ children, }) => (react_2.default.createElement(tambo_registry_provider_1.TamboRegistryProvider, { components: toolWithoutTransform },
1092
- react_2.default.createElement(tambo_context_helpers_provider_1.TamboContextHelpersProvider, { contextHelpers: {
1093
- currentTimeContextHelper: () => null,
1094
- currentPageContextHelper: () => null,
1214
+ const WrapperWithoutTransform = ({ children, }) => {
1215
+ const client = (0, tambo_client_provider_1.useTamboClient)();
1216
+ const queryClient = (0, tambo_client_provider_1.useTamboQueryClient)();
1217
+ return (react_2.default.createElement(tambo_client_provider_1.TamboClientContext.Provider, { value: {
1218
+ client,
1219
+ queryClient,
1220
+ isUpdatingToken: false,
1221
+ mcpAccessToken: null,
1222
+ setMcpAccessToken: () => { },
1095
1223
  } },
1096
- react_2.default.createElement(tambo_mcp_token_provider_1.TamboMcpTokenProvider, null,
1097
- react_2.default.createElement(tambo_thread_provider_1.TamboThreadProvider, { streaming: false }, children)))));
1224
+ react_2.default.createElement(tambo_registry_provider_1.TamboRegistryProvider, { components: toolWithoutTransform },
1225
+ react_2.default.createElement(tambo_context_helpers_provider_1.TamboContextHelpersProvider, { contextHelpers: {
1226
+ currentTimeContextHelper: () => null,
1227
+ currentPageContextHelper: () => null,
1228
+ } },
1229
+ react_2.default.createElement(tambo_mcp_token_provider_1.TamboMcpTokenProvider, null,
1230
+ react_2.default.createElement(tambo_thread_provider_1.TamboThreadProvider, { streaming: false }, children))))));
1231
+ };
1098
1232
  const mockToolCallResponse = {
1099
1233
  responseMessageDto: {
1100
1234
  id: "tool-call-1",
@@ -1127,7 +1261,7 @@ describe("TamboThreadProvider", () => {
1127
1261
  mcpAccessToken: "test-mcp-access-token",
1128
1262
  });
1129
1263
  const { result } = (0, react_1.renderHook)(() => (0, tambo_thread_provider_1.useTamboThread)(), {
1130
- wrapper: wrapperWithoutTransform,
1264
+ wrapper: WrapperWithoutTransform,
1131
1265
  });
1132
1266
  await (0, react_1.act)(async () => {
1133
1267
  await result.current.sendThreadMessage("Use tool without transform", {
@@ -1176,13 +1310,24 @@ describe("TamboThreadProvider", () => {
1176
1310
  ],
1177
1311
  },
1178
1312
  ];
1179
- const wrapperWithErrorTool = ({ children, }) => (react_2.default.createElement(tambo_registry_provider_1.TamboRegistryProvider, { components: toolWithTransform },
1180
- react_2.default.createElement(tambo_context_helpers_provider_1.TamboContextHelpersProvider, { contextHelpers: {
1181
- currentTimeContextHelper: () => null,
1182
- currentPageContextHelper: () => null,
1313
+ const WrapperWithErrorTool = ({ children, }) => {
1314
+ const client = (0, tambo_client_provider_1.useTamboClient)();
1315
+ const queryClient = (0, tambo_client_provider_1.useTamboQueryClient)();
1316
+ return (react_2.default.createElement(tambo_client_provider_1.TamboClientContext.Provider, { value: {
1317
+ client,
1318
+ queryClient,
1319
+ isUpdatingToken: false,
1320
+ mcpAccessToken: null,
1321
+ setMcpAccessToken: () => { },
1183
1322
  } },
1184
- react_2.default.createElement(tambo_mcp_token_provider_1.TamboMcpTokenProvider, null,
1185
- react_2.default.createElement(tambo_thread_provider_1.TamboThreadProvider, { streaming: false }, children)))));
1323
+ react_2.default.createElement(tambo_registry_provider_1.TamboRegistryProvider, { components: toolWithTransform },
1324
+ react_2.default.createElement(tambo_context_helpers_provider_1.TamboContextHelpersProvider, { contextHelpers: {
1325
+ currentTimeContextHelper: () => null,
1326
+ currentPageContextHelper: () => null,
1327
+ } },
1328
+ react_2.default.createElement(tambo_mcp_token_provider_1.TamboMcpTokenProvider, null,
1329
+ react_2.default.createElement(tambo_thread_provider_1.TamboThreadProvider, { streaming: false }, children))))));
1330
+ };
1186
1331
  const mockToolCallResponse = {
1187
1332
  responseMessageDto: {
1188
1333
  id: "tool-call-1",
@@ -1215,7 +1360,7 @@ describe("TamboThreadProvider", () => {
1215
1360
  mcpAccessToken: "test-mcp-access-token",
1216
1361
  });
1217
1362
  const { result } = (0, react_1.renderHook)(() => (0, tambo_thread_provider_1.useTamboThread)(), {
1218
- wrapper: wrapperWithErrorTool,
1363
+ wrapper: WrapperWithErrorTool,
1219
1364
  });
1220
1365
  await (0, react_1.act)(async () => {
1221
1366
  await result.current.sendThreadMessage("Use error tool", {
@@ -1243,15 +1388,26 @@ describe("TamboThreadProvider", () => {
1243
1388
  });
1244
1389
  describe("auto-generate thread name", () => {
1245
1390
  it("should auto-generate thread name after reaching threshold", async () => {
1246
- const wrapperWithAutoGenerate = ({ children, }) => (react_2.default.createElement(tambo_registry_provider_1.TamboRegistryProvider, { components: mockRegistry },
1247
- react_2.default.createElement(tambo_context_helpers_provider_1.TamboContextHelpersProvider, { contextHelpers: {
1248
- currentTimeContextHelper: () => null,
1249
- currentPageContextHelper: () => null,
1391
+ const WrapperWithAutoGenerate = ({ children, }) => {
1392
+ const client = (0, tambo_client_provider_1.useTamboClient)();
1393
+ const queryClient = (0, tambo_client_provider_1.useTamboQueryClient)();
1394
+ return (react_2.default.createElement(tambo_client_provider_1.TamboClientContext.Provider, { value: {
1395
+ client,
1396
+ queryClient,
1397
+ isUpdatingToken: false,
1398
+ mcpAccessToken: null,
1399
+ setMcpAccessToken: () => { },
1250
1400
  } },
1251
- react_2.default.createElement(tambo_mcp_token_provider_1.TamboMcpTokenProvider, null,
1252
- react_2.default.createElement(tambo_thread_provider_1.TamboThreadProvider, { streaming: false, autoGenerateNameThreshold: 2 }, children)))));
1401
+ react_2.default.createElement(tambo_registry_provider_1.TamboRegistryProvider, { components: mockRegistry },
1402
+ react_2.default.createElement(tambo_context_helpers_provider_1.TamboContextHelpersProvider, { contextHelpers: {
1403
+ currentTimeContextHelper: () => null,
1404
+ currentPageContextHelper: () => null,
1405
+ } },
1406
+ react_2.default.createElement(tambo_mcp_token_provider_1.TamboMcpTokenProvider, null,
1407
+ react_2.default.createElement(tambo_thread_provider_1.TamboThreadProvider, { streaming: false, autoGenerateNameThreshold: 2 }, children))))));
1408
+ };
1253
1409
  const { result } = (0, react_1.renderHook)(() => (0, tambo_thread_provider_1.useTamboThread)(), {
1254
- wrapper: wrapperWithAutoGenerate,
1410
+ wrapper: WrapperWithAutoGenerate,
1255
1411
  });
1256
1412
  const existingThread = createMockThread({
1257
1413
  id: "test-thread-1",
@@ -1288,15 +1444,26 @@ describe("TamboThreadProvider", () => {
1288
1444
  expect(mockQueryClient.setQueryData).toHaveBeenCalledWith(["threads", "test-project-id", undefined], expect.any(Function));
1289
1445
  });
1290
1446
  it("should NOT auto-generate when autoGenerateThreadName is false", async () => {
1291
- const wrapperWithDisabled = ({ children, }) => (react_2.default.createElement(tambo_registry_provider_1.TamboRegistryProvider, { components: mockRegistry },
1292
- react_2.default.createElement(tambo_context_helpers_provider_1.TamboContextHelpersProvider, { contextHelpers: {
1293
- currentTimeContextHelper: () => null,
1294
- currentPageContextHelper: () => null,
1447
+ const WrapperWithDisabled = ({ children, }) => {
1448
+ const client = (0, tambo_client_provider_1.useTamboClient)();
1449
+ const queryClient = (0, tambo_client_provider_1.useTamboQueryClient)();
1450
+ return (react_2.default.createElement(tambo_client_provider_1.TamboClientContext.Provider, { value: {
1451
+ client,
1452
+ queryClient,
1453
+ isUpdatingToken: false,
1454
+ mcpAccessToken: null,
1455
+ setMcpAccessToken: () => { },
1295
1456
  } },
1296
- react_2.default.createElement(tambo_mcp_token_provider_1.TamboMcpTokenProvider, null,
1297
- react_2.default.createElement(tambo_thread_provider_1.TamboThreadProvider, { streaming: false, autoGenerateThreadName: false, autoGenerateNameThreshold: 2 }, children)))));
1457
+ react_2.default.createElement(tambo_registry_provider_1.TamboRegistryProvider, { components: mockRegistry },
1458
+ react_2.default.createElement(tambo_context_helpers_provider_1.TamboContextHelpersProvider, { contextHelpers: {
1459
+ currentTimeContextHelper: () => null,
1460
+ currentPageContextHelper: () => null,
1461
+ } },
1462
+ react_2.default.createElement(tambo_mcp_token_provider_1.TamboMcpTokenProvider, null,
1463
+ react_2.default.createElement(tambo_thread_provider_1.TamboThreadProvider, { streaming: false, autoGenerateThreadName: false, autoGenerateNameThreshold: 2 }, children))))));
1464
+ };
1298
1465
  const { result } = (0, react_1.renderHook)(() => (0, tambo_thread_provider_1.useTamboThread)(), {
1299
- wrapper: wrapperWithDisabled,
1466
+ wrapper: WrapperWithDisabled,
1300
1467
  });
1301
1468
  const existingThread = createMockThread({
1302
1469
  id: "test-thread-1",
@@ -1329,15 +1496,26 @@ describe("TamboThreadProvider", () => {
1329
1496
  expect(mockThreadsApi.generateName).not.toHaveBeenCalled();
1330
1497
  });
1331
1498
  it("should NOT auto-generate when thread already has a name", async () => {
1332
- const wrapperWithAutoGenerate = ({ children, }) => (react_2.default.createElement(tambo_registry_provider_1.TamboRegistryProvider, { components: mockRegistry },
1333
- react_2.default.createElement(tambo_context_helpers_provider_1.TamboContextHelpersProvider, { contextHelpers: {
1334
- currentTimeContextHelper: () => null,
1335
- currentPageContextHelper: () => null,
1499
+ const WrapperWithAutoGenerate = ({ children, }) => {
1500
+ const client = (0, tambo_client_provider_1.useTamboClient)();
1501
+ const queryClient = (0, tambo_client_provider_1.useTamboQueryClient)();
1502
+ return (react_2.default.createElement(tambo_client_provider_1.TamboClientContext.Provider, { value: {
1503
+ client,
1504
+ queryClient,
1505
+ isUpdatingToken: false,
1506
+ mcpAccessToken: null,
1507
+ setMcpAccessToken: () => { },
1336
1508
  } },
1337
- react_2.default.createElement(tambo_mcp_token_provider_1.TamboMcpTokenProvider, null,
1338
- react_2.default.createElement(tambo_thread_provider_1.TamboThreadProvider, { streaming: false, autoGenerateNameThreshold: 2 }, children)))));
1509
+ react_2.default.createElement(tambo_registry_provider_1.TamboRegistryProvider, { components: mockRegistry },
1510
+ react_2.default.createElement(tambo_context_helpers_provider_1.TamboContextHelpersProvider, { contextHelpers: {
1511
+ currentTimeContextHelper: () => null,
1512
+ currentPageContextHelper: () => null,
1513
+ } },
1514
+ react_2.default.createElement(tambo_mcp_token_provider_1.TamboMcpTokenProvider, null,
1515
+ react_2.default.createElement(tambo_thread_provider_1.TamboThreadProvider, { streaming: false, autoGenerateNameThreshold: 2 }, children))))));
1516
+ };
1339
1517
  const { result } = (0, react_1.renderHook)(() => (0, tambo_thread_provider_1.useTamboThread)(), {
1340
- wrapper: wrapperWithAutoGenerate,
1518
+ wrapper: WrapperWithAutoGenerate,
1341
1519
  });
1342
1520
  const threadWithName = createMockThread({
1343
1521
  id: "test-thread-1",
@@ -1375,15 +1553,26 @@ describe("TamboThreadProvider", () => {
1375
1553
  expect(mockThreadsApi.generateName).not.toHaveBeenCalled();
1376
1554
  });
1377
1555
  it("should NOT auto-generate for placeholder thread", async () => {
1378
- const wrapperWithAutoGenerate = ({ children, }) => (react_2.default.createElement(tambo_registry_provider_1.TamboRegistryProvider, { components: mockRegistry },
1379
- react_2.default.createElement(tambo_context_helpers_provider_1.TamboContextHelpersProvider, { contextHelpers: {
1380
- currentTimeContextHelper: () => null,
1381
- currentPageContextHelper: () => null,
1556
+ const WrapperWithAutoGenerate = ({ children, }) => {
1557
+ const client = (0, tambo_client_provider_1.useTamboClient)();
1558
+ const queryClient = (0, tambo_client_provider_1.useTamboQueryClient)();
1559
+ return (react_2.default.createElement(tambo_client_provider_1.TamboClientContext.Provider, { value: {
1560
+ client,
1561
+ queryClient,
1562
+ isUpdatingToken: false,
1563
+ mcpAccessToken: null,
1564
+ setMcpAccessToken: () => { },
1382
1565
  } },
1383
- react_2.default.createElement(tambo_mcp_token_provider_1.TamboMcpTokenProvider, null,
1384
- react_2.default.createElement(tambo_thread_provider_1.TamboThreadProvider, { streaming: false, autoGenerateNameThreshold: 2 }, children)))));
1566
+ react_2.default.createElement(tambo_registry_provider_1.TamboRegistryProvider, { components: mockRegistry },
1567
+ react_2.default.createElement(tambo_context_helpers_provider_1.TamboContextHelpersProvider, { contextHelpers: {
1568
+ currentTimeContextHelper: () => null,
1569
+ currentPageContextHelper: () => null,
1570
+ } },
1571
+ react_2.default.createElement(tambo_mcp_token_provider_1.TamboMcpTokenProvider, null,
1572
+ react_2.default.createElement(tambo_thread_provider_1.TamboThreadProvider, { streaming: false, autoGenerateNameThreshold: 2 }, children))))));
1573
+ };
1385
1574
  const { result } = (0, react_1.renderHook)(() => (0, tambo_thread_provider_1.useTamboThread)(), {
1386
- wrapper: wrapperWithAutoGenerate,
1575
+ wrapper: WrapperWithAutoGenerate,
1387
1576
  });
1388
1577
  // Stay on placeholder thread
1389
1578
  expect(result.current.thread.id).toBe("placeholder");