@tambo-ai/react 0.12.0 → 0.12.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 (137) hide show
  1. package/dist/hooks/__tests__/use-suggestions.test.d.ts +1 -0
  2. package/dist/hooks/__tests__/use-suggestions.test.d.ts.map +1 -0
  3. package/dist/hooks/react-query-hooks.d.ts +1 -0
  4. package/dist/hooks/react-query-hooks.d.ts.map +1 -0
  5. package/dist/hooks/use-component-state.d.ts +1 -0
  6. package/dist/hooks/use-component-state.d.ts.map +1 -0
  7. package/dist/hooks/use-current-message.d.ts +1 -0
  8. package/dist/hooks/use-current-message.d.ts.map +1 -0
  9. package/dist/hooks/use-suggestions.d.ts +1 -0
  10. package/dist/hooks/use-suggestions.d.ts.map +1 -0
  11. package/dist/hooks/use-suggestions.js +2 -2
  12. package/dist/hooks/use-suggestions.js.map +1 -1
  13. package/dist/hooks/use-tambo-threads.d.ts +1 -0
  14. package/dist/hooks/use-tambo-threads.d.ts.map +1 -0
  15. package/dist/hooks/use-thread-input.d.ts +3 -0
  16. package/dist/hooks/use-thread-input.d.ts.map +1 -0
  17. package/dist/hooks/use-thread-input.js +2 -1
  18. package/dist/hooks/use-thread-input.js.map +1 -1
  19. package/dist/index.d.ts +4 -3
  20. package/dist/index.d.ts.map +1 -0
  21. package/dist/index.js.map +1 -1
  22. package/dist/model/component-metadata.d.ts +1 -0
  23. package/dist/model/component-metadata.d.ts.map +1 -0
  24. package/dist/model/generate-component-response.d.ts +1 -0
  25. package/dist/model/generate-component-response.d.ts.map +1 -0
  26. package/dist/model/tambo-thread.d.ts +1 -0
  27. package/dist/model/tambo-thread.d.ts.map +1 -0
  28. package/dist/model/thread-input-error.d.ts +1 -0
  29. package/dist/model/thread-input-error.d.ts.map +1 -0
  30. package/dist/model/validate-input.d.ts +1 -0
  31. package/dist/model/validate-input.d.ts.map +1 -0
  32. package/dist/providers/index.d.ts +2 -1
  33. package/dist/providers/index.d.ts.map +1 -0
  34. package/dist/providers/index.js.map +1 -1
  35. package/dist/providers/tambo-client-provider.d.ts +1 -0
  36. package/dist/providers/tambo-client-provider.d.ts.map +1 -0
  37. package/dist/providers/tambo-component-provider.d.ts +1 -7
  38. package/dist/providers/tambo-component-provider.d.ts.map +1 -0
  39. package/dist/providers/tambo-component-provider.js +1 -66
  40. package/dist/providers/tambo-component-provider.js.map +1 -1
  41. package/dist/providers/tambo-provider.d.ts +1 -0
  42. package/dist/providers/tambo-provider.d.ts.map +1 -0
  43. package/dist/providers/tambo-registry-provider.d.ts +1 -0
  44. package/dist/providers/tambo-registry-provider.d.ts.map +1 -0
  45. package/dist/providers/tambo-thread-provider.d.ts +4 -0
  46. package/dist/providers/tambo-thread-provider.d.ts.map +1 -0
  47. package/dist/providers/tambo-thread-provider.js +14 -3
  48. package/dist/providers/tambo-thread-provider.js.map +1 -1
  49. package/dist/util/generate-component.d.ts +3 -3
  50. package/dist/util/generate-component.d.ts.map +1 -0
  51. package/dist/util/generate-component.js +0 -174
  52. package/dist/util/generate-component.js.map +1 -1
  53. package/dist/util/messages.d.ts +1 -0
  54. package/dist/util/messages.d.ts.map +1 -0
  55. package/dist/util/query-utils.d.ts +1 -0
  56. package/dist/util/query-utils.d.ts.map +1 -0
  57. package/dist/util/registry.d.ts +1 -0
  58. package/dist/util/registry.d.ts.map +1 -0
  59. package/dist/util/tool-caller.d.ts +1 -0
  60. package/dist/util/tool-caller.d.ts.map +1 -0
  61. package/dist/util/tool-caller.js +1 -1
  62. package/dist/util/tool-caller.js.map +1 -1
  63. package/esm/hooks/__tests__/use-suggestions.test.d.ts +1 -0
  64. package/esm/hooks/__tests__/use-suggestions.test.d.ts.map +1 -0
  65. package/esm/hooks/react-query-hooks.d.ts +1 -0
  66. package/esm/hooks/react-query-hooks.d.ts.map +1 -0
  67. package/esm/hooks/use-component-state.d.ts +1 -0
  68. package/esm/hooks/use-component-state.d.ts.map +1 -0
  69. package/esm/hooks/use-current-message.d.ts +1 -0
  70. package/esm/hooks/use-current-message.d.ts.map +1 -0
  71. package/esm/hooks/use-suggestions.d.ts +1 -0
  72. package/esm/hooks/use-suggestions.d.ts.map +1 -0
  73. package/esm/hooks/use-suggestions.js +2 -2
  74. package/esm/hooks/use-suggestions.js.map +1 -1
  75. package/esm/hooks/use-tambo-threads.d.ts +1 -0
  76. package/esm/hooks/use-tambo-threads.d.ts.map +1 -0
  77. package/esm/hooks/use-thread-input.d.ts +3 -0
  78. package/esm/hooks/use-thread-input.d.ts.map +1 -0
  79. package/esm/hooks/use-thread-input.js +2 -1
  80. package/esm/hooks/use-thread-input.js.map +1 -1
  81. package/esm/index.d.ts +4 -3
  82. package/esm/index.d.ts.map +1 -0
  83. package/esm/index.js.map +1 -1
  84. package/esm/model/component-metadata.d.ts +1 -0
  85. package/esm/model/component-metadata.d.ts.map +1 -0
  86. package/esm/model/generate-component-response.d.ts +1 -0
  87. package/esm/model/generate-component-response.d.ts.map +1 -0
  88. package/esm/model/tambo-thread.d.ts +1 -0
  89. package/esm/model/tambo-thread.d.ts.map +1 -0
  90. package/esm/model/thread-input-error.d.ts +1 -0
  91. package/esm/model/thread-input-error.d.ts.map +1 -0
  92. package/esm/model/validate-input.d.ts +1 -0
  93. package/esm/model/validate-input.d.ts.map +1 -0
  94. package/esm/providers/index.d.ts +2 -1
  95. package/esm/providers/index.d.ts.map +1 -0
  96. package/esm/providers/index.js.map +1 -1
  97. package/esm/providers/tambo-client-provider.d.ts +1 -0
  98. package/esm/providers/tambo-client-provider.d.ts.map +1 -0
  99. package/esm/providers/tambo-component-provider.d.ts +1 -7
  100. package/esm/providers/tambo-component-provider.d.ts.map +1 -0
  101. package/esm/providers/tambo-component-provider.js +2 -67
  102. package/esm/providers/tambo-component-provider.js.map +1 -1
  103. package/esm/providers/tambo-provider.d.ts +1 -0
  104. package/esm/providers/tambo-provider.d.ts.map +1 -0
  105. package/esm/providers/tambo-registry-provider.d.ts +1 -0
  106. package/esm/providers/tambo-registry-provider.d.ts.map +1 -0
  107. package/esm/providers/tambo-thread-provider.d.ts +4 -0
  108. package/esm/providers/tambo-thread-provider.d.ts.map +1 -0
  109. package/esm/providers/tambo-thread-provider.js +15 -4
  110. package/esm/providers/tambo-thread-provider.js.map +1 -1
  111. package/esm/util/generate-component.d.ts +3 -3
  112. package/esm/util/generate-component.d.ts.map +1 -0
  113. package/esm/util/generate-component.js +1 -174
  114. package/esm/util/generate-component.js.map +1 -1
  115. package/esm/util/messages.d.ts +1 -0
  116. package/esm/util/messages.d.ts.map +1 -0
  117. package/esm/util/query-utils.d.ts +1 -0
  118. package/esm/util/query-utils.d.ts.map +1 -0
  119. package/esm/util/registry.d.ts +1 -0
  120. package/esm/util/registry.d.ts.map +1 -0
  121. package/esm/util/tool-caller.d.ts +1 -0
  122. package/esm/util/tool-caller.d.ts.map +1 -0
  123. package/esm/util/tool-caller.js +1 -1
  124. package/esm/util/tool-caller.js.map +1 -1
  125. package/package.json +7 -5
  126. package/dist/hooks/use-query-client.d.ts +0 -0
  127. package/dist/hooks/use-query-client.js +0 -2
  128. package/dist/hooks/use-query-client.js.map +0 -1
  129. package/dist/setupTests.d.ts +0 -1
  130. package/dist/setupTests.js +0 -20
  131. package/dist/setupTests.js.map +0 -1
  132. package/esm/hooks/use-query-client.d.ts +0 -0
  133. package/esm/hooks/use-query-client.js +0 -2
  134. package/esm/hooks/use-query-client.js.map +0 -1
  135. package/esm/setupTests.d.ts +0 -1
  136. package/esm/setupTests.js +0 -18
  137. package/esm/setupTests.js.map +0 -1
