@tambo-ai/react 0.38.1 → 0.39.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 (30) hide show
  1. package/README.md +1 -1
  2. package/dist/hooks/use-thread-input.d.ts +1 -0
  3. package/dist/hooks/use-thread-input.d.ts.map +1 -1
  4. package/dist/hooks/use-thread-input.js +2 -1
  5. package/dist/hooks/use-thread-input.js.map +1 -1
  6. package/dist/providers/__tests__/tambo-thread-provider.test.js +65 -0
  7. package/dist/providers/__tests__/tambo-thread-provider.test.js.map +1 -1
  8. package/dist/providers/tambo-thread-provider.d.ts +1 -0
  9. package/dist/providers/tambo-thread-provider.d.ts.map +1 -1
  10. package/dist/providers/tambo-thread-provider.js +13 -2
  11. package/dist/providers/tambo-thread-provider.js.map +1 -1
  12. package/dist/util/registry.d.ts +4 -1
  13. package/dist/util/registry.d.ts.map +1 -1
  14. package/dist/util/registry.js +9 -11
  15. package/dist/util/registry.js.map +1 -1
  16. package/esm/hooks/use-thread-input.d.ts +1 -0
  17. package/esm/hooks/use-thread-input.d.ts.map +1 -1
  18. package/esm/hooks/use-thread-input.js +2 -1
  19. package/esm/hooks/use-thread-input.js.map +1 -1
  20. package/esm/providers/__tests__/tambo-thread-provider.test.js +65 -0
  21. package/esm/providers/__tests__/tambo-thread-provider.test.js.map +1 -1
  22. package/esm/providers/tambo-thread-provider.d.ts +1 -0
  23. package/esm/providers/tambo-thread-provider.d.ts.map +1 -1
  24. package/esm/providers/tambo-thread-provider.js +14 -3
  25. package/esm/providers/tambo-thread-provider.js.map +1 -1
  26. package/esm/util/registry.d.ts +4 -1
  27. package/esm/util/registry.d.ts.map +1 -1
  28. package/esm/util/registry.js +7 -9
  29. package/esm/util/registry.js.map +1 -1
  30. package/package.json +9 -8
