@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
|
@@ -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
|
-
|
|
26
|
-
|
|
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
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
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(
|
|
122
|
-
react_2.default.createElement(
|
|
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
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
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(
|
|
343
|
-
react_2.default.createElement(
|
|
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:
|
|
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
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
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(
|
|
442
|
-
react_2.default.createElement(
|
|
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:
|
|
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
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
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(
|
|
504
|
-
react_2.default.createElement(
|
|
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:
|
|
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
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
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(
|
|
547
|
-
react_2.default.createElement(
|
|
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:
|
|
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
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
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(
|
|
590
|
-
react_2.default.createElement(
|
|
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:
|
|
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
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
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(
|
|
652
|
-
react_2.default.createElement(
|
|
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:
|
|
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
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
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(
|
|
697
|
-
react_2.default.createElement(
|
|
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:
|
|
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)(), {
|
|
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)(), {
|
|
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)(), {
|
|
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)(), {
|
|
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)(), {
|
|
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
|
|
896
|
-
|
|
897
|
-
|
|
898
|
-
|
|
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(
|
|
901
|
-
react_2.default.createElement(
|
|
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:
|
|
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
|
|
990
|
-
|
|
991
|
-
|
|
992
|
-
|
|
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(
|
|
995
|
-
react_2.default.createElement(
|
|
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:
|
|
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
|
|
1092
|
-
|
|
1093
|
-
|
|
1094
|
-
|
|
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(
|
|
1097
|
-
react_2.default.createElement(
|
|
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:
|
|
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
|
|
1180
|
-
|
|
1181
|
-
|
|
1182
|
-
|
|
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(
|
|
1185
|
-
react_2.default.createElement(
|
|
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:
|
|
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
|
|
1247
|
-
|
|
1248
|
-
|
|
1249
|
-
|
|
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(
|
|
1252
|
-
react_2.default.createElement(
|
|
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:
|
|
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
|
|
1292
|
-
|
|
1293
|
-
|
|
1294
|
-
|
|
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(
|
|
1297
|
-
react_2.default.createElement(
|
|
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:
|
|
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
|
|
1333
|
-
|
|
1334
|
-
|
|
1335
|
-
|
|
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(
|
|
1338
|
-
react_2.default.createElement(
|
|
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:
|
|
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
|
|
1379
|
-
|
|
1380
|
-
|
|
1381
|
-
|
|
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(
|
|
1384
|
-
react_2.default.createElement(
|
|
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:
|
|
1575
|
+
wrapper: WrapperWithAutoGenerate,
|
|
1387
1576
|
});
|
|
1388
1577
|
// Stay on placeholder thread
|
|
1389
1578
|
expect(result.current.thread.id).toBe("placeholder");
|