@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
@@ -4,7 +4,7 @@ import React from "react";
4
4
  import { z } from "zod";
5
5
  import { GenerationStage, } from "../../model/generate-component-response";
6
6
  import { serializeRegistry } from "../../testing/tools";
7
- import { useTamboClient, useTamboQueryClient } from "../tambo-client-provider";
7
+ import { TamboClientContext, useTamboClient, useTamboQueryClient, } from "../tambo-client-provider";
8
8
  import { TamboContextHelpersProvider } from "../tambo-context-helpers-provider";
9
9
  import { TamboMcpTokenProvider } from "../tambo-mcp-token-provider";
10
10
  import { TamboRegistryProvider } from "../tambo-registry-provider";
@@ -16,10 +16,13 @@ Object.defineProperty(global, "crypto", {
16
16
  },
17
17
  });
18
18
  // Mock the required providers
19
- jest.mock("../tambo-client-provider", () => ({
20
- useTamboClient: jest.fn(),
21
- useTamboQueryClient: jest.fn(),
22
- }));
19
+ jest.mock("../tambo-client-provider", () => {
20
+ return {
21
+ useTamboClient: jest.fn(),
22
+ useTamboQueryClient: jest.fn(),
23
+ TamboClientContext: React.createContext(undefined),
24
+ };
25
+ });
23
26
  jest.mock("@tambo-ai/typescript-sdk", () => ({
24
27
  advanceStream: jest.fn(),
25
28
  }));
@@ -108,13 +111,24 @@ describe("TamboThreadProvider", () => {
108
111
  },
109
112
  ];
110
113
  // Use helpers that explicitly return null so they don't appear in additionalContext
