@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.
- package/README.md +304 -327
- package/dist/hooks/use-tambo-threads.d.ts +0 -12
- package/dist/hooks/use-tambo-threads.d.ts.map +1 -1
- package/dist/hooks/use-tambo-threads.js.map +1 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -2
- package/dist/index.js.map +1 -1
- package/dist/mcp/__tests__/elicitation.test.js +7 -3
- package/dist/mcp/__tests__/elicitation.test.js.map +1 -1
- package/dist/mcp/__tests__/mcp-hooks.test.js +149 -123
- package/dist/mcp/__tests__/mcp-hooks.test.js.map +1 -1
- package/dist/mcp/__tests__/tambo-mcp-provider.test.js +176 -120
- package/dist/mcp/__tests__/tambo-mcp-provider.test.js.map +1 -1
- package/dist/mcp/__tests__/use-mcp-servers.test.js +12 -9
- package/dist/mcp/__tests__/use-mcp-servers.test.js.map +1 -1
- package/dist/mcp/elicitation.d.ts +4 -40
- package/dist/mcp/elicitation.d.ts.map +1 -1
- package/dist/mcp/elicitation.js +1 -1
- package/dist/mcp/elicitation.js.map +1 -1
- package/dist/mcp/index.d.ts +2 -1
- package/dist/mcp/index.d.ts.map +1 -1
- package/dist/mcp/index.js +2 -1
- package/dist/mcp/index.js.map +1 -1
- package/dist/mcp/mcp-client.d.ts +14 -26
- package/dist/mcp/mcp-client.d.ts.map +1 -1
- package/dist/mcp/mcp-client.js +4 -7
- package/dist/mcp/mcp-client.js.map +1 -1
- package/dist/mcp/mcp-hooks.d.ts +27 -78
- package/dist/mcp/mcp-hooks.d.ts.map +1 -1
- package/dist/mcp/tambo-mcp-provider.d.ts +27 -45
- package/dist/mcp/tambo-mcp-provider.d.ts.map +1 -1
- package/dist/mcp/tambo-mcp-provider.js +36 -87
- package/dist/mcp/tambo-mcp-provider.js.map +1 -1
- package/dist/model/mcp-server-info.d.ts +74 -0
- package/dist/model/mcp-server-info.d.ts.map +1 -0
- package/dist/model/mcp-server-info.js +29 -0
- package/dist/model/mcp-server-info.js.map +1 -0
- package/dist/providers/__tests__/tambo-thread-provider-initial-messages.test.js +22 -8
- package/dist/providers/__tests__/tambo-thread-provider-initial-messages.test.js.map +1 -1
- package/dist/providers/__tests__/tambo-thread-provider.test.js +318 -129
- package/dist/providers/__tests__/tambo-thread-provider.test.js.map +1 -1
- package/dist/providers/index.d.ts +1 -1
- package/dist/providers/index.d.ts.map +1 -1
- package/dist/providers/index.js +2 -1
- package/dist/providers/index.js.map +1 -1
- package/dist/providers/tambo-client-provider.d.ts +4 -0
- package/dist/providers/tambo-client-provider.d.ts.map +1 -1
- package/dist/providers/tambo-client-provider.js +3 -0
- package/dist/providers/tambo-client-provider.js.map +1 -1
- package/dist/providers/tambo-mcp-token-provider.d.ts +3 -0
- package/dist/providers/tambo-mcp-token-provider.d.ts.map +1 -1
- package/dist/providers/tambo-mcp-token-provider.js +11 -3
- package/dist/providers/tambo-mcp-token-provider.js.map +1 -1
- package/dist/providers/tambo-provider.d.ts +1 -0
- package/dist/providers/tambo-provider.d.ts.map +1 -1
- package/dist/providers/tambo-provider.js +10 -5
- package/dist/providers/tambo-provider.js.map +1 -1
- package/dist/providers/tambo-registry-provider.d.ts +37 -0
- package/dist/providers/tambo-registry-provider.d.ts.map +1 -1
- package/dist/providers/tambo-registry-provider.js +162 -2
- package/dist/providers/tambo-registry-provider.js.map +1 -1
- package/dist/providers/tambo-stubs.d.ts.map +1 -1
- package/dist/providers/tambo-stubs.js +10 -1
- package/dist/providers/tambo-stubs.js.map +1 -1
- package/esm/hooks/use-tambo-threads.d.ts +0 -12
- package/esm/hooks/use-tambo-threads.d.ts.map +1 -1
- package/esm/hooks/use-tambo-threads.js.map +1 -1
- package/esm/index.d.ts +3 -1
- package/esm/index.d.ts.map +1 -1
- package/esm/index.js +3 -2
- package/esm/index.js.map +1 -1
- package/esm/mcp/__tests__/elicitation.test.js +8 -4
- package/esm/mcp/__tests__/elicitation.test.js.map +1 -1
- package/esm/mcp/__tests__/mcp-hooks.test.js +149 -123
- package/esm/mcp/__tests__/mcp-hooks.test.js.map +1 -1
- package/esm/mcp/__tests__/tambo-mcp-provider.test.js +178 -122
- package/esm/mcp/__tests__/tambo-mcp-provider.test.js.map +1 -1
- package/esm/mcp/__tests__/use-mcp-servers.test.js +12 -9
- package/esm/mcp/__tests__/use-mcp-servers.test.js.map +1 -1
- package/esm/mcp/elicitation.d.ts +4 -40
- package/esm/mcp/elicitation.d.ts.map +1 -1
- package/esm/mcp/elicitation.js +2 -2
- package/esm/mcp/elicitation.js.map +1 -1
- package/esm/mcp/index.d.ts +2 -1
- package/esm/mcp/index.d.ts.map +1 -1
- package/esm/mcp/index.js +1 -1
- package/esm/mcp/index.js.map +1 -1
- package/esm/mcp/mcp-client.d.ts +14 -26
- package/esm/mcp/mcp-client.d.ts.map +1 -1
- package/esm/mcp/mcp-client.js +3 -5
- package/esm/mcp/mcp-client.js.map +1 -1
- package/esm/mcp/mcp-hooks.d.ts +27 -78
- package/esm/mcp/mcp-hooks.d.ts.map +1 -1
- package/esm/mcp/tambo-mcp-provider.d.ts +27 -45
- package/esm/mcp/tambo-mcp-provider.d.ts.map +1 -1
- package/esm/mcp/tambo-mcp-provider.js +35 -86
- package/esm/mcp/tambo-mcp-provider.js.map +1 -1
- package/esm/model/mcp-server-info.d.ts +74 -0
- package/esm/model/mcp-server-info.d.ts.map +1 -0
- package/esm/model/mcp-server-info.js +25 -0
- package/esm/model/mcp-server-info.js.map +1 -0
- package/esm/providers/__tests__/tambo-thread-provider-initial-messages.test.js +23 -9
- package/esm/providers/__tests__/tambo-thread-provider-initial-messages.test.js.map +1 -1
- package/esm/providers/__tests__/tambo-thread-provider.test.js +319 -130
- package/esm/providers/__tests__/tambo-thread-provider.test.js.map +1 -1
- package/esm/providers/index.d.ts +1 -1
- package/esm/providers/index.d.ts.map +1 -1
- package/esm/providers/index.js +1 -1
- package/esm/providers/index.js.map +1 -1
- package/esm/providers/tambo-client-provider.d.ts +4 -0
- package/esm/providers/tambo-client-provider.d.ts.map +1 -1
- package/esm/providers/tambo-client-provider.js +3 -0
- package/esm/providers/tambo-client-provider.js.map +1 -1
- package/esm/providers/tambo-mcp-token-provider.d.ts +3 -0
- package/esm/providers/tambo-mcp-token-provider.d.ts.map +1 -1
- package/esm/providers/tambo-mcp-token-provider.js +13 -5
- package/esm/providers/tambo-mcp-token-provider.js.map +1 -1
- package/esm/providers/tambo-provider.d.ts +1 -0
- package/esm/providers/tambo-provider.d.ts.map +1 -1
- package/esm/providers/tambo-provider.js +11 -6
- package/esm/providers/tambo-provider.js.map +1 -1
- package/esm/providers/tambo-registry-provider.d.ts +37 -0
- package/esm/providers/tambo-registry-provider.d.ts.map +1 -1
- package/esm/providers/tambo-registry-provider.js +161 -2
- package/esm/providers/tambo-registry-provider.js.map +1 -1
- package/esm/providers/tambo-stubs.d.ts.map +1 -1
- package/esm/providers/tambo-stubs.js +10 -1
- package/esm/providers/tambo-stubs.js.map +1 -1
- 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
|
-
|
|
21
|
-
|
|
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
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
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(
|
|
117
|
-
React.createElement(
|
|
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
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
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(
|
|
338
|
-
React.createElement(
|
|
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:
|
|
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
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
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(
|
|
437
|
-
React.createElement(
|
|
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:
|
|
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
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
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(
|
|
499
|
-
React.createElement(
|
|
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:
|
|
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
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
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(
|
|
542
|
-
React.createElement(
|
|
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:
|
|
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
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
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(
|
|
585
|
-
React.createElement(
|
|
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:
|
|
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
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
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(
|
|
647
|
-
React.createElement(
|
|
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:
|
|
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
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
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(
|
|
692
|
-
React.createElement(
|
|
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:
|
|
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(), {
|
|
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(), {
|
|
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(), {
|
|
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(), {
|
|
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(), {
|
|
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
|
|
891
|
-
|
|
892
|
-
|
|
893
|
-
|
|
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(
|
|
896
|
-
React.createElement(
|
|
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:
|
|
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
|
|
985
|
-
|
|
986
|
-
|
|
987
|
-
|
|
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(
|
|
990
|
-
React.createElement(
|
|
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:
|
|
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
|
|
1087
|
-
|
|
1088
|
-
|
|
1089
|
-
|
|
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(
|
|
1092
|
-
React.createElement(
|
|
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:
|
|
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
|
|
1175
|
-
|
|
1176
|
-
|
|
1177
|
-
|
|
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(
|
|
1180
|
-
React.createElement(
|
|
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:
|
|
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
|
|
1242
|
-
|
|
1243
|
-
|
|
1244
|
-
|
|
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(
|
|
1247
|
-
React.createElement(
|
|
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:
|
|
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
|
|
1287
|
-
|
|
1288
|
-
|
|
1289
|
-
|
|
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(
|
|
1292
|
-
React.createElement(
|
|
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:
|
|
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
|
|
1328
|
-
|
|
1329
|
-
|
|
1330
|
-
|
|
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(
|
|
1333
|
-
React.createElement(
|
|
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:
|
|
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
|
|
1374
|
-
|
|
1375
|
-
|
|
1376
|
-
|
|
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(
|
|
1379
|
-
React.createElement(
|
|
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:
|
|
1570
|
+
wrapper: WrapperWithAutoGenerate,
|
|
1382
1571
|
});
|
|
1383
1572
|
// Stay on placeholder thread
|
|
1384
1573
|
expect(result.current.thread.id).toBe("placeholder");
|