@@ -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 React, {\n createContext,\n PropsWithChildren,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useState,\n} from \"react\";\nimport {\n GenerationStage,\n TamboThreadMessage,\n} from \"../model/generate-component-response\";\nimport { TamboThread } from \"../model/tambo-thread\";\nimport { renderComponentIntoMessage } from \"../util/generate-component\";\nimport { getAvailableComponents, getClientContext } from \"../util/registry\";\nimport { handleToolCall } from \"../util/tool-caller\";\nimport { useTamboClient } from \"./tambo-client-provider\";\nimport { useTamboRegistry } from \"./tambo-registry-provider\";\n\nexport interface TamboThreadContextProps {\n thread: TamboThread;\n switchCurrentThread: (threadId: string) => void;\n addThreadMessage: (\n message: TamboThreadMessage,\n sendToServer: boolean,\n ) => Promise<TamboAI.Beta.Threads.ThreadMessage[]>;\n updateThreadMessage: (\n id: string,\n message: TamboThreadMessage,\n sendToServer: boolean,\n ) => Promise<void>;\n setLastThreadStatus: (status: GenerationStage) => void;\n inputValue: string;\n setInputValue: (value: string) => void;\n sendThreadMessage: (\n message: string,\n options?: {\n threadId?: string;\n streamResponse?: boolean;\n contextKey?: string;\n },\n ) => Promise<TamboThreadMessage>;\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 switchCurrentThread: () => {\n throw new Error(\"switchCurrentThread not implemented\");\n },\n addThreadMessage: () => {\n throw new Error(\"updateThreadMessageHistory not implemented\");\n },\n setLastThreadStatus: () => {\n throw new Error(\"setLastThreadStatus not implemented\");\n },\n inputValue: \"\",\n setInputValue: () => {\n throw new Error(\"setInputValue not implemented\");\n },\n updateThreadMessage: () => {\n throw new Error(\"updateThreadMessage not implemented\");\n },\n sendThreadMessage: () => {\n throw new Error(\"advance not implemented\");\n },\n});\n\nexport const TamboThreadProvider: React.FC<PropsWithChildren> = ({\n children,\n}) => {\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 [inputValue, setInputValue] = useState(\"\");\n\n const [currentThreadId, setCurrentThreadId] = useState<string>(\n PLACEHOLDER_THREAD.id,\n );\n const [unresolvedThreadId, setUnresolvedThreadId] = useState<\n string | undefined\n >(PLACEHOLDER_THREAD.id);\n const currentThread: TamboThread | undefined = threadMap[currentThreadId];\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 const fetchThread = useCallback(\n async (threadId: string) => {\n const thread = await client.beta.threads.retrieve(threadId);\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 ...prevMap,\n [threadId]: threadWithRenderedComponents,\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 const chatMessage: TamboThreadMessage & {\n additionalContext?: string;\n } = {\n ...message,\n additionalContext:\n message.role === \"user\" ? getClientContext() : undefined,\n createdAt,\n };\n const threadId = message.threadId;\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 return {\n ...prevMap,\n [threadId]: {\n ...prevMap[threadId],\n messages: [...prevMessages, chatMessage],\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(currentThreadId, {\n content: message.content,\n role: message.role,\n // additionalContext: chatMessage.additionalContext,\n });\n }\n const updatedMessageHistory = [...currentThread.messages, chatMessage];\n\n return updatedMessageHistory;\n },\n [client.beta.threads.messages, currentThread, currentThreadId],\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(currentThreadId, {\n content: message.content,\n role: message.role,\n // additionalContext: chatMessage.additionalContext,\n });\n }\n },\n [client.beta.threads.messages, currentThreadId],\n );\n\n useEffect(() => {\n if (unresolvedThreadId && currentThreadId !== unresolvedThreadId) {\n setThreadMap((prevMap) => {\n const unresolvedThread = prevMap[unresolvedThreadId];\n const currentThread = prevMap[currentThreadId];\n return {\n ...prevMap,\n [unresolvedThreadId]: PLACEHOLDER_THREAD,\n [currentThreadId]: {\n ...currentThread,\n id: currentThreadId,\n messages: [...unresolvedThread.messages, ...currentThread.messages],\n },\n };\n });\n setUnresolvedThreadId(undefined);\n }\n }, [currentThreadId, unresolvedThreadId]);\n\n const switchCurrentThread = useCallback(\n async (threadId: string) => {\n if (threadId === PLACEHOLDER_THREAD.id) {\n console.warn(\"Switching to placeholder thread, may be a bug\");\n return;\n }\n setCurrentThreadId(threadId);\n if (!threadMap[threadId]) {\n setThreadMap((prevMap) => ({\n ...prevMap,\n [threadId]: {\n ...PLACEHOLDER_THREAD,\n id: threadId,\n },\n }));\n }\n await fetchThread(threadId);\n },\n [fetchThread, threadMap],\n );\n\n const setLastThreadStatus = (status: GenerationStage) => {\n setThreadMap((prevMap) => {\n if (!currentThreadId) {\n return prevMap;\n }\n const headMessages = prevMap[currentThreadId].messages.slice(0, -1);\n const lastMessage =\n prevMap[currentThreadId].messages[\n prevMap[currentThreadId].messages.length - 1\n ];\n const updatedLastMessage = {\n ...lastMessage,\n status,\n };\n return {\n ...prevMap,\n [currentThreadId]: {\n ...prevMap[currentThreadId],\n messages: [...headMessages, updatedLastMessage],\n },\n };\n });\n };\n\n const updateThreadStatus = useCallback(\n (stage: GenerationStage) => {\n setThreadMap((prevMap) => {\n return {\n ...prevMap,\n [currentThreadId]: {\n ...prevMap[currentThreadId],\n generationStage: stage,\n },\n };\n });\n },\n [currentThreadId],\n );\n\n const handleAdvanceStream = useCallback(\n async (\n stream: AsyncIterable<TamboAI.Beta.Threads.ThreadAdvanceResponse>,\n params: TamboAI.Beta.Threads.ThreadAdvanceParams,\n ): Promise<TamboThreadMessage> => {\n let finalMessage: TamboThreadMessage | undefined;\n let hasSetThreadId = false;\n updateThreadStatus(GenerationStage.STREAMING_RESPONSE);\n for await (const chunk of stream) {\n if (chunk.responseMessageDto.toolCallRequest) {\n updateThreadStatus(GenerationStage.FETCHING_CONTEXT);\n const toolCallResponse = await handleToolCall(\n chunk.responseMessageDto,\n toolRegistry,\n );\n const toolCallResponseParams: TamboAI.Beta.Threads.ThreadAdvanceParams =\n {\n ...params,\n messageToAppend: {\n content: [{ type: \"text\", text: \"tool response\" }],\n role: \"tool\",\n actionType: \"tool_response\",\n toolResponse: toolCallResponse,\n component: chunk.responseMessageDto.component,\n },\n };\n updateThreadStatus(GenerationStage.STREAMING_RESPONSE);\n const toolCallResponseStream = await advanceStream(\n client,\n toolCallResponseParams,\n chunk.responseMessageDto.threadId,\n );\n return handleAdvanceStream(\n toolCallResponseStream,\n toolCallResponseParams,\n );\n } else {\n if (\n !hasSetThreadId &&\n chunk.responseMessageDto.threadId &&\n chunk.responseMessageDto.threadId !== currentThread?.id\n ) {\n hasSetThreadId = true;\n switchCurrentThread(chunk.responseMessageDto.threadId);\n }\n\n if (!finalMessage) {\n finalMessage = chunk.responseMessageDto.component?.componentName\n ? renderComponentIntoMessage(\n chunk.responseMessageDto,\n componentList,\n )\n : chunk.responseMessageDto;\n addThreadMessage(finalMessage, false);\n } else {\n const previousId = finalMessage.id;\n finalMessage = chunk.responseMessageDto.component?.componentName\n ? renderComponentIntoMessage(\n chunk.responseMessageDto,\n componentList,\n )\n : chunk.responseMessageDto;\n updateThreadMessage(previousId, finalMessage, false);\n }\n }\n }\n\n updateThreadStatus(GenerationStage.COMPLETE);\n return (\n finalMessage ?? {\n threadId: \"\",\n content: [{ type: \"text\", text: `Error processing stream` }],\n role: \"hydra\",\n createdAt: new Date().toISOString(),\n id: crypto.randomUUID(),\n }\n );\n },\n [\n toolRegistry,\n client,\n currentThread?.id,\n switchCurrentThread,\n componentList,\n addThreadMessage,\n updateThreadMessage,\n ],\n );\n\n const sendThreadMessage = useCallback(\n async (\n message: string,\n options: {\n threadId?: string;\n streamResponse?: boolean;\n contextKey?: string;\n } = {},\n ): Promise<TamboThreadMessage> => {\n const { threadId, streamResponse } = options;\n const currentThreadId = threadId ?? currentThread?.id;\n\n if (currentThreadId !== PLACEHOLDER_THREAD.id) {\n await switchCurrentThread(currentThreadId);\n }\n\n updateThreadStatus(GenerationStage.CHOOSING_COMPONENT);\n\n addThreadMessage(\n {\n content: [{ type: \"text\", text: message }],\n renderedComponent: null,\n role: \"user\",\n threadId: currentThread.id,\n id: crypto.randomUUID(),\n createdAt: new Date().toISOString(),\n },\n false,\n );\n\n const availableComponents = getAvailableComponents(\n componentList,\n toolRegistry,\n componentToolAssociations,\n );\n const params: TamboAI.Beta.Threads.ThreadAdvanceParams = {\n messageToAppend: {\n content: [{ type: \"text\", text: message }],\n role: \"user\",\n },\n contextKey: options.contextKey,\n availableComponents: availableComponents,\n };\n\n if (streamResponse) {\n const advanceStreamResponse = await advanceStream(\n client,\n params,\n currentThreadId === PLACEHOLDER_THREAD.id\n ? undefined\n : currentThreadId,\n );\n return handleAdvanceStream(advanceStreamResponse, params);\n }\n let advanceResponse = await (currentThreadId === PLACEHOLDER_THREAD.id\n ? client.beta.threads.advance(params)\n : client.beta.threads.advanceById(currentThreadId, params));\n\n //handle tool calls\n while (advanceResponse.responseMessageDto.toolCallRequest) {\n updateThreadStatus(GenerationStage.FETCHING_CONTEXT);\n const toolCallResponse = await handleToolCall(\n advanceResponse.responseMessageDto,\n toolRegistry,\n );\n const toolCallResponseParams: TamboAI.Beta.Threads.ThreadAdvanceParams =\n {\n ...params,\n messageToAppend: {\n ...params.messageToAppend,\n content: [{ type: \"text\", text: \"tool response\" }],\n role: \"tool\",\n actionType: \"tool_response\",\n toolResponse: toolCallResponse,\n component: advanceResponse.responseMessageDto.component,\n },\n };\n updateThreadStatus(GenerationStage.HYDRATING_COMPONENT);\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(GenerationStage.COMPLETE);\n return finalMessage;\n },\n [\n componentList,\n toolRegistry,\n componentToolAssociations,\n currentThread,\n switchCurrentThread,\n addThreadMessage,\n client,\n handleAdvanceStream,\n ],\n );\n\n return (\n <TamboThreadContext.Provider\n value={{\n thread: currentThread,\n switchCurrentThread,\n addThreadMessage,\n updateThreadMessage,\n setLastThreadStatus,\n inputValue,\n setInputValue,\n sendThreadMessage,\n }}\n >\n {children}\n </TamboThreadContext.Provider>\n );\n};\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 React, {\n createContext,\n PropsWithChildren,\n useCallback,\n useContext,\n useEffect,\n useMemo,\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 { getAvailableComponents, getClientContext } from \"../util/registry\";\nimport { handleToolCall } from \"../util/tool-caller\";\nimport { useTamboClient } from \"./tambo-client-provider\";\nimport { useTamboRegistry } from \"./tambo-registry-provider\";\n\nexport interface TamboThreadContextProps {\n thread: TamboThread;\n switchCurrentThread: (threadId: string) => void;\n addThreadMessage: (\n message: TamboThreadMessage,\n sendToServer: boolean,\n ) => Promise<TamboAI.Beta.Threads.ThreadMessage[]>;\n updateThreadMessage: (\n id: string,\n message: TamboThreadMessage,\n sendToServer: boolean,\n ) => Promise<void>;\n setLastThreadStatus: (status: GenerationStage) => void;\n inputValue: string;\n setInputValue: (value: string) => void;\n sendThreadMessage: (\n message: string,\n options?: {\n threadId?: string;\n streamResponse?: boolean;\n contextKey?: string;\n },\n ) => Promise<TamboThreadMessage>;\n generationStage: GenerationStage;\n generationStatusMessage: string;\n isIdle: boolean;\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 switchCurrentThread: () => {\n throw new Error(\"switchCurrentThread not implemented\");\n },\n addThreadMessage: () => {\n throw new Error(\"updateThreadMessageHistory not implemented\");\n },\n setLastThreadStatus: () => {\n throw new Error(\"setLastThreadStatus not implemented\");\n },\n inputValue: \"\",\n setInputValue: () => {\n throw new Error(\"setInputValue not implemented\");\n },\n updateThreadMessage: () => {\n throw new Error(\"updateThreadMessage not implemented\");\n },\n sendThreadMessage: () => {\n throw new Error(\"advance not implemented\");\n },\n generationStage: GenerationStage.IDLE,\n generationStatusMessage: \"\",\n isIdle: true,\n});\n\nexport const TamboThreadProvider: React.FC<PropsWithChildren> = ({\n children,\n}) => {\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 [inputValue, setInputValue] = useState(\"\");\n\n const [currentThreadId, setCurrentThreadId] = useState<string>(\n PLACEHOLDER_THREAD.id,\n );\n const [unresolvedThreadId, setUnresolvedThreadId] = useState<\n string | undefined\n >(PLACEHOLDER_THREAD.id);\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 const fetchThread = useCallback(\n async (threadId: string) => {\n const thread = await client.beta.threads.retrieve(threadId);\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 ...prevMap,\n [threadId]: threadWithRenderedComponents,\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 const chatMessage: TamboThreadMessage & {\n additionalContext?: string;\n } = {\n ...message,\n additionalContext:\n message.role === \"user\" ? getClientContext() : undefined,\n createdAt,\n };\n const threadId = message.threadId;\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 return {\n ...prevMap,\n [threadId]: {\n ...prevMap[threadId],\n messages: [...prevMessages, chatMessage],\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(currentThreadId, {\n content: message.content,\n role: message.role,\n // additionalContext: chatMessage.additionalContext,\n });\n }\n const updatedMessageHistory = [...currentThread.messages, chatMessage];\n\n return updatedMessageHistory;\n },\n [client.beta.threads.messages, currentThread, currentThreadId],\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(currentThreadId, {\n content: message.content,\n role: message.role,\n // additionalContext: chatMessage.additionalContext,\n });\n }\n },\n [client.beta.threads.messages, currentThreadId],\n );\n\n useEffect(() => {\n if (unresolvedThreadId && currentThreadId !== unresolvedThreadId) {\n setThreadMap((prevMap) => {\n const unresolvedThread = prevMap[unresolvedThreadId];\n const currentThread = prevMap[currentThreadId];\n return {\n ...prevMap,\n [unresolvedThreadId]: PLACEHOLDER_THREAD,\n [currentThreadId]: {\n ...currentThread,\n id: currentThreadId,\n messages: [...unresolvedThread.messages, ...currentThread.messages],\n },\n };\n });\n setUnresolvedThreadId(undefined);\n }\n }, [currentThreadId, unresolvedThreadId]);\n\n const switchCurrentThread = useCallback(\n async (threadId: string) => {\n if (threadId === PLACEHOLDER_THREAD.id) {\n console.warn(\"Switching to placeholder thread, may be a bug\");\n return;\n }\n setCurrentThreadId(threadId);\n if (!threadMap[threadId]) {\n setThreadMap((prevMap) => ({\n ...prevMap,\n [threadId]: {\n ...PLACEHOLDER_THREAD,\n id: threadId,\n },\n }));\n }\n await fetchThread(threadId);\n },\n [fetchThread, threadMap],\n );\n\n const setLastThreadStatus = (status: GenerationStage) => {\n setThreadMap((prevMap) => {\n if (!currentThreadId) {\n return prevMap;\n }\n const headMessages = prevMap[currentThreadId].messages.slice(0, -1);\n const lastMessage =\n prevMap[currentThreadId].messages[\n prevMap[currentThreadId].messages.length - 1\n ];\n const updatedLastMessage = {\n ...lastMessage,\n status,\n };\n return {\n ...prevMap,\n [currentThreadId]: {\n ...prevMap[currentThreadId],\n messages: [...headMessages, updatedLastMessage],\n },\n };\n });\n };\n\n const updateThreadStatus = useCallback(\n (stage: GenerationStage, statusMessage?: string) => {\n setThreadMap((prevMap) => {\n return {\n ...prevMap,\n [currentThreadId]: {\n ...prevMap[currentThreadId],\n generationStage: stage,\n statusMessage: statusMessage,\n },\n };\n });\n },\n [currentThreadId],\n );\n\n const handleAdvanceStream = useCallback(\n async (\n stream: AsyncIterable<TamboAI.Beta.Threads.ThreadAdvanceResponse>,\n params: TamboAI.Beta.Threads.ThreadAdvanceParams,\n ): Promise<TamboThreadMessage> => {\n let finalMessage: TamboThreadMessage | undefined;\n let hasSetThreadId = false;\n updateThreadStatus(GenerationStage.STREAMING_RESPONSE);\n for await (const chunk of stream) {\n if (chunk.responseMessageDto.toolCallRequest) {\n updateThreadStatus(GenerationStage.FETCHING_CONTEXT);\n const toolCallResponse = await handleToolCall(\n chunk.responseMessageDto,\n toolRegistry,\n );\n const toolCallResponseParams: TamboAI.Beta.Threads.ThreadAdvanceParams =\n {\n ...params,\n messageToAppend: {\n content: [{ type: \"text\", text: \"tool response\" }],\n role: \"tool\",\n actionType: \"tool_response\",\n toolResponse: toolCallResponse,\n component: chunk.responseMessageDto.component,\n },\n };\n updateThreadStatus(GenerationStage.STREAMING_RESPONSE);\n const toolCallResponseStream = await advanceStream(\n client,\n toolCallResponseParams,\n chunk.responseMessageDto.threadId,\n );\n return await handleAdvanceStream(\n toolCallResponseStream,\n toolCallResponseParams,\n );\n } else {\n if (\n !hasSetThreadId &&\n chunk.responseMessageDto.threadId &&\n chunk.responseMessageDto.threadId !== currentThread?.id\n ) {\n hasSetThreadId = true;\n switchCurrentThread(chunk.responseMessageDto.threadId);\n }\n\n if (!finalMessage) {\n finalMessage = chunk.responseMessageDto.component?.componentName\n ? renderComponentIntoMessage(\n chunk.responseMessageDto,\n componentList,\n )\n : chunk.responseMessageDto;\n addThreadMessage(finalMessage, false);\n } else {\n const previousId = finalMessage.id;\n finalMessage = chunk.responseMessageDto.component?.componentName\n ? renderComponentIntoMessage(\n chunk.responseMessageDto,\n componentList,\n )\n : chunk.responseMessageDto;\n updateThreadMessage(previousId, finalMessage, false);\n }\n }\n }\n\n updateThreadStatus(GenerationStage.COMPLETE);\n return (\n finalMessage ?? {\n threadId: \"\",\n content: [{ type: \"text\", text: `Error processing stream` }],\n role: \"hydra\",\n createdAt: new Date().toISOString(),\n id: crypto.randomUUID(),\n }\n );\n },\n [\n toolRegistry,\n client,\n currentThread?.id,\n switchCurrentThread,\n componentList,\n addThreadMessage,\n updateThreadMessage,\n updateThreadStatus,\n ],\n );\n\n const sendThreadMessage = useCallback(\n async (\n message: string,\n options: {\n threadId?: string;\n streamResponse?: boolean;\n contextKey?: string;\n } = {},\n ): Promise<TamboThreadMessage> => {\n const { threadId, streamResponse } = options;\n const currentThreadId = threadId ?? currentThread?.id;\n\n if (currentThreadId !== PLACEHOLDER_THREAD.id) {\n await switchCurrentThread(currentThreadId);\n }\n\n updateThreadStatus(GenerationStage.CHOOSING_COMPONENT);\n\n addThreadMessage(\n {\n content: [{ type: \"text\", text: message }],\n renderedComponent: null,\n role: \"user\",\n threadId: currentThread.id,\n id: crypto.randomUUID(),\n createdAt: new Date().toISOString(),\n },\n false,\n );\n\n const availableComponents = getAvailableComponents(\n componentList,\n toolRegistry,\n componentToolAssociations,\n );\n const params: TamboAI.Beta.Threads.ThreadAdvanceParams = {\n messageToAppend: {\n content: [{ type: \"text\", text: message }],\n role: \"user\",\n },\n contextKey: options.contextKey,\n availableComponents: availableComponents,\n };\n\n if (streamResponse) {\n const advanceStreamResponse = await advanceStream(\n client,\n params,\n currentThreadId === PLACEHOLDER_THREAD.id\n ? undefined\n : currentThreadId,\n );\n return await handleAdvanceStream(advanceStreamResponse, params);\n }\n let advanceResponse = await (currentThreadId === PLACEHOLDER_THREAD.id\n ? client.beta.threads.advance(params)\n : client.beta.threads.advanceById(currentThreadId, params));\n\n //handle tool calls\n while (advanceResponse.responseMessageDto.toolCallRequest) {\n updateThreadStatus(GenerationStage.FETCHING_CONTEXT);\n const toolCallResponse = await handleToolCall(\n advanceResponse.responseMessageDto,\n toolRegistry,\n );\n const toolCallResponseParams: TamboAI.Beta.Threads.ThreadAdvanceParams =\n {\n ...params,\n messageToAppend: {\n ...params.messageToAppend,\n content: [{ type: \"text\", text: \"tool response\" }],\n role: \"tool\",\n actionType: \"tool_response\",\n toolResponse: toolCallResponse,\n component: advanceResponse.responseMessageDto.component,\n },\n };\n updateThreadStatus(GenerationStage.HYDRATING_COMPONENT);\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(GenerationStage.COMPLETE);\n return finalMessage;\n },\n [\n componentList,\n toolRegistry,\n componentToolAssociations,\n currentThread,\n switchCurrentThread,\n addThreadMessage,\n client,\n updateThreadStatus,\n handleAdvanceStream,\n ],\n );\n\n return (\n <TamboThreadContext.Provider\n value={{\n thread: currentThread,\n switchCurrentThread,\n addThreadMessage,\n updateThreadMessage,\n setLastThreadStatus,\n inputValue,\n setInputValue,\n sendThreadMessage,\n generationStage: (currentThread?.generationStage ??\n GenerationStage.IDLE) as GenerationStage,\n generationStatusMessage: currentThread?.statusMessage ?? \"\",\n isIdle: isIdleStage(\n (currentThread?.generationStage ??\n GenerationStage.IDLE) as GenerationStage,\n ),\n }}\n >\n {children}\n </TamboThreadContext.Provider>\n );\n};\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,8 +1,8 @@
1
1
  import TamboAI from "@tambo-ai/typescript-sdk";
