@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.
Files changed (75) hide show
  1. package/dist/__tests__/util/validate-zod-schema.test.js +25 -0
  2. package/dist/__tests__/util/validate-zod-schema.test.js.map +1 -1
  3. package/dist/hooks/index.d.ts +1 -0
  4. package/dist/hooks/index.d.ts.map +1 -1
  5. package/dist/hooks/index.js +3 -1
  6. package/dist/hooks/index.js.map +1 -1
  7. package/dist/hooks/use-tambo-voice.d.ts +21 -0
  8. package/dist/hooks/use-tambo-voice.d.ts.map +1 -0
  9. package/dist/hooks/use-tambo-voice.js +74 -0
  10. package/dist/hooks/use-tambo-voice.js.map +1 -0
  11. package/dist/index.d.ts +1 -0
  12. package/dist/index.d.ts.map +1 -1
  13. package/dist/index.js +3 -1
  14. package/dist/index.js.map +1 -1
  15. package/dist/mcp/__tests__/tambo-mcp-provider.test.js +4 -4
  16. package/dist/mcp/__tests__/tambo-mcp-provider.test.js.map +1 -1
  17. package/dist/mcp/tambo-mcp-provider.d.ts +1 -1
  18. package/dist/mcp/tambo-mcp-provider.d.ts.map +1 -1
  19. package/dist/mcp/tambo-mcp-provider.js +2 -2
  20. package/dist/mcp/tambo-mcp-provider.js.map +1 -1
  21. package/dist/providers/__tests__/tambo-thread-provider-initial-messages.test.js +1 -1
  22. package/dist/providers/__tests__/tambo-thread-provider-initial-messages.test.js.map +1 -1
  23. package/dist/providers/__tests__/tambo-thread-provider.test.js +170 -0
  24. package/dist/providers/__tests__/tambo-thread-provider.test.js.map +1 -1
  25. package/dist/providers/tambo-provider.d.ts +2 -0
  26. package/dist/providers/tambo-provider.d.ts.map +1 -1
  27. package/dist/providers/tambo-provider.js +4 -2
  28. package/dist/providers/tambo-provider.js.map +1 -1
  29. package/dist/providers/tambo-thread-provider.d.ts +6 -0
  30. package/dist/providers/tambo-thread-provider.d.ts.map +1 -1
  31. package/dist/providers/tambo-thread-provider.js +112 -45
  32. package/dist/providers/tambo-thread-provider.js.map +1 -1
  33. package/dist/setupTests.js +10 -0
  34. package/dist/setupTests.js.map +1 -1
  35. package/dist/util/validate-zod-schema.d.ts.map +1 -1
  36. package/dist/util/validate-zod-schema.js +11 -0
  37. package/dist/util/validate-zod-schema.js.map +1 -1
  38. package/esm/__tests__/util/validate-zod-schema.test.js +25 -0
  39. package/esm/__tests__/util/validate-zod-schema.test.js.map +1 -1
  40. package/esm/hooks/index.d.ts +1 -0
  41. package/esm/hooks/index.d.ts.map +1 -1
  42. package/esm/hooks/index.js +1 -0
  43. package/esm/hooks/index.js.map +1 -1
  44. package/esm/hooks/use-tambo-voice.d.ts +21 -0
  45. package/esm/hooks/use-tambo-voice.d.ts.map +1 -0
  46. package/esm/hooks/use-tambo-voice.js +71 -0
  47. package/esm/hooks/use-tambo-voice.js.map +1 -0
  48. package/esm/index.d.ts +1 -0
  49. package/esm/index.d.ts.map +1 -1
  50. package/esm/index.js +1 -0
  51. package/esm/index.js.map +1 -1
  52. package/esm/mcp/__tests__/tambo-mcp-provider.test.js +4 -4
  53. package/esm/mcp/__tests__/tambo-mcp-provider.test.js.map +1 -1
  54. package/esm/mcp/tambo-mcp-provider.d.ts +1 -1
  55. package/esm/mcp/tambo-mcp-provider.d.ts.map +1 -1
  56. package/esm/mcp/tambo-mcp-provider.js +2 -2
  57. package/esm/mcp/tambo-mcp-provider.js.map +1 -1
  58. package/esm/providers/__tests__/tambo-thread-provider-initial-messages.test.js +1 -1
  59. package/esm/providers/__tests__/tambo-thread-provider-initial-messages.test.js.map +1 -1
  60. package/esm/providers/__tests__/tambo-thread-provider.test.js +170 -0
  61. package/esm/providers/__tests__/tambo-thread-provider.test.js.map +1 -1
  62. package/esm/providers/tambo-provider.d.ts +2 -0
  63. package/esm/providers/tambo-provider.d.ts.map +1 -1
  64. package/esm/providers/tambo-provider.js +4 -2
  65. package/esm/providers/tambo-provider.js.map +1 -1
  66. package/esm/providers/tambo-thread-provider.d.ts +6 -0
  67. package/esm/providers/tambo-thread-provider.d.ts.map +1 -1
  68. package/esm/providers/tambo-thread-provider.js +112 -45
  69. package/esm/providers/tambo-thread-provider.js.map +1 -1
  70. package/esm/setupTests.js +10 -0
  71. package/esm/setupTests.js.map +1 -1
  72. package/esm/util/validate-zod-schema.d.ts.map +1 -1
  73. package/esm/util/validate-zod-schema.js +11 -0
  74. package/esm/util/validate-zod-schema.js.map +1 -1
  75. 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