@tambo-ai/react 0.43.1 → 0.44.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 (89) hide show
  1. package/dist/hooks/__tests__/use-suggestions.test.js +55 -27
  2. package/dist/hooks/__tests__/use-suggestions.test.js.map +1 -1
  3. package/dist/hooks/__tests__/use-tambo-stream-status.test.js +82 -39
  4. package/dist/hooks/__tests__/use-tambo-stream-status.test.js.map +1 -1
  5. package/dist/hooks/index.d.ts +2 -2
  6. package/dist/hooks/index.d.ts.map +1 -1
  7. package/dist/hooks/index.js +2 -3
  8. package/dist/hooks/index.js.map +1 -1
  9. package/dist/hooks/use-component-state.d.ts.map +1 -1
  10. package/dist/hooks/use-component-state.js +2 -2
  11. package/dist/hooks/use-component-state.js.map +1 -1
  12. package/dist/hooks/use-current-message.d.ts +12 -27
  13. package/dist/hooks/use-current-message.d.ts.map +1 -1
  14. package/dist/hooks/use-current-message.js +16 -36
  15. package/dist/hooks/use-current-message.js.map +1 -1
  16. package/dist/hooks/use-tambo-stream-status.js +1 -1
  17. package/dist/hooks/use-tambo-stream-status.js.map +1 -1
  18. package/dist/hooks/use-thread-input.js +3 -2
  19. package/dist/hooks/use-thread-input.js.map +1 -1
  20. package/dist/index.d.ts +2 -2
  21. package/dist/index.d.ts.map +1 -1
  22. package/dist/index.js +2 -2
  23. package/dist/index.js.map +1 -1
  24. package/dist/providers/__tests__/tambo-prop-stream-provider.test.js +79 -9
  25. package/dist/providers/__tests__/tambo-prop-stream-provider.test.js.map +1 -1
  26. package/dist/providers/__tests__/tambo-thread-provider.test.js +51 -7
  27. package/dist/providers/__tests__/tambo-thread-provider.test.js.map +1 -1
  28. package/dist/providers/index.d.ts +1 -1
  29. package/dist/providers/index.d.ts.map +1 -1
  30. package/dist/providers/index.js +2 -1
  31. package/dist/providers/index.js.map +1 -1
  32. package/dist/providers/tambo-provider.d.ts +2 -2
  33. package/dist/providers/tambo-provider.d.ts.map +1 -1
  34. package/dist/providers/tambo-provider.js.map +1 -1
  35. package/dist/providers/tambo-stubs.d.ts.map +1 -1
  36. package/dist/providers/tambo-stubs.js +6 -6
  37. package/dist/providers/tambo-stubs.js.map +1 -1
  38. package/dist/providers/tambo-thread-provider.d.ts +29 -11
  39. package/dist/providers/tambo-thread-provider.d.ts.map +1 -1
  40. package/dist/providers/tambo-thread-provider.js +128 -71
  41. package/dist/providers/tambo-thread-provider.js.map +1 -1
  42. package/dist/util/generate-component.d.ts.map +1 -1
  43. package/dist/util/generate-component.js +6 -2
  44. package/dist/util/generate-component.js.map +1 -1
  45. package/esm/hooks/__tests__/use-suggestions.test.js +55 -27
  46. package/esm/hooks/__tests__/use-suggestions.test.js.map +1 -1
  47. package/esm/hooks/__tests__/use-tambo-stream-status.test.js +82 -39
  48. package/esm/hooks/__tests__/use-tambo-stream-status.test.js.map +1 -1
  49. package/esm/hooks/index.d.ts +2 -2
  50. package/esm/hooks/index.d.ts.map +1 -1
  51. package/esm/hooks/index.js +2 -2
  52. package/esm/hooks/index.js.map +1 -1
  53. package/esm/hooks/use-component-state.d.ts.map +1 -1
  54. package/esm/hooks/use-component-state.js +3 -3
  55. package/esm/hooks/use-component-state.js.map +1 -1
  56. package/esm/hooks/use-current-message.d.ts +12 -27
  57. package/esm/hooks/use-current-message.d.ts.map +1 -1
  58. package/esm/hooks/use-current-message.js +15 -34
  59. package/esm/hooks/use-current-message.js.map +1 -1
  60. package/esm/hooks/use-tambo-stream-status.js +2 -2
  61. package/esm/hooks/use-tambo-stream-status.js.map +1 -1
  62. package/esm/hooks/use-thread-input.js +4 -3
  63. package/esm/hooks/use-thread-input.js.map +1 -1
  64. package/esm/index.d.ts +2 -2
  65. package/esm/index.d.ts.map +1 -1
  66. package/esm/index.js +2 -2
  67. package/esm/index.js.map +1 -1
  68. package/esm/providers/__tests__/tambo-prop-stream-provider.test.js +80 -10
  69. package/esm/providers/__tests__/tambo-prop-stream-provider.test.js.map +1 -1
  70. package/esm/providers/__tests__/tambo-thread-provider.test.js +51 -7
  71. package/esm/providers/__tests__/tambo-thread-provider.test.js.map +1 -1
  72. package/esm/providers/index.d.ts +1 -1
  73. package/esm/providers/index.d.ts.map +1 -1
  74. package/esm/providers/index.js +1 -1
  75. package/esm/providers/index.js.map +1 -1
  76. package/esm/providers/tambo-provider.d.ts +2 -2
  77. package/esm/providers/tambo-provider.d.ts.map +1 -1
  78. package/esm/providers/tambo-provider.js.map +1 -1
  79. package/esm/providers/tambo-stubs.d.ts.map +1 -1
  80. package/esm/providers/tambo-stubs.js +7 -7
  81. package/esm/providers/tambo-stubs.js.map +1 -1
  82. package/esm/providers/tambo-thread-provider.d.ts +29 -11
  83. package/esm/providers/tambo-thread-provider.d.ts.map +1 -1
  84. package/esm/providers/tambo-thread-provider.js +125 -70
  85. package/esm/providers/tambo-thread-provider.js.map +1 -1
  86. package/esm/util/generate-component.d.ts.map +1 -1
  87. package/esm/util/generate-component.js +6 -2
  88. package/esm/util/generate-component.js.map +1 -1
  89. package/package.json +11 -11
@@ -34,7 +34,7 @@ var __importStar = (this && this.__importStar) || (function () {
34
34
  };
35
35
  })();
36
36
  Object.defineProperty(exports, "__esModule", { value: true });
37
- exports.useTamboThread = exports.TamboThreadProvider = exports.TamboThreadContext = exports.PLACEHOLDER_THREAD = void 0;
37
+ exports.useTamboThread = exports.useTamboGenerationStage = exports.TamboThreadProvider = exports.TamboThreadContext = exports.PLACEHOLDER_THREAD = exports.TamboGenerationStageProvider = void 0;
38
38
  const typescript_sdk_1 = require("@tambo-ai/typescript-sdk");
39
39
  const react_1 = __importStar(require("react"));
40
40
  const generate_component_response_1 = require("../model/generate-component-response");
@@ -44,6 +44,28 @@ const tool_caller_1 = require("../util/tool-caller");
44
44
  const tambo_client_provider_1 = require("./tambo-client-provider");
45
45
  const tambo_context_helpers_provider_1 = require("./tambo-context-helpers-provider");
46
46
  const tambo_registry_provider_1 = require("./tambo-registry-provider");
47
+ const TamboGenerationStageContext = (0, react_1.createContext)(undefined);
48
+ /**
49
+ *
50
+ * This provider is used to provide the generation stage context to the descendants of the provider.
51
+ * @param props - The props for the GenerationStageProvider
52
+ * @param props.children - The children to wrap
53
+ * @param props.generationStage - The generation stage to provide
54
+ * @param props.statusMessage - The status message to provide
55
+ * @returns The GenerationStageProvider component
56
+ */
57
+ const TamboGenerationStageProvider = ({ children, generationStage, statusMessage }) => {
58
+ const isIdle = (0, generate_component_response_1.isIdleStage)(generationStage);
59
+ const contextValue = (0, react_1.useMemo)(() => {
60
+ return {
61
+ generationStage,
62
+ generationStatusMessage: statusMessage,
63
+ isIdle,
64
+ };
65
+ }, [generationStage, statusMessage, isIdle]);
66
+ return (react_1.default.createElement(TamboGenerationStageContext.Provider, { value: contextValue }, children));
67
+ };
68
+ exports.TamboGenerationStageProvider = TamboGenerationStageProvider;
47
69
  /**
48
70
  * This is a stub entry for when the thread is not yet created, the first time
49
71
  * the user sends a message
@@ -91,14 +113,7 @@ exports.TamboThreadContext = (0, react_1.createContext)({
91
113
  addThreadMessage: () => {
92
114
  throw new Error("updateThreadMessageHistory not implemented");
93
115
  },
94
- inputValue: "",
95
116
  streaming: true,
96
- /**
97
- *
98
- */
99
- setInputValue: () => {
100
- throw new Error("setInputValue not implemented");
101
- },
102
117
  /**
103
118
  *
104
119
  */
