@tambo-ai/react 0.72.0 → 0.73.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (151) hide show
  1. package/dist/mcp/mcp-hooks.d.ts +4 -0
  2. package/dist/mcp/mcp-hooks.d.ts.map +1 -1
  3. package/dist/mcp/mcp-hooks.js +4 -0
  4. package/dist/mcp/mcp-hooks.js.map +1 -1
  5. package/dist/providers/tambo-provider.d.ts +3 -0
  6. package/dist/providers/tambo-provider.d.ts.map +1 -1
  7. package/dist/providers/tambo-provider.js +3 -0
  8. package/dist/providers/tambo-provider.js.map +1 -1
  9. package/dist/util/resource-content-resolver.d.ts.map +1 -1
  10. package/dist/util/resource-content-resolver.js +2 -0
  11. package/dist/util/resource-content-resolver.js.map +1 -1
  12. package/dist/v1/hooks/use-tambo-v1-messages.test.js +22 -9
  13. package/dist/v1/hooks/use-tambo-v1-messages.test.js.map +1 -1
  14. package/dist/v1/hooks/use-tambo-v1-send-message.d.ts +1 -0
  15. package/dist/v1/hooks/use-tambo-v1-send-message.d.ts.map +1 -1
  16. package/dist/v1/hooks/use-tambo-v1-send-message.js +9 -2
  17. package/dist/v1/hooks/use-tambo-v1-send-message.js.map +1 -1
  18. package/dist/v1/hooks/use-tambo-v1-send-message.test.js +22 -9
  19. package/dist/v1/hooks/use-tambo-v1-send-message.test.js.map +1 -1
  20. package/dist/v1/hooks/use-tambo-v1-suggestions.d.ts +91 -0
  21. package/dist/v1/hooks/use-tambo-v1-suggestions.d.ts.map +1 -0
  22. package/dist/v1/hooks/use-tambo-v1-suggestions.js +152 -0
  23. package/dist/v1/hooks/use-tambo-v1-suggestions.js.map +1 -0
  24. package/dist/v1/hooks/use-tambo-v1-suggestions.test.d.ts +2 -0
  25. package/dist/v1/hooks/use-tambo-v1-suggestions.test.d.ts.map +1 -0
  26. package/dist/v1/hooks/use-tambo-v1-suggestions.test.js +511 -0
  27. package/dist/v1/hooks/use-tambo-v1-suggestions.test.js.map +1 -0
  28. package/dist/v1/hooks/use-tambo-v1-thread-input.d.ts +6 -57
  29. package/dist/v1/hooks/use-tambo-v1-thread-input.d.ts.map +1 -1
  30. package/dist/v1/hooks/use-tambo-v1-thread-input.js +7 -67
  31. package/dist/v1/hooks/use-tambo-v1-thread-input.js.map +1 -1
  32. package/dist/v1/hooks/use-tambo-v1-thread-input.test.js +201 -72
  33. package/dist/v1/hooks/use-tambo-v1-thread-input.test.js.map +1 -1
  34. package/dist/v1/hooks/use-tambo-v1-thread-list.d.ts +6 -4
  35. package/dist/v1/hooks/use-tambo-v1-thread-list.d.ts.map +1 -1
  36. package/dist/v1/hooks/use-tambo-v1-thread-list.js +2 -2
  37. package/dist/v1/hooks/use-tambo-v1-thread-list.js.map +1 -1
  38. package/dist/v1/hooks/use-tambo-v1-thread-list.test.js +2 -2
  39. package/dist/v1/hooks/use-tambo-v1-thread-list.test.js.map +1 -1
  40. package/dist/v1/hooks/use-tambo-v1.test.js +16 -7
  41. package/dist/v1/hooks/use-tambo-v1.test.js.map +1 -1
  42. package/dist/v1/index.d.ts +22 -13
  43. package/dist/v1/index.d.ts.map +1 -1
  44. package/dist/v1/index.js +31 -39
  45. package/dist/v1/index.js.map +1 -1
  46. package/dist/v1/providers/tambo-v1-provider.d.ts +27 -9
  47. package/dist/v1/providers/tambo-v1-provider.d.ts.map +1 -1
  48. package/dist/v1/providers/tambo-v1-provider.js +22 -11
  49. package/dist/v1/providers/tambo-v1-provider.js.map +1 -1
  50. package/dist/v1/providers/tambo-v1-provider.test.js +27 -10
  51. package/dist/v1/providers/tambo-v1-provider.test.js.map +1 -1
  52. package/dist/v1/providers/tambo-v1-stream-context.d.ts +19 -10
  53. package/dist/v1/providers/tambo-v1-stream-context.d.ts.map +1 -1
  54. package/dist/v1/providers/tambo-v1-stream-context.js +43 -53
  55. package/dist/v1/providers/tambo-v1-stream-context.js.map +1 -1
  56. package/dist/v1/providers/tambo-v1-stream-context.test.js +94 -19
  57. package/dist/v1/providers/tambo-v1-stream-context.test.js.map +1 -1
  58. package/dist/v1/providers/tambo-v1-stub-provider.d.ts +74 -0
  59. package/dist/v1/providers/tambo-v1-stub-provider.d.ts.map +1 -0
  60. package/dist/v1/providers/tambo-v1-stub-provider.js +212 -0
  61. package/dist/v1/providers/tambo-v1-stub-provider.js.map +1 -0
  62. package/dist/v1/providers/tambo-v1-stub-provider.test.d.ts +2 -0
  63. package/dist/v1/providers/tambo-v1-stub-provider.test.d.ts.map +1 -0
  64. package/dist/v1/providers/tambo-v1-stub-provider.test.js +162 -0
  65. package/dist/v1/providers/tambo-v1-stub-provider.test.js.map +1 -0
  66. package/dist/v1/providers/tambo-v1-thread-input-provider.d.ts +105 -0
  67. package/dist/v1/providers/tambo-v1-thread-input-provider.d.ts.map +1 -0
  68. package/dist/v1/providers/tambo-v1-thread-input-provider.js +191 -0
  69. package/dist/v1/providers/tambo-v1-thread-input-provider.js.map +1 -0
  70. package/dist/v1/utils/component-renderer.d.ts +15 -67
  71. package/dist/v1/utils/component-renderer.d.ts.map +1 -1
  72. package/dist/v1/utils/component-renderer.js +3 -149
  73. package/dist/v1/utils/component-renderer.js.map +1 -1
  74. package/dist/v1/utils/component-renderer.test.js +15 -350
  75. package/dist/v1/utils/component-renderer.test.js.map +1 -1
  76. package/esm/mcp/mcp-hooks.d.ts +4 -0
  77. package/esm/mcp/mcp-hooks.d.ts.map +1 -1
  78. package/esm/mcp/mcp-hooks.js +4 -0
  79. package/esm/mcp/mcp-hooks.js.map +1 -1
  80. package/esm/providers/tambo-provider.d.ts +3 -0
  81. package/esm/providers/tambo-provider.d.ts.map +1 -1
  82. package/esm/providers/tambo-provider.js +3 -0
  83. package/esm/providers/tambo-provider.js.map +1 -1
  84. package/esm/util/resource-content-resolver.d.ts.map +1 -1
  85. package/esm/util/resource-content-resolver.js +2 -0
  86. package/esm/util/resource-content-resolver.js.map +1 -1
  87. package/esm/v1/hooks/use-tambo-v1-messages.test.js +22 -9
  88. package/esm/v1/hooks/use-tambo-v1-messages.test.js.map +1 -1
  89. package/esm/v1/hooks/use-tambo-v1-send-message.d.ts +1 -0
  90. package/esm/v1/hooks/use-tambo-v1-send-message.d.ts.map +1 -1
  91. package/esm/v1/hooks/use-tambo-v1-send-message.js +9 -2
  92. package/esm/v1/hooks/use-tambo-v1-send-message.js.map +1 -1
  93. package/esm/v1/hooks/use-tambo-v1-send-message.test.js +22 -9
  94. package/esm/v1/hooks/use-tambo-v1-send-message.test.js.map +1 -1
  95. package/esm/v1/hooks/use-tambo-v1-suggestions.d.ts +91 -0
  96. package/esm/v1/hooks/use-tambo-v1-suggestions.d.ts.map +1 -0
  97. package/esm/v1/hooks/use-tambo-v1-suggestions.js +149 -0
  98. package/esm/v1/hooks/use-tambo-v1-suggestions.js.map +1 -0
  99. package/esm/v1/hooks/use-tambo-v1-suggestions.test.d.ts +2 -0
  100. package/esm/v1/hooks/use-tambo-v1-suggestions.test.d.ts.map +1 -0
  101. package/esm/v1/hooks/use-tambo-v1-suggestions.test.js +506 -0
  102. package/esm/v1/hooks/use-tambo-v1-suggestions.test.js.map +1 -0
  103. package/esm/v1/hooks/use-tambo-v1-thread-input.d.ts +6 -57
  104. package/esm/v1/hooks/use-tambo-v1-thread-input.d.ts.map +1 -1
  105. package/esm/v1/hooks/use-tambo-v1-thread-input.js +5 -66
  106. package/esm/v1/hooks/use-tambo-v1-thread-input.js.map +1 -1
  107. package/esm/v1/hooks/use-tambo-v1-thread-input.test.js +199 -73
  108. package/esm/v1/hooks/use-tambo-v1-thread-input.test.js.map +1 -1
  109. package/esm/v1/hooks/use-tambo-v1-thread-list.d.ts +6 -4
  110. package/esm/v1/hooks/use-tambo-v1-thread-list.d.ts.map +1 -1
  111. package/esm/v1/hooks/use-tambo-v1-thread-list.js +2 -2
  112. package/esm/v1/hooks/use-tambo-v1-thread-list.js.map +1 -1
  113. package/esm/v1/hooks/use-tambo-v1-thread-list.test.js +2 -2
  114. package/esm/v1/hooks/use-tambo-v1-thread-list.test.js.map +1 -1
  115. package/esm/v1/hooks/use-tambo-v1.test.js +16 -7
  116. package/esm/v1/hooks/use-tambo-v1.test.js.map +1 -1
  117. package/esm/v1/index.d.ts +22 -13
  118. package/esm/v1/index.d.ts.map +1 -1
  119. package/esm/v1/index.js +23 -18
  120. package/esm/v1/index.js.map +1 -1
  121. package/esm/v1/providers/tambo-v1-provider.d.ts +27 -9
  122. package/esm/v1/providers/tambo-v1-provider.d.ts.map +1 -1
  123. package/esm/v1/providers/tambo-v1-provider.js +20 -10
  124. package/esm/v1/providers/tambo-v1-provider.js.map +1 -1
  125. package/esm/v1/providers/tambo-v1-provider.test.js +28 -11
  126. package/esm/v1/providers/tambo-v1-provider.test.js.map +1 -1
  127. package/esm/v1/providers/tambo-v1-stream-context.d.ts +19 -10
  128. package/esm/v1/providers/tambo-v1-stream-context.d.ts.map +1 -1
  129. package/esm/v1/providers/tambo-v1-stream-context.js +44 -54
  130. package/esm/v1/providers/tambo-v1-stream-context.js.map +1 -1
  131. package/esm/v1/providers/tambo-v1-stream-context.test.js +95 -20
  132. package/esm/v1/providers/tambo-v1-stream-context.test.js.map +1 -1
  133. package/esm/v1/providers/tambo-v1-stub-provider.d.ts +74 -0
  134. package/esm/v1/providers/tambo-v1-stub-provider.d.ts.map +1 -0
  135. package/esm/v1/providers/tambo-v1-stub-provider.js +176 -0
  136. package/esm/v1/providers/tambo-v1-stub-provider.js.map +1 -0
  137. package/esm/v1/providers/tambo-v1-stub-provider.test.d.ts +2 -0
  138. package/esm/v1/providers/tambo-v1-stub-provider.test.d.ts.map +1 -0
  139. package/esm/v1/providers/tambo-v1-stub-provider.test.js +157 -0
  140. package/esm/v1/providers/tambo-v1-stub-provider.test.js.map +1 -0
  141. package/esm/v1/providers/tambo-v1-thread-input-provider.d.ts +105 -0
  142. package/esm/v1/providers/tambo-v1-thread-input-provider.d.ts.map +1 -0
  143. package/esm/v1/providers/tambo-v1-thread-input-provider.js +153 -0
  144. package/esm/v1/providers/tambo-v1-thread-input-provider.js.map +1 -0
  145. package/esm/v1/utils/component-renderer.d.ts +15 -67
  146. package/esm/v1/utils/component-renderer.d.ts.map +1 -1
  147. package/esm/v1/utils/component-renderer.js +4 -146
  148. package/esm/v1/utils/component-renderer.js.map +1 -1
  149. package/esm/v1/utils/component-renderer.test.js +16 -351
  150. package/esm/v1/utils/component-renderer.test.js.map +1 -1
  151. package/package.json +2 -2