2
- import { ComponentRegistry, TamboToolAssociations, TamboToolRegistry } from "../model/component-metadata";
3
- import { GenerationStage, TamboThreadMessage } from "../model/generate-component-response";
4
- export declare function generateAndHydrate(client: TamboAI, componentList: ComponentRegistry, toolRegistry: TamboToolRegistry, toolAssociations: TamboToolAssociations, currentThreadId: string | undefined, content: TamboAI.Beta.Threads.ChatCompletionContentPart[], params: TamboAI.Beta.Components.ComponentGenerateParams, onUpdateState: (state: GenerationStage) => void, stream?: boolean, options?: TamboAI.RequestOptions): Promise<TamboThreadMessage | AsyncIterable<TamboThreadMessage>>;
2
+ import { ComponentRegistry } from "../model/component-metadata";
3
+ import { TamboThreadMessage } from "../model/generate-component-response";
5
4
  /**
6
5
  * Generate a message that has a component rendered into it, if the message came with one
7
6
  */
8
7
  export declare function renderComponentIntoMessage(message: TamboAI.Beta.Threads.ThreadMessage, componentList: ComponentRegistry): TamboThreadMessage;
8
+ //# sourceMappingURL=generate-component.d.ts.map
@@ -0,0 +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;;GAEG;AACH,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,EAC3C,aAAa,EAAE,iBAAiB,GAC/B,kBAAkB,CAiCpB"}
@@ -3,158 +3,12 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.generateAndHydrate = generateAndHydrate;
7
6
  exports.renderComponentIntoMessage = renderComponentIntoMessage;
