@tambo-ai/react 0.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (158) hide show
  1. package/README.md +9 -0
  2. package/dist/hooks/__tests__/use-suggestions.test.d.ts +1 -0
  3. package/dist/hooks/__tests__/use-suggestions.test.js +167 -0
  4. package/dist/hooks/__tests__/use-suggestions.test.js.map +1 -0
  5. package/dist/hooks/react-query-hooks.d.ts +21 -0
  6. package/dist/hooks/react-query-hooks.js +33 -0
  7. package/dist/hooks/react-query-hooks.js.map +1 -0
  8. package/dist/hooks/use-component-state.d.ts +8 -0
  9. package/dist/hooks/use-component-state.js +42 -0
  10. package/dist/hooks/use-component-state.js.map +1 -0
  11. package/dist/hooks/use-current-message.d.ts +18 -0
  12. package/dist/hooks/use-current-message.js +73 -0
  13. package/dist/hooks/use-current-message.js.map +1 -0
  14. package/dist/hooks/use-query-client.d.ts +0 -0
  15. package/dist/hooks/use-query-client.js +2 -0
  16. package/dist/hooks/use-query-client.js.map +1 -0
  17. package/dist/hooks/use-suggestions.d.ts +44 -0
  18. package/dist/hooks/use-suggestions.js +111 -0
  19. package/dist/hooks/use-suggestions.js.map +1 -0
  20. package/dist/hooks/use-tambo-threads.d.ts +137 -0
  21. package/dist/hooks/use-tambo-threads.js +33 -0
  22. package/dist/hooks/use-tambo-threads.js.map +1 -0
  23. package/dist/hooks/use-thread-input.d.ts +48 -0
  24. package/dist/hooks/use-thread-input.js +53 -0
  25. package/dist/hooks/use-thread-input.js.map +1 -0
  26. package/dist/index.d.ts +12 -0
  27. package/dist/index.js +34 -0
  28. package/dist/index.js.map +1 -0
  29. package/dist/model/component-metadata.d.ts +32 -0
  30. package/dist/model/component-metadata.js +3 -0
  31. package/dist/model/component-metadata.js.map +1 -0
  32. package/dist/model/generate-component-response.d.ts +17 -0
  33. package/dist/model/generate-component-response.js +22 -0
  34. package/dist/model/generate-component-response.js.map +1 -0
  35. package/dist/model/tambo-thread.d.ts +7 -0
  36. package/dist/model/tambo-thread.js +3 -0
  37. package/dist/model/tambo-thread.js.map +1 -0
  38. package/dist/model/thread-input-error.d.ts +3 -0
  39. package/dist/model/thread-input-error.js +8 -0
  40. package/dist/model/thread-input-error.js.map +1 -0
  41. package/dist/model/validate-input.d.ts +6 -0
  42. package/dist/model/validate-input.js +27 -0
  43. package/dist/model/validate-input.js.map +1 -0
  44. package/dist/providers/index.d.ts +5 -0
  45. package/dist/providers/index.js +21 -0
  46. package/dist/providers/index.js.map +1 -0
  47. package/dist/providers/tambo-client-provider.d.ts +15 -0
  48. package/dist/providers/tambo-client-provider.js +66 -0
  49. package/dist/providers/tambo-client-provider.js.map +1 -0
  50. package/dist/providers/tambo-component-provider.d.ts +18 -0
  51. package/dist/providers/tambo-component-provider.js +129 -0
  52. package/dist/providers/tambo-component-provider.js.map +1 -0
  53. package/dist/providers/tambo-provider.d.ts +10 -0
  54. package/dist/providers/tambo-provider.js +70 -0
  55. package/dist/providers/tambo-provider.js.map +1 -0
  56. package/dist/providers/tambo-registry-provider.d.ts +21 -0
  57. package/dist/providers/tambo-registry-provider.js +117 -0
  58. package/dist/providers/tambo-registry-provider.js.map +1 -0
  59. package/dist/providers/tambo-thread-provider.d.ts +28 -0
  60. package/dist/providers/tambo-thread-provider.js +417 -0
  61. package/dist/providers/tambo-thread-provider.js.map +1 -0
  62. package/dist/setupTests.d.ts +1 -0
  63. package/dist/setupTests.js +20 -0
  64. package/dist/setupTests.js.map +1 -0
  65. package/dist/util/generate-component.d.ts +8 -0
  66. package/dist/util/generate-component.js +209 -0
  67. package/dist/util/generate-component.js.map +1 -0
  68. package/dist/util/messages.d.ts +2 -0
  69. package/dist/util/messages.js +12 -0
  70. package/dist/util/messages.js.map +1 -0
  71. package/dist/util/query-utils.d.ts +5 -0
  72. package/dist/util/query-utils.js +63 -0
  73. package/dist/util/query-utils.js.map +1 -0
  74. package/dist/util/registry.d.ts +7 -0
  75. package/dist/util/registry.js +99 -0
  76. package/dist/util/registry.js.map +1 -0
  77. package/dist/util/tool-caller.d.ts +3 -0
  78. package/dist/util/tool-caller.js +30 -0
  79. package/dist/util/tool-caller.js.map +1 -0
  80. package/esm/hooks/__tests__/use-suggestions.test.d.ts +1 -0
  81. package/esm/hooks/__tests__/use-suggestions.test.js +165 -0
  82. package/esm/hooks/__tests__/use-suggestions.test.js.map +1 -0
  83. package/esm/hooks/react-query-hooks.d.ts +21 -0
  84. package/esm/hooks/react-query-hooks.js +28 -0
  85. package/esm/hooks/react-query-hooks.js.map +1 -0
  86. package/esm/hooks/use-component-state.d.ts +8 -0
  87. package/esm/hooks/use-component-state.js +39 -0
  88. package/esm/hooks/use-component-state.js.map +1 -0
  89. package/esm/hooks/use-current-message.d.ts +18 -0
  90. package/esm/hooks/use-current-message.js +33 -0
  91. package/esm/hooks/use-current-message.js.map +1 -0
  92. package/esm/hooks/use-query-client.d.ts +0 -0
  93. package/esm/hooks/use-query-client.js +2 -0
  94. package/esm/hooks/use-query-client.js.map +1 -0
  95. package/esm/hooks/use-suggestions.d.ts +44 -0
  96. package/esm/hooks/use-suggestions.js +108 -0
  97. package/esm/hooks/use-suggestions.js.map +1 -0
  98. package/esm/hooks/use-tambo-threads.d.ts +137 -0
  99. package/esm/hooks/use-tambo-threads.js +30 -0
  100. package/esm/hooks/use-tambo-threads.js.map +1 -0
  101. package/esm/hooks/use-thread-input.d.ts +48 -0
  102. package/esm/hooks/use-thread-input.js +49 -0
  103. package/esm/hooks/use-thread-input.js.map +1 -0
  104. package/esm/index.d.ts +12 -0
  105. package/esm/index.js +10 -0
  106. package/esm/index.js.map +1 -0
  107. package/esm/model/component-metadata.d.ts +32 -0
  108. package/esm/model/component-metadata.js +2 -0
  109. package/esm/model/component-metadata.js.map +1 -0
  110. package/esm/model/generate-component-response.d.ts +17 -0
  111. package/esm/model/generate-component-response.js +18 -0
  112. package/esm/model/generate-component-response.js.map +1 -0
  113. package/esm/model/tambo-thread.d.ts +7 -0
  114. package/esm/model/tambo-thread.js +2 -0
  115. package/esm/model/tambo-thread.js.map +1 -0
  116. package/esm/model/thread-input-error.d.ts +3 -0
  117. package/esm/model/thread-input-error.js +4 -0
  118. package/esm/model/thread-input-error.js.map +1 -0
  119. package/esm/model/validate-input.d.ts +6 -0
  120. package/esm/model/validate-input.js +24 -0
  121. package/esm/model/validate-input.js.map +1 -0
  122. package/esm/providers/index.d.ts +5 -0
  123. package/esm/providers/index.js +6 -0
  124. package/esm/providers/index.js.map +1 -0
  125. package/esm/providers/tambo-client-provider.d.ts +15 -0
  126. package/esm/providers/tambo-client-provider.js +24 -0
  127. package/esm/providers/tambo-client-provider.js.map +1 -0
  128. package/esm/providers/tambo-component-provider.d.ts +18 -0
  129. package/esm/providers/tambo-component-provider.js +91 -0
  130. package/esm/providers/tambo-component-provider.js.map +1 -0
  131. package/esm/providers/tambo-provider.d.ts +10 -0
  132. package/esm/providers/tambo-provider.js +32 -0
  133. package/esm/providers/tambo-provider.js.map +1 -0
  134. package/esm/providers/tambo-registry-provider.d.ts +21 -0
  135. package/esm/providers/tambo-registry-provider.js +79 -0
  136. package/esm/providers/tambo-registry-provider.js.map +1 -0
  137. package/esm/providers/tambo-thread-provider.d.ts +28 -0
  138. package/esm/providers/tambo-thread-provider.js +379 -0
  139. package/esm/providers/tambo-thread-provider.js.map +1 -0
  140. package/esm/setupTests.d.ts +1 -0
  141. package/esm/setupTests.js +18 -0
  142. package/esm/setupTests.js.map +1 -0
  143. package/esm/util/generate-component.d.ts +8 -0
  144. package/esm/util/generate-component.js +202 -0
  145. package/esm/util/generate-component.js.map +1 -0
  146. package/esm/util/messages.d.ts +2 -0
  147. package/esm/util/messages.js +9 -0
  148. package/esm/util/messages.js.map +1 -0
  149. package/esm/util/query-utils.d.ts +5 -0
  150. package/esm/util/query-utils.js +59 -0
  151. package/esm/util/query-utils.js.map +1 -0
  152. package/esm/util/registry.d.ts +7 -0
  153. package/esm/util/registry.js +88 -0
  154. package/esm/util/registry.js.map +1 -0
  155. package/esm/util/tool-caller.d.ts +3 -0
  156. package/esm/util/tool-caller.js +26 -0
  157. package/esm/util/tool-caller.js.map +1 -0
  158. package/package.json +84 -0