111
- const wrapper = ({ children }) => (React.createElement(TamboRegistryProvider, { components: mockRegistry },
112
- React.createElement(TamboContextHelpersProvider, { contextHelpers: {
113
- currentTimeContextHelper: () => null,
114
- currentPageContextHelper: () => null,
114
+ const Wrapper = ({ children }) => {
115
+ const client = useTamboClient();
116
+ const queryClient = useTamboQueryClient();
117
+ return (React.createElement(TamboClientContext.Provider, { value: {
118
+ client,
119
+ queryClient,
120
+ isUpdatingToken: false,
121
+ mcpAccessToken: null,
122
+ setMcpAccessToken: () => { },
115
123
  } },
116
- React.createElement(TamboMcpTokenProvider, null,
117
- React.createElement(TamboThreadProvider, { streaming: false }, children)))));
124
+ React.createElement(TamboRegistryProvider, { components: mockRegistry },
125
+ React.createElement(TamboContextHelpersProvider, { contextHelpers: {
126
+ currentTimeContextHelper: () => null,
127
+ currentPageContextHelper: () => null,
128
+ } },
129
+ React.createElement(TamboMcpTokenProvider, null,
130
+ React.createElement(TamboThreadProvider, { streaming: false }, children))))));
131
+ };
118
132
  beforeEach(() => {
119
133
  jest.clearAllMocks();
120
134
  // Setup mock query client
@@ -149,13 +163,13 @@ describe("TamboThreadProvider", () => {
149
163
  jest.mocked(useTamboClient).mockReturnValue(mockTamboAI);
150
164
  });
151
165
  it("should initialize with placeholder thread", () => {
152
- const { result } = renderHook(() => useTamboThread(), { wrapper });
166
+ const { result } = renderHook(() => useTamboThread(), { wrapper: Wrapper });
153
167
  expect(result.current.thread.id).toBe("placeholder");
154
168
  expect(result.current.isIdle).toBe(true);
155
169
  expect(result.current.generationStage).toBe(GenerationStage.IDLE);
156
170
  });
157
171
  it("should switch to a new thread", async () => {
158
- const { result } = renderHook(() => useTamboThread(), { wrapper });
172
+ const { result } = renderHook(() => useTamboThread(), { wrapper: Wrapper });
159
173
  await act(async () => {
160
174
  await result.current.switchCurrentThread("test-thread-1");
161
175
  });
@@ -163,7 +177,7 @@ describe("TamboThreadProvider", () => {
163
177
  expect(result.current.thread.id).toBe("test-thread-1");
164
178
  });
165
179
  it("should start a new thread", async () => {
166
- const { result } = renderHook(() => useTamboThread(), { wrapper });
180
+ const { result } = renderHook(() => useTamboThread(), { wrapper: Wrapper });
167
181
  await act(async () => {
168
182
  result.current.startNewThread();
169
183
  });
@@ -171,7 +185,7 @@ describe("TamboThreadProvider", () => {
171
185
  expect(result.current.isIdle).toBe(true);
172
186
  });
173
187
  it("should add a message to the thread", async () => {
174
- const { result } = renderHook(() => useTamboThread(), { wrapper });
188
+ const { result } = renderHook(() => useTamboThread(), { wrapper: Wrapper });
175
189
  const testMessage = {
176
190
  id: "test-message-1",
177
191
  content: [{ type: "text", text: "Hello" }],
@@ -189,7 +203,7 @@ describe("TamboThreadProvider", () => {
189
203
  });
190
204
  });
191
205
  it("should update a message in the thread", async () => {
192
- const { result } = renderHook(() => useTamboThread(), { wrapper });
206
+ const { result } = renderHook(() => useTamboThread(), { wrapper: Wrapper });
193
207
  const testMessage = {
194
208
  id: "test-message-1",
195
209
  content: [{ type: "text", text: "Updated message" }],
@@ -223,7 +237,7 @@ describe("TamboThreadProvider", () => {
223
237
  jest
224
238
  .mocked(mockThreadsApi.advanceByID)
225
239
  .mockResolvedValue(mockAdvanceResponse);
226
- const { result } = renderHook(() => useTamboThread(), { wrapper });
240
+ const { result } = renderHook(() => useTamboThread(), { wrapper: Wrapper });
227
241
  await act(async () => {
228
242
  await result.current.sendThreadMessage("Hello", {
229
243
  threadId: "test-thread-1",
@@ -274,7 +288,7 @@ describe("TamboThreadProvider", () => {
274
288
  };
275
289
  // Mock advanceStream to return our async iterator
276
290
  jest.mocked(advanceStream).mockResolvedValue(mockAsyncIterator);
277
- const { result } = renderHook(() => useTamboThread(), { wrapper });
291
+ const { result } = renderHook(() => useTamboThread(), { wrapper: Wrapper });
278
292
  await act(async () => {
279
293
  await result.current.sendThreadMessage("Hello", {
280
294
  threadId: "test-thread-1",
@@ -315,7 +329,7 @@ describe("TamboThreadProvider", () => {
315
329
  generationStage: GenerationStage.COMPLETE,
316
330
  mcpAccessToken: "test-mcp-access-token",
317
331
  });
318
- const { result } = renderHook(() => useTamboThread(), { wrapper });
332
+ const { result } = renderHook(() => useTamboThread(), { wrapper: Wrapper });
319
333
  await act(async () => {
320
334
  await result.current.sendThreadMessage("Use tool", {
321
335
  threadId: "test-thread-1",
@@ -329,13 +343,24 @@ describe("TamboThreadProvider", () => {
329
343
  const mockOnCallUnregisteredTool = jest
330
344
  .fn()
331
345
  .mockResolvedValue("unregistered-tool-result");
332
- const wrapperWithUnregisteredTool = ({ children, }) => (React.createElement(TamboRegistryProvider, { components: mockRegistry, onCallUnregisteredTool: mockOnCallUnregisteredTool },
333
- React.createElement(TamboContextHelpersProvider, { contextHelpers: {
334
- currentTimeContextHelper: () => null,
335
- currentPageContextHelper: () => null,
346
+ const WrapperWithUnregisteredTool = ({ children, }) => {
347
+ const client = useTamboClient();
348
+ const queryClient = useTamboQueryClient();
349
+ return (React.createElement(TamboClientContext.Provider, { value: {
350
+ client,
351
+ queryClient,
352
+ isUpdatingToken: false,
353
+ mcpAccessToken: null,
354
+ setMcpAccessToken: () => { },
336
355
  } },
337
- React.createElement(TamboMcpTokenProvider, null,
338
- React.createElement(TamboThreadProvider, { streaming: false }, children)))));
356
+ React.createElement(TamboRegistryProvider, { components: mockRegistry, onCallUnregisteredTool: mockOnCallUnregisteredTool },
357
+ React.createElement(TamboContextHelpersProvider, { contextHelpers: {
358
+ currentTimeContextHelper: () => null,
359
+ currentPageContextHelper: () => null,
360
+ } },
361
+ React.createElement(TamboMcpTokenProvider, null,
362
+ React.createElement(TamboThreadProvider, { streaming: false }, children))))));
363
+ };
339
364
  const mockUnregisteredToolCallResponse = {
340
365
  responseMessageDto: {
341
366
  id: "unregistered-tool-call-1",
@@ -370,7 +395,7 @@ describe("TamboThreadProvider", () => {
370
395
  mcpAccessToken: "test-mcp-access-token",
371
396
  });
372
397
  const { result } = renderHook(() => useTamboThread(), {
373
- wrapper: wrapperWithUnregisteredTool,
398
+ wrapper: WrapperWithUnregisteredTool,
374
399
  });
375
400
  await act(async () => {
376
401
  await result.current.sendThreadMessage("Use unregistered tool", {
@@ -415,7 +440,7 @@ describe("TamboThreadProvider", () => {
415
440
  generationStage: GenerationStage.COMPLETE,
416
441
  mcpAccessToken: "test-mcp-access-token",
417
442
  });
418
- const { result } = renderHook(() => useTamboThread(), { wrapper });
443
+ const { result } = renderHook(() => useTamboThread(), { wrapper: Wrapper });
419
444
  await act(async () => {
420
445
  await result.current.sendThreadMessage("Use unregistered tool", {
421
446
  threadId: "test-thread-1",
@@ -428,13 +453,24 @@ describe("TamboThreadProvider", () => {
428
453
  describe("streaming behavior", () => {
429
454
  it("should call advanceStream when streamResponse=true", async () => {
430
455
  // Use wrapper with streaming=true to show that explicit streamResponse=true works
431
- const wrapperWithStreaming = ({ children, }) => (React.createElement(TamboRegistryProvider, { components: mockRegistry },
432
- React.createElement(TamboContextHelpersProvider, { contextHelpers: {
433
- currentTimeContextHelper: () => null,
434
- currentPageContextHelper: () => null,
456
+ const WrapperWithStreaming = ({ children, }) => {
457
+ const client = useTamboClient();
458
+ const queryClient = useTamboQueryClient();
459
+ return (React.createElement(TamboClientContext.Provider, { value: {
460
+ client,
461
+ queryClient,
462
+ isUpdatingToken: false,
463
+ mcpAccessToken: null,
464
+ setMcpAccessToken: () => { },
435
465
  } },
436
- React.createElement(TamboMcpTokenProvider, null,
437
- React.createElement(TamboThreadProvider, { streaming: true }, children)))));
466
+ React.createElement(TamboRegistryProvider, { components: mockRegistry },
467
+ React.createElement(TamboContextHelpersProvider, { contextHelpers: {
468
+ currentTimeContextHelper: () => null,
469
+ currentPageContextHelper: () => null,
470
+ } },
471
+ React.createElement(TamboMcpTokenProvider, null,
472
+ React.createElement(TamboThreadProvider, { streaming: true }, children))))));
473
+ };
438
474
  const mockStreamResponse = {
439
475
  responseMessageDto: {
440
476
  id: "stream-response",
@@ -455,7 +491,7 @@ describe("TamboThreadProvider", () => {
455
491
  };
456
492
  jest.mocked(advanceStream).mockResolvedValue(mockAsyncIterator);
457
493
  const { result } = renderHook(() => useTamboThread(), {
458
- wrapper: wrapperWithStreaming,
494
+ wrapper: WrapperWithStreaming,
459
495
  });
460
496
  await act(async () => {
461
497
  await result.current.sendThreadMessage("Hello streaming", {
@@ -490,15 +526,26 @@ describe("TamboThreadProvider", () => {
490
526
  });
491
527
  it("should call advanceById when streamResponse=false for existing thread", async () => {
492
528
  // Use wrapper with streaming=true to show that explicit streamResponse=false overrides provider setting
493
- const wrapperWithStreaming = ({ children, }) => (React.createElement(TamboRegistryProvider, { components: mockRegistry },
494
- React.createElement(TamboContextHelpersProvider, { contextHelpers: {
495
- currentTimeContextHelper: () => null,
496
- currentPageContextHelper: () => null,
529
+ const WrapperWithStreaming = ({ children, }) => {
530
+ const client = useTamboClient();
531
+ const queryClient = useTamboQueryClient();
532
+ return (React.createElement(TamboClientContext.Provider, { value: {
533
+ client,
534
+ queryClient,
535
+ isUpdatingToken: false,
536
+ mcpAccessToken: null,
537
+ setMcpAccessToken: () => { },
497
538
  } },
498
- React.createElement(TamboMcpTokenProvider, null,
499
- React.createElement(TamboThreadProvider, { streaming: true }, children)))));
539
+ React.createElement(TamboRegistryProvider, { components: mockRegistry },
540
+ React.createElement(TamboContextHelpersProvider, { contextHelpers: {
541
+ currentTimeContextHelper: () => null,
542
+ currentPageContextHelper: () => null,
543
+ } },
544
+ React.createElement(TamboMcpTokenProvider, null,
545
+ React.createElement(TamboThreadProvider, { streaming: true }, children))))));
546
+ };
500
547
  const { result } = renderHook(() => useTamboThread(), {
501
- wrapper: wrapperWithStreaming,
548
+ wrapper: WrapperWithStreaming,
502
549
  });
503
550
  await act(async () => {
504
551
  await result.current.sendThreadMessage("Hello non-streaming", {
@@ -533,15 +580,26 @@ describe("TamboThreadProvider", () => {
533
580
  });
534
581
  it("should call advanceById when streamResponse is undefined and provider streaming=false", async () => {
535
582
  // Use wrapper with streaming=false to test that undefined streamResponse respects provider setting
536
- const wrapperWithoutStreaming = ({ children, }) => (React.createElement(TamboRegistryProvider, { components: mockRegistry },
537
- React.createElement(TamboContextHelpersProvider, { contextHelpers: {
538
- currentTimeContextHelper: () => null,
539
- currentPageContextHelper: () => null,
583
+ const WrapperWithoutStreaming = ({ children, }) => {
584
+ const client = useTamboClient();
585
+ const queryClient = useTamboQueryClient();
586
+ return (React.createElement(TamboClientContext.Provider, { value: {
587
+ client,
588
+ queryClient,
589
+ isUpdatingToken: false,
590
+ mcpAccessToken: null,
591
+ setMcpAccessToken: () => { },
540
592
  } },
541
- React.createElement(TamboMcpTokenProvider, null,
542
- React.createElement(TamboThreadProvider, { streaming: false }, children)))));
593
+ React.createElement(TamboRegistryProvider, { components: mockRegistry },
594
+ React.createElement(TamboContextHelpersProvider, { contextHelpers: {
595
+ currentTimeContextHelper: () => null,
596
+ currentPageContextHelper: () => null,
597
+ } },
598
+ React.createElement(TamboMcpTokenProvider, null,
599
+ React.createElement(TamboThreadProvider, { streaming: false }, children))))));
600
+ };
543
601
  const { result } = renderHook(() => useTamboThread(), {
544
- wrapper: wrapperWithoutStreaming,
602
+ wrapper: WrapperWithoutStreaming,
545
603
  });
546
604
  await act(async () => {
547
605
  await result.current.sendThreadMessage("Hello default", {
@@ -576,13 +634,24 @@ describe("TamboThreadProvider", () => {
576
634
  });
577
635
  it("should call advanceStream when streamResponse is undefined and provider streaming=true (default)", async () => {
578
636
  // Use wrapper with streaming=true (default) to test that undefined streamResponse respects provider setting
579
- const wrapperWithDefaultStreaming = ({ children, }) => (React.createElement(TamboRegistryProvider, { components: mockRegistry },
580
- React.createElement(TamboContextHelpersProvider, { contextHelpers: {
581
- currentTimeContextHelper: () => null,
582
- currentPageContextHelper: () => null,
637
+ const WrapperWithDefaultStreaming = ({ children, }) => {
638
+ const client = useTamboClient();
639
+ const queryClient = useTamboQueryClient();
640
+ return (React.createElement(TamboClientContext.Provider, { value: {
641
+ client,
642
+ queryClient,
643
+ isUpdatingToken: false,
644
+ mcpAccessToken: null,
645
+ setMcpAccessToken: () => { },
583
646
  } },
584
- React.createElement(TamboMcpTokenProvider, null,
585
- React.createElement(TamboThreadProvider, null, children)))));
647
+ React.createElement(TamboRegistryProvider, { components: mockRegistry },
648
+ React.createElement(TamboContextHelpersProvider, { contextHelpers: {
649
+ currentTimeContextHelper: () => null,
650
+ currentPageContextHelper: () => null,
651
+ } },
652
+ React.createElement(TamboMcpTokenProvider, null,
653
+ React.createElement(TamboThreadProvider, null, children))))));
654
+ };
586
655
  const mockStreamResponse = {
587
656
  responseMessageDto: {
588
657
  id: "stream-response",
@@ -603,7 +672,7 @@ describe("TamboThreadProvider", () => {
603
672
  };
604
673
  jest.mocked(advanceStream).mockResolvedValue(mockAsyncIterator);
605
674
  const { result } = renderHook(() => useTamboThread(), {
606
- wrapper: wrapperWithDefaultStreaming,
675
+ wrapper: WrapperWithDefaultStreaming,
607
676
  });
608
677
  await act(async () => {
609
678
  await result.current.sendThreadMessage("Hello default streaming", {
@@ -638,15 +707,26 @@ describe("TamboThreadProvider", () => {
638
707
  });
639
708
  it("should call advance when streamResponse=false for placeholder thread", async () => {
640
709
  // Use wrapper with streaming=true to show that explicit streamResponse=false overrides provider setting
641
- const wrapperWithStreaming = ({ children, }) => (React.createElement(TamboRegistryProvider, { components: mockRegistry },
642
- React.createElement(TamboContextHelpersProvider, { contextHelpers: {
643
- currentTimeContextHelper: () => null,
644
- currentPageContextHelper: () => null,
710
+ const WrapperWithStreaming = ({ children, }) => {
711
+ const client = useTamboClient();
712
+ const queryClient = useTamboQueryClient();
713
+ return (React.createElement(TamboClientContext.Provider, { value: {
714
+ client,
715
+ queryClient,
716
+ isUpdatingToken: false,
717
+ mcpAccessToken: null,
718
+ setMcpAccessToken: () => { },
645
719
  } },
646
- React.createElement(TamboMcpTokenProvider, null,
647
- React.createElement(TamboThreadProvider, { streaming: true }, children)))));
720
+ React.createElement(TamboRegistryProvider, { components: mockRegistry },
721
+ React.createElement(TamboContextHelpersProvider, { contextHelpers: {
722
+ currentTimeContextHelper: () => null,
723
+ currentPageContextHelper: () => null,
724
+ } },
725
+ React.createElement(TamboMcpTokenProvider, null,
726
+ React.createElement(TamboThreadProvider, { streaming: true }, children))))));
727
+ };
648
728
  const { result } = renderHook(() => useTamboThread(), {
649
- wrapper: wrapperWithStreaming,
729
+ wrapper: WrapperWithStreaming,
650
730
  });
651
731
  // Start with placeholder thread (which is the default state)
652
732
  expect(result.current.thread.id).toBe("placeholder");
@@ -683,13 +763,24 @@ describe("TamboThreadProvider", () => {
683
763
  });
684
764
  it("should call advanceStream when streamResponse=true for placeholder thread", async () => {
685
765
  // Use wrapper with streaming=false to show that explicit streamResponse=true overrides provider setting
686
- const wrapperWithoutStreaming = ({ children, }) => (React.createElement(TamboRegistryProvider, { components: mockRegistry },
687
- React.createElement(TamboContextHelpersProvider, { contextHelpers: {
688
- currentTimeContextHelper: () => null,
689
- currentPageContextHelper: () => null,
766
+ const WrapperWithoutStreaming = ({ children, }) => {
767
+ const client = useTamboClient();
768
+ const queryClient = useTamboQueryClient();
769
+ return (React.createElement(TamboClientContext.Provider, { value: {
770
+ client,
771
+ queryClient,
772
+ isUpdatingToken: false,
773
+ mcpAccessToken: null,
774
+ setMcpAccessToken: () => { },
690
775
  } },
691
- React.createElement(TamboMcpTokenProvider, null,
692
- React.createElement(TamboThreadProvider, { streaming: false }, children)))));
776
+ React.createElement(TamboRegistryProvider, { components: mockRegistry },
777
+ React.createElement(TamboContextHelpersProvider, { contextHelpers: {
778
+ currentTimeContextHelper: () => null,
779
+ currentPageContextHelper: () => null,
780
+ } },
781
+ React.createElement(TamboMcpTokenProvider, null,
782
+ React.createElement(TamboThreadProvider, { streaming: false }, children))))));
783
+ };
693
784
  const mockStreamResponse = {
694
785
  responseMessageDto: {
695
786
  id: "stream-response",
@@ -710,7 +801,7 @@ describe("TamboThreadProvider", () => {
710
801
  };
711
802
  jest.mocked(advanceStream).mockResolvedValue(mockAsyncIterator);
712
803
  const { result } = renderHook(() => useTamboThread(), {
713
- wrapper: wrapperWithoutStreaming,
804
+ wrapper: WrapperWithoutStreaming,
714
805
  });
715
806
  // Start with placeholder thread (which is the default state)
716
807
  expect(result.current.thread.id).toBe("placeholder");
@@ -751,7 +842,9 @@ describe("TamboThreadProvider", () => {
751
842
  const testError = new Error("API call failed");
752
843
  // Mock advanceById to throw an error
753
844
  jest.mocked(mockThreadsApi.advanceByID).mockRejectedValue(testError);
754
- const { result } = renderHook(() => useTamboThread(), { wrapper });
845
+ const { result } = renderHook(() => useTamboThread(), {
846
+ wrapper: Wrapper,
847
+ });
755
848
  // Expect the error to be thrown
756
849
  await act(async () => {
757
850
  await result.current.switchCurrentThread("test-thread-1");
@@ -767,7 +860,9 @@ describe("TamboThreadProvider", () => {
767
860
  const testError = new Error("Streaming API call failed");
768
861
  // Mock advanceStream to throw an error
769
862
  jest.mocked(advanceStream).mockRejectedValue(testError);
770
- const { result } = renderHook(() => useTamboThread(), { wrapper });
863
+ const { result } = renderHook(() => useTamboThread(), {
864
+ wrapper: Wrapper,
865
+ });
771
866
  // Expect the error to be thrown
772
867
  await act(async () => {
773
868
  await result.current.switchCurrentThread("test-thread-1");
@@ -783,7 +878,9 @@ describe("TamboThreadProvider", () => {
783
878
  const testError = new Error("Advance API call failed");
784
879
  // Mock advance to throw an error
785
880
  jest.mocked(mockThreadsApi.advance).mockRejectedValue(testError);
786
- const { result } = renderHook(() => useTamboThread(), { wrapper });
881
+ const { result } = renderHook(() => useTamboThread(), {
882
+ wrapper: Wrapper,
883
+ });
787
884
  // Start with placeholder thread (which is the default state)
788
885
  expect(result.current.thread.id).toBe("placeholder");
789
886
  // Expect the error to be thrown
@@ -799,7 +896,9 @@ describe("TamboThreadProvider", () => {
799
896
  });
800
897
  describe("refetch threads list behavior", () => {
801
898
  it("should refetch threads list when creating a new thread via sendThreadMessage", async () => {
802
- const { result } = renderHook(() => useTamboThread(), { wrapper });
899
+ const { result } = renderHook(() => useTamboThread(), {
900
+ wrapper: Wrapper,
901
+ });
803
902
  // Mock the advance response to return a new thread ID
804
903
  const mockAdvanceResponse = {
805
904
  responseMessageDto: {
@@ -835,7 +934,9 @@ describe("TamboThreadProvider", () => {
835
934
  });
836
935
  });
837
936
  it("should not refetch threads list when switching between existing threads", async () => {
838
- const { result } = renderHook(() => useTamboThread(), { wrapper });
937
+ const { result } = renderHook(() => useTamboThread(), {
938
+ wrapper: Wrapper,
939
+ });
839
940
  // Start with placeholder thread
840
941
  expect(result.current.thread.id).toBe("placeholder");
841
942
  // Clear any previous mock calls
@@ -887,13 +988,24 @@ describe("TamboThreadProvider", () => {
887
988
  ],
888
989
  },
889
990
  ];
890
- const wrapperWithCustomTool = ({ children, }) => (React.createElement(TamboRegistryProvider, { components: customToolRegistry },
891
- React.createElement(TamboContextHelpersProvider, { contextHelpers: {
892
- currentTimeContextHelper: () => null,
893
- currentPageContextHelper: () => null,
991
+ const WrapperWithCustomTool = ({ children, }) => {
992
+ const client = useTamboClient();
993
+ const queryClient = useTamboQueryClient();
994
+ return (React.createElement(TamboClientContext.Provider, { value: {
995
+ client,
996
+ queryClient,
997
+ isUpdatingToken: false,
998
+ mcpAccessToken: null,
999
+ setMcpAccessToken: () => { },
894
1000
  } },
895
- React.createElement(TamboMcpTokenProvider, null,
896
- React.createElement(TamboThreadProvider, { streaming: false }, children)))));
1001
+ React.createElement(TamboRegistryProvider, { components: customToolRegistry },
1002
+ React.createElement(TamboContextHelpersProvider, { contextHelpers: {
1003
+ currentTimeContextHelper: () => null,
1004
+ currentPageContextHelper: () => null,
1005
+ } },
1006
+ React.createElement(TamboMcpTokenProvider, null,
1007
+ React.createElement(TamboThreadProvider, { streaming: false }, children))))));
1008
+ };
897
1009
  const mockToolCallResponse = {
898
1010
  responseMessageDto: {
899
1011
  id: "tool-call-1",
@@ -926,7 +1038,7 @@ describe("TamboThreadProvider", () => {
926
1038
  mcpAccessToken: "test-mcp-access-token",
927
1039
  });
928
1040
  const { result } = renderHook(() => useTamboThread(), {
929
- wrapper: wrapperWithCustomTool,
1041
+ wrapper: WrapperWithCustomTool,
930
1042
  });
931
1043
  await act(async () => {
932
1044
  await result.current.sendThreadMessage("Use custom tool", {
@@ -981,13 +1093,24 @@ describe("TamboThreadProvider", () => {
981
1093
  ],
982
1094
  },
983
1095
  ];
984
- const wrapperWithAsyncTool = ({ children, }) => (React.createElement(TamboRegistryProvider, { components: customToolRegistry },
985
- React.createElement(TamboContextHelpersProvider, { contextHelpers: {
986
- currentTimeContextHelper: () => null,
987
- currentPageContextHelper: () => null,
1096
+ const WrapperWithAsyncTool = ({ children, }) => {
1097
+ const client = useTamboClient();
1098
+ const queryClient = useTamboQueryClient();
1099
+ return (React.createElement(TamboClientContext.Provider, { value: {
1100
+ client,
1101
+ queryClient,
1102
+ isUpdatingToken: false,
1103
+ mcpAccessToken: null,
1104
+ setMcpAccessToken: () => { },
988
1105
  } },
989
- React.createElement(TamboMcpTokenProvider, null,
990
- React.createElement(TamboThreadProvider, { streaming: true }, children)))));
1106
+ React.createElement(TamboRegistryProvider, { components: customToolRegistry },
1107
+ React.createElement(TamboContextHelpersProvider, { contextHelpers: {
1108
+ currentTimeContextHelper: () => null,
1109
+ currentPageContextHelper: () => null,
1110
+ } },
1111
+ React.createElement(TamboMcpTokenProvider, null,
1112
+ React.createElement(TamboThreadProvider, { streaming: true }, children))))));
1113
+ };
991
1114
  const mockToolCallChunk = {
992
1115
  responseMessageDto: {
993
1116
  id: "tool-call-chunk",
@@ -1033,7 +1156,7 @@ describe("TamboThreadProvider", () => {
1033
1156
  },
1034
1157
  });
1035
1158
  const { result } = renderHook(() => useTamboThread(), {
1036
- wrapper: wrapperWithAsyncTool,
1159
+ wrapper: WrapperWithAsyncTool,
1037
1160
  });
1038
1161
  await act(async () => {
1039
1162
  await result.current.sendThreadMessage("Use async tool", {
@@ -1083,13 +1206,24 @@ describe("TamboThreadProvider", () => {
1083
1206
  ],
1084
1207
  },
1085
1208
  ];
1086
- const wrapperWithoutTransform = ({ children, }) => (React.createElement(TamboRegistryProvider, { components: toolWithoutTransform },
1087
- React.createElement(TamboContextHelpersProvider, { contextHelpers: {
1088
- currentTimeContextHelper: () => null,
1089
- currentPageContextHelper: () => null,
1209
+ const WrapperWithoutTransform = ({ children, }) => {
1210
+ const client = useTamboClient();
1211
+ const queryClient = useTamboQueryClient();
1212
+ return (React.createElement(TamboClientContext.Provider, { value: {
1213
+ client,
1214
+ queryClient,
1215
+ isUpdatingToken: false,
1216
+ mcpAccessToken: null,
1217
+ setMcpAccessToken: () => { },
1090
1218
  } },
1091
- React.createElement(TamboMcpTokenProvider, null,
1092
- React.createElement(TamboThreadProvider, { streaming: false }, children)))));
1219
+ React.createElement(TamboRegistryProvider, { components: toolWithoutTransform },
1220
+ React.createElement(TamboContextHelpersProvider, { contextHelpers: {
1221
+ currentTimeContextHelper: () => null,
1222
+ currentPageContextHelper: () => null,
1223
+ } },
1224
+ React.createElement(TamboMcpTokenProvider, null,
1225
+ React.createElement(TamboThreadProvider, { streaming: false }, children))))));
1226
+ };
1093
1227
  const mockToolCallResponse = {
1094
1228
  responseMessageDto: {
1095
1229
  id: "tool-call-1",
@@ -1122,7 +1256,7 @@ describe("TamboThreadProvider", () => {
1122
1256
  mcpAccessToken: "test-mcp-access-token",
1123
1257
  });
1124
1258
  const { result } = renderHook(() => useTamboThread(), {
1125
- wrapper: wrapperWithoutTransform,
1259
+ wrapper: WrapperWithoutTransform,
1126
1260
  });
1127
1261
  await act(async () => {
1128
1262
  await result.current.sendThreadMessage("Use tool without transform", {
@@ -1171,13 +1305,24 @@ describe("TamboThreadProvider", () => {
1171
1305
  ],
1172
1306
  },
1173
1307
  ];
1174
- const wrapperWithErrorTool = ({ children, }) => (React.createElement(TamboRegistryProvider, { components: toolWithTransform },
1175
- React.createElement(TamboContextHelpersProvider, { contextHelpers: {
1176
- currentTimeContextHelper: () => null,
1177
- currentPageContextHelper: () => null,
1308
+ const WrapperWithErrorTool = ({ children, }) => {
1309
+ const client = useTamboClient();
1310
+ const queryClient = useTamboQueryClient();
1311
+ return (React.createElement(TamboClientContext.Provider, { value: {
1312
+ client,
1313
+ queryClient,
1314
+ isUpdatingToken: false,
1315
+ mcpAccessToken: null,
1316
+ setMcpAccessToken: () => { },
1178
1317
  } },
1179
- React.createElement(TamboMcpTokenProvider, null,
1180
- React.createElement(TamboThreadProvider, { streaming: false }, children)))));
1318
+ React.createElement(TamboRegistryProvider, { components: toolWithTransform },
1319
+ React.createElement(TamboContextHelpersProvider, { contextHelpers: {
1320
+ currentTimeContextHelper: () => null,
1321
+ currentPageContextHelper: () => null,
1322
+ } },
1323
+ React.createElement(TamboMcpTokenProvider, null,
1324
+ React.createElement(TamboThreadProvider, { streaming: false }, children))))));
1325
+ };
1181
1326
  const mockToolCallResponse = {
1182
1327
  responseMessageDto: {
1183
1328
  id: "tool-call-1",
@@ -1210,7 +1355,7 @@ describe("TamboThreadProvider", () => {
1210
1355
  mcpAccessToken: "test-mcp-access-token",
1211
1356
  });
1212
1357
  const { result } = renderHook(() => useTamboThread(), {
1213
- wrapper: wrapperWithErrorTool,
1358
+ wrapper: WrapperWithErrorTool,
1214
1359
  });
1215
1360
  await act(async () => {
1216
1361
  await result.current.sendThreadMessage("Use error tool", {
@@ -1238,15 +1383,26 @@ describe("TamboThreadProvider", () => {
1238
1383
  });
1239
1384
  describe("auto-generate thread name", () => {
1240
1385
  it("should auto-generate thread name after reaching threshold", async () => {
1241
- const wrapperWithAutoGenerate = ({ children, }) => (React.createElement(TamboRegistryProvider, { components: mockRegistry },
1242
- React.createElement(TamboContextHelpersProvider, { contextHelpers: {
1243
- currentTimeContextHelper: () => null,
1244
- currentPageContextHelper: () => null,
1386
+ const WrapperWithAutoGenerate = ({ children, }) => {
1387
+ const client = useTamboClient();
1388
+ const queryClient = useTamboQueryClient();
1389
+ return (React.createElement(TamboClientContext.Provider, { value: {
1390
+ client,
1391
+ queryClient,
1392
+ isUpdatingToken: false,
1393
+ mcpAccessToken: null,
1394
+ setMcpAccessToken: () => { },
1245
1395
  } },
1246
- React.createElement(TamboMcpTokenProvider, null,
1247
- React.createElement(TamboThreadProvider, { streaming: false, autoGenerateNameThreshold: 2 }, children)))));
1396
+ React.createElement(TamboRegistryProvider, { components: mockRegistry },
1397
+ React.createElement(TamboContextHelpersProvider, { contextHelpers: {
1398
+ currentTimeContextHelper: () => null,
1399
+ currentPageContextHelper: () => null,
1400
+ } },
1401
+ React.createElement(TamboMcpTokenProvider, null,
1402
+ React.createElement(TamboThreadProvider, { streaming: false, autoGenerateNameThreshold: 2 }, children))))));
1403
+ };
1248
1404
  const { result } = renderHook(() => useTamboThread(), {
1249
- wrapper: wrapperWithAutoGenerate,
1405
+ wrapper: WrapperWithAutoGenerate,
1250
1406
  });
1251
1407
  const existingThread = createMockThread({
1252
1408
  id: "test-thread-1",
@@ -1283,15 +1439,26 @@ describe("TamboThreadProvider", () => {
1283
1439
  expect(mockQueryClient.setQueryData).toHaveBeenCalledWith(["threads", "test-project-id", undefined], expect.any(Function));
1284
1440
  });
1285
1441
  it("should NOT auto-generate when autoGenerateThreadName is false", async () => {
1286
- const wrapperWithDisabled = ({ children, }) => (React.createElement(TamboRegistryProvider, { components: mockRegistry },
1287
- React.createElement(TamboContextHelpersProvider, { contextHelpers: {
1288
- currentTimeContextHelper: () => null,
1289
- currentPageContextHelper: () => null,
1442
+ const WrapperWithDisabled = ({ children, }) => {
1443
+ const client = useTamboClient();
1444
+ const queryClient = useTamboQueryClient();
1445
+ return (React.createElement(TamboClientContext.Provider, { value: {
1446
+ client,
1447
+ queryClient,
1448
+ isUpdatingToken: false,
1449
+ mcpAccessToken: null,
1450
+ setMcpAccessToken: () => { },
1290
1451
  } },
1291
- React.createElement(TamboMcpTokenProvider, null,
1292
- React.createElement(TamboThreadProvider, { streaming: false, autoGenerateThreadName: false, autoGenerateNameThreshold: 2 }, children)))));
1452
+ React.createElement(TamboRegistryProvider, { components: mockRegistry },
1453
+ React.createElement(TamboContextHelpersProvider, { contextHelpers: {
1454
+ currentTimeContextHelper: () => null,
1455
+ currentPageContextHelper: () => null,
1456
+ } },
1457
+ React.createElement(TamboMcpTokenProvider, null,
1458
+ React.createElement(TamboThreadProvider, { streaming: false, autoGenerateThreadName: false, autoGenerateNameThreshold: 2 }, children))))));
1459
+ };
1293
1460
  const { result } = renderHook(() => useTamboThread(), {
1294
- wrapper: wrapperWithDisabled,
1461
+ wrapper: WrapperWithDisabled,
1295
1462
  });
1296
1463
  const existingThread = createMockThread({
1297
1464
  id: "test-thread-1",
@@ -1324,15 +1491,26 @@ describe("TamboThreadProvider", () => {
1324
1491
  expect(mockThreadsApi.generateName).not.toHaveBeenCalled();
1325
1492
  });
1326
1493
  it("should NOT auto-generate when thread already has a name", async () => {
1327
- const wrapperWithAutoGenerate = ({ children, }) => (React.createElement(TamboRegistryProvider, { components: mockRegistry },
1328
- React.createElement(TamboContextHelpersProvider, { contextHelpers: {
1329
- currentTimeContextHelper: () => null,
1330
- currentPageContextHelper: () => null,
1494
+ const WrapperWithAutoGenerate = ({ children, }) => {
1495
+ const client = useTamboClient();
1496
+ const queryClient = useTamboQueryClient();
1497
+ return (React.createElement(TamboClientContext.Provider, { value: {
1498
+ client,
1499
+ queryClient,
1500
+ isUpdatingToken: false,
1501
+ mcpAccessToken: null,
1502
+ setMcpAccessToken: () => { },
1331
1503
  } },
1332
- React.createElement(TamboMcpTokenProvider, null,
1333
- React.createElement(TamboThreadProvider, { streaming: false, autoGenerateNameThreshold: 2 }, children)))));
1504
+ React.createElement(TamboRegistryProvider, { components: mockRegistry },
1505
+ React.createElement(TamboContextHelpersProvider, { contextHelpers: {
1506
+ currentTimeContextHelper: () => null,
1507
+ currentPageContextHelper: () => null,
1508
+ } },
1509
+ React.createElement(TamboMcpTokenProvider, null,
1510
+ React.createElement(TamboThreadProvider, { streaming: false, autoGenerateNameThreshold: 2 }, children))))));
1511
+ };
1334
1512
  const { result } = renderHook(() => useTamboThread(), {
1335
- wrapper: wrapperWithAutoGenerate,
1513
+ wrapper: WrapperWithAutoGenerate,
1336
1514
  });
1337
1515
  const threadWithName = createMockThread({
1338
1516
  id: "test-thread-1",
@@ -1370,15 +1548,26 @@ describe("TamboThreadProvider", () => {
1370
1548
  expect(mockThreadsApi.generateName).not.toHaveBeenCalled();
1371
1549
  });
1372
1550
  it("should NOT auto-generate for placeholder thread", async () => {
1373
- const wrapperWithAutoGenerate = ({ children, }) => (React.createElement(TamboRegistryProvider, { components: mockRegistry },
1374
- React.createElement(TamboContextHelpersProvider, { contextHelpers: {
1375
- currentTimeContextHelper: () => null,
1376
- currentPageContextHelper: () => null,
1551
+ const WrapperWithAutoGenerate = ({ children, }) => {
1552
+ const client = useTamboClient();
1553
+ const queryClient = useTamboQueryClient();
1554
+ return (React.createElement(TamboClientContext.Provider, { value: {
1555
+ client,
1556
+ queryClient,
1557
+ isUpdatingToken: false,
1558
+ mcpAccessToken: null,
1559
+ setMcpAccessToken: () => { },
1377
1560
  } },
1378
- React.createElement(TamboMcpTokenProvider, null,
1379
- React.createElement(TamboThreadProvider, { streaming: false, autoGenerateNameThreshold: 2 }, children)))));
1561
+ React.createElement(TamboRegistryProvider, { components: mockRegistry },
1562
+ React.createElement(TamboContextHelpersProvider, { contextHelpers: {
1563
+ currentTimeContextHelper: () => null,
1564
+ currentPageContextHelper: () => null,
1565
+ } },
1566
+ React.createElement(TamboMcpTokenProvider, null,
1567
+ React.createElement(TamboThreadProvider, { streaming: false, autoGenerateNameThreshold: 2 }, children))))));
1568
+ };
1380
1569
  const { result } = renderHook(() => useTamboThread(), {
1381
- wrapper: wrapperWithAutoGenerate,
1570
+ wrapper: WrapperWithAutoGenerate,
1382
1571
  });
1383
1572
  // Stay on placeholder thread
1384
1573
  expect(result.current.thread.id).toBe("placeholder");