@@ -109,11 +124,11 @@ exports.TamboThreadContext = (0, react_1.createContext)({
109
124
  *
110
125
  */
111
126
  sendThreadMessage: () => {
112
- throw new Error("advance not implemented");
127
+ throw new Error("sendThreadMessage not implemented");
113
128
  },
114
- generationStage: generate_component_response_1.GenerationStage.IDLE,
115
- generationStatusMessage: "",
116
- isIdle: true,
129
+ /**
130
+ *
131
+ */
117
132
  cancel: () => {
118
133
  throw new Error("cancel not implemented");
119
134
  },
@@ -133,11 +148,13 @@ const TamboThreadProvider = ({ children, streaming = true }) => {
133
148
  const client = (0, tambo_client_provider_1.useTamboClient)();
134
149
  const { componentList, toolRegistry, componentToolAssociations } = (0, tambo_registry_provider_1.useTamboRegistry)();
135
150
  const { getAdditionalContext } = (0, tambo_context_helpers_provider_1.useTamboContextHelpers)();
136
- const [inputValue, setInputValue] = (0, react_1.useState)("");
137
151
  const [ignoreResponse, setIgnoreResponse] = (0, react_1.useState)(false);
138
152
  const ignoreResponseRef = (0, react_1.useRef)(ignoreResponse);
139
153
  const [currentThreadId, setCurrentThreadId] = (0, react_1.useState)(exports.PLACEHOLDER_THREAD.id);
140
154
  const currentThread = threadMap[currentThreadId];
155
+ // Generation stage props for GenerationStageProvider
156
+ const currentGenerationStage = currentThread?.generationStage ?? generate_component_response_1.GenerationStage.IDLE;
157
+ const currentStatusMessage = currentThread?.statusMessage ?? "";
141
158
  // Use existing messages from the current thread to avoid re-generating any components
142
159
  const currentMessageCache = (0, react_1.useMemo)(() => {
143
160
  const messageCache = new Map();
@@ -151,8 +168,6 @@ const TamboThreadProvider = ({ children, streaming = true }) => {
151
168
  (0, react_1.useEffect)(() => {
152
169
  ignoreResponseRef.current = ignoreResponse;
153
170
  }, [ignoreResponse]);
154
- const isIdle = (0, react_1.useMemo)(() => (0, generate_component_response_1.isIdleStage)((currentThread?.generationStage ??
155
- generate_component_response_1.GenerationStage.IDLE)), [currentThread?.generationStage]);
156
171
  const fetchThread = (0, react_1.useCallback)(async (threadId, includeInternalMessages = true) => {
157
172
  const thread = await client.beta.threads.retrieve(threadId, {
158
173
  includeInternal: includeInternalMessages,
@@ -353,7 +368,8 @@ const TamboThreadProvider = ({ children, streaming = true }) => {
353
368
  }, []);
354
369
  const cancel = (0, react_1.useCallback)(async (threadId) => {
355
370
  threadId ??= currentThreadId;
356
- if (isIdle) {
371
+ const currentGenerationStage = currentThread?.generationStage ?? generate_component_response_1.GenerationStage.IDLE;
372
+ if ((0, generate_component_response_1.isIdleStage)(currentGenerationStage)) {
357
373
  return;
358
374
  }
359
375
  setIgnoreResponse(true);
@@ -380,7 +396,7 @@ const TamboThreadProvider = ({ children, streaming = true }) => {
380
396
  };
381
397
  });
382
398
  await client.beta.threads.cancel(threadId);
383
- }, [client.beta.threads, currentThreadId, isIdle]);
399
+ }, [client.beta.threads, currentThreadId, currentThread?.generationStage]);
384
400
  const handleAdvanceStream = (0, react_1.useCallback)(async (stream, params, threadId) => {
385
401
  if (ignoreResponseRef.current) {
386
402
  setIgnoreResponse(false);
@@ -555,57 +571,83 @@ const TamboThreadProvider = ({ children, streaming = true }) => {
555
571
  toolCallCounts,
556
572
  };
557
573
  if (streamResponse) {
558
- const advanceStreamResponse = await (0, typescript_sdk_1.advanceStream)(client, params, threadId === exports.PLACEHOLDER_THREAD.id ? undefined : threadId);
559
- return await handleAdvanceStream(advanceStreamResponse, params, threadId);
574
+ let advanceStreamResponse;
575
+ try {
576
+ advanceStreamResponse = await (0, typescript_sdk_1.advanceStream)(client, params, threadId === exports.PLACEHOLDER_THREAD.id ? undefined : threadId);
577
+ }
578
+ catch (error) {
579
+ updateThreadStatus(threadId, generate_component_response_1.GenerationStage.ERROR);
580
+ throw error;
581
+ }
582
+ try {
583
+ return await handleAdvanceStream(advanceStreamResponse, params, threadId);
584
+ }
585
+ catch (error) {
586
+ updateThreadStatus(threadId, generate_component_response_1.GenerationStage.ERROR);
587
+ throw error;
588
+ }
589
+ }
590
+ let advanceResponse;
591
+ try {
592
+ advanceResponse = await (threadId === exports.PLACEHOLDER_THREAD.id
593
+ ? client.beta.threads.advance(params)
594
+ : client.beta.threads.advanceById(threadId, params));
595
+ }
596
+ catch (error) {
597
+ updateThreadStatus(threadId, generate_component_response_1.GenerationStage.ERROR);
598
+ throw error;
560
599
  }
561
- let advanceResponse = await (threadId === exports.PLACEHOLDER_THREAD.id
562
- ? client.beta.threads.advance(params)
563
- : client.beta.threads.advanceById(threadId, params));
564
600
  //handle tool calls
565
- while (advanceResponse.responseMessageDto.toolCallRequest) {
566
- // Increment tool call count for this tool
567
- const toolName = advanceResponse.responseMessageDto.toolCallRequest.toolName;
568
- if (toolName) {
569
- toolCallCounts[toolName] = (toolCallCounts[toolName] || 0) + 1;
570
- }
571
- updateThreadStatus(threadId, generate_component_response_1.GenerationStage.FETCHING_CONTEXT);
572
- const toolCallResponse = await (0, tool_caller_1.handleToolCall)(advanceResponse.responseMessageDto, toolRegistry);
573
- const toolResponseString = typeof toolCallResponse.result === "string"
574
- ? toolCallResponse.result
575
- : JSON.stringify(toolCallResponse.result);
576
- const toolCallResponseParams = {
577
- ...params,
578
- messageToAppend: {
579
- ...params.messageToAppend,
601
+ try {
602
+ while (advanceResponse.responseMessageDto.toolCallRequest) {
603
+ // Increment tool call count for this tool
604
+ const toolName = advanceResponse.responseMessageDto.toolCallRequest.toolName;
605
+ if (toolName) {
606
+ toolCallCounts[toolName] = (toolCallCounts[toolName] || 0) + 1;
607
+ }
608
+ updateThreadStatus(threadId, generate_component_response_1.GenerationStage.FETCHING_CONTEXT);
609
+ const toolCallResponse = await (0, tool_caller_1.handleToolCall)(advanceResponse.responseMessageDto, toolRegistry);
610
+ const toolResponseString = typeof toolCallResponse.result === "string"
611
+ ? toolCallResponse.result
612
+ : JSON.stringify(toolCallResponse.result);
613
+ const toolCallResponseParams = {
614
+ ...params,
615
+ messageToAppend: {
616
+ ...params.messageToAppend,
617
+ content: [{ type: "text", text: toolResponseString }],
618
+ role: "tool",
619
+ actionType: "tool_response",
620
+ component: advanceResponse.responseMessageDto.component,
621
+ tool_call_id: advanceResponse.responseMessageDto.tool_call_id,
622
+ error: toolCallResponse.error,
623
+ },
624
+ };
625
+ if (toolCallResponse.error) {
626
+ //update toolcall message with error
627
+ const toolCallMessage = {
628
+ ...advanceResponse.responseMessageDto,
629
+ error: toolCallResponse.error,
630
+ };
631
+ updateThreadMessage(toolCallMessage.id, toolCallMessage, false);
632
+ }
633
+ updateThreadStatus(threadId, generate_component_response_1.GenerationStage.HYDRATING_COMPONENT);
634
+ addThreadMessage({
635
+ threadId: threadId,
580
636
  content: [{ type: "text", text: toolResponseString }],
581
637
  role: "tool",
638
+ id: crypto.randomUUID(),
639
+ createdAt: new Date().toISOString(),
640
+ componentState: {},
582
641
  actionType: "tool_response",
583
- component: advanceResponse.responseMessageDto.component,
584
642
  tool_call_id: advanceResponse.responseMessageDto.tool_call_id,
585
643
  error: toolCallResponse.error,
586
- },
587
- };
588
- if (toolCallResponse.error) {
589
- //update toolcall message with error
590
- const toolCallMessage = {
591
- ...advanceResponse.responseMessageDto,
592
- error: toolCallResponse.error,
593
- };
594
- updateThreadMessage(toolCallMessage.id, toolCallMessage, false);
644
+ }, false);
645
+ advanceResponse = await client.beta.threads.advanceById(advanceResponse.responseMessageDto.threadId, toolCallResponseParams);
595
646
  }
596
- updateThreadStatus(threadId, generate_component_response_1.GenerationStage.HYDRATING_COMPONENT);
597
- addThreadMessage({
598
- threadId: threadId,
599
- content: [{ type: "text", text: toolResponseString }],
600
- role: "tool",
601
- id: crypto.randomUUID(),
602
- createdAt: new Date().toISOString(),
603
- componentState: {},
604
- actionType: "tool_response",
605
- tool_call_id: advanceResponse.responseMessageDto.tool_call_id,
606
- error: toolCallResponse.error,
607
- }, false);
608
- advanceResponse = await client.beta.threads.advanceById(advanceResponse.responseMessageDto.threadId, toolCallResponseParams);
647
+ }
648
+ catch (error) {
649
+ updateThreadStatus(advanceResponse.responseMessageDto.threadId, generate_component_response_1.GenerationStage.ERROR);
650
+ throw error;
609
651
  }
610
652
  const finalMessage = advanceResponse.responseMessageDto.component
611
653
  ?.componentName
@@ -637,29 +679,44 @@ const TamboThreadProvider = ({ children, streaming = true }) => {
637
679
  generateThreadName,
638
680
  addThreadMessage,
639
681
  updateThreadMessage,
640
- inputValue,
641
- setInputValue,
642
- sendThreadMessage,
643
682
  streaming,
644
- generationStage: (currentThread?.generationStage ??
645
- generate_component_response_1.GenerationStage.IDLE),
646
- generationStatusMessage: currentThread?.statusMessage ?? "",
647
- isIdle,
648
683
  cancel,
649
- } }, children));
684
+ sendThreadMessage,
685
+ } },
686
+ react_1.default.createElement(exports.TamboGenerationStageProvider, { generationStage: currentGenerationStage, statusMessage: currentStatusMessage }, children)));
650
687
  };
651
688
  exports.TamboThreadProvider = TamboThreadProvider;
689
+ /**
690
+ * The useTamboGenerationStage hook provides access to the generation stage context
691
+ * to the descendants of the TamboThreadProvider.
692
+ * @returns The generation stage context
693
+ */
694
+ const useTamboGenerationStage = () => {
695
+ const generationStageContext = (0, react_1.useContext)(TamboGenerationStageContext);
696
+ if (generationStageContext === undefined) {
697
+ throw new Error("useTamboGenerationStage must be used within a TamboThreadProvider");
698
+ }
699
+ return generationStageContext;
700
+ };
701
+ exports.useTamboGenerationStage = useTamboGenerationStage;
652
702
  /**
653
703
  * The useTamboThread hook provides access to the current thread context
654
704
  * to the descendants of the TamboThreadProvider.
655
705
  * @returns All state and actions for the current thread
656
706
  */
657
707
  const useTamboThread = () => {
658
- const context = (0, react_1.useContext)(exports.TamboThreadContext);
659
- if (context === undefined) {
708
+ const threadContext = (0, react_1.useContext)(exports.TamboThreadContext);
709
+ const generationStageContext = (0, react_1.useContext)(TamboGenerationStageContext);
710
+ if (threadContext === undefined) {
660
711
  throw new Error("useTamboThread must be used within a TamboThreadProvider");
661
712
  }
662
- return context;
713
+ if (generationStageContext === undefined) {
714
+ throw new Error("useTamboThread must be used within a TamboThreadProvider");
715
+ }
716
+ return {
717
+ ...threadContext,
718
+ ...generationStageContext,
719
+ };
663
720
  };
664
721
  exports.useTamboThread = useTamboThread;
665
722
  //# sourceMappingURL=tambo-thread-provider.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"tambo-thread-provider.js","sourceRoot":"","sources":["../../src/providers/tambo-thread-provider.tsx"],"names":[],"mappings":"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","sourcesContent":["\"use client\";\nimport TamboAI, { advanceStream } from \"@tambo-ai/typescript-sdk\";\nimport { Thread } from \"@tambo-ai/typescript-sdk/resources/beta/threads/threads\";\nimport React, {\n createContext,\n PropsWithChildren,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport {\n GenerationStage,\n isIdleStage,\n TamboThreadMessage,\n} from \"../model/generate-component-response\";\nimport { TamboThread } from \"../model/tambo-thread\";\nimport { renderComponentIntoMessage } from \"../util/generate-component\";\nimport {\n getAvailableComponents,\n getUnassociatedTools,\n mapTamboToolToContextTool,\n} from \"../util/registry\";\nimport { handleToolCall } from \"../util/tool-caller\";\nimport { useTamboClient } from \"./tambo-client-provider\";\nimport { useTamboContextHelpers } from \"./tambo-context-helpers-provider\";\nimport { useTamboRegistry } from \"./tambo-registry-provider\";\n\nexport interface TamboThreadContextProps {\n /** The current thread */\n thread: TamboThread;\n /** Switch to a different thread */\n switchCurrentThread: (threadId: string, fetch?: boolean) => void;\n /** Start a new thread */\n startNewThread: () => void;\n /** Update a thread's name */\n updateThreadName: (name: string, threadId?: string) => void;\n /** Let Tambo generate and set a thread's name based on the thread's messages */\n generateThreadName: (threadId?: string) => Promise<Thread>;\n /** Add a message to the current thread */\n addThreadMessage: (\n message: TamboThreadMessage,\n sendToServer: boolean,\n ) => Promise<TamboAI.Beta.Threads.ThreadMessage[]>;\n /** Update a message in the current thread */\n updateThreadMessage: (\n id: string,\n message: TamboThreadMessage,\n sendToServer: boolean,\n ) => Promise<void>;\n /** Cancel a thread */\n cancel: (threadId?: string) => Promise<void>;\n /** The input value of the current thread */\n inputValue: string;\n /** Whether the thread is streaming */\n streaming: boolean;\n /** Set the input value of the current thread */\n setInputValue: (value: string) => void;\n /** Send a message to the current thread */\n sendThreadMessage: (\n message: string,\n options?: {\n threadId?: string;\n streamResponse?: boolean;\n contextKey?: string;\n forceToolChoice?: string;\n additionalContext?: Record<string, any>;\n },\n ) => Promise<TamboThreadMessage>;\n /** The generation stage of the current thread - updated as the thread progresses */\n generationStage: GenerationStage;\n /** The generation status message of the current thread - updated as the thread progresses */\n generationStatusMessage: string;\n /** Whether the thread is idle */\n isIdle: boolean;\n}\n\n/**\n * This is a stub entry for when the thread is not yet created, the first time\n * the user sends a message\n *\n * Note that the consumer needs to be careful never to send `PLACEHOLDER_THREAD.id` to the server,\n * as this doesn't really exist on the server side.\n */\nexport const PLACEHOLDER_THREAD: TamboThread = {\n id: \"placeholder\",\n messages: [],\n createdAt: \"\",\n projectId: \"\",\n updatedAt: \"\",\n metadata: {},\n};\n\nexport const TamboThreadContext = createContext<TamboThreadContextProps>({\n thread: PLACEHOLDER_THREAD,\n /**\n *\n */\n switchCurrentThread: () => {\n throw new Error(\"switchCurrentThread not implemented\");\n },\n /**\n *\n */\n startNewThread: () => {\n throw new Error(\"startNewThread not implemented\");\n },\n /**\n *\n */\n updateThreadName: () => {\n throw new Error(\"updateThreadName not implemented\");\n },\n /**\n *\n */\n generateThreadName: () => {\n throw new Error(\"generateThreadName not implemented\");\n },\n /**\n *\n */\n addThreadMessage: () => {\n throw new Error(\"updateThreadMessageHistory not implemented\");\n },\n inputValue: \"\",\n streaming: true,\n /**\n *\n */\n setInputValue: () => {\n throw new Error(\"setInputValue not implemented\");\n },\n /**\n *\n */\n updateThreadMessage: () => {\n throw new Error(\"updateThreadMessage not implemented\");\n },\n /**\n *\n */\n sendThreadMessage: () => {\n throw new Error(\"advance not implemented\");\n },\n generationStage: GenerationStage.IDLE,\n generationStatusMessage: \"\",\n isIdle: true,\n cancel: () => {\n throw new Error(\"cancel not implemented\");\n },\n});\n\nexport interface TamboThreadProviderProps {\n /** Whether to stream the response */\n streaming?: boolean;\n}\n\n/**\n * The TamboThreadProvider is a React provider that provides a thread context\n * to the descendants of the provider.\n * @param props - The props for the TamboThreadProvider\n * @param props.children - The children to wrap\n * @param props.streaming - Whether to stream the response by default. Defaults to true.\n * @returns The TamboThreadProvider component\n */\nexport const TamboThreadProvider: React.FC<\n PropsWithChildren<TamboThreadProviderProps>\n> = ({ children, streaming = true }) => {\n const [threadMap, setThreadMap] = useState<Record<string, TamboThread>>({\n [PLACEHOLDER_THREAD.id]: PLACEHOLDER_THREAD,\n });\n const client = useTamboClient();\n const { componentList, toolRegistry, componentToolAssociations } =\n useTamboRegistry();\n const { getAdditionalContext } = useTamboContextHelpers();\n const [inputValue, setInputValue] = useState(\"\");\n const [ignoreResponse, setIgnoreResponse] = useState(false);\n const ignoreResponseRef = useRef(ignoreResponse);\n const [currentThreadId, setCurrentThreadId] = useState<string>(\n PLACEHOLDER_THREAD.id,\n );\n const currentThread: TamboThread | undefined = threadMap[currentThreadId];\n\n // Use existing messages from the current thread to avoid re-generating any components\n const currentMessageCache = useMemo(() => {\n const messageCache = new Map<string, TamboThreadMessage>();\n if (currentThread) {\n for (const message of currentThread.messages) {\n messageCache.set(message.id, message);\n }\n }\n return messageCache;\n }, [currentThread]);\n\n useEffect(() => {\n ignoreResponseRef.current = ignoreResponse;\n }, [ignoreResponse]);\n\n const isIdle = useMemo(\n () =>\n isIdleStage(\n (currentThread?.generationStage ??\n GenerationStage.IDLE) as GenerationStage,\n ),\n [currentThread?.generationStage],\n );\n\n const fetchThread = useCallback(\n async (threadId: string, includeInternalMessages = true) => {\n const thread = await client.beta.threads.retrieve(threadId, {\n includeInternal: includeInternalMessages,\n });\n const threadWithRenderedComponents = {\n ...thread,\n messages: thread.messages.map((message) => {\n if (currentMessageCache.has(message.id)) {\n const renderedMessage = currentMessageCache.get(message.id);\n return {\n ...renderedMessage,\n ...message,\n };\n }\n if (message.component?.componentName) {\n const messageWithComponent = renderComponentIntoMessage(\n message,\n componentList,\n );\n return messageWithComponent;\n }\n return message;\n }),\n };\n\n setThreadMap((prevMap) => {\n const updatedThreadMap = {\n ...prevMap,\n [threadId]: threadWithRenderedComponents,\n };\n return updatedThreadMap;\n });\n },\n [client.beta.threads, componentList, currentMessageCache],\n );\n\n useEffect(() => {\n if (\n currentThreadId &&\n currentThreadId !== PLACEHOLDER_THREAD.id &&\n !threadMap[currentThreadId]\n ) {\n fetchThread(currentThreadId);\n }\n }, [currentThreadId, fetchThread, threadMap]);\n\n const addThreadMessage = useCallback(\n async (\n message: TamboThreadMessage,\n sendToServer = true,\n createdAt: string = new Date().toISOString(),\n ) => {\n if (!currentThread) {\n console.warn(\"Cannot add messages if we do not have a current thread\");\n return [];\n }\n\n const chatMessage: TamboThreadMessage = {\n ...message,\n createdAt,\n };\n const threadId = message.threadId;\n const messageId = chatMessage.id;\n // optimistically update the thread in the local state\n setThreadMap((prevMap) => {\n if (!threadId) {\n return prevMap;\n }\n const prevMessages = prevMap[threadId]?.messages || [];\n const haveMessage = prevMessages.find((msg) => msg.id === messageId);\n // Update in place if the message already exists\n const updatedMessages = haveMessage\n ? prevMessages.map((msg) => {\n if (msg.id === messageId) {\n return chatMessage;\n }\n return msg;\n })\n : [...prevMessages, chatMessage];\n\n const updatedThreadMap = {\n ...prevMap,\n [threadId]: {\n ...prevMap[threadId],\n messages: updatedMessages,\n },\n };\n return updatedThreadMap;\n });\n\n if (sendToServer) {\n // TODO: if this fails, we need to revert the local state update\n await client.beta.threads.messages.create(message.threadId, {\n content: message.content,\n role: message.role,\n additionalContext: chatMessage.additionalContext,\n });\n }\n return threadMap[threadId]?.messages || [];\n },\n [client.beta.threads.messages, currentThread, threadMap],\n );\n\n const updateThreadMessage = useCallback(\n async (\n id: string,\n message: TamboThreadMessage,\n sendToServer = true,\n createdAt: string = new Date().toISOString(),\n ) => {\n const chatMessage: TamboThreadMessage = {\n ...message,\n createdAt,\n };\n\n setThreadMap((prevMap) => {\n if (!message.threadId) {\n return prevMap;\n }\n const prevMessages = prevMap[message.threadId]?.messages || [];\n const updatedMessages = prevMessages.map((msg) => {\n if (msg.id === id) {\n return chatMessage;\n }\n return msg;\n });\n return {\n ...prevMap,\n [message.threadId]: {\n ...prevMap[message.threadId],\n messages: updatedMessages,\n },\n };\n });\n if (sendToServer) {\n // TODO: if this fails, we need to revert the local state update\n await client.beta.threads.messages.create(message.threadId, {\n content: message.content,\n role: message.role,\n additionalContext: chatMessage.additionalContext,\n });\n }\n },\n [client.beta.threads.messages],\n );\n\n const startNewThread = useCallback(() => {\n setCurrentThreadId(PLACEHOLDER_THREAD.id);\n setThreadMap((prevMap) => {\n return {\n ...prevMap,\n [PLACEHOLDER_THREAD.id]: PLACEHOLDER_THREAD,\n };\n });\n }, []);\n\n const updateThreadName = useCallback(\n async (name: string, threadId?: string) => {\n threadId ??= currentThreadId;\n\n setThreadMap((prevMap) => {\n if (!prevMap[threadId]) {\n return prevMap;\n }\n return { ...prevMap, [threadId]: { ...prevMap[threadId], name } };\n });\n\n if (threadId !== PLACEHOLDER_THREAD.id) {\n const currentProject = await client.beta.projects.getCurrent();\n await client.beta.threads.update(threadId, {\n name,\n projectId: currentProject.id,\n });\n }\n },\n [currentThreadId, client.beta.projects, client.beta.threads],\n );\n\n const generateThreadName = useCallback(\n async (threadId?: string) => {\n threadId ??= currentThreadId;\n if (threadId === PLACEHOLDER_THREAD.id) {\n console.warn(\"Cannot generate name for empty thread\");\n return threadMap[threadId];\n }\n\n const threadWithGeneratedName =\n await client.beta.threads.generateName(threadId);\n\n setThreadMap((prevMap) => {\n if (!prevMap[threadId]) {\n return prevMap;\n }\n return {\n ...prevMap,\n [threadId]: {\n ...prevMap[threadId],\n name: threadWithGeneratedName.name,\n },\n };\n });\n return threadWithGeneratedName;\n },\n [client.beta.threads, currentThreadId, threadMap],\n );\n\n const switchCurrentThread = useCallback(\n async (threadId: string, fetch = true) => {\n if (threadId === PLACEHOLDER_THREAD.id) {\n console.warn(\"Switching to placeholder thread, may be a bug.\");\n return;\n }\n setCurrentThreadId(threadId);\n setThreadMap((prevMap) => {\n if (prevMap[threadId]) {\n return prevMap;\n }\n // If this is a new thread, add placeholder thread messages to the thread\n const updatedThreadMap = {\n ...prevMap,\n [threadId]: {\n ...prevMap[PLACEHOLDER_THREAD.id],\n id: threadId,\n },\n };\n return updatedThreadMap;\n });\n if (fetch) {\n await fetchThread(threadId);\n }\n },\n [fetchThread],\n );\n\n const updateThreadStatus = useCallback(\n (threadId: string, stage: GenerationStage, statusMessage?: string) => {\n setThreadMap((prevMap) => {\n const updatedThreadMap = {\n ...prevMap,\n [threadId]: {\n ...prevMap[threadId],\n generationStage: stage,\n statusMessage: statusMessage,\n },\n };\n return updatedThreadMap;\n });\n },\n [],\n );\n\n const cancel = useCallback(\n async (threadId?: string) => {\n threadId ??= currentThreadId;\n if (isIdle) {\n return;\n }\n setIgnoreResponse(true);\n setThreadMap((prevMap) => {\n if (!prevMap[threadId]) {\n return prevMap;\n }\n\n return {\n ...prevMap,\n [threadId]: {\n ...prevMap[threadId],\n generationStage: GenerationStage.CANCELLED,\n messages: prevMap[threadId].messages.map((message) => {\n if (\n message.id ===\n prevMap[threadId].messages[\n prevMap[threadId].messages.length - 1\n ].id\n ) {\n return {\n ...message,\n isCancelled: true,\n };\n }\n return message;\n }),\n },\n };\n });\n\n await client.beta.threads.cancel(threadId);\n },\n [client.beta.threads, currentThreadId, isIdle],\n );\n\n const handleAdvanceStream = useCallback(\n async (\n stream: AsyncIterable<TamboAI.Beta.Threads.ThreadAdvanceResponse>,\n params: TamboAI.Beta.Threads.ThreadAdvanceParams,\n threadId: string,\n ): Promise<TamboThreadMessage> => {\n if (ignoreResponseRef.current) {\n setIgnoreResponse(false);\n return {\n threadId: threadId,\n content: [{ type: \"text\", text: \"\" }],\n role: \"assistant\",\n createdAt: new Date().toISOString(),\n id: crypto.randomUUID(),\n componentState: {},\n };\n }\n let finalMessage: Readonly<TamboThreadMessage> | undefined;\n let hasSetThreadId = false;\n updateThreadStatus(threadId, GenerationStage.STREAMING_RESPONSE);\n\n for await (const chunk of stream) {\n if (chunk.responseMessageDto.toolCallRequest) {\n // Increment tool call count for this tool\n const toolName = chunk.responseMessageDto.toolCallRequest.toolName;\n if (toolName && params.toolCallCounts) {\n params.toolCallCounts[toolName] =\n (params.toolCallCounts[toolName] ?? 0) + 1;\n }\n\n updateThreadStatus(\n chunk.responseMessageDto.threadId,\n GenerationStage.FETCHING_CONTEXT,\n );\n\n updateThreadMessage(\n chunk.responseMessageDto.id,\n {\n ...chunk.responseMessageDto,\n },\n false,\n );\n\n const toolCallResponse = await handleToolCall(\n chunk.responseMessageDto,\n toolRegistry,\n );\n if (ignoreResponseRef.current) {\n setIgnoreResponse(false);\n {\n return {\n threadId: threadId,\n content: [{ type: \"text\", text: \"\" }],\n role: \"assistant\",\n createdAt: new Date().toISOString(),\n id: crypto.randomUUID(),\n componentState: {},\n };\n }\n }\n const toolCallResponseString =\n typeof toolCallResponse.result === \"string\"\n ? toolCallResponse.result\n : JSON.stringify(toolCallResponse.result);\n const toolCallResponseParams: TamboAI.Beta.Threads.ThreadAdvanceParams =\n {\n ...params,\n messageToAppend: {\n content: [{ type: \"text\", text: toolCallResponseString }],\n role: \"tool\",\n actionType: \"tool_response\",\n component: chunk.responseMessageDto.component,\n tool_call_id: chunk.responseMessageDto.tool_call_id,\n error: toolCallResponse.error,\n },\n };\n\n updateThreadMessage(\n chunk.responseMessageDto.id,\n {\n ...chunk.responseMessageDto,\n error: toolCallResponse.error,\n },\n false,\n );\n\n addThreadMessage(\n {\n threadId: chunk.responseMessageDto.threadId,\n content: [{ type: \"text\", text: toolCallResponseString }],\n role: \"tool\",\n id: crypto.randomUUID(),\n createdAt: new Date().toISOString(),\n componentState: {},\n actionType: \"tool_response\",\n tool_call_id: chunk.responseMessageDto.tool_call_id,\n error: toolCallResponse.error,\n },\n false,\n );\n\n updateThreadStatus(\n chunk.responseMessageDto.threadId,\n GenerationStage.STREAMING_RESPONSE,\n );\n const toolCallResponseStream = await advanceStream(\n client,\n toolCallResponseParams,\n chunk.responseMessageDto.threadId,\n );\n\n return await handleAdvanceStream(\n toolCallResponseStream,\n toolCallResponseParams,\n chunk.responseMessageDto.threadId,\n );\n } else {\n if (ignoreResponseRef.current) {\n setIgnoreResponse(false);\n return (\n finalMessage ?? {\n threadId: threadId,\n content: [{ type: \"text\", text: \"\" }],\n role: \"assistant\",\n createdAt: new Date().toISOString(),\n id: crypto.randomUUID(),\n componentState: {},\n }\n );\n }\n if (\n !hasSetThreadId &&\n chunk.responseMessageDto.threadId &&\n chunk.responseMessageDto.threadId !== currentThread?.id\n ) {\n hasSetThreadId = true;\n await switchCurrentThread(chunk.responseMessageDto.threadId, false);\n }\n\n if (!finalMessage) {\n finalMessage = chunk.responseMessageDto.component?.componentName\n ? renderComponentIntoMessage(\n chunk.responseMessageDto,\n componentList,\n )\n : chunk.responseMessageDto;\n await addThreadMessage(finalMessage, false);\n } else {\n // if we start getting a new message mid-stream, put the previous one on screen\n const isNewMessage =\n chunk.responseMessageDto.id !== finalMessage.id;\n\n finalMessage = chunk.responseMessageDto.component?.componentName\n ? renderComponentIntoMessage(\n chunk.responseMessageDto,\n componentList,\n )\n : chunk.responseMessageDto;\n\n if (isNewMessage) {\n await addThreadMessage(finalMessage, false);\n } else {\n await updateThreadMessage(finalMessage.id, finalMessage, false);\n }\n }\n }\n }\n\n updateThreadStatus(\n finalMessage?.threadId ?? threadId,\n GenerationStage.COMPLETE,\n );\n return (\n finalMessage ?? {\n threadId: \"\",\n content: [{ type: \"text\", text: `Error processing stream` }],\n role: \"assistant\",\n createdAt: new Date().toISOString(),\n id: crypto.randomUUID(),\n componentState: {},\n }\n );\n },\n [\n addThreadMessage,\n client,\n componentList,\n currentThread?.id,\n switchCurrentThread,\n toolRegistry,\n updateThreadMessage,\n updateThreadStatus,\n ],\n );\n\n const currentThreadContextKey = currentThread?.contextKey;\n\n const sendThreadMessage = useCallback(\n async (\n message: string,\n options: {\n threadId?: string;\n streamResponse?: boolean;\n forceToolChoice?: string;\n contextKey?: string;\n additionalContext?: Record<string, any>;\n } = {},\n ): Promise<TamboThreadMessage> => {\n setIgnoreResponse(false);\n const {\n threadId = currentThreadId ?? PLACEHOLDER_THREAD.id,\n streamResponse = streaming,\n forceToolChoice,\n contextKey = currentThreadContextKey,\n additionalContext,\n } = options;\n updateThreadStatus(threadId, GenerationStage.FETCHING_CONTEXT);\n\n // Get additional context from enabled helpers\n const helperContexts = await getAdditionalContext();\n\n // Combine all contexts\n const combinedContext: Record<string, any> = {\n ...(additionalContext ?? {}),\n };\n\n // Add helper contexts to combinedContext\n for (const helperContext of helperContexts) {\n combinedContext[helperContext.name] = helperContext.context;\n }\n\n addThreadMessage(\n {\n content: [{ type: \"text\", text: message }],\n renderedComponent: null,\n role: \"user\",\n threadId: threadId,\n id: crypto.randomUUID(),\n createdAt: new Date().toISOString(),\n componentState: {},\n additionalContext: combinedContext,\n },\n false,\n );\n\n const availableComponents = getAvailableComponents(\n componentList,\n toolRegistry,\n componentToolAssociations,\n );\n const unassociatedTools = getUnassociatedTools(\n toolRegistry,\n componentToolAssociations,\n );\n\n // Track tool call counts for this message processing\n const toolCallCounts: Record<string, number> = {};\n\n const params: TamboAI.Beta.Threads.ThreadAdvanceParams = {\n messageToAppend: {\n content: [{ type: \"text\", text: message }],\n role: \"user\",\n additionalContext: combinedContext,\n },\n contextKey,\n availableComponents: availableComponents,\n clientTools: unassociatedTools.map((tool) =>\n mapTamboToolToContextTool(tool),\n ),\n forceToolChoice: forceToolChoice,\n toolCallCounts,\n };\n\n if (streamResponse) {\n const advanceStreamResponse = await advanceStream(\n client,\n params,\n threadId === PLACEHOLDER_THREAD.id ? undefined : threadId,\n );\n return await handleAdvanceStream(\n advanceStreamResponse,\n params,\n threadId,\n );\n }\n let advanceResponse = await (threadId === PLACEHOLDER_THREAD.id\n ? client.beta.threads.advance(params)\n : client.beta.threads.advanceById(threadId, params));\n\n //handle tool calls\n while (advanceResponse.responseMessageDto.toolCallRequest) {\n // Increment tool call count for this tool\n const toolName =\n advanceResponse.responseMessageDto.toolCallRequest.toolName;\n if (toolName) {\n toolCallCounts[toolName] = (toolCallCounts[toolName] || 0) + 1;\n }\n\n updateThreadStatus(threadId, GenerationStage.FETCHING_CONTEXT);\n const toolCallResponse = await handleToolCall(\n advanceResponse.responseMessageDto,\n toolRegistry,\n );\n const toolResponseString =\n typeof toolCallResponse.result === \"string\"\n ? toolCallResponse.result\n : JSON.stringify(toolCallResponse.result);\n const toolCallResponseParams: TamboAI.Beta.Threads.ThreadAdvanceParams =\n {\n ...params,\n messageToAppend: {\n ...params.messageToAppend,\n content: [{ type: \"text\", text: toolResponseString }],\n role: \"tool\",\n actionType: \"tool_response\",\n component: advanceResponse.responseMessageDto.component,\n tool_call_id: advanceResponse.responseMessageDto.tool_call_id,\n error: toolCallResponse.error,\n },\n };\n if (toolCallResponse.error) {\n //update toolcall message with error\n const toolCallMessage = {\n ...advanceResponse.responseMessageDto,\n error: toolCallResponse.error,\n };\n updateThreadMessage(toolCallMessage.id, toolCallMessage, false);\n }\n updateThreadStatus(threadId, GenerationStage.HYDRATING_COMPONENT);\n addThreadMessage(\n {\n threadId: threadId,\n content: [{ type: \"text\", text: toolResponseString }],\n role: \"tool\",\n id: crypto.randomUUID(),\n createdAt: new Date().toISOString(),\n componentState: {},\n actionType: \"tool_response\",\n tool_call_id: advanceResponse.responseMessageDto.tool_call_id,\n error: toolCallResponse.error,\n },\n false,\n );\n\n advanceResponse = await client.beta.threads.advanceById(\n advanceResponse.responseMessageDto.threadId,\n toolCallResponseParams,\n );\n }\n\n const finalMessage = advanceResponse.responseMessageDto.component\n ?.componentName\n ? renderComponentIntoMessage(\n advanceResponse.responseMessageDto,\n componentList,\n )\n : advanceResponse.responseMessageDto;\n await switchCurrentThread(advanceResponse.responseMessageDto.threadId);\n updateThreadStatus(\n advanceResponse.responseMessageDto.threadId,\n GenerationStage.COMPLETE,\n );\n return finalMessage;\n },\n [\n componentList,\n toolRegistry,\n componentToolAssociations,\n currentThreadId,\n currentThreadContextKey,\n switchCurrentThread,\n addThreadMessage,\n client,\n updateThreadMessage,\n updateThreadStatus,\n handleAdvanceStream,\n streaming,\n getAdditionalContext,\n ],\n );\n\n return (\n <TamboThreadContext.Provider\n value={{\n thread: currentThread,\n switchCurrentThread,\n startNewThread,\n updateThreadName,\n generateThreadName,\n addThreadMessage,\n updateThreadMessage,\n inputValue,\n setInputValue,\n sendThreadMessage,\n streaming,\n generationStage: (currentThread?.generationStage ??\n GenerationStage.IDLE) as GenerationStage,\n generationStatusMessage: currentThread?.statusMessage ?? \"\",\n isIdle,\n cancel,\n }}\n >\n {children}\n </TamboThreadContext.Provider>\n );\n};\n\n/**\n * The useTamboThread hook provides access to the current thread context\n * to the descendants of the TamboThreadProvider.\n * @returns All state and actions for the current thread\n */\nexport const useTamboThread = () => {\n const context = useContext(TamboThreadContext);\n if (context === undefined) {\n throw new Error(\"useTamboThread must be used within a TamboThreadProvider\");\n }\n return context;\n};\n"]}
1
+ {"version":3,"file":"tambo-thread-provider.js","sourceRoot":"","sources":["../../src/providers/tambo-thread-provider.tsx"],"names":[],"mappings":"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","sourcesContent":["\"use client\";\nimport TamboAI, { advanceStream } from \"@tambo-ai/typescript-sdk\";\nimport { Thread } from \"@tambo-ai/typescript-sdk/resources/beta/threads/threads\";\nimport React, {\n createContext,\n PropsWithChildren,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport {\n GenerationStage,\n isIdleStage,\n TamboThreadMessage,\n} from \"../model/generate-component-response\";\nimport { TamboThread } from \"../model/tambo-thread\";\nimport { renderComponentIntoMessage } from \"../util/generate-component\";\nimport {\n getAvailableComponents,\n getUnassociatedTools,\n mapTamboToolToContextTool,\n} from \"../util/registry\";\nimport { handleToolCall } from \"../util/tool-caller\";\nimport { useTamboClient } from \"./tambo-client-provider\";\nimport { useTamboContextHelpers } from \"./tambo-context-helpers-provider\";\nimport { useTamboRegistry } from \"./tambo-registry-provider\";\n\n// Generation Stage Context - separate from thread context to prevent re-renders\nexport interface TamboGenerationStageContextProps {\n generationStage: GenerationStage;\n generationStatusMessage: string;\n isIdle: boolean;\n}\n\nconst TamboGenerationStageContext = createContext<\n TamboGenerationStageContextProps | undefined\n>(undefined);\n\ninterface TamboGenerationStageProviderProps {\n generationStage: GenerationStage;\n statusMessage: string;\n}\n\n/**\n *\n * This provider is used to provide the generation stage context to the descendants of the provider.\n * @param props - The props for the GenerationStageProvider\n * @param props.children - The children to wrap\n * @param props.generationStage - The generation stage to provide\n * @param props.statusMessage - The status message to provide\n * @returns The GenerationStageProvider component\n */\nexport const TamboGenerationStageProvider: React.FC<\n PropsWithChildren<TamboGenerationStageProviderProps>\n> = ({ children, generationStage, statusMessage }) => {\n const isIdle = isIdleStage(generationStage);\n\n const contextValue = useMemo(() => {\n return {\n generationStage,\n generationStatusMessage: statusMessage,\n isIdle,\n };\n }, [generationStage, statusMessage, isIdle]);\n\n return (\n <TamboGenerationStageContext.Provider value={contextValue}>\n {children}\n </TamboGenerationStageContext.Provider>\n );\n};\n\nexport interface TamboThreadContextProps {\n /** The current thread */\n thread: TamboThread;\n /** Switch to a different thread */\n switchCurrentThread: (threadId: string, fetch?: boolean) => void;\n /** Start a new thread */\n startNewThread: () => void;\n /** Update a thread's name */\n updateThreadName: (name: string, threadId?: string) => void;\n /** Let Tambo generate and set a thread's name based on the thread's messages */\n generateThreadName: (threadId?: string) => Promise<Thread>;\n /** Add a message to the current thread */\n addThreadMessage: (\n message: TamboThreadMessage,\n sendToServer: boolean,\n ) => Promise<TamboAI.Beta.Threads.ThreadMessage[]>;\n /** Update a message in the current thread */\n updateThreadMessage: (\n id: string,\n message: TamboThreadMessage,\n sendToServer: boolean,\n ) => Promise<void>;\n /** Cancel a thread */\n cancel: (threadId?: string) => Promise<void>;\n /** Whether the thread is streaming */\n streaming: boolean;\n /** Send a message to the current thread */\n sendThreadMessage: (\n message: string,\n options?: {\n threadId?: string;\n streamResponse?: boolean;\n contextKey?: string;\n forceToolChoice?: string;\n additionalContext?: Record<string, any>;\n },\n ) => Promise<TamboThreadMessage>;\n}\n\n// Combined context interface that includes generation stage fields\nexport interface CombinedTamboThreadContextProps\n extends TamboThreadContextProps,\n TamboGenerationStageContextProps {}\n\n/**\n * This is a stub entry for when the thread is not yet created, the first time\n * the user sends a message\n *\n * Note that the consumer needs to be careful never to send `PLACEHOLDER_THREAD.id` to the server,\n * as this doesn't really exist on the server side.\n */\nexport const PLACEHOLDER_THREAD: TamboThread = {\n id: \"placeholder\",\n messages: [],\n createdAt: \"\",\n projectId: \"\",\n updatedAt: \"\",\n metadata: {},\n};\n\nexport const TamboThreadContext = createContext<TamboThreadContextProps>({\n thread: PLACEHOLDER_THREAD,\n /**\n *\n */\n switchCurrentThread: () => {\n throw new Error(\"switchCurrentThread not implemented\");\n },\n /**\n *\n */\n startNewThread: () => {\n throw new Error(\"startNewThread not implemented\");\n },\n /**\n *\n */\n updateThreadName: () => {\n throw new Error(\"updateThreadName not implemented\");\n },\n /**\n *\n */\n generateThreadName: () => {\n throw new Error(\"generateThreadName not implemented\");\n },\n /**\n *\n */\n addThreadMessage: () => {\n throw new Error(\"updateThreadMessageHistory not implemented\");\n },\n streaming: true,\n /**\n *\n */\n updateThreadMessage: () => {\n throw new Error(\"updateThreadMessage not implemented\");\n },\n /**\n *\n */\n sendThreadMessage: () => {\n throw new Error(\"sendThreadMessage not implemented\");\n },\n /**\n *\n */\n cancel: () => {\n throw new Error(\"cancel not implemented\");\n },\n});\n\nexport interface TamboThreadProviderProps {\n /** Whether to stream the response */\n streaming?: boolean;\n}\n\n/**\n * The TamboThreadProvider is a React provider that provides a thread context\n * to the descendants of the provider.\n * @param props - The props for the TamboThreadProvider\n * @param props.children - The children to wrap\n * @param props.streaming - Whether to stream the response by default. Defaults to true.\n * @returns The TamboThreadProvider component\n */\nexport const TamboThreadProvider: React.FC<\n PropsWithChildren<TamboThreadProviderProps>\n> = ({ children, streaming = true }) => {\n const [threadMap, setThreadMap] = useState<Record<string, TamboThread>>({\n [PLACEHOLDER_THREAD.id]: PLACEHOLDER_THREAD,\n });\n const client = useTamboClient();\n const { componentList, toolRegistry, componentToolAssociations } =\n useTamboRegistry();\n const { getAdditionalContext } = useTamboContextHelpers();\n const [ignoreResponse, setIgnoreResponse] = useState(false);\n const ignoreResponseRef = useRef(ignoreResponse);\n const [currentThreadId, setCurrentThreadId] = useState<string>(\n PLACEHOLDER_THREAD.id,\n );\n const currentThread: TamboThread | undefined = threadMap[currentThreadId];\n\n // Generation stage props for GenerationStageProvider\n const currentGenerationStage =\n (currentThread?.generationStage as GenerationStage) ?? GenerationStage.IDLE;\n const currentStatusMessage = currentThread?.statusMessage ?? \"\";\n\n // Use existing messages from the current thread to avoid re-generating any components\n const currentMessageCache = useMemo(() => {\n const messageCache = new Map<string, TamboThreadMessage>();\n if (currentThread) {\n for (const message of currentThread.messages) {\n messageCache.set(message.id, message);\n }\n }\n return messageCache;\n }, [currentThread]);\n\n useEffect(() => {\n ignoreResponseRef.current = ignoreResponse;\n }, [ignoreResponse]);\n\n const fetchThread = useCallback(\n async (threadId: string, includeInternalMessages = true) => {\n const thread = await client.beta.threads.retrieve(threadId, {\n includeInternal: includeInternalMessages,\n });\n const threadWithRenderedComponents = {\n ...thread,\n messages: thread.messages.map((message) => {\n if (currentMessageCache.has(message.id)) {\n const renderedMessage = currentMessageCache.get(message.id);\n return {\n ...renderedMessage,\n ...message,\n };\n }\n if (message.component?.componentName) {\n const messageWithComponent = renderComponentIntoMessage(\n message,\n componentList,\n );\n return messageWithComponent;\n }\n return message;\n }),\n };\n\n setThreadMap((prevMap) => {\n const updatedThreadMap = {\n ...prevMap,\n [threadId]: threadWithRenderedComponents,\n };\n return updatedThreadMap;\n });\n },\n [client.beta.threads, componentList, currentMessageCache],\n );\n\n useEffect(() => {\n if (\n currentThreadId &&\n currentThreadId !== PLACEHOLDER_THREAD.id &&\n !threadMap[currentThreadId]\n ) {\n fetchThread(currentThreadId);\n }\n }, [currentThreadId, fetchThread, threadMap]);\n\n const addThreadMessage = useCallback(\n async (\n message: TamboThreadMessage,\n sendToServer = true,\n createdAt: string = new Date().toISOString(),\n ) => {\n if (!currentThread) {\n console.warn(\"Cannot add messages if we do not have a current thread\");\n return [];\n }\n\n const chatMessage: TamboThreadMessage = {\n ...message,\n createdAt,\n };\n const threadId = message.threadId;\n const messageId = chatMessage.id;\n // optimistically update the thread in the local state\n setThreadMap((prevMap) => {\n if (!threadId) {\n return prevMap;\n }\n const prevMessages = prevMap[threadId]?.messages || [];\n const haveMessage = prevMessages.find((msg) => msg.id === messageId);\n // Update in place if the message already exists\n const updatedMessages = haveMessage\n ? prevMessages.map((msg) => {\n if (msg.id === messageId) {\n return chatMessage;\n }\n return msg;\n })\n : [...prevMessages, chatMessage];\n\n const updatedThreadMap = {\n ...prevMap,\n [threadId]: {\n ...prevMap[threadId],\n messages: updatedMessages,\n },\n };\n return updatedThreadMap;\n });\n\n if (sendToServer) {\n // TODO: if this fails, we need to revert the local state update\n await client.beta.threads.messages.create(message.threadId, {\n content: message.content,\n role: message.role,\n additionalContext: chatMessage.additionalContext,\n });\n }\n return threadMap[threadId]?.messages || [];\n },\n [client.beta.threads.messages, currentThread, threadMap],\n );\n\n const updateThreadMessage = useCallback(\n async (\n id: string,\n message: TamboThreadMessage,\n sendToServer = true,\n createdAt: string = new Date().toISOString(),\n ) => {\n const chatMessage: TamboThreadMessage = {\n ...message,\n createdAt,\n };\n\n setThreadMap((prevMap) => {\n if (!message.threadId) {\n return prevMap;\n }\n const prevMessages = prevMap[message.threadId]?.messages || [];\n const updatedMessages = prevMessages.map((msg) => {\n if (msg.id === id) {\n return chatMessage;\n }\n return msg;\n });\n return {\n ...prevMap,\n [message.threadId]: {\n ...prevMap[message.threadId],\n messages: updatedMessages,\n },\n };\n });\n if (sendToServer) {\n // TODO: if this fails, we need to revert the local state update\n await client.beta.threads.messages.create(message.threadId, {\n content: message.content,\n role: message.role,\n additionalContext: chatMessage.additionalContext,\n });\n }\n },\n [client.beta.threads.messages],\n );\n\n const startNewThread = useCallback(() => {\n setCurrentThreadId(PLACEHOLDER_THREAD.id);\n setThreadMap((prevMap) => {\n return {\n ...prevMap,\n [PLACEHOLDER_THREAD.id]: PLACEHOLDER_THREAD,\n };\n });\n }, []);\n\n const updateThreadName = useCallback(\n async (name: string, threadId?: string) => {\n threadId ??= currentThreadId;\n\n setThreadMap((prevMap) => {\n if (!prevMap[threadId]) {\n return prevMap;\n }\n return { ...prevMap, [threadId]: { ...prevMap[threadId], name } };\n });\n\n if (threadId !== PLACEHOLDER_THREAD.id) {\n const currentProject = await client.beta.projects.getCurrent();\n await client.beta.threads.update(threadId, {\n name,\n projectId: currentProject.id,\n });\n }\n },\n [currentThreadId, client.beta.projects, client.beta.threads],\n );\n\n const generateThreadName = useCallback(\n async (threadId?: string) => {\n threadId ??= currentThreadId;\n if (threadId === PLACEHOLDER_THREAD.id) {\n console.warn(\"Cannot generate name for empty thread\");\n return threadMap[threadId];\n }\n\n const threadWithGeneratedName =\n await client.beta.threads.generateName(threadId);\n\n setThreadMap((prevMap) => {\n if (!prevMap[threadId]) {\n return prevMap;\n }\n return {\n ...prevMap,\n [threadId]: {\n ...prevMap[threadId],\n name: threadWithGeneratedName.name,\n },\n };\n });\n return threadWithGeneratedName;\n },\n [client.beta.threads, currentThreadId, threadMap],\n );\n\n const switchCurrentThread = useCallback(\n async (threadId: string, fetch = true) => {\n if (threadId === PLACEHOLDER_THREAD.id) {\n console.warn(\"Switching to placeholder thread, may be a bug.\");\n return;\n }\n setCurrentThreadId(threadId);\n setThreadMap((prevMap) => {\n if (prevMap[threadId]) {\n return prevMap;\n }\n // If this is a new thread, add placeholder thread messages to the thread\n const updatedThreadMap = {\n ...prevMap,\n [threadId]: {\n ...prevMap[PLACEHOLDER_THREAD.id],\n id: threadId,\n },\n };\n return updatedThreadMap;\n });\n if (fetch) {\n await fetchThread(threadId);\n }\n },\n [fetchThread],\n );\n\n const updateThreadStatus = useCallback(\n (threadId: string, stage: GenerationStage, statusMessage?: string) => {\n setThreadMap((prevMap) => {\n const updatedThreadMap = {\n ...prevMap,\n [threadId]: {\n ...prevMap[threadId],\n generationStage: stage,\n statusMessage: statusMessage,\n },\n };\n return updatedThreadMap;\n });\n },\n [],\n );\n\n const cancel = useCallback(\n async (threadId?: string) => {\n threadId ??= currentThreadId;\n const currentGenerationStage =\n currentThread?.generationStage ?? GenerationStage.IDLE;\n if (isIdleStage(currentGenerationStage as GenerationStage)) {\n return;\n }\n setIgnoreResponse(true);\n setThreadMap((prevMap) => {\n if (!prevMap[threadId]) {\n return prevMap;\n }\n\n return {\n ...prevMap,\n [threadId]: {\n ...prevMap[threadId],\n generationStage: GenerationStage.CANCELLED,\n messages: prevMap[threadId].messages.map((message) => {\n if (\n message.id ===\n prevMap[threadId].messages[\n prevMap[threadId].messages.length - 1\n ].id\n ) {\n return {\n ...message,\n isCancelled: true,\n };\n }\n return message;\n }),\n },\n };\n });\n\n await client.beta.threads.cancel(threadId);\n },\n [client.beta.threads, currentThreadId, currentThread?.generationStage],\n );\n\n const handleAdvanceStream = useCallback(\n async (\n stream: AsyncIterable<TamboAI.Beta.Threads.ThreadAdvanceResponse>,\n params: TamboAI.Beta.Threads.ThreadAdvanceParams,\n threadId: string,\n ): Promise<TamboThreadMessage> => {\n if (ignoreResponseRef.current) {\n setIgnoreResponse(false);\n return {\n threadId: threadId,\n content: [{ type: \"text\", text: \"\" }],\n role: \"assistant\",\n createdAt: new Date().toISOString(),\n id: crypto.randomUUID(),\n componentState: {},\n };\n }\n let finalMessage: Readonly<TamboThreadMessage> | undefined;\n let hasSetThreadId = false;\n updateThreadStatus(threadId, GenerationStage.STREAMING_RESPONSE);\n\n for await (const chunk of stream) {\n if (chunk.responseMessageDto.toolCallRequest) {\n // Increment tool call count for this tool\n const toolName = chunk.responseMessageDto.toolCallRequest.toolName;\n if (toolName && params.toolCallCounts) {\n params.toolCallCounts[toolName] =\n (params.toolCallCounts[toolName] ?? 0) + 1;\n }\n\n updateThreadStatus(\n chunk.responseMessageDto.threadId,\n GenerationStage.FETCHING_CONTEXT,\n );\n\n updateThreadMessage(\n chunk.responseMessageDto.id,\n {\n ...chunk.responseMessageDto,\n },\n false,\n );\n\n const toolCallResponse = await handleToolCall(\n chunk.responseMessageDto,\n toolRegistry,\n );\n if (ignoreResponseRef.current) {\n setIgnoreResponse(false);\n {\n return {\n threadId: threadId,\n content: [{ type: \"text\", text: \"\" }],\n role: \"assistant\",\n createdAt: new Date().toISOString(),\n id: crypto.randomUUID(),\n componentState: {},\n };\n }\n }\n const toolCallResponseString =\n typeof toolCallResponse.result === \"string\"\n ? toolCallResponse.result\n : JSON.stringify(toolCallResponse.result);\n const toolCallResponseParams: TamboAI.Beta.Threads.ThreadAdvanceParams =\n {\n ...params,\n messageToAppend: {\n content: [{ type: \"text\", text: toolCallResponseString }],\n role: \"tool\",\n actionType: \"tool_response\",\n component: chunk.responseMessageDto.component,\n tool_call_id: chunk.responseMessageDto.tool_call_id,\n error: toolCallResponse.error,\n },\n };\n\n updateThreadMessage(\n chunk.responseMessageDto.id,\n {\n ...chunk.responseMessageDto,\n error: toolCallResponse.error,\n },\n false,\n );\n\n addThreadMessage(\n {\n threadId: chunk.responseMessageDto.threadId,\n content: [{ type: \"text\", text: toolCallResponseString }],\n role: \"tool\",\n id: crypto.randomUUID(),\n createdAt: new Date().toISOString(),\n componentState: {},\n actionType: \"tool_response\",\n tool_call_id: chunk.responseMessageDto.tool_call_id,\n error: toolCallResponse.error,\n },\n false,\n );\n\n updateThreadStatus(\n chunk.responseMessageDto.threadId,\n GenerationStage.STREAMING_RESPONSE,\n );\n const toolCallResponseStream = await advanceStream(\n client,\n toolCallResponseParams,\n chunk.responseMessageDto.threadId,\n );\n\n return await handleAdvanceStream(\n toolCallResponseStream,\n toolCallResponseParams,\n chunk.responseMessageDto.threadId,\n );\n } else {\n if (ignoreResponseRef.current) {\n setIgnoreResponse(false);\n return (\n finalMessage ?? {\n threadId: threadId,\n content: [{ type: \"text\", text: \"\" }],\n role: \"assistant\",\n createdAt: new Date().toISOString(),\n id: crypto.randomUUID(),\n componentState: {},\n }\n );\n }\n if (\n !hasSetThreadId &&\n chunk.responseMessageDto.threadId &&\n chunk.responseMessageDto.threadId !== currentThread?.id\n ) {\n hasSetThreadId = true;\n await switchCurrentThread(chunk.responseMessageDto.threadId, false);\n }\n\n if (!finalMessage) {\n finalMessage = chunk.responseMessageDto.component?.componentName\n ? renderComponentIntoMessage(\n chunk.responseMessageDto,\n componentList,\n )\n : chunk.responseMessageDto;\n await addThreadMessage(finalMessage, false);\n } else {\n // if we start getting a new message mid-stream, put the previous one on screen\n const isNewMessage =\n chunk.responseMessageDto.id !== finalMessage.id;\n\n finalMessage = chunk.responseMessageDto.component?.componentName\n ? renderComponentIntoMessage(\n chunk.responseMessageDto,\n componentList,\n )\n : chunk.responseMessageDto;\n\n if (isNewMessage) {\n await addThreadMessage(finalMessage, false);\n } else {\n await updateThreadMessage(finalMessage.id, finalMessage, false);\n }\n }\n }\n }\n\n updateThreadStatus(\n finalMessage?.threadId ?? threadId,\n GenerationStage.COMPLETE,\n );\n return (\n finalMessage ?? {\n threadId: \"\",\n content: [{ type: \"text\", text: `Error processing stream` }],\n role: \"assistant\",\n createdAt: new Date().toISOString(),\n id: crypto.randomUUID(),\n componentState: {},\n }\n );\n },\n [\n addThreadMessage,\n client,\n componentList,\n currentThread?.id,\n switchCurrentThread,\n toolRegistry,\n updateThreadMessage,\n updateThreadStatus,\n ],\n );\n\n const currentThreadContextKey = currentThread?.contextKey;\n\n const sendThreadMessage = useCallback(\n async (\n message: string,\n options: {\n threadId?: string;\n streamResponse?: boolean;\n forceToolChoice?: string;\n contextKey?: string;\n additionalContext?: Record<string, any>;\n } = {},\n ): Promise<TamboThreadMessage> => {\n setIgnoreResponse(false);\n const {\n threadId = currentThreadId ?? PLACEHOLDER_THREAD.id,\n streamResponse = streaming,\n forceToolChoice,\n contextKey = currentThreadContextKey,\n additionalContext,\n } = options;\n updateThreadStatus(threadId, GenerationStage.FETCHING_CONTEXT);\n\n // Get additional context from enabled helpers\n const helperContexts = await getAdditionalContext();\n\n // Combine all contexts\n const combinedContext: Record<string, any> = {\n ...(additionalContext ?? {}),\n };\n\n // Add helper contexts to combinedContext\n for (const helperContext of helperContexts) {\n combinedContext[helperContext.name] = helperContext.context;\n }\n\n addThreadMessage(\n {\n content: [{ type: \"text\", text: message }],\n renderedComponent: null,\n role: \"user\",\n threadId: threadId,\n id: crypto.randomUUID(),\n createdAt: new Date().toISOString(),\n componentState: {},\n additionalContext: combinedContext,\n },\n false,\n );\n\n const availableComponents = getAvailableComponents(\n componentList,\n toolRegistry,\n componentToolAssociations,\n );\n const unassociatedTools = getUnassociatedTools(\n toolRegistry,\n componentToolAssociations,\n );\n\n // Track tool call counts for this message processing\n const toolCallCounts: Record<string, number> = {};\n\n const params: TamboAI.Beta.Threads.ThreadAdvanceParams = {\n messageToAppend: {\n content: [{ type: \"text\", text: message }],\n role: \"user\",\n additionalContext: combinedContext,\n },\n contextKey,\n availableComponents: availableComponents,\n clientTools: unassociatedTools.map((tool) =>\n mapTamboToolToContextTool(tool),\n ),\n forceToolChoice: forceToolChoice,\n toolCallCounts,\n };\n\n if (streamResponse) {\n let advanceStreamResponse: AsyncIterable<TamboAI.Beta.Threads.ThreadAdvanceResponse>;\n try {\n advanceStreamResponse = await advanceStream(\n client,\n params,\n threadId === PLACEHOLDER_THREAD.id ? undefined : threadId,\n );\n } catch (error) {\n updateThreadStatus(threadId, GenerationStage.ERROR);\n throw error;\n }\n try {\n return await handleAdvanceStream(\n advanceStreamResponse,\n params,\n threadId,\n );\n } catch (error) {\n updateThreadStatus(threadId, GenerationStage.ERROR);\n throw error;\n }\n }\n\n let advanceResponse: TamboAI.Beta.Threads.ThreadAdvanceResponse;\n try {\n advanceResponse = await (threadId === PLACEHOLDER_THREAD.id\n ? client.beta.threads.advance(params)\n : client.beta.threads.advanceById(threadId, params));\n } catch (error) {\n updateThreadStatus(threadId, GenerationStage.ERROR);\n throw error;\n }\n\n //handle tool calls\n try {\n while (advanceResponse.responseMessageDto.toolCallRequest) {\n // Increment tool call count for this tool\n const toolName =\n advanceResponse.responseMessageDto.toolCallRequest.toolName;\n if (toolName) {\n toolCallCounts[toolName] = (toolCallCounts[toolName] || 0) + 1;\n }\n\n updateThreadStatus(threadId, GenerationStage.FETCHING_CONTEXT);\n const toolCallResponse = await handleToolCall(\n advanceResponse.responseMessageDto,\n toolRegistry,\n );\n const toolResponseString =\n typeof toolCallResponse.result === \"string\"\n ? toolCallResponse.result\n : JSON.stringify(toolCallResponse.result);\n const toolCallResponseParams: TamboAI.Beta.Threads.ThreadAdvanceParams =\n {\n ...params,\n messageToAppend: {\n ...params.messageToAppend,\n content: [{ type: \"text\", text: toolResponseString }],\n role: \"tool\",\n actionType: \"tool_response\",\n component: advanceResponse.responseMessageDto.component,\n tool_call_id: advanceResponse.responseMessageDto.tool_call_id,\n error: toolCallResponse.error,\n },\n };\n if (toolCallResponse.error) {\n //update toolcall message with error\n const toolCallMessage = {\n ...advanceResponse.responseMessageDto,\n error: toolCallResponse.error,\n };\n updateThreadMessage(toolCallMessage.id, toolCallMessage, false);\n }\n updateThreadStatus(threadId, GenerationStage.HYDRATING_COMPONENT);\n addThreadMessage(\n {\n threadId: threadId,\n content: [{ type: \"text\", text: toolResponseString }],\n role: \"tool\",\n id: crypto.randomUUID(),\n createdAt: new Date().toISOString(),\n componentState: {},\n actionType: \"tool_response\",\n tool_call_id: advanceResponse.responseMessageDto.tool_call_id,\n error: toolCallResponse.error,\n },\n false,\n );\n\n advanceResponse = await client.beta.threads.advanceById(\n advanceResponse.responseMessageDto.threadId,\n toolCallResponseParams,\n );\n }\n } catch (error) {\n updateThreadStatus(\n advanceResponse.responseMessageDto.threadId,\n GenerationStage.ERROR,\n );\n throw error;\n }\n\n const finalMessage = advanceResponse.responseMessageDto.component\n ?.componentName\n ? renderComponentIntoMessage(\n advanceResponse.responseMessageDto,\n componentList,\n )\n : advanceResponse.responseMessageDto;\n await switchCurrentThread(advanceResponse.responseMessageDto.threadId);\n updateThreadStatus(\n advanceResponse.responseMessageDto.threadId,\n GenerationStage.COMPLETE,\n );\n return finalMessage;\n },\n [\n componentList,\n toolRegistry,\n componentToolAssociations,\n currentThreadId,\n currentThreadContextKey,\n switchCurrentThread,\n addThreadMessage,\n client,\n updateThreadMessage,\n updateThreadStatus,\n handleAdvanceStream,\n streaming,\n getAdditionalContext,\n ],\n );\n\n return (\n <TamboThreadContext.Provider\n value={{\n thread: currentThread,\n switchCurrentThread,\n startNewThread,\n updateThreadName,\n generateThreadName,\n addThreadMessage,\n updateThreadMessage,\n streaming,\n cancel,\n sendThreadMessage,\n }}\n >\n <TamboGenerationStageProvider\n generationStage={currentGenerationStage}\n statusMessage={currentStatusMessage}\n >\n {children}\n </TamboGenerationStageProvider>\n </TamboThreadContext.Provider>\n );\n};\n\n/**\n * The useTamboGenerationStage hook provides access to the generation stage context\n * to the descendants of the TamboThreadProvider.\n * @returns The generation stage context\n */\nexport const useTamboGenerationStage = (): TamboGenerationStageContextProps => {\n const generationStageContext = useContext(TamboGenerationStageContext);\n\n if (generationStageContext === undefined) {\n throw new Error(\n \"useTamboGenerationStage must be used within a TamboThreadProvider\",\n );\n }\n\n return generationStageContext;\n};\n\n/**\n * The useTamboThread hook provides access to the current thread context\n * to the descendants of the TamboThreadProvider.\n * @returns All state and actions for the current thread\n */\nexport const useTamboThread = (): CombinedTamboThreadContextProps => {\n const threadContext = useContext(TamboThreadContext);\n const generationStageContext = useContext(TamboGenerationStageContext);\n\n if (threadContext === undefined) {\n throw new Error(\"useTamboThread must be used within a TamboThreadProvider\");\n }\n\n if (generationStageContext === undefined) {\n throw new Error(\"useTamboThread must be used within a TamboThreadProvider\");\n }\n\n return {\n ...threadContext,\n ...generationStageContext,\n };\n};\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"generate-component.d.ts","sourceRoot":"","sources":["../../src/util/generate-component.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,0BAA0B,CAAC;AAK/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,EAAE,kBAAkB,EAAE,MAAM,sCAAsC,CAAC;AAG1E;;;;;;GAMG;AACH,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,EAC3C,aAAa,EAAE,iBAAiB,GAC/B,kBAAkB,CAiCpB"}
1
+ {"version":3,"file":"generate-component.d.ts","sourceRoot":"","sources":["../../src/util/generate-component.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,0BAA0B,CAAC;AAK/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,EAAE,kBAAkB,EAAE,MAAM,sCAAsC,CAAC;AAG1E;;;;;;GAMG;AACH,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,EAC3C,aAAa,EAAE,iBAAiB,GAC/B,kBAAkB,CAsCpB"}
@@ -26,13 +26,17 @@ function renderComponentIntoMessage(message, componentList) {
26
26
  ? registeredComponent.props.parse(parsedProps)
27
27
  : parsedProps;
28
28
  const renderedComponent = react_1.default.createElement(registeredComponent.component, validatedProps);
29
- const wrappedComponent = (0, use_current_message_1.wrapWithTamboMessageProvider)(renderedComponent, message.threadId, message.id);
30
- return {
29
+ // Create the full message object first so we can pass it to the provider
30
+ const fullMessage = {
31
31
  ...message,
32
32
  component: {
33
33
  ...message.component,
34
34
  props: validatedProps,
35
35
  },
36
+ };
37
+ const wrappedComponent = (0, use_current_message_1.wrapWithTamboMessageProvider)(renderedComponent, fullMessage);
38
+ return {
39
+ ...fullMessage,
36
40
  renderedComponent: wrappedComponent,
37
41
  };
38
42
  }
@@ -1 +1 @@
1
- {"version":3,"file":"generate-component.js","sourceRoot":"","sources":["../../src/util/generate-component.ts"],"names":[],"mappings":";;;;;AAgBA,gEAoCC;AAnDD,+CAAqC;AACrC,kDAA0B;AAC1B,6BAAwB;AACxB,sEAA4E;AAG5E,+CAA4D;AAE5D;;;;;;GAMG;AACH,SAAgB,0BAA0B,CACxC,OAA2C,EAC3C,aAAgC;IAEhC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,aAAa,EAAE,CAAC;QACtC,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;IACzC,CAAC;IACD,MAAM,WAAW,GAAG,IAAA,oBAAK,EAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;IACnE,MAAM,mBAAmB,GAAG,IAAA,mCAAwB,EAClD,OAAO,CAAC,SAAS,CAAC,aAAa,EAC/B,aAAa,CACd,CAAC;IAEF,MAAM,cAAc,GAClB,mBAAmB,CAAC,KAAK,YAAY,OAAC,CAAC,OAAO;QAC5C,CAAC,CAAC,mBAAmB,CAAC,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC;QAC9C,CAAC,CAAC,WAAW,CAAC;IAElB,MAAM,iBAAiB,GAAG,eAAK,CAAC,aAAa,CAC3C,mBAAmB,CAAC,SAAS,EAC7B,cAAc,CACf,CAAC;IACF,MAAM,gBAAgB,GAAG,IAAA,kDAA4B,EACnD,iBAAiB,EACjB,OAAO,CAAC,QAAQ,EAChB,OAAO,CAAC,EAAE,CACX,CAAC;IAEF,OAAO;QACL,GAAG,OAAO;QACV,SAAS,EAAE;YACT,GAAG,OAAO,CAAC,SAAS;YACpB,KAAK,EAAE,cAAc;SACtB;QACD,iBAAiB,EAAE,gBAAgB;KACpC,CAAC;AACJ,CAAC","sourcesContent":["import TamboAI from \"@tambo-ai/typescript-sdk\";\nimport { parse } from \"partial-json\";\nimport React from \"react\";\nimport { z } from \"zod\";\nimport { wrapWithTamboMessageProvider } from \"../hooks/use-current-message\";\nimport { ComponentRegistry } from \"../model/component-metadata\";\nimport { TamboThreadMessage } from \"../model/generate-component-response\";\nimport { getComponentFromRegistry } from \"../util/registry\";\n\n/**\n * Generate a message that has a component rendered into it, if the message\n * came with one.\n * @param message - The message that may contain a component\n * @param componentList - the list of available components\n * @returns The updated message with the component rendered into it\n */\nexport function renderComponentIntoMessage(\n message: TamboAI.Beta.Threads.ThreadMessage,\n componentList: ComponentRegistry,\n): TamboThreadMessage {\n if (!message.component?.componentName) {\n throw new Error(\"Component not found\");\n }\n const parsedProps = parse(JSON.stringify(message.component.props));\n const registeredComponent = getComponentFromRegistry(\n message.component.componentName,\n componentList,\n );\n\n const validatedProps =\n registeredComponent.props instanceof z.ZodType\n ? registeredComponent.props.parse(parsedProps)\n : parsedProps;\n\n const renderedComponent = React.createElement(\n registeredComponent.component,\n validatedProps,\n );\n const wrappedComponent = wrapWithTamboMessageProvider(\n renderedComponent,\n message.threadId,\n message.id,\n );\n\n return {\n ...message,\n component: {\n ...message.component,\n props: validatedProps,\n },\n renderedComponent: wrappedComponent,\n };\n}\n"]}
1
+ {"version":3,"file":"generate-component.js","sourceRoot":"","sources":["../../src/util/generate-component.ts"],"names":[],"mappings":";;;;;AAgBA,gEAyCC;AAxDD,+CAAqC;AACrC,kDAA0B;AAC1B,6BAAwB;AACxB,sEAA4E;AAG5E,+CAA4D;AAE5D;;;;;;GAMG;AACH,SAAgB,0BAA0B,CACxC,OAA2C,EAC3C,aAAgC;IAEhC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,aAAa,EAAE,CAAC;QACtC,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;IACzC,CAAC;IACD,MAAM,WAAW,GAAG,IAAA,oBAAK,EAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;IACnE,MAAM,mBAAmB,GAAG,IAAA,mCAAwB,EAClD,OAAO,CAAC,SAAS,CAAC,aAAa,EAC/B,aAAa,CACd,CAAC;IAEF,MAAM,cAAc,GAClB,mBAAmB,CAAC,KAAK,YAAY,OAAC,CAAC,OAAO;QAC5C,CAAC,CAAC,mBAAmB,CAAC,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC;QAC9C,CAAC,CAAC,WAAW,CAAC;IAElB,MAAM,iBAAiB,GAAG,eAAK,CAAC,aAAa,CAC3C,mBAAmB,CAAC,SAAS,EAC7B,cAAc,CACf,CAAC;IAEF,yEAAyE;IACzE,MAAM,WAAW,GAAuB;QACtC,GAAG,OAAO;QACV,SAAS,EAAE;YACT,GAAG,OAAO,CAAC,SAAS;YACpB,KAAK,EAAE,cAAc;SACtB;KACF,CAAC;IAEF,MAAM,gBAAgB,GAAG,IAAA,kDAA4B,EACnD,iBAAiB,EACjB,WAAW,CACZ,CAAC;IAEF,OAAO;QACL,GAAG,WAAW;QACd,iBAAiB,EAAE,gBAAgB;KACpC,CAAC;AACJ,CAAC","sourcesContent":["import TamboAI from \"@tambo-ai/typescript-sdk\";\nimport { parse } from \"partial-json\";\nimport React from \"react\";\nimport { z } from \"zod\";\nimport { wrapWithTamboMessageProvider } from \"../hooks/use-current-message\";\nimport { ComponentRegistry } from \"../model/component-metadata\";\nimport { TamboThreadMessage } from \"../model/generate-component-response\";\nimport { getComponentFromRegistry } from \"../util/registry\";\n\n/**\n * Generate a message that has a component rendered into it, if the message\n * came with one.\n * @param message - The message that may contain a component\n * @param componentList - the list of available components\n * @returns The updated message with the component rendered into it\n */\nexport function renderComponentIntoMessage(\n message: TamboAI.Beta.Threads.ThreadMessage,\n componentList: ComponentRegistry,\n): TamboThreadMessage {\n if (!message.component?.componentName) {\n throw new Error(\"Component not found\");\n }\n const parsedProps = parse(JSON.stringify(message.component.props));\n const registeredComponent = getComponentFromRegistry(\n message.component.componentName,\n componentList,\n );\n\n const validatedProps =\n registeredComponent.props instanceof z.ZodType\n ? registeredComponent.props.parse(parsedProps)\n : parsedProps;\n\n const renderedComponent = React.createElement(\n registeredComponent.component,\n validatedProps,\n );\n\n // Create the full message object first so we can pass it to the provider\n const fullMessage: TamboThreadMessage = {\n ...message,\n component: {\n ...message.component,\n props: validatedProps,\n },\n };\n\n const wrappedComponent = wrapWithTamboMessageProvider(\n renderedComponent,\n fullMessage,\n );\n\n return {\n ...fullMessage,\n renderedComponent: wrappedComponent,\n };\n}\n"]}