@@ -0,0 +1,91 @@
1
+ "use client";
2
+ import React, { createContext, useCallback, useContext, useState, } from "react";
3
+ import { GenerationStage, isIdleStage, } from "../model/generate-component-response";
4
+ import { generateAndHydrate } from "../util/generate-component";
5
+ import { useTamboClient } from "./tambo-client-provider";
6
+ import { useTamboRegistry, } from "./tambo-registry-provider";
7
+ import { PLACEHOLDER_THREAD, useTamboThread } from "./tambo-thread-provider";
8
+ const TamboComponentContext = createContext({
9
+ generateComponent: () => Promise.resolve({}),
10
+ generationStage: GenerationStage.IDLE,
11
+ isIdle: true,
12
+ registerComponent: () => { },
13
+ registerTool: () => { },
14
+ registerTools: () => { },
15
+ addToolAssociation: () => { },
16
+ });
17
+ export const TamboComponentProvider = ({ children, }) => {
18
+ const client = useTamboClient();
19
+ const { addThreadMessage, updateThreadMessage, switchCurrentThread, thread: currentThread, } = useTamboThread();
20
+ const { componentList, registerComponent, addToolAssociation, registerTool, componentToolAssociations, registerTools, toolRegistry, } = useTamboRegistry();
21
+ const [generationStage, setGenerationStage] = useState(GenerationStage.IDLE);
22
+ const isIdle = isIdleStage(generationStage);
23
+ const generateComponent = useCallback(async (params, options) => {
24
+ if (!isIdleStage(generationStage)) {
25
+ throw new Error(`Generation already in progress: ${generationStage}`);
26
+ }
27
+ if (params.threadId && params.threadId !== currentThread.id) {
28
+ switchCurrentThread(params.threadId);
29
+ }
30
+ const componentMessage = await generateAndHydrate(client, componentList, toolRegistry, componentToolAssociations, currentThread.id === PLACEHOLDER_THREAD.id
31
+ ? undefined
32
+ : currentThread.id, params.content, params, (state) => setGenerationStage(state), params.stream, options);
33
+ if (params.stream) {
34
+ let finalResponse;
35
+ const generationResponse = componentMessage;
36
+ for await (const chunk of generationResponse) {
37
+ if (chunk.threadId && chunk.threadId !== currentThread?.id) {
38
+ switchCurrentThread(chunk.threadId);
39
+ }
40
+ if (!finalResponse) {
41
+ finalResponse = chunk;
42
+ addThreadMessage(finalResponse, false);
43
+ }
44
+ else {
45
+ // use previous chunk's id for update, in case new chunk has a different id (from tambotion response)
46
+ updateThreadMessage(finalResponse.id, chunk, false);
47
+ finalResponse = chunk;
48
+ }
49
+ }
50
+ if (!finalResponse) {
51
+ throw new Error("No response from generation");
52
+ }
53
+ return finalResponse;
54
+ }
55
+ const generationResponse = componentMessage;
56
+ if (generationResponse.threadId &&
57
+ generationResponse.threadId !== currentThread?.id) {
58
+ switchCurrentThread(generationResponse.threadId);
59
+ }
60
+ if (generationResponse) {
61
+ // we do not need to send this to the server, as it is already in the thread
62
+ addThreadMessage(generationResponse, false);
63
+ }
64
+ return generationResponse;
65
+ }, [
66
+ generationStage,
67
+ switchCurrentThread,
68
+ currentThread,
69
+ client,
70
+ componentList,
71
+ addThreadMessage,
72
+ updateThreadMessage,
73
+ componentToolAssociations,
74
+ toolRegistry,
75
+ ]);
76
+ const value = {
77
+ client,
78
+ generateComponent,
79
+ registerComponent,
80
+ generationStage,
81
+ isIdle,
82
+ registerTool,
83
+ registerTools,
84
+ addToolAssociation,
85
+ };
86
+ return (React.createElement(TamboComponentContext.Provider, { value: value }, children));
87
+ };
88
+ export const useTamboComponent = () => {
89
+ return useContext(TamboComponentContext);
90
+ };
91
+ //# sourceMappingURL=tambo-component-provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tambo-component-provider.js","sourceRoot":"","sources":["../../src/providers/tambo-component-provider.tsx"],"names":[],"mappings":"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","sourcesContent":["\"use client\";\nimport TamboAI from \"@tambo-ai/typescript-sdk\";\nimport React, {\n createContext,\n PropsWithChildren,\n useCallback,\n useContext,\n useState,\n} from \"react\";\nimport { TamboTool } from \"../model/component-metadata\";\nimport {\n GenerationStage,\n isIdleStage,\n TamboThreadMessage,\n} from \"../model/generate-component-response\";\nimport { generateAndHydrate } from \"../util/generate-component\";\nimport { useTamboClient } from \"./tambo-client-provider\";\nimport {\n RegisterComponentOptions,\n useTamboRegistry,\n} from \"./tambo-registry-provider\";\nimport { PLACEHOLDER_THREAD, useTamboThread } from \"./tambo-thread-provider\";\n\nexport interface TamboComponentContextProps {\n registerComponent: (options: RegisterComponentOptions) => void;\n generateComponent: (\n params: TamboAI.Beta.Components.ComponentGenerateParams & {\n stream?: boolean;\n },\n options?: TamboAI.RequestOptions,\n ) => Promise<TamboThreadMessage>;\n generationStage: GenerationStage;\n isIdle: boolean;\n registerTool: (tool: TamboTool) => void;\n registerTools: (tools: TamboTool[]) => void;\n addToolAssociation: (componentName: string, tool: TamboTool) => void;\n}\n\nconst TamboComponentContext = createContext<TamboComponentContextProps>({\n generateComponent: () => Promise.resolve({} as TamboThreadMessage),\n generationStage: GenerationStage.IDLE,\n isIdle: true,\n registerComponent: () => {},\n registerTool: () => {},\n registerTools: () => {},\n addToolAssociation: () => {},\n});\n\nexport const TamboComponentProvider: React.FC<PropsWithChildren> = ({\n children,\n}) => {\n const client = useTamboClient();\n const {\n addThreadMessage,\n updateThreadMessage,\n switchCurrentThread,\n thread: currentThread,\n } = useTamboThread();\n const {\n componentList,\n registerComponent,\n addToolAssociation,\n registerTool,\n componentToolAssociations,\n registerTools,\n toolRegistry,\n } = useTamboRegistry();\n const [generationStage, setGenerationStage] = useState<GenerationStage>(\n GenerationStage.IDLE,\n );\n\n const isIdle = isIdleStage(generationStage);\n\n const generateComponent = useCallback(\n async (\n params: TamboAI.Beta.Components.ComponentGenerateParams & {\n stream?: boolean;\n },\n options?: TamboAI.RequestOptions,\n ): Promise<TamboThreadMessage> => {\n if (!isIdleStage(generationStage)) {\n throw new Error(`Generation already in progress: ${generationStage}`);\n }\n\n if (params.threadId && params.threadId !== currentThread.id) {\n switchCurrentThread(params.threadId);\n }\n const componentMessage = await generateAndHydrate(\n client,\n componentList,\n toolRegistry,\n componentToolAssociations,\n currentThread.id === PLACEHOLDER_THREAD.id\n ? undefined\n : currentThread.id,\n params.content,\n params,\n (state) => setGenerationStage(state),\n params.stream,\n options,\n );\n\n if (params.stream) {\n let finalResponse: TamboThreadMessage | undefined;\n const generationResponse =\n componentMessage as AsyncIterable<TamboThreadMessage>;\n for await (const chunk of generationResponse) {\n if (chunk.threadId && chunk.threadId !== currentThread?.id) {\n switchCurrentThread(chunk.threadId);\n }\n if (!finalResponse) {\n finalResponse = chunk;\n addThreadMessage(finalResponse, false);\n } else {\n // use previous chunk's id for update, in case new chunk has a different id (from tambotion response)\n updateThreadMessage(finalResponse.id, chunk, false);\n finalResponse = chunk;\n }\n }\n if (!finalResponse) {\n throw new Error(\"No response from generation\");\n }\n return finalResponse;\n }\n const generationResponse = componentMessage as TamboThreadMessage;\n if (\n generationResponse.threadId &&\n generationResponse.threadId !== currentThread?.id\n ) {\n switchCurrentThread(generationResponse.threadId);\n }\n\n if (generationResponse) {\n // we do not need to send this to the server, as it is already in the thread\n addThreadMessage(generationResponse, false);\n }\n\n return generationResponse;\n },\n [\n generationStage,\n switchCurrentThread,\n currentThread,\n client,\n componentList,\n addThreadMessage,\n updateThreadMessage,\n componentToolAssociations,\n toolRegistry,\n ],\n );\n\n const value = {\n client,\n generateComponent,\n registerComponent,\n generationStage,\n isIdle,\n registerTool,\n registerTools,\n addToolAssociation,\n };\n\n return (\n <TamboComponentContext.Provider value={value}>\n {children}\n </TamboComponentContext.Provider>\n );\n};\n\nexport const useTamboComponent = () => {\n return useContext(TamboComponentContext);\n};\n"]}
@@ -0,0 +1,10 @@
1
+ import React, { PropsWithChildren } from "react";
2
+ import { TamboClientContextProps, TamboClientProviderProps } from "./tambo-client-provider";
3
+ import { TamboComponentContextProps } from "./tambo-component-provider";
4
+ import { TamboThreadContextProps } from "./tambo-thread-provider";
5
+ /** TamboProvider gives full access to the TamboAI client and component registry */
6
+ export declare const TamboProvider: React.FC<PropsWithChildren<TamboClientProviderProps>>;
7
+ type TamboContextProps = TamboClientContextProps & TamboThreadContextProps & TamboComponentContextProps;
8
+ export declare const TamboContext: React.Context<TamboContextProps>;
9
+ export declare const useTambo: () => TamboContextProps;
10
+ export {};
@@ -0,0 +1,32 @@
1
+ "use client";
2
+ import React, { createContext, useContext } from "react";
3
+ import { TamboClientProvider, useTamboClient, useTamboQueryClient, } from "./tambo-client-provider";
4
+ import { TamboComponentProvider, useTamboComponent, } from "./tambo-component-provider";
5
+ import { TamboRegistryProvider } from "./tambo-registry-provider";
6
+ import { TamboThreadProvider, useTamboThread, } from "./tambo-thread-provider";
7
+ /** TamboProvider gives full access to the TamboAI client and component registry */
8
+ export const TamboProvider = ({ children, tamboUrl, apiKey }) => {
9
+ return (React.createElement(TamboClientProvider, { tamboUrl: tamboUrl, apiKey: apiKey },
10
+ React.createElement(TamboRegistryProvider, null,
11
+ React.createElement(TamboThreadProvider, null,
12
+ React.createElement(TamboComponentProvider, null,
13
+ React.createElement(TamboCompositeProvider, null, children))))));
14
+ };
15
+ export const TamboContext = createContext({});
16
+ /** TamboCompositeProvider is a provider that combines the TamboClient, TamboThread, and TamboComponent providers */
17
+ const TamboCompositeProvider = ({ children }) => {
18
+ const threads = useTamboThread();
19
+ const client = useTamboClient();
20
+ const queryClient = useTamboQueryClient();
21
+ const componentRegistry = useTamboComponent();
22
+ return (React.createElement(TamboContext.Provider, { value: {
23
+ client,
24
+ queryClient,
25
+ ...componentRegistry,
26
+ ...threads,
27
+ } }, children));
28
+ };
29
+ export const useTambo = () => {
30
+ return useContext(TamboContext);
31
+ };
32
+ //# sourceMappingURL=tambo-provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tambo-provider.js","sourceRoot":"","sources":["../../src/providers/tambo-provider.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;AACb,OAAO,KAAK,EAAE,EAAqB,aAAa,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AAC5E,OAAO,EAEL,mBAAmB,EAEnB,cAAc,EACd,mBAAmB,GACpB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAEL,sBAAsB,EACtB,iBAAiB,GAClB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAEL,mBAAmB,EACnB,cAAc,GACf,MAAM,yBAAyB,CAAC;AAEjC,mFAAmF;AAEnF,MAAM,CAAC,MAAM,aAAa,GAEtB,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE;IACrC,OAAO,CACL,oBAAC,mBAAmB,IAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM;QACrD,oBAAC,qBAAqB;YACpB,oBAAC,mBAAmB;gBAClB,oBAAC,sBAAsB;oBACrB,oBAAC,sBAAsB,QAAE,QAAQ,CAA0B,CACpC,CACL,CACA,CACJ,CACvB,CAAC;AACJ,CAAC,CAAC;AAKF,MAAM,CAAC,MAAM,YAAY,GAAG,aAAa,CACvC,EAAuB,CACxB,CAAC;AAEF,oHAAoH;AACpH,MAAM,sBAAsB,GAAgC,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE;IAC3E,MAAM,OAAO,GAAG,cAAc,EAAE,CAAC;IACjC,MAAM,MAAM,GAAG,cAAc,EAAE,CAAC;IAChC,MAAM,WAAW,GAAG,mBAAmB,EAAE,CAAC;IAC1C,MAAM,iBAAiB,GAAG,iBAAiB,EAAE,CAAC;IAE9C,OAAO,CACL,oBAAC,YAAY,CAAC,QAAQ,IACpB,KAAK,EAAE;YACL,MAAM;YACN,WAAW;YACX,GAAG,iBAAiB;YACpB,GAAG,OAAO;SACX,IAEA,QAAQ,CACa,CACzB,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,QAAQ,GAAG,GAAG,EAAE;IAC3B,OAAO,UAAU,CAAC,YAAY,CAAC,CAAC;AAClC,CAAC,CAAC","sourcesContent":["\"use client\";\nimport React, { PropsWithChildren, createContext, useContext } from \"react\";\nimport {\n TamboClientContextProps,\n TamboClientProvider,\n TamboClientProviderProps,\n useTamboClient,\n useTamboQueryClient,\n} from \"./tambo-client-provider\";\nimport {\n TamboComponentContextProps,\n TamboComponentProvider,\n useTamboComponent,\n} from \"./tambo-component-provider\";\nimport { TamboRegistryProvider } from \"./tambo-registry-provider\";\nimport {\n TamboThreadContextProps,\n TamboThreadProvider,\n useTamboThread,\n} from \"./tambo-thread-provider\";\n\n/** TamboProvider gives full access to the TamboAI client and component registry */\n\nexport const TamboProvider: React.FC<\n PropsWithChildren<TamboClientProviderProps>\n> = ({ children, tamboUrl, apiKey }) => {\n return (\n <TamboClientProvider tamboUrl={tamboUrl} apiKey={apiKey}>\n <TamboRegistryProvider>\n <TamboThreadProvider>\n <TamboComponentProvider>\n <TamboCompositeProvider>{children}</TamboCompositeProvider>\n </TamboComponentProvider>\n </TamboThreadProvider>\n </TamboRegistryProvider>\n </TamboClientProvider>\n );\n};\ntype TamboContextProps = TamboClientContextProps &\n TamboThreadContextProps &\n TamboComponentContextProps;\n\nexport const TamboContext = createContext<TamboContextProps>(\n {} as TamboContextProps,\n);\n\n/** TamboCompositeProvider is a provider that combines the TamboClient, TamboThread, and TamboComponent providers */\nconst TamboCompositeProvider: React.FC<PropsWithChildren> = ({ children }) => {\n const threads = useTamboThread();\n const client = useTamboClient();\n const queryClient = useTamboQueryClient();\n const componentRegistry = useTamboComponent();\n\n return (\n <TamboContext.Provider\n value={{\n client,\n queryClient,\n ...componentRegistry,\n ...threads,\n }}\n >\n {children}\n </TamboContext.Provider>\n );\n};\n\nexport const useTambo = () => {\n return useContext(TamboContext);\n};\n"]}
@@ -0,0 +1,21 @@
1
+ import React, { ComponentType, PropsWithChildren } from "react";
2
+ import { ComponentRegistry, TamboTool } from "../model/component-metadata";
3
+ export interface RegisterComponentOptions {
4
+ name: string;
5
+ description: string;
6
+ component: ComponentType<any>;
7
+ propsDefinition?: any;
8
+ loadingComponent?: ComponentType<any>;
9
+ associatedTools?: TamboTool[];
10
+ }
11
+ export interface TamboRegistryContext {
12
+ componentList: ComponentRegistry;
13
+ toolRegistry: Record<string, TamboTool>;
14
+ componentToolAssociations: Record<string, string[]>;
15
+ registerComponent: (options: RegisterComponentOptions) => void;
16
+ registerTool: (tool: TamboTool) => void;
17
+ registerTools: (tools: TamboTool[]) => void;
18
+ addToolAssociation: (componentName: string, tool: TamboTool) => void;
19
+ }
20
+ export declare const TamboRegistryProvider: React.FC<PropsWithChildren>;
21
+ export declare const useTamboRegistry: () => TamboRegistryContext;
@@ -0,0 +1,79 @@
1
+ "use client";
2
+ import React, { createContext, useCallback, useContext, useState, } from "react";
3
+ const TamboRegistryContext = createContext({
4
+ componentList: {},
5
+ toolRegistry: {},
6
+ componentToolAssociations: {},
7
+ registerComponent: () => { },
8
+ registerTool: () => { },
9
+ registerTools: () => { },
10
+ addToolAssociation: () => { },
11
+ });
12
+ export const TamboRegistryProvider = ({ children, }) => {
13
+ const [componentList, setComponentList] = useState({});
14
+ const [toolRegistry, setToolRegistry] = useState({});
15
+ const [componentToolAssociations, setComponentToolAssociations] = useState({});
16
+ const registerTool = useCallback((tool) => {
17
+ setToolRegistry((prev) => {
18
+ if (prev[tool.name]) {
19
+ console.warn(`Overwriting tool ${tool.name}`);
20
+ }
21
+ return {
22
+ ...prev,
23
+ [tool.name]: tool,
24
+ };
25
+ });
26
+ }, []);
27
+ const registerTools = useCallback((tools) => {
28
+ tools.forEach((tool) => registerTool(tool));
29
+ }, [registerTool]);
30
+ const addToolAssociation = useCallback((componentName, tool) => {
31
+ if (!componentList[componentName]) {
32
+ throw new Error(`Component ${componentName} not found in registry`);
33
+ }
34
+ setComponentToolAssociations((prev) => ({
35
+ ...prev,
36
+ [componentName]: [...(prev[componentName] || []), tool.name],
37
+ }));
38
+ }, [componentList]);
39
+ const registerComponent = useCallback((options) => {
40
+ const { name, description, component, propsDefinition = {}, loadingComponent, associatedTools, } = options;
41
+ setComponentList((prev) => {
42
+ if (prev[name]) {
43
+ console.warn(`overwriting component ${name}`);
44
+ }
45
+ return {
46
+ ...prev,
47
+ [name]: {
48
+ component,
49
+ loadingComponent,
50
+ name,
51
+ description,
52
+ props: propsDefinition,
53
+ contextTools: [],
54
+ },
55
+ };
56
+ });
57
+ if (associatedTools) {
58
+ registerTools(associatedTools);
59
+ setComponentToolAssociations((prev) => ({
60
+ ...prev,
61
+ [name]: associatedTools.map((tool) => tool.name),
62
+ }));
63
+ }
64
+ }, [registerTools]);
65
+ const value = {
66
+ componentList,
67
+ toolRegistry,
68
+ componentToolAssociations,
69
+ registerComponent,
70
+ registerTool,
71
+ registerTools,
72
+ addToolAssociation,
73
+ };
74
+ return (React.createElement(TamboRegistryContext.Provider, { value: value }, children));
75
+ };
76
+ export const useTamboRegistry = () => {
77
+ return useContext(TamboRegistryContext);
78
+ };
79
+ //# sourceMappingURL=tambo-registry-provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tambo-registry-provider.js","sourceRoot":"","sources":["../../src/providers/tambo-registry-provider.tsx"],"names":[],"mappings":"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","sourcesContent":["\"use client\";\nimport React, {\n ComponentType,\n createContext,\n PropsWithChildren,\n useCallback,\n useContext,\n useState,\n} from \"react\";\nimport { ComponentRegistry, TamboTool } from \"../model/component-metadata\";\n\nexport interface RegisterComponentOptions {\n name: string;\n description: string;\n component: ComponentType<any>;\n propsDefinition?: any;\n loadingComponent?: ComponentType<any>;\n associatedTools?: TamboTool[];\n}\n\nexport interface TamboRegistryContext {\n componentList: ComponentRegistry;\n toolRegistry: Record<string, TamboTool>;\n componentToolAssociations: Record<string, string[]>;\n registerComponent: (options: RegisterComponentOptions) => void;\n registerTool: (tool: TamboTool) => void;\n registerTools: (tools: TamboTool[]) => void;\n addToolAssociation: (componentName: string, tool: TamboTool) => void;\n}\n\nconst TamboRegistryContext = createContext<TamboRegistryContext>({\n componentList: {},\n toolRegistry: {},\n componentToolAssociations: {},\n registerComponent: () => {},\n registerTool: () => {},\n registerTools: () => {},\n addToolAssociation: () => {},\n});\n\nexport const TamboRegistryProvider: React.FC<PropsWithChildren> = ({\n children,\n}) => {\n const [componentList, setComponentList] = useState<ComponentRegistry>({});\n const [toolRegistry, setToolRegistry] = useState<Record<string, TamboTool>>(\n {},\n );\n const [componentToolAssociations, setComponentToolAssociations] = useState<\n Record<string, string[]>\n >({});\n\n const registerTool = useCallback((tool: TamboTool) => {\n setToolRegistry((prev) => {\n if (prev[tool.name]) {\n console.warn(`Overwriting tool ${tool.name}`);\n }\n return {\n ...prev,\n [tool.name]: tool,\n };\n });\n }, []);\n\n const registerTools = useCallback(\n (tools: TamboTool[]) => {\n tools.forEach((tool) => registerTool(tool));\n },\n [registerTool],\n );\n\n const addToolAssociation = useCallback(\n (componentName: string, tool: TamboTool) => {\n if (!componentList[componentName]) {\n throw new Error(`Component ${componentName} not found in registry`);\n }\n setComponentToolAssociations((prev) => ({\n ...prev,\n [componentName]: [...(prev[componentName] || []), tool.name],\n }));\n },\n [componentList],\n );\n\n const registerComponent = useCallback(\n (options: RegisterComponentOptions) => {\n const {\n name,\n description,\n component,\n propsDefinition = {},\n loadingComponent,\n associatedTools,\n } = options;\n\n setComponentList((prev) => {\n if (prev[name]) {\n console.warn(`overwriting component ${name}`);\n }\n return {\n ...prev,\n [name]: {\n component,\n loadingComponent,\n name,\n description,\n props: propsDefinition,\n contextTools: [],\n },\n };\n });\n if (associatedTools) {\n registerTools(associatedTools);\n setComponentToolAssociations((prev) => ({\n ...prev,\n [name]: associatedTools.map((tool) => tool.name),\n }));\n }\n },\n [registerTools],\n );\n\n const value = {\n componentList,\n toolRegistry,\n componentToolAssociations,\n registerComponent,\n registerTool,\n registerTools,\n addToolAssociation,\n };\n\n return (\n <TamboRegistryContext.Provider value={value}>\n {children}\n </TamboRegistryContext.Provider>\n );\n};\n\nexport const useTamboRegistry = () => {\n return useContext(TamboRegistryContext);\n};\n"]}
@@ -0,0 +1,28 @@
1
+ import TamboAI from "@tambo-ai/typescript-sdk";
2
+ import React, { PropsWithChildren } from "react";
3
+ import { GenerationStage, TamboThreadMessage } from "../model/generate-component-response";
4
+ import { TamboThread } from "../model/tambo-thread";
5
+ export interface TamboThreadContextProps {
6
+ thread: TamboThread;
7
+ switchCurrentThread: (threadId: string) => void;
8
+ addThreadMessage: (message: TamboThreadMessage, sendToServer: boolean) => Promise<TamboAI.Beta.Threads.ThreadMessage[]>;
9
+ updateThreadMessage: (id: string, message: TamboThreadMessage, sendToServer: boolean) => Promise<void>;
10
+ setLastThreadStatus: (status: GenerationStage) => void;
11
+ inputValue: string;
12
+ setInputValue: (value: string) => void;
13
+ sendThreadMessage: (message: string, options?: {
14
+ threadId?: string;
15
+ streamResponse?: boolean;
16
+ contextKey?: string;
17
+ }) => Promise<TamboThreadMessage>;
18
+ }
19
+ /** This is a stub entry for when the thread is not yet created, the first time
20
+ * the user sends a message
21
+ *
22
+ * Note that the consumer needs to be careful never to send `PLACEHOLDER_THREAD.id` to the server,
23
+ * as this doesn't really exist on the server side.
24
+ */
25
+ export declare const PLACEHOLDER_THREAD: TamboThread;
26
+ export declare const TamboThreadContext: React.Context<TamboThreadContextProps>;
27
+ export declare const TamboThreadProvider: React.FC<PropsWithChildren>;
28
+ export declare const useTamboThread: () => TamboThreadContextProps;