8
- const typescript_sdk_1 = require("@tambo-ai/typescript-sdk");
9
7
  const partial_json_1 = require("partial-json");
10
8
  const react_1 = __importDefault(require("react"));
11
9
  const zod_1 = require("zod");
12
10
  const use_current_message_1 = require("../hooks/use-current-message");
13
- const generate_component_response_1 = require("../model/generate-component-response");
14
11
  const registry_1 = require("../util/registry");
15
- const tool_caller_1 = require("../util/tool-caller");
16
- async function generateAndHydrate(client, componentList, toolRegistry, toolAssociations, currentThreadId, content, params, onUpdateState, stream = false, options) {
17
- const availableComponents = (0, registry_1.getAvailableComponents)(componentList, toolRegistry, toolAssociations);
18
- let threadId = currentThreadId;
19
- onUpdateState(generate_component_response_1.GenerationStage.CHOOSING_COMPONENT);
20
- try {
21
- if (stream) {
22
- const streamResponse = await (0, typescript_sdk_1.generateStream)(client, {
23
- availableComponents,
24
- contextKey: params.contextKey,
25
- content,
26
- threadId: params.threadId === "placeholder" ? undefined : params.threadId,
27
- }, options);
28
- return processComponentDecisionStream(handleStream(streamResponse), componentList, toolRegistry, onUpdateState, client, options);
29
- }
30
- const response = await client.beta.components.generate({
31
- availableComponents,
32
- contextKey: params.contextKey,
33
- content,
34
- threadId: params.threadId === "placeholder" ? undefined : params.threadId,
35
- }, options);
36
- // Capture the current threadId in case the following processComponentDecision fails
37
- threadId = response.message.threadId;
38
- return await processComponentDecision(client, componentList, toolRegistry, response.message.threadId, content, response.message, onUpdateState, options);
39
- }
40
- catch (error) {
41
- console.error(error);
42
- onUpdateState(generate_component_response_1.GenerationStage.ERROR);
43
- // manually create a message with the error
44
- const errorMessage = `Error generating component: ${error}`;
45
- try {
46
- const errorMessageResponse = await client.beta.threads.messages.create(threadId ?? currentThreadId ?? "", {
47
- content: [{ type: "text", text: errorMessage }],
48
- role: "hydra",
49
- });
50
- return errorMessageResponse;
51
- }
52
- catch (errorError) {
53
- // Log to the console, there's nothing more we can do!
54
- console.error(`Error creating error message: ${errorError}`);
55
- console.error("Original error:", error);
56
- }
57
- return {
58
- renderedComponent: null,
59
- content: [{ type: "text", text: errorMessage }],
60
- role: "hydra",
61
- createdAt: new Date().toISOString(),
62
- id: crypto.randomUUID(),
63
- threadId: currentThreadId ?? "",
64
- };
65
- }
66
- }
67
- async function processComponentDecision(client, componentList, toolRegistry, currentThreadId, content, message, onUpdateState, options) {
68
- if (!message.component?.componentName) {
69
- const componentResponse = {
70
- ...message,
71
- renderedComponent: null,
72
- };
73
- // no component to hydrate, just return the message
74
- onUpdateState(generate_component_response_1.GenerationStage.COMPLETE);
75
- return componentResponse;
76
- }
77
- if (message.toolCallRequest) {
78
- onUpdateState(generate_component_response_1.GenerationStage.FETCHING_CONTEXT);
79
- const toolResult = await (0, tool_caller_1.handleToolCall)(message, toolRegistry);
80
- onUpdateState(generate_component_response_1.GenerationStage.HYDRATING_COMPONENT);
81
- try {
82
- const hydrationResponse = await client.beta.components.hydrate({
83
- component: (0, registry_1.getComponentFromRegistry)(message.component.componentName, componentList),
84
- threadId: message.threadId,
85
- toolResponse: toolResult,
86
- }, options);
87
- return await processComponentDecision(client, componentList, toolRegistry, currentThreadId, content, hydrationResponse.message, onUpdateState, options);
88
- }
89
- catch (error) {
90
- console.error(error);
91
- onUpdateState(generate_component_response_1.GenerationStage.ERROR);
92
- return {
93
- threadId: message.threadId,
94
- renderedComponent: null,
95
- content: [
96
- { type: "text", text: `Error hydrating component: ${error}` },
97
- ],
98
- role: "hydra",
99
- createdAt: new Date().toISOString(),
100
- id: crypto.randomUUID(),
101
- };
102
- }
103
- }
104
- const renderedComponent = react_1.default.createElement((0, registry_1.getComponentFromRegistry)(message.component.componentName, componentList)
105
- .component, message.component.props);
106
- const componentResponse = {
107
- ...message,
108
- renderedComponent: (0, use_current_message_1.wrapWithTamboMessageProvider)(renderedComponent, message.threadId, message.id),
109
- };
110
- onUpdateState(generate_component_response_1.GenerationStage.COMPLETE);
111
- return componentResponse;
112
- }
113
- async function* processComponentDecisionStream(stream, componentList, toolRegistry, onUpdateState, client, options) {
114
- let accumulatedComponentResponse = null;
115
- for await (const chunk of stream) {
116
- if (!chunk.component?.componentName) {
117
- onUpdateState(generate_component_response_1.GenerationStage.STREAMING_RESPONSE);
118
- accumulatedComponentResponse = {
119
- ...chunk,
120
- renderedComponent: null,
121
- };
122
- yield accumulatedComponentResponse;
123
- }
124
- if (chunk.toolCallRequest) {
125
- if (!chunk.component?.componentName) {
126
- continue;
127
- }
128
- onUpdateState(generate_component_response_1.GenerationStage.FETCHING_CONTEXT);
129
- const toolResult = await (0, tool_caller_1.handleToolCall)(chunk, toolRegistry);
130
- onUpdateState(generate_component_response_1.GenerationStage.HYDRATING_COMPONENT);
131
- const streamResponse = await (0, typescript_sdk_1.hydrateStream)(client, {
132
- component: (0, registry_1.getComponentFromRegistry)(chunk.component?.componentName ?? "", componentList),
133
- threadId: chunk.threadId,
134
- toolResponse: toolResult,
135
- }, options);
136
- yield* processComponentDecisionStream(handleStream(streamResponse), componentList, toolRegistry, onUpdateState, client, options);
137
- return;
138
- }
139
- if (chunk.component?.componentName) {
140
- try {
141
- onUpdateState(generate_component_response_1.GenerationStage.STREAMING_RESPONSE);
142
- // Try to parse and validate accumulated component choice props:
143
- const messageWithComponent = renderComponentIntoMessage(chunk, componentList);
144
- // TODO: do we have to do this now
145
- accumulatedComponentResponse = {
146
- ...accumulatedComponentResponse,
147
- ...messageWithComponent,
148
- };
149
- yield messageWithComponent;
150
- }
151
- catch (error) {
152
- console.error(error);
153
- }
154
- }
155
- }
156
- onUpdateState(generate_component_response_1.GenerationStage.COMPLETE);
157
- }
158
12
  /**
159
13
  * Generate a message that has a component rendered into it, if the message came with one
160
14
  */
@@ -178,32 +32,4 @@ function renderComponentIntoMessage(message, componentList) {
178
32
  renderedComponent: wrappedComponent,
179
33
  };
180
34
  }