@@ -10,11 +10,15 @@ const react_2 = __importDefault(require("react"));
10
10
  const zod_1 = require("zod");
11
11
  const tambo_client_provider_1 = require("../../providers/tambo-client-provider");
12
12
  const tambo_registry_provider_1 = require("../../providers/tambo-registry-provider");
13
+ const tambo_v1_provider_1 = require("../providers/tambo-v1-provider");
13
14
  const tambo_v1_stream_context_1 = require("../providers/tambo-v1-stream-context");
14
15
  const use_tambo_v1_send_message_1 = require("./use-tambo-v1-send-message");
15
16
  jest.mock("../../providers/tambo-client-provider", () => ({
16
17
  useTamboClient: jest.fn(),
17
18
  }));
19
+ jest.mock("../providers/tambo-v1-provider", () => ({
20
+ useTamboV1Config: jest.fn(),
21
+ }));
18
22
  describe("useTamboV1SendMessage", () => {
19
23
  const mockThreadsRunsApi = {
20
24
  run: jest.fn(),
@@ -34,7 +38,7 @@ describe("useTamboV1SendMessage", () => {
34
38
  function TestWrapper({ children }) {
35
39
  return (react_2.default.createElement(react_query_1.QueryClientProvider, { client: queryClient },
36
40
  react_2.default.createElement(tambo_registry_provider_1.TamboRegistryContext.Provider, { value: mockRegistry },
37
- react_2.default.createElement(tambo_v1_stream_context_1.TamboV1StreamProvider, { threadId: "thread_123" }, children))));
41
+ react_2.default.createElement(tambo_v1_stream_context_1.TamboV1StreamProvider, null, children))));
38
42
  }
39
43
  beforeEach(() => {
40
44
  queryClient = new react_query_1.QueryClient({
@@ -44,6 +48,7 @@ describe("useTamboV1SendMessage", () => {
44
48
  },
45
49
  });
46
50
  jest.mocked(tambo_client_provider_1.useTamboClient).mockReturnValue(mockTamboAI);
51
+ jest.mocked(tambo_v1_provider_1.useTamboV1Config).mockReturnValue({ userKey: undefined });
47
52
  mockThreadsRunsApi.run.mockReset();
48
53
  mockThreadsRunsApi.create.mockReset();
49
54
  });
@@ -117,11 +122,13 @@ describe("createRunStream", () => {
117
122
  threadId: "thread_123",
118
123
  message: testMessage,
119
124
  registry: mockRegistry,
125
+ userKey: undefined,
120
126
  });
121
127
  expect(mockThreadsRunsApi.run).toHaveBeenCalledWith("thread_123", {
122
128
  message: testMessage,
123
129
  availableComponents: expect.any(Array),
124
130
  tools: expect.any(Array),
131
+ userKey: undefined,
125
132
  });
126
133
  expect(mockThreadsRunsApi.create).not.toHaveBeenCalled();
127
134
  expect(result.stream).toBe(mockStream);
@@ -134,11 +141,13 @@ describe("createRunStream", () => {
134
141
  threadId: undefined,
135
142
  message: testMessage,
136
143
  registry: mockRegistry,
144
+ userKey: undefined,
137
145
  });
138
146
  expect(mockThreadsRunsApi.create).toHaveBeenCalledWith({
139
147
  message: testMessage,
140
148
  availableComponents: expect.any(Array),
141
149
  tools: expect.any(Array),
150
+ thread: undefined,
142
151
  });
143
152
  expect(mockThreadsRunsApi.run).not.toHaveBeenCalled();
144
153
  expect(result.stream).toBe(mockStream);
@@ -151,6 +160,7 @@ describe("createRunStream", () => {
151
160
  threadId: "thread_123",
152
161
  message: testMessage,
153
162
  registry: mockRegistry,
163
+ userKey: undefined,
154
164
  });
155
165
  const callArgs = mockThreadsRunsApi.run.mock.calls[0][1];
156
166
  expect(callArgs.availableComponents).toEqual([
@@ -168,6 +178,7 @@ describe("createRunStream", () => {
168
178
  threadId: "thread_123",
169
179
  message: testMessage,
170
180
  registry: mockRegistry,
181
+ userKey: undefined,
171
182
  });
172
183
  const callArgs = mockThreadsRunsApi.run.mock.calls[0][1];
173
184
  expect(callArgs.tools).toEqual([
@@ -188,6 +199,7 @@ describe("createRunStream", () => {
188
199
  threadId: "thread_123",
189
200
  message: testMessage,
190
201
  registry: emptyRegistry,
202
+ userKey: undefined,
191
203
  });
192
204
  const callArgs = mockThreadsRunsApi.run.mock.calls[0][1];
193
205
  expect(callArgs.availableComponents).toEqual([]);
@@ -223,6 +235,7 @@ describe("useTamboV1SendMessage mutation", () => {
223
235
  },
224
236
  });
225
237
  jest.mocked(tambo_client_provider_1.useTamboClient).mockReturnValue(mockTamboAI);
238
+ jest.mocked(tambo_v1_provider_1.useTamboV1Config).mockReturnValue({ userKey: undefined });
226
239
  mockThreadsRunsApi.run.mockReset();
227
240
  mockThreadsRunsApi.create.mockReset();
228
241
  });
@@ -344,7 +357,7 @@ describe("useTamboV1SendMessage mutation", () => {
344
357
  function TestWrapper({ children }) {
345
358
  return (react_2.default.createElement(react_query_1.QueryClientProvider, { client: queryClient },
346
359
  react_2.default.createElement(tambo_registry_provider_1.TamboRegistryContext.Provider, { value: mockRegistry },
347
- react_2.default.createElement(tambo_v1_stream_context_1.TamboV1StreamProvider, { threadId: "thread_123" }, children))));
360
+ react_2.default.createElement(tambo_v1_stream_context_1.TamboV1StreamProvider, null, children))));
348
361
  }
349
362
  const { result } = (0, react_1.renderHook)(() => (0, use_tambo_v1_send_message_1.useTamboV1SendMessage)("thread_123"), {
350
363
  wrapper: TestWrapper,
@@ -438,7 +451,7 @@ describe("useTamboV1SendMessage mutation", () => {
438
451
  function TestWrapper({ children }) {
439
452
  return (react_2.default.createElement(react_query_1.QueryClientProvider, { client: queryClient },
440
453
  react_2.default.createElement(tambo_registry_provider_1.TamboRegistryContext.Provider, { value: mockRegistry },
441
- react_2.default.createElement(tambo_v1_stream_context_1.TamboV1StreamProvider, { threadId: "thread_123" }, children))));
454
+ react_2.default.createElement(tambo_v1_stream_context_1.TamboV1StreamProvider, null, children))));
442
455
  }
443
456
  const { result } = (0, react_1.renderHook)(() => (0, use_tambo_v1_send_message_1.useTamboV1SendMessage)("thread_123"), {
444
457
  wrapper: TestWrapper,
@@ -510,7 +523,7 @@ describe("useTamboV1SendMessage mutation", () => {
510
523
  function TestWrapper({ children }) {
511
524
  return (react_2.default.createElement(react_query_1.QueryClientProvider, { client: queryClient },
512
525
  react_2.default.createElement(tambo_registry_provider_1.TamboRegistryContext.Provider, { value: mockRegistry },
513
- react_2.default.createElement(tambo_v1_stream_context_1.TamboV1StreamProvider, { threadId: "thread_123" }, children))));
526
+ react_2.default.createElement(tambo_v1_stream_context_1.TamboV1StreamProvider, null, children))));
514
527
  }
515
528
  const { result } = (0, react_1.renderHook)(() => (0, use_tambo_v1_send_message_1.useTamboV1SendMessage)("thread_123"), {
516
529
  wrapper: TestWrapper,
@@ -577,7 +590,7 @@ describe("useTamboV1SendMessage mutation", () => {
577
590
  function TestWrapper({ children }) {
578
591
  return (react_2.default.createElement(react_query_1.QueryClientProvider, { client: queryClient },
579
592
  react_2.default.createElement(tambo_registry_provider_1.TamboRegistryContext.Provider, { value: mockRegistry },
580
- react_2.default.createElement(tambo_v1_stream_context_1.TamboV1StreamProvider, { threadId: "thread_123" }, children))));
593
+ react_2.default.createElement(tambo_v1_stream_context_1.TamboV1StreamProvider, null, children))));
581
594
  }
582
595
  const { result } = (0, react_1.renderHook)(() => (0, use_tambo_v1_send_message_1.useTamboV1SendMessage)("thread_123"), {
583
596
  wrapper: TestWrapper,
@@ -607,7 +620,7 @@ describe("useTamboV1SendMessage mutation", () => {
607
620
  // (though with an empty registry)
608
621
  function TestWrapperWithoutRegistry({ children, }) {
609
622
  return (react_2.default.createElement(react_query_1.QueryClientProvider, { client: queryClient },
610
- react_2.default.createElement(tambo_v1_stream_context_1.TamboV1StreamProvider, { threadId: "thread_123" }, children)));
623
+ react_2.default.createElement(tambo_v1_stream_context_1.TamboV1StreamProvider, null, children)));
611
624
  }
612
625
  // Should not throw - default context is used
613
626
  const { result } = (0, react_1.renderHook)(() => (0, use_tambo_v1_send_message_1.useTamboV1SendMessage)("thread_123"), {
@@ -632,7 +645,7 @@ describe("useTamboV1SendMessage mutation", () => {
632
645
  function TestWrapper({ children }) {
633
646
  return (react_2.default.createElement(react_query_1.QueryClientProvider, { client: queryClient },
634
647
  react_2.default.createElement(tambo_registry_provider_1.TamboRegistryContext.Provider, { value: mockRegistry },
635
- react_2.default.createElement(tambo_v1_stream_context_1.TamboV1StreamProvider, { threadId: "thread_123" }, children))));
648
+ react_2.default.createElement(tambo_v1_stream_context_1.TamboV1StreamProvider, null, children))));
636
649
  }
637
650
  const invalidateQueriesSpy = jest.spyOn(queryClient, "invalidateQueries");
638
651
  const { result } = (0, react_1.renderHook)(() => (0, use_tambo_v1_send_message_1.useTamboV1SendMessage)("thread_123"), {
@@ -752,7 +765,7 @@ describe("useTamboV1SendMessage mutation", () => {
752
765
  function TestWrapper({ children }) {
753
766
  return (react_2.default.createElement(react_query_1.QueryClientProvider, { client: queryClient },
754
767
  react_2.default.createElement(tambo_registry_provider_1.TamboRegistryContext.Provider, { value: mockRegistry },
755
- react_2.default.createElement(tambo_v1_stream_context_1.TamboV1StreamProvider, { threadId: "thread_123" }, children))));
768
+ react_2.default.createElement(tambo_v1_stream_context_1.TamboV1StreamProvider, null, children))));
756
769
  }
757
770
  const { result } = (0, react_1.renderHook)(() => (0, use_tambo_v1_send_message_1.useTamboV1SendMessage)("thread_123"), {
758
771
  wrapper: TestWrapper,
@@ -800,7 +813,7 @@ describe("useTamboV1SendMessage mutation", () => {
800
813
  function TestWrapper({ children }) {
801
814
  return (react_2.default.createElement(react_query_1.QueryClientProvider, { client: queryClient },
802
815
  react_2.default.createElement(tambo_registry_provider_1.TamboRegistryContext.Provider, { value: mockRegistry },
803
- react_2.default.createElement(tambo_v1_stream_context_1.TamboV1StreamProvider, { threadId: "thread_123" }, children))));
816
+ react_2.default.createElement(tambo_v1_stream_context_1.TamboV1StreamProvider, null, children))));
804
817
  }
805
818
  const { result } = (0, react_1.renderHook)(() => (0, use_tambo_v1_send_message_1.useTamboV1SendMessage)("thread_123"), {
806
819
  wrapper: TestWrapper,
@@ -1 +1 @@
1
- {"version":3,"file":"use-tambo-v1-send-message.test.js","sourceRoot":"","sources":["../../../src/v1/hooks/use-tambo-v1-send-message.test.tsx"],"names":[],"mappings":"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","sourcesContent":["import { EventType } from \"@ag-ui/core\";\nimport TamboAI from \"@tambo-ai/typescript-sdk\";\nimport { QueryClient, QueryClientProvider } from \"@tanstack/react-query\";\nimport { renderHook, waitFor, act } from \"@testing-library/react\";\nimport React from \"react\";\nimport { z } from \"zod\";\nimport type { TamboTool } from \"../../model/component-metadata\";\nimport { useTamboClient } from \"../../providers/tambo-client-provider\";\nimport { TamboRegistryContext } from \"../../providers/tambo-registry-provider\";\nimport { TamboV1StreamProvider } from \"../providers/tambo-v1-stream-context\";\nimport {\n createRunStream,\n useTamboV1SendMessage,\n} from \"./use-tambo-v1-send-message\";\n\njest.mock(\"../../providers/tambo-client-provider\", () => ({\n useTamboClient: jest.fn(),\n}));\n\ndescribe(\"useTamboV1SendMessage\", () => {\n const mockThreadsRunsApi = {\n run: jest.fn(),\n create: jest.fn(),\n };\n\n const mockTamboAI = {\n apiKey: \"\",\n threads: {\n runs: mockThreadsRunsApi,\n },\n } as unknown as TamboAI;\n\n const mockRegistry = {\n componentList: new Map(),\n toolRegistry: new Map(),\n };\n\n let queryClient: QueryClient;\n\n function TestWrapper({ children }: { children: React.ReactNode }) {\n return (\n <QueryClientProvider client={queryClient}>\n <TamboRegistryContext.Provider value={mockRegistry as any}>\n <TamboV1StreamProvider threadId=\"thread_123\">\n {children}\n </TamboV1StreamProvider>\n </TamboRegistryContext.Provider>\n </QueryClientProvider>\n );\n }\n\n beforeEach(() => {\n queryClient = new QueryClient({\n defaultOptions: {\n queries: { retry: false },\n mutations: { retry: false },\n },\n });\n jest.mocked(useTamboClient).mockReturnValue(mockTamboAI);\n mockThreadsRunsApi.run.mockReset();\n mockThreadsRunsApi.create.mockReset();\n });\n\n it(\"returns a mutation object\", () => {\n const { result } = renderHook(() => useTamboV1SendMessage(\"thread_123\"), {\n wrapper: TestWrapper,\n });\n\n expect(result.current.mutate).toBeDefined();\n expect(result.current.mutateAsync).toBeDefined();\n expect(result.current.isPending).toBe(false);\n });\n\n it(\"returns a mutation object when threadId is not provided\", () => {\n const { result } = renderHook(() => useTamboV1SendMessage(), {\n wrapper: TestWrapper,\n });\n\n expect(result.current.mutate).toBeDefined();\n expect(result.current.mutateAsync).toBeDefined();\n });\n});\n\ndescribe(\"createRunStream\", () => {\n const mockStream = {\n [Symbol.asyncIterator]: async function* () {\n yield { type: \"RUN_STARTED\", runId: \"run_1\", threadId: \"thread_123\" };\n },\n };\n\n const mockThreadsRunsApi = {\n run: jest.fn(),\n create: jest.fn(),\n };\n\n const mockClient = {\n threads: {\n runs: mockThreadsRunsApi,\n },\n } as unknown as TamboAI;\n\n const mockRegistry = {\n componentList: new Map([\n [\n \"TestComponent\",\n {\n name: \"TestComponent\",\n description: \"A test component\",\n component: () => null,\n propsSchema: z.object({ title: z.string() }),\n },\n ],\n ]),\n toolRegistry: new Map([\n [\n \"testTool\",\n {\n name: \"testTool\",\n description: \"A test tool\",\n tool: async () => \"result\",\n inputSchema: z.object({ query: z.string() }),\n },\n ],\n ]),\n };\n\n const testMessage = {\n role: \"user\" as const,\n content: [{ type: \"text\" as const, text: \"Hello\" }],\n };\n\n beforeEach(() => {\n mockThreadsRunsApi.run.mockReset();\n mockThreadsRunsApi.create.mockReset();\n });\n\n it(\"calls client.threads.runs.run when threadId is provided\", async () => {\n mockThreadsRunsApi.run.mockResolvedValue(mockStream);\n\n const result = await createRunStream({\n client: mockClient,\n threadId: \"thread_123\",\n message: testMessage,\n registry: mockRegistry as any,\n });\n\n expect(mockThreadsRunsApi.run).toHaveBeenCalledWith(\"thread_123\", {\n message: testMessage,\n availableComponents: expect.any(Array),\n tools: expect.any(Array),\n });\n expect(mockThreadsRunsApi.create).not.toHaveBeenCalled();\n expect(result.stream).toBe(mockStream);\n expect(result.initialThreadId).toBe(\"thread_123\");\n });\n\n it(\"calls client.threads.runs.create when threadId is not provided\", async () => {\n mockThreadsRunsApi.create.mockResolvedValue(mockStream);\n\n const result = await createRunStream({\n client: mockClient,\n threadId: undefined,\n message: testMessage,\n registry: mockRegistry as any,\n });\n\n expect(mockThreadsRunsApi.create).toHaveBeenCalledWith({\n message: testMessage,\n availableComponents: expect.any(Array),\n tools: expect.any(Array),\n });\n expect(mockThreadsRunsApi.run).not.toHaveBeenCalled();\n expect(result.stream).toBe(mockStream);\n expect(result.initialThreadId).toBeUndefined();\n });\n\n it(\"converts registry components to availableComponents format\", async () => {\n mockThreadsRunsApi.run.mockResolvedValue(mockStream);\n\n await createRunStream({\n client: mockClient,\n threadId: \"thread_123\",\n message: testMessage,\n registry: mockRegistry as any,\n });\n\n const callArgs = mockThreadsRunsApi.run.mock.calls[0][1];\n expect(callArgs.availableComponents).toEqual([\n {\n name: \"TestComponent\",\n description: \"A test component\",\n propsSchema: expect.any(Object),\n },\n ]);\n });\n\n it(\"converts registry tools to tools format\", async () => {\n mockThreadsRunsApi.run.mockResolvedValue(mockStream);\n\n await createRunStream({\n client: mockClient,\n threadId: \"thread_123\",\n message: testMessage,\n registry: mockRegistry as any,\n });\n\n const callArgs = mockThreadsRunsApi.run.mock.calls[0][1];\n expect(callArgs.tools).toEqual([\n expect.objectContaining({\n name: \"testTool\",\n description: \"A test tool\",\n }),\n ]);\n });\n\n it(\"handles empty registry\", async () => {\n mockThreadsRunsApi.run.mockResolvedValue(mockStream);\n\n const emptyRegistry = {\n componentList: new Map(),\n toolRegistry: new Map(),\n };\n\n await createRunStream({\n client: mockClient,\n threadId: \"thread_123\",\n message: testMessage,\n registry: emptyRegistry as any,\n });\n\n const callArgs = mockThreadsRunsApi.run.mock.calls[0][1];\n expect(callArgs.availableComponents).toEqual([]);\n expect(callArgs.tools).toEqual([]);\n });\n});\n\ndescribe(\"useTamboV1SendMessage mutation\", () => {\n const mockThreadsRunsApi = {\n run: jest.fn(),\n create: jest.fn(),\n };\n\n const mockTamboAI = {\n apiKey: \"\",\n threads: {\n runs: mockThreadsRunsApi,\n },\n } as unknown as TamboAI;\n\n let queryClient: QueryClient;\n\n function createAsyncIterator<T>(events: T[]) {\n return {\n [Symbol.asyncIterator]: async function* () {\n for (const event of events) {\n yield event;\n }\n },\n };\n }\n\n beforeEach(() => {\n queryClient = new QueryClient({\n defaultOptions: {\n queries: { retry: false },\n mutations: { retry: false },\n },\n });\n jest.mocked(useTamboClient).mockReturnValue(mockTamboAI);\n mockThreadsRunsApi.run.mockReset();\n mockThreadsRunsApi.create.mockReset();\n });\n\n it(\"extracts threadId from RUN_STARTED event when creating new thread\", async () => {\n const mockStream = createAsyncIterator([\n {\n type: EventType.RUN_STARTED,\n runId: \"run_1\",\n threadId: \"new_thread_123\",\n },\n { type: EventType.RUN_FINISHED },\n ]);\n\n mockThreadsRunsApi.create.mockResolvedValue(mockStream);\n\n const mockRegistry = {\n componentList: new Map(),\n toolRegistry: new Map(),\n };\n\n function TestWrapper({ children }: { children: React.ReactNode }) {\n return (\n <QueryClientProvider client={queryClient}>\n <TamboRegistryContext.Provider value={mockRegistry as any}>\n <TamboV1StreamProvider>{children}</TamboV1StreamProvider>\n </TamboRegistryContext.Provider>\n </QueryClientProvider>\n );\n }\n\n const { result } = renderHook(() => useTamboV1SendMessage(), {\n wrapper: TestWrapper,\n });\n\n let mutationResult: { threadId: string | undefined } | undefined;\n await act(async () => {\n mutationResult = await result.current.mutateAsync({\n message: {\n role: \"user\",\n content: [{ type: \"text\", text: \"Hello\" }],\n },\n });\n });\n\n expect(mutationResult?.threadId).toBe(\"new_thread_123\");\n });\n\n it(\"throws error when first event is not RUN_STARTED on new thread\", async () => {\n const mockStream = createAsyncIterator([\n { type: EventType.TEXT_MESSAGE_START, messageId: \"msg_1\" },\n ]);\n\n mockThreadsRunsApi.create.mockResolvedValue(mockStream);\n\n const mockRegistry = {\n componentList: new Map(),\n toolRegistry: new Map(),\n };\n\n function TestWrapper({ children }: { children: React.ReactNode }) {\n return (\n <QueryClientProvider client={queryClient}>\n <TamboRegistryContext.Provider value={mockRegistry as any}>\n <TamboV1StreamProvider>{children}</TamboV1StreamProvider>\n </TamboRegistryContext.Provider>\n </QueryClientProvider>\n );\n }\n\n const { result } = renderHook(() => useTamboV1SendMessage(), {\n wrapper: TestWrapper,\n });\n\n await expect(\n act(async () => {\n await result.current.mutateAsync({\n message: {\n role: \"user\",\n content: [{ type: \"text\", text: \"Hello\" }],\n },\n });\n }),\n ).rejects.toThrow(\"Expected first event to be RUN_STARTED with threadId\");\n });\n\n it(\"executes tools on awaiting_input event\", async () => {\n const toolExecuted = jest.fn().mockResolvedValue(\"tool result\");\n\n const testTool: TamboTool = {\n name: \"test_tool\",\n description: \"A test tool\",\n tool: toolExecuted,\n inputSchema: z.object({ query: z.string() }),\n outputSchema: z.string(),\n };\n\n const mockRegistry = {\n componentList: new Map(),\n toolRegistry: new Map([[\"test_tool\", testTool]]),\n };\n\n const initialStream = createAsyncIterator([\n {\n type: EventType.RUN_STARTED,\n runId: \"run_1\",\n threadId: \"thread_123\",\n },\n {\n type: EventType.TEXT_MESSAGE_START,\n messageId: \"msg_1\",\n role: \"assistant\",\n },\n {\n type: EventType.TOOL_CALL_START,\n toolCallId: \"call_1\",\n toolCallName: \"test_tool\",\n parentMessageId: \"msg_1\",\n },\n {\n type: EventType.TOOL_CALL_ARGS,\n toolCallId: \"call_1\",\n delta: '{\"query\":\"test\"}',\n },\n {\n type: EventType.TOOL_CALL_END,\n toolCallId: \"call_1\",\n },\n {\n type: EventType.CUSTOM,\n name: \"tambo.run.awaiting_input\",\n value: { pendingToolCallIds: [\"call_1\"] },\n },\n ]);\n\n const continueStream = createAsyncIterator([\n {\n type: EventType.RUN_STARTED,\n runId: \"run_2\",\n threadId: \"thread_123\",\n },\n { type: EventType.RUN_FINISHED },\n ]);\n\n mockThreadsRunsApi.run\n .mockResolvedValueOnce(initialStream)\n .mockResolvedValueOnce(continueStream);\n\n function TestWrapper({ children }: { children: React.ReactNode }) {\n return (\n <QueryClientProvider client={queryClient}>\n <TamboRegistryContext.Provider value={mockRegistry as any}>\n <TamboV1StreamProvider threadId=\"thread_123\">\n {children}\n </TamboV1StreamProvider>\n </TamboRegistryContext.Provider>\n </QueryClientProvider>\n );\n }\n\n const { result } = renderHook(() => useTamboV1SendMessage(\"thread_123\"), {\n wrapper: TestWrapper,\n });\n\n await act(async () => {\n await result.current.mutateAsync({\n message: {\n role: \"user\",\n content: [{ type: \"text\", text: \"Hello\" }],\n },\n });\n });\n\n expect(toolExecuted).toHaveBeenCalledWith({ query: \"test\" });\n\n // Verify continuation was called with tool results\n expect(mockThreadsRunsApi.run).toHaveBeenCalledTimes(2);\n const continueCall = mockThreadsRunsApi.run.mock.calls[1];\n expect(continueCall[0]).toBe(\"thread_123\");\n expect(continueCall[1].previousRunId).toBe(\"run_1\");\n expect(continueCall[1].message.content[0]).toEqual({\n type: \"tool_result\",\n toolUseId: \"call_1\",\n content: [{ type: \"text\", text: \"tool result\" }],\n });\n });\n\n it(\"handles tool calls with chunked args\", async () => {\n const toolExecuted = jest.fn().mockResolvedValue({ result: 42 });\n\n const testTool: TamboTool = {\n name: \"chunked_tool\",\n description: \"Tool with chunked args\",\n tool: toolExecuted,\n inputSchema: z.object({ a: z.number(), b: z.number() }),\n outputSchema: z.object({ result: z.number() }),\n };\n\n const mockRegistry = {\n componentList: new Map(),\n toolRegistry: new Map([[\"chunked_tool\", testTool]]),\n };\n\n const initialStream = createAsyncIterator([\n {\n type: EventType.RUN_STARTED,\n runId: \"run_1\",\n threadId: \"thread_123\",\n },\n {\n type: EventType.TEXT_MESSAGE_START,\n messageId: \"msg_1\",\n role: \"assistant\",\n },\n {\n type: EventType.TOOL_CALL_START,\n toolCallId: \"call_1\",\n toolCallName: \"chunked_tool\",\n parentMessageId: \"msg_1\",\n },\n {\n type: EventType.TOOL_CALL_ARGS,\n toolCallId: \"call_1\",\n delta: '{\"a\":',\n },\n {\n type: EventType.TOOL_CALL_ARGS,\n toolCallId: \"call_1\",\n delta: \"10,\",\n },\n {\n type: EventType.TOOL_CALL_ARGS,\n toolCallId: \"call_1\",\n delta: '\"b\":20}',\n },\n {\n type: EventType.TOOL_CALL_END,\n toolCallId: \"call_1\",\n },\n {\n type: EventType.CUSTOM,\n name: \"tambo.run.awaiting_input\",\n value: { pendingToolCallIds: [\"call_1\"] },\n },\n ]);\n\n const continueStream = createAsyncIterator([\n {\n type: EventType.RUN_STARTED,\n runId: \"run_2\",\n threadId: \"thread_123\",\n },\n { type: EventType.RUN_FINISHED },\n ]);\n\n mockThreadsRunsApi.run\n .mockResolvedValueOnce(initialStream)\n .mockResolvedValueOnce(continueStream);\n\n function TestWrapper({ children }: { children: React.ReactNode }) {\n return (\n <QueryClientProvider client={queryClient}>\n <TamboRegistryContext.Provider value={mockRegistry as any}>\n <TamboV1StreamProvider threadId=\"thread_123\">\n {children}\n </TamboV1StreamProvider>\n </TamboRegistryContext.Provider>\n </QueryClientProvider>\n );\n }\n\n const { result } = renderHook(() => useTamboV1SendMessage(\"thread_123\"), {\n wrapper: TestWrapper,\n });\n\n await act(async () => {\n await result.current.mutateAsync({\n message: {\n role: \"user\",\n content: [{ type: \"text\", text: \"Calculate\" }],\n },\n });\n });\n\n expect(toolExecuted).toHaveBeenCalledWith({ a: 10, b: 20 });\n });\n\n it(\"handles missing TOOL_CALL_ARGS gracefully\", async () => {\n // Test that tools can be executed even when no args events are received\n // (the hook keeps input as empty object)\n const toolExecuted = jest.fn().mockResolvedValue(\"result\");\n\n const testTool: TamboTool = {\n name: \"test_tool\",\n description: \"Test tool\",\n tool: toolExecuted,\n inputSchema: z.object({}),\n outputSchema: z.string(),\n };\n\n const mockRegistry = {\n componentList: new Map(),\n toolRegistry: new Map([[\"test_tool\", testTool]]),\n };\n\n const initialStream = createAsyncIterator([\n {\n type: EventType.RUN_STARTED,\n runId: \"run_1\",\n threadId: \"thread_123\",\n },\n {\n type: EventType.TEXT_MESSAGE_START,\n messageId: \"msg_1\",\n role: \"assistant\",\n },\n {\n type: EventType.TOOL_CALL_START,\n toolCallId: \"call_1\",\n toolCallName: \"test_tool\",\n parentMessageId: \"msg_1\",\n },\n // No TOOL_CALL_ARGS events - args will be empty\n {\n type: EventType.TOOL_CALL_END,\n toolCallId: \"call_1\",\n },\n {\n type: EventType.CUSTOM,\n name: \"tambo.run.awaiting_input\",\n value: { pendingToolCallIds: [\"call_1\"] },\n },\n ]);\n\n const continueStream = createAsyncIterator([\n {\n type: EventType.RUN_STARTED,\n runId: \"run_2\",\n threadId: \"thread_123\",\n },\n { type: EventType.RUN_FINISHED },\n ]);\n\n mockThreadsRunsApi.run\n .mockResolvedValueOnce(initialStream)\n .mockResolvedValueOnce(continueStream);\n\n function TestWrapper({ children }: { children: React.ReactNode }) {\n return (\n <QueryClientProvider client={queryClient}>\n <TamboRegistryContext.Provider value={mockRegistry as any}>\n <TamboV1StreamProvider threadId=\"thread_123\">\n {children}\n </TamboV1StreamProvider>\n </TamboRegistryContext.Provider>\n </QueryClientProvider>\n );\n }\n\n const { result } = renderHook(() => useTamboV1SendMessage(\"thread_123\"), {\n wrapper: TestWrapper,\n });\n\n await act(async () => {\n await result.current.mutateAsync({\n message: {\n role: \"user\",\n content: [{ type: \"text\", text: \"Test\" }],\n },\n });\n });\n\n // Tool should be called with empty input due to no args events\n expect(toolExecuted).toHaveBeenCalledWith({});\n });\n\n it(\"handles unknown tool in awaiting_input by returning error result\", async () => {\n const mockRegistry = {\n componentList: new Map(),\n toolRegistry: new Map(), // Empty registry - tool not found\n };\n\n const initialStream = createAsyncIterator([\n {\n type: EventType.RUN_STARTED,\n runId: \"run_1\",\n threadId: \"thread_123\",\n },\n {\n type: EventType.TEXT_MESSAGE_START,\n messageId: \"msg_1\",\n role: \"assistant\",\n },\n {\n type: EventType.TOOL_CALL_START,\n toolCallId: \"call_1\",\n toolCallName: \"unknown_tool\",\n parentMessageId: \"msg_1\",\n },\n {\n type: EventType.TOOL_CALL_ARGS,\n toolCallId: \"call_1\",\n delta: \"{}\",\n },\n {\n type: EventType.TOOL_CALL_END,\n toolCallId: \"call_1\",\n },\n {\n type: EventType.CUSTOM,\n name: \"tambo.run.awaiting_input\",\n value: { pendingToolCallIds: [\"call_1\"] },\n },\n ]);\n\n const continueStream = createAsyncIterator([\n {\n type: EventType.RUN_STARTED,\n runId: \"run_2\",\n threadId: \"thread_123\",\n },\n { type: EventType.RUN_FINISHED },\n ]);\n\n mockThreadsRunsApi.run\n .mockResolvedValueOnce(initialStream)\n .mockResolvedValueOnce(continueStream);\n\n function TestWrapper({ children }: { children: React.ReactNode }) {\n return (\n <QueryClientProvider client={queryClient}>\n <TamboRegistryContext.Provider value={mockRegistry as any}>\n <TamboV1StreamProvider threadId=\"thread_123\">\n {children}\n </TamboV1StreamProvider>\n </TamboRegistryContext.Provider>\n </QueryClientProvider>\n );\n }\n\n const { result } = renderHook(() => useTamboV1SendMessage(\"thread_123\"), {\n wrapper: TestWrapper,\n });\n\n await act(async () => {\n await result.current.mutateAsync({\n message: {\n role: \"user\",\n content: [{ type: \"text\", text: \"Test\" }],\n },\n });\n });\n\n // Verify continuation was called (second call)\n expect(mockThreadsRunsApi.run).toHaveBeenCalledTimes(2);\n\n // Continuation should include error message for unknown tool\n const continueCall = mockThreadsRunsApi.run.mock.calls[1];\n expect(continueCall[1].message.content[0]).toEqual({\n type: \"tool_result\",\n toolUseId: \"call_1\",\n content: [\n { type: \"text\", text: 'Tool \"unknown_tool\" not found in registry' },\n ],\n });\n });\n\n it(\"works with default registry context when no provider is present\", () => {\n // TamboRegistryContext has a default value, so the hook should work\n // (though with an empty registry)\n function TestWrapperWithoutRegistry({\n children,\n }: {\n children: React.ReactNode;\n }) {\n return (\n <QueryClientProvider client={queryClient}>\n <TamboV1StreamProvider threadId=\"thread_123\">\n {children}\n </TamboV1StreamProvider>\n </QueryClientProvider>\n );\n }\n\n // Should not throw - default context is used\n const { result } = renderHook(() => useTamboV1SendMessage(\"thread_123\"), {\n wrapper: TestWrapperWithoutRegistry,\n });\n\n expect(result.current.mutate).toBeDefined();\n });\n\n it(\"invalidates queries on successful mutation\", async () => {\n const mockStream = createAsyncIterator([\n {\n type: EventType.RUN_STARTED,\n runId: \"run_1\",\n threadId: \"thread_123\",\n },\n { type: EventType.RUN_FINISHED },\n ]);\n\n mockThreadsRunsApi.run.mockResolvedValue(mockStream);\n\n const mockRegistry = {\n componentList: new Map(),\n toolRegistry: new Map(),\n };\n\n function TestWrapper({ children }: { children: React.ReactNode }) {\n return (\n <QueryClientProvider client={queryClient}>\n <TamboRegistryContext.Provider value={mockRegistry as any}>\n <TamboV1StreamProvider threadId=\"thread_123\">\n {children}\n </TamboV1StreamProvider>\n </TamboRegistryContext.Provider>\n </QueryClientProvider>\n );\n }\n\n const invalidateQueriesSpy = jest.spyOn(queryClient, \"invalidateQueries\");\n\n const { result } = renderHook(() => useTamboV1SendMessage(\"thread_123\"), {\n wrapper: TestWrapper,\n });\n\n await act(async () => {\n await result.current.mutateAsync({\n message: {\n role: \"user\",\n content: [{ type: \"text\", text: \"Hello\" }],\n },\n });\n });\n\n await waitFor(() => {\n expect(invalidateQueriesSpy).toHaveBeenCalledWith({\n queryKey: [\"v1-threads\", \"thread_123\"],\n });\n });\n });\n\n it(\"handles multi-round tool execution (tool→AI→tool→AI)\", async () => {\n const tool1Executed = jest.fn().mockResolvedValue(\"result from tool 1\");\n const tool2Executed = jest.fn().mockResolvedValue(\"result from tool 2\");\n\n const tool1: TamboTool = {\n name: \"tool_1\",\n description: \"First tool\",\n tool: tool1Executed,\n inputSchema: z.object({ input: z.string() }),\n outputSchema: z.string(),\n };\n\n const tool2: TamboTool = {\n name: \"tool_2\",\n description: \"Second tool\",\n tool: tool2Executed,\n inputSchema: z.object({ input: z.string() }),\n outputSchema: z.string(),\n };\n\n const mockRegistry = {\n componentList: new Map(),\n toolRegistry: new Map([\n [\"tool_1\", tool1],\n [\"tool_2\", tool2],\n ]),\n };\n\n // Initial stream: AI calls tool_1\n const initialStream = createAsyncIterator([\n {\n type: EventType.RUN_STARTED,\n runId: \"run_1\",\n threadId: \"thread_123\",\n },\n {\n type: EventType.TEXT_MESSAGE_START,\n messageId: \"msg_1\",\n role: \"assistant\",\n },\n {\n type: EventType.TOOL_CALL_START,\n toolCallId: \"call_1\",\n toolCallName: \"tool_1\",\n parentMessageId: \"msg_1\",\n },\n {\n type: EventType.TOOL_CALL_ARGS,\n toolCallId: \"call_1\",\n delta: '{\"input\":\"first\"}',\n },\n { type: EventType.TOOL_CALL_END, toolCallId: \"call_1\" },\n {\n type: EventType.CUSTOM,\n name: \"tambo.run.awaiting_input\",\n value: { pendingToolCallIds: [\"call_1\"] },\n },\n ]);\n\n // Second stream: AI receives tool_1 result, then calls tool_2\n const secondStream = createAsyncIterator([\n {\n type: EventType.RUN_STARTED,\n runId: \"run_2\",\n threadId: \"thread_123\",\n },\n {\n type: EventType.TEXT_MESSAGE_START,\n messageId: \"msg_2\",\n role: \"assistant\",\n },\n {\n type: EventType.TOOL_CALL_START,\n toolCallId: \"call_2\",\n toolCallName: \"tool_2\",\n parentMessageId: \"msg_2\",\n },\n {\n type: EventType.TOOL_CALL_ARGS,\n toolCallId: \"call_2\",\n delta: '{\"input\":\"second\"}',\n },\n { type: EventType.TOOL_CALL_END, toolCallId: \"call_2\" },\n {\n type: EventType.CUSTOM,\n name: \"tambo.run.awaiting_input\",\n value: { pendingToolCallIds: [\"call_2\"] },\n },\n ]);\n\n // Third stream: AI receives tool_2 result, finishes\n const thirdStream = createAsyncIterator([\n {\n type: EventType.RUN_STARTED,\n runId: \"run_3\",\n threadId: \"thread_123\",\n },\n { type: EventType.RUN_FINISHED },\n ]);\n\n mockThreadsRunsApi.run\n .mockResolvedValueOnce(initialStream)\n .mockResolvedValueOnce(secondStream)\n .mockResolvedValueOnce(thirdStream);\n\n function TestWrapper({ children }: { children: React.ReactNode }) {\n return (\n <QueryClientProvider client={queryClient}>\n <TamboRegistryContext.Provider value={mockRegistry as any}>\n <TamboV1StreamProvider threadId=\"thread_123\">\n {children}\n </TamboV1StreamProvider>\n </TamboRegistryContext.Provider>\n </QueryClientProvider>\n );\n }\n\n const { result } = renderHook(() => useTamboV1SendMessage(\"thread_123\"), {\n wrapper: TestWrapper,\n });\n\n await act(async () => {\n await result.current.mutateAsync({\n message: {\n role: \"user\",\n content: [{ type: \"text\", text: \"Hello\" }],\n },\n });\n });\n\n // Both tools should have been executed\n expect(tool1Executed).toHaveBeenCalledWith({ input: \"first\" });\n expect(tool2Executed).toHaveBeenCalledWith({ input: \"second\" });\n\n // Should have made 3 API calls (initial + 2 continuations)\n expect(mockThreadsRunsApi.run).toHaveBeenCalledTimes(3);\n\n // First continuation should have tool_1 result with previousRunId: run_1\n const firstContinue = mockThreadsRunsApi.run.mock.calls[1];\n expect(firstContinue[1].previousRunId).toBe(\"run_1\");\n expect(firstContinue[1].message.content[0]).toEqual({\n type: \"tool_result\",\n toolUseId: \"call_1\",\n content: [{ type: \"text\", text: \"result from tool 1\" }],\n });\n\n // Second continuation should have tool_2 result with previousRunId: run_2\n const secondContinue = mockThreadsRunsApi.run.mock.calls[2];\n expect(secondContinue[1].previousRunId).toBe(\"run_2\");\n expect(secondContinue[1].message.content[0]).toEqual({\n type: \"tool_result\",\n toolUseId: \"call_2\",\n content: [{ type: \"text\", text: \"result from tool 2\" }],\n });\n });\n\n it(\"logs error on mutation failure\", async () => {\n const consoleSpy = jest\n .spyOn(console, \"error\")\n .mockImplementation(() => {});\n const testError = new Error(\"API Error\");\n mockThreadsRunsApi.run.mockRejectedValue(testError);\n\n const mockRegistry = {\n componentList: new Map(),\n toolRegistry: new Map(),\n };\n\n function TestWrapper({ children }: { children: React.ReactNode }) {\n return (\n <QueryClientProvider client={queryClient}>\n <TamboRegistryContext.Provider value={mockRegistry as any}>\n <TamboV1StreamProvider threadId=\"thread_123\">\n {children}\n </TamboV1StreamProvider>\n </TamboRegistryContext.Provider>\n </QueryClientProvider>\n );\n }\n\n const { result } = renderHook(() => useTamboV1SendMessage(\"thread_123\"), {\n wrapper: TestWrapper,\n });\n\n try {\n await act(async () => {\n await result.current.mutateAsync({\n message: {\n role: \"user\",\n content: [{ type: \"text\", text: \"Hello\" }],\n },\n });\n });\n } catch {\n // Expected to throw\n }\n\n await waitFor(() => {\n expect(consoleSpy).toHaveBeenCalledWith(\n \"[useTamboV1SendMessage] Mutation failed:\",\n testError,\n );\n });\n\n consoleSpy.mockRestore();\n });\n});\n"]}
1
+ {"version":3,"file":"use-tambo-v1-send-message.test.js","sourceRoot":"","sources":["../../../src/v1/hooks/use-tambo-v1-send-message.test.tsx"],"names":[],"mappings":"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","sourcesContent":["import { EventType } from \"@ag-ui/core\";\nimport TamboAI from \"@tambo-ai/typescript-sdk\";\nimport { QueryClient, QueryClientProvider } from \"@tanstack/react-query\";\nimport { renderHook, waitFor, act } from \"@testing-library/react\";\nimport React from \"react\";\nimport { z } from \"zod\";\nimport type { TamboTool } from \"../../model/component-metadata\";\nimport { useTamboClient } from \"../../providers/tambo-client-provider\";\nimport { TamboRegistryContext } from \"../../providers/tambo-registry-provider\";\nimport { useTamboV1Config } from \"../providers/tambo-v1-provider\";\nimport { TamboV1StreamProvider } from \"../providers/tambo-v1-stream-context\";\nimport {\n createRunStream,\n useTamboV1SendMessage,\n} from \"./use-tambo-v1-send-message\";\n\njest.mock(\"../../providers/tambo-client-provider\", () => ({\n useTamboClient: jest.fn(),\n}));\n\njest.mock(\"../providers/tambo-v1-provider\", () => ({\n useTamboV1Config: jest.fn(),\n}));\n\ndescribe(\"useTamboV1SendMessage\", () => {\n const mockThreadsRunsApi = {\n run: jest.fn(),\n create: jest.fn(),\n };\n\n const mockTamboAI = {\n apiKey: \"\",\n threads: {\n runs: mockThreadsRunsApi,\n },\n } as unknown as TamboAI;\n\n const mockRegistry = {\n componentList: new Map(),\n toolRegistry: new Map(),\n };\n\n let queryClient: QueryClient;\n\n function TestWrapper({ children }: { children: React.ReactNode }) {\n return (\n <QueryClientProvider client={queryClient}>\n <TamboRegistryContext.Provider value={mockRegistry as any}>\n <TamboV1StreamProvider>{children}</TamboV1StreamProvider>\n </TamboRegistryContext.Provider>\n </QueryClientProvider>\n );\n }\n\n beforeEach(() => {\n queryClient = new QueryClient({\n defaultOptions: {\n queries: { retry: false },\n mutations: { retry: false },\n },\n });\n jest.mocked(useTamboClient).mockReturnValue(mockTamboAI);\n jest.mocked(useTamboV1Config).mockReturnValue({ userKey: undefined });\n mockThreadsRunsApi.run.mockReset();\n mockThreadsRunsApi.create.mockReset();\n });\n\n it(\"returns a mutation object\", () => {\n const { result } = renderHook(() => useTamboV1SendMessage(\"thread_123\"), {\n wrapper: TestWrapper,\n });\n\n expect(result.current.mutate).toBeDefined();\n expect(result.current.mutateAsync).toBeDefined();\n expect(result.current.isPending).toBe(false);\n });\n\n it(\"returns a mutation object when threadId is not provided\", () => {\n const { result } = renderHook(() => useTamboV1SendMessage(), {\n wrapper: TestWrapper,\n });\n\n expect(result.current.mutate).toBeDefined();\n expect(result.current.mutateAsync).toBeDefined();\n });\n});\n\ndescribe(\"createRunStream\", () => {\n const mockStream = {\n [Symbol.asyncIterator]: async function* () {\n yield { type: \"RUN_STARTED\", runId: \"run_1\", threadId: \"thread_123\" };\n },\n };\n\n const mockThreadsRunsApi = {\n run: jest.fn(),\n create: jest.fn(),\n };\n\n const mockClient = {\n threads: {\n runs: mockThreadsRunsApi,\n },\n } as unknown as TamboAI;\n\n const mockRegistry = {\n componentList: new Map([\n [\n \"TestComponent\",\n {\n name: \"TestComponent\",\n description: \"A test component\",\n component: () => null,\n propsSchema: z.object({ title: z.string() }),\n },\n ],\n ]),\n toolRegistry: new Map([\n [\n \"testTool\",\n {\n name: \"testTool\",\n description: \"A test tool\",\n tool: async () => \"result\",\n inputSchema: z.object({ query: z.string() }),\n },\n ],\n ]),\n };\n\n const testMessage = {\n role: \"user\" as const,\n content: [{ type: \"text\" as const, text: \"Hello\" }],\n };\n\n beforeEach(() => {\n mockThreadsRunsApi.run.mockReset();\n mockThreadsRunsApi.create.mockReset();\n });\n\n it(\"calls client.threads.runs.run when threadId is provided\", async () => {\n mockThreadsRunsApi.run.mockResolvedValue(mockStream);\n\n const result = await createRunStream({\n client: mockClient,\n threadId: \"thread_123\",\n message: testMessage,\n registry: mockRegistry as any,\n userKey: undefined,\n });\n\n expect(mockThreadsRunsApi.run).toHaveBeenCalledWith(\"thread_123\", {\n message: testMessage,\n availableComponents: expect.any(Array),\n tools: expect.any(Array),\n userKey: undefined,\n });\n expect(mockThreadsRunsApi.create).not.toHaveBeenCalled();\n expect(result.stream).toBe(mockStream);\n expect(result.initialThreadId).toBe(\"thread_123\");\n });\n\n it(\"calls client.threads.runs.create when threadId is not provided\", async () => {\n mockThreadsRunsApi.create.mockResolvedValue(mockStream);\n\n const result = await createRunStream({\n client: mockClient,\n threadId: undefined,\n message: testMessage,\n registry: mockRegistry as any,\n userKey: undefined,\n });\n\n expect(mockThreadsRunsApi.create).toHaveBeenCalledWith({\n message: testMessage,\n availableComponents: expect.any(Array),\n tools: expect.any(Array),\n thread: undefined,\n });\n expect(mockThreadsRunsApi.run).not.toHaveBeenCalled();\n expect(result.stream).toBe(mockStream);\n expect(result.initialThreadId).toBeUndefined();\n });\n\n it(\"converts registry components to availableComponents format\", async () => {\n mockThreadsRunsApi.run.mockResolvedValue(mockStream);\n\n await createRunStream({\n client: mockClient,\n threadId: \"thread_123\",\n message: testMessage,\n registry: mockRegistry as any,\n userKey: undefined,\n });\n\n const callArgs = mockThreadsRunsApi.run.mock.calls[0][1];\n expect(callArgs.availableComponents).toEqual([\n {\n name: \"TestComponent\",\n description: \"A test component\",\n propsSchema: expect.any(Object),\n },\n ]);\n });\n\n it(\"converts registry tools to tools format\", async () => {\n mockThreadsRunsApi.run.mockResolvedValue(mockStream);\n\n await createRunStream({\n client: mockClient,\n threadId: \"thread_123\",\n message: testMessage,\n registry: mockRegistry as any,\n userKey: undefined,\n });\n\n const callArgs = mockThreadsRunsApi.run.mock.calls[0][1];\n expect(callArgs.tools).toEqual([\n expect.objectContaining({\n name: \"testTool\",\n description: \"A test tool\",\n }),\n ]);\n });\n\n it(\"handles empty registry\", async () => {\n mockThreadsRunsApi.run.mockResolvedValue(mockStream);\n\n const emptyRegistry = {\n componentList: new Map(),\n toolRegistry: new Map(),\n };\n\n await createRunStream({\n client: mockClient,\n threadId: \"thread_123\",\n message: testMessage,\n registry: emptyRegistry as any,\n userKey: undefined,\n });\n\n const callArgs = mockThreadsRunsApi.run.mock.calls[0][1];\n expect(callArgs.availableComponents).toEqual([]);\n expect(callArgs.tools).toEqual([]);\n });\n});\n\ndescribe(\"useTamboV1SendMessage mutation\", () => {\n const mockThreadsRunsApi = {\n run: jest.fn(),\n create: jest.fn(),\n };\n\n const mockTamboAI = {\n apiKey: \"\",\n threads: {\n runs: mockThreadsRunsApi,\n },\n } as unknown as TamboAI;\n\n let queryClient: QueryClient;\n\n function createAsyncIterator<T>(events: T[]) {\n return {\n [Symbol.asyncIterator]: async function* () {\n for (const event of events) {\n yield event;\n }\n },\n };\n }\n\n beforeEach(() => {\n queryClient = new QueryClient({\n defaultOptions: {\n queries: { retry: false },\n mutations: { retry: false },\n },\n });\n jest.mocked(useTamboClient).mockReturnValue(mockTamboAI);\n jest.mocked(useTamboV1Config).mockReturnValue({ userKey: undefined });\n mockThreadsRunsApi.run.mockReset();\n mockThreadsRunsApi.create.mockReset();\n });\n\n it(\"extracts threadId from RUN_STARTED event when creating new thread\", async () => {\n const mockStream = createAsyncIterator([\n {\n type: EventType.RUN_STARTED,\n runId: \"run_1\",\n threadId: \"new_thread_123\",\n },\n { type: EventType.RUN_FINISHED },\n ]);\n\n mockThreadsRunsApi.create.mockResolvedValue(mockStream);\n\n const mockRegistry = {\n componentList: new Map(),\n toolRegistry: new Map(),\n };\n\n function TestWrapper({ children }: { children: React.ReactNode }) {\n return (\n <QueryClientProvider client={queryClient}>\n <TamboRegistryContext.Provider value={mockRegistry as any}>\n <TamboV1StreamProvider>{children}</TamboV1StreamProvider>\n </TamboRegistryContext.Provider>\n </QueryClientProvider>\n );\n }\n\n const { result } = renderHook(() => useTamboV1SendMessage(), {\n wrapper: TestWrapper,\n });\n\n let mutationResult: { threadId: string | undefined } | undefined;\n await act(async () => {\n mutationResult = await result.current.mutateAsync({\n message: {\n role: \"user\",\n content: [{ type: \"text\", text: \"Hello\" }],\n },\n });\n });\n\n expect(mutationResult?.threadId).toBe(\"new_thread_123\");\n });\n\n it(\"throws error when first event is not RUN_STARTED on new thread\", async () => {\n const mockStream = createAsyncIterator([\n { type: EventType.TEXT_MESSAGE_START, messageId: \"msg_1\" },\n ]);\n\n mockThreadsRunsApi.create.mockResolvedValue(mockStream);\n\n const mockRegistry = {\n componentList: new Map(),\n toolRegistry: new Map(),\n };\n\n function TestWrapper({ children }: { children: React.ReactNode }) {\n return (\n <QueryClientProvider client={queryClient}>\n <TamboRegistryContext.Provider value={mockRegistry as any}>\n <TamboV1StreamProvider>{children}</TamboV1StreamProvider>\n </TamboRegistryContext.Provider>\n </QueryClientProvider>\n );\n }\n\n const { result } = renderHook(() => useTamboV1SendMessage(), {\n wrapper: TestWrapper,\n });\n\n await expect(\n act(async () => {\n await result.current.mutateAsync({\n message: {\n role: \"user\",\n content: [{ type: \"text\", text: \"Hello\" }],\n },\n });\n }),\n ).rejects.toThrow(\"Expected first event to be RUN_STARTED with threadId\");\n });\n\n it(\"executes tools on awaiting_input event\", async () => {\n const toolExecuted = jest.fn().mockResolvedValue(\"tool result\");\n\n const testTool: TamboTool = {\n name: \"test_tool\",\n description: \"A test tool\",\n tool: toolExecuted,\n inputSchema: z.object({ query: z.string() }),\n outputSchema: z.string(),\n };\n\n const mockRegistry = {\n componentList: new Map(),\n toolRegistry: new Map([[\"test_tool\", testTool]]),\n };\n\n const initialStream = createAsyncIterator([\n {\n type: EventType.RUN_STARTED,\n runId: \"run_1\",\n threadId: \"thread_123\",\n },\n {\n type: EventType.TEXT_MESSAGE_START,\n messageId: \"msg_1\",\n role: \"assistant\",\n },\n {\n type: EventType.TOOL_CALL_START,\n toolCallId: \"call_1\",\n toolCallName: \"test_tool\",\n parentMessageId: \"msg_1\",\n },\n {\n type: EventType.TOOL_CALL_ARGS,\n toolCallId: \"call_1\",\n delta: '{\"query\":\"test\"}',\n },\n {\n type: EventType.TOOL_CALL_END,\n toolCallId: \"call_1\",\n },\n {\n type: EventType.CUSTOM,\n name: \"tambo.run.awaiting_input\",\n value: { pendingToolCallIds: [\"call_1\"] },\n },\n ]);\n\n const continueStream = createAsyncIterator([\n {\n type: EventType.RUN_STARTED,\n runId: \"run_2\",\n threadId: \"thread_123\",\n },\n { type: EventType.RUN_FINISHED },\n ]);\n\n mockThreadsRunsApi.run\n .mockResolvedValueOnce(initialStream)\n .mockResolvedValueOnce(continueStream);\n\n function TestWrapper({ children }: { children: React.ReactNode }) {\n return (\n <QueryClientProvider client={queryClient}>\n <TamboRegistryContext.Provider value={mockRegistry as any}>\n <TamboV1StreamProvider>{children}</TamboV1StreamProvider>\n </TamboRegistryContext.Provider>\n </QueryClientProvider>\n );\n }\n\n const { result } = renderHook(() => useTamboV1SendMessage(\"thread_123\"), {\n wrapper: TestWrapper,\n });\n\n await act(async () => {\n await result.current.mutateAsync({\n message: {\n role: \"user\",\n content: [{ type: \"text\", text: \"Hello\" }],\n },\n });\n });\n\n expect(toolExecuted).toHaveBeenCalledWith({ query: \"test\" });\n\n // Verify continuation was called with tool results\n expect(mockThreadsRunsApi.run).toHaveBeenCalledTimes(2);\n const continueCall = mockThreadsRunsApi.run.mock.calls[1];\n expect(continueCall[0]).toBe(\"thread_123\");\n expect(continueCall[1].previousRunId).toBe(\"run_1\");\n expect(continueCall[1].message.content[0]).toEqual({\n type: \"tool_result\",\n toolUseId: \"call_1\",\n content: [{ type: \"text\", text: \"tool result\" }],\n });\n });\n\n it(\"handles tool calls with chunked args\", async () => {\n const toolExecuted = jest.fn().mockResolvedValue({ result: 42 });\n\n const testTool: TamboTool = {\n name: \"chunked_tool\",\n description: \"Tool with chunked args\",\n tool: toolExecuted,\n inputSchema: z.object({ a: z.number(), b: z.number() }),\n outputSchema: z.object({ result: z.number() }),\n };\n\n const mockRegistry = {\n componentList: new Map(),\n toolRegistry: new Map([[\"chunked_tool\", testTool]]),\n };\n\n const initialStream = createAsyncIterator([\n {\n type: EventType.RUN_STARTED,\n runId: \"run_1\",\n threadId: \"thread_123\",\n },\n {\n type: EventType.TEXT_MESSAGE_START,\n messageId: \"msg_1\",\n role: \"assistant\",\n },\n {\n type: EventType.TOOL_CALL_START,\n toolCallId: \"call_1\",\n toolCallName: \"chunked_tool\",\n parentMessageId: \"msg_1\",\n },\n {\n type: EventType.TOOL_CALL_ARGS,\n toolCallId: \"call_1\",\n delta: '{\"a\":',\n },\n {\n type: EventType.TOOL_CALL_ARGS,\n toolCallId: \"call_1\",\n delta: \"10,\",\n },\n {\n type: EventType.TOOL_CALL_ARGS,\n toolCallId: \"call_1\",\n delta: '\"b\":20}',\n },\n {\n type: EventType.TOOL_CALL_END,\n toolCallId: \"call_1\",\n },\n {\n type: EventType.CUSTOM,\n name: \"tambo.run.awaiting_input\",\n value: { pendingToolCallIds: [\"call_1\"] },\n },\n ]);\n\n const continueStream = createAsyncIterator([\n {\n type: EventType.RUN_STARTED,\n runId: \"run_2\",\n threadId: \"thread_123\",\n },\n { type: EventType.RUN_FINISHED },\n ]);\n\n mockThreadsRunsApi.run\n .mockResolvedValueOnce(initialStream)\n .mockResolvedValueOnce(continueStream);\n\n function TestWrapper({ children }: { children: React.ReactNode }) {\n return (\n <QueryClientProvider client={queryClient}>\n <TamboRegistryContext.Provider value={mockRegistry as any}>\n <TamboV1StreamProvider>{children}</TamboV1StreamProvider>\n </TamboRegistryContext.Provider>\n </QueryClientProvider>\n );\n }\n\n const { result } = renderHook(() => useTamboV1SendMessage(\"thread_123\"), {\n wrapper: TestWrapper,\n });\n\n await act(async () => {\n await result.current.mutateAsync({\n message: {\n role: \"user\",\n content: [{ type: \"text\", text: \"Calculate\" }],\n },\n });\n });\n\n expect(toolExecuted).toHaveBeenCalledWith({ a: 10, b: 20 });\n });\n\n it(\"handles missing TOOL_CALL_ARGS gracefully\", async () => {\n // Test that tools can be executed even when no args events are received\n // (the hook keeps input as empty object)\n const toolExecuted = jest.fn().mockResolvedValue(\"result\");\n\n const testTool: TamboTool = {\n name: \"test_tool\",\n description: \"Test tool\",\n tool: toolExecuted,\n inputSchema: z.object({}),\n outputSchema: z.string(),\n };\n\n const mockRegistry = {\n componentList: new Map(),\n toolRegistry: new Map([[\"test_tool\", testTool]]),\n };\n\n const initialStream = createAsyncIterator([\n {\n type: EventType.RUN_STARTED,\n runId: \"run_1\",\n threadId: \"thread_123\",\n },\n {\n type: EventType.TEXT_MESSAGE_START,\n messageId: \"msg_1\",\n role: \"assistant\",\n },\n {\n type: EventType.TOOL_CALL_START,\n toolCallId: \"call_1\",\n toolCallName: \"test_tool\",\n parentMessageId: \"msg_1\",\n },\n // No TOOL_CALL_ARGS events - args will be empty\n {\n type: EventType.TOOL_CALL_END,\n toolCallId: \"call_1\",\n },\n {\n type: EventType.CUSTOM,\n name: \"tambo.run.awaiting_input\",\n value: { pendingToolCallIds: [\"call_1\"] },\n },\n ]);\n\n const continueStream = createAsyncIterator([\n {\n type: EventType.RUN_STARTED,\n runId: \"run_2\",\n threadId: \"thread_123\",\n },\n { type: EventType.RUN_FINISHED },\n ]);\n\n mockThreadsRunsApi.run\n .mockResolvedValueOnce(initialStream)\n .mockResolvedValueOnce(continueStream);\n\n function TestWrapper({ children }: { children: React.ReactNode }) {\n return (\n <QueryClientProvider client={queryClient}>\n <TamboRegistryContext.Provider value={mockRegistry as any}>\n <TamboV1StreamProvider>{children}</TamboV1StreamProvider>\n </TamboRegistryContext.Provider>\n </QueryClientProvider>\n );\n }\n\n const { result } = renderHook(() => useTamboV1SendMessage(\"thread_123\"), {\n wrapper: TestWrapper,\n });\n\n await act(async () => {\n await result.current.mutateAsync({\n message: {\n role: \"user\",\n content: [{ type: \"text\", text: \"Test\" }],\n },\n });\n });\n\n // Tool should be called with empty input due to no args events\n expect(toolExecuted).toHaveBeenCalledWith({});\n });\n\n it(\"handles unknown tool in awaiting_input by returning error result\", async () => {\n const mockRegistry = {\n componentList: new Map(),\n toolRegistry: new Map(), // Empty registry - tool not found\n };\n\n const initialStream = createAsyncIterator([\n {\n type: EventType.RUN_STARTED,\n runId: \"run_1\",\n threadId: \"thread_123\",\n },\n {\n type: EventType.TEXT_MESSAGE_START,\n messageId: \"msg_1\",\n role: \"assistant\",\n },\n {\n type: EventType.TOOL_CALL_START,\n toolCallId: \"call_1\",\n toolCallName: \"unknown_tool\",\n parentMessageId: \"msg_1\",\n },\n {\n type: EventType.TOOL_CALL_ARGS,\n toolCallId: \"call_1\",\n delta: \"{}\",\n },\n {\n type: EventType.TOOL_CALL_END,\n toolCallId: \"call_1\",\n },\n {\n type: EventType.CUSTOM,\n name: \"tambo.run.awaiting_input\",\n value: { pendingToolCallIds: [\"call_1\"] },\n },\n ]);\n\n const continueStream = createAsyncIterator([\n {\n type: EventType.RUN_STARTED,\n runId: \"run_2\",\n threadId: \"thread_123\",\n },\n { type: EventType.RUN_FINISHED },\n ]);\n\n mockThreadsRunsApi.run\n .mockResolvedValueOnce(initialStream)\n .mockResolvedValueOnce(continueStream);\n\n function TestWrapper({ children }: { children: React.ReactNode }) {\n return (\n <QueryClientProvider client={queryClient}>\n <TamboRegistryContext.Provider value={mockRegistry as any}>\n <TamboV1StreamProvider>{children}</TamboV1StreamProvider>\n </TamboRegistryContext.Provider>\n </QueryClientProvider>\n );\n }\n\n const { result } = renderHook(() => useTamboV1SendMessage(\"thread_123\"), {\n wrapper: TestWrapper,\n });\n\n await act(async () => {\n await result.current.mutateAsync({\n message: {\n role: \"user\",\n content: [{ type: \"text\", text: \"Test\" }],\n },\n });\n });\n\n // Verify continuation was called (second call)\n expect(mockThreadsRunsApi.run).toHaveBeenCalledTimes(2);\n\n // Continuation should include error message for unknown tool\n const continueCall = mockThreadsRunsApi.run.mock.calls[1];\n expect(continueCall[1].message.content[0]).toEqual({\n type: \"tool_result\",\n toolUseId: \"call_1\",\n content: [\n { type: \"text\", text: 'Tool \"unknown_tool\" not found in registry' },\n ],\n });\n });\n\n it(\"works with default registry context when no provider is present\", () => {\n // TamboRegistryContext has a default value, so the hook should work\n // (though with an empty registry)\n function TestWrapperWithoutRegistry({\n children,\n }: {\n children: React.ReactNode;\n }) {\n return (\n <QueryClientProvider client={queryClient}>\n <TamboV1StreamProvider>{children}</TamboV1StreamProvider>\n </QueryClientProvider>\n );\n }\n\n // Should not throw - default context is used\n const { result } = renderHook(() => useTamboV1SendMessage(\"thread_123\"), {\n wrapper: TestWrapperWithoutRegistry,\n });\n\n expect(result.current.mutate).toBeDefined();\n });\n\n it(\"invalidates queries on successful mutation\", async () => {\n const mockStream = createAsyncIterator([\n {\n type: EventType.RUN_STARTED,\n runId: \"run_1\",\n threadId: \"thread_123\",\n },\n { type: EventType.RUN_FINISHED },\n ]);\n\n mockThreadsRunsApi.run.mockResolvedValue(mockStream);\n\n const mockRegistry = {\n componentList: new Map(),\n toolRegistry: new Map(),\n };\n\n function TestWrapper({ children }: { children: React.ReactNode }) {\n return (\n <QueryClientProvider client={queryClient}>\n <TamboRegistryContext.Provider value={mockRegistry as any}>\n <TamboV1StreamProvider>{children}</TamboV1StreamProvider>\n </TamboRegistryContext.Provider>\n </QueryClientProvider>\n );\n }\n\n const invalidateQueriesSpy = jest.spyOn(queryClient, \"invalidateQueries\");\n\n const { result } = renderHook(() => useTamboV1SendMessage(\"thread_123\"), {\n wrapper: TestWrapper,\n });\n\n await act(async () => {\n await result.current.mutateAsync({\n message: {\n role: \"user\",\n content: [{ type: \"text\", text: \"Hello\" }],\n },\n });\n });\n\n await waitFor(() => {\n expect(invalidateQueriesSpy).toHaveBeenCalledWith({\n queryKey: [\"v1-threads\", \"thread_123\"],\n });\n });\n });\n\n it(\"handles multi-round tool execution (tool→AI→tool→AI)\", async () => {\n const tool1Executed = jest.fn().mockResolvedValue(\"result from tool 1\");\n const tool2Executed = jest.fn().mockResolvedValue(\"result from tool 2\");\n\n const tool1: TamboTool = {\n name: \"tool_1\",\n description: \"First tool\",\n tool: tool1Executed,\n inputSchema: z.object({ input: z.string() }),\n outputSchema: z.string(),\n };\n\n const tool2: TamboTool = {\n name: \"tool_2\",\n description: \"Second tool\",\n tool: tool2Executed,\n inputSchema: z.object({ input: z.string() }),\n outputSchema: z.string(),\n };\n\n const mockRegistry = {\n componentList: new Map(),\n toolRegistry: new Map([\n [\"tool_1\", tool1],\n [\"tool_2\", tool2],\n ]),\n };\n\n // Initial stream: AI calls tool_1\n const initialStream = createAsyncIterator([\n {\n type: EventType.RUN_STARTED,\n runId: \"run_1\",\n threadId: \"thread_123\",\n },\n {\n type: EventType.TEXT_MESSAGE_START,\n messageId: \"msg_1\",\n role: \"assistant\",\n },\n {\n type: EventType.TOOL_CALL_START,\n toolCallId: \"call_1\",\n toolCallName: \"tool_1\",\n parentMessageId: \"msg_1\",\n },\n {\n type: EventType.TOOL_CALL_ARGS,\n toolCallId: \"call_1\",\n delta: '{\"input\":\"first\"}',\n },\n { type: EventType.TOOL_CALL_END, toolCallId: \"call_1\" },\n {\n type: EventType.CUSTOM,\n name: \"tambo.run.awaiting_input\",\n value: { pendingToolCallIds: [\"call_1\"] },\n },\n ]);\n\n // Second stream: AI receives tool_1 result, then calls tool_2\n const secondStream = createAsyncIterator([\n {\n type: EventType.RUN_STARTED,\n runId: \"run_2\",\n threadId: \"thread_123\",\n },\n {\n type: EventType.TEXT_MESSAGE_START,\n messageId: \"msg_2\",\n role: \"assistant\",\n },\n {\n type: EventType.TOOL_CALL_START,\n toolCallId: \"call_2\",\n toolCallName: \"tool_2\",\n parentMessageId: \"msg_2\",\n },\n {\n type: EventType.TOOL_CALL_ARGS,\n toolCallId: \"call_2\",\n delta: '{\"input\":\"second\"}',\n },\n { type: EventType.TOOL_CALL_END, toolCallId: \"call_2\" },\n {\n type: EventType.CUSTOM,\n name: \"tambo.run.awaiting_input\",\n value: { pendingToolCallIds: [\"call_2\"] },\n },\n ]);\n\n // Third stream: AI receives tool_2 result, finishes\n const thirdStream = createAsyncIterator([\n {\n type: EventType.RUN_STARTED,\n runId: \"run_3\",\n threadId: \"thread_123\",\n },\n { type: EventType.RUN_FINISHED },\n ]);\n\n mockThreadsRunsApi.run\n .mockResolvedValueOnce(initialStream)\n .mockResolvedValueOnce(secondStream)\n .mockResolvedValueOnce(thirdStream);\n\n function TestWrapper({ children }: { children: React.ReactNode }) {\n return (\n <QueryClientProvider client={queryClient}>\n <TamboRegistryContext.Provider value={mockRegistry as any}>\n <TamboV1StreamProvider>{children}</TamboV1StreamProvider>\n </TamboRegistryContext.Provider>\n </QueryClientProvider>\n );\n }\n\n const { result } = renderHook(() => useTamboV1SendMessage(\"thread_123\"), {\n wrapper: TestWrapper,\n });\n\n await act(async () => {\n await result.current.mutateAsync({\n message: {\n role: \"user\",\n content: [{ type: \"text\", text: \"Hello\" }],\n },\n });\n });\n\n // Both tools should have been executed\n expect(tool1Executed).toHaveBeenCalledWith({ input: \"first\" });\n expect(tool2Executed).toHaveBeenCalledWith({ input: \"second\" });\n\n // Should have made 3 API calls (initial + 2 continuations)\n expect(mockThreadsRunsApi.run).toHaveBeenCalledTimes(3);\n\n // First continuation should have tool_1 result with previousRunId: run_1\n const firstContinue = mockThreadsRunsApi.run.mock.calls[1];\n expect(firstContinue[1].previousRunId).toBe(\"run_1\");\n expect(firstContinue[1].message.content[0]).toEqual({\n type: \"tool_result\",\n toolUseId: \"call_1\",\n content: [{ type: \"text\", text: \"result from tool 1\" }],\n });\n\n // Second continuation should have tool_2 result with previousRunId: run_2\n const secondContinue = mockThreadsRunsApi.run.mock.calls[2];\n expect(secondContinue[1].previousRunId).toBe(\"run_2\");\n expect(secondContinue[1].message.content[0]).toEqual({\n type: \"tool_result\",\n toolUseId: \"call_2\",\n content: [{ type: \"text\", text: \"result from tool 2\" }],\n });\n });\n\n it(\"logs error on mutation failure\", async () => {\n const consoleSpy = jest\n .spyOn(console, \"error\")\n .mockImplementation(() => {});\n const testError = new Error(\"API Error\");\n mockThreadsRunsApi.run.mockRejectedValue(testError);\n\n const mockRegistry = {\n componentList: new Map(),\n toolRegistry: new Map(),\n };\n\n function TestWrapper({ children }: { children: React.ReactNode }) {\n return (\n <QueryClientProvider client={queryClient}>\n <TamboRegistryContext.Provider value={mockRegistry as any}>\n <TamboV1StreamProvider>{children}</TamboV1StreamProvider>\n </TamboRegistryContext.Provider>\n </QueryClientProvider>\n );\n }\n\n const { result } = renderHook(() => useTamboV1SendMessage(\"thread_123\"), {\n wrapper: TestWrapper,\n });\n\n try {\n await act(async () => {\n await result.current.mutateAsync({\n message: {\n role: \"user\",\n content: [{ type: \"text\", text: \"Hello\" }],\n },\n });\n });\n } catch {\n // Expected to throw\n }\n\n await waitFor(() => {\n expect(consoleSpy).toHaveBeenCalledWith(\n \"[useTamboV1SendMessage] Mutation failed:\",\n testError,\n );\n });\n\n consoleSpy.mockRestore();\n });\n});\n"]}
@@ -0,0 +1,91 @@
1
+ /**
2
+ * useTamboV1Suggestions - Suggestions Hook for v1 API
3
+ *
4
+ * Provides AI-generated suggestions based on the current thread state.
5
+ * Uses the shared thread input context so accepting a suggestion
6
+ * automatically updates the input field.
7
+ */
8
+ import TamboAI from "@tambo-ai/typescript-sdk";
9
+ import { type UseTamboMutationResult, type UseTamboQueryResult } from "../../hooks/react-query-hooks";
10
+ import { CombinedMutationResult } from "../../util/query-utils";
11
+ type Suggestion = TamboAI.Beta.Threads.Suggestion;
12
+ type SuggestionGenerateResponse = TamboAI.Beta.Threads.Suggestions.SuggestionGenerateResponse;
13
+ type SuggestionsMutationData = void | SuggestionGenerateResponse;
14
+ /**
15
+ * Configuration options for the useTamboV1Suggestions hook
16
+ */
17
+ export interface UseTamboV1SuggestionsOptions {
18
+ /** Maximum number of suggestions to generate (1-10, default 3) */
19
+ maxSuggestions?: number;
20
+ }
21
+ /**
22
+ * Return value interface for useTamboV1Suggestions hook
23
+ */
24
+ export interface UseTamboV1SuggestionsResultInternal {
25
+ /** List of available suggestions */
26
+ suggestions: Suggestion[];
27
+ /** ID of the currently selected suggestion */
28
+ selectedSuggestionId: string | null;
29
+ /**
30
+ * Accept and apply a suggestion.
31
+ * If shouldSubmit is false, updates the shared input context value.
32
+ * If shouldSubmit is true, submits the suggestion directly.
33
+ * @param suggestion - The suggestion to accept
34
+ * @param shouldSubmit - Whether to automatically submit after accepting (default: false)
35
+ */
36
+ accept: (acceptOptions: {
37
+ suggestion: Suggestion;
38
+ shouldSubmit?: boolean;
39
+ }) => Promise<void>;
40
+ /** Result and network state for accepting a suggestion */
41
+ acceptResult: UseTamboMutationResult<void, Error, {
42
+ suggestion: Suggestion;
43
+ shouldSubmit?: boolean;
44
+ }>;
45
+ /** Result and network state for generating suggestions */
46
+ generateResult: UseTamboMutationResult<SuggestionGenerateResponse, Error, AbortController>;
47
+ /** The full suggestions query object from React Query */
48
+ suggestionsResult: UseTamboQueryResult<SuggestionGenerateResponse>;
49
+ }
50
+ type UseTamboV1SuggestionsResult = CombinedMutationResult<SuggestionsMutationData, Error> & UseTamboV1SuggestionsResultInternal;
51
+ /**
52
+ * Hook for managing Tambo AI suggestions in a v1 thread.
53
+ *
54
+ * Automatically generates suggestions when the latest message is from the assistant
55
+ * and the thread is idle (not streaming).
56
+ *
57
+ * Uses the shared thread input context, so accepting a suggestion without submitting
58
+ * will automatically update the input field value for any component using
59
+ * useTamboV1ThreadInput.
60
+ * @param options - Configuration options for suggestion generation
61
+ * @returns Object containing suggestions state and control functions
62
+ * @example
63
+ * ```tsx
64
+ * function SuggestionsPanel() {
65
+ * const { suggestions, accept, isPending } = useTamboV1Suggestions();
66
+ *
67
+ * return (
68
+ * <div>
69
+ * {suggestions.map(suggestion => (
70
+ * <button
71
+ * key={suggestion.id}
72
+ * onClick={() => accept({ suggestion })}
73
+ * disabled={isPending}
74
+ * >
75
+ * {suggestion.suggestion}
76
+ * </button>
77
+ * ))}
78
+ * </div>
79
+ * );
80
+ * }
81
+ *
82
+ * function ChatInput() {
83
+ * // This input will automatically show the accepted suggestion
84
+ * const { value, setValue, submit } = useTamboV1ThreadInput();
85
+ * return <input value={value} onChange={e => setValue(e.target.value)} />;
86
+ * }
87
+ * ```
88
+ */
89
+ export declare function useTamboV1Suggestions(options?: UseTamboV1SuggestionsOptions): UseTamboV1SuggestionsResult;
90
+ export {};
91
+ //# sourceMappingURL=use-tambo-v1-suggestions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-tambo-v1-suggestions.d.ts","sourceRoot":"","sources":["../../../src/v1/hooks/use-tambo-v1-suggestions.ts"],"names":[],"mappings":"AAEA;;;;;;GAMG;AAEH,OAAO,OAAO,MAAM,0BAA0B,CAAC;AAK/C,OAAO,EAGL,KAAK,sBAAsB,EAC3B,KAAK,mBAAmB,EACzB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EACL,sBAAsB,EAEvB,MAAM,wBAAwB,CAAC;AAIhC,KAAK,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC;AAGlD,KAAK,0BAA0B,GAC7B,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,0BAA0B,CAAC;AAE9D,KAAK,uBAAuB,GAAG,IAAI,GAAG,0BAA0B,CAAC;AAkBjE;;GAEG;AACH,MAAM,WAAW,4BAA4B;IAC3C,kEAAkE;IAClE,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED;;GAEG;AACH,MAAM,WAAW,mCAAmC;IAClD,oCAAoC;IACpC,WAAW,EAAE,UAAU,EAAE,CAAC;IAE1B,8CAA8C;IAC9C,oBAAoB,EAAE,MAAM,GAAG,IAAI,CAAC;IAEpC;;;;;;OAMG;IACH,MAAM,EAAE,CAAC,aAAa,EAAE;QACtB,UAAU,EAAE,UAAU,CAAC;QACvB,YAAY,CAAC,EAAE,OAAO,CAAC;KACxB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAEpB,0DAA0D;IAC1D,YAAY,EAAE,sBAAsB,CAClC,IAAI,EACJ,KAAK,EACL;QAAE,UAAU,EAAE,UAAU,CAAC;QAAC,YAAY,CAAC,EAAE,OAAO,CAAA;KAAE,CACnD,CAAC;IAEF,0DAA0D;IAC1D,cAAc,EAAE,sBAAsB,CACpC,0BAA0B,EAC1B,KAAK,EACL,eAAe,CAChB,CAAC;IAEF,yDAAyD;IACzD,iBAAiB,EAAE,mBAAmB,CAAC,0BAA0B,CAAC,CAAC;CACpE;AAED,KAAK,2BAA2B,GAAG,sBAAsB,CACvD,uBAAuB,EACvB,KAAK,CACN,GACC,mCAAmC,CAAC;AAEtC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,GAAE,4BAAiC,GACzC,2BAA2B,CA8I7B"}