package/README.md CHANGED
@@ -384,7 +384,7 @@ const mcpServers = [
384
384
  </TamboProvider>;
385
385
  ```
386
386
 
387
- [Read our full documentation](https://tambo.co/docs)
387
+ [Read our full documentation](https://docs.tambo.co)
388
388
 
389
389
  ## Join the Community
390
390
 
@@ -36,6 +36,7 @@ interface UseThreadInputInternal {
36
36
  contextKey?: string;
37
37
  streamResponse?: boolean;
38
38
  forceToolChoice?: string;
39
+ additionalContext?: Record<string, any>;
39
40
  }) => Promise<void>;
40
41
  }
41
42
  export type UseThreadInput = UseThreadInputInternal & UseMutationResult<void, Error, {
@@ -1 +1 @@
1
- {"version":3,"file":"use-thread-input.d.ts","sourceRoot":"","sources":["../../src/hooks/use-thread-input.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAO1D;;;;GAIG;AACH,eAAO,MAAM,oBAAoB;IAC/B,kDAAkD;;IAElD,0CAA0C;;IAE1C,qDAAqD;;IAErD,yCAAyC;;CAEjC,CAAC;AAEX;;;GAGG;AACH,UAAU,sBAAsB;IAC9B,uCAAuC;IACvC,KAAK,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC;;;;;OAKG;IACH,MAAM,EAAE,CAAC,OAAO,CAAC,EAAE;QACjB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,cAAc,CAAC,EAAE,OAAO,CAAC;QACzB,eAAe,CAAC,EAAE,MAAM,CAAC;KAC1B,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACrB;AACD,MAAM,MAAM,cAAc,GAAG,sBAAsB,GACjD,iBAAiB,CACf,IAAI,EACJ,KAAK,EACL;IAAE,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,cAAc,CAAC,EAAE,OAAO,CAAC;IAAC,eAAe,CAAC,EAAE,MAAM,CAAA;CAAE,CAC5E,CAAC;AAEJ;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,cAAc,CA8CvE"}
1
+ {"version":3,"file":"use-thread-input.d.ts","sourceRoot":"","sources":["../../src/hooks/use-thread-input.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAO1D;;;;GAIG;AACH,eAAO,MAAM,oBAAoB;IAC/B,kDAAkD;;IAElD,0CAA0C;;IAE1C,qDAAqD;;IAErD,yCAAyC;;CAEjC,CAAC;AAEX;;;GAGG;AACH,UAAU,sBAAsB;IAC9B,uCAAuC;IACvC,KAAK,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC;;;;;OAKG;IACH,MAAM,EAAE,CAAC,OAAO,CAAC,EAAE;QACjB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,cAAc,CAAC,EAAE,OAAO,CAAC;QACzB,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB,iBAAiB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;KACzC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACrB;AACD,MAAM,MAAM,cAAc,GAAG,sBAAsB,GACjD,iBAAiB,CACf,IAAI,EACJ,KAAK,EACL;IAAE,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,cAAc,CAAC,EAAE,OAAO,CAAC;IAAC,eAAe,CAAC,EAAE,MAAM,CAAA;CAAE,CAC5E,CAAC;AAEJ;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,cAAc,CAiDvE"}
@@ -28,7 +28,7 @@ exports.INPUT_ERROR_MESSAGES = {
28
28
  */
29
29
  function useTamboThreadInput(contextKey) {
30
30
  const { thread, inputValue, setInputValue, sendThreadMessage } = (0, tambo_thread_provider_1.useTamboThread)();
31
- const submit = (0, react_1.useCallback)(async ({ contextKey: submitContextKey, streamResponse, forceToolChoice, } = {}) => {
31
+ const submit = (0, react_1.useCallback)(async ({ contextKey: submitContextKey, streamResponse, forceToolChoice, additionalContext, } = {}) => {
32
32
  const validation = (0, validate_input_1.validateInput)(inputValue);
33
33
  if (!validation.isValid) {
34
34
  throw new thread_input_error_1.ThreadInputError(`Cannot submit message: ${validation.error ?? exports.INPUT_ERROR_MESSAGES.VALIDATION}`, { cause: validation.error });
@@ -38,6 +38,7 @@ function useTamboThreadInput(contextKey) {
38
38
  contextKey: submitContextKey ?? contextKey ?? undefined,
39
39
  streamResponse: streamResponse,
40
40
  forceToolChoice: forceToolChoice,
41
+ additionalContext: additionalContext,
41
42
  });
42
43
  setInputValue("");
43
44
  }, [inputValue, sendThreadMessage, thread.id, contextKey, setInputValue]);
@@ -1 +1 @@
1
- {"version":3,"file":"use-thread-input.js","sourceRoot":"","sources":["../../src/hooks/use-thread-input.ts"],"names":[],"mappings":";;;AA0DA,kDA8CC;AAvGD,iCAAoC;AACpC,oEAA+D;AAC/D,4DAAwD;AACxD,8EAAoE;AACpE,2DAAuD;AAEvD;;;;GAIG;AACU,QAAA,oBAAoB,GAAG;IAClC,kDAAkD;IAClD,KAAK,EAAE,yBAAyB;IAChC,0CAA0C;IAC1C,OAAO,EAAE,6CAA6C;IACtD,qDAAqD;IACrD,MAAM,EAAE,gCAAgC;IACxC,yCAAyC;IACzC,UAAU,EAAE,wBAAwB;CAC5B,CAAC;AAiCX;;;GAGG;AACH,SAAgB,mBAAmB,CAAC,UAAmB;IACrD,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,aAAa,EAAE,iBAAiB,EAAE,GAC5D,IAAA,sCAAc,GAAE,CAAC;IAEnB,MAAM,MAAM,GAAG,IAAA,mBAAW,EACxB,KAAK,EAAE,EACL,UAAU,EAAE,gBAAgB,EAC5B,cAAc,EACd,eAAe,MAKb,EAAE,EAAE,EAAE;QACR,MAAM,UAAU,GAAG,IAAA,8BAAa,EAAC,UAAU,CAAC,CAAC;QAC7C,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;YACxB,MAAM,IAAI,qCAAgB,CACxB,0BAA0B,UAAU,CAAC,KAAK,IAAI,4BAAoB,CAAC,UAAU,EAAE,EAC/E,EAAE,KAAK,EAAE,UAAU,CAAC,KAAK,EAAE,CAC5B,CAAC;QACJ,CAAC;QAED,MAAM,iBAAiB,CAAC,UAAU,CAAC,cAAc,EAAE;YACjD,QAAQ,EAAE,MAAM,CAAC,EAAE;YACnB,UAAU,EAAE,gBAAgB,IAAI,UAAU,IAAI,SAAS;YACvD,cAAc,EAAE,cAAc;YAC9B,eAAe,EAAE,eAAe;SACjC,CAAC,CAAC;QACH,aAAa,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,EACD,CAAC,UAAU,EAAE,iBAAiB,EAAE,MAAM,CAAC,EAAE,EAAE,UAAU,EAAE,aAAa,CAAC,CACtE,CAAC;IACF,MAAM,EACJ,WAAW,EAAE,WAAW,EACxB,MAAM,EAAE,aAAa,EACrB,GAAG,aAAa,EACjB,GAAG,IAAA,oCAAgB,EAAC;QACnB,UAAU,EAAE,MAAM;KACnB,CAAC,CAAC;IAEH,OAAO;QACL,GAAG,aAAa;QAChB,KAAK,EAAE,UAAU;QACjB,QAAQ,EAAE,aAAa;QACvB,MAAM,EAAE,WAAW;KACF,CAAC;AACtB,CAAC","sourcesContent":["import { UseMutationResult } from \"@tanstack/react-query\";\nimport { useCallback } from \"react\";\nimport { ThreadInputError } from \"../model/thread-input-error\";\nimport { validateInput } from \"../model/validate-input\";\nimport { useTamboThread } from \"../providers/tambo-thread-provider\";\nimport { useTamboMutation } from \"./react-query-hooks\";\n\n/**\n * Error messages for various input-related error scenarios\n * These messages are used to provide user-friendly error feedback\n * @readonly\n */\nexport const INPUT_ERROR_MESSAGES = {\n /** Error when attempting to submit empty input */\n EMPTY: \"Message cannot be empty\",\n /** Error when network connection fails */\n NETWORK: \"Network error. Please check your connection\",\n /** Error when server fails to process the request */\n SERVER: \"Server error. Please try again\",\n /** Error when input format is invalid */\n VALIDATION: \"Invalid message format\",\n} as const;\n\n/**\n * Interface for the thread input hook return value\n * Provides all necessary functions and state for managing thread input\n */\ninterface UseThreadInputInternal {\n /** Current value of the input field */\n value: string;\n /**\n * Function to update the input value\n * @param value - New value for the input field\n */\n setValue: (value: string) => void;\n /**\n * Function to submit the current input value\n * Validates input, handles errors, and cleans up state after submission\n * @throws {ThreadInputError} If submission fails\n * @returns Promise that resolves when submission is complete\n */\n submit: (options?: {\n contextKey?: string;\n streamResponse?: boolean;\n forceToolChoice?: string;\n }) => Promise<void>;\n}\nexport type UseThreadInput = UseThreadInputInternal &\n UseMutationResult<\n void,\n Error,\n { contextKey?: string; streamResponse?: boolean; forceToolChoice?: string }\n >;\n\n/**\n * Hook for managing thread message input state and submission\n * @returns Interface for managing thread input state and submission\n */\nexport function useTamboThreadInput(contextKey?: string): UseThreadInput {\n const { thread, inputValue, setInputValue, sendThreadMessage } =\n useTamboThread();\n\n const submit = useCallback(\n async ({\n contextKey: submitContextKey,\n streamResponse,\n forceToolChoice,\n }: {\n contextKey?: string;\n streamResponse?: boolean;\n forceToolChoice?: string;\n } = {}) => {\n const validation = validateInput(inputValue);\n if (!validation.isValid) {\n throw new ThreadInputError(\n `Cannot submit message: ${validation.error ?? INPUT_ERROR_MESSAGES.VALIDATION}`,\n { cause: validation.error },\n );\n }\n\n await sendThreadMessage(validation.sanitizedInput, {\n threadId: thread.id,\n contextKey: submitContextKey ?? contextKey ?? undefined,\n streamResponse: streamResponse,\n forceToolChoice: forceToolChoice,\n });\n setInputValue(\"\");\n },\n [inputValue, sendThreadMessage, thread.id, contextKey, setInputValue],\n );\n const {\n mutateAsync: submitAsync,\n mutate: _unusedSubmit,\n ...mutationState\n } = useTamboMutation({\n mutationFn: submit,\n });\n\n return {\n ...mutationState,\n value: inputValue,\n setValue: setInputValue,\n submit: submitAsync,\n } as UseThreadInput;\n}\n"]}
1
+ {"version":3,"file":"use-thread-input.js","sourceRoot":"","sources":["../../src/hooks/use-thread-input.ts"],"names":[],"mappings":";;;AA2DA,kDAiDC;AA3GD,iCAAoC;AACpC,oEAA+D;AAC/D,4DAAwD;AACxD,8EAAoE;AACpE,2DAAuD;AAEvD;;;;GAIG;AACU,QAAA,oBAAoB,GAAG;IAClC,kDAAkD;IAClD,KAAK,EAAE,yBAAyB;IAChC,0CAA0C;IAC1C,OAAO,EAAE,6CAA6C;IACtD,qDAAqD;IACrD,MAAM,EAAE,gCAAgC;IACxC,yCAAyC;IACzC,UAAU,EAAE,wBAAwB;CAC5B,CAAC;AAkCX;;;GAGG;AACH,SAAgB,mBAAmB,CAAC,UAAmB;IACrD,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,aAAa,EAAE,iBAAiB,EAAE,GAC5D,IAAA,sCAAc,GAAE,CAAC;IAEnB,MAAM,MAAM,GAAG,IAAA,mBAAW,EACxB,KAAK,EAAE,EACL,UAAU,EAAE,gBAAgB,EAC5B,cAAc,EACd,eAAe,EACf,iBAAiB,MAMf,EAAE,EAAE,EAAE;QACR,MAAM,UAAU,GAAG,IAAA,8BAAa,EAAC,UAAU,CAAC,CAAC;QAC7C,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;YACxB,MAAM,IAAI,qCAAgB,CACxB,0BAA0B,UAAU,CAAC,KAAK,IAAI,4BAAoB,CAAC,UAAU,EAAE,EAC/E,EAAE,KAAK,EAAE,UAAU,CAAC,KAAK,EAAE,CAC5B,CAAC;QACJ,CAAC;QAED,MAAM,iBAAiB,CAAC,UAAU,CAAC,cAAc,EAAE;YACjD,QAAQ,EAAE,MAAM,CAAC,EAAE;YACnB,UAAU,EAAE,gBAAgB,IAAI,UAAU,IAAI,SAAS;YACvD,cAAc,EAAE,cAAc;YAC9B,eAAe,EAAE,eAAe;YAChC,iBAAiB,EAAE,iBAAiB;SACrC,CAAC,CAAC;QACH,aAAa,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,EACD,CAAC,UAAU,EAAE,iBAAiB,EAAE,MAAM,CAAC,EAAE,EAAE,UAAU,EAAE,aAAa,CAAC,CACtE,CAAC;IACF,MAAM,EACJ,WAAW,EAAE,WAAW,EACxB,MAAM,EAAE,aAAa,EACrB,GAAG,aAAa,EACjB,GAAG,IAAA,oCAAgB,EAAC;QACnB,UAAU,EAAE,MAAM;KACnB,CAAC,CAAC;IAEH,OAAO;QACL,GAAG,aAAa;QAChB,KAAK,EAAE,UAAU;QACjB,QAAQ,EAAE,aAAa;QACvB,MAAM,EAAE,WAAW;KACF,CAAC;AACtB,CAAC","sourcesContent":["import { UseMutationResult } from \"@tanstack/react-query\";\nimport { useCallback } from \"react\";\nimport { ThreadInputError } from \"../model/thread-input-error\";\nimport { validateInput } from \"../model/validate-input\";\nimport { useTamboThread } from \"../providers/tambo-thread-provider\";\nimport { useTamboMutation } from \"./react-query-hooks\";\n\n/**\n * Error messages for various input-related error scenarios\n * These messages are used to provide user-friendly error feedback\n * @readonly\n */\nexport const INPUT_ERROR_MESSAGES = {\n /** Error when attempting to submit empty input */\n EMPTY: \"Message cannot be empty\",\n /** Error when network connection fails */\n NETWORK: \"Network error. Please check your connection\",\n /** Error when server fails to process the request */\n SERVER: \"Server error. Please try again\",\n /** Error when input format is invalid */\n VALIDATION: \"Invalid message format\",\n} as const;\n\n/**\n * Interface for the thread input hook return value\n * Provides all necessary functions and state for managing thread input\n */\ninterface UseThreadInputInternal {\n /** Current value of the input field */\n value: string;\n /**\n * Function to update the input value\n * @param value - New value for the input field\n */\n setValue: (value: string) => void;\n /**\n * Function to submit the current input value\n * Validates input, handles errors, and cleans up state after submission\n * @throws {ThreadInputError} If submission fails\n * @returns Promise that resolves when submission is complete\n */\n submit: (options?: {\n contextKey?: string;\n streamResponse?: boolean;\n forceToolChoice?: string;\n additionalContext?: Record<string, any>;\n }) => Promise<void>;\n}\nexport type UseThreadInput = UseThreadInputInternal &\n UseMutationResult<\n void,\n Error,\n { contextKey?: string; streamResponse?: boolean; forceToolChoice?: string }\n >;\n\n/**\n * Hook for managing thread message input state and submission\n * @returns Interface for managing thread input state and submission\n */\nexport function useTamboThreadInput(contextKey?: string): UseThreadInput {\n const { thread, inputValue, setInputValue, sendThreadMessage } =\n useTamboThread();\n\n const submit = useCallback(\n async ({\n contextKey: submitContextKey,\n streamResponse,\n forceToolChoice,\n additionalContext,\n }: {\n contextKey?: string;\n streamResponse?: boolean;\n forceToolChoice?: string;\n additionalContext?: Record<string, any>;\n } = {}) => {\n const validation = validateInput(inputValue);\n if (!validation.isValid) {\n throw new ThreadInputError(\n `Cannot submit message: ${validation.error ?? INPUT_ERROR_MESSAGES.VALIDATION}`,\n { cause: validation.error },\n );\n }\n\n await sendThreadMessage(validation.sanitizedInput, {\n threadId: thread.id,\n contextKey: submitContextKey ?? contextKey ?? undefined,\n streamResponse: streamResponse,\n forceToolChoice: forceToolChoice,\n additionalContext: additionalContext,\n });\n setInputValue(\"\");\n },\n [inputValue, sendThreadMessage, thread.id, contextKey, setInputValue],\n );\n const {\n mutateAsync: submitAsync,\n mutate: _unusedSubmit,\n ...mutationState\n } = useTamboMutation({\n mutationFn: submit,\n });\n\n return {\n ...mutationState,\n value: inputValue,\n setValue: setInputValue,\n submit: submitAsync,\n } as UseThreadInput;\n}\n"]}
@@ -25,6 +25,29 @@ jest.mock("../tambo-client-provider", () => ({
25
25
  jest.mock("@tambo-ai/typescript-sdk", () => ({
26
26
  advanceStream: jest.fn(),
27
27
  }));
28
+ // Mock the system context and getCustomContext
29
+ jest.mock("../../util/registry", () => ({
30
+ ...jest.requireActual("../../util/registry"),
31
+ getSystemContext: () => ({
32
+ localTime: "7/24/2025, 6:26:21 PM",
33
+ timezone: "America/New_York",
34
+ }),
35
+ getCustomContext: () => ({
36
+ message: "additional instructions",
37
+ }),
38
+ }));
39
+ // Mock the combined context which includes the system context and the custom context
40
+ const mockCombinedContext = {
41
+ system: {
42
+ localTime: "7/24/2025, 6:26:21 PM",
43
+ timezone: "America/New_York",
44
+ },
45
+ ...{
46
+ custom: {
47
+ message: "additional instructions",
48
+ },
49
+ },
50
+ };
28
51
  // Test utilities
29
52
  const createMockMessage = (overrides = {}) => ({
30
53
  id: "test-message-1",
@@ -194,6 +217,11 @@ describe("TamboThreadProvider", () => {
194
217
  await result.current.sendThreadMessage("Hello", {
195
218
  threadId: "test-thread-1",
196
219
  streamResponse: false,
220
+ additionalContext: {
221
+ custom: {
222
+ message: "additional instructions",
223
+ },
224
+ },
197
225
  });
198
226
  });
199
227
  expect(mockThreadsApi.advanceById).toHaveBeenCalledWith("test-thread-1", {
@@ -205,6 +233,7 @@ describe("TamboThreadProvider", () => {
205
233
  contextKey: undefined,
206
234
  clientTools: [],
207
235
  toolCallCounts: {},
236
+ additionalContext: mockCombinedContext,
208
237
  });
209
238
  expect(result.current.generationStage).toBe(generate_component_response_1.GenerationStage.COMPLETE);
210
239
  });
@@ -319,6 +348,11 @@ describe("TamboThreadProvider", () => {
319
348
  await result.current.sendThreadMessage("Hello streaming", {
320
349
  threadId: "test-thread-1",
321
350
  streamResponse: true,
351
+ additionalContext: {
352
+ custom: {
353
+ message: "additional instructions",
354
+ },
355
+ },
322
356
  });
323
357
  });
324
358
  expect(typescript_sdk_1.advanceStream).toHaveBeenCalledWith(mockTamboAI, {
@@ -331,6 +365,7 @@ describe("TamboThreadProvider", () => {
331
365
  clientTools: [],
332
366
  forceToolChoice: undefined,
333
367
  toolCallCounts: {},
368
+ additionalContext: mockCombinedContext,
334
369
  }, "test-thread-1");
335
370
  // Should not call advance or advanceById
336
371
  expect(mockThreadsApi.advance).not.toHaveBeenCalled();
@@ -347,6 +382,11 @@ describe("TamboThreadProvider", () => {
347
382
  await result.current.sendThreadMessage("Hello non-streaming", {
348
383
  threadId: "test-thread-1",
349
384
  streamResponse: false,
385
+ additionalContext: {
386
+ custom: {
387
+ message: "additional instructions",
388
+ },
389
+ },
350
390
  });
351
391
  });
352
392
  expect(mockThreadsApi.advanceById).toHaveBeenCalledWith("test-thread-1", {
@@ -359,6 +399,7 @@ describe("TamboThreadProvider", () => {
359
399
  clientTools: [],
360
400
  forceToolChoice: undefined,
361
401
  toolCallCounts: {},
402
+ additionalContext: mockCombinedContext,
362
403
  });
363
404
  // Should not call advance or advanceStream
364
405
  expect(mockThreadsApi.advance).not.toHaveBeenCalled();
@@ -375,6 +416,11 @@ describe("TamboThreadProvider", () => {
375
416
  await result.current.sendThreadMessage("Hello default", {
376
417
  threadId: "test-thread-1",
377
418
  // streamResponse is undefined, should use provider's streaming=false
419
+ additionalContext: {
420
+ custom: {
421
+ message: "additional instructions",
422
+ },
423
+ },
378
424
  });
379
425
  });
380
426
  expect(mockThreadsApi.advanceById).toHaveBeenCalledWith("test-thread-1", {
@@ -387,6 +433,7 @@ describe("TamboThreadProvider", () => {
387
433
  clientTools: [],
388
434
  forceToolChoice: undefined,
389
435
  toolCallCounts: {},
436
+ additionalContext: mockCombinedContext,
390
437
  });
391
438
  // Should not call advance or advanceStream
392
439
  expect(mockThreadsApi.advance).not.toHaveBeenCalled();
@@ -422,6 +469,11 @@ describe("TamboThreadProvider", () => {
422
469
  await result.current.sendThreadMessage("Hello default streaming", {
423
470
  threadId: "test-thread-1",
424
471
  // streamResponse is undefined, should use provider's streaming=true (default)
472
+ additionalContext: {
473
+ custom: {
474
+ message: "additional instructions",
475
+ },
476
+ },
425
477
  });
426
478
  });
427
479
  expect(typescript_sdk_1.advanceStream).toHaveBeenCalledWith(mockTamboAI, {
@@ -434,6 +486,7 @@ describe("TamboThreadProvider", () => {
434
486
  clientTools: [],
435
487
  forceToolChoice: undefined,
436
488
  toolCallCounts: {},
489
+ additionalContext: mockCombinedContext,
437
490
  }, "test-thread-1");
438
491
  // Should not call advance or advanceById
439
492
  expect(mockThreadsApi.advance).not.toHaveBeenCalled();
@@ -452,6 +505,11 @@ describe("TamboThreadProvider", () => {
452
505
  await result.current.sendThreadMessage("Hello new thread", {
453
506
  threadId: "placeholder",
454
507
  streamResponse: false,
508
+ additionalContext: {
509
+ custom: {
510
+ message: "additional instructions",
511
+ },
512
+ },
455
513
  });
456
514
  });
457
515
  expect(mockThreadsApi.advance).toHaveBeenCalledWith({
@@ -464,6 +522,7 @@ describe("TamboThreadProvider", () => {
464
522
  clientTools: [],
465
523
  forceToolChoice: undefined,
466
524
  toolCallCounts: {},
525
+ additionalContext: mockCombinedContext,
467
526
  });
468
527
  // Should not call advanceById or advanceStream
469
528
  expect(mockThreadsApi.advanceById).not.toHaveBeenCalled();
@@ -501,6 +560,11 @@ describe("TamboThreadProvider", () => {
501
560
  await result.current.sendThreadMessage("Hello streaming new thread", {
502
561
  threadId: "placeholder",
503
562
  streamResponse: true,
563
+ additionalContext: {
564
+ custom: {
565
+ message: "additional instructions",
566
+ },
567
+ },
504
568
  });
505
569
  });
506
570
  expect(typescript_sdk_1.advanceStream).toHaveBeenCalledWith(mockTamboAI, {
@@ -513,6 +577,7 @@ describe("TamboThreadProvider", () => {
513
577
  clientTools: [],
514
578
  forceToolChoice: undefined,
515
579
  toolCallCounts: {},
580
+ additionalContext: mockCombinedContext,
516
581
  }, undefined);
517
582
  // Should not call advance or advanceById
518
583
  expect(mockThreadsApi.advance).not.toHaveBeenCalled();
@@ -1 +1 @@
1
- {"version":3,"file":"tambo-thread-provider.test.js","sourceRoot":"","sources":["../../../src/providers/__tests__/tambo-thread-provider.test.tsx"],"names":[],"mappings":"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","sourcesContent":["import TamboAI, { advanceStream } from \"@tambo-ai/typescript-sdk\";\nimport { act, renderHook } from \"@testing-library/react\";\nimport React from \"react\";\nimport { DeepPartial } from \"ts-essentials\";\nimport { z } from \"zod\";\nimport { TamboComponent } from \"../../model/component-metadata\";\nimport {\n GenerationStage,\n TamboThreadMessage,\n} from \"../../model/generate-component-response\";\nimport { serializeRegistry } from \"../../testing/tools\";\nimport { useTamboClient } from \"../tambo-client-provider\";\nimport { TamboRegistryProvider } from \"../tambo-registry-provider\";\nimport { TamboThreadProvider, useTamboThread } from \"../tambo-thread-provider\";\n\ntype PartialTamboAI = DeepPartial<TamboAI>;\n\n// Mock crypto.randomUUID\nObject.defineProperty(global, \"crypto\", {\n value: {\n randomUUID: jest.fn().mockReturnValue(\"test-uuid\"),\n },\n});\n\n// Mock the required providers\njest.mock(\"../tambo-client-provider\", () => ({\n useTamboClient: jest.fn(),\n}));\njest.mock(\"@tambo-ai/typescript-sdk\", () => ({\n advanceStream: jest.fn(),\n}));\n\n// Test utilities\nconst createMockMessage = (\n overrides: Partial<TamboThreadMessage> = {},\n): TamboThreadMessage => ({\n id: \"test-message-1\",\n content: [{ type: \"text\", text: \"Hello\" }],\n role: \"user\",\n threadId: \"test-thread-1\",\n createdAt: new Date().toISOString(),\n componentState: {},\n ...overrides,\n});\n\nconst createMockThread = (\n overrides: Partial<TamboAI.Beta.Threads.Thread> = {},\n) => ({\n id: \"test-thread-1\",\n messages: [],\n createdAt: \"2024-01-01T00:00:00Z\",\n projectId: \"test-project\",\n updatedAt: \"2024-01-01T00:00:00Z\",\n metadata: {},\n ...overrides,\n});\n\nconst createMockAdvanceResponse = (\n overrides: Partial<TamboAI.Beta.Threads.ThreadAdvanceResponse> = {},\n): TamboAI.Beta.Threads.ThreadAdvanceResponse => ({\n responseMessageDto: {\n id: \"test-uuid\",\n content: [{ type: \"text\" as const, text: \"Default response\" }],\n role: \"assistant\",\n threadId: \"test-thread-1\",\n component: undefined,\n componentState: {},\n createdAt: new Date().toISOString(),\n },\n generationStage: GenerationStage.COMPLETE,\n mcpAccessToken: \"test-mcp-access-token\",\n ...overrides,\n});\n\ndescribe(\"TamboThreadProvider\", () => {\n const mockThread = createMockThread();\n\n const mockThreadsApi = {\n messages: {\n create: jest.fn(),\n },\n retrieve: jest.fn(),\n advance: jest.fn(),\n advanceById: jest.fn(),\n } satisfies DeepPartial<\n TamboAI[\"beta\"][\"threads\"]\n > as unknown as TamboAI.Beta.Threads;\n\n const mockBeta = {\n threads: mockThreadsApi,\n } satisfies PartialTamboAI[\"beta\"];\n\n const mockTamboAI = {\n apiKey: \"\",\n beta: mockBeta,\n } satisfies PartialTamboAI as unknown as TamboAI;\n\n const mockRegistry: TamboComponent[] = [\n {\n name: \"TestOnly\",\n component: () => <div>TestOnly</div>,\n description: \"TestOnly\",\n propsSchema: z.object({\n test: z.string(),\n }),\n associatedTools: [\n {\n name: \"test-tool\",\n tool: jest.fn().mockResolvedValue(\"test-tool\"),\n description: \"test-tool\",\n toolSchema: z\n .function()\n .args(z.string().describe(\"test-param-description\"))\n .returns(z.string()),\n },\n ],\n },\n ];\n\n const wrapper = ({ children }: { children: React.ReactNode }) => (\n <TamboRegistryProvider components={mockRegistry}>\n <TamboThreadProvider streaming={false}>{children}</TamboThreadProvider>\n </TamboRegistryProvider>\n );\n\n beforeEach(() => {\n jest.clearAllMocks();\n jest.mocked(mockThreadsApi.retrieve).mockResolvedValue(mockThread);\n jest\n .mocked(mockThreadsApi.messages.create)\n .mockResolvedValue(createMockMessage());\n jest\n .mocked(mockThreadsApi.advance)\n .mockResolvedValue(createMockAdvanceResponse());\n jest\n .mocked(mockThreadsApi.advanceById)\n .mockResolvedValue(createMockAdvanceResponse());\n jest.mocked(useTamboClient).mockReturnValue(mockTamboAI);\n });\n\n it(\"should initialize with placeholder thread\", () => {\n const { result } = renderHook(() => useTamboThread(), { wrapper });\n\n expect(result.current.thread.id).toBe(\"placeholder\");\n expect(result.current.isIdle).toBe(true);\n expect(result.current.generationStage).toBe(GenerationStage.IDLE);\n });\n\n it(\"should switch to a new thread\", async () => {\n const { result } = renderHook(() => useTamboThread(), { wrapper });\n\n await act(async () => {\n await result.current.switchCurrentThread(\"test-thread-1\");\n });\n\n expect(mockThreadsApi.retrieve).toHaveBeenCalledWith(\"test-thread-1\", {\n includeInternal: true,\n });\n expect(result.current.thread.id).toBe(\"test-thread-1\");\n });\n\n it(\"should start a new thread\", async () => {\n const { result } = renderHook(() => useTamboThread(), { wrapper });\n\n await act(async () => {\n result.current.startNewThread();\n });\n\n expect(result.current.thread.id).toBe(\"placeholder\");\n expect(result.current.isIdle).toBe(true);\n });\n\n it(\"should add a message to the thread\", async () => {\n const { result } = renderHook(() => useTamboThread(), { wrapper });\n const testMessage: TamboThreadMessage = {\n id: \"test-message-1\",\n content: [{ type: \"text\", text: \"Hello\" }],\n role: \"user\",\n threadId: \"test-thread-1\",\n createdAt: new Date().toISOString(),\n componentState: {},\n };\n\n await act(async () => {\n await result.current.addThreadMessage(testMessage, true);\n });\n\n expect(mockThreadsApi.messages.create).toHaveBeenCalledWith(\n \"test-thread-1\",\n {\n content: testMessage.content,\n role: testMessage.role,\n },\n );\n });\n\n it(\"should update a message in the thread\", async () => {\n const { result } = renderHook(() => useTamboThread(), { wrapper });\n const testMessage: TamboThreadMessage = {\n id: \"test-message-1\",\n content: [{ type: \"text\", text: \"Updated message\" }],\n role: \"user\",\n threadId: \"test-thread-1\",\n createdAt: new Date().toISOString(),\n componentState: {},\n };\n\n await act(async () => {\n await result.current.updateThreadMessage(\n \"test-message-1\",\n testMessage,\n true,\n );\n });\n\n expect(mockThreadsApi.messages.create).toHaveBeenCalledWith(\n \"test-thread-1\",\n {\n content: testMessage.content,\n role: testMessage.role,\n },\n );\n });\n\n it(\"should send a message and update thread state\", async () => {\n const mockAdvanceResponse: TamboAI.Beta.Threads.ThreadAdvanceResponse = {\n responseMessageDto: {\n id: \"response-1\",\n content: [{ type: \"text\", text: \"Response\" }],\n role: \"assistant\",\n threadId: \"test-thread-1\",\n component: undefined,\n componentState: {},\n createdAt: new Date().toISOString(),\n },\n generationStage: GenerationStage.COMPLETE,\n mcpAccessToken: \"test-mcp-access-token\",\n };\n\n jest\n .mocked(mockThreadsApi.advanceById)\n .mockResolvedValue(mockAdvanceResponse);\n\n const { result } = renderHook(() => useTamboThread(), { wrapper });\n\n await act(async () => {\n await result.current.sendThreadMessage(\"Hello\", {\n threadId: \"test-thread-1\",\n streamResponse: false,\n });\n });\n\n expect(mockThreadsApi.advanceById).toHaveBeenCalledWith(\"test-thread-1\", {\n messageToAppend: {\n content: [{ type: \"text\", text: \"Hello\" }],\n role: \"user\",\n },\n availableComponents: serializeRegistry(mockRegistry),\n contextKey: undefined,\n clientTools: [],\n toolCallCounts: {},\n });\n expect(result.current.generationStage).toBe(GenerationStage.COMPLETE);\n });\n\n it(\"should handle input value changes\", () => {\n const { result } = renderHook(() => useTamboThread(), { wrapper });\n\n act(() => {\n result.current.setInputValue(\"New input\");\n });\n\n expect(result.current.inputValue).toBe(\"New input\");\n });\n\n it(\"should handle streaming responses\", async () => {\n const mockStreamResponse: TamboAI.Beta.Threads.ThreadAdvanceResponse = {\n responseMessageDto: {\n id: \"stream-1\",\n content: [{ type: \"text\", text: \"Streaming response\" }],\n role: \"assistant\",\n threadId: \"test-thread-1\",\n component: undefined,\n componentState: {},\n createdAt: new Date().toISOString(),\n },\n generationStage: GenerationStage.COMPLETE,\n mcpAccessToken: \"test-mcp-access-token\",\n };\n\n // Create an async iterator mock\n const mockAsyncIterator = {\n [Symbol.asyncIterator]: async function* () {\n yield mockStreamResponse;\n },\n };\n\n // Mock advanceStream to return our async iterator\n jest.mocked(advanceStream).mockResolvedValue(mockAsyncIterator);\n\n const { result } = renderHook(() => useTamboThread(), { wrapper });\n\n await act(async () => {\n await result.current.sendThreadMessage(\"Hello\", {\n threadId: \"test-thread-1\",\n streamResponse: true,\n });\n });\n\n expect(result.current.generationStage).toBe(GenerationStage.COMPLETE);\n });\n\n it(\"should handle tool calls during message processing.\", async () => {\n const mockToolCallResponse: TamboAI.Beta.Threads.ThreadAdvanceResponse = {\n responseMessageDto: {\n id: \"tool-call-1\",\n content: [{ type: \"text\", text: \"Tool response\" }],\n role: \"tool\",\n threadId: \"test-thread-1\",\n toolCallRequest: {\n toolName: \"test-tool\",\n parameters: [{ parameterName: \"test\", parameterValue: \"test\" }],\n },\n componentState: {},\n createdAt: new Date().toISOString(),\n },\n generationStage: GenerationStage.COMPLETE,\n mcpAccessToken: \"test-mcp-access-token\",\n };\n\n jest\n .mocked(mockThreadsApi.advanceById)\n .mockResolvedValueOnce(mockToolCallResponse)\n .mockResolvedValueOnce({\n responseMessageDto: {\n id: \"advance-response2\",\n content: [{ type: \"text\", text: \"response 2\" }],\n role: \"user\",\n threadId: \"test-thread-1\",\n componentState: {},\n createdAt: new Date().toISOString(),\n },\n generationStage: GenerationStage.COMPLETE,\n mcpAccessToken: \"test-mcp-access-token\",\n });\n\n const { result } = renderHook(() => useTamboThread(), { wrapper });\n\n await act(async () => {\n await result.current.sendThreadMessage(\"Use tool\", {\n threadId: \"test-thread-1\",\n streamResponse: false,\n });\n });\n expect(result.current.generationStage).toBe(GenerationStage.COMPLETE);\n expect(mockRegistry[0]?.associatedTools?.[0]?.tool).toHaveBeenCalledWith(\n \"test\",\n );\n });\n\n describe(\"streaming behavior\", () => {\n it(\"should call advanceStream when streamResponse=true\", async () => {\n // Use wrapper with streaming=true to show that explicit streamResponse=true works\n const wrapperWithStreaming = ({\n children,\n }: {\n children: React.ReactNode;\n }) => (\n <TamboRegistryProvider components={mockRegistry}>\n <TamboThreadProvider streaming={true}>{children}</TamboThreadProvider>\n </TamboRegistryProvider>\n );\n\n const mockStreamResponse: TamboAI.Beta.Threads.ThreadAdvanceResponse = {\n responseMessageDto: {\n id: \"stream-response\",\n content: [{ type: \"text\", text: \"Streaming response\" }],\n role: \"assistant\",\n threadId: \"test-thread-1\",\n component: undefined,\n componentState: {},\n createdAt: new Date().toISOString(),\n },\n generationStage: GenerationStage.COMPLETE,\n mcpAccessToken: \"test-mcp-access-token\",\n };\n\n const mockAsyncIterator = {\n [Symbol.asyncIterator]: async function* () {\n yield mockStreamResponse;\n },\n };\n\n jest.mocked(advanceStream).mockResolvedValue(mockAsyncIterator);\n\n const { result } = renderHook(() => useTamboThread(), {\n wrapper: wrapperWithStreaming,\n });\n\n await act(async () => {\n await result.current.sendThreadMessage(\"Hello streaming\", {\n threadId: \"test-thread-1\",\n streamResponse: true,\n });\n });\n\n expect(advanceStream).toHaveBeenCalledWith(\n mockTamboAI,\n {\n messageToAppend: {\n content: [{ type: \"text\", text: \"Hello streaming\" }],\n role: \"user\",\n },\n availableComponents: serializeRegistry(mockRegistry),\n contextKey: undefined,\n clientTools: [],\n forceToolChoice: undefined,\n toolCallCounts: {},\n },\n \"test-thread-1\",\n );\n\n // Should not call advance or advanceById\n expect(mockThreadsApi.advance).not.toHaveBeenCalled();\n expect(mockThreadsApi.advanceById).not.toHaveBeenCalled();\n });\n\n it(\"should call advanceById when streamResponse=false for existing thread\", async () => {\n // Use wrapper with streaming=true to show that explicit streamResponse=false overrides provider setting\n const wrapperWithStreaming = ({\n children,\n }: {\n children: React.ReactNode;\n }) => (\n <TamboRegistryProvider components={mockRegistry}>\n <TamboThreadProvider streaming={true}>{children}</TamboThreadProvider>\n </TamboRegistryProvider>\n );\n\n const { result } = renderHook(() => useTamboThread(), {\n wrapper: wrapperWithStreaming,\n });\n\n await act(async () => {\n await result.current.sendThreadMessage(\"Hello non-streaming\", {\n threadId: \"test-thread-1\",\n streamResponse: false,\n });\n });\n\n expect(mockThreadsApi.advanceById).toHaveBeenCalledWith(\"test-thread-1\", {\n messageToAppend: {\n content: [{ type: \"text\", text: \"Hello non-streaming\" }],\n role: \"user\",\n },\n availableComponents: serializeRegistry(mockRegistry),\n contextKey: undefined,\n clientTools: [],\n forceToolChoice: undefined,\n toolCallCounts: {},\n });\n\n // Should not call advance or advanceStream\n expect(mockThreadsApi.advance).not.toHaveBeenCalled();\n expect(advanceStream).not.toHaveBeenCalled();\n });\n\n it(\"should call advanceById when streamResponse is undefined and provider streaming=false\", async () => {\n // Use wrapper with streaming=false to test that undefined streamResponse respects provider setting\n const wrapperWithoutStreaming = ({\n children,\n }: {\n children: React.ReactNode;\n }) => (\n <TamboRegistryProvider components={mockRegistry}>\n <TamboThreadProvider streaming={false}>\n {children}\n </TamboThreadProvider>\n </TamboRegistryProvider>\n );\n\n const { result } = renderHook(() => useTamboThread(), {\n wrapper: wrapperWithoutStreaming,\n });\n\n await act(async () => {\n await result.current.sendThreadMessage(\"Hello default\", {\n threadId: \"test-thread-1\",\n // streamResponse is undefined, should use provider's streaming=false\n });\n });\n\n expect(mockThreadsApi.advanceById).toHaveBeenCalledWith(\"test-thread-1\", {\n messageToAppend: {\n content: [{ type: \"text\", text: \"Hello default\" }],\n role: \"user\",\n },\n availableComponents: serializeRegistry(mockRegistry),\n contextKey: undefined,\n clientTools: [],\n forceToolChoice: undefined,\n toolCallCounts: {},\n });\n\n // Should not call advance or advanceStream\n expect(mockThreadsApi.advance).not.toHaveBeenCalled();\n expect(advanceStream).not.toHaveBeenCalled();\n });\n\n it(\"should call advanceStream when streamResponse is undefined and provider streaming=true (default)\", async () => {\n // Use wrapper with streaming=true (default) to test that undefined streamResponse respects provider setting\n const wrapperWithDefaultStreaming = ({\n children,\n }: {\n children: React.ReactNode;\n }) => (\n <TamboRegistryProvider components={mockRegistry}>\n <TamboThreadProvider>{children}</TamboThreadProvider>\n </TamboRegistryProvider>\n );\n\n const mockStreamResponse: TamboAI.Beta.Threads.ThreadAdvanceResponse = {\n responseMessageDto: {\n id: \"stream-response\",\n content: [{ type: \"text\", text: \"Streaming response\" }],\n role: \"assistant\",\n threadId: \"test-thread-1\",\n component: undefined,\n componentState: {},\n createdAt: new Date().toISOString(),\n },\n generationStage: GenerationStage.COMPLETE,\n mcpAccessToken: \"test-mcp-access-token\",\n };\n\n const mockAsyncIterator = {\n [Symbol.asyncIterator]: async function* () {\n yield mockStreamResponse;\n },\n };\n\n jest.mocked(advanceStream).mockResolvedValue(mockAsyncIterator);\n\n const { result } = renderHook(() => useTamboThread(), {\n wrapper: wrapperWithDefaultStreaming,\n });\n\n await act(async () => {\n await result.current.sendThreadMessage(\"Hello default streaming\", {\n threadId: \"test-thread-1\",\n // streamResponse is undefined, should use provider's streaming=true (default)\n });\n });\n\n expect(advanceStream).toHaveBeenCalledWith(\n mockTamboAI,\n {\n messageToAppend: {\n content: [{ type: \"text\", text: \"Hello default streaming\" }],\n role: \"user\",\n },\n availableComponents: serializeRegistry(mockRegistry),\n contextKey: undefined,\n clientTools: [],\n forceToolChoice: undefined,\n toolCallCounts: {},\n },\n \"test-thread-1\",\n );\n\n // Should not call advance or advanceById\n expect(mockThreadsApi.advance).not.toHaveBeenCalled();\n expect(mockThreadsApi.advanceById).not.toHaveBeenCalled();\n });\n\n it(\"should call advance when streamResponse=false for placeholder thread\", async () => {\n // Use wrapper with streaming=true to show that explicit streamResponse=false overrides provider setting\n const wrapperWithStreaming = ({\n children,\n }: {\n children: React.ReactNode;\n }) => (\n <TamboRegistryProvider components={mockRegistry}>\n <TamboThreadProvider streaming={true}>{children}</TamboThreadProvider>\n </TamboRegistryProvider>\n );\n\n const { result } = renderHook(() => useTamboThread(), {\n wrapper: wrapperWithStreaming,\n });\n\n // Start with placeholder thread (which is the default state)\n expect(result.current.thread.id).toBe(\"placeholder\");\n\n await act(async () => {\n await result.current.sendThreadMessage(\"Hello new thread\", {\n threadId: \"placeholder\",\n streamResponse: false,\n });\n });\n\n expect(mockThreadsApi.advance).toHaveBeenCalledWith({\n messageToAppend: {\n content: [{ type: \"text\", text: \"Hello new thread\" }],\n role: \"user\",\n },\n availableComponents: serializeRegistry(mockRegistry),\n contextKey: undefined,\n clientTools: [],\n forceToolChoice: undefined,\n toolCallCounts: {},\n });\n\n // Should not call advanceById or advanceStream\n expect(mockThreadsApi.advanceById).not.toHaveBeenCalled();\n expect(advanceStream).not.toHaveBeenCalled();\n });\n\n it(\"should call advanceStream when streamResponse=true for placeholder thread\", async () => {\n // Use wrapper with streaming=false to show that explicit streamResponse=true overrides provider setting\n const wrapperWithoutStreaming = ({\n children,\n }: {\n children: React.ReactNode;\n }) => (\n <TamboRegistryProvider components={mockRegistry}>\n <TamboThreadProvider streaming={false}>\n {children}\n </TamboThreadProvider>\n </TamboRegistryProvider>\n );\n\n const mockStreamResponse: TamboAI.Beta.Threads.ThreadAdvanceResponse = {\n responseMessageDto: {\n id: \"stream-response\",\n content: [{ type: \"text\", text: \"Streaming response\" }],\n role: \"assistant\",\n threadId: \"new-thread-1\",\n component: undefined,\n componentState: {},\n createdAt: new Date().toISOString(),\n },\n generationStage: GenerationStage.COMPLETE,\n mcpAccessToken: \"test-mcp-access-token\",\n };\n\n const mockAsyncIterator = {\n [Symbol.asyncIterator]: async function* () {\n yield mockStreamResponse;\n },\n };\n\n jest.mocked(advanceStream).mockResolvedValue(mockAsyncIterator);\n\n const { result } = renderHook(() => useTamboThread(), {\n wrapper: wrapperWithoutStreaming,\n });\n\n // Start with placeholder thread (which is the default state)\n expect(result.current.thread.id).toBe(\"placeholder\");\n\n await act(async () => {\n await result.current.sendThreadMessage(\"Hello streaming new thread\", {\n threadId: \"placeholder\",\n streamResponse: true,\n });\n });\n\n expect(advanceStream).toHaveBeenCalledWith(\n mockTamboAI,\n {\n messageToAppend: {\n content: [{ type: \"text\", text: \"Hello streaming new thread\" }],\n role: \"user\",\n },\n availableComponents: serializeRegistry(mockRegistry),\n contextKey: undefined,\n clientTools: [],\n forceToolChoice: undefined,\n toolCallCounts: {},\n },\n undefined, // threadId is undefined for placeholder thread\n );\n\n // Should not call advance or advanceById\n expect(mockThreadsApi.advance).not.toHaveBeenCalled();\n expect(mockThreadsApi.advanceById).not.toHaveBeenCalled();\n });\n });\n});\n"]}
1
+ {"version":3,"file":"tambo-thread-provider.test.js","sourceRoot":"","sources":["../../../src/providers/__tests__/tambo-thread-provider.test.tsx"],"names":[],"mappings":";;;;;AAAA,6DAAkE;AAClE,kDAAyD;AACzD,kDAA0B;AAE1B,6BAAwB;AAExB,yFAGiD;AACjD,+CAAwD;AACxD,oEAA0D;AAC1D,wEAAmE;AACnE,oEAA+E;AAI/E,yBAAyB;AACzB,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,QAAQ,EAAE;IACtC,KAAK,EAAE;QACL,UAAU,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,WAAW,CAAC;KACnD;CACF,CAAC,CAAC;AAEH,8BAA8B;AAC9B,IAAI,CAAC,IAAI,CAAC,0BAA0B,EAAE,GAAG,EAAE,CAAC,CAAC;IAC3C,cAAc,EAAE,IAAI,CAAC,EAAE,EAAE;CAC1B,CAAC,CAAC,CAAC;AACJ,IAAI,CAAC,IAAI,CAAC,0BAA0B,EAAE,GAAG,EAAE,CAAC,CAAC;IAC3C,aAAa,EAAE,IAAI,CAAC,EAAE,EAAE;CACzB,CAAC,CAAC,CAAC;AAEJ,+CAA+C;AAC/C,IAAI,CAAC,IAAI,CAAC,qBAAqB,EAAE,GAAG,EAAE,CAAC,CAAC;IACtC,GAAG,IAAI,CAAC,aAAa,CAAC,qBAAqB,CAAC;IAC5C,gBAAgB,EAAE,GAAG,EAAE,CAAC,CAAC;QACvB,SAAS,EAAE,uBAAuB;QAClC,QAAQ,EAAE,kBAAkB;KAC7B,CAAC;IACF,gBAAgB,EAAE,GAAG,EAAE,CAAC,CAAC;QACvB,OAAO,EAAE,yBAAyB;KACnC,CAAC;CACH,CAAC,CAAC,CAAC;AAEJ,qFAAqF;AACrF,MAAM,mBAAmB,GAAG;IAC1B,MAAM,EAAE;QACN,SAAS,EAAE,uBAAuB;QAClC,QAAQ,EAAE,kBAAkB;KAC7B;IACD,GAAG;QACD,MAAM,EAAE;YACN,OAAO,EAAE,yBAAyB;SACnC;KACF;CACF,CAAC;AAEF,iBAAiB;AACjB,MAAM,iBAAiB,GAAG,CACxB,YAAyC,EAAE,EACvB,EAAE,CAAC,CAAC;IACxB,EAAE,EAAE,gBAAgB;IACpB,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;IAC1C,IAAI,EAAE,MAAM;IACZ,QAAQ,EAAE,eAAe;IACzB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;IACnC,cAAc,EAAE,EAAE;IAClB,GAAG,SAAS;CACb,CAAC,CAAC;AAEH,MAAM,gBAAgB,GAAG,CACvB,YAAkD,EAAE,EACpD,EAAE,CAAC,CAAC;IACJ,EAAE,EAAE,eAAe;IACnB,QAAQ,EAAE,EAAE;IACZ,SAAS,EAAE,sBAAsB;IACjC,SAAS,EAAE,cAAc;IACzB,SAAS,EAAE,sBAAsB;IACjC,QAAQ,EAAE,EAAE;IACZ,GAAG,SAAS;CACb,CAAC,CAAC;AAEH,MAAM,yBAAyB,GAAG,CAChC,YAAiE,EAAE,EACvB,EAAE,CAAC,CAAC;IAChD,kBAAkB,EAAE;QAClB,EAAE,EAAE,WAAW;QACf,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,kBAAkB,EAAE,CAAC;QAC9D,IAAI,EAAE,WAAW;QACjB,QAAQ,EAAE,eAAe;QACzB,SAAS,EAAE,SAAS;QACpB,cAAc,EAAE,EAAE;QAClB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACpC;IACD,eAAe,EAAE,6CAAe,CAAC,QAAQ;IACzC,cAAc,EAAE,uBAAuB;IACvC,GAAG,SAAS;CACb,CAAC,CAAC;AAEH,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;IACnC,MAAM,UAAU,GAAG,gBAAgB,EAAE,CAAC;IAEtC,MAAM,cAAc,GAAG;QACrB,QAAQ,EAAE;YACR,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE;SAClB;QACD,QAAQ,EAAE,IAAI,CAAC,EAAE,EAAE;QACnB,OAAO,EAAE,IAAI,CAAC,EAAE,EAAE;QAClB,WAAW,EAAE,IAAI,CAAC,EAAE,EAAE;KAGY,CAAC;IAErC,MAAM,QAAQ,GAAG;QACf,OAAO,EAAE,cAAc;KACS,CAAC;IAEnC,MAAM,WAAW,GAAG;QAClB,MAAM,EAAE,EAAE;QACV,IAAI,EAAE,QAAQ;KACgC,CAAC;IAEjD,MAAM,YAAY,GAAqB;QACrC;YACE,IAAI,EAAE,UAAU;YAChB,SAAS,EAAE,GAAG,EAAE,CAAC,sDAAmB;YACpC,WAAW,EAAE,UAAU;YACvB,WAAW,EAAE,OAAC,CAAC,MAAM,CAAC;gBACpB,IAAI,EAAE,OAAC,CAAC,MAAM,EAAE;aACjB,CAAC;YACF,eAAe,EAAE;gBACf;oBACE,IAAI,EAAE,WAAW;oBACjB,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,WAAW,CAAC;oBAC9C,WAAW,EAAE,WAAW;oBACxB,UAAU,EAAE,OAAC;yBACV,QAAQ,EAAE;yBACV,IAAI,CAAC,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,wBAAwB,CAAC,CAAC;yBACnD,OAAO,CAAC,OAAC,CAAC,MAAM,EAAE,CAAC;iBACvB;aACF;SACF;KACF,CAAC;IAEF,MAAM,OAAO,GAAG,CAAC,EAAE,QAAQ,EAAiC,EAAE,EAAE,CAAC,CAC/D,8BAAC,+CAAqB,IAAC,UAAU,EAAE,YAAY;QAC7C,8BAAC,2CAAmB,IAAC,SAAS,EAAE,KAAK,IAAG,QAAQ,CAAuB,CACjD,CACzB,CAAC;IAEF,UAAU,CAAC,GAAG,EAAE;QACd,IAAI,CAAC,aAAa,EAAE,CAAC;QACrB,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC;QACnE,IAAI;aACD,MAAM,CAAC,cAAc,CAAC,QAAQ,CAAC,MAAM,CAAC;aACtC,iBAAiB,CAAC,iBAAiB,EAAE,CAAC,CAAC;QAC1C,IAAI;aACD,MAAM,CAAC,cAAc,CAAC,OAAO,CAAC;aAC9B,iBAAiB,CAAC,yBAAyB,EAAE,CAAC,CAAC;QAClD,IAAI;aACD,MAAM,CAAC,cAAc,CAAC,WAAW,CAAC;aAClC,iBAAiB,CAAC,yBAAyB,EAAE,CAAC,CAAC;QAClD,IAAI,CAAC,MAAM,CAAC,sCAAc,CAAC,CAAC,eAAe,CAAC,WAAW,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACnD,MAAM,EAAE,MAAM,EAAE,GAAG,IAAA,kBAAU,EAAC,GAAG,EAAE,CAAC,IAAA,sCAAc,GAAE,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;QAEnE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QACrD,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACzC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,6CAAe,CAAC,IAAI,CAAC,CAAC;IACpE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+BAA+B,EAAE,KAAK,IAAI,EAAE;QAC7C,MAAM,EAAE,MAAM,EAAE,GAAG,IAAA,kBAAU,EAAC,GAAG,EAAE,CAAC,IAAA,sCAAc,GAAE,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;QAEnE,MAAM,IAAA,WAAG,EAAC,KAAK,IAAI,EAAE;YACnB,MAAM,MAAM,CAAC,OAAO,CAAC,mBAAmB,CAAC,eAAe,CAAC,CAAC;QAC5D,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,oBAAoB,CAAC,eAAe,EAAE;YACpE,eAAe,EAAE,IAAI;SACtB,CAAC,CAAC;QACH,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2BAA2B,EAAE,KAAK,IAAI,EAAE;QACzC,MAAM,EAAE,MAAM,EAAE,GAAG,IAAA,kBAAU,EAAC,GAAG,EAAE,CAAC,IAAA,sCAAc,GAAE,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;QAEnE,MAAM,IAAA,WAAG,EAAC,KAAK,IAAI,EAAE;YACnB,MAAM,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC;QAClC,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QACrD,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oCAAoC,EAAE,KAAK,IAAI,EAAE;QAClD,MAAM,EAAE,MAAM,EAAE,GAAG,IAAA,kBAAU,EAAC,GAAG,EAAE,CAAC,IAAA,sCAAc,GAAE,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;QACnE,MAAM,WAAW,GAAuB;YACtC,EAAE,EAAE,gBAAgB;YACpB,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;YAC1C,IAAI,EAAE,MAAM;YACZ,QAAQ,EAAE,eAAe;YACzB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACnC,cAAc,EAAE,EAAE;SACnB,CAAC;QAEF,MAAM,IAAA,WAAG,EAAC,KAAK,IAAI,EAAE;YACnB,MAAM,MAAM,CAAC,OAAO,CAAC,gBAAgB,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;QAC3D,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,cAAc,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,oBAAoB,CACzD,eAAe,EACf;YACE,OAAO,EAAE,WAAW,CAAC,OAAO;YAC5B,IAAI,EAAE,WAAW,CAAC,IAAI;SACvB,CACF,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uCAAuC,EAAE,KAAK,IAAI,EAAE;QACrD,MAAM,EAAE,MAAM,EAAE,GAAG,IAAA,kBAAU,EAAC,GAAG,EAAE,CAAC,IAAA,sCAAc,GAAE,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;QACnE,MAAM,WAAW,GAAuB;YACtC,EAAE,EAAE,gBAAgB;YACpB,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,iBAAiB,EAAE,CAAC;YACpD,IAAI,EAAE,MAAM;YACZ,QAAQ,EAAE,eAAe;YACzB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACnC,cAAc,EAAE,EAAE;SACnB,CAAC;QAEF,MAAM,IAAA,WAAG,EAAC,KAAK,IAAI,EAAE;YACnB,MAAM,MAAM,CAAC,OAAO,CAAC,mBAAmB,CACtC,gBAAgB,EAChB,WAAW,EACX,IAAI,CACL,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,cAAc,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,oBAAoB,CACzD,eAAe,EACf;YACE,OAAO,EAAE,WAAW,CAAC,OAAO;YAC5B,IAAI,EAAE,WAAW,CAAC,IAAI;SACvB,CACF,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+CAA+C,EAAE,KAAK,IAAI,EAAE;QAC7D,MAAM,mBAAmB,GAA+C;YACtE,kBAAkB,EAAE;gBAClB,EAAE,EAAE,YAAY;gBAChB,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;gBAC7C,IAAI,EAAE,WAAW;gBACjB,QAAQ,EAAE,eAAe;gBACzB,SAAS,EAAE,SAAS;gBACpB,cAAc,EAAE,EAAE;gBAClB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aACpC;YACD,eAAe,EAAE,6CAAe,CAAC,QAAQ;YACzC,cAAc,EAAE,uBAAuB;SACxC,CAAC;QAEF,IAAI;aACD,MAAM,CAAC,cAAc,CAAC,WAAW,CAAC;aAClC,iBAAiB,CAAC,mBAAmB,CAAC,CAAC;QAE1C,MAAM,EAAE,MAAM,EAAE,GAAG,IAAA,kBAAU,EAAC,GAAG,EAAE,CAAC,IAAA,sCAAc,GAAE,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;QAEnE,MAAM,IAAA,WAAG,EAAC,KAAK,IAAI,EAAE;YACnB,MAAM,MAAM,CAAC,OAAO,CAAC,iBAAiB,CAAC,OAAO,EAAE;gBAC9C,QAAQ,EAAE,eAAe;gBACzB,cAAc,EAAE,KAAK;gBACrB,iBAAiB,EAAE;oBACjB,MAAM,EAAE;wBACN,OAAO,EAAE,yBAAyB;qBACnC;iBACF;aACF,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC,oBAAoB,CAAC,eAAe,EAAE;YACvE,eAAe,EAAE;gBACf,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;gBAC1C,IAAI,EAAE,MAAM;aACb;YACD,mBAAmB,EAAE,IAAA,yBAAiB,EAAC,YAAY,CAAC;YACpD,UAAU,EAAE,SAAS;YACrB,WAAW,EAAE,EAAE;YACf,cAAc,EAAE,EAAE;YAClB,iBAAiB,EAAE,mBAAmB;SACvC,CAAC,CAAC;QACH,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,6CAAe,CAAC,QAAQ,CAAC,CAAC;IACxE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;QAC3C,MAAM,EAAE,MAAM,EAAE,GAAG,IAAA,kBAAU,EAAC,GAAG,EAAE,CAAC,IAAA,sCAAc,GAAE,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;QAEnE,IAAA,WAAG,EAAC,GAAG,EAAE;YACP,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC;QAC5C,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mCAAmC,EAAE,KAAK,IAAI,EAAE;QACjD,MAAM,kBAAkB,GAA+C;YACrE,kBAAkB,EAAE;gBAClB,EAAE,EAAE,UAAU;gBACd,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,oBAAoB,EAAE,CAAC;gBACvD,IAAI,EAAE,WAAW;gBACjB,QAAQ,EAAE,eAAe;gBACzB,SAAS,EAAE,SAAS;gBACpB,cAAc,EAAE,EAAE;gBAClB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aACpC;YACD,eAAe,EAAE,6CAAe,CAAC,QAAQ;YACzC,cAAc,EAAE,uBAAuB;SACxC,CAAC;QAEF,gCAAgC;QAChC,MAAM,iBAAiB,GAAG;YACxB,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,KAAK,SAAS,CAAC;gBACrC,MAAM,kBAAkB,CAAC;YAC3B,CAAC;SACF,CAAC;QAEF,kDAAkD;QAClD,IAAI,CAAC,MAAM,CAAC,8BAAa,CAAC,CAAC,iBAAiB,CAAC,iBAAiB,CAAC,CAAC;QAEhE,MAAM,EAAE,MAAM,EAAE,GAAG,IAAA,kBAAU,EAAC,GAAG,EAAE,CAAC,IAAA,sCAAc,GAAE,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;QAEnE,MAAM,IAAA,WAAG,EAAC,KAAK,IAAI,EAAE;YACnB,MAAM,MAAM,CAAC,OAAO,CAAC,iBAAiB,CAAC,OAAO,EAAE;gBAC9C,QAAQ,EAAE,eAAe;gBACzB,cAAc,EAAE,IAAI;aACrB,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,6CAAe,CAAC,QAAQ,CAAC,CAAC;IACxE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qDAAqD,EAAE,KAAK,IAAI,EAAE;QACnE,MAAM,oBAAoB,GAA+C;YACvE,kBAAkB,EAAE;gBAClB,EAAE,EAAE,aAAa;gBACjB,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC;gBAClD,IAAI,EAAE,MAAM;gBACZ,QAAQ,EAAE,eAAe;gBACzB,eAAe,EAAE;oBACf,QAAQ,EAAE,WAAW;oBACrB,UAAU,EAAE,CAAC,EAAE,aAAa,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,CAAC;iBAChE;gBACD,cAAc,EAAE,EAAE;gBAClB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aACpC;YACD,eAAe,EAAE,6CAAe,CAAC,QAAQ;YACzC,cAAc,EAAE,uBAAuB;SACxC,CAAC;QAEF,IAAI;aACD,MAAM,CAAC,cAAc,CAAC,WAAW,CAAC;aAClC,qBAAqB,CAAC,oBAAoB,CAAC;aAC3C,qBAAqB,CAAC;YACrB,kBAAkB,EAAE;gBAClB,EAAE,EAAE,mBAAmB;gBACvB,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;gBAC/C,IAAI,EAAE,MAAM;gBACZ,QAAQ,EAAE,eAAe;gBACzB,cAAc,EAAE,EAAE;gBAClB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aACpC;YACD,eAAe,EAAE,6CAAe,CAAC,QAAQ;YACzC,cAAc,EAAE,uBAAuB;SACxC,CAAC,CAAC;QAEL,MAAM,EAAE,MAAM,EAAE,GAAG,IAAA,kBAAU,EAAC,GAAG,EAAE,CAAC,IAAA,sCAAc,GAAE,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;QAEnE,MAAM,IAAA,WAAG,EAAC,KAAK,IAAI,EAAE;YACnB,MAAM,MAAM,CAAC,OAAO,CAAC,iBAAiB,CAAC,UAAU,EAAE;gBACjD,QAAQ,EAAE,eAAe;gBACzB,cAAc,EAAE,KAAK;aACtB,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QACH,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,6CAAe,CAAC,QAAQ,CAAC,CAAC;QACtE,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,oBAAoB,CACtE,MAAM,CACP,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;QAClC,EAAE,CAAC,oDAAoD,EAAE,KAAK,IAAI,EAAE;YAClE,kFAAkF;YAClF,MAAM,oBAAoB,GAAG,CAAC,EAC5B,QAAQ,GAGT,EAAE,EAAE,CAAC,CACJ,8BAAC,+CAAqB,IAAC,UAAU,EAAE,YAAY;gBAC7C,8BAAC,2CAAmB,IAAC,SAAS,EAAE,IAAI,IAAG,QAAQ,CAAuB,CAChD,CACzB,CAAC;YAEF,MAAM,kBAAkB,GAA+C;gBACrE,kBAAkB,EAAE;oBAClB,EAAE,EAAE,iBAAiB;oBACrB,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,oBAAoB,EAAE,CAAC;oBACvD,IAAI,EAAE,WAAW;oBACjB,QAAQ,EAAE,eAAe;oBACzB,SAAS,EAAE,SAAS;oBACpB,cAAc,EAAE,EAAE;oBAClB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;iBACpC;gBACD,eAAe,EAAE,6CAAe,CAAC,QAAQ;gBACzC,cAAc,EAAE,uBAAuB;aACxC,CAAC;YAEF,MAAM,iBAAiB,GAAG;gBACxB,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,KAAK,SAAS,CAAC;oBACrC,MAAM,kBAAkB,CAAC;gBAC3B,CAAC;aACF,CAAC;YAEF,IAAI,CAAC,MAAM,CAAC,8BAAa,CAAC,CAAC,iBAAiB,CAAC,iBAAiB,CAAC,CAAC;YAEhE,MAAM,EAAE,MAAM,EAAE,GAAG,IAAA,kBAAU,EAAC,GAAG,EAAE,CAAC,IAAA,sCAAc,GAAE,EAAE;gBACpD,OAAO,EAAE,oBAAoB;aAC9B,CAAC,CAAC;YAEH,MAAM,IAAA,WAAG,EAAC,KAAK,IAAI,EAAE;gBACnB,MAAM,MAAM,CAAC,OAAO,CAAC,iBAAiB,CAAC,iBAAiB,EAAE;oBACxD,QAAQ,EAAE,eAAe;oBACzB,cAAc,EAAE,IAAI;oBACpB,iBAAiB,EAAE;wBACjB,MAAM,EAAE;4BACN,OAAO,EAAE,yBAAyB;yBACnC;qBACF;iBACF,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;YAEH,MAAM,CAAC,8BAAa,CAAC,CAAC,oBAAoB,CACxC,WAAW,EACX;gBACE,eAAe,EAAE;oBACf,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,iBAAiB,EAAE,CAAC;oBACpD,IAAI,EAAE,MAAM;iBACb;gBACD,mBAAmB,EAAE,IAAA,yBAAiB,EAAC,YAAY,CAAC;gBACpD,UAAU,EAAE,SAAS;gBACrB,WAAW,EAAE,EAAE;gBACf,eAAe,EAAE,SAAS;gBAC1B,cAAc,EAAE,EAAE;gBAClB,iBAAiB,EAAE,mBAAmB;aACvC,EACD,eAAe,CAChB,CAAC;YAEF,yCAAyC;YACzC,MAAM,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;YACtD,MAAM,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QAC5D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,uEAAuE,EAAE,KAAK,IAAI,EAAE;YACrF,wGAAwG;YACxG,MAAM,oBAAoB,GAAG,CAAC,EAC5B,QAAQ,GAGT,EAAE,EAAE,CAAC,CACJ,8BAAC,+CAAqB,IAAC,UAAU,EAAE,YAAY;gBAC7C,8BAAC,2CAAmB,IAAC,SAAS,EAAE,IAAI,IAAG,QAAQ,CAAuB,CAChD,CACzB,CAAC;YAEF,MAAM,EAAE,MAAM,EAAE,GAAG,IAAA,kBAAU,EAAC,GAAG,EAAE,CAAC,IAAA,sCAAc,GAAE,EAAE;gBACpD,OAAO,EAAE,oBAAoB;aAC9B,CAAC,CAAC;YAEH,MAAM,IAAA,WAAG,EAAC,KAAK,IAAI,EAAE;gBACnB,MAAM,MAAM,CAAC,OAAO,CAAC,iBAAiB,CAAC,qBAAqB,EAAE;oBAC5D,QAAQ,EAAE,eAAe;oBACzB,cAAc,EAAE,KAAK;oBACrB,iBAAiB,EAAE;wBACjB,MAAM,EAAE;4BACN,OAAO,EAAE,yBAAyB;yBACnC;qBACF;iBACF,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;YAEH,MAAM,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC,oBAAoB,CAAC,eAAe,EAAE;gBACvE,eAAe,EAAE;oBACf,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,qBAAqB,EAAE,CAAC;oBACxD,IAAI,EAAE,MAAM;iBACb;gBACD,mBAAmB,EAAE,IAAA,yBAAiB,EAAC,YAAY,CAAC;gBACpD,UAAU,EAAE,SAAS;gBACrB,WAAW,EAAE,EAAE;gBACf,eAAe,EAAE,SAAS;gBAC1B,cAAc,EAAE,EAAE;gBAClB,iBAAiB,EAAE,mBAAmB;aACvC,CAAC,CAAC;YAEH,2CAA2C;YAC3C,MAAM,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;YACtD,MAAM,CAAC,8BAAa,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QAC/C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,uFAAuF,EAAE,KAAK,IAAI,EAAE;YACrG,mGAAmG;YACnG,MAAM,uBAAuB,GAAG,CAAC,EAC/B,QAAQ,GAGT,EAAE,EAAE,CAAC,CACJ,8BAAC,+CAAqB,IAAC,UAAU,EAAE,YAAY;gBAC7C,8BAAC,2CAAmB,IAAC,SAAS,EAAE,KAAK,IAClC,QAAQ,CACW,CACA,CACzB,CAAC;YAEF,MAAM,EAAE,MAAM,EAAE,GAAG,IAAA,kBAAU,EAAC,GAAG,EAAE,CAAC,IAAA,sCAAc,GAAE,EAAE;gBACpD,OAAO,EAAE,uBAAuB;aACjC,CAAC,CAAC;YAEH,MAAM,IAAA,WAAG,EAAC,KAAK,IAAI,EAAE;gBACnB,MAAM,MAAM,CAAC,OAAO,CAAC,iBAAiB,CAAC,eAAe,EAAE;oBACtD,QAAQ,EAAE,eAAe;oBACzB,qEAAqE;oBACrE,iBAAiB,EAAE;wBACjB,MAAM,EAAE;4BACN,OAAO,EAAE,yBAAyB;yBACnC;qBACF;iBACF,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;YAEH,MAAM,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC,oBAAoB,CAAC,eAAe,EAAE;gBACvE,eAAe,EAAE;oBACf,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC;oBAClD,IAAI,EAAE,MAAM;iBACb;gBACD,mBAAmB,EAAE,IAAA,yBAAiB,EAAC,YAAY,CAAC;gBACpD,UAAU,EAAE,SAAS;gBACrB,WAAW,EAAE,EAAE;gBACf,eAAe,EAAE,SAAS;gBAC1B,cAAc,EAAE,EAAE;gBAClB,iBAAiB,EAAE,mBAAmB;aACvC,CAAC,CAAC;YAEH,2CAA2C;YAC3C,MAAM,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;YACtD,MAAM,CAAC,8BAAa,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QAC/C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,kGAAkG,EAAE,KAAK,IAAI,EAAE;YAChH,4GAA4G;YAC5G,MAAM,2BAA2B,GAAG,CAAC,EACnC,QAAQ,GAGT,EAAE,EAAE,CAAC,CACJ,8BAAC,+CAAqB,IAAC,UAAU,EAAE,YAAY;gBAC7C,8BAAC,2CAAmB,QAAE,QAAQ,CAAuB,CAC/B,CACzB,CAAC;YAEF,MAAM,kBAAkB,GAA+C;gBACrE,kBAAkB,EAAE;oBAClB,EAAE,EAAE,iBAAiB;oBACrB,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,oBAAoB,EAAE,CAAC;oBACvD,IAAI,EAAE,WAAW;oBACjB,QAAQ,EAAE,eAAe;oBACzB,SAAS,EAAE,SAAS;oBACpB,cAAc,EAAE,EAAE;oBAClB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;iBACpC;gBACD,eAAe,EAAE,6CAAe,CAAC,QAAQ;gBACzC,cAAc,EAAE,uBAAuB;aACxC,CAAC;YAEF,MAAM,iBAAiB,GAAG;gBACxB,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,KAAK,SAAS,CAAC;oBACrC,MAAM,kBAAkB,CAAC;gBAC3B,CAAC;aACF,CAAC;YAEF,IAAI,CAAC,MAAM,CAAC,8BAAa,CAAC,CAAC,iBAAiB,CAAC,iBAAiB,CAAC,CAAC;YAEhE,MAAM,EAAE,MAAM,EAAE,GAAG,IAAA,kBAAU,EAAC,GAAG,EAAE,CAAC,IAAA,sCAAc,GAAE,EAAE;gBACpD,OAAO,EAAE,2BAA2B;aACrC,CAAC,CAAC;YAEH,MAAM,IAAA,WAAG,EAAC,KAAK,IAAI,EAAE;gBACnB,MAAM,MAAM,CAAC,OAAO,CAAC,iBAAiB,CAAC,yBAAyB,EAAE;oBAChE,QAAQ,EAAE,eAAe;oBACzB,8EAA8E;oBAC9E,iBAAiB,EAAE;wBACjB,MAAM,EAAE;4BACN,OAAO,EAAE,yBAAyB;yBACnC;qBACF;iBACF,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;YAEH,MAAM,CAAC,8BAAa,CAAC,CAAC,oBAAoB,CACxC,WAAW,EACX;gBACE,eAAe,EAAE;oBACf,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,yBAAyB,EAAE,CAAC;oBAC5D,IAAI,EAAE,MAAM;iBACb;gBACD,mBAAmB,EAAE,IAAA,yBAAiB,EAAC,YAAY,CAAC;gBACpD,UAAU,EAAE,SAAS;gBACrB,WAAW,EAAE,EAAE;gBACf,eAAe,EAAE,SAAS;gBAC1B,cAAc,EAAE,EAAE;gBAClB,iBAAiB,EAAE,mBAAmB;aACvC,EACD,eAAe,CAChB,CAAC;YAEF,yCAAyC;YACzC,MAAM,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;YACtD,MAAM,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QAC5D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,sEAAsE,EAAE,KAAK,IAAI,EAAE;YACpF,wGAAwG;YACxG,MAAM,oBAAoB,GAAG,CAAC,EAC5B,QAAQ,GAGT,EAAE,EAAE,CAAC,CACJ,8BAAC,+CAAqB,IAAC,UAAU,EAAE,YAAY;gBAC7C,8BAAC,2CAAmB,IAAC,SAAS,EAAE,IAAI,IAAG,QAAQ,CAAuB,CAChD,CACzB,CAAC;YAEF,MAAM,EAAE,MAAM,EAAE,GAAG,IAAA,kBAAU,EAAC,GAAG,EAAE,CAAC,IAAA,sCAAc,GAAE,EAAE;gBACpD,OAAO,EAAE,oBAAoB;aAC9B,CAAC,CAAC;YAEH,6DAA6D;YAC7D,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YAErD,MAAM,IAAA,WAAG,EAAC,KAAK,IAAI,EAAE;gBACnB,MAAM,MAAM,CAAC,OAAO,CAAC,iBAAiB,CAAC,kBAAkB,EAAE;oBACzD,QAAQ,EAAE,aAAa;oBACvB,cAAc,EAAE,KAAK;oBACrB,iBAAiB,EAAE;wBACjB,MAAM,EAAE;4BACN,OAAO,EAAE,yBAAyB;yBACnC;qBACF;iBACF,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;YAEH,MAAM,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,oBAAoB,CAAC;gBAClD,eAAe,EAAE;oBACf,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,kBAAkB,EAAE,CAAC;oBACrD,IAAI,EAAE,MAAM;iBACb;gBACD,mBAAmB,EAAE,IAAA,yBAAiB,EAAC,YAAY,CAAC;gBACpD,UAAU,EAAE,SAAS;gBACrB,WAAW,EAAE,EAAE;gBACf,eAAe,EAAE,SAAS;gBAC1B,cAAc,EAAE,EAAE;gBAClB,iBAAiB,EAAE,mBAAmB;aACvC,CAAC,CAAC;YAEH,+CAA+C;YAC/C,MAAM,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;YAC1D,MAAM,CAAC,8BAAa,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QAC/C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,2EAA2E,EAAE,KAAK,IAAI,EAAE;YACzF,wGAAwG;YACxG,MAAM,uBAAuB,GAAG,CAAC,EAC/B,QAAQ,GAGT,EAAE,EAAE,CAAC,CACJ,8BAAC,+CAAqB,IAAC,UAAU,EAAE,YAAY;gBAC7C,8BAAC,2CAAmB,IAAC,SAAS,EAAE,KAAK,IAClC,QAAQ,CACW,CACA,CACzB,CAAC;YAEF,MAAM,kBAAkB,GAA+C;gBACrE,kBAAkB,EAAE;oBAClB,EAAE,EAAE,iBAAiB;oBACrB,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,oBAAoB,EAAE,CAAC;oBACvD,IAAI,EAAE,WAAW;oBACjB,QAAQ,EAAE,cAAc;oBACxB,SAAS,EAAE,SAAS;oBACpB,cAAc,EAAE,EAAE;oBAClB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;iBACpC;gBACD,eAAe,EAAE,6CAAe,CAAC,QAAQ;gBACzC,cAAc,EAAE,uBAAuB;aACxC,CAAC;YAEF,MAAM,iBAAiB,GAAG;gBACxB,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,KAAK,SAAS,CAAC;oBACrC,MAAM,kBAAkB,CAAC;gBAC3B,CAAC;aACF,CAAC;YAEF,IAAI,CAAC,MAAM,CAAC,8BAAa,CAAC,CAAC,iBAAiB,CAAC,iBAAiB,CAAC,CAAC;YAEhE,MAAM,EAAE,MAAM,EAAE,GAAG,IAAA,kBAAU,EAAC,GAAG,EAAE,CAAC,IAAA,sCAAc,GAAE,EAAE;gBACpD,OAAO,EAAE,uBAAuB;aACjC,CAAC,CAAC;YAEH,6DAA6D;YAC7D,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YAErD,MAAM,IAAA,WAAG,EAAC,KAAK,IAAI,EAAE;gBACnB,MAAM,MAAM,CAAC,OAAO,CAAC,iBAAiB,CAAC,4BAA4B,EAAE;oBACnE,QAAQ,EAAE,aAAa;oBACvB,cAAc,EAAE,IAAI;oBACpB,iBAAiB,EAAE;wBACjB,MAAM,EAAE;4BACN,OAAO,EAAE,yBAAyB;yBACnC;qBACF;iBACF,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;YAEH,MAAM,CAAC,8BAAa,CAAC,CAAC,oBAAoB,CACxC,WAAW,EACX;gBACE,eAAe,EAAE;oBACf,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,4BAA4B,EAAE,CAAC;oBAC/D,IAAI,EAAE,MAAM;iBACb;gBACD,mBAAmB,EAAE,IAAA,yBAAiB,EAAC,YAAY,CAAC;gBACpD,UAAU,EAAE,SAAS;gBACrB,WAAW,EAAE,EAAE;gBACf,eAAe,EAAE,SAAS;gBAC1B,cAAc,EAAE,EAAE;gBAClB,iBAAiB,EAAE,mBAAmB;aACvC,EACD,SAAS,CACV,CAAC;YAEF,yCAAyC;YACzC,MAAM,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;YACtD,MAAM,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QAC5D,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["import TamboAI, { advanceStream } from \"@tambo-ai/typescript-sdk\";\nimport { act, renderHook } from \"@testing-library/react\";\nimport React from \"react\";\nimport { DeepPartial } from \"ts-essentials\";\nimport { z } from \"zod\";\nimport { TamboComponent } from \"../../model/component-metadata\";\nimport {\n GenerationStage,\n TamboThreadMessage,\n} from \"../../model/generate-component-response\";\nimport { serializeRegistry } from \"../../testing/tools\";\nimport { useTamboClient } from \"../tambo-client-provider\";\nimport { TamboRegistryProvider } from \"../tambo-registry-provider\";\nimport { TamboThreadProvider, useTamboThread } from \"../tambo-thread-provider\";\n\ntype PartialTamboAI = DeepPartial<TamboAI>;\n\n// Mock crypto.randomUUID\nObject.defineProperty(global, \"crypto\", {\n value: {\n randomUUID: jest.fn().mockReturnValue(\"test-uuid\"),\n },\n});\n\n// Mock the required providers\njest.mock(\"../tambo-client-provider\", () => ({\n useTamboClient: jest.fn(),\n}));\njest.mock(\"@tambo-ai/typescript-sdk\", () => ({\n advanceStream: jest.fn(),\n}));\n\n// Mock the system context and getCustomContext\njest.mock(\"../../util/registry\", () => ({\n ...jest.requireActual(\"../../util/registry\"),\n getSystemContext: () => ({\n localTime: \"7/24/2025, 6:26:21 PM\",\n timezone: \"America/New_York\",\n }),\n getCustomContext: () => ({\n message: \"additional instructions\",\n }),\n}));\n\n// Mock the combined context which includes the system context and the custom context\nconst mockCombinedContext = {\n system: {\n localTime: \"7/24/2025, 6:26:21 PM\",\n timezone: \"America/New_York\",\n },\n ...{\n custom: {\n message: \"additional instructions\",\n },\n },\n};\n\n// Test utilities\nconst createMockMessage = (\n overrides: Partial<TamboThreadMessage> = {},\n): TamboThreadMessage => ({\n id: \"test-message-1\",\n content: [{ type: \"text\", text: \"Hello\" }],\n role: \"user\",\n threadId: \"test-thread-1\",\n createdAt: new Date().toISOString(),\n componentState: {},\n ...overrides,\n});\n\nconst createMockThread = (\n overrides: Partial<TamboAI.Beta.Threads.Thread> = {},\n) => ({\n id: \"test-thread-1\",\n messages: [],\n createdAt: \"2024-01-01T00:00:00Z\",\n projectId: \"test-project\",\n updatedAt: \"2024-01-01T00:00:00Z\",\n metadata: {},\n ...overrides,\n});\n\nconst createMockAdvanceResponse = (\n overrides: Partial<TamboAI.Beta.Threads.ThreadAdvanceResponse> = {},\n): TamboAI.Beta.Threads.ThreadAdvanceResponse => ({\n responseMessageDto: {\n id: \"test-uuid\",\n content: [{ type: \"text\" as const, text: \"Default response\" }],\n role: \"assistant\",\n threadId: \"test-thread-1\",\n component: undefined,\n componentState: {},\n createdAt: new Date().toISOString(),\n },\n generationStage: GenerationStage.COMPLETE,\n mcpAccessToken: \"test-mcp-access-token\",\n ...overrides,\n});\n\ndescribe(\"TamboThreadProvider\", () => {\n const mockThread = createMockThread();\n\n const mockThreadsApi = {\n messages: {\n create: jest.fn(),\n },\n retrieve: jest.fn(),\n advance: jest.fn(),\n advanceById: jest.fn(),\n } satisfies DeepPartial<\n TamboAI[\"beta\"][\"threads\"]\n > as unknown as TamboAI.Beta.Threads;\n\n const mockBeta = {\n threads: mockThreadsApi,\n } satisfies PartialTamboAI[\"beta\"];\n\n const mockTamboAI = {\n apiKey: \"\",\n beta: mockBeta,\n } satisfies PartialTamboAI as unknown as TamboAI;\n\n const mockRegistry: TamboComponent[] = [\n {\n name: \"TestOnly\",\n component: () => <div>TestOnly</div>,\n description: \"TestOnly\",\n propsSchema: z.object({\n test: z.string(),\n }),\n associatedTools: [\n {\n name: \"test-tool\",\n tool: jest.fn().mockResolvedValue(\"test-tool\"),\n description: \"test-tool\",\n toolSchema: z\n .function()\n .args(z.string().describe(\"test-param-description\"))\n .returns(z.string()),\n },\n ],\n },\n ];\n\n const wrapper = ({ children }: { children: React.ReactNode }) => (\n <TamboRegistryProvider components={mockRegistry}>\n <TamboThreadProvider streaming={false}>{children}</TamboThreadProvider>\n </TamboRegistryProvider>\n );\n\n beforeEach(() => {\n jest.clearAllMocks();\n jest.mocked(mockThreadsApi.retrieve).mockResolvedValue(mockThread);\n jest\n .mocked(mockThreadsApi.messages.create)\n .mockResolvedValue(createMockMessage());\n jest\n .mocked(mockThreadsApi.advance)\n .mockResolvedValue(createMockAdvanceResponse());\n jest\n .mocked(mockThreadsApi.advanceById)\n .mockResolvedValue(createMockAdvanceResponse());\n jest.mocked(useTamboClient).mockReturnValue(mockTamboAI);\n });\n\n it(\"should initialize with placeholder thread\", () => {\n const { result } = renderHook(() => useTamboThread(), { wrapper });\n\n expect(result.current.thread.id).toBe(\"placeholder\");\n expect(result.current.isIdle).toBe(true);\n expect(result.current.generationStage).toBe(GenerationStage.IDLE);\n });\n\n it(\"should switch to a new thread\", async () => {\n const { result } = renderHook(() => useTamboThread(), { wrapper });\n\n await act(async () => {\n await result.current.switchCurrentThread(\"test-thread-1\");\n });\n\n expect(mockThreadsApi.retrieve).toHaveBeenCalledWith(\"test-thread-1\", {\n includeInternal: true,\n });\n expect(result.current.thread.id).toBe(\"test-thread-1\");\n });\n\n it(\"should start a new thread\", async () => {\n const { result } = renderHook(() => useTamboThread(), { wrapper });\n\n await act(async () => {\n result.current.startNewThread();\n });\n\n expect(result.current.thread.id).toBe(\"placeholder\");\n expect(result.current.isIdle).toBe(true);\n });\n\n it(\"should add a message to the thread\", async () => {\n const { result } = renderHook(() => useTamboThread(), { wrapper });\n const testMessage: TamboThreadMessage = {\n id: \"test-message-1\",\n content: [{ type: \"text\", text: \"Hello\" }],\n role: \"user\",\n threadId: \"test-thread-1\",\n createdAt: new Date().toISOString(),\n componentState: {},\n };\n\n await act(async () => {\n await result.current.addThreadMessage(testMessage, true);\n });\n\n expect(mockThreadsApi.messages.create).toHaveBeenCalledWith(\n \"test-thread-1\",\n {\n content: testMessage.content,\n role: testMessage.role,\n },\n );\n });\n\n it(\"should update a message in the thread\", async () => {\n const { result } = renderHook(() => useTamboThread(), { wrapper });\n const testMessage: TamboThreadMessage = {\n id: \"test-message-1\",\n content: [{ type: \"text\", text: \"Updated message\" }],\n role: \"user\",\n threadId: \"test-thread-1\",\n createdAt: new Date().toISOString(),\n componentState: {},\n };\n\n await act(async () => {\n await result.current.updateThreadMessage(\n \"test-message-1\",\n testMessage,\n true,\n );\n });\n\n expect(mockThreadsApi.messages.create).toHaveBeenCalledWith(\n \"test-thread-1\",\n {\n content: testMessage.content,\n role: testMessage.role,\n },\n );\n });\n\n it(\"should send a message and update thread state\", async () => {\n const mockAdvanceResponse: TamboAI.Beta.Threads.ThreadAdvanceResponse = {\n responseMessageDto: {\n id: \"response-1\",\n content: [{ type: \"text\", text: \"Response\" }],\n role: \"assistant\",\n threadId: \"test-thread-1\",\n component: undefined,\n componentState: {},\n createdAt: new Date().toISOString(),\n },\n generationStage: GenerationStage.COMPLETE,\n mcpAccessToken: \"test-mcp-access-token\",\n };\n\n jest\n .mocked(mockThreadsApi.advanceById)\n .mockResolvedValue(mockAdvanceResponse);\n\n const { result } = renderHook(() => useTamboThread(), { wrapper });\n\n await act(async () => {\n await result.current.sendThreadMessage(\"Hello\", {\n threadId: \"test-thread-1\",\n streamResponse: false,\n additionalContext: {\n custom: {\n message: \"additional instructions\",\n },\n },\n });\n });\n\n expect(mockThreadsApi.advanceById).toHaveBeenCalledWith(\"test-thread-1\", {\n messageToAppend: {\n content: [{ type: \"text\", text: \"Hello\" }],\n role: \"user\",\n },\n availableComponents: serializeRegistry(mockRegistry),\n contextKey: undefined,\n clientTools: [],\n toolCallCounts: {},\n additionalContext: mockCombinedContext,\n });\n expect(result.current.generationStage).toBe(GenerationStage.COMPLETE);\n });\n\n it(\"should handle input value changes\", () => {\n const { result } = renderHook(() => useTamboThread(), { wrapper });\n\n act(() => {\n result.current.setInputValue(\"New input\");\n });\n\n expect(result.current.inputValue).toBe(\"New input\");\n });\n\n it(\"should handle streaming responses\", async () => {\n const mockStreamResponse: TamboAI.Beta.Threads.ThreadAdvanceResponse = {\n responseMessageDto: {\n id: \"stream-1\",\n content: [{ type: \"text\", text: \"Streaming response\" }],\n role: \"assistant\",\n threadId: \"test-thread-1\",\n component: undefined,\n componentState: {},\n createdAt: new Date().toISOString(),\n },\n generationStage: GenerationStage.COMPLETE,\n mcpAccessToken: \"test-mcp-access-token\",\n };\n\n // Create an async iterator mock\n const mockAsyncIterator = {\n [Symbol.asyncIterator]: async function* () {\n yield mockStreamResponse;\n },\n };\n\n // Mock advanceStream to return our async iterator\n jest.mocked(advanceStream).mockResolvedValue(mockAsyncIterator);\n\n const { result } = renderHook(() => useTamboThread(), { wrapper });\n\n await act(async () => {\n await result.current.sendThreadMessage(\"Hello\", {\n threadId: \"test-thread-1\",\n streamResponse: true,\n });\n });\n\n expect(result.current.generationStage).toBe(GenerationStage.COMPLETE);\n });\n\n it(\"should handle tool calls during message processing.\", async () => {\n const mockToolCallResponse: TamboAI.Beta.Threads.ThreadAdvanceResponse = {\n responseMessageDto: {\n id: \"tool-call-1\",\n content: [{ type: \"text\", text: \"Tool response\" }],\n role: \"tool\",\n threadId: \"test-thread-1\",\n toolCallRequest: {\n toolName: \"test-tool\",\n parameters: [{ parameterName: \"test\", parameterValue: \"test\" }],\n },\n componentState: {},\n createdAt: new Date().toISOString(),\n },\n generationStage: GenerationStage.COMPLETE,\n mcpAccessToken: \"test-mcp-access-token\",\n };\n\n jest\n .mocked(mockThreadsApi.advanceById)\n .mockResolvedValueOnce(mockToolCallResponse)\n .mockResolvedValueOnce({\n responseMessageDto: {\n id: \"advance-response2\",\n content: [{ type: \"text\", text: \"response 2\" }],\n role: \"user\",\n threadId: \"test-thread-1\",\n componentState: {},\n createdAt: new Date().toISOString(),\n },\n generationStage: GenerationStage.COMPLETE,\n mcpAccessToken: \"test-mcp-access-token\",\n });\n\n const { result } = renderHook(() => useTamboThread(), { wrapper });\n\n await act(async () => {\n await result.current.sendThreadMessage(\"Use tool\", {\n threadId: \"test-thread-1\",\n streamResponse: false,\n });\n });\n expect(result.current.generationStage).toBe(GenerationStage.COMPLETE);\n expect(mockRegistry[0]?.associatedTools?.[0]?.tool).toHaveBeenCalledWith(\n \"test\",\n );\n });\n\n describe(\"streaming behavior\", () => {\n it(\"should call advanceStream when streamResponse=true\", async () => {\n // Use wrapper with streaming=true to show that explicit streamResponse=true works\n const wrapperWithStreaming = ({\n children,\n }: {\n children: React.ReactNode;\n }) => (\n <TamboRegistryProvider components={mockRegistry}>\n <TamboThreadProvider streaming={true}>{children}</TamboThreadProvider>\n </TamboRegistryProvider>\n );\n\n const mockStreamResponse: TamboAI.Beta.Threads.ThreadAdvanceResponse = {\n responseMessageDto: {\n id: \"stream-response\",\n content: [{ type: \"text\", text: \"Streaming response\" }],\n role: \"assistant\",\n threadId: \"test-thread-1\",\n component: undefined,\n componentState: {},\n createdAt: new Date().toISOString(),\n },\n generationStage: GenerationStage.COMPLETE,\n mcpAccessToken: \"test-mcp-access-token\",\n };\n\n const mockAsyncIterator = {\n [Symbol.asyncIterator]: async function* () {\n yield mockStreamResponse;\n },\n };\n\n jest.mocked(advanceStream).mockResolvedValue(mockAsyncIterator);\n\n const { result } = renderHook(() => useTamboThread(), {\n wrapper: wrapperWithStreaming,\n });\n\n await act(async () => {\n await result.current.sendThreadMessage(\"Hello streaming\", {\n threadId: \"test-thread-1\",\n streamResponse: true,\n additionalContext: {\n custom: {\n message: \"additional instructions\",\n },\n },\n });\n });\n\n expect(advanceStream).toHaveBeenCalledWith(\n mockTamboAI,\n {\n messageToAppend: {\n content: [{ type: \"text\", text: \"Hello streaming\" }],\n role: \"user\",\n },\n availableComponents: serializeRegistry(mockRegistry),\n contextKey: undefined,\n clientTools: [],\n forceToolChoice: undefined,\n toolCallCounts: {},\n additionalContext: mockCombinedContext,\n },\n \"test-thread-1\",\n );\n\n // Should not call advance or advanceById\n expect(mockThreadsApi.advance).not.toHaveBeenCalled();\n expect(mockThreadsApi.advanceById).not.toHaveBeenCalled();\n });\n\n it(\"should call advanceById when streamResponse=false for existing thread\", async () => {\n // Use wrapper with streaming=true to show that explicit streamResponse=false overrides provider setting\n const wrapperWithStreaming = ({\n children,\n }: {\n children: React.ReactNode;\n }) => (\n <TamboRegistryProvider components={mockRegistry}>\n <TamboThreadProvider streaming={true}>{children}</TamboThreadProvider>\n </TamboRegistryProvider>\n );\n\n const { result } = renderHook(() => useTamboThread(), {\n wrapper: wrapperWithStreaming,\n });\n\n await act(async () => {\n await result.current.sendThreadMessage(\"Hello non-streaming\", {\n threadId: \"test-thread-1\",\n streamResponse: false,\n additionalContext: {\n custom: {\n message: \"additional instructions\",\n },\n },\n });\n });\n\n expect(mockThreadsApi.advanceById).toHaveBeenCalledWith(\"test-thread-1\", {\n messageToAppend: {\n content: [{ type: \"text\", text: \"Hello non-streaming\" }],\n role: \"user\",\n },\n availableComponents: serializeRegistry(mockRegistry),\n contextKey: undefined,\n clientTools: [],\n forceToolChoice: undefined,\n toolCallCounts: {},\n additionalContext: mockCombinedContext,\n });\n\n // Should not call advance or advanceStream\n expect(mockThreadsApi.advance).not.toHaveBeenCalled();\n expect(advanceStream).not.toHaveBeenCalled();\n });\n\n it(\"should call advanceById when streamResponse is undefined and provider streaming=false\", async () => {\n // Use wrapper with streaming=false to test that undefined streamResponse respects provider setting\n const wrapperWithoutStreaming = ({\n children,\n }: {\n children: React.ReactNode;\n }) => (\n <TamboRegistryProvider components={mockRegistry}>\n <TamboThreadProvider streaming={false}>\n {children}\n </TamboThreadProvider>\n </TamboRegistryProvider>\n );\n\n const { result } = renderHook(() => useTamboThread(), {\n wrapper: wrapperWithoutStreaming,\n });\n\n await act(async () => {\n await result.current.sendThreadMessage(\"Hello default\", {\n threadId: \"test-thread-1\",\n // streamResponse is undefined, should use provider's streaming=false\n additionalContext: {\n custom: {\n message: \"additional instructions\",\n },\n },\n });\n });\n\n expect(mockThreadsApi.advanceById).toHaveBeenCalledWith(\"test-thread-1\", {\n messageToAppend: {\n content: [{ type: \"text\", text: \"Hello default\" }],\n role: \"user\",\n },\n availableComponents: serializeRegistry(mockRegistry),\n contextKey: undefined,\n clientTools: [],\n forceToolChoice: undefined,\n toolCallCounts: {},\n additionalContext: mockCombinedContext,\n });\n\n // Should not call advance or advanceStream\n expect(mockThreadsApi.advance).not.toHaveBeenCalled();\n expect(advanceStream).not.toHaveBeenCalled();\n });\n\n it(\"should call advanceStream when streamResponse is undefined and provider streaming=true (default)\", async () => {\n // Use wrapper with streaming=true (default) to test that undefined streamResponse respects provider setting\n const wrapperWithDefaultStreaming = ({\n children,\n }: {\n children: React.ReactNode;\n }) => (\n <TamboRegistryProvider components={mockRegistry}>\n <TamboThreadProvider>{children}</TamboThreadProvider>\n </TamboRegistryProvider>\n );\n\n const mockStreamResponse: TamboAI.Beta.Threads.ThreadAdvanceResponse = {\n responseMessageDto: {\n id: \"stream-response\",\n content: [{ type: \"text\", text: \"Streaming response\" }],\n role: \"assistant\",\n threadId: \"test-thread-1\",\n component: undefined,\n componentState: {},\n createdAt: new Date().toISOString(),\n },\n generationStage: GenerationStage.COMPLETE,\n mcpAccessToken: \"test-mcp-access-token\",\n };\n\n const mockAsyncIterator = {\n [Symbol.asyncIterator]: async function* () {\n yield mockStreamResponse;\n },\n };\n\n jest.mocked(advanceStream).mockResolvedValue(mockAsyncIterator);\n\n const { result } = renderHook(() => useTamboThread(), {\n wrapper: wrapperWithDefaultStreaming,\n });\n\n await act(async () => {\n await result.current.sendThreadMessage(\"Hello default streaming\", {\n threadId: \"test-thread-1\",\n // streamResponse is undefined, should use provider's streaming=true (default)\n additionalContext: {\n custom: {\n message: \"additional instructions\",\n },\n },\n });\n });\n\n expect(advanceStream).toHaveBeenCalledWith(\n mockTamboAI,\n {\n messageToAppend: {\n content: [{ type: \"text\", text: \"Hello default streaming\" }],\n role: \"user\",\n },\n availableComponents: serializeRegistry(mockRegistry),\n contextKey: undefined,\n clientTools: [],\n forceToolChoice: undefined,\n toolCallCounts: {},\n additionalContext: mockCombinedContext,\n },\n \"test-thread-1\",\n );\n\n // Should not call advance or advanceById\n expect(mockThreadsApi.advance).not.toHaveBeenCalled();\n expect(mockThreadsApi.advanceById).not.toHaveBeenCalled();\n });\n\n it(\"should call advance when streamResponse=false for placeholder thread\", async () => {\n // Use wrapper with streaming=true to show that explicit streamResponse=false overrides provider setting\n const wrapperWithStreaming = ({\n children,\n }: {\n children: React.ReactNode;\n }) => (\n <TamboRegistryProvider components={mockRegistry}>\n <TamboThreadProvider streaming={true}>{children}</TamboThreadProvider>\n </TamboRegistryProvider>\n );\n\n const { result } = renderHook(() => useTamboThread(), {\n wrapper: wrapperWithStreaming,\n });\n\n // Start with placeholder thread (which is the default state)\n expect(result.current.thread.id).toBe(\"placeholder\");\n\n await act(async () => {\n await result.current.sendThreadMessage(\"Hello new thread\", {\n threadId: \"placeholder\",\n streamResponse: false,\n additionalContext: {\n custom: {\n message: \"additional instructions\",\n },\n },\n });\n });\n\n expect(mockThreadsApi.advance).toHaveBeenCalledWith({\n messageToAppend: {\n content: [{ type: \"text\", text: \"Hello new thread\" }],\n role: \"user\",\n },\n availableComponents: serializeRegistry(mockRegistry),\n contextKey: undefined,\n clientTools: [],\n forceToolChoice: undefined,\n toolCallCounts: {},\n additionalContext: mockCombinedContext,\n });\n\n // Should not call advanceById or advanceStream\n expect(mockThreadsApi.advanceById).not.toHaveBeenCalled();\n expect(advanceStream).not.toHaveBeenCalled();\n });\n\n it(\"should call advanceStream when streamResponse=true for placeholder thread\", async () => {\n // Use wrapper with streaming=false to show that explicit streamResponse=true overrides provider setting\n const wrapperWithoutStreaming = ({\n children,\n }: {\n children: React.ReactNode;\n }) => (\n <TamboRegistryProvider components={mockRegistry}>\n <TamboThreadProvider streaming={false}>\n {children}\n </TamboThreadProvider>\n </TamboRegistryProvider>\n );\n\n const mockStreamResponse: TamboAI.Beta.Threads.ThreadAdvanceResponse = {\n responseMessageDto: {\n id: \"stream-response\",\n content: [{ type: \"text\", text: \"Streaming response\" }],\n role: \"assistant\",\n threadId: \"new-thread-1\",\n component: undefined,\n componentState: {},\n createdAt: new Date().toISOString(),\n },\n generationStage: GenerationStage.COMPLETE,\n mcpAccessToken: \"test-mcp-access-token\",\n };\n\n const mockAsyncIterator = {\n [Symbol.asyncIterator]: async function* () {\n yield mockStreamResponse;\n },\n };\n\n jest.mocked(advanceStream).mockResolvedValue(mockAsyncIterator);\n\n const { result } = renderHook(() => useTamboThread(), {\n wrapper: wrapperWithoutStreaming,\n });\n\n // Start with placeholder thread (which is the default state)\n expect(result.current.thread.id).toBe(\"placeholder\");\n\n await act(async () => {\n await result.current.sendThreadMessage(\"Hello streaming new thread\", {\n threadId: \"placeholder\",\n streamResponse: true,\n additionalContext: {\n custom: {\n message: \"additional instructions\",\n },\n },\n });\n });\n\n expect(advanceStream).toHaveBeenCalledWith(\n mockTamboAI,\n {\n messageToAppend: {\n content: [{ type: \"text\", text: \"Hello streaming new thread\" }],\n role: \"user\",\n },\n availableComponents: serializeRegistry(mockRegistry),\n contextKey: undefined,\n clientTools: [],\n forceToolChoice: undefined,\n toolCallCounts: {},\n additionalContext: mockCombinedContext,\n },\n undefined, // threadId is undefined for placeholder thread\n );\n\n // Should not call advance or advanceById\n expect(mockThreadsApi.advance).not.toHaveBeenCalled();\n expect(mockThreadsApi.advanceById).not.toHaveBeenCalled();\n });\n });\n});\n"]}
@@ -32,6 +32,7 @@ export interface TamboThreadContextProps {
32
32
  streamResponse?: boolean;
33
33
  contextKey?: string;
34
34
  forceToolChoice?: string;
35
+ additionalContext?: Record<string, any>;
35
36
  }) => Promise<TamboThreadMessage>;
36
37
  /** The generation stage of the current thread - updated as the thread progresses */
37
38
  generationStage: GenerationStage;
@@ -1 +1 @@
1
- {"version":3,"file":"tambo-thread-provider.d.ts","sourceRoot":"","sources":["../../src/providers/tambo-thread-provider.tsx"],"names":[],"mappings":"AACA,OAAO,OAA0B,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAE,MAAM,EAAE,MAAM,yDAAyD,CAAC;AACjF,OAAO,KAAK,EAAE,EAEZ,iBAAiB,EAOlB,MAAM,OAAO,CAAC;AACf,OAAO,EACL,eAAe,EAEf,kBAAkB,EACnB,MAAM,sCAAsC,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAYpD,MAAM,WAAW,uBAAuB;IACtC,yBAAyB;IACzB,MAAM,EAAE,WAAW,CAAC;IACpB,mCAAmC;IACnC,mBAAmB,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;IACjE,yBAAyB;IACzB,cAAc,EAAE,MAAM,IAAI,CAAC;IAC3B,6BAA6B;IAC7B,gBAAgB,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5D,gFAAgF;IAChF,kBAAkB,EAAE,CAAC,QAAQ,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAC3D,0CAA0C;IAC1C,gBAAgB,EAAE,CAChB,OAAO,EAAE,kBAAkB,EAC3B,YAAY,EAAE,OAAO,KAClB,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC;IACnD,6CAA6C;IAC7C,mBAAmB,EAAE,CACnB,EAAE,EAAE,MAAM,EACV,OAAO,EAAE,kBAAkB,EAC3B,YAAY,EAAE,OAAO,KAClB,OAAO,CAAC,IAAI,CAAC,CAAC;IACnB,sBAAsB;IACtB,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7C,4CAA4C;IAC5C,UAAU,EAAE,MAAM,CAAC;IACnB,sCAAsC;IACtC,SAAS,EAAE,OAAO,CAAC;IACnB,gDAAgD;IAChD,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,2CAA2C;IAC3C,iBAAiB,EAAE,CACjB,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE;QACR,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,cAAc,CAAC,EAAE,OAAO,CAAC;QACzB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,eAAe,CAAC,EAAE,MAAM,CAAC;KAC1B,KACE,OAAO,CAAC,kBAAkB,CAAC,CAAC;IACjC,oFAAoF;IACpF,eAAe,EAAE,eAAe,CAAC;IACjC,6FAA6F;IAC7F,uBAAuB,EAAE,MAAM,CAAC;IAChC,iCAAiC;IACjC,MAAM,EAAE,OAAO,CAAC;CACjB;AAED;;;;;;GAMG;AACH,eAAO,MAAM,kBAAkB,EAAE,WAOhC,CAAC;AAEF,eAAO,MAAM,kBAAkB,wCA0D7B,CAAC;AAEH,MAAM,WAAW,wBAAwB;IACvC,qCAAqC;IACrC,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,mBAAmB,EAAE,KAAK,CAAC,EAAE,CACxC,iBAAiB,CAAC,wBAAwB,CAAC,CAktB5C,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,cAAc,+BAM1B,CAAC"}
1
+ {"version":3,"file":"tambo-thread-provider.d.ts","sourceRoot":"","sources":["../../src/providers/tambo-thread-provider.tsx"],"names":[],"mappings":"AACA,OAAO,OAA0B,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAE,MAAM,EAAE,MAAM,yDAAyD,CAAC;AACjF,OAAO,KAAK,EAAE,EAEZ,iBAAiB,EAOlB,MAAM,OAAO,CAAC;AACf,OAAO,EACL,eAAe,EAEf,kBAAkB,EACnB,MAAM,sCAAsC,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAYpD,MAAM,WAAW,uBAAuB;IACtC,yBAAyB;IACzB,MAAM,EAAE,WAAW,CAAC;IACpB,mCAAmC;IACnC,mBAAmB,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;IACjE,yBAAyB;IACzB,cAAc,EAAE,MAAM,IAAI,CAAC;IAC3B,6BAA6B;IAC7B,gBAAgB,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5D,gFAAgF;IAChF,kBAAkB,EAAE,CAAC,QAAQ,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAC3D,0CAA0C;IAC1C,gBAAgB,EAAE,CAChB,OAAO,EAAE,kBAAkB,EAC3B,YAAY,EAAE,OAAO,KAClB,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC;IACnD,6CAA6C;IAC7C,mBAAmB,EAAE,CACnB,EAAE,EAAE,MAAM,EACV,OAAO,EAAE,kBAAkB,EAC3B,YAAY,EAAE,OAAO,KAClB,OAAO,CAAC,IAAI,CAAC,CAAC;IACnB,sBAAsB;IACtB,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7C,4CAA4C;IAC5C,UAAU,EAAE,MAAM,CAAC;IACnB,sCAAsC;IACtC,SAAS,EAAE,OAAO,CAAC;IACnB,gDAAgD;IAChD,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,2CAA2C;IAC3C,iBAAiB,EAAE,CACjB,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE;QACR,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,cAAc,CAAC,EAAE,OAAO,CAAC;QACzB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB,iBAAiB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;KACzC,KACE,OAAO,CAAC,kBAAkB,CAAC,CAAC;IACjC,oFAAoF;IACpF,eAAe,EAAE,eAAe,CAAC;IACjC,6FAA6F;IAC7F,uBAAuB,EAAE,MAAM,CAAC;IAChC,iCAAiC;IACjC,MAAM,EAAE,OAAO,CAAC;CACjB;AAED;;;;;;GAMG;AACH,eAAO,MAAM,kBAAkB,EAAE,WAOhC,CAAC;AAEF,eAAO,MAAM,kBAAkB,wCA0D7B,CAAC;AAEH,MAAM,WAAW,wBAAwB;IACvC,qCAAqC;IACrC,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,mBAAmB,EAAE,KAAK,CAAC,EAAE,CACxC,iBAAiB,CAAC,wBAAwB,CAAC,CAiuB5C,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,cAAc,+BAM1B,CAAC"}
@@ -192,9 +192,14 @@ const TamboThreadProvider = ({ children, streaming = true }) => {
192
192
  console.warn("Cannot add messages if we do not have a current thread");
193
193
  return [];
194
194
  }
195
+ // Combine system context with user context
196
+ const combinedContext = {
197
+ system: message.role === "user" ? (0, registry_1.getSystemContext)() : undefined,
198
+ custom: message.additionalContext,
199
+ };
195
200
  const chatMessage = {
196
201
  ...message,
197
- additionalContext: message.role === "user" ? (0, registry_1.getClientContext)() : undefined,
202
+ additionalContext: combinedContext,
198
203
  createdAt,
199
204
  };
200
205
  const threadId = message.threadId;
@@ -515,8 +520,12 @@ const TamboThreadProvider = ({ children, streaming = true }) => {
515
520
  const currentThreadContextKey = currentThread?.contextKey;
516
521
  const sendThreadMessage = (0, react_1.useCallback)(async (message, options = {}) => {
517
522
  setIgnoreResponse(false);
518
- const { threadId = currentThreadId ?? exports.PLACEHOLDER_THREAD.id, streamResponse = streaming, forceToolChoice, contextKey = currentThreadContextKey, } = options;
523
+ const { threadId = currentThreadId ?? exports.PLACEHOLDER_THREAD.id, streamResponse = streaming, forceToolChoice, contextKey = currentThreadContextKey, additionalContext, } = options;
519
524
  updateThreadStatus(threadId, generate_component_response_1.GenerationStage.FETCHING_CONTEXT);
525
+ const combinedContext = {
526
+ system: (0, registry_1.getSystemContext)(),
527
+ ...(additionalContext ?? {}),
528
+ };
520
529
  addThreadMessage({
521
530
  content: [{ type: "text", text: message }],
522
531
  renderedComponent: null,
@@ -525,6 +534,7 @@ const TamboThreadProvider = ({ children, streaming = true }) => {
525
534
  id: crypto.randomUUID(),
526
535
  createdAt: new Date().toISOString(),
527
536
  componentState: {},
537
+ additionalContext: combinedContext,
528
538
  }, false);
529
539
  const availableComponents = (0, registry_1.getAvailableComponents)(componentList, toolRegistry, componentToolAssociations);
530
540
  const unassociatedTools = (0, registry_1.getUnassociatedTools)(toolRegistry, componentToolAssociations);
@@ -535,6 +545,7 @@ const TamboThreadProvider = ({ children, streaming = true }) => {
535
545
  content: [{ type: "text", text: message }],
536
546
  role: "user",
537
547
  },
548
+ additionalContext: combinedContext,
538
549
  contextKey,
539
550
  availableComponents: availableComponents,
540
551
  clientTools: unassociatedTools.map((tool) => (0, registry_1.mapTamboToolToContextTool)(tool)),