181
- async function* handleStream(stream) {
182
- let threadMessage = {
183
- threadId: "",
184
- content: [],
185
- role: "hydra",
186
- createdAt: new Date().toISOString(),
187
- id: crypto.randomUUID(),
188
- };
189
- try {
190
- for await (const chunk of stream) {
191
- threadMessage = {
192
- ...threadMessage,
193
- ...chunk,
194
- };
195
- yield threadMessage;
196
- }
197
- }
198
- catch (error) {
199
- console.error("Error processing stream:", error);
200
- yield {
201
- threadId: "",
202
- content: [{ type: "text", text: `Error processing stream: ${error}` }],
203
- role: "hydra",
204
- createdAt: new Date().toISOString(),
205
- id: crypto.randomUUID(),
206
- };
207
- }
208
- }
209
35
  //# sourceMappingURL=generate-component.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"generate-component.js","sourceRoot":"","sources":["../../src/util/generate-component.ts"],"names":[],"mappings":"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","sourcesContent":["import TamboAI, {\n generateStream,\n hydrateStream,\n} 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 {\n ComponentRegistry,\n TamboToolAssociations,\n TamboToolRegistry,\n} from \"../model/component-metadata\";\nimport {\n GenerationStage,\n TamboThreadMessage,\n} from \"../model/generate-component-response\";\nimport {\n getAvailableComponents,\n getComponentFromRegistry,\n} from \"../util/registry\";\nimport { handleToolCall } from \"../util/tool-caller\";\n\nexport async function generateAndHydrate(\n client: TamboAI,\n componentList: ComponentRegistry,\n toolRegistry: TamboToolRegistry,\n toolAssociations: TamboToolAssociations,\n currentThreadId: string | undefined,\n content: TamboAI.Beta.Threads.ChatCompletionContentPart[],\n params: TamboAI.Beta.Components.ComponentGenerateParams,\n onUpdateState: (state: GenerationStage) => void,\n stream = false,\n options?: TamboAI.RequestOptions,\n): Promise<TamboThreadMessage | AsyncIterable<TamboThreadMessage>> {\n const availableComponents = getAvailableComponents(\n componentList,\n toolRegistry,\n toolAssociations,\n );\n let threadId = currentThreadId;\n\n onUpdateState(GenerationStage.CHOOSING_COMPONENT);\n try {\n if (stream) {\n const streamResponse = await generateStream(\n client,\n {\n availableComponents,\n contextKey: params.contextKey,\n content,\n threadId:\n params.threadId === \"placeholder\" ? undefined : params.threadId,\n },\n options,\n );\n\n return processComponentDecisionStream(\n handleStream(\n streamResponse as AsyncIterable<TamboAI.ComponentGenerateResponse>,\n ),\n componentList,\n toolRegistry,\n onUpdateState,\n client,\n options,\n );\n }\n const response = await client.beta.components.generate(\n {\n availableComponents,\n contextKey: params.contextKey,\n content,\n threadId:\n params.threadId === \"placeholder\" ? undefined : params.threadId,\n },\n options,\n );\n // Capture the current threadId in case the following processComponentDecision fails\n threadId = response.message.threadId;\n return await processComponentDecision(\n client,\n componentList,\n toolRegistry,\n response.message.threadId,\n content,\n response.message,\n onUpdateState,\n options,\n );\n } catch (error) {\n console.error(error);\n onUpdateState(GenerationStage.ERROR);\n // manually create a message with the error\n const errorMessage = `Error generating component: ${error}`;\n try {\n const errorMessageResponse = await client.beta.threads.messages.create(\n threadId ?? currentThreadId ?? \"\",\n {\n content: [{ type: \"text\", text: errorMessage }],\n role: \"hydra\",\n },\n );\n return errorMessageResponse;\n } catch (errorError) {\n // Log to the console, there's nothing more we can do!\n console.error(`Error creating error message: ${errorError}`);\n console.error(\"Original error:\", error);\n }\n return {\n renderedComponent: null,\n content: [{ type: \"text\", text: errorMessage }],\n role: \"hydra\",\n createdAt: new Date().toISOString(),\n id: crypto.randomUUID(),\n threadId: currentThreadId ?? \"\",\n };\n }\n}\n\nasync function processComponentDecision(\n client: TamboAI,\n componentList: ComponentRegistry,\n toolRegistry: TamboToolRegistry,\n currentThreadId: string,\n content: TamboAI.Beta.Components.ComponentGenerateParams[\"content\"],\n message: TamboAI.Beta.Threads.ThreadMessage,\n onUpdateState: (state: GenerationStage) => void,\n options?: TamboAI.RequestOptions,\n): Promise<TamboThreadMessage> {\n if (!message.component?.componentName) {\n const componentResponse: TamboThreadMessage = {\n ...message,\n renderedComponent: null,\n };\n // no component to hydrate, just return the message\n onUpdateState(GenerationStage.COMPLETE);\n return componentResponse;\n }\n\n if (message.toolCallRequest) {\n onUpdateState(GenerationStage.FETCHING_CONTEXT);\n const toolResult = await handleToolCall(message, toolRegistry);\n onUpdateState(GenerationStage.HYDRATING_COMPONENT);\n try {\n const hydrationResponse = await client.beta.components.hydrate(\n {\n component: getComponentFromRegistry(\n message.component.componentName,\n componentList,\n ),\n threadId: message.threadId,\n\n toolResponse: toolResult,\n },\n options,\n );\n return await processComponentDecision(\n client,\n componentList,\n toolRegistry,\n currentThreadId,\n content,\n hydrationResponse.message,\n onUpdateState,\n options,\n );\n } catch (error) {\n console.error(error);\n onUpdateState(GenerationStage.ERROR);\n return {\n threadId: message.threadId,\n renderedComponent: null,\n content: [\n { type: \"text\", text: `Error hydrating component: ${error}` },\n ],\n role: \"hydra\",\n createdAt: new Date().toISOString(),\n id: crypto.randomUUID(),\n };\n }\n }\n\n const renderedComponent = React.createElement(\n getComponentFromRegistry(message.component.componentName, componentList)\n .component,\n message.component.props,\n );\n const componentResponse: TamboThreadMessage = {\n ...message,\n renderedComponent: wrapWithTamboMessageProvider(\n renderedComponent,\n message.threadId,\n message.id,\n ),\n };\n\n onUpdateState(GenerationStage.COMPLETE);\n return componentResponse;\n}\n\nasync function* processComponentDecisionStream(\n stream: AsyncIterable<TamboThreadMessage>,\n componentList: ComponentRegistry,\n toolRegistry: TamboToolRegistry,\n onUpdateState: (state: GenerationStage) => void,\n client: TamboAI,\n options?: TamboAI.RequestOptions,\n): AsyncGenerator<TamboThreadMessage> {\n let accumulatedComponentResponse: TamboThreadMessage | null = null;\n\n for await (const chunk of stream) {\n if (!chunk.component?.componentName) {\n onUpdateState(GenerationStage.STREAMING_RESPONSE);\n accumulatedComponentResponse = {\n ...chunk,\n renderedComponent: null,\n };\n yield accumulatedComponentResponse;\n }\n\n if (chunk.toolCallRequest) {\n if (!chunk.component?.componentName) {\n continue;\n }\n onUpdateState(GenerationStage.FETCHING_CONTEXT);\n const toolResult = await handleToolCall(chunk, toolRegistry);\n onUpdateState(GenerationStage.HYDRATING_COMPONENT);\n const streamResponse = await hydrateStream(\n client,\n {\n component: getComponentFromRegistry(\n chunk.component?.componentName ?? \"\",\n componentList,\n ),\n threadId: chunk.threadId,\n toolResponse: toolResult,\n },\n options,\n );\n\n yield* processComponentDecisionStream(\n handleStream(\n streamResponse as AsyncIterable<TamboAI.ComponentHydrateResponse>,\n ),\n componentList,\n toolRegistry,\n onUpdateState,\n client,\n options,\n );\n return;\n }\n\n if (chunk.component?.componentName) {\n try {\n onUpdateState(GenerationStage.STREAMING_RESPONSE);\n // Try to parse and validate accumulated component choice props:\n const messageWithComponent = renderComponentIntoMessage(\n chunk,\n componentList,\n );\n // TODO: do we have to do this now\n accumulatedComponentResponse = {\n ...accumulatedComponentResponse,\n ...messageWithComponent,\n };\n yield messageWithComponent;\n } catch (error) {\n console.error(error);\n }\n }\n }\n onUpdateState(GenerationStage.COMPLETE);\n}\n\n/**\n * Generate a message that has a component rendered into it, if the message came with one\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\nasync function* handleStream(\n stream: AsyncIterable<\n TamboAI.ComponentGenerateResponse | TamboAI.ComponentHydrateResponse\n >,\n): AsyncGenerator<TamboAI.Beta.Threads.ThreadMessage> {\n let threadMessage: TamboAI.Beta.Threads.ThreadMessage = {\n threadId: \"\",\n content: [],\n role: \"hydra\",\n createdAt: new Date().toISOString(),\n id: crypto.randomUUID(),\n };\n\n try {\n for await (const chunk of stream) {\n threadMessage = {\n ...threadMessage,\n ...chunk,\n };\n yield threadMessage;\n }\n } catch (error) {\n console.error(\"Error processing stream:\", error);\n yield {\n threadId: \"\",\n content: [{ type: \"text\", text: `Error processing stream: ${error}` }],\n role: \"hydra\",\n createdAt: new Date().toISOString(),\n id: crypto.randomUUID(),\n };\n }\n}\n"]}
