@tambo-ai/react 0.60.0 → 0.62.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/__tests__/util/validate-zod-schema.test.js +25 -0
- package/dist/__tests__/util/validate-zod-schema.test.js.map +1 -1
- package/dist/hooks/index.d.ts +1 -0
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/index.js +3 -1
- package/dist/hooks/index.js.map +1 -1
- package/dist/hooks/use-tambo-voice.d.ts +21 -0
- package/dist/hooks/use-tambo-voice.d.ts.map +1 -0
- package/dist/hooks/use-tambo-voice.js +74 -0
- package/dist/hooks/use-tambo-voice.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/dist/mcp/__tests__/tambo-mcp-provider.test.js +4 -4
- package/dist/mcp/__tests__/tambo-mcp-provider.test.js.map +1 -1
- package/dist/mcp/tambo-mcp-provider.d.ts +1 -1
- package/dist/mcp/tambo-mcp-provider.d.ts.map +1 -1
- package/dist/mcp/tambo-mcp-provider.js +2 -2
- package/dist/mcp/tambo-mcp-provider.js.map +1 -1
- package/dist/providers/__tests__/tambo-thread-provider-initial-messages.test.js +1 -1
- package/dist/providers/__tests__/tambo-thread-provider-initial-messages.test.js.map +1 -1
- package/dist/providers/__tests__/tambo-thread-provider.test.js +170 -0
- package/dist/providers/__tests__/tambo-thread-provider.test.js.map +1 -1
- package/dist/providers/tambo-provider.d.ts +2 -0
- package/dist/providers/tambo-provider.d.ts.map +1 -1
- package/dist/providers/tambo-provider.js +4 -2
- package/dist/providers/tambo-provider.js.map +1 -1
- package/dist/providers/tambo-thread-provider.d.ts +6 -0
- package/dist/providers/tambo-thread-provider.d.ts.map +1 -1
- package/dist/providers/tambo-thread-provider.js +112 -45
- package/dist/providers/tambo-thread-provider.js.map +1 -1
- package/dist/setupTests.js +10 -0
- package/dist/setupTests.js.map +1 -1
- package/dist/util/validate-zod-schema.d.ts.map +1 -1
- package/dist/util/validate-zod-schema.js +11 -0
- package/dist/util/validate-zod-schema.js.map +1 -1
- package/esm/__tests__/util/validate-zod-schema.test.js +25 -0
- package/esm/__tests__/util/validate-zod-schema.test.js.map +1 -1
- package/esm/hooks/index.d.ts +1 -0
- package/esm/hooks/index.d.ts.map +1 -1
- package/esm/hooks/index.js +1 -0
- package/esm/hooks/index.js.map +1 -1
- package/esm/hooks/use-tambo-voice.d.ts +21 -0
- package/esm/hooks/use-tambo-voice.d.ts.map +1 -0
- package/esm/hooks/use-tambo-voice.js +71 -0
- package/esm/hooks/use-tambo-voice.js.map +1 -0
- package/esm/index.d.ts +1 -0
- package/esm/index.d.ts.map +1 -1
- package/esm/index.js +1 -0
- package/esm/index.js.map +1 -1
- package/esm/mcp/__tests__/tambo-mcp-provider.test.js +4 -4
- package/esm/mcp/__tests__/tambo-mcp-provider.test.js.map +1 -1
- package/esm/mcp/tambo-mcp-provider.d.ts +1 -1
- package/esm/mcp/tambo-mcp-provider.d.ts.map +1 -1
- package/esm/mcp/tambo-mcp-provider.js +2 -2
- package/esm/mcp/tambo-mcp-provider.js.map +1 -1
- package/esm/providers/__tests__/tambo-thread-provider-initial-messages.test.js +1 -1
- package/esm/providers/__tests__/tambo-thread-provider-initial-messages.test.js.map +1 -1
- package/esm/providers/__tests__/tambo-thread-provider.test.js +170 -0
- package/esm/providers/__tests__/tambo-thread-provider.test.js.map +1 -1
- package/esm/providers/tambo-provider.d.ts +2 -0
- package/esm/providers/tambo-provider.d.ts.map +1 -1
- package/esm/providers/tambo-provider.js +4 -2
- package/esm/providers/tambo-provider.js.map +1 -1
- package/esm/providers/tambo-thread-provider.d.ts +6 -0
- package/esm/providers/tambo-thread-provider.d.ts.map +1 -1
- package/esm/providers/tambo-thread-provider.js +112 -45
- package/esm/providers/tambo-thread-provider.js.map +1 -1
- package/esm/setupTests.js +10 -0
- package/esm/setupTests.js.map +1 -1
- package/esm/util/validate-zod-schema.d.ts.map +1 -1
- package/esm/util/validate-zod-schema.js +11 -0
- package/esm/util/validate-zod-schema.js.map +1 -1
- package/package.json +5 -4
|
@@ -72,6 +72,7 @@ describe("TamboThreadProvider", () => {
|
|
|
72
72
|
retrieve: jest.fn(),
|
|
73
73
|
advance: jest.fn(),
|
|
74
74
|
advanceByID: jest.fn(),
|
|
75
|
+
generateName: jest.fn(),
|
|
75
76
|
};
|
|
76
77
|
const mockProjectsApi = {
|
|
77
78
|
getCurrent: jest.fn(),
|
|
@@ -134,6 +135,10 @@ describe("TamboThreadProvider", () => {
|
|
|
134
135
|
jest
|
|
135
136
|
.mocked(mockThreadsApi.advanceByID)
|
|
136
137
|
.mockResolvedValue(createMockAdvanceResponse());
|
|
138
|
+
jest.mocked(mockThreadsApi.generateName).mockResolvedValue({
|
|
139
|
+
...mockThread,
|
|
140
|
+
name: "Generated Thread Name",
|
|
141
|
+
});
|
|
137
142
|
jest.mocked(mockProjectsApi.getCurrent).mockResolvedValue({
|
|
138
143
|
id: "test-project-id",
|
|
139
144
|
name: "Test Project",
|
|
@@ -1231,5 +1236,170 @@ describe("TamboThreadProvider", () => {
|
|
|
1231
1236
|
}));
|
|
1232
1237
|
});
|
|
1233
1238
|
});
|
|
1239
|
+
describe("auto-generate thread name", () => {
|
|
1240
|
+
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,
|
|
1245
|
+
} },
|
|
1246
|
+
React.createElement(TamboMcpTokenProvider, null,
|
|
1247
|
+
React.createElement(TamboThreadProvider, { streaming: false, autoGenerateNameThreshold: 2 }, children)))));
|
|
1248
|
+
const { result } = renderHook(() => useTamboThread(), {
|
|
1249
|
+
wrapper: wrapperWithAutoGenerate,
|
|
1250
|
+
});
|
|
1251
|
+
const existingThread = createMockThread({
|
|
1252
|
+
id: "test-thread-1",
|
|
1253
|
+
name: undefined,
|
|
1254
|
+
});
|
|
1255
|
+
jest
|
|
1256
|
+
.mocked(mockThreadsApi.retrieve)
|
|
1257
|
+
.mockResolvedValueOnce(existingThread);
|
|
1258
|
+
await act(async () => {
|
|
1259
|
+
await result.current.switchCurrentThread("test-thread-1");
|
|
1260
|
+
});
|
|
1261
|
+
// Add first message
|
|
1262
|
+
await act(async () => {
|
|
1263
|
+
await result.current.addThreadMessage(createMockMessage({
|
|
1264
|
+
id: "msg-1",
|
|
1265
|
+
role: "user",
|
|
1266
|
+
threadId: "test-thread-1",
|
|
1267
|
+
}), false);
|
|
1268
|
+
});
|
|
1269
|
+
expect(mockThreadsApi.generateName).not.toHaveBeenCalled();
|
|
1270
|
+
// Add second message and send to reach threshold
|
|
1271
|
+
await act(async () => {
|
|
1272
|
+
await result.current.addThreadMessage(createMockMessage({
|
|
1273
|
+
id: "msg-2",
|
|
1274
|
+
role: "assistant",
|
|
1275
|
+
threadId: "test-thread-1",
|
|
1276
|
+
}), false);
|
|
1277
|
+
});
|
|
1278
|
+
await act(async () => {
|
|
1279
|
+
await result.current.sendThreadMessage("Test message");
|
|
1280
|
+
});
|
|
1281
|
+
expect(mockThreadsApi.generateName).toHaveBeenCalledWith("test-thread-1");
|
|
1282
|
+
expect(result.current.thread.name).toBe("Generated Thread Name");
|
|
1283
|
+
expect(mockQueryClient.setQueryData).toHaveBeenCalledWith(["threads", "test-project-id", undefined], expect.any(Function));
|
|
1284
|
+
});
|
|
1285
|
+
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,
|
|
1290
|
+
} },
|
|
1291
|
+
React.createElement(TamboMcpTokenProvider, null,
|
|
1292
|
+
React.createElement(TamboThreadProvider, { streaming: false, autoGenerateThreadName: false, autoGenerateNameThreshold: 2 }, children)))));
|
|
1293
|
+
const { result } = renderHook(() => useTamboThread(), {
|
|
1294
|
+
wrapper: wrapperWithDisabled,
|
|
1295
|
+
});
|
|
1296
|
+
const existingThread = createMockThread({
|
|
1297
|
+
id: "test-thread-1",
|
|
1298
|
+
name: undefined,
|
|
1299
|
+
});
|
|
1300
|
+
jest
|
|
1301
|
+
.mocked(mockThreadsApi.retrieve)
|
|
1302
|
+
.mockResolvedValueOnce(existingThread);
|
|
1303
|
+
await act(async () => {
|
|
1304
|
+
await result.current.switchCurrentThread("test-thread-1");
|
|
1305
|
+
});
|
|
1306
|
+
await act(async () => {
|
|
1307
|
+
await result.current.addThreadMessage(createMockMessage({
|
|
1308
|
+
id: "msg-1",
|
|
1309
|
+
role: "user",
|
|
1310
|
+
threadId: "test-thread-1",
|
|
1311
|
+
}), false);
|
|
1312
|
+
});
|
|
1313
|
+
await act(async () => {
|
|
1314
|
+
await result.current.addThreadMessage(createMockMessage({
|
|
1315
|
+
id: "msg-2",
|
|
1316
|
+
role: "assistant",
|
|
1317
|
+
threadId: "test-thread-1",
|
|
1318
|
+
}), false);
|
|
1319
|
+
});
|
|
1320
|
+
await act(async () => {
|
|
1321
|
+
await result.current.sendThreadMessage("Test message");
|
|
1322
|
+
});
|
|
1323
|
+
// Should NOT generate name because feature is disabled
|
|
1324
|
+
expect(mockThreadsApi.generateName).not.toHaveBeenCalled();
|
|
1325
|
+
});
|
|
1326
|
+
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,
|
|
1331
|
+
} },
|
|
1332
|
+
React.createElement(TamboMcpTokenProvider, null,
|
|
1333
|
+
React.createElement(TamboThreadProvider, { streaming: false, autoGenerateNameThreshold: 2 }, children)))));
|
|
1334
|
+
const { result } = renderHook(() => useTamboThread(), {
|
|
1335
|
+
wrapper: wrapperWithAutoGenerate,
|
|
1336
|
+
});
|
|
1337
|
+
const threadWithName = createMockThread({
|
|
1338
|
+
id: "test-thread-1",
|
|
1339
|
+
name: "Existing Thread Name",
|
|
1340
|
+
});
|
|
1341
|
+
jest
|
|
1342
|
+
.mocked(mockThreadsApi.retrieve)
|
|
1343
|
+
.mockResolvedValueOnce(threadWithName);
|
|
1344
|
+
await act(async () => {
|
|
1345
|
+
await result.current.switchCurrentThread("test-thread-1");
|
|
1346
|
+
});
|
|
1347
|
+
// Verify thread has existing name
|
|
1348
|
+
expect(result.current.thread.name).toBe("Existing Thread Name");
|
|
1349
|
+
// Add messages to build up state
|
|
1350
|
+
await act(async () => {
|
|
1351
|
+
await result.current.addThreadMessage(createMockMessage({
|
|
1352
|
+
id: "msg-1",
|
|
1353
|
+
role: "user",
|
|
1354
|
+
threadId: "test-thread-1",
|
|
1355
|
+
}), false);
|
|
1356
|
+
});
|
|
1357
|
+
await act(async () => {
|
|
1358
|
+
await result.current.addThreadMessage(createMockMessage({
|
|
1359
|
+
id: "msg-2",
|
|
1360
|
+
role: "assistant",
|
|
1361
|
+
threadId: "test-thread-1",
|
|
1362
|
+
}), false);
|
|
1363
|
+
});
|
|
1364
|
+
expect(result.current.thread.messages).toHaveLength(2);
|
|
1365
|
+
// Send another message to reach threshold (3 messages total)
|
|
1366
|
+
await act(async () => {
|
|
1367
|
+
await result.current.sendThreadMessage("Test message");
|
|
1368
|
+
});
|
|
1369
|
+
// Should NOT generate name because thread already has one
|
|
1370
|
+
expect(mockThreadsApi.generateName).not.toHaveBeenCalled();
|
|
1371
|
+
});
|
|
1372
|
+
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,
|
|
1377
|
+
} },
|
|
1378
|
+
React.createElement(TamboMcpTokenProvider, null,
|
|
1379
|
+
React.createElement(TamboThreadProvider, { streaming: false, autoGenerateNameThreshold: 2 }, children)))));
|
|
1380
|
+
const { result } = renderHook(() => useTamboThread(), {
|
|
1381
|
+
wrapper: wrapperWithAutoGenerate,
|
|
1382
|
+
});
|
|
1383
|
+
// Stay on placeholder thread
|
|
1384
|
+
expect(result.current.thread.id).toBe("placeholder");
|
|
1385
|
+
// Add messages to placeholder thread
|
|
1386
|
+
await act(async () => {
|
|
1387
|
+
await result.current.addThreadMessage(createMockMessage({
|
|
1388
|
+
id: "msg-1",
|
|
1389
|
+
role: "user",
|
|
1390
|
+
threadId: "placeholder",
|
|
1391
|
+
}), false);
|
|
1392
|
+
});
|
|
1393
|
+
await act(async () => {
|
|
1394
|
+
await result.current.addThreadMessage(createMockMessage({
|
|
1395
|
+
id: "msg-2",
|
|
1396
|
+
role: "assistant",
|
|
1397
|
+
threadId: "placeholder",
|
|
1398
|
+
}), false);
|
|
1399
|
+
});
|
|
1400
|
+
// Should NOT generate name for placeholder thread
|
|
1401
|
+
expect(mockThreadsApi.generateName).not.toHaveBeenCalled();
|
|
1402
|
+
});
|
|
1403
|
+
});
|
|
1234
1404
|
});
|
|
1235
1405
|
//# sourceMappingURL=tambo-thread-provider.test.js.map
|