@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 @@
1
+ {"version":3,"file":"tambo-client-provider.js","sourceRoot":"","sources":["../../src/providers/tambo-client-provider.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,8EAA+C;AAC/C,uDAAoD;AACpD,+CAA0E;AAY1E,MAAM,kBAAkB,GAAG,IAAA,qBAAa,EACtC,SAAS,CACV,CAAC;AAEK,MAAM,mBAAmB,GAE5B,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE;IACrC,MAAM,CAAC,MAAM,CAAC,GAAG,IAAA,gBAAQ,EAAC,GAAG,EAAE,CAAC,IAAI,wBAAO,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;IAC5E,MAAM,CAAC,WAAW,CAAC,GAAG,IAAA,gBAAQ,EAAC,GAAG,EAAE,CAAC,IAAI,yBAAW,EAAE,CAAC,CAAC;IACxD,OAAO,CACL,8BAAC,kBAAkB,CAAC,QAAQ,IAAC,KAAK,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,IACxD,QAAQ,CACmB,CAC/B,CAAC;AACJ,CAAC,CAAC;AAVW,QAAA,mBAAmB,uBAU9B;AAEK,MAAM,cAAc,GAAG,GAAG,EAAE;IACjC,MAAM,OAAO,GAAG,eAAK,CAAC,UAAU,CAAC,kBAAkB,CAAC,CAAC;IACrD,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,0DAA0D,CAAC,CAAC;IAC9E,CAAC;IACD,OAAO,OAAO,CAAC,MAAM,CAAC;AACxB,CAAC,CAAC;AANW,QAAA,cAAc,kBAMzB;AAEK,MAAM,mBAAmB,GAAG,GAAG,EAAE;IACtC,MAAM,OAAO,GAAG,eAAK,CAAC,UAAU,CAAC,kBAAkB,CAAC,CAAC;IACrD,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CACb,+DAA+D,CAChE,CAAC;IACJ,CAAC;IACD,OAAO,OAAO,CAAC,WAAW,CAAC;AAC7B,CAAC,CAAC;AARW,QAAA,mBAAmB,uBAQ9B","sourcesContent":["import TamboAI from \"@tambo-ai/typescript-sdk\";\nimport { QueryClient } from \"@tanstack/react-query\";\nimport React, { createContext, PropsWithChildren, useState } from \"react\";\n\nexport interface TamboClientProviderProps {\n tamboUrl: string;\n apiKey: string;\n}\nexport interface TamboClientContextProps {\n client: TamboAI;\n /** The tambo-specific query client */\n queryClient: QueryClient;\n}\n\nconst TamboClientContext = createContext<TamboClientContextProps | undefined>(\n undefined,\n);\n\nexport const TamboClientProvider: React.FC<\n PropsWithChildren<TamboClientProviderProps>\n> = ({ children, tamboUrl, apiKey }) => {\n const [client] = useState(() => new TamboAI({ baseURL: tamboUrl, apiKey }));\n const [queryClient] = useState(() => new QueryClient());\n return (\n <TamboClientContext.Provider value={{ client, queryClient }}>\n {children}\n </TamboClientContext.Provider>\n );\n};\n\nexport const useTamboClient = () => {\n const context = React.useContext(TamboClientContext);\n if (context === undefined) {\n throw new Error(\"useTamboClient must be used within a TamboClientProvider\");\n }\n return context.client;\n};\n\nexport const useTamboQueryClient = () => {\n const context = React.useContext(TamboClientContext);\n if (context === undefined) {\n throw new Error(\n \"useTamboQueryClient must be used within a TamboClientProvider\",\n );\n }\n return context.queryClient;\n};\n"]}
@@ -0,0 +1,18 @@
1
+ import TamboAI from "@tambo-ai/typescript-sdk";
2
+ import React, { PropsWithChildren } from "react";
3
+ import { TamboTool } from "../model/component-metadata";
4
+ import { GenerationStage, TamboThreadMessage } from "../model/generate-component-response";
5
+ import { RegisterComponentOptions } from "./tambo-registry-provider";
6
+ export interface TamboComponentContextProps {
7
+ registerComponent: (options: RegisterComponentOptions) => void;
8
+ generateComponent: (params: TamboAI.Beta.Components.ComponentGenerateParams & {
9
+ stream?: boolean;
10
+ }, options?: TamboAI.RequestOptions) => Promise<TamboThreadMessage>;
11
+ generationStage: GenerationStage;
12
+ isIdle: boolean;
13
+ registerTool: (tool: TamboTool) => void;
14
+ registerTools: (tools: TamboTool[]) => void;
15
+ addToolAssociation: (componentName: string, tool: TamboTool) => void;
16
+ }
17
+ export declare const TamboComponentProvider: React.FC<PropsWithChildren>;
18
+ export declare const useTamboComponent: () => TamboComponentContextProps;
@@ -0,0 +1,129 @@
1
+ "use strict";
2
+ "use client";
3
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
4
+ if (k2 === undefined) k2 = k;
5
+ var desc = Object.getOwnPropertyDescriptor(m, k);
6
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
7
+ desc = { enumerable: true, get: function() { return m[k]; } };
8
+ }
9
+ Object.defineProperty(o, k2, desc);
10
+ }) : (function(o, m, k, k2) {
11
+ if (k2 === undefined) k2 = k;
12
+ o[k2] = m[k];
13
+ }));
14
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
15
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
16
+ }) : function(o, v) {
17
+ o["default"] = v;
18
+ });
19
+ var __importStar = (this && this.__importStar) || (function () {
20
+ var ownKeys = function(o) {
21
+ ownKeys = Object.getOwnPropertyNames || function (o) {
22
+ var ar = [];
23
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
24
+ return ar;
25
+ };
26
+ return ownKeys(o);
27
+ };
28
+ return function (mod) {
29
+ if (mod && mod.__esModule) return mod;
30
+ var result = {};
31
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
32
+ __setModuleDefault(result, mod);
33
+ return result;
34
+ };
35
+ })();
36
+ Object.defineProperty(exports, "__esModule", { value: true });
37
+ exports.useTamboComponent = exports.TamboComponentProvider = void 0;
38
+ const react_1 = __importStar(require("react"));
39
+ const generate_component_response_1 = require("../model/generate-component-response");
40
+ const generate_component_1 = require("../util/generate-component");
41
+ const tambo_client_provider_1 = require("./tambo-client-provider");
42
+ const tambo_registry_provider_1 = require("./tambo-registry-provider");
43
+ const tambo_thread_provider_1 = require("./tambo-thread-provider");
44
+ const TamboComponentContext = (0, react_1.createContext)({
45
+ generateComponent: () => Promise.resolve({}),
46
+ generationStage: generate_component_response_1.GenerationStage.IDLE,
47
+ isIdle: true,
48
+ registerComponent: () => { },
49
+ registerTool: () => { },
50
+ registerTools: () => { },
51
+ addToolAssociation: () => { },
52
+ });
53
+ const TamboComponentProvider = ({ children, }) => {
54
+ const client = (0, tambo_client_provider_1.useTamboClient)();
55
+ const { addThreadMessage, updateThreadMessage, switchCurrentThread, thread: currentThread, } = (0, tambo_thread_provider_1.useTamboThread)();
56
+ const { componentList, registerComponent, addToolAssociation, registerTool, componentToolAssociations, registerTools, toolRegistry, } = (0, tambo_registry_provider_1.useTamboRegistry)();
57
+ const [generationStage, setGenerationStage] = (0, react_1.useState)(generate_component_response_1.GenerationStage.IDLE);
58
+ const isIdle = (0, generate_component_response_1.isIdleStage)(generationStage);
59
+ const generateComponent = (0, react_1.useCallback)(async (params, options) => {
60
+ if (!(0, generate_component_response_1.isIdleStage)(generationStage)) {
61
+ throw new Error(`Generation already in progress: ${generationStage}`);
62
+ }
63
+ if (params.threadId && params.threadId !== currentThread.id) {
64
+ switchCurrentThread(params.threadId);
65
+ }
66
+ const componentMessage = await (0, generate_component_1.generateAndHydrate)(client, componentList, toolRegistry, componentToolAssociations, currentThread.id === tambo_thread_provider_1.PLACEHOLDER_THREAD.id
67
+ ? undefined
68
+ : currentThread.id, params.content, params, (state) => setGenerationStage(state), params.stream, options);
69
+ if (params.stream) {
70
+ let finalResponse;
71
+ const generationResponse = componentMessage;
72
+ for await (const chunk of generationResponse) {
73
+ if (chunk.threadId && chunk.threadId !== currentThread?.id) {
74
+ switchCurrentThread(chunk.threadId);
75
+ }
76
+ if (!finalResponse) {
77
+ finalResponse = chunk;
78
+ addThreadMessage(finalResponse, false);
79
+ }
80
+ else {
81
+ // use previous chunk's id for update, in case new chunk has a different id (from tambotion response)
82
+ updateThreadMessage(finalResponse.id, chunk, false);
83
+ finalResponse = chunk;
84
+ }
85
+ }
86
+ if (!finalResponse) {
87
+ throw new Error("No response from generation");
88
+ }
89
+ return finalResponse;
90
+ }
91
+ const generationResponse = componentMessage;
92
+ if (generationResponse.threadId &&
93
+ generationResponse.threadId !== currentThread?.id) {
94
+ switchCurrentThread(generationResponse.threadId);
95
+ }
96
+ if (generationResponse) {
97
+ // we do not need to send this to the server, as it is already in the thread
98
+ addThreadMessage(generationResponse, false);
99
+ }
100
+ return generationResponse;
101
+ }, [
102
+ generationStage,
103
+ switchCurrentThread,
104
+ currentThread,
105
+ client,
106
+ componentList,
107
+ addThreadMessage,
108
+ updateThreadMessage,
109
+ componentToolAssociations,
110
+ toolRegistry,
111
+ ]);
112
+ const value = {
113
+ client,
114
+ generateComponent,
115
+ registerComponent,
116
+ generationStage,
117
+ isIdle,
118
+ registerTool,
119
+ registerTools,
120
+ addToolAssociation,
121
+ };
122
+ return (react_1.default.createElement(TamboComponentContext.Provider, { value: value }, children));
123
+ };
124
+ exports.TamboComponentProvider = TamboComponentProvider;
125
+ const useTamboComponent = () => {
126
+ return (0, react_1.useContext)(TamboComponentContext);
127
+ };
128
+ exports.useTamboComponent = useTamboComponent;
129
+ //# 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,70 @@
1
+ "use strict";
2
+ "use client";
3
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
4
+ if (k2 === undefined) k2 = k;
5
+ var desc = Object.getOwnPropertyDescriptor(m, k);
6
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
7
+ desc = { enumerable: true, get: function() { return m[k]; } };
8
+ }
9
+ Object.defineProperty(o, k2, desc);
10
+ }) : (function(o, m, k, k2) {
11
+ if (k2 === undefined) k2 = k;
12
+ o[k2] = m[k];
13
+ }));
14
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
15
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
16
+ }) : function(o, v) {
17
+ o["default"] = v;
18
+ });
19
+ var __importStar = (this && this.__importStar) || (function () {
20
+ var ownKeys = function(o) {
21
+ ownKeys = Object.getOwnPropertyNames || function (o) {
22
+ var ar = [];
23
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
24
+ return ar;
25
+ };
26
+ return ownKeys(o);
27
+ };
28
+ return function (mod) {
29
+ if (mod && mod.__esModule) return mod;
30
+ var result = {};
31
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
32
+ __setModuleDefault(result, mod);
33
+ return result;
34
+ };
35
+ })();
36
+ Object.defineProperty(exports, "__esModule", { value: true });
37
+ exports.useTambo = exports.TamboContext = exports.TamboProvider = void 0;
38
+ const react_1 = __importStar(require("react"));
39
+ const tambo_client_provider_1 = require("./tambo-client-provider");
40
+ const tambo_component_provider_1 = require("./tambo-component-provider");
41
+ const tambo_registry_provider_1 = require("./tambo-registry-provider");
42
+ const tambo_thread_provider_1 = require("./tambo-thread-provider");
43
+ /** TamboProvider gives full access to the TamboAI client and component registry */
44
+ const TamboProvider = ({ children, tamboUrl, apiKey }) => {
45
+ return (react_1.default.createElement(tambo_client_provider_1.TamboClientProvider, { tamboUrl: tamboUrl, apiKey: apiKey },
46
+ react_1.default.createElement(tambo_registry_provider_1.TamboRegistryProvider, null,
47
+ react_1.default.createElement(tambo_thread_provider_1.TamboThreadProvider, null,
48
+ react_1.default.createElement(tambo_component_provider_1.TamboComponentProvider, null,
49
+ react_1.default.createElement(TamboCompositeProvider, null, children))))));
50
+ };
51
+ exports.TamboProvider = TamboProvider;
52
+ exports.TamboContext = (0, react_1.createContext)({});
53
+ /** TamboCompositeProvider is a provider that combines the TamboClient, TamboThread, and TamboComponent providers */
54
+ const TamboCompositeProvider = ({ children }) => {
55
+ const threads = (0, tambo_thread_provider_1.useTamboThread)();
56
+ const client = (0, tambo_client_provider_1.useTamboClient)();
57
+ const queryClient = (0, tambo_client_provider_1.useTamboQueryClient)();
58
+ const componentRegistry = (0, tambo_component_provider_1.useTamboComponent)();
59
+ return (react_1.default.createElement(exports.TamboContext.Provider, { value: {
60
+ client,
61
+ queryClient,
62
+ ...componentRegistry,
63
+ ...threads,
64
+ } }, children));
65
+ };
66
+ const useTambo = () => {
67
+ return (0, react_1.useContext)(exports.TamboContext);
68
+ };
69
+ exports.useTambo = useTambo;
70
+ //# 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,+CAA4E;AAC5E,mEAMiC;AACjC,yEAIoC;AACpC,uEAAkE;AAClE,mEAIiC;AAEjC,mFAAmF;AAE5E,MAAM,aAAa,GAEtB,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE;IACrC,OAAO,CACL,8BAAC,2CAAmB,IAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM;QACrD,8BAAC,+CAAqB;YACpB,8BAAC,2CAAmB;gBAClB,8BAAC,iDAAsB;oBACrB,8BAAC,sBAAsB,QAAE,QAAQ,CAA0B,CACpC,CACL,CACA,CACJ,CACvB,CAAC;AACJ,CAAC,CAAC;AAdW,QAAA,aAAa,iBAcxB;AAKW,QAAA,YAAY,GAAG,IAAA,qBAAa,EACvC,EAAuB,CACxB,CAAC;AAEF,oHAAoH;AACpH,MAAM,sBAAsB,GAAgC,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE;IAC3E,MAAM,OAAO,GAAG,IAAA,sCAAc,GAAE,CAAC;IACjC,MAAM,MAAM,GAAG,IAAA,sCAAc,GAAE,CAAC;IAChC,MAAM,WAAW,GAAG,IAAA,2CAAmB,GAAE,CAAC;IAC1C,MAAM,iBAAiB,GAAG,IAAA,4CAAiB,GAAE,CAAC;IAE9C,OAAO,CACL,8BAAC,oBAAY,CAAC,QAAQ,IACpB,KAAK,EAAE;YACL,MAAM;YACN,WAAW;YACX,GAAG,iBAAiB;YACpB,GAAG,OAAO;SACX,IAEA,QAAQ,CACa,CACzB,CAAC;AACJ,CAAC,CAAC;AAEK,MAAM,QAAQ,GAAG,GAAG,EAAE;IAC3B,OAAO,IAAA,kBAAU,EAAC,oBAAY,CAAC,CAAC;AAClC,CAAC,CAAC;AAFW,QAAA,QAAQ,YAEnB","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,117 @@
1
+ "use strict";
2
+ "use client";
3
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
4
+ if (k2 === undefined) k2 = k;
5
+ var desc = Object.getOwnPropertyDescriptor(m, k);
6
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
7
+ desc = { enumerable: true, get: function() { return m[k]; } };
8
+ }
9
+ Object.defineProperty(o, k2, desc);
10
+ }) : (function(o, m, k, k2) {
11
+ if (k2 === undefined) k2 = k;
12
+ o[k2] = m[k];
13
+ }));
14
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
15
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
16
+ }) : function(o, v) {
17
+ o["default"] = v;
18
+ });
19
+ var __importStar = (this && this.__importStar) || (function () {
20
+ var ownKeys = function(o) {
21
+ ownKeys = Object.getOwnPropertyNames || function (o) {
22
+ var ar = [];
23
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
24
+ return ar;
25
+ };
26
+ return ownKeys(o);
27
+ };
28
+ return function (mod) {
29
+ if (mod && mod.__esModule) return mod;
30
+ var result = {};
31
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
32
+ __setModuleDefault(result, mod);
33
+ return result;
34
+ };
35
+ })();
36
+ Object.defineProperty(exports, "__esModule", { value: true });
37
+ exports.useTamboRegistry = exports.TamboRegistryProvider = void 0;
38
+ const react_1 = __importStar(require("react"));
39
+ const TamboRegistryContext = (0, react_1.createContext)({
40
+ componentList: {},
41
+ toolRegistry: {},
42
+ componentToolAssociations: {},
43
+ registerComponent: () => { },
44
+ registerTool: () => { },
45
+ registerTools: () => { },
46
+ addToolAssociation: () => { },
47
+ });
48
+ const TamboRegistryProvider = ({ children, }) => {
49
+ const [componentList, setComponentList] = (0, react_1.useState)({});
50
+ const [toolRegistry, setToolRegistry] = (0, react_1.useState)({});
51
+ const [componentToolAssociations, setComponentToolAssociations] = (0, react_1.useState)({});
52
+ const registerTool = (0, react_1.useCallback)((tool) => {
53
+ setToolRegistry((prev) => {
54
+ if (prev[tool.name]) {
55
+ console.warn(`Overwriting tool ${tool.name}`);
56
+ }
57
+ return {
58
+ ...prev,
59
+ [tool.name]: tool,
60
+ };
61
+ });
62
+ }, []);
63
+ const registerTools = (0, react_1.useCallback)((tools) => {
64
+ tools.forEach((tool) => registerTool(tool));
65
+ }, [registerTool]);
66
+ const addToolAssociation = (0, react_1.useCallback)((componentName, tool) => {
67
+ if (!componentList[componentName]) {
68
+ throw new Error(`Component ${componentName} not found in registry`);
69
+ }
70
+ setComponentToolAssociations((prev) => ({
71
+ ...prev,
72
+ [componentName]: [...(prev[componentName] || []), tool.name],
73
+ }));
74
+ }, [componentList]);
75
+ const registerComponent = (0, react_1.useCallback)((options) => {
76
+ const { name, description, component, propsDefinition = {}, loadingComponent, associatedTools, } = options;
77
+ setComponentList((prev) => {
78
+ if (prev[name]) {
79
+ console.warn(`overwriting component ${name}`);
80
+ }
81
+ return {
82
+ ...prev,
83
+ [name]: {
84
+ component,
85
+ loadingComponent,
86
+ name,
87
+ description,
88
+ props: propsDefinition,
89
+ contextTools: [],
90
+ },
91
+ };
92
+ });
93
+ if (associatedTools) {
94
+ registerTools(associatedTools);
95
+ setComponentToolAssociations((prev) => ({
96
+ ...prev,
97
+ [name]: associatedTools.map((tool) => tool.name),
98
+ }));
99
+ }
100
+ }, [registerTools]);
101
+ const value = {
102
+ componentList,
103
+ toolRegistry,
104
+ componentToolAssociations,
105
+ registerComponent,
106
+ registerTool,
107
+ registerTools,
108
+ addToolAssociation,
109
+ };
110
+ return (react_1.default.createElement(TamboRegistryContext.Provider, { value: value }, children));
111
+ };
112
+ exports.TamboRegistryProvider = TamboRegistryProvider;
113
+ const useTamboRegistry = () => {
114
+ return (0, react_1.useContext)(TamboRegistryContext);
115
+ };
116
+ exports.useTamboRegistry = useTamboRegistry;
117
+ //# 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;