1
+ {"version":3,"file":"generate-component.js","sourceRoot":"","sources":["../../src/util/generate-component.ts"],"names":[],"mappings":";;;;;AAYA,gEAoCC;AA/CD,+CAAqC;AACrC,kDAA0B;AAC1B,6BAAwB;AACxB,sEAA4E;AAG5E,+CAA4D;AAE5D;;GAEG;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 came with one\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,2 +1,3 @@
1
1
  import TamboAI from "@tambo-ai/typescript-sdk";
2
2
  export declare function threadMessagesToLegacyMessages(messages: TamboAI.Beta.Threads.ThreadMessage[]): TamboAI.Components.LegacyChatMessage[];
3
+ //# sourceMappingURL=messages.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["../../src/util/messages.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,0BAA0B,CAAC;AAE/C,wBAAgB,8BAA8B,CAC5C,QAAQ,EAAE,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,0CAU/C"}
@@ -3,3 +3,4 @@ export type CombinedMutationResult<TData = unknown, TError = unknown, TVariables
3
3
  export declare function combineMutationResults<TData1, TData2, TError1, TError2>(resultA: UseMutationResult<TData1, TError1, any, any>, resultB: UseMutationResult<TData2, TError2, any, any>): CombinedMutationResult<TData1 | TData2, TError1 | TError2>;
4
4
  export type CombinedQueryResult<TData1, TData2, TError1, TError2> = Omit<UseQueryResult<TData1 | TData2, TError1 | TError2>, "data" | "refetch" | "promise">;
5
5
  export declare function combineQueryResults<TData1, TData2, TError1, TError2>(resultA: UseQueryResult<TData1, TError1>, resultB: UseQueryResult<TData2, TError2>): CombinedQueryResult<void, void, TError1, TError2>;
6
+ //# sourceMappingURL=query-utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query-utils.d.ts","sourceRoot":"","sources":["../../src/util/query-utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAE1E,MAAM,MAAM,sBAAsB,CAChC,KAAK,GAAG,OAAO,EACf,MAAM,GAAG,OAAO,EAChB,UAAU,GAAG,OAAO,EACpB,QAAQ,GAAG,OAAO,IAChB,IAAI,CACN,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,CAAC,EACtD,QAAQ,GAAG,aAAa,GAAG,OAAO,GAAG,MAAM,GAAG,WAAW,GAAG,SAAS,CACtE,CAAC;AAEF,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EACrE,OAAO,EAAE,iBAAiB,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,CAAC,EACrD,OAAO,EAAE,iBAAiB,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,CAAC,GACpD,sBAAsB,CAAC,MAAM,GAAG,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,CAsB5D;AAED,MAAM,MAAM,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,IAAI,IAAI,CACtE,cAAc,CAAC,MAAM,GAAG,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,EAClD,MAAM,GAAG,SAAS,GAAG,SAAS,CAC/B,CAAC;AACF,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAClE,OAAO,EAAE,cAAc,CAAC,MAAM,EAAE,OAAO,CAAC,EACxC,OAAO,EAAE,cAAc,CAAC,MAAM,EAAE,OAAO,CAAC,GACvC,mBAAmB,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,CAsCnD"}
@@ -5,3 +5,4 @@ export declare const getComponentFromRegistry: (componentName: string, component
5
5
  export declare const getDefaultContextAdditions: () => string[];
6
6
  export declare const getClientContext: () => string;
7
7
  export declare const mapTamboToolToContextTool: (tool: TamboTool) => ComponentContextToolMetadata;
8
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/util/registry.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,0BAA0B,CAAC;AAG/C,OAAO,EACL,4BAA4B,EAC5B,iBAAiB,EAEjB,mBAAmB,EACnB,SAAS,EACT,qBAAqB,EACrB,iBAAiB,EAClB,MAAM,6BAA6B,CAAC;AAErC,eAAO,MAAM,sBAAsB,GACjC,mBAAmB,iBAAiB,EACpC,cAAc,iBAAiB,EAC/B,kBAAkB,qBAAqB,KACtC,OAAO,CAAC,kBAAkB,EAuB5B,CAAC;AAEF,eAAO,MAAM,wBAAwB,GACnC,eAAe,MAAM,EACrB,mBAAmB,iBAAiB,KACnC,mBAUF,CAAC;AAEF,eAAO,MAAM,0BAA0B,QAAO,MAAM,EAMnD,CAAC;AAEF,eAAO,MAAM,gBAAgB,QAAO,MAGnC,CAAC;AAEF,eAAO,MAAM,yBAAyB,GACpC,MAAM,SAAS,KACd,4BAQF,CAAC"}
@@ -1,3 +1,4 @@
1
1
  import TamboAI from "@tambo-ai/typescript-sdk";
2
2
  import { TamboToolRegistry } from "../model/component-metadata";
3
3
  export declare const handleToolCall: (message: TamboAI.Beta.ThreadMessage, toolRegistry: TamboToolRegistry) => Promise<any>;
4
+ //# sourceMappingURL=tool-caller.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-caller.d.ts","sourceRoot":"","sources":["../../src/util/tool-caller.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,0BAA0B,CAAC;AAC/C,OAAO,EAEL,iBAAiB,EAClB,MAAM,6BAA6B,CAAC;AAErC,eAAO,MAAM,cAAc,GACzB,SAAS,OAAO,CAAC,IAAI,CAAC,aAAa,EACnC,cAAc,iBAAiB,iBAUhC,CAAC"}
@@ -25,6 +25,6 @@ const findTool = (toolName, toolRegistry) => {
25
25
  const runToolChoice = async (toolCallRequest, tool) => {
26
26
  // Assumes parameters are in the order they are defined in the tool
27
27
  const parameterValues = toolCallRequest.parameters?.map((param) => param.parameterValue) ?? [];
28
- return tool.getComponentContext(...parameterValues);
28
+ return await tool.getComponentContext(...parameterValues);
29
29
  };
30
30
  //# sourceMappingURL=tool-caller.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"tool-caller.js","sourceRoot":"","sources":["../../src/util/tool-caller.ts"],"names":[],"mappings":";;;AAKA,yCAAuD;AAChD,MAAM,cAAc,GAAG,KAAK,EACjC,OAAmC,EACnC,YAA+B,EAC/B,EAAE;IACF,IAAI,CAAC,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,CAAC;QACxC,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;IAC3C,CAAC;IAED,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,eAAe,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;IACtE,MAAM,UAAU,GAAG,MAAM,aAAa,CAAC,OAAO,CAAC,eAAe,EAAE,IAAI,CAAC,CAAC;IAEtE,OAAO,UAAU,CAAC;AACpB,CAAC,CAAC;AAZW,QAAA,cAAc,kBAYzB;AAEF,MAAM,QAAQ,GAAG,CAAC,QAAgB,EAAE,YAA+B,EAAE,EAAE;IACrE,MAAM,YAAY,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;IAE5C,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,MAAM,IAAI,KAAK,CAAC,QAAQ,QAAQ,wBAAwB,CAAC,CAAC;IAC5D,CAAC;IAED,MAAM,WAAW,GAAG,IAAA,oCAAyB,EAAC,YAAY,CAAC,CAAC;IAC5D,OAAO;QACL,mBAAmB,EAAE,YAAY,CAAC,IAAI;QACtC,UAAU,EAAE,WAAW;KACxB,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,aAAa,GAAG,KAAK,EACzB,eAAwC,EACxC,IAA0B,EACZ,EAAE;IAChB,mEAAmE;IACnE,MAAM,eAAe,GACnB,eAAe,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC;IAEzE,OAAO,IAAI,CAAC,mBAAmB,CAAC,GAAG,eAAe,CAAC,CAAC;AACtD,CAAC,CAAC","sourcesContent":["import TamboAI from \"@tambo-ai/typescript-sdk\";\nimport {\n ComponentContextTool,\n TamboToolRegistry,\n} from \"../model/component-metadata\";\nimport { mapTamboToolToContextTool } from \"./registry\";\nexport const handleToolCall = async (\n message: TamboAI.Beta.ThreadMessage,\n toolRegistry: TamboToolRegistry,\n) => {\n if (!message?.toolCallRequest?.toolName) {\n throw new Error(\"Tool name is required\");\n }\n\n const tool = findTool(message.toolCallRequest.toolName, toolRegistry);\n const toolResult = await runToolChoice(message.toolCallRequest, tool);\n\n return toolResult;\n};\n\nconst findTool = (toolName: string, toolRegistry: TamboToolRegistry) => {\n const registryTool = toolRegistry[toolName];\n\n if (!registryTool) {\n throw new Error(`Tool ${toolName} not found in registry`);\n }\n\n const contextTool = mapTamboToolToContextTool(registryTool);\n return {\n getComponentContext: registryTool.tool,\n definition: contextTool,\n };\n};\n\nconst runToolChoice = async (\n toolCallRequest: TamboAI.ToolCallRequest,\n tool: ComponentContextTool,\n): Promise<any> => {\n // Assumes parameters are in the order they are defined in the tool\n const parameterValues =\n toolCallRequest.parameters?.map((param) => param.parameterValue) ?? [];\n\n return tool.getComponentContext(...parameterValues);\n};\n"]}
1
+ {"version":3,"file":"tool-caller.js","sourceRoot":"","sources":["../../src/util/tool-caller.ts"],"names":[],"mappings":";;;AAKA,yCAAuD;AAChD,MAAM,cAAc,GAAG,KAAK,EACjC,OAAmC,EACnC,YAA+B,EAC/B,EAAE;IACF,IAAI,CAAC,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,CAAC;QACxC,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;IAC3C,CAAC;IAED,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,eAAe,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;IACtE,MAAM,UAAU,GAAG,MAAM,aAAa,CAAC,OAAO,CAAC,eAAe,EAAE,IAAI,CAAC,CAAC;IAEtE,OAAO,UAAU,CAAC;AACpB,CAAC,CAAC;AAZW,QAAA,cAAc,kBAYzB;AAEF,MAAM,QAAQ,GAAG,CAAC,QAAgB,EAAE,YAA+B,EAAE,EAAE;IACrE,MAAM,YAAY,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;IAE5C,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,MAAM,IAAI,KAAK,CAAC,QAAQ,QAAQ,wBAAwB,CAAC,CAAC;IAC5D,CAAC;IAED,MAAM,WAAW,GAAG,IAAA,oCAAyB,EAAC,YAAY,CAAC,CAAC;IAC5D,OAAO;QACL,mBAAmB,EAAE,YAAY,CAAC,IAAI;QACtC,UAAU,EAAE,WAAW;KACxB,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,aAAa,GAAG,KAAK,EACzB,eAAwC,EACxC,IAA0B,EACZ,EAAE;IAChB,mEAAmE;IACnE,MAAM,eAAe,GACnB,eAAe,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC;IAEzE,OAAO,MAAM,IAAI,CAAC,mBAAmB,CAAC,GAAG,eAAe,CAAC,CAAC;AAC5D,CAAC,CAAC","sourcesContent":["import TamboAI from \"@tambo-ai/typescript-sdk\";\nimport {\n ComponentContextTool,\n TamboToolRegistry,\n} from \"../model/component-metadata\";\nimport { mapTamboToolToContextTool } from \"./registry\";\nexport const handleToolCall = async (\n message: TamboAI.Beta.ThreadMessage,\n toolRegistry: TamboToolRegistry,\n) => {\n if (!message?.toolCallRequest?.toolName) {\n throw new Error(\"Tool name is required\");\n }\n\n const tool = findTool(message.toolCallRequest.toolName, toolRegistry);\n const toolResult = await runToolChoice(message.toolCallRequest, tool);\n\n return toolResult;\n};\n\nconst findTool = (toolName: string, toolRegistry: TamboToolRegistry) => {\n const registryTool = toolRegistry[toolName];\n\n if (!registryTool) {\n throw new Error(`Tool ${toolName} not found in registry`);\n }\n\n const contextTool = mapTamboToolToContextTool(registryTool);\n return {\n getComponentContext: registryTool.tool,\n definition: contextTool,\n };\n};\n\nconst runToolChoice = async (\n toolCallRequest: TamboAI.ToolCallRequest,\n tool: ComponentContextTool,\n): Promise<any> => {\n // Assumes parameters are in the order they are defined in the tool\n const parameterValues =\n toolCallRequest.parameters?.map((param) => param.parameterValue) ?? [];\n\n return await tool.getComponentContext(...parameterValues);\n};\n"]}
@@ -1 +1,2 @@
1
1
  export {};
2
+ //# sourceMappingURL=use-suggestions.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-suggestions.test.d.ts","sourceRoot":"","sources":["../../../src/hooks/__tests__/use-suggestions.test.tsx"],"names":[],"mappings":""}
@@ -19,3 +19,4 @@ export type UseTamboMutationResult<TData = unknown, TError = Error, TVariables =
19
19
  * Hook for creating a mutation with the tambo query client.
20
20
  */
21
21
  export declare function useTamboMutationResult<TData = unknown, TError = Error, TVariables = void, TContext = unknown>(options: UseMutationOptions<TData, TError, TVariables, TContext>): UseMutationResult<TData, TError, TVariables, TContext>;
22
+ //# sourceMappingURL=react-query-hooks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"react-query-hooks.d.ts","sourceRoot":"","sources":["../../src/hooks/react-query-hooks.ts"],"names":[],"mappings":"AACA,OAAO,EACL,QAAQ,EAER,kBAAkB,EAElB,eAAe,EACf,iBAAiB,EAClB,MAAM,uBAAuB,CAAC;AAG/B;;;;GAIG;AACH,wBAAgB,aAAa,CAC3B,YAAY,GAAG,OAAO,EACtB,MAAM,GAAG,KAAK,EACd,KAAK,GAAG,YAAY,EACpB,SAAS,SAAS,QAAQ,GAAG,QAAQ,EACrC,OAAO,EAAE,eAAe,CAAC,YAAY,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,CAAC,iEAGjE;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,GAAG,OAAO,EACf,MAAM,GAAG,KAAK,EACd,UAAU,GAAG,IAAI,EACjB,QAAQ,GAAG,OAAO,EAClB,OAAO,EAAE,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,CAAC,0DAGjE;AAED;;GAEG;AACH,MAAM,MAAM,sBAAsB,CAChC,KAAK,GAAG,OAAO,EACf,MAAM,GAAG,KAAK,EACd,UAAU,GAAG,IAAI,EACjB,QAAQ,GAAG,OAAO,IAChB,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC;AAE3D;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,KAAK,GAAG,OAAO,EACf,MAAM,GAAG,KAAK,EACd,UAAU,GAAG,IAAI,EACjB,QAAQ,GAAG,OAAO,EAClB,OAAO,EAAE,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,CAAC,0DAEjE"}
@@ -6,3 +6,4 @@ type StateUpdateResult<T> = [currentState: T, setState: (newState: T) => void];
6
6
  export declare function useTamboComponentState<S = undefined>(keyName: string): StateUpdateResult<S | undefined>;
7
7
  export declare function useTamboComponentState<S>(keyName: string, initialValue?: S): StateUpdateResult<S>;
8
8
  export {};
9
+ //# sourceMappingURL=use-component-state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-component-state.d.ts","sourceRoot":"","sources":["../../src/hooks/use-component-state.tsx"],"names":[],"mappings":"AAOA,KAAK,iBAAiB,CAAC,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,QAAQ,EAAE,CAAC,KAAK,IAAI,CAAC,CAAC;AAE/E;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,CAAC,GAAG,SAAS,EAClD,OAAO,EAAE,MAAM,GACd,iBAAiB,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC;AACpC,wBAAgB,sBAAsB,CAAC,CAAC,EACtC,OAAO,EAAE,MAAM,EACf,YAAY,CAAC,EAAE,CAAC,GACf,iBAAiB,CAAC,CAAC,CAAC,CAAC"}
@@ -16,3 +16,4 @@ export declare const useTamboMessageContext: () => {
16
16
  /** Hook used inside a component wrapped with ComponentMessageProvider, to get
17
17
  * the current message */
18
18
  export declare const useTamboCurrentMessage: () => import("..").TamboThreadMessage | undefined;
19
+ //# sourceMappingURL=use-current-message.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-current-message.d.ts","sourceRoot":"","sources":["../../src/hooks/use-current-message.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAiB,iBAAiB,EAAc,MAAM,OAAO,CAAC;AAQ5E,sFAAsF;AACtF,eAAO,MAAM,oBAAoB,EAAE,KAAK,CAAC,EAAE,CACzC,iBAAiB,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC,CAO3D,CAAC;AAEF;sCACsC;AACtC,wBAAgB,4BAA4B,CAC1C,QAAQ,EAAE,KAAK,CAAC,SAAS,EACzB,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,qBAOlB;AACD;gCACgC;AAEhC,eAAO,MAAM,sBAAsB;cA/BvB,MAAM;eACL,MAAM;CAsClB,CAAC;AAEF;yBACyB;AACzB,eAAO,MAAM,sBAAsB,mDASlC,CAAC"}
@@ -42,3 +42,4 @@ type useTamboSuggestionsResult = CombinedMutationResult<any, Error> & useTamboSu
42
42
  */
43
43
  export declare function useTamboSuggestions(options?: useTamboSuggestionsOptions): useTamboSuggestionsResult;
44
44
  export {};
45
+ //# sourceMappingURL=use-suggestions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-suggestions.d.ts","sourceRoot":"","sources":["../../src/hooks/use-suggestions.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,0BAA0B,CAAC;AAO/C,OAAO,EACL,sBAAsB,EAEvB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,sBAAsB,EAGvB,MAAM,qBAAqB,CAAC;AAG7B;;GAEG;AACH,MAAM,WAAW,0BAA0B;IACzC,kEAAkE;IAClE,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED;;GAEG;AACH,MAAM,WAAW,iCAAiC;IAChD,4EAA4E;IAC5E,WAAW,EAAE,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;IAC/C,8CAA8C;IAC9C,oBAAoB,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC;;;;OAIG;IACH,MAAM,EAAE,CAAC,aAAa,EAAE;QACtB,UAAU,EAAE,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC;QAC5C,YAAY,CAAC,EAAE,OAAO,CAAC;KACxB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAEpB,0DAA0D;IAC1D,YAAY,EAAE,sBAAsB,CAClC,IAAI,EACJ,KAAK,EACL;QAAE,UAAU,EAAE,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC;QAAC,YAAY,CAAC,EAAE,OAAO,CAAA;KAAE,CACxE,CAAC;IAEF,0DAA0D;IAC1D,cAAc,EAAE,sBAAsB,CACpC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,0BAA0B,GAAG,SAAS,EACvE,KAAK,EACL,eAAe,CAChB,CAAC;CACH;AAED,KAAK,yBAAyB,GAAG,sBAAsB,CAAC,GAAG,EAAE,KAAK,CAAC,GACjE,iCAAiC,CAAC;AAEpC;;;;;GAKG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,GAAE,0BAA+B,GACvC,yBAAyB,CAkI3B"}
@@ -39,7 +39,7 @@ export function useTamboSuggestions(options = {}) {
39
39
  }
40
40
  // Get registered components from the registry
41
41
  const components = getAvailableComponents(componentList, toolRegistry, componentToolAssociations);
42
- return tamboClient.beta.threads.suggestions.generate(thread.id, latestMessageId, {
42
+ return await tamboClient.beta.threads.suggestions.generate(thread.id, latestMessageId, {
43
43
  maxSuggestions,
44
44
  // The API expects an array of arrays for availableComponents
45
45
  availableComponents: [components],
@@ -82,7 +82,7 @@ export function useTamboSuggestions(options = {}) {
82
82
  }
83
83
  // Get registered components from the registry
84
84
  const components = getAvailableComponents(componentList, toolRegistry, componentToolAssociations);
85
- return tamboClient.beta.threads.suggestions.generate(thread.id, latestMessageId, {
85
+ return await tamboClient.beta.threads.suggestions.generate(thread.id, latestMessageId, {
86
86
  maxSuggestions,
87
87
  // The API expects an array of arrays for availableComponents
88
88
  availableComponents: [components],
@@ -1 +1 @@
1
- {"version":3,"file":"use-suggestions.js","sourceRoot":"","sources":["../../src/hooks/use-suggestions.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AACpE,OAAO,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,sCAAsC,CAAC;AACxE,OAAO,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AACpE,OAAO,EAEL,sBAAsB,GACvB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,EAEL,sBAAsB,EACtB,aAAa,GACd,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AA8C/E;;;;;GAKG;AACH,MAAM,UAAU,mBAAmB,CACjC,UAAsC,EAAE;IAExC,MAAM,EAAE,cAAc,GAAG,CAAC,EAAE,GAAG,OAAO,CAAC;IACvC,MAAM,EAAE,MAAM,EAAE,GAAG,cAAc,EAAE,CAAC;IACpC,MAAM,EAAE,iBAAiB,EAAE,GAAG,QAAQ,EAAE,CAAC;IACzC,MAAM,WAAW,GAAG,cAAc,EAAE,CAAC;IACrC,MAAM,EAAE,aAAa,EAAE,YAAY,EAAE,yBAAyB,EAAE,GAC9D,gBAAgB,EAAE,CAAC;IAErB,MAAM,CAAC,oBAAoB,EAAE,uBAAuB,CAAC,GAAG,QAAQ,CAE9D,IAAI,CAAC,CAAC;IACR,MAAM,EAAE,QAAQ,EAAE,aAAa,EAAE,GAAG,mBAAmB,EAAE,CAAC;IAE1D,MAAM,aAAa,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAClE,MAAM,iBAAiB,GAAG,aAAa,EAAE,IAAI,KAAK,OAAO,CAAC,CAAC,wBAAwB;IACnF,MAAM,eAAe,GAAG,aAAa,EAAE,EAAE,CAAC;IAE1C,qDAAqD;IACrD,SAAS,CAAC,GAAG,EAAE;QACb,uBAAuB,CAAC,IAAI,CAAC,CAAC;IAChC,CAAC,EAAE,CAAC,eAAe,CAAC,CAAC,CAAC;IAEtB,4EAA4E;IAC5E,MAAM,gBAAgB,GAAG,aAAa,CAAC;QACrC,4EAA4E;QAC5E,QAAQ,EAAE,CAAC,aAAa,EAAE,iBAAiB,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC;QACrE,OAAO,EAAE,KAAK,IAAI,EAAE;YAClB,IAAI,CAAC,eAAe,IAAI,CAAC,iBAAiB,EAAE,CAAC;gBAC3C,OAAO,EAAE,CAAC;YACZ,CAAC;YAED,8CAA8C;YAC9C,MAAM,UAAU,GAAG,sBAAsB,CACvC,aAAa,EACb,YAAY,EACZ,yBAAyB,CAC1B,CAAC;YAEF,OAAO,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,QAAQ,CAClD,MAAM,CAAC,EAAE,EACT,eAAe,EACf;gBACE,cAAc;gBACd,6DAA6D;gBAC7D,mBAAmB,EAAE,CAAC,UAAU,CAAC;aAClC,CACF,CAAC;QACJ,CAAC;QACD,2DAA2D;QAC3D,OAAO,EAAE,OAAO,CAAC,eAAe,IAAI,iBAAiB,CAAC;QACtD,6CAA6C;QAC7C,oBAAoB,EAAE,KAAK;QAC3B,kBAAkB,EAAE,KAAK;QACzB,yBAAyB;QACzB,KAAK,EAAE,KAAK;KACb,CAAC,CAAC;IAEH,6BAA6B;IAC7B,MAAM,mBAAmB,GAAG,sBAAsB,CAIhD;QACA,UAAU,EAAE,KAAK,EAAE,EAAE,UAAU,EAAE,YAAY,GAAG,KAAK,EAAE,EAAE,EAAE;YACzD,MAAM,UAAU,GAAG,aAAa,CAAC,UAAU,CAAC,kBAAkB,CAAC,CAAC;YAChE,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;gBACxB,IAAI,UAAU,CAAC,KAAK,EAAE,CAAC;oBACrB,MAAM,UAAU,CAAC,KAAK,CAAC;gBACzB,CAAC;gBACD,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,UAAU,CAAC,CAAC;YACnD,CAAC;YAED,IAAI,YAAY,EAAE,CAAC;gBACjB,MAAM,iBAAiB,CAAC,UAAU,CAAC,cAAc,EAAE;oBACjD,QAAQ,EAAE,MAAM,CAAC,EAAE;iBACpB,CAAC,CAAC;YACL,CAAC;iBAAM,CAAC;gBACN,aAAa,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC;YAC3C,CAAC;YACD,uBAAuB,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;QACzC,CAAC;KACF,CAAC,CAAC;IAEH,gCAAgC;IAChC,MAAM,qBAAqB,GAAG,sBAAsB,CAIlD;QACA,UAAU,EAAE,KAAK,EAAE,eAAgC,EAAE,EAAE;YACrD,IAAI,CAAC,eAAe,IAAI,CAAC,iBAAiB,EAAE,CAAC;gBAC3C,OAAO,SAAS,CAAC;YACnB,CAAC;YAED,8CAA8C;YAC9C,MAAM,UAAU,GAAG,sBAAsB,CACvC,aAAa,EACb,YAAY,EACZ,yBAAyB,CAC1B,CAAC;YAEF,OAAO,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,QAAQ,CAClD,MAAM,CAAC,EAAE,EACT,eAAe,EACf;gBACE,cAAc;gBACd,6DAA6D;gBAC7D,mBAAmB,EAAE,CAAC,UAAU,CAAC;aAClC,EACD,EAAE,MAAM,EAAE,eAAe,CAAC,MAAM,EAAE,CACnC,CAAC;QACJ,CAAC;QACD,yBAAyB;QACzB,KAAK,EAAE,KAAK;KACb,CAAC,CAAC;IAEH,mEAAmE;IACnE,8DAA8D;IAC9D,MAAM,WAAW,GAAG,iBAAiB;QACnC,CAAC,CAAC,CAAC,gBAAgB,CAAC,IAAI,IAAI,qBAAqB,CAAC,IAAI,IAAI,EAAE,CAAC;QAC7D,CAAC,CAAC,EAAE,CAAC;IAEP,OAAO;QACL,WAAW;QACX,MAAM,EAAE,mBAAmB,CAAC,WAAW;QACvC,oBAAoB;QACpB,YAAY,EAAE,mBAAmB;QACjC,cAAc,EAAE,qBAAqB;QACrC,GAAG,sBAAsB,CAAC,mBAAmB,EAAE,qBAAqB,CAAC;KACtE,CAAC;AACJ,CAAC","sourcesContent":["import TamboAI from \"@tambo-ai/typescript-sdk\";\nimport { useEffect, useState } from \"react\";\nimport { validateInput } from \"../model/validate-input\";\nimport { useTamboClient } from \"../providers/tambo-client-provider\";\nimport { useTambo } from \"../providers/tambo-provider\";\nimport { useTamboRegistry } from \"../providers/tambo-registry-provider\";\nimport { useTamboThread } from \"../providers/tambo-thread-provider\";\nimport {\n CombinedMutationResult,\n combineMutationResults,\n} from \"../util/query-utils\";\nimport { getAvailableComponents } from \"../util/registry\";\nimport {\n UseTamboMutationResult,\n useTamboMutationResult,\n useTamboQuery,\n} from \"./react-query-hooks\";\nimport { INPUT_ERROR_MESSAGES, useTamboThreadInput } from \"./use-thread-input\";\n\n/**\n * Configuration options for the useTamboSuggestions hook\n */\nexport interface useTamboSuggestionsOptions {\n /** Maximum number of suggestions to generate (1-10, default 3) */\n maxSuggestions?: number;\n}\n\n/**\n * Return value interface for useTamboSuggestions hook\n */\nexport interface useTamboSuggestionsResultInternal {\n /** List of available suggestions (also available in generateResult.data) */\n suggestions: TamboAI.Beta.Threads.Suggestion[];\n /** ID of the currently selected suggestion */\n selectedSuggestionId: string | null;\n /**\n * Accept and apply a suggestion (also available in acceptResult.mutateAsync)\n * @param suggestion - The suggestion to accept\n * @param shouldSubmit - Whether to automatically submit after accepting (default: false)\n */\n accept: (acceptOptions: {\n suggestion: TamboAI.Beta.Threads.Suggestion;\n shouldSubmit?: boolean;\n }) => Promise<void>;\n\n /** Result and network state for accepting a suggestion */\n acceptResult: UseTamboMutationResult<\n void,\n Error,\n { suggestion: TamboAI.Beta.Threads.Suggestion; shouldSubmit?: boolean }\n >;\n\n /** Result and network state for generating suggestions */\n generateResult: UseTamboMutationResult<\n TamboAI.Beta.Threads.Suggestions.SuggestionGenerateResponse | undefined,\n Error,\n AbortController\n >;\n}\n\ntype useTamboSuggestionsResult = CombinedMutationResult<any, Error> &\n useTamboSuggestionsResultInternal;\n\n/**\n * Hook for managing Tambo AI suggestions in a thread\n *\n * @param options - Configuration options for suggestion generation\n * @returns Object containing suggestions state and control functions\n */\nexport function useTamboSuggestions(\n options: useTamboSuggestionsOptions = {},\n): useTamboSuggestionsResult {\n const { maxSuggestions = 3 } = options;\n const { thread } = useTamboThread();\n const { sendThreadMessage } = useTambo();\n const tamboClient = useTamboClient();\n const { componentList, toolRegistry, componentToolAssociations } =\n useTamboRegistry();\n\n const [selectedSuggestionId, setSelectedSuggestionId] = useState<\n string | null\n >(null);\n const { setValue: setInputValue } = useTamboThreadInput();\n\n const latestMessage = thread.messages[thread.messages.length - 1];\n const isLatestFromTambo = latestMessage?.role === \"hydra\"; // TODO: change to tambo\n const latestMessageId = latestMessage?.id;\n\n // Reset selected suggestion when the message changes\n useEffect(() => {\n setSelectedSuggestionId(null);\n }, [latestMessageId]);\n\n // Use React Query to fetch suggestions when a new hydra message is received\n const suggestionsQuery = useTamboQuery({\n // Only include latestMessageId in the queryKey if the message is from hydra\n queryKey: [\"suggestions\", isLatestFromTambo ? latestMessageId : null],\n queryFn: async () => {\n if (!latestMessageId || !isLatestFromTambo) {\n return [];\n }\n\n // Get registered components from the registry\n const components = getAvailableComponents(\n componentList,\n toolRegistry,\n componentToolAssociations,\n );\n\n return tamboClient.beta.threads.suggestions.generate(\n thread.id,\n latestMessageId,\n {\n maxSuggestions,\n // The API expects an array of arrays for availableComponents\n availableComponents: [components],\n },\n );\n },\n // Only run the query if we have a valid message from hydra\n enabled: Boolean(latestMessageId && isLatestFromTambo),\n // Don't refetch on window focus or reconnect\n refetchOnWindowFocus: false,\n refetchOnReconnect: false,\n // Don't retry on failure\n retry: false,\n });\n\n // Accept suggestion mutation\n const acceptMutationState = useTamboMutationResult<\n void,\n Error,\n { suggestion: TamboAI.Beta.Threads.Suggestion; shouldSubmit?: boolean }\n >({\n mutationFn: async ({ suggestion, shouldSubmit = false }) => {\n const validation = validateInput(suggestion.detailedSuggestion);\n if (!validation.isValid) {\n if (validation.error) {\n throw validation.error;\n }\n throw new Error(INPUT_ERROR_MESSAGES.VALIDATION);\n }\n\n if (shouldSubmit) {\n await sendThreadMessage(validation.sanitizedInput, {\n threadId: thread.id,\n });\n } else {\n setInputValue(validation.sanitizedInput);\n }\n setSelectedSuggestionId(suggestion.id);\n },\n });\n\n // Generate suggestions mutation\n const generateMutationState = useTamboMutationResult<\n TamboAI.Beta.Threads.Suggestions.SuggestionGenerateResponse | undefined,\n Error,\n AbortController\n >({\n mutationFn: async (abortController: AbortController) => {\n if (!latestMessageId || !isLatestFromTambo) {\n return undefined;\n }\n\n // Get registered components from the registry\n const components = getAvailableComponents(\n componentList,\n toolRegistry,\n componentToolAssociations,\n );\n\n return tamboClient.beta.threads.suggestions.generate(\n thread.id,\n latestMessageId,\n {\n maxSuggestions,\n // The API expects an array of arrays for availableComponents\n availableComponents: [components],\n },\n { signal: abortController.signal },\n );\n },\n // Don't retry on failure\n retry: false,\n });\n\n // Use the query data if available, otherwise use the mutation data\n // Only return suggestions if the latest message is from hydra\n const suggestions = isLatestFromTambo\n ? (suggestionsQuery.data ?? generateMutationState.data ?? [])\n : [];\n\n return {\n suggestions,\n accept: acceptMutationState.mutateAsync,\n selectedSuggestionId,\n acceptResult: acceptMutationState,\n generateResult: generateMutationState,\n ...combineMutationResults(acceptMutationState, generateMutationState),\n };\n}\n"]}
1
+ {"version":3,"file":"use-suggestions.js","sourceRoot":"","sources":["../../src/hooks/use-suggestions.ts"],"names":[],"mappings":"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","sourcesContent":["import TamboAI from \"@tambo-ai/typescript-sdk\";\nimport { useEffect, useState } from \"react\";\nimport { validateInput } from \"../model/validate-input\";\nimport { useTamboClient } from \"../providers/tambo-client-provider\";\nimport { useTambo } from \"../providers/tambo-provider\";\nimport { useTamboRegistry } from \"../providers/tambo-registry-provider\";\nimport { useTamboThread } from \"../providers/tambo-thread-provider\";\nimport {\n CombinedMutationResult,\n combineMutationResults,\n} from \"../util/query-utils\";\nimport { getAvailableComponents } from \"../util/registry\";\nimport {\n UseTamboMutationResult,\n useTamboMutationResult,\n useTamboQuery,\n} from \"./react-query-hooks\";\nimport { INPUT_ERROR_MESSAGES, useTamboThreadInput } from \"./use-thread-input\";\n\n/**\n * Configuration options for the useTamboSuggestions hook\n */\nexport interface useTamboSuggestionsOptions {\n /** Maximum number of suggestions to generate (1-10, default 3) */\n maxSuggestions?: number;\n}\n\n/**\n * Return value interface for useTamboSuggestions hook\n */\nexport interface useTamboSuggestionsResultInternal {\n /** List of available suggestions (also available in generateResult.data) */\n suggestions: TamboAI.Beta.Threads.Suggestion[];\n /** ID of the currently selected suggestion */\n selectedSuggestionId: string | null;\n /**\n * Accept and apply a suggestion (also available in acceptResult.mutateAsync)\n * @param suggestion - The suggestion to accept\n * @param shouldSubmit - Whether to automatically submit after accepting (default: false)\n */\n accept: (acceptOptions: {\n suggestion: TamboAI.Beta.Threads.Suggestion;\n shouldSubmit?: boolean;\n }) => Promise<void>;\n\n /** Result and network state for accepting a suggestion */\n acceptResult: UseTamboMutationResult<\n void,\n Error,\n { suggestion: TamboAI.Beta.Threads.Suggestion; shouldSubmit?: boolean }\n >;\n\n /** Result and network state for generating suggestions */\n generateResult: UseTamboMutationResult<\n TamboAI.Beta.Threads.Suggestions.SuggestionGenerateResponse | undefined,\n Error,\n AbortController\n >;\n}\n\ntype useTamboSuggestionsResult = CombinedMutationResult<any, Error> &\n useTamboSuggestionsResultInternal;\n\n/**\n * Hook for managing Tambo AI suggestions in a thread\n *\n * @param options - Configuration options for suggestion generation\n * @returns Object containing suggestions state and control functions\n */\nexport function useTamboSuggestions(\n options: useTamboSuggestionsOptions = {},\n): useTamboSuggestionsResult {\n const { maxSuggestions = 3 } = options;\n const { thread } = useTamboThread();\n const { sendThreadMessage } = useTambo();\n const tamboClient = useTamboClient();\n const { componentList, toolRegistry, componentToolAssociations } =\n useTamboRegistry();\n\n const [selectedSuggestionId, setSelectedSuggestionId] = useState<\n string | null\n >(null);\n const { setValue: setInputValue } = useTamboThreadInput();\n\n const latestMessage = thread.messages[thread.messages.length - 1];\n const isLatestFromTambo = latestMessage?.role === \"hydra\"; // TODO: change to tambo\n const latestMessageId = latestMessage?.id;\n\n // Reset selected suggestion when the message changes\n useEffect(() => {\n setSelectedSuggestionId(null);\n }, [latestMessageId]);\n\n // Use React Query to fetch suggestions when a new hydra message is received\n const suggestionsQuery = useTamboQuery({\n // Only include latestMessageId in the queryKey if the message is from hydra\n queryKey: [\"suggestions\", isLatestFromTambo ? latestMessageId : null],\n queryFn: async () => {\n if (!latestMessageId || !isLatestFromTambo) {\n return [];\n }\n\n // Get registered components from the registry\n const components = getAvailableComponents(\n componentList,\n toolRegistry,\n componentToolAssociations,\n );\n\n return await tamboClient.beta.threads.suggestions.generate(\n thread.id,\n latestMessageId,\n {\n maxSuggestions,\n // The API expects an array of arrays for availableComponents\n availableComponents: [components],\n },\n );\n },\n // Only run the query if we have a valid message from hydra\n enabled: Boolean(latestMessageId && isLatestFromTambo),\n // Don't refetch on window focus or reconnect\n refetchOnWindowFocus: false,\n refetchOnReconnect: false,\n // Don't retry on failure\n retry: false,\n });\n\n // Accept suggestion mutation\n const acceptMutationState = useTamboMutationResult<\n void,\n Error,\n { suggestion: TamboAI.Beta.Threads.Suggestion; shouldSubmit?: boolean }\n >({\n mutationFn: async ({ suggestion, shouldSubmit = false }) => {\n const validation = validateInput(suggestion.detailedSuggestion);\n if (!validation.isValid) {\n if (validation.error) {\n throw validation.error;\n }\n throw new Error(INPUT_ERROR_MESSAGES.VALIDATION);\n }\n\n if (shouldSubmit) {\n await sendThreadMessage(validation.sanitizedInput, {\n threadId: thread.id,\n });\n } else {\n setInputValue(validation.sanitizedInput);\n }\n setSelectedSuggestionId(suggestion.id);\n },\n });\n\n // Generate suggestions mutation\n const generateMutationState = useTamboMutationResult<\n TamboAI.Beta.Threads.Suggestions.SuggestionGenerateResponse | undefined,\n Error,\n AbortController\n >({\n mutationFn: async (abortController: AbortController) => {\n if (!latestMessageId || !isLatestFromTambo) {\n return undefined;\n }\n\n // Get registered components from the registry\n const components = getAvailableComponents(\n componentList,\n toolRegistry,\n componentToolAssociations,\n );\n\n return await tamboClient.beta.threads.suggestions.generate(\n thread.id,\n latestMessageId,\n {\n maxSuggestions,\n // The API expects an array of arrays for availableComponents\n availableComponents: [components],\n },\n { signal: abortController.signal },\n );\n },\n // Don't retry on failure\n retry: false,\n });\n\n // Use the query data if available, otherwise use the mutation data\n // Only return suggestions if the latest message is from hydra\n const suggestions = isLatestFromTambo\n ? (suggestionsQuery.data ?? generateMutationState.data ?? [])\n : [];\n\n return {\n suggestions,\n accept: acceptMutationState.mutateAsync,\n selectedSuggestionId,\n acceptResult: acceptMutationState,\n generateResult: generateMutationState,\n ...combineMutationResults(acceptMutationState, generateMutationState),\n };\n}\n"]}
@@ -135,3 +135,4 @@ export declare function useTamboThreads({ projectId, contextKey, }?: {
135
135
  promise: Promise<string>;
136
136
  data: null;
137
137
  };
138
+ //# sourceMappingURL=use-tambo-threads.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-tambo-threads.d.ts","sourceRoot":"","sources":["../../src/hooks/use-tambo-threads.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,wBAAgB,eAAe,CAAC,EAC9B,SAAS,EACT,UAAU,GACX,GAAE;IACD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;CAChB